graph_base/interfaces/
labeled.rs

1use 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
9/// Label for `Node`
10pub 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}