Skip to main content

powerio_synth/
pegase_like.rs

1//! PEGASE-like topology: a spanning tree with extra random edges.
2
3use rand::RngExt;
4use rand::SeedableRng;
5use rand_chacha::ChaCha8Rng;
6
7use powerio_tx::BalancedNetwork;
8
9use super::{SynthSpec, make_branch, make_buses, net};
10
11pub fn generate_pegase_like(spec: &SynthSpec) -> BalancedNetwork {
12    let n = spec.n.max(2);
13    let mut rng = ChaCha8Rng::seed_from_u64(spec.seed);
14
15    let buses = make_buses(n);
16    let mut branches = Vec::with_capacity((n as f64 * 1.3) as usize);
17
18    for k in 1..n {
19        let parent = rng.random_range(0..k);
20        branches.push(make_branch(parent + 1, k + 1, spec, &mut rng));
21    }
22
23    let extra = n / 3;
24    for _ in 0..extra {
25        let i = rng.random_range(0..n);
26        let mut j = rng.random_range(0..n);
27        if i == j {
28            j = (j + 1) % n;
29        }
30        branches.push(make_branch(i + 1, j + 1, spec, &mut rng));
31    }
32
33    net(format!("synth_pegase_n{n}"), buses, branches)
34}