use crate::SparseError;
pub fn validate_csr_invariants(
rows: usize,
cols: usize,
offsets: &[u32],
col_indices: &[u32],
values_len: usize,
) -> Result<(), SparseError> {
if offsets.len() != rows + 1 {
return Err(SparseError::InvalidOffsetsLength {
actual: offsets.len(),
expected: rows + 1,
});
}
if offsets[0] != 0 {
return Err(SparseError::NonZeroFirstOffset { value: offsets[0] });
}
for i in 0..rows {
if offsets[i] > offsets[i + 1] {
return Err(SparseError::NonMonotonicOffsets {
index: i,
value: offsets[i],
next_index: i + 1,
next_value: offsets[i + 1],
});
}
}
let nnz = col_indices.len();
if offsets[rows] as usize != nnz {
return Err(SparseError::OffsetNnzMismatch {
offset_last: offsets[rows],
nnz,
});
}
if nnz != values_len {
return Err(SparseError::LengthMismatch {
col_len: nnz,
val_len: values_len,
});
}
for (i, &col) in col_indices.iter().enumerate() {
if col as usize >= cols {
return Err(SparseError::ColumnOutOfBounds {
col,
cols,
position: i,
});
}
}
Ok(())
}