graph_base/interfaces/
labeled.rs1use std::collections::HashMap;
2use std::fmt::Display;
3use std::hash::Hash;
4use crate::interfaces::graph::Graph;
5
6use crate::interfaces::graph::{Adjacency, SingleId, IdPair};
7
8
9pub trait Label: Hash + Eq + Clone + Display {
11 fn label(&self) -> &str;
12}
13
14pub trait Labeled<'a>: Graph<'a> {
15 fn label_same(&self, node: &Self::Node, label: &Self::Node) -> bool;
16 fn get_label(&'a self, node: &'a Self::Node) -> &'a impl Label;
17 fn get_edges_pair_label(&'a self) -> impl Iterator<Item = (&'a Self::Node, &'a Self::Node, &'a impl Label)>;
18 fn edge_label_same(&self, edge1: &Self::Edge, edge2: &Self::Edge) -> bool;
19 fn edge_node_label_same(&self, src1: &Self::Node, edge1: &Self::Edge, dst1: &Self::Node, src2: &Self::Node, edge2: &Self::Edge, dst2: &Self::Node) -> bool;
20}
21
22impl Label for String {
23 fn label(&self) -> &str {
24 self.as_str()
25 }
26}
27
28pub trait HyperLabeled<'a>: Labeled<'a> {
29 type L: Label;
30 fn set_same_label_fn(&mut self, f: Box<dyn Fn(&Self::L, &Self::L) -> bool>);
31}
32
33pub struct LabeledAdjacencyList<'a, T: Graph<'a>>(HashMap<&'a T::Node, Vec<(&'a T::Node, &'a T::Edge)>>);
34
35pub trait LabeledAdjacency<'a>: Adjacency<'a> + Labeled<'a>
36where <Self as Graph<'a>>::Edge: IdPair {
37 fn get_labeled_adj(&'a self) -> LabeledAdjacencyList<'a, Self> {
38
39 let mut id_map = HashMap::new();
40 for node in self.nodes() {
41 id_map.insert(node.id(), node);
42 }
43
44 let mut adj = HashMap::new();
45 for node in self.nodes() {
46 adj.insert(node, Vec::new());
47 }
48
49 for edge in self.edges() {
50 let (src, dst) = (id_map.get(&edge.pair().0).unwrap(), id_map.get(&edge.pair().1).unwrap());
51 adj.get_mut(src).unwrap().push((dst.clone(), edge));
52 }
53
54 LabeledAdjacencyList(adj)
55 }
56 fn get_labeled_post(&'a self, adj: &LabeledAdjacencyList<'a, Self>, node: &Self::Node) -> impl Iterator<Item = (&'a Self::Node, &'a Self::Edge)> {
57 adj.0.get(node).expect(format!("No node in adjacency table named {}", node).as_str()).iter().copied()
58 }
59}