use rand::rngs::StdRng;
use rand::seq::SliceRandom;
use rand::{Rng, SeedableRng};
pub const SEED: u64 = 0x5AFE_6EA9;
pub const SIZES: &[(usize, usize)] = &[(100, 500), (1_000, 5_000), (10_000, 50_000)];
#[derive(Clone)]
pub struct Workload {
pub n: usize,
pub edges: Vec<(u32, u32)>,
}
pub fn generate_workload(n: usize, m: usize, seed: u64) -> Workload {
let mut rng = StdRng::seed_from_u64(seed);
let edges = (0..m)
.map(|_| {
let f = rng.gen_range(0..n) as u32;
let t = rng.gen_range(0..n) as u32;
(f, t)
})
.collect();
Workload { n, edges }
}
pub fn shuffled_ordinals(n: usize, seed: u64) -> Vec<usize> {
let mut rng = StdRng::seed_from_u64(seed ^ 0xABCD_EF01);
let mut v: Vec<usize> = (0..n).collect();
v.shuffle(&mut rng);
v
}
pub fn edge_is_victim(e: usize) -> bool {
e.is_multiple_of(2)
}
pub fn node_is_victim(v: usize) -> bool {
v.is_multiple_of(4)
}