use alloc::vec;
use alloc::vec::Vec;
use crate::scalar::Scalar;
use super::add::DimensionMismatch;
use super::{CscMatrix, CsrMatrix};
pub fn matvec_csr<T: Scalar>(m: &CsrMatrix<T>, x: &[T]) -> Result<Vec<T>, DimensionMismatch> {
if x.len() != m.cols() {
return Err(DimensionMismatch::Shape);
}
let mut out = vec![T::zero(); m.rows()];
let row_ptr = m.row_ptr();
let col_idx = m.col_indices();
let vals = m.values();
for r in 0..m.rows() {
for k in row_ptr[r] as usize..row_ptr[r + 1] as usize {
let prev = out[r];
out[r] = prev.add(vals[k].mul(x[col_idx[k] as usize]));
}
}
Ok(out)
}
pub fn matvec_csc<T: Scalar>(m: &CscMatrix<T>, x: &[T]) -> Result<Vec<T>, DimensionMismatch> {
if x.len() != m.cols() {
return Err(DimensionMismatch::Shape);
}
let mut out = vec![T::zero(); m.rows()];
let col_ptr = m.col_ptr();
let row_idx = m.row_indices();
let vals = m.values();
for c in 0..m.cols() {
for k in col_ptr[c] as usize..col_ptr[c + 1] as usize {
let r = row_idx[k] as usize;
let prev = out[r];
out[r] = prev.add(vals[k].mul(x[c]));
}
}
Ok(out)
}