use crate::SparseError;
#[derive(Debug, Clone)]
pub struct CooMatrix<T> {
pub rows: usize,
pub cols: usize,
pub row_indices: Vec<u32>,
pub col_indices: Vec<u32>,
pub values: Vec<T>,
}
impl<T: Clone> CooMatrix<T> {
pub fn new(
rows: usize,
cols: usize,
row_indices: Vec<u32>,
col_indices: Vec<u32>,
values: Vec<T>,
) -> Result<Self, SparseError> {
if row_indices.len() != col_indices.len() || col_indices.len() != values.len() {
return Err(SparseError::CooLengthMismatch {
row_len: row_indices.len(),
col_len: col_indices.len(),
val_len: values.len(),
});
}
for (i, &row) in row_indices.iter().enumerate() {
if row as usize >= rows {
return Err(SparseError::RowOutOfBounds { row, rows, position: i });
}
}
for (i, &col) in col_indices.iter().enumerate() {
if col as usize >= cols {
return Err(SparseError::ColumnOutOfBounds { col, cols, position: i });
}
}
Ok(Self { rows, cols, row_indices, col_indices, values })
}
#[must_use]
pub fn nnz(&self) -> usize {
self.values.len()
}
#[must_use]
pub fn empty(rows: usize, cols: usize) -> Self {
Self { rows, cols, row_indices: Vec::new(), col_indices: Vec::new(), values: Vec::new() }
}
}