pub struct Graph {
pub offsets: Vec<usize>,
pub targets: Vec<usize>,
pub weights: Vec<f64>,
pub n_nodes: usize,
}
impl Graph {
pub fn from_edges(from: &[usize], to: &[usize], weight: &[f64], n_nodes: usize) -> Self {
let m = from.len();
let mut degree = vec![0usize; n_nodes + 1];
for &u in from {
degree[u + 1] += 1;
}
for i in 0..n_nodes {
degree[i + 1] += degree[i];
}
let offsets = degree; let mut targets = vec![0usize; m];
let mut weights = vec![0.0f64; m];
let mut cursor = offsets.clone();
for e in 0..m {
let u = from[e];
let pos = cursor[u];
targets[pos] = to[e];
weights[pos] = weight[e];
cursor[u] += 1;
}
Graph {
offsets,
targets,
weights,
n_nodes,
}
}
pub fn neighbors(&self, node: usize) -> impl Iterator<Item = (usize, f64)> + '_ {
let start = self.offsets[node];
let end = self.offsets[node + 1];
(start..end).map(move |e| (self.targets[e], self.weights[e]))
}
pub fn n_edges(&self) -> usize {
self.targets.len()
}
}