concision_core/params/
iter.rs

1/*
2    Appellation: iter <module>
3    Contrib: @FL03
4*/
5use ndarray::Dimension;
6use ndarray::iter::AxisIter;
7use ndarray::iter::Iter as NdIter;
8
9pub type ItemMut<'a, A, D> = (
10    <AxisIter<'a, A, <D as Dimension>::Smaller> as Iterator>::Item,
11    &'a mut A,
12);
13
14pub struct Iter<'a, A, D>
15where
16    D: Dimension,
17{
18    pub(crate) weights: AxisIter<'a, A, D::Smaller>,
19    pub(crate) bias: NdIter<'a, A, D::Smaller>,
20}
21
22impl<'a, A, D> Iter<'a, A, D>
23where
24    D: Dimension,
25{
26    pub fn new(weights: AxisIter<'a, A, D::Smaller>, bias: NdIter<'a, A, D::Smaller>) -> Self {
27        Self { weights, bias }
28    }
29}
30
31impl<'a, A, D> Iterator for Iter<'a, A, D>
32where
33    D: Dimension,
34{
35    type Item = (
36        <AxisIter<'a, A, <D as Dimension>::Smaller> as Iterator>::Item,
37        &'a A,
38    );
39
40    fn next(&mut self) -> Option<Self::Item> {
41        match (self.weights.next(), self.bias.next()) {
42            (Some(w), Some(b)) => Some((w, b)),
43            _ => None,
44        }
45    }
46}
47
48impl<'a, A, D> ExactSizeIterator for Iter<'a, A, D>
49where
50    D: Dimension,
51{
52    fn len(&self) -> usize {
53        self.weights.len()
54    }
55}