1mod lattice;
6mod pegase_like;
7mod tree;
8
9pub use lattice::generate_lattice;
10pub use pegase_like::generate_pegase_like;
11pub use tree::generate_tree;
12
13use powerio_tx::{BalancedNetwork, Branch, Bus, BusId, BusType};
14use rand::RngExt;
15use rand_chacha::ChaCha8Rng;
16use serde::{Deserialize, Serialize};
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
19pub enum Topology {
20 Tree,
21 Lattice2D,
22 PegaseLike,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct SynthSpec {
27 pub topology: Topology,
28 pub n: usize,
29 pub r_over_x: f64,
31 pub mean_x: f64,
33 pub seed: u64,
35}
36
37impl Default for SynthSpec {
38 fn default() -> Self {
39 Self {
40 topology: Topology::Tree,
41 n: 64,
42 r_over_x: 0.1,
43 mean_x: 0.05,
44 seed: 0x00C0_FFEE,
45 }
46 }
47}
48
49pub fn generate(spec: &SynthSpec) -> BalancedNetwork {
50 match spec.topology {
51 Topology::Tree => generate_tree(spec),
52 Topology::Lattice2D => generate_lattice(spec),
53 Topology::PegaseLike => generate_pegase_like(spec),
54 }
55}
56
57pub(crate) fn net(name: String, buses: Vec<Bus>, branches: Vec<Branch>) -> BalancedNetwork {
58 BalancedNetwork::in_memory(name, 100.0, buses, branches)
59}
60
61pub(crate) fn make_buses(n: usize) -> Vec<Bus> {
62 let mut buses: Vec<Bus> = (0..n).map(|i| make_bus(i + 1)).collect();
63 buses[0].kind = BusType::Ref;
64 buses
65}
66
67pub(crate) fn make_bus(id: usize) -> Bus {
68 Bus::new(BusId(id), BusType::Pq, 345.0)
69}
70
71pub(crate) fn make_branch(
72 from: usize,
73 to: usize,
74 spec: &SynthSpec,
75 rng: &mut ChaCha8Rng,
76) -> Branch {
77 let log_low = (spec.mean_x * 0.5).ln();
78 let log_high = (spec.mean_x * 2.0).ln();
79 let log_x: f64 = rng.random_range(log_low..log_high);
80 let x = log_x.exp().max(1e-6);
81 let r = spec.r_over_x * x;
82 Branch::new(BusId(from), BusId(to), r, x)
83}