From b37eeee636284c6d54e36a9ac3dea8780bb814a9 Mon Sep 17 00:00:00 2001 From: lukas Date: Fri, 30 Sep 2022 19:49:47 -0700 Subject: [PATCH 1/3] add mutable triplet iter --- nalgebra-sparse/src/coo.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/nalgebra-sparse/src/coo.rs b/nalgebra-sparse/src/coo.rs index 25dc07fb..b71cb0b6 100644 --- a/nalgebra-sparse/src/coo.rs +++ b/nalgebra-sparse/src/coo.rs @@ -170,6 +170,16 @@ impl CooMatrix { .map(|((i, j), v)| (*i, *j, v)) } + /// A mutable iterator over triplets (i, j, v). + // TODO: Consider giving the iterator a concrete type instead of impl trait...? + pub fn triplet_iter_mut(&mut self) -> impl Iterator { + self.row_indices + .iter() + .zip(&self.col_indices) + .zip(self.values.iter_mut()) + .map(|((i, j), v)| (*i, *j, v)) + } + /// Reserves capacity for COO matrix by at least `additional` elements. /// /// This increase the capacities of triplet holding arrays by reserving more space to avoid From 9a38c554af63ac3dc147e6376c670a43afec18f4 Mon Sep 17 00:00:00 2001 From: lukas Date: Sun, 2 Oct 2022 11:57:37 -0700 Subject: [PATCH 2/3] add test case --- nalgebra-sparse/tests/unit_tests/coo.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/nalgebra-sparse/tests/unit_tests/coo.rs b/nalgebra-sparse/tests/unit_tests/coo.rs index d232b041..fae0144a 100644 --- a/nalgebra-sparse/tests/unit_tests/coo.rs +++ b/nalgebra-sparse/tests/unit_tests/coo.rs @@ -87,6 +87,26 @@ fn coo_construction_for_valid_data() { } } +#[test] +fn coo_triplets_iter_mut() { + // Arbitrary matrix, with duplicates + let i = vec![0, 1, 0, 0, 0, 0, 2, 1]; + let j = vec![0, 2, 0, 1, 0, 3, 3, 2]; + let v = vec![2, 3, 4, 7, 1, 3, 1, 5]; + let mut coo = + CooMatrix::::try_from_triplets(3, 5, i.clone(), j.clone(), v.clone()).unwrap(); + coo.triplet_iter_mut().for_each(|(_i, _j, v)| *v = *v * *v); + + let expected_triplets: Vec<_> = i + .iter() + .zip(&j) + .zip(&v) + .map(|((i, j), v)| (*i, *j, v * v)) + .collect(); + let actual_triplets: Vec<_> = coo.triplet_iter().map(|(i, j, v)| (i, j, *v)).collect(); + assert_eq!(expected_triplets, actual_triplets) +} + #[test] fn coo_try_from_triplets_reports_out_of_bounds_indices() { { From e227dd693e233cc2819277ffe0f0b252bdb84bf8 Mon Sep 17 00:00:00 2001 From: lukas Date: Mon, 10 Oct 2022 19:05:47 -0700 Subject: [PATCH 3/3] Refactor unit tests --- nalgebra-sparse/tests/unit_tests/coo.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/nalgebra-sparse/tests/unit_tests/coo.rs b/nalgebra-sparse/tests/unit_tests/coo.rs index fae0144a..8e46651f 100644 --- a/nalgebra-sparse/tests/unit_tests/coo.rs +++ b/nalgebra-sparse/tests/unit_tests/coo.rs @@ -95,16 +95,30 @@ fn coo_triplets_iter_mut() { let v = vec![2, 3, 4, 7, 1, 3, 1, 5]; let mut coo = CooMatrix::::try_from_triplets(3, 5, i.clone(), j.clone(), v.clone()).unwrap(); - coo.triplet_iter_mut().for_each(|(_i, _j, v)| *v = *v * *v); + + let actual_triplets: Vec<_> = coo.triplet_iter_mut().map(|(i, j, v)| (i, j, *v)).collect(); let expected_triplets: Vec<_> = i .iter() .zip(&j) .zip(&v) - .map(|((i, j), v)| (*i, *j, v * v)) + .map(|((i, j), v)| (*i, *j, *v)) .collect(); - let actual_triplets: Vec<_> = coo.triplet_iter().map(|(i, j, v)| (i, j, *v)).collect(); - assert_eq!(expected_triplets, actual_triplets) + assert_eq!(expected_triplets, actual_triplets); + + for (_i, _j, v) in coo.triplet_iter_mut() { + *v += *v; + } + + let actual_triplets: Vec<_> = coo.triplet_iter_mut().map(|(i, j, v)| (i, j, *v)).collect(); + let v = vec![4, 6, 8, 14, 2, 6, 2, 10]; + let expected_triplets: Vec<_> = i + .iter() + .zip(&j) + .zip(&v) + .map(|((i, j), v)| (*i, *j, *v)) + .collect(); + assert_eq!(expected_triplets, actual_triplets); } #[test]