use alloc::vec;
use alloc::vec::Vec;
use crate::scalar::Scalar;
use super::add::DimensionMismatch;
use super::{CscMatrix, CsrMatrix};
pub fn matmat_csr<T: Scalar>(
m: &CsrMatrix<T>,
x: &[T],
x_cols: usize,
) -> Result<Vec<T>, DimensionMismatch> {
if x_cols == 0 || x.len() != m.cols() * x_cols {
return Err(DimensionMismatch);
}
let mut out = vec![T::zero(); m.rows() * x_cols];
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]..row_ptr[r + 1] {
let c = col_idx[k];
let v = vals[k];
for j in 0..x_cols {
let prev = out[r * x_cols + j];
out[r * x_cols + j] = prev.add(v.mul(x[c * x_cols + j]));
}
}
}
Ok(out)
}
pub fn matmat_csc<T: Scalar>(
m: &CscMatrix<T>,
x: &[T],
x_cols: usize,
) -> Result<Vec<T>, DimensionMismatch> {
if x_cols == 0 || x.len() != m.cols() * x_cols {
return Err(DimensionMismatch);
}
let mut out = vec![T::zero(); m.rows() * x_cols];
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]..col_ptr[c + 1] {
let r = row_idx[k];
let v = vals[k];
for j in 0..x_cols {
let prev = out[r * x_cols + j];
out[r * x_cols + j] = prev.add(v.mul(x[c * x_cols + j]));
}
}
}
Ok(out)
}