conspire/math/tensor/rank_1/vec_2d/
mod.rs

1use crate::math::{TensorRank0, TensorRank1Vec, TensorVec};
2use std::ops::{Index, IndexMut};
3
4/// A 2D vector of *d*-dimensional tensors of rank 1.
5///
6/// `D` is the dimension, `I` is the configuration.
7#[derive(Clone, Debug)]
8pub struct TensorRank1Vec2D<const D: usize, const I: usize>(Vec<TensorRank1Vec<D, I>>);
9
10impl<const D: usize, const I: usize> FromIterator<TensorRank1Vec<D, I>> for TensorRank1Vec2D<D, I> {
11    fn from_iter<Ii: IntoIterator<Item = TensorRank1Vec<D, I>>>(into_iterator: Ii) -> Self {
12        Self(Vec::from_iter(into_iterator))
13    }
14}
15
16impl<const D: usize, const I: usize> Index<usize> for TensorRank1Vec2D<D, I> {
17    type Output = TensorRank1Vec<D, I>;
18    fn index(&self, index: usize) -> &Self::Output {
19        &self.0[index]
20    }
21}
22
23impl<const D: usize, const I: usize> IndexMut<usize> for TensorRank1Vec2D<D, I> {
24    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
25        &mut self.0[index]
26    }
27}
28
29impl<const D: usize, const I: usize> TensorVec for TensorRank1Vec2D<D, I> {
30    type Item = TensorRank1Vec<D, I>;
31    type Slice<'a> = &'a [&'a [[TensorRank0; D]]];
32    fn append(&mut self, other: &mut Self) {
33        self.0.append(&mut other.0)
34    }
35    fn is_empty(&self) -> bool {
36        self.0.is_empty()
37    }
38    fn len(&self) -> usize {
39        self.0.len()
40    }
41    fn new(slice: Self::Slice<'_>) -> Self {
42        slice
43            .iter()
44            .map(|slice_entry| Self::Item::new(*slice_entry))
45            .collect()
46    }
47    fn push(&mut self, item: Self::Item) {
48        self.0.push(item)
49    }
50    fn remove(&mut self, index: usize) -> Self::Item {
51        self.0.remove(index)
52    }
53    fn retain<F>(&mut self, f: F)
54    where
55        F: FnMut(&Self::Item) -> bool,
56    {
57        self.0.retain(f)
58    }
59    fn swap_remove(&mut self, index: usize) -> Self::Item {
60        self.0.swap_remove(index)
61    }
62    fn zero(len: usize) -> Self {
63        (0..len).map(|_| Self::Item::zero(0)).collect()
64    }
65}
66
67// impl<const D: usize, const I: usize> Tensor for TensorRank1Vec2D<D, I> {
68//     type Item = TensorRank1Vec<D, I>;
69//     fn iter(&self) -> impl Iterator<Item = &Self::Item> {
70//         self.0.iter()
71//     }
72//     fn iter_mut(&mut self) -> impl Iterator<Item = &mut Self::Item> {
73//         self.0.iter_mut()
74//     }
75//     fn num_entries(&self) -> usize {
76//         todo!()
77//     }
78// }
79
80impl<const D: usize, const I: usize> TensorRank1Vec2D<D, I> {
81    pub fn iter(&self) -> impl Iterator<Item = &TensorRank1Vec<D, I>> {
82        self.0.iter()
83    }
84    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut TensorRank1Vec<D, I>> {
85        self.0.iter_mut()
86    }
87}