Skip to main content

powerio_matrix/synth/
pegase_like.rs

1//! IEEE/PEGASE-like topology: a spanning tree with extra random edges to
2//! match the average degree of a typical transmission grid (~2.5).
3
4use rand::Rng;
5use rand::SeedableRng;
6use rand_chacha::ChaCha8Rng;
7
8use crate::network::Network;
9
10use super::SynthSpec;
11use super::tree::{make_branch, make_buses, net};
12
13pub fn generate_pegase_like(spec: &SynthSpec) -> Network {
14    let n = spec.n.max(2);
15    let mut rng = ChaCha8Rng::seed_from_u64(spec.seed);
16
17    let buses = make_buses(n);
18    let mut branches = Vec::with_capacity((n as f64 * 1.3) as usize);
19
20    // Spanning tree backbone.
21    for k in 1..n {
22        let parent = rng.random_range(0..k);
23        branches.push(make_branch(parent + 1, k + 1, spec, &mut rng));
24    }
25    // Extra ~0.3 * n cross-edges to bump avg degree.
26    let extra = n / 3;
27    for _ in 0..extra {
28        let i = rng.random_range(0..n);
29        let mut j = rng.random_range(0..n);
30        if i == j {
31            j = (j + 1) % n;
32        }
33        branches.push(make_branch(i + 1, j + 1, spec, &mut rng));
34    }
35
36    net(format!("synth_pegase_n{n}"), buses, branches)
37}