graph_base/generator/
hypergraph.rs1
2use crate::{generator::{RandomExpand, RandomGenerate}, interfaces::{edge::{NodeSet}, graph::{SingleId}, hypergraph::{Hypergraph}}};
3
4pub 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