use crate::swarm::Swarm;
use crate::traits::Topology;
#[derive(Debug, Clone)]
pub struct Ring {
each_side: usize,
}
impl Ring {
pub fn new(each_side: usize) -> Self {
assert!(
each_side >= 1,
"the ring needs at least 1 neighbor per side"
);
Self { each_side }
}
pub fn lbest() -> Self {
Self::new(1)
}
}
impl Default for Ring {
fn default() -> Self {
Self::lbest()
}
}
impl Topology for Ring {
fn neighbors(&self, i: usize, swarm: &Swarm) -> Vec<usize> {
let n = swarm.len();
let mut idx = Vec::with_capacity(2 * self.each_side + 1);
idx.push(i);
for off in 1..=self.each_side {
let off = off % n; if off == 0 {
continue;
}
for j in [(i + off) % n, (i + n - off) % n] {
if !idx.contains(&j) {
idx.push(j);
}
}
}
idx
}
}