Skip to content

Commit d5b9033

Browse files
author
maxtremblay
committed
Add non trivial elements iterator
1 parent 88603ac commit d5b9033

File tree

3 files changed

+85
-6
lines changed

3 files changed

+85
-6
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "sparse-bin-mat"
3-
version = "0.4.2"
3+
version = "0.4.3"
44
authors = ["maxtremblay <maxtremblay>"]
55
edition = "2018"
66
description = "A sparse implementation of a binary matrix optimized for row operations"

src/matrix/mod.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,30 @@ impl SparseBinMat {
313313
Rows::from(self)
314314
}
315315

316+
/// Returns an iterator yielding the positions of the non
317+
/// trivial elements.
318+
///
319+
/// # Example
320+
///
321+
/// ```
322+
/// # use sparse_bin_mat::{SparseBinSlice, SparseBinMat};
323+
/// let rows = vec![vec![0, 2], vec![1], vec![0, 2], vec![1]];
324+
/// let matrix = SparseBinMat::new(3, rows);
325+
///
326+
/// let mut iter = matrix.non_trivial_elements();
327+
///
328+
/// assert_eq!(iter.next(), Some((0, 0)));
329+
/// assert_eq!(iter.next(), Some((0, 2)));
330+
/// assert_eq!(iter.next(), Some((1, 1)));
331+
/// assert_eq!(iter.next(), Some((2, 0)));
332+
/// assert_eq!(iter.next(), Some((2, 2)));
333+
/// assert_eq!(iter.next(), Some((3, 1)));
334+
/// assert_eq!(iter.next(), None);
335+
/// ```
336+
pub fn non_trivial_elements(&self) -> NonTrivialElements {
337+
NonTrivialElements::new(self)
338+
}
339+
316340
/// Returns an iterator yielding the number
317341
/// of non zero elements in each row of the matrix.
318342
///

src/matrix/non_trivial_elements.rs

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,82 @@
11
use super::SparseBinMat;
2-
use crate::SparseBinSlice;
32

43
/// An iterator over the coordinates of non trivial elements.
54
///
65
/// See the [`non_trivial_elements`](SparseBinMat::non_trivial_elements) method.
76
#[derive(Debug, Clone)]
8-
pub struct NonTrivialElements<'a> {}
7+
pub struct NonTrivialElements<'a> {
8+
matrix: &'a SparseBinMat,
9+
row_index: usize,
10+
column_index: usize,
11+
}
912

1013
impl<'a> NonTrivialElements<'a> {
11-
pub(super) fn new(matrix: &'a SparseBinMat) -> Self {}
14+
pub(super) fn new(matrix: &'a SparseBinMat) -> Self {
15+
Self {
16+
matrix,
17+
row_index: 0,
18+
column_index: 0,
19+
}
20+
}
21+
22+
fn next_element(&mut self) -> Option<(usize, usize)> {
23+
self.matrix
24+
.row(self.row_index)
25+
.and_then(|row| row.as_slice().get(self.column_index).cloned())
26+
.map(|column| (self.row_index, column))
27+
}
1228

1329
fn move_to_next_row(&mut self) {
14-
todo!()
30+
self.row_index += 1;
31+
self.column_index = 0;
32+
}
33+
34+
fn move_to_next_column(&mut self) {
35+
self.column_index += 1;
36+
}
37+
38+
fn is_done(&self) -> bool {
39+
self.row_index >= self.matrix.number_of_rows()
1540
}
1641
}
1742

1843
impl<'a> Iterator for NonTrivialElements<'a> {
1944
type Item = (usize, usize);
2045

21-
fn next(&mut self) -> Option<Self::Item> {}
46+
fn next(&mut self) -> Option<Self::Item> {
47+
println!("({}, {})", self.row_index, self.column_index);
48+
if self.is_done() {
49+
None
50+
} else {
51+
match self.next_element() {
52+
Some(element) => {
53+
self.move_to_next_column();
54+
Some(element)
55+
}
56+
None => {
57+
self.move_to_next_row();
58+
self.next()
59+
}
60+
}
61+
}
62+
}
2263
}
2364

2465
#[cfg(test)]
2566
mod test {
2667
use super::*;
68+
69+
#[test]
70+
fn non_trivial_elements_of_small_matrix() {
71+
let matrix = SparseBinMat::new(3, vec![vec![1], vec![0, 2], vec![0, 1, 2]]);
72+
let mut iter = NonTrivialElements::new(&matrix);
73+
74+
assert_eq!(iter.next(), Some((0, 1)));
75+
assert_eq!(iter.next(), Some((1, 0)));
76+
assert_eq!(iter.next(), Some((1, 2)));
77+
assert_eq!(iter.next(), Some((2, 0)));
78+
assert_eq!(iter.next(), Some((2, 1)));
79+
assert_eq!(iter.next(), Some((2, 2)));
80+
assert_eq!(iter.next(), None);
81+
}
2782
}

0 commit comments

Comments
 (0)