networkit_rs/
generators.rs

1use cxx::{CxxVector, UniquePtr};
2use miette::IntoDiagnostic;
3
4use crate::{
5    base::{Algorithm, GraphEvent, GraphEventType},
6    bridge::{self, *},
7    tools::NodeIter,
8};
9
10pub trait StaticGraphGenerator {
11    fn generate(&mut self) -> crate::Graph;
12}
13
14pub trait StaticDegreeSequenceGenerator: StaticGraphGenerator {
15    fn is_realizable(&mut self) -> bool;
16    fn get_realizable(&self) -> bool;
17}
18
19pub trait DynamicGraphGenerator {
20    fn generate(&mut self, n_steps: u64) -> Vec<crate::base::GraphEvent>;
21}
22
23pub struct BarabasiAlbertGenerator {
24    inner: UniquePtr<bridge::BarabasiAlbertGenerator>,
25}
26
27impl BarabasiAlbertGenerator {
28    pub fn new(k: u64, n_max: u64, n0: Option<u64>, batagelj: bool) -> Self {
29        Self {
30            inner: NewBarabasiAlbertGenerator(k, n_max, n0.unwrap_or(0), batagelj),
31        }
32    }
33}
34
35impl StaticGraphGenerator for BarabasiAlbertGenerator {
36    fn generate(&mut self) -> crate::Graph {
37        BarabasiAlbertGeneratorGenerate(self.inner.pin_mut()).into()
38    }
39}
40
41pub struct ChungLuGenerator {
42    inner: UniquePtr<bridge::ChungLuGenerator>,
43    _seq: UniquePtr<CxxVector<u64>>,
44}
45
46impl ChungLuGenerator {
47    pub fn new(degree_sequence: &[u64]) -> Self {
48        let seq = MakeCountVector(degree_sequence);
49        let inner = NewChungLuGenerator(&seq);
50        Self { inner, _seq: seq }
51    }
52}
53
54impl StaticGraphGenerator for ChungLuGenerator {
55    fn generate(&mut self) -> crate::Graph {
56        ChungLuGeneratorGenerate(self.inner.pin_mut()).into()
57    }
58}
59
60pub struct ClusteredRandomGraphGenerator {
61    inner: UniquePtr<bridge::ClusteredRandomGraphGenerator>,
62}
63
64impl ClusteredRandomGraphGenerator {
65    pub fn new(n: u64, k: u64, p_intra: f64, p_inter: f64) -> Self {
66        let inner = NewClusteredRandomGraphGenerator(n, k, p_intra, p_inter);
67        Self { inner }
68    }
69    pub fn get_communities(&mut self) -> crate::Partition {
70        ClusteredRandomGraphGeneratorGetCommunities(self.inner.pin_mut()).into()
71    }
72}
73
74impl StaticGraphGenerator for ClusteredRandomGraphGenerator {
75    fn generate(&mut self) -> crate::Graph {
76        ClusteredRandomGraphGeneratorGenerate(self.inner.pin_mut()).into()
77    }
78}
79
80pub struct DorogovtsevMendesGenerator {
81    inner: UniquePtr<bridge::DorogovtsevMendesGenerator>,
82}
83
84impl DorogovtsevMendesGenerator {
85    pub fn new(n_nodes: u64) -> Self {
86        let inner = NewDorogovtsevMendesGenerator(n_nodes);
87        Self { inner }
88    }
89}
90
91impl StaticGraphGenerator for DorogovtsevMendesGenerator {
92    fn generate(&mut self) -> crate::Graph {
93        DorogovtsevMendesGeneratorGenerate(self.inner.pin_mut()).into()
94    }
95}
96
97pub struct DynamicDorogovtsevMendesGenerator {
98    inner: UniquePtr<bridge::DynamicDorogovtsevMendesGenerator>,
99}
100
101impl DynamicDorogovtsevMendesGenerator {
102    pub fn new() -> Self {
103        let inner = NewDynamicDorogovtsevMendesGenerator();
104        Self { inner }
105    }
106}
107
108impl DynamicGraphGenerator for DynamicDorogovtsevMendesGenerator {
109    fn generate(&mut self, n_steps: u64) -> Vec<crate::base::GraphEvent> {
110        let mut typs = vec![];
111        let mut us = vec![];
112        let mut vs = vec![];
113        let mut ws = vec![];
114        DynamicDorogovtsevMendesGeneratorGenerate(
115            self.inner.pin_mut(),
116            n_steps,
117            &mut typs,
118            &mut us,
119            &mut vs,
120            &mut ws,
121        );
122        typs.into_iter()
123            .zip(us)
124            .zip(vs)
125            .zip(ws)
126            .map(|(((t, u), v), w)| GraphEvent {
127                kind: GraphEventType::from(t),
128                u,
129                v,
130                ew: w,
131            })
132            .collect()
133    }
134}
135
136pub struct DynamicForestFireGenerator {
137    inner: UniquePtr<bridge::DynamicForestFireGenerator>,
138}
139
140impl DynamicForestFireGenerator {
141    pub fn new(p: f64, directed: bool, r: Option<f64>) -> Self {
142        let inner = NewDynamicForestFireGenerator(p, directed, r.unwrap_or(1.));
143        Self { inner }
144    }
145}
146
147impl DynamicGraphGenerator for DynamicForestFireGenerator {
148    fn generate(&mut self, n_steps: u64) -> Vec<crate::base::GraphEvent> {
149        let mut typs = vec![];
150        let mut us = vec![];
151        let mut vs = vec![];
152        let mut ws = vec![];
153        DynamicForestFireGeneratorGenerate(
154            self.inner.pin_mut(),
155            n_steps,
156            &mut typs,
157            &mut us,
158            &mut vs,
159            &mut ws,
160        );
161        typs.into_iter()
162            .zip(us)
163            .zip(vs)
164            .zip(ws)
165            .map(|(((t, u), v), w)| GraphEvent {
166                kind: GraphEventType::from(t),
167                u,
168                v,
169                ew: w,
170            })
171            .collect()
172    }
173}
174
175pub struct DynamicHyperbolicGenerator {
176    inner: UniquePtr<bridge::DynamicHyperbolicGenerator>,
177}
178
179impl DynamicHyperbolicGenerator {
180    pub fn new(
181        n: u64,
182        avg_degree: f64,
183        exp: f64,
184        t: f64,
185        move_each_step: f64,
186        move_distance: f64,
187    ) -> Self {
188        let inner =
189            NewDynamicHyperbolicGenerator(n, avg_degree, exp, t, move_each_step, move_distance);
190        Self { inner }
191    }
192    pub fn get_graph(&self) -> crate::Graph {
193        DynamicHyperbolicGeneratorGetGraph(&self.inner).into()
194    }
195    pub fn get_coordinates(&self) -> impl Iterator<Item = (f64, f64)> {
196        let mut xs = vec![];
197        let mut ys = vec![];
198        DynamicHyperbolicGeneratorGetCoordinates(&self.inner, &mut xs, &mut ys);
199        xs.into_iter().zip(ys)
200    }
201}
202
203impl DynamicGraphGenerator for DynamicHyperbolicGenerator {
204    fn generate(&mut self, n_steps: u64) -> Vec<crate::base::GraphEvent> {
205        let mut typs = vec![];
206        let mut us = vec![];
207        let mut vs = vec![];
208        let mut ws = vec![];
209        DynamicHyperbolicGeneratorGenerate(
210            self.inner.pin_mut(),
211            n_steps,
212            &mut typs,
213            &mut us,
214            &mut vs,
215            &mut ws,
216        );
217        typs.into_iter()
218            .zip(us)
219            .zip(vs)
220            .zip(ws)
221            .map(|(((t, u), v), w)| GraphEvent {
222                kind: GraphEventType::from(t),
223                u,
224                v,
225                ew: w,
226            })
227            .collect()
228    }
229}
230
231pub struct DynamicPathGenerator {
232    inner: UniquePtr<bridge::DynamicPathGenerator>,
233}
234
235impl DynamicPathGenerator {
236    pub fn new() -> Self {
237        let inner = NewDynamicPathGenerator();
238        Self { inner }
239    }
240}
241
242impl DynamicGraphGenerator for DynamicPathGenerator {
243    fn generate(&mut self, n_steps: u64) -> Vec<crate::base::GraphEvent> {
244        let mut typs = vec![];
245        let mut us = vec![];
246        let mut vs = vec![];
247        let mut ws = vec![];
248        DynamicPathGeneratorGenerate(
249            self.inner.pin_mut(),
250            n_steps,
251            &mut typs,
252            &mut us,
253            &mut vs,
254            &mut ws,
255        );
256        typs.into_iter()
257            .zip(us)
258            .zip(vs)
259            .zip(ws)
260            .map(|(((t, u), v), w)| GraphEvent {
261                kind: GraphEventType::from(t),
262                u,
263                v,
264                ew: w,
265            })
266            .collect()
267    }
268}
269
270pub struct DynamicPubWebGenerator {
271    inner: UniquePtr<bridge::DynamicPubWebGenerator>,
272}
273
274impl DynamicPubWebGenerator {
275    pub fn new(
276        num_nodes: u64,
277        num_dense_areas: u64,
278        neighbourhood_radius: f64,
279        max_num_neighbours: u64,
280        write_initial_graph_to_stream: bool,
281    ) -> Self {
282        let inner = NewDynamicPubWebGenerator(
283            num_nodes,
284            num_dense_areas,
285            neighbourhood_radius,
286            max_num_neighbours,
287            write_initial_graph_to_stream,
288        );
289        Self { inner }
290    }
291    pub fn get_graph(&self) -> crate::Graph {
292        DynamicPubWebGeneratorGetGraph(&self.inner).into()
293    }
294    pub fn get_coordinates(&self) -> impl Iterator<Item = (f64, f64)> {
295        let mut xs = vec![];
296        let mut ys = vec![];
297        DynamicPubWebGeneratorGetCoordinates(&self.inner, &mut xs, &mut ys);
298        xs.into_iter().zip(ys)
299    }
300    pub fn get_new_coordinates(&self) -> impl Iterator<Item = (u64, (f64, f64))> {
301        let mut ns = vec![];
302        let mut xs = vec![];
303        let mut ys = vec![];
304        DynamicPubWebGeneratorGetNewCoordinates(&self.inner, &mut ns, &mut xs, &mut ys);
305        ns.into_iter().zip(xs.into_iter().zip(ys))
306    }
307}
308
309impl DynamicGraphGenerator for DynamicPubWebGenerator {
310    fn generate(&mut self, n_steps: u64) -> Vec<crate::base::GraphEvent> {
311        let mut typs = vec![];
312        let mut us = vec![];
313        let mut vs = vec![];
314        let mut ws = vec![];
315        DynamicPubWebGeneratorGenerate(
316            self.inner.pin_mut(),
317            n_steps,
318            &mut typs,
319            &mut us,
320            &mut vs,
321            &mut ws,
322        );
323        typs.into_iter()
324            .zip(us)
325            .zip(vs)
326            .zip(ws)
327            .map(|(((t, u), v), w)| GraphEvent {
328                kind: GraphEventType::from(t),
329                u,
330                v,
331                ew: w,
332            })
333            .collect()
334    }
335}
336
337pub struct EdgeSwitchingMarkovChainGenerator {
338    inner: UniquePtr<bridge::EdgeSwitchingMarkovChainGenerator>,
339    _seq: UniquePtr<CxxVector<u64>>,
340}
341
342impl EdgeSwitchingMarkovChainGenerator {
343    pub fn new(
344        sequence: &[u64],
345        ignore_if_not_realizable: bool,
346        num_switches_per_edge: u64,
347    ) -> Self {
348        let seq = MakeCountVector(sequence);
349        let inner = NewEdgeSwitchingMarkovChainGenerator(
350            &seq,
351            ignore_if_not_realizable,
352            num_switches_per_edge,
353        );
354        Self { inner, _seq: seq }
355    }
356}
357
358impl StaticGraphGenerator for EdgeSwitchingMarkovChainGenerator {
359    fn generate(&mut self) -> crate::Graph {
360        EdgeSwitchingMarkovChainGeneratorGenerate(self.inner.pin_mut()).into()
361    }
362}
363
364impl StaticDegreeSequenceGenerator for EdgeSwitchingMarkovChainGenerator {
365    fn is_realizable(&mut self) -> bool {
366        self.inner.pin_mut().isRealizable()
367    }
368
369    fn get_realizable(&self) -> bool {
370        self.inner.getRealizable()
371    }
372}
373
374pub struct ErdosRenyiGenerator {
375    inner: UniquePtr<bridge::ErdosRenyiGenerator>,
376}
377
378impl ErdosRenyiGenerator {
379    pub fn new(n_nodes: u64, prob: f64, directed: bool, self_loops: bool) -> Self {
380        let inner = NewErdosRenyiGenerator(n_nodes, prob, directed, self_loops);
381        Self { inner }
382    }
383}
384
385impl StaticGraphGenerator for ErdosRenyiGenerator {
386    fn generate(&mut self) -> crate::Graph {
387        ErdosRenyiGeneratorGenerate(self.inner.pin_mut()).into()
388    }
389}
390
391pub struct HavelHakimiGenerator {
392    inner: UniquePtr<bridge::HavelHakimiGenerator>,
393    _seq: UniquePtr<CxxVector<u64>>,
394}
395
396impl HavelHakimiGenerator {
397    pub fn new(sequence: &[u64], ignore_if_not_realizable: bool) -> Self {
398        let seq = MakeCountVector(sequence);
399        let inner = NewHavelHakimiGenerator(&seq, ignore_if_not_realizable);
400        Self { inner, _seq: seq }
401    }
402}
403
404impl StaticGraphGenerator for HavelHakimiGenerator {
405    fn generate(&mut self) -> crate::Graph {
406        HavelHakimiGeneratorGenerate(self.inner.pin_mut()).into()
407    }
408}
409
410impl StaticDegreeSequenceGenerator for HavelHakimiGenerator {
411    fn is_realizable(&mut self) -> bool {
412        self.inner.pin_mut().isRealizable()
413    }
414
415    fn get_realizable(&self) -> bool {
416        self.inner.getRealizable()
417    }
418}
419
420pub struct HyperbolicGenerator {
421    inner: UniquePtr<bridge::HyperbolicGenerator>,
422}
423
424impl HyperbolicGenerator {
425    pub fn new(n: u64, avg_degree: f64, exp: f64, t: f64) -> Self {
426        let inner = NewHyperbolicGenerator(n, avg_degree, exp, t);
427        Self { inner }
428    }
429    pub fn generate_advanced(
430        &mut self,
431        angles: &[f64],
432        radii: &[f64],
433        r: f64,
434        t: f64,
435    ) -> crate::Graph {
436        HyperbolicGeneratorGenerateAdvanced(self.inner.pin_mut(), angles, radii, r, t).into()
437    }
438
439    pub fn set_leaf_capacity(&mut self, capacity: u64) {
440        self.inner.pin_mut().setLeafCapacity(capacity)
441    }
442    pub fn set_theoretical_split(&mut self, split: bool) {
443        self.inner.pin_mut().setTheoreticalSplit(split)
444    }
445    pub fn set_balance(&mut self, balance: f64) {
446        self.inner.pin_mut().setBalance(balance)
447    }
448}
449
450impl StaticGraphGenerator for HyperbolicGenerator {
451    fn generate(&mut self) -> crate::Graph {
452        HyperbolicGeneratorGenerate(self.inner.pin_mut()).into()
453    }
454}
455
456pub struct LFRGenerator {
457    inner: UniquePtr<bridge::LFRGenerator>,
458    _seq: UniquePtr<CxxVector<f64>>,
459}
460
461impl LFRGenerator {
462    pub fn new(n: u64) -> Self {
463        let seq = MakeWeightVector(&[]);
464        let inner = NewLFRGenerator(n);
465        Self { inner, _seq: seq }
466    }
467    pub fn set_mu_array(&mut self, mu: &[f64]) {
468        let seq = MakeWeightVector(mu);
469        self.inner.pin_mut().setMuArray(&seq);
470        self._seq = seq;
471    }
472    pub fn set_mut(&mut self, mu: f64) {
473        self.inner.pin_mut().setMu(mu)
474    }
475    pub fn set_mut_with_binomial_distribution(&mut self, mu: f64) {
476        self.inner.pin_mut().setMuWithBinomialDistribution(mu)
477    }
478    pub fn set_degree_sequence(&mut self, seq: &[u64]) {
479        LFRGeneratorSetDegreeSequence(self.inner.pin_mut(), seq)
480    }
481    pub fn set_community_size_sequence(&mut self, seq: &[u64]) {
482        LFRGeneratorSetCommunitySizeSequence(self.inner.pin_mut(), seq)
483    }
484    pub fn set_partition(&mut self, p: crate::Partition) {
485        LFRGeneratorSetPartition(self.inner.pin_mut(), p.inner)
486    }
487    pub fn generate_powerlaw_degree_sequence(
488        &mut self,
489        avg_degree: u64,
490        max_degree: u64,
491        node_degree_exp: f64,
492    ) {
493        self.inner
494            .pin_mut()
495            .generatePowerlawDegreeSequence(avg_degree, max_degree, node_degree_exp)
496    }
497    pub fn generate_powerlaw_community_size_sequence(
498        &mut self,
499        min_community_size: u64,
500        max_community_size: u64,
501        community_size_exp: f64,
502    ) {
503        self.inner.pin_mut().generatePowerlawCommunitySizeSequence(
504            min_community_size,
505            max_community_size,
506            community_size_exp,
507        )
508    }
509    pub fn get_graph(&self) -> crate::Graph {
510        LFRGeneratorGetGraph(&self.inner).into()
511    }
512    pub fn get_partition(&self) -> crate::Partition {
513        LFRGeneratorGetPartition(&self.inner).into()
514    }
515}
516
517impl StaticGraphGenerator for LFRGenerator {
518    fn generate(&mut self) -> crate::Graph {
519        LFRGeneratorGenerate(self.inner.pin_mut()).into()
520    }
521}
522
523impl Algorithm for LFRGenerator {
524    fn run(&mut self) -> miette::Result<()> {
525        self.inner.pin_mut().run().into_diagnostic()
526    }
527
528    fn has_finished(&self) -> bool {
529        self.inner.hasFinished()
530    }
531}
532
533pub struct MocnikGenerator {
534    inner: UniquePtr<bridge::MocnikGenerator>,
535}
536
537impl MocnikGenerator {
538    pub fn new(dim: u64, n: u64, k: f64, weighted: bool) -> Self {
539        let inner = NewMocnikGenerator(dim, n, k, weighted);
540        Self { inner }
541    }
542}
543
544impl StaticGraphGenerator for MocnikGenerator {
545    fn generate(&mut self) -> crate::Graph {
546        MocnikGeneratorGenerate(self.inner.pin_mut()).into()
547    }
548}
549
550pub struct MocnikGeneratorBasic {
551    inner: UniquePtr<bridge::MocnikGeneratorBasic>,
552}
553
554impl MocnikGeneratorBasic {
555    pub fn new(dim: u64, n: u64, k: f64) -> Self {
556        let inner = NewMocnikGeneratorBasic(dim, n, k);
557        Self { inner }
558    }
559}
560
561impl StaticGraphGenerator for MocnikGeneratorBasic {
562    fn generate(&mut self) -> crate::Graph {
563        MocnikGeneratorBasicGenerate(self.inner.pin_mut()).into()
564    }
565}
566
567pub struct PowerlawDegreeSequence {
568    inner: UniquePtr<bridge::PowerlawDegreeSequence>,
569}
570
571impl PowerlawDegreeSequence {
572    pub fn new(min_deg: u64, max_deg: u64, gamma: f64) -> Self {
573        let inner = NewPowerlawDegreeSequence(min_deg, max_deg, gamma);
574        Self { inner }
575    }
576    pub fn get_degree_sequence(&self, num_nodes: u64) -> NodeIter {
577        NodeIter {
578            at: 0,
579            nodes: PowerlawDegreeSequenceGetDegreeSequence(&self.inner, num_nodes),
580        }
581    }
582    pub fn set_minimum_from_average_degree(&mut self, avg_deg: f64) {
583        self.inner.pin_mut().setMinimumFromAverageDegree(avg_deg)
584    }
585    pub fn set_gamma_from_average_degree(&mut self, avg_deg: f64, min_gamma: f64, max_gamma: f64) {
586        self.inner
587            .pin_mut()
588            .setGammaFromAverageDegree(avg_deg, min_gamma, max_gamma)
589    }
590    pub fn set_minimum_degree(&mut self, min_deg: u64) {
591        self.inner.pin_mut().setMinimumDegree(min_deg)
592    }
593    pub fn get_minimum_degree(&mut self) -> u64 {
594        self.inner.getMinimumDegree()
595    }
596    pub fn get_maximum_degree(&mut self) -> u64 {
597        self.inner.getMaximumDegree()
598    }
599    pub fn set_gamma(&mut self, gamma: f64) {
600        self.inner.pin_mut().setGamma(gamma)
601    }
602    pub fn get_gamma(&self) -> f64 {
603        self.inner.getGamma()
604    }
605    pub fn get_degree(&self) -> u64 {
606        self.inner.getDegree()
607    }
608    pub fn get_expected_average_degree(&self) -> f64 {
609        self.inner.getExpectedAverageDegree()
610    }
611}
612
613impl Algorithm for PowerlawDegreeSequence {
614    fn run(&mut self) -> miette::Result<()> {
615        self.inner.pin_mut().run().into_diagnostic()
616    }
617
618    fn has_finished(&self) -> bool {
619        self.inner.hasFinished()
620    }
621}
622
623pub struct PubWebGenerator {
624    inner: UniquePtr<bridge::PubWebGenerator>,
625}
626
627impl PubWebGenerator {
628    pub fn new(
629        num_nodes: u64,
630        num_dense_areas: u64,
631        neighbourhood_radius: f64,
632        max_num_neighbours: u64,
633    ) -> Self {
634        let inner = NewPubWebGenerator(
635            num_nodes,
636            num_dense_areas,
637            neighbourhood_radius,
638            max_num_neighbours,
639        );
640        Self { inner }
641    }
642    pub fn get_coordinates(&self) -> impl Iterator<Item = (f64, f64)> {
643        let mut xs = vec![];
644        let mut ys = vec![];
645        PubWebGeneratorGetCoordinates(&self.inner, &mut xs, &mut ys);
646        xs.into_iter().zip(ys)
647    }
648}
649
650impl StaticGraphGenerator for PubWebGenerator {
651    fn generate(&mut self) -> crate::Graph {
652        PubWebGeneratorGenerate(self.inner.pin_mut()).into()
653    }
654}
655
656pub struct RegularRingLatticeGenerator {
657    inner: UniquePtr<bridge::RegularRingLatticeGenerator>,
658}
659
660impl RegularRingLatticeGenerator {
661    pub fn new(num_nodes: u64, num_neighbours: u64) -> Self {
662        let inner = NewRegularRingLatticeGenerator(num_nodes, num_neighbours);
663        Self { inner }
664    }
665}
666
667impl StaticGraphGenerator for RegularRingLatticeGenerator {
668    fn generate(&mut self) -> crate::Graph {
669        RegularRingLatticeGeneratorGenerate(self.inner.pin_mut()).into()
670    }
671}
672
673pub struct RmatGenerator {
674    inner: UniquePtr<bridge::RmatGenerator>,
675}
676
677impl RmatGenerator {
678    pub fn new(
679        scale: u64,
680        edge_factor: u64,
681        a: f64,
682        b: f64,
683        c: f64,
684        d: f64,
685        weighted: bool,
686        reduce_nodes: u64,
687    ) -> Self {
688        let inner = NewRmatGenerator(scale, edge_factor, a, b, c, d, weighted, reduce_nodes);
689        Self { inner }
690    }
691}
692
693impl StaticGraphGenerator for RmatGenerator {
694    fn generate(&mut self) -> crate::Graph {
695        RmatGeneratorGenerate(self.inner.pin_mut()).into()
696    }
697}
698
699pub struct WattsStrogatzGenerator {
700    inner: UniquePtr<bridge::WattsStrogatzGenerator>,
701}
702
703impl WattsStrogatzGenerator {
704    pub fn new(n_nodes: u64, n_neighbours: u64, p: f64) -> Self {
705        let inner = NewWattsStrogatzGenerator(n_nodes, n_neighbours, p);
706        Self { inner }
707    }
708}
709
710impl StaticGraphGenerator for WattsStrogatzGenerator {
711    fn generate(&mut self) -> crate::Graph {
712        WattsStrogatzGeneratorGenerate(self.inner.pin_mut()).into()
713    }
714}