File size: 1,718 Bytes
224e773 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | //! Adjacency matrix from AST edges
pub struct AdjacencyMatrix {
size: usize,
matrix: Vec<Vec<f64>>,
}
impl AdjacencyMatrix {
pub fn new(size: usize) -> Self {
AdjacencyMatrix {
size,
matrix: vec![vec![0.0; size]; size],
}
}
pub fn set_edge(&mut self, from: usize, to: usize, weight: f64) {
if from < self.size && to < self.size {
self.matrix[from][to] = weight;
}
}
pub fn get_edge(&self, from: usize, to: usize) -> f64 {
if from < self.size && to < self.size {
self.matrix[from][to]
} else {
0.0
}
}
pub fn matrix(&self) -> &[Vec<f64>] {
&self.matrix
}
pub fn compute_out_degree(&self, node: usize) -> f64 {
if node >= self.size {
return 0.0;
}
self.matrix[node].iter().sum()
}
pub fn compute_in_degree(&self, node: usize) -> f64 {
if node >= self.size {
return 0.0;
}
self.matrix.iter().map(|row| row[node]).sum()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn adjacency_creation() {
let adj = AdjacencyMatrix::new(3);
assert_eq!(adj.get_edge(0, 1), 0.0);
}
#[test]
fn set_get_edge() {
let mut adj = AdjacencyMatrix::new(3);
adj.set_edge(0, 1, 0.5);
assert_eq!(adj.get_edge(0, 1), 0.5);
}
#[test]
fn degree_computation() {
let mut adj = AdjacencyMatrix::new(3);
adj.set_edge(0, 1, 0.5);
adj.set_edge(0, 2, 0.3);
assert_eq!(adj.compute_out_degree(0), 0.8);
}
}
|