1use std::collections::HashMap;
2use std::fmt::Display;
3
4use crate::interfaces::labeled::{Label, Labeled, HyperLabeled, LabeledAdjacency};
5use crate::interfaces::graph::{SingleId, IdPair, Graph, Adjacency, AdjacencyInv, Directed};
6use crate::interfaces::vertex::Vertex;
7
8#[derive(Hash, Eq, PartialEq, Clone)]
9pub struct LabelNode<L: Label> {
10 id: u64,
11 label: L
12}
13
14impl<L: Label> Display for LabelNode<L>
15where L: Label {
16 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17 write!(f, "[id: {}, label: {}]", self.id, self.label)
18 }
19}
20
21impl<L: Label> SingleId for LabelNode<L> {
22 fn id(&self) -> usize {
23 self.id as usize
24 }
25}
26
27impl<L: Label> Label for LabelNode<L> {
28 fn label(&self) -> &str {
29 self.label.label()
30 }
31}
32
33#[derive(Hash, Eq, PartialEq, Clone)]
34pub struct LabeledEdge<L: Label> {
35 src: u64,
36 dst: u64,
37 label: L,
38}
39
40impl<L: Label> IdPair for LabeledEdge<L> {
41 fn pair(&self) -> (usize, usize) {
42 (self.src as usize, self.dst as usize)
43 }
44
45}
46
47impl<L: Label> Display for LabeledEdge<L> {
48 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49 write!(f, "[{} -> {}: label: {}]", self.src, self.dst, self.label)
50 }
51}
52
53impl<L: Label> Label for LabeledEdge<L> {
54 fn label(&self) -> &str {
55 self.label.label()
56 }
57}
58
59pub struct SimpleLabeledGraph<L1: Label, L2: Label> {
66 nodes: Vec<LabelNode<L1>>,
67 edges: Vec<LabeledEdge<L2>>,
68}
69
70#[derive(Hash, Eq, Clone)]
71pub struct SingleLabel(());
72
73impl Display for SingleLabel {
74 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
75 write!(f, "")
76 }
77}
78
79impl Label for SingleLabel {
80 fn label(&self) -> &str {
81 ""
82 }
83}
84
85impl PartialEq for SingleLabel {
86 fn eq(&self, _: &Self) -> bool {
87 true
88 }
89}
90
91pub type StandardLabeledGraph = SimpleLabeledGraph<String, SingleLabel>;
92
93impl<'a> Graph<'a> for StandardLabeledGraph {
94 type Node = LabelNode<String>;
95
96 type Edge = LabeledEdge<SingleLabel>;
97
98 fn new() -> Self {
99 StandardLabeledGraph {
100 nodes: Vec::new(),
101 edges: Vec::new(),
102 }
103 }
104
105 fn nodes(&'a self) -> impl Iterator<Item = &'a Self::Node> {
106 self.nodes.iter()
107 }
108
109 fn edges(&'a self) -> impl Iterator<Item = &'a Self::Edge> {
110 self.edges.iter()
111 }
112
113
114 fn add_node(&mut self, node: Self::Node) {
115 self.nodes.push(node);
116 }
117
118 fn add_edge(&mut self, edge: Self::Edge) {
119 self.edges.push(edge);
120 }
121}
122
123impl<'a> Labeled<'a> for StandardLabeledGraph {
124 fn label_same(&self, node: &Self::Node, label: &Self::Node) -> bool {
125 node.label == label.label
126 }
127
128 fn get_label(&'a self, node: &'a Self::Node) -> &'a impl Label {
129 &node.label
130 }
131
132 fn get_edges_pair_label(&'a self) -> impl Iterator<Item = (&'a Self::Node, &'a Self::Node, &'a impl Label)> {
133 let id_map: HashMap<_, _, std::collections::hash_map::RandomState> = HashMap::from_iter(self.nodes.iter().map(|node| (node.id, node)));
134 self.edges.iter().map(move |edge| (id_map.get(&edge.src).unwrap().clone(), id_map.get(&edge.dst).unwrap().clone(), &edge.label)).collect::<Vec<_>>().into_iter()
135 }
136
137 fn edge_label_same(&self, _: &Self::Edge, _: &Self::Edge) -> bool {
138 true
139 }
140
141 fn edge_node_label_same(&self, _: &Self::Node, _: &Self::Edge, _: &Self::Node, _: &Self::Node, _: &Self::Edge, _: &Self::Node) -> bool {
142 true
143 }
144}
145
146impl Directed for StandardLabeledGraph {}
147
148impl Adjacency<'_> for StandardLabeledGraph {}
149
150impl AdjacencyInv<'_> for StandardLabeledGraph {}
151
152impl LabeledAdjacency<'_> for StandardLabeledGraph {}
153
154impl StandardLabeledGraph {
155 pub fn new() -> Self {
156 return StandardLabeledGraph {
157 nodes: Vec::new(),
158 edges: Vec::new(),
159 }
160 }
161
162 pub fn add_node(&mut self, id: u64, label: String) {
163 self.nodes.push(LabelNode {
164 id,
165 label
166 });
167 }
168
169 pub fn add_edge(&mut self, src: u64, dst: u64) {
170 self.edges.push(LabeledEdge {
171 src,
172 dst,
173 label: SingleLabel(())
174 });
175 }
176}
177
178impl Display for StandardLabeledGraph {
179 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
180 let mut s = String::new();
181 s.push_str("nodes: ");
182 for node in self.nodes.iter() {
183 s.push_str(format!("{}, ", node).as_str());
184 }
185 s.push_str("\nedges: ");
186 for edge in self.edges.iter() {
187 s.push_str(format!("{} -> {}, ", edge.src, edge.dst).as_str());
188 }
189 write!(f, "{}", s)
190 }
191}
192impl<L: Label> Vertex for LabelNode<L> {}
193
194pub struct HyperLabelGraph<L: Label> {
195 nodes: Vec<LabelNode<L>>,
196 edges: Vec<LabeledEdge<SingleLabel>>,
197 same_label_fn: Option<Box<dyn Fn(&L, &L) -> bool>>,
198}
199
200impl<'a, L: Label> Graph<'a> for HyperLabelGraph<L> {
201 type Node = LabelNode<L>;
202 type Edge = LabeledEdge<SingleLabel>;
203
204 fn new() -> Self {
205 HyperLabelGraph {
206 nodes: Vec::new(),
207 edges: Vec::new(),
208 same_label_fn: None,
209 }
210 }
211
212 fn nodes(&'a self) -> impl Iterator<Item = &'a Self::Node> {
213 self.nodes.iter()
214 }
215
216 fn edges(&'a self) -> impl Iterator<Item = &'a Self::Edge> {
217 self.edges.iter()
218 }
219
220 fn add_node(&mut self, node: Self::Node) {
221 self.nodes.push(node);
222 }
223
224 fn add_edge(&mut self, edge: Self::Edge) {
225 self.edges.push(edge);
226 }
227}
228
229impl<'a, L: Label> Labeled<'a> for HyperLabelGraph<L> {
230 fn label_same(&self, node: &Self::Node, label: &Self::Node) -> bool {
231 (self.same_label_fn.as_ref().expect("hyper compare function is not set"))(&node.label, &label.label)
232 }
233
234 fn get_label(&'a self, node: &'a Self::Node) -> &'a impl Label {
235 &node.label
236 }
237
238 fn get_edges_pair_label(&'a self) -> impl Iterator<Item = (&'a Self::Node, &'a Self::Node, &'a impl Label)> {
239 let id_map: HashMap<_, _, std::collections::hash_map::RandomState> = HashMap::from_iter(self.nodes.iter().map(|node| (node.id, node)));
240 self.edges.iter().map(move |edge| (id_map.get(&edge.src).unwrap().clone(), id_map.get(&edge.dst).unwrap().clone(), &edge.label)).collect::<Vec<_>>().into_iter()
241 }
242
243 fn edge_label_same(&self, _: &Self::Edge, _: &Self::Edge) -> bool {
244 true
245 }
246
247 fn edge_node_label_same(&self, _: &Self::Node, _: &Self::Edge, _: &Self::Node, _: &Self::Node, _: &Self::Edge, _: &Self::Node) -> bool {
248 true
249 }
250}
251
252impl<L: Label> HyperLabeled<'_> for HyperLabelGraph<L> {
253 type L = L;
254 fn set_same_label_fn(&mut self, f: Box<dyn Fn(&Self::L, &Self::L) -> bool>) {
255 self.same_label_fn = Some(f);
256 }
257}
258
259impl Directed for HyperLabelGraph<SingleLabel> {}
260
261impl Adjacency<'_> for HyperLabelGraph<SingleLabel> {}
262
263impl AdjacencyInv<'_> for HyperLabelGraph<SingleLabel> {}
264
265impl<L: Label> HyperLabelGraph<L> {
266 pub fn new() -> Self {
267 return HyperLabelGraph {
268 nodes: Vec::new(),
269 edges: Vec::new(),
270 same_label_fn: None,
271 }
272 }
273
274}