onlinematching/
bigraph.rs1use std::collections::BTreeMap;
2
3type Edge<Key> = (Key, Key);
4
5#[derive(Debug, PartialEq)]
6pub struct Bigraph<Key> {
7 pub v_nodes: Vec<Key>,
8 pub u_nodes: Vec<Key>,
9 pub nodes_edges: Vec<Edge<Key>>,
10 nodes_edges_use_index: Vec<(usize, usize)>,
11 v_key2index: BTreeMap<Key, usize>,
12 u_key2index: BTreeMap<Key, usize>,
13 pub v_adjacency_list: Vec<Vec<usize>>,
14 pub u_adjacency_list: Vec<Vec<usize>>,
15}
16
17impl<Key: Ord + Copy + std::fmt::Debug> Bigraph<Key> {
18 pub fn new() -> Bigraph<Key> {
19 Bigraph {
20 v_nodes: vec![],
21 u_nodes: vec![],
22 nodes_edges: vec![],
23 nodes_edges_use_index: vec![],
24 v_key2index: BTreeMap::new(),
25 u_key2index: BTreeMap::new(),
26 v_adjacency_list: vec![],
27 u_adjacency_list: vec![],
28 }
29 }
30
31 pub fn from_edges(edges: &Vec<Edge<Key>>) -> Self {
32 let mut graph = Self::new();
33 for edge in edges {
34 assert!(
35 !graph.nodes_edges.contains(edge),
36 "edges should't contain the same edge: {:?}",
37 edge
38 );
39 let (u, v) = edge;
40
41 let v_index;
42 if !graph.v_nodes.contains(v) {
45 v_index = graph.v_nodes.len();
46 graph.v_key2index.insert(v.clone(), v_index);
47 graph.v_nodes.push(v.clone());
48 graph.v_adjacency_list.push(vec![]);
49 } else {
50 v_index = graph.v_key2index[v];
51 }
52
53 let u_index;
55 if !graph.u_nodes.contains(u) {
56 u_index = graph.u_nodes.len();
57 graph.u_key2index.insert(u.clone(), u_index);
58 graph.u_nodes.push(u.clone());
59 graph.u_adjacency_list.push(vec![]);
60 } else {
61 u_index = graph.u_key2index[u];
62 }
63
64 graph.nodes_edges.push(edge.clone());
65 graph.nodes_edges_use_index.push((u_index, v_index));
66
67 graph.v_adjacency_list[v_index].push(u_index);
68 graph.u_adjacency_list[u_index].push(v_index);
69 }
70 graph
71 }
72
73 pub fn insert_u(self: &mut Self, key: Key) -> Result<(), String> {
74 if self.u_nodes.contains(&key) {
75 Err("The u nodes already have this key".to_owned())
76 } else {
77 let u_index = self.u_nodes.len();
78 self.u_nodes.push(key);
79 self.u_adjacency_list.push(vec![]);
80 self.u_key2index.insert(key, u_index);
81 Ok(())
82 }
83 }
84
85 pub fn insert_v(self: &mut Self, key: Key) -> Result<(), String> {
86 if self.v_nodes.contains(&key) {
87 Err("The v nodes already have this key".to_owned())
88 } else {
89 let v_index = self.v_nodes.len();
90 self.v_nodes.push(key);
91 self.v_adjacency_list.push(vec![]);
92 self.v_key2index.insert(key, v_index);
93 Ok(())
94 }
95 }
96}