use crate::graph::builders::GraphBuilder;
use crate::graph::Graph;
pub fn watts_strogatz_graph<T>(n: usize, k: usize, beta: f64) -> Graph<T, f64>
where
T: Clone + Default,
{
if n == 0 || k == 0 {
return Graph::directed();
}
let mut builder = GraphBuilder::undirected();
builder = builder.with_nodes((0..n).map(|_| T::default()));
let half_k = k / 2;
for i in 0..n {
for j in 1..=half_k {
let target = (i + j) % n;
builder = builder.with_edge(i, target, 1.0);
}
}
#[cfg(feature = "rand")]
{
use rand::Rng;
let mut rng = rand::thread_rng();
for i in 0..n {
for _j in 1..=half_k {
if rng.r#gen::<f64>() < beta {
let new_target = rng.gen_range(0..n);
if new_target != i {
builder = builder.with_edge(i, new_target, 1.0);
}
}
}
}
}
#[cfg(not(feature = "rand"))]
{
let _ = beta;
}
builder.build().unwrap_or_else(|_| Graph::directed())
}