graph_base/generator/
hypergraph.rs

1
2use crate::{generator::{RandomExpand, RandomGenerate}, interfaces::{edge::{NodeSet}, graph::{SingleId}, hypergraph::{Hypergraph}}};
3
4// impl<V> RandomGenerate for V 
5// where V: Vertex {
6//     fn random_generate(n: usize, _e: usize, rng: &mut impl rand::Rng) -> Self {
7//         let id = rng.gen_range(0..n);
8//         Self::new(id)
9//     }
10// }
11
12pub trait NodeSample<'a>: Hypergraph<'a> {
13    fn sample(&self, rng: &mut impl rand::Rng) -> Vec<&Self::Node>;
14}
15
16impl<'a, H> RandomGenerate for H 
17where H: NodeSample<'a>, H::Node: RandomGenerate + SingleId, H::Edge: NodeSet {
18    fn random_generate(n: usize, e: usize, rng: &mut impl rand::Rng) -> Self {
19        let mut hypergraph = Self::new();
20        for i in 0..n {
21            let new_node = H::Node::random_generate(i, e, rng);
22            hypergraph.add_node(new_node);
23        }
24        for _ in 0..e {
25            let nodes = hypergraph.sample(rng);
26            let nodes = nodes.iter().map(|node| node.id()).collect::<Vec<_>>();
27            let new_edge = H::Edge::from_nodes(nodes);
28            hypergraph.add_hyperedge(new_edge);
29        }
30        hypergraph
31    }
32}
33
34impl<'a, H> RandomExpand for H 
35where H: NodeSample<'a> + Clone, H::Node: RandomGenerate + SingleId, H::Edge: NodeSet {
36    fn random_expand(&self, n_plus: usize, e_plus: usize, rng: &mut impl rand::Rng) -> Self {
37        let mut hypergraph = self.clone();
38        for _ in 0..n_plus {
39            let new_node = H::Node::random_generate(n_plus, e_plus, rng);
40            hypergraph.add_node(new_node);
41        }
42        for _ in 0..e_plus {
43            let nodes = hypergraph.sample(rng);
44            let nodes = nodes.iter().map(|node| node.id()).collect::<Vec<_>>();
45            let new_edge = H::Edge::from_nodes(nodes);
46            hypergraph.add_hyperedge(new_edge);
47        }
48        hypergraph
49    }
50}
51