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 zero(len: usize) -> Self {
51        (0..len).map(|_| Self::Item::zero(0)).collect()
52    }
53}
54
55// impl<const D: usize, const I: usize> Tensor for TensorRank1Vec2D<D, I> {
56//     type Item = TensorRank1Vec<D, I>;
57//     fn iter(&self) -> impl Iterator<Item = &Self::Item> {
58//         self.0.iter()
59//     }
60//     fn iter_mut(&mut self) -> impl Iterator<Item = &mut Self::Item> {
61//         self.0.iter_mut()
62//     }
63//     fn num_entries(&self) -> usize {
64//         todo!()
65//     }
66// }
67
68impl<const D: usize, const I: usize> TensorRank1Vec2D<D, I> {
69    pub fn iter(&self) -> impl Iterator<Item = &TensorRank1Vec<D, I>> {
70        self.0.iter()
71    }
72    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut TensorRank1Vec<D, I>> {
73        self.0.iter_mut()
74    }
75}