conspire/math/tensor/tuple/
mod.rs

1use crate::math::{Tensor, TensorRank0, TensorVector};
2use std::{
3    fmt::{Display, Formatter, Result},
4    iter::Sum,
5    ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign},
6};
7
8pub type TensorTupleVec<T1, T2> = TensorVector<TensorTuple<T1, T2>>;
9
10#[derive(Clone, Debug)]
11pub struct TensorTuple<T1, T2>(T1, T2)
12where
13    T1: Tensor,
14    T2: Tensor;
15
16impl<T1, T2> Default for TensorTuple<T1, T2>
17where
18    T1: Tensor,
19    T2: Tensor,
20{
21    fn default() -> Self {
22        Self(T1::default(), T2::default())
23    }
24}
25
26impl<T1, T2> From<(T1, T2)> for TensorTuple<T1, T2>
27where
28    T1: Tensor,
29    T2: Tensor,
30{
31    fn from(tuple: (T1, T2)) -> Self {
32        Self(tuple.0, tuple.1)
33    }
34}
35
36impl<'a, T1, T2> From<&'a TensorTuple<T1, T2>> for (&'a T1, &'a T2)
37where
38    T1: Tensor,
39    T2: Tensor,
40{
41    fn from(tensor_tuple: &'a TensorTuple<T1, T2>) -> Self {
42        (&tensor_tuple.0, &tensor_tuple.1)
43    }
44}
45
46impl<T1, T2> From<TensorTuple<T1, T2>> for (T1, T2)
47where
48    T1: Tensor,
49    T2: Tensor,
50{
51    fn from(tensor_tuple: TensorTuple<T1, T2>) -> Self {
52        (tensor_tuple.0, tensor_tuple.1)
53    }
54}
55
56impl<T1, T2> Display for TensorTuple<T1, T2>
57where
58    T1: Tensor,
59    T2: Tensor,
60{
61    fn fmt(&self, f: &mut Formatter) -> Result {
62        write!(f, "Need to implement Display")
63    }
64}
65
66impl<T1, T2> Tensor for TensorTuple<T1, T2>
67where
68    T1: Tensor,
69    T2: Tensor,
70{
71    type Item = T1::Item;
72    fn iter(&self) -> impl Iterator<Item = &Self::Item> {
73        if self.size() == 0 {
74            self.0.iter()
75        } else {
76            unimplemented!()
77        }
78    }
79    fn iter_mut(&mut self) -> impl Iterator<Item = &mut Self::Item> {
80        if self.size() == 0 {
81            self.0.iter_mut()
82        } else {
83            unimplemented!()
84        }
85    }
86    fn len(&self) -> usize {
87        unimplemented!()
88    }
89    fn norm_inf(&self) -> TensorRank0 {
90        self.0.norm_inf().max(self.1.norm_inf())
91    }
92    fn size(&self) -> usize {
93        self.0.size() + self.1.size()
94    }
95}
96
97impl<T1, T2> Sum for TensorTuple<T1, T2>
98where
99    T1: Tensor,
100    T2: Tensor,
101{
102    fn sum<Ii>(iter: Ii) -> Self
103    where
104        Ii: Iterator<Item = Self>,
105    {
106        iter.reduce(|mut acc, item| {
107            acc.0 += item.0;
108            acc.1 += item.1;
109            acc
110        })
111        .unwrap_or_else(Self::default)
112    }
113}
114
115impl<T1, T2> Div<TensorRank0> for TensorTuple<T1, T2>
116where
117    T1: Tensor,
118    T2: Tensor,
119{
120    type Output = Self;
121    fn div(mut self, tensor_rank_0: TensorRank0) -> Self::Output {
122        self /= tensor_rank_0;
123        self
124    }
125}
126
127impl<T1, T2> Div<&TensorRank0> for TensorTuple<T1, T2>
128where
129    T1: Tensor,
130    T2: Tensor,
131{
132    type Output = Self;
133    fn div(mut self, tensor_rank_0: &TensorRank0) -> Self::Output {
134        self /= tensor_rank_0;
135        self
136    }
137}
138
139impl<T1, T2> DivAssign<TensorRank0> for TensorTuple<T1, T2>
140where
141    T1: Tensor,
142    T2: Tensor,
143{
144    fn div_assign(&mut self, tensor_rank_0: TensorRank0) {
145        self.0 /= &tensor_rank_0;
146        self.1 /= tensor_rank_0;
147    }
148}
149
150impl<T1, T2> DivAssign<&TensorRank0> for TensorTuple<T1, T2>
151where
152    T1: Tensor,
153    T2: Tensor,
154{
155    fn div_assign(&mut self, tensor_rank_0: &TensorRank0) {
156        self.0 /= tensor_rank_0;
157        self.1 /= tensor_rank_0;
158    }
159}
160
161impl<T1, T2> Mul<TensorRank0> for TensorTuple<T1, T2>
162where
163    T1: Tensor,
164    T2: Tensor,
165{
166    type Output = Self;
167    fn mul(mut self, tensor_rank_0: TensorRank0) -> Self::Output {
168        self *= tensor_rank_0;
169        self
170    }
171}
172
173impl<T1, T2> Mul<TensorRank0> for &TensorTuple<T1, T2>
174where
175    T1: Tensor,
176    T2: Tensor,
177{
178    type Output = TensorTuple<T1, T2>;
179    fn mul(self, tensor_rank_0: TensorRank0) -> Self::Output {
180        //
181        // Cloning for now to avoid trait recursion nightmare.
182        //
183        TensorTuple(
184            self.0.clone() * tensor_rank_0,
185            self.1.clone() * tensor_rank_0,
186        )
187    }
188}
189
190impl<T1, T2> Mul<&TensorRank0> for TensorTuple<T1, T2>
191where
192    T1: Tensor,
193    T2: Tensor,
194{
195    type Output = Self;
196    fn mul(mut self, tensor_rank_0: &TensorRank0) -> Self::Output {
197        self *= tensor_rank_0;
198        self
199    }
200}
201
202impl<T1, T2> MulAssign<TensorRank0> for TensorTuple<T1, T2>
203where
204    T1: Tensor,
205    T2: Tensor,
206{
207    fn mul_assign(&mut self, tensor_rank_0: TensorRank0) {
208        self.0 *= &tensor_rank_0;
209        self.1 *= tensor_rank_0;
210    }
211}
212
213impl<T1, T2> MulAssign<&TensorRank0> for TensorTuple<T1, T2>
214where
215    T1: Tensor,
216    T2: Tensor,
217{
218    fn mul_assign(&mut self, tensor_rank_0: &TensorRank0) {
219        self.0 *= tensor_rank_0;
220        self.1 *= tensor_rank_0;
221    }
222}
223
224impl<T1, T2> Add for TensorTuple<T1, T2>
225where
226    T1: Tensor,
227    T2: Tensor,
228{
229    type Output = Self;
230    fn add(mut self, tensor_tuple: Self) -> Self::Output {
231        self += tensor_tuple;
232        self
233    }
234}
235
236impl<T1, T2> Add<&Self> for TensorTuple<T1, T2>
237where
238    T1: Tensor,
239    T2: Tensor,
240{
241    type Output = Self;
242    fn add(mut self, tensor_tuple: &Self) -> Self::Output {
243        self += tensor_tuple;
244        self
245    }
246}
247
248impl<T1, T2> AddAssign for TensorTuple<T1, T2>
249where
250    T1: Tensor,
251    T2: Tensor,
252{
253    fn add_assign(&mut self, tensor_tuple: Self) {
254        self.0 += tensor_tuple.0;
255        self.1 += tensor_tuple.1;
256    }
257}
258
259impl<T1, T2> AddAssign<&Self> for TensorTuple<T1, T2>
260where
261    T1: Tensor,
262    T2: Tensor,
263{
264    fn add_assign(&mut self, tensor_tuple: &Self) {
265        self.0 += &tensor_tuple.0;
266        self.1 += &tensor_tuple.1;
267    }
268}
269
270impl<T1, T2> Sub for TensorTuple<T1, T2>
271where
272    T1: Tensor,
273    T2: Tensor,
274{
275    type Output = Self;
276    fn sub(mut self, tensor_tuple: Self) -> Self::Output {
277        self -= tensor_tuple;
278        self
279    }
280}
281
282impl<T1, T2> Sub<&Self> for TensorTuple<T1, T2>
283where
284    T1: Tensor,
285    T2: Tensor,
286{
287    type Output = Self;
288    fn sub(mut self, tensor_tuple: &Self) -> Self::Output {
289        self -= tensor_tuple;
290        self
291    }
292}
293
294impl<T1, T2> Sub for &TensorTuple<T1, T2>
295where
296    T1: Tensor,
297    T2: Tensor,
298{
299    type Output = TensorTuple<T1, T2>;
300    fn sub(self, _tensor_tuple: Self) -> Self::Output {
301        unimplemented!("Avoiding trait recursion nightmare")
302    }
303}
304
305impl<T1, T2> SubAssign for TensorTuple<T1, T2>
306where
307    T1: Tensor,
308    T2: Tensor,
309{
310    fn sub_assign(&mut self, tensor_tuple: Self) {
311        self.0 -= tensor_tuple.0;
312        self.1 -= tensor_tuple.1;
313    }
314}
315
316impl<T1, T2> SubAssign<&Self> for TensorTuple<T1, T2>
317where
318    T1: Tensor,
319    T2: Tensor,
320{
321    fn sub_assign(&mut self, tensor_tuple: &Self) {
322        self.0 -= &tensor_tuple.0;
323        self.1 -= &tensor_tuple.1;
324    }
325}