graph_base/interfaces/
hypergraph.rs1use std::{collections::{HashMap, HashSet}, fmt::Display, hash::Hash};
2use crate::interfaces::graph::{SingleId, IdPair};
3use crate::interfaces::edge::Hyperedge;
4
5use super::{edge::DirectedHyperedge, vertex::Vertex};
6
7pub trait IdVector {
8 fn id(&self) -> Vec<usize>;
9}
10
11pub trait Hypergraph<'a> {
12 type Node: Vertex;
13 type Edge: Hyperedge;
14 fn new() -> Self;
15 fn nodes(&'a self) -> impl Iterator<Item = &'a Self::Node>;
16 fn hyperedges(&'a self) -> impl Iterator<Item = &'a Self::Edge>;
17 fn get_hyperedges_vector(&'a self) -> impl Iterator<Item = Vec<&'a Self::Node>> {
18 let id_map: HashMap<_, _> = HashMap::from_iter(self.nodes().map(|node| (node.id(), node)));
19 self.hyperedges().map(move |edge| edge.id().iter().map(|id| id_map.get(id).unwrap()).cloned().collect::<Vec<_>>()).collect::<Vec<_>>().into_iter()
20 }
21 fn get_hyperedges_vector_with_edge(&'a self) -> impl Iterator<Item = (&'a Self::Edge, Vec<&'a Self::Node>)> {
22 let id_map: HashMap<_, _> = HashMap::from_iter(self.nodes().map(|node| (node.id(), node)));
23 self.hyperedges().map(move |edge| (edge, edge.id().iter().map(|id| id_map.get(id).unwrap()).cloned().collect::<Vec<_>>())).collect::<Vec<_>>().into_iter()
24 }
25 fn add_node(&mut self, node: Self::Node);
26 fn add_hyperedge(&mut self, edge: Self::Edge);
27}
28
29
30pub struct AdjacencyList<'a, T: Hypergraph<'a>>(HashMap<&'a T::Node, Vec<&'a T::Node>>);
31
32impl<'a, T> Display for AdjacencyList<'a, T>
33where T: Hypergraph<'a> {
34 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35 let mut s = String::new();
36 for (node, adj) in self.0.iter() {
37
38 let s1 = format!("{}", node);
39 let mut s2 = String::new();
40 for node in adj {
41 s2.push_str(format!("{}, ", node).as_str());
42 }
43
44 s.push_str(format!("Node {} -> {{{}}}\n", s1, s2).as_str());
45 }
46 write!(f, "{}", s)
47 }
48}
49
50pub trait DirectedHypergraph<'a>: Hypergraph<'a> + Sized
51where Self::Edge: DirectedHyperedge {}