#![cfg(feature = "alloc")]
use alloc::vec::Vec;
use super::builder_utils::build_symmetric;
use crate::impls::{CSR2D, SymmetricCSR2D};
#[must_use]
pub fn torus_graph(rows: usize, cols: usize) -> SymmetricCSR2D<CSR2D<usize, usize, usize>> {
let n = rows * cols;
let mut edges = Vec::new();
for r in 0..rows {
for c in 0..cols {
let v = r * cols + c;
let right = r * cols + (c + 1) % cols;
if v < right {
edges.push((v, right));
} else if right < v {
edges.push((right, v));
}
let down = ((r + 1) % rows) * cols + c;
if v < down {
edges.push((v, down));
} else if down < v {
edges.push((down, v));
}
}
}
edges.sort_unstable();
edges.dedup();
build_symmetric(n, edges)
}