graph_base/interfaces/
hypergraph.rs

1use 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 {}