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(),
}
}
}