Test CsrMatrix::row_iter(_mut) and CscMatrix::col_iter(_mut)

This commit is contained in:
Andreas Longva 2021-02-01 14:34:22 +01:00
parent 1ebb612d46
commit 66b9185ec1
2 changed files with 264 additions and 2 deletions

View File

@ -392,7 +392,140 @@ fn csc_matrix_get_index_entry() {
#[test]
fn csc_matrix_col_iter() {
// TODO
// Note: this is the transpose of the matrix used for the similar csr_matrix_row_iter test
// (this way the actual tests are almost identical, due to the transposed relationship
// between CSR and CSC)
#[rustfmt::skip]
let dense = DMatrix::from_row_slice(4, 3, &[
0, 3, 0,
1, 0, 4,
2, 0, 0,
0, 0, 5,
]);
let csc = CscMatrix::from(&dense);
// Immutable iterator
{
let mut col_iter = csc.col_iter();
{
let col = col_iter.next().unwrap();
assert_eq!(col.nrows(), 4);
assert_eq!(col.nnz(), 2);
assert_eq!(col.row_indices(), &[1, 2]);
assert_eq!(col.values(), &[1, 2]);
assert_eq!(col.get_entry(0), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(1), Some(SparseEntry::NonZero(&1)));
assert_eq!(col.get_entry(2), Some(SparseEntry::NonZero(&2)));
assert_eq!(col.get_entry(3), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(4), None);
}
{
let col = col_iter.next().unwrap();
assert_eq!(col.nrows(), 4);
assert_eq!(col.nnz(), 1);
assert_eq!(col.row_indices(), &[0]);
assert_eq!(col.values(), &[3]);
assert_eq!(col.get_entry(0), Some(SparseEntry::NonZero(&3)));
assert_eq!(col.get_entry(1), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(2), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(3), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(4), None);
}
{
let col = col_iter.next().unwrap();
assert_eq!(col.nrows(), 4);
assert_eq!(col.nnz(), 2);
assert_eq!(col.row_indices(), &[1, 3]);
assert_eq!(col.values(), &[4, 5]);
assert_eq!(col.get_entry(0), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(1), Some(SparseEntry::NonZero(&4)));
assert_eq!(col.get_entry(2), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(3), Some(SparseEntry::NonZero(&5)));
assert_eq!(col.get_entry(4), None);
}
assert!(col_iter.next().is_none());
}
// Mutable iterator
{
let mut csc = csc;
let mut col_iter = csc.col_iter_mut();
{
let mut col = col_iter.next().unwrap();
assert_eq!(col.nrows(), 4);
assert_eq!(col.nnz(), 2);
assert_eq!(col.row_indices(), &[1, 2]);
assert_eq!(col.values(), &[1, 2]);
assert_eq!(col.get_entry(0), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(1), Some(SparseEntry::NonZero(&1)));
assert_eq!(col.get_entry(2), Some(SparseEntry::NonZero(&2)));
assert_eq!(col.get_entry(3), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(4), None);
assert_eq!(col.values_mut(), &mut [1, 2]);
assert_eq!(
col.rows_and_values_mut(),
([1, 2].as_ref(), [1, 2].as_mut())
);
assert_eq!(col.get_entry_mut(0), Some(SparseEntryMut::Zero));
assert_eq!(col.get_entry_mut(1), Some(SparseEntryMut::NonZero(&mut 1)));
assert_eq!(col.get_entry_mut(2), Some(SparseEntryMut::NonZero(&mut 2)));
assert_eq!(col.get_entry_mut(3), Some(SparseEntryMut::Zero));
assert_eq!(col.get_entry_mut(4), None);
}
{
let mut col = col_iter.next().unwrap();
assert_eq!(col.nrows(), 4);
assert_eq!(col.nnz(), 1);
assert_eq!(col.row_indices(), &[0]);
assert_eq!(col.values(), &[3]);
assert_eq!(col.get_entry(0), Some(SparseEntry::NonZero(&3)));
assert_eq!(col.get_entry(1), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(2), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(3), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(4), None);
assert_eq!(col.values_mut(), &mut [3]);
assert_eq!(col.rows_and_values_mut(), ([0].as_ref(), [3].as_mut()));
assert_eq!(col.get_entry_mut(0), Some(SparseEntryMut::NonZero(&mut 3)));
assert_eq!(col.get_entry_mut(1), Some(SparseEntryMut::Zero));
assert_eq!(col.get_entry_mut(2), Some(SparseEntryMut::Zero));
assert_eq!(col.get_entry_mut(3), Some(SparseEntryMut::Zero));
assert_eq!(col.get_entry_mut(4), None);
}
{
let mut col = col_iter.next().unwrap();
assert_eq!(col.nrows(), 4);
assert_eq!(col.nnz(), 2);
assert_eq!(col.row_indices(), &[1, 3]);
assert_eq!(col.values(), &[4, 5]);
assert_eq!(col.get_entry(0), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(1), Some(SparseEntry::NonZero(&4)));
assert_eq!(col.get_entry(2), Some(SparseEntry::Zero));
assert_eq!(col.get_entry(3), Some(SparseEntry::NonZero(&5)));
assert_eq!(col.get_entry(4), None);
assert_eq!(col.values_mut(), &mut [4, 5]);
assert_eq!(
col.rows_and_values_mut(),
([1, 3].as_ref(), [4, 5].as_mut())
);
assert_eq!(col.get_entry_mut(0), Some(SparseEntryMut::Zero));
assert_eq!(col.get_entry_mut(1), Some(SparseEntryMut::NonZero(&mut 4)));
assert_eq!(col.get_entry_mut(2), Some(SparseEntryMut::Zero));
assert_eq!(col.get_entry_mut(3), Some(SparseEntryMut::NonZero(&mut 5)));
assert_eq!(col.get_entry_mut(4), None);
}
assert!(col_iter.next().is_none());
}
}
proptest! {

View File

@ -392,7 +392,136 @@ fn csr_matrix_get_index_entry() {
#[test]
fn csr_matrix_row_iter() {
// TODO
#[rustfmt::skip]
let dense = DMatrix::from_row_slice(3, 4, &[
0, 1, 2, 0,
3, 0, 0, 0,
0, 4, 0, 5
]);
let csr = CsrMatrix::from(&dense);
// Immutable iterator
{
let mut row_iter = csr.row_iter();
{
let row = row_iter.next().unwrap();
assert_eq!(row.ncols(), 4);
assert_eq!(row.nnz(), 2);
assert_eq!(row.col_indices(), &[1, 2]);
assert_eq!(row.values(), &[1, 2]);
assert_eq!(row.get_entry(0), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(1), Some(SparseEntry::NonZero(&1)));
assert_eq!(row.get_entry(2), Some(SparseEntry::NonZero(&2)));
assert_eq!(row.get_entry(3), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(4), None);
}
{
let row = row_iter.next().unwrap();
assert_eq!(row.ncols(), 4);
assert_eq!(row.nnz(), 1);
assert_eq!(row.col_indices(), &[0]);
assert_eq!(row.values(), &[3]);
assert_eq!(row.get_entry(0), Some(SparseEntry::NonZero(&3)));
assert_eq!(row.get_entry(1), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(2), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(3), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(4), None);
}
{
let row = row_iter.next().unwrap();
assert_eq!(row.ncols(), 4);
assert_eq!(row.nnz(), 2);
assert_eq!(row.col_indices(), &[1, 3]);
assert_eq!(row.values(), &[4, 5]);
assert_eq!(row.get_entry(0), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(1), Some(SparseEntry::NonZero(&4)));
assert_eq!(row.get_entry(2), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(3), Some(SparseEntry::NonZero(&5)));
assert_eq!(row.get_entry(4), None);
}
assert!(row_iter.next().is_none());
}
// Mutable iterator
{
let mut csr = csr;
let mut row_iter = csr.row_iter_mut();
{
let mut row = row_iter.next().unwrap();
assert_eq!(row.ncols(), 4);
assert_eq!(row.nnz(), 2);
assert_eq!(row.col_indices(), &[1, 2]);
assert_eq!(row.values(), &[1, 2]);
assert_eq!(row.get_entry(0), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(1), Some(SparseEntry::NonZero(&1)));
assert_eq!(row.get_entry(2), Some(SparseEntry::NonZero(&2)));
assert_eq!(row.get_entry(3), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(4), None);
assert_eq!(row.values_mut(), &mut [1, 2]);
assert_eq!(
row.cols_and_values_mut(),
([1, 2].as_ref(), [1, 2].as_mut())
);
assert_eq!(row.get_entry_mut(0), Some(SparseEntryMut::Zero));
assert_eq!(row.get_entry_mut(1), Some(SparseEntryMut::NonZero(&mut 1)));
assert_eq!(row.get_entry_mut(2), Some(SparseEntryMut::NonZero(&mut 2)));
assert_eq!(row.get_entry_mut(3), Some(SparseEntryMut::Zero));
assert_eq!(row.get_entry_mut(4), None);
}
{
let mut row = row_iter.next().unwrap();
assert_eq!(row.ncols(), 4);
assert_eq!(row.nnz(), 1);
assert_eq!(row.col_indices(), &[0]);
assert_eq!(row.values(), &[3]);
assert_eq!(row.get_entry(0), Some(SparseEntry::NonZero(&3)));
assert_eq!(row.get_entry(1), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(2), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(3), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(4), None);
assert_eq!(row.values_mut(), &mut [3]);
assert_eq!(row.cols_and_values_mut(), ([0].as_ref(), [3].as_mut()));
assert_eq!(row.get_entry_mut(0), Some(SparseEntryMut::NonZero(&mut 3)));
assert_eq!(row.get_entry_mut(1), Some(SparseEntryMut::Zero));
assert_eq!(row.get_entry_mut(2), Some(SparseEntryMut::Zero));
assert_eq!(row.get_entry_mut(3), Some(SparseEntryMut::Zero));
assert_eq!(row.get_entry_mut(4), None);
}
{
let mut row = row_iter.next().unwrap();
assert_eq!(row.ncols(), 4);
assert_eq!(row.nnz(), 2);
assert_eq!(row.col_indices(), &[1, 3]);
assert_eq!(row.values(), &[4, 5]);
assert_eq!(row.get_entry(0), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(1), Some(SparseEntry::NonZero(&4)));
assert_eq!(row.get_entry(2), Some(SparseEntry::Zero));
assert_eq!(row.get_entry(3), Some(SparseEntry::NonZero(&5)));
assert_eq!(row.get_entry(4), None);
assert_eq!(row.values_mut(), &mut [4, 5]);
assert_eq!(
row.cols_and_values_mut(),
([1, 3].as_ref(), [4, 5].as_mut())
);
assert_eq!(row.get_entry_mut(0), Some(SparseEntryMut::Zero));
assert_eq!(row.get_entry_mut(1), Some(SparseEntryMut::NonZero(&mut 4)));
assert_eq!(row.get_entry_mut(2), Some(SparseEntryMut::Zero));
assert_eq!(row.get_entry_mut(3), Some(SparseEntryMut::NonZero(&mut 5)));
assert_eq!(row.get_entry_mut(4), None);
}
assert!(row_iter.next().is_none());
}
}
proptest! {