use crate::sparse::CscMatrix;
use crate::tolerances::DROP_TOL;
pub fn assert_vec_near(a: &[f64], b: &[f64], tol: f64) {
assert_eq!(
a.len(),
b.len(),
"Vector lengths differ: {} vs {}",
a.len(),
b.len()
);
for i in 0..a.len() {
assert!(
(a[i] - b[i]).abs() < tol,
"Mismatch at index {}: {} vs {} (diff={})",
i,
a[i],
b[i],
(a[i] - b[i]).abs()
);
}
}
pub fn dense_to_csc(dense: &[Vec<f64>], nrows: usize, ncols: usize) -> CscMatrix {
let mut rows = Vec::new();
let mut cols = Vec::new();
let mut vals = Vec::new();
for (i, row) in dense.iter().enumerate().take(nrows) {
for (j, &v) in row.iter().enumerate().take(ncols) {
if v.abs() > DROP_TOL {
rows.push(i);
cols.push(j);
vals.push(v);
}
}
}
CscMatrix::from_triplets(&rows, &cols, &vals, nrows, ncols).unwrap()
}