conspire/math/tensor/vec/
mod.rs1use crate::math::{Tensor, TensorRank0, TensorRank1, TensorRank1List, TensorVec};
2use std::{
3 collections::VecDeque,
4 fmt::{Display, Formatter, Result},
5 iter::Sum,
6 ops::{Add, AddAssign, Div, DivAssign, Index, IndexMut, Mul, MulAssign, Sub, SubAssign},
7 slice, vec,
8};
9
10#[derive(Clone, Debug, PartialEq)]
12pub struct TensorVector<T>(Vec<T>);
13pub type TensorRank1RefVec<'a, const D: usize, const I: usize> =
20 TensorVector<&'a TensorRank1<D, I>>;
21
22impl<'a, const D: usize, const I: usize> TensorRank1RefVec<'a, D, I> {
23 pub fn bounding_box(&self) -> TensorRank1List<D, I, 2> {
24 self.iter()
25 .skip(1)
26 .fold(
27 [self[0].clone(), self[0].clone()],
28 |[mut min, mut max], entry| {
29 entry
30 .iter()
31 .zip(min.iter_mut().zip(max.iter_mut()))
32 .for_each(|(&entry_i, (min_i, max_i))| {
33 *min_i = min_i.min(entry_i);
34 *max_i = max_i.max(entry_i);
35 });
36 [min, max]
37 },
38 )
39 .into()
40 }
41 pub fn iter(&self) -> impl Iterator<Item = &&TensorRank1<D, I>> {
42 self.0.iter()
43 }
44 pub fn is_empty(&self) -> bool {
45 self.0.is_empty()
46 }
47 pub fn len(&self) -> usize {
48 self.0.len()
49 }
50}
51
52impl<'a, const D: usize, const I: usize> Index<usize> for TensorRank1RefVec<'a, D, I> {
53 type Output = TensorRank1<D, I>;
54 fn index(&self, index: usize) -> &Self::Output {
55 self.0[index]
56 }
57}
58
59impl<T> TensorVector<T>
62where
63 T: Tensor,
64{
65 pub const fn as_ptr(&self) -> *const T {
67 self.0.as_ptr()
68 }
69 pub fn as_mut_slice(&mut self) -> &mut [T] {
70 self.0.as_mut_slice()
71 }
72}
73
74impl<T> Default for TensorVector<T>
75where
76 T: Tensor,
77{
78 fn default() -> Self {
79 Self(Vec::new())
80 }
81}
82
83impl<T, const N: usize> From<[T; N]> for TensorVector<T>
84where
85 T: Tensor,
86{
87 fn from(array: [T; N]) -> Self {
88 Self(array.to_vec())
89 }
90}
91
92impl<T> From<&[T]> for TensorVector<T>
93where
94 T: Tensor,
95{
96 fn from(slice: &[T]) -> Self {
97 Self(slice.to_vec())
98 }
99}
100
101impl<T> From<Vec<T>> for TensorVector<T>
102where
103 T: Tensor,
104{
105 fn from(vec: Vec<T>) -> Self {
106 Self(vec)
107 }
108}
109
110impl<T> From<TensorVector<T>> for Vec<T>
111where
112 T: Tensor,
113{
114 fn from(tensor_vector: TensorVector<T>) -> Self {
115 tensor_vector.0
116 }
117}
118
119impl<T> From<VecDeque<T>> for TensorVector<T>
120where
121 T: Tensor,
122{
123 fn from(vec_deque: VecDeque<T>) -> Self {
124 Self(vec_deque.into())
125 }
126}
127
128impl<T> From<TensorVector<T>> for VecDeque<T>
129where
130 T: Tensor,
131{
132 fn from(tensor_vector: TensorVector<T>) -> Self {
133 tensor_vector.0.into()
134 }
135}
136
137impl<T> Display for TensorVector<T>
138where
139 T: Tensor,
140{
141 fn fmt(&self, f: &mut Formatter) -> Result {
142 write!(f, "Need to implement Display")
143 }
158}
159
160impl<T> Extend<T> for TensorVector<T>
161where
162 T: Tensor,
163{
164 fn extend<I>(&mut self, iter: I)
165 where
166 I: IntoIterator<Item = T>,
167 {
168 self.0.extend(iter)
169 }
170}
171
172impl<T> Index<usize> for TensorVector<T>
173where
174 T: Tensor,
175{
176 type Output = T;
177 fn index(&self, index: usize) -> &Self::Output {
178 &self.0[index]
179 }
180}
181
182impl<T> IndexMut<usize> for TensorVector<T>
183where
184 T: Tensor,
185{
186 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
187 &mut self.0[index]
188 }
189}
190
191impl<T> Tensor for TensorVector<T>
192where
193 T: Tensor,
194{
195 type Item = T;
196 fn iter(&self) -> impl Iterator<Item = &Self::Item> {
197 self.0.iter()
198 }
199 fn iter_mut(&mut self) -> impl Iterator<Item = &mut Self::Item> {
200 self.0.iter_mut()
201 }
202 fn len(&self) -> usize {
203 self.0.len()
204 }
205 fn size(&self) -> usize {
206 self.len() * self[0].size() }
208}
209
210impl<T> FromIterator<T> for TensorVector<T>
211{
214 fn from_iter<Ii: IntoIterator<Item = T>>(into_iterator: Ii) -> Self {
215 Self(Vec::from_iter(into_iterator))
216 }
217}
218
219impl<T> IntoIterator for TensorVector<T>
220where
221 T: Tensor,
222{
223 type Item = T;
224 type IntoIter = vec::IntoIter<Self::Item>;
225 fn into_iter(self) -> Self::IntoIter {
226 self.0.into_iter()
227 }
228}
229
230impl<'a, T> IntoIterator for &'a TensorVector<T>
231where
232 T: Tensor,
233{
234 type Item = &'a T;
235 type IntoIter = slice::Iter<'a, T>;
236 fn into_iter(self) -> Self::IntoIter {
237 self.0.iter()
238 }
239}
240
241impl<T> Sum for TensorVector<T>
242where
243 T: Tensor,
244{
245 fn sum<Ii>(iter: Ii) -> Self
246 where
247 Ii: Iterator<Item = Self>,
248 {
249 iter.reduce(|mut acc, item| {
250 acc += item;
251 acc
252 })
253 .unwrap_or_else(Self::default)
254 }
255}
256
257impl<T> TensorVec for TensorVector<T>
258where
259 T: Tensor,
260{
261 type Item = T;
262 fn append(&mut self, other: &mut Self) {
263 self.0.append(&mut other.0)
264 }
265 fn capacity(&self) -> usize {
266 self.0.capacity()
267 }
268 fn is_empty(&self) -> bool {
269 self.0.is_empty()
270 }
271 fn new() -> Self {
272 Self(Vec::new())
273 }
274 fn push(&mut self, item: Self::Item) {
275 self.0.push(item)
276 }
277 fn remove(&mut self, index: usize) -> Self::Item {
278 self.0.remove(index)
279 }
280 fn reserve(&mut self, additional: usize) {
281 self.0.reserve(additional)
282 }
283 fn retain<F>(&mut self, f: F)
284 where
285 F: FnMut(&Self::Item) -> bool,
286 {
287 self.0.retain(f)
288 }
289 fn swap_remove(&mut self, index: usize) -> Self::Item {
290 self.0.swap_remove(index)
291 }
292 fn with_capacity(capacity: usize) -> Self {
293 Self(Vec::with_capacity(capacity))
294 }
295}
296
297impl<T> Div<TensorRank0> for TensorVector<T>
298where
299 T: Tensor,
300{
301 type Output = Self;
302 fn div(mut self, tensor_rank_0: TensorRank0) -> Self::Output {
303 self /= tensor_rank_0;
304 self
305 }
306}
307
308impl<T> Div<&TensorRank0> for TensorVector<T>
309where
310 T: Tensor,
311{
312 type Output = Self;
313 fn div(mut self, tensor_rank_0: &TensorRank0) -> Self::Output {
314 self /= tensor_rank_0;
315 self
316 }
317}
318
319impl<T> DivAssign<TensorRank0> for TensorVector<T>
320where
321 T: Tensor,
322{
323 fn div_assign(&mut self, tensor_rank_0: TensorRank0) {
324 self.iter_mut().for_each(|entry| *entry /= &tensor_rank_0);
325 }
326}
327
328impl<T> DivAssign<&TensorRank0> for TensorVector<T>
329where
330 T: Tensor,
331{
332 fn div_assign(&mut self, tensor_rank_0: &TensorRank0) {
333 self.iter_mut().for_each(|entry| *entry /= tensor_rank_0);
334 }
335}
336
337impl<T> Mul<TensorRank0> for TensorVector<T>
338where
339 T: Tensor,
340{
341 type Output = Self;
342 fn mul(mut self, tensor_rank_0: TensorRank0) -> Self::Output {
343 self *= tensor_rank_0;
344 self
345 }
346}
347
348impl<T> Mul<&TensorRank0> for TensorVector<T>
349where
350 T: Tensor,
351{
352 type Output = Self;
353 fn mul(mut self, tensor_rank_0: &TensorRank0) -> Self::Output {
354 self *= tensor_rank_0;
355 self
356 }
357}
358
359impl<T> Mul<TensorRank0> for &TensorVector<T>
360where
361 T: Tensor,
362 for<'a> &'a T: Mul<&'a TensorRank0, Output = T>,
363{
364 type Output = TensorVector<T>;
365 fn mul(self, tensor_rank_0: TensorRank0) -> Self::Output {
366 self.iter().map(|self_i| self_i * &tensor_rank_0).collect()
367 }
368}
369
370impl<T> MulAssign<TensorRank0> for TensorVector<T>
382where
383 T: Tensor,
384{
385 fn mul_assign(&mut self, tensor_rank_0: TensorRank0) {
386 self.iter_mut().for_each(|entry| *entry *= &tensor_rank_0);
387 }
388}
389
390impl<T> MulAssign<&TensorRank0> for TensorVector<T>
391where
392 T: Tensor,
393{
394 fn mul_assign(&mut self, tensor_rank_0: &TensorRank0) {
395 self.iter_mut().for_each(|entry| *entry *= tensor_rank_0);
396 }
397}
398
399impl<T> Add for TensorVector<T>
400where
401 T: Tensor,
402{
403 type Output = Self;
404 fn add(mut self, tensor_vec: Self) -> Self::Output {
405 self += tensor_vec;
406 self
407 }
408}
409
410impl<T> Add<&Self> for TensorVector<T>
411where
412 T: Tensor,
413{
414 type Output = Self;
415 fn add(mut self, tensor_vec: &Self) -> Self::Output {
416 self += tensor_vec;
417 self
418 }
419}
420
421impl<T> AddAssign for TensorVector<T>
422where
423 T: Tensor,
424{
425 fn add_assign(&mut self, tensor_vec: Self) {
426 self.iter_mut()
427 .zip(tensor_vec)
428 .for_each(|(self_entry, entry)| *self_entry += entry);
429 }
430}
431
432impl<T> AddAssign<&Self> for TensorVector<T>
433where
434 T: Tensor,
435{
436 fn add_assign(&mut self, tensor_vec: &Self) {
437 self.iter_mut()
438 .zip(tensor_vec.iter())
439 .for_each(|(self_entry, entry)| *self_entry += entry);
440 }
441}
442
443impl<T> Sub for TensorVector<T>
444where
445 T: Tensor,
446{
447 type Output = Self;
448 fn sub(mut self, tensor_vec: Self) -> Self::Output {
449 self -= tensor_vec;
450 self
451 }
452}
453
454impl<T> Sub<&Self> for TensorVector<T>
455where
456 T: Tensor,
457{
458 type Output = Self;
459 fn sub(mut self, tensor_vec: &Self) -> Self::Output {
460 self -= tensor_vec;
461 self
462 }
463}
464
465impl<T> Sub for &TensorVector<T>
466where
467 T: Tensor,
468 {
470 type Output = TensorVector<T>;
471 fn sub(self, _tensor_vec: Self) -> Self::Output {
472 unimplemented!()
473 }
481}
482
483impl<T> SubAssign for TensorVector<T>
484where
485 T: Tensor,
486{
487 fn sub_assign(&mut self, tensor_vec: Self) {
488 self.iter_mut()
489 .zip(tensor_vec)
490 .for_each(|(self_entry, entry)| *self_entry -= entry);
491 }
492}
493
494impl<T> SubAssign<&Self> for TensorVector<T>
495where
496 T: Tensor,
497{
498 fn sub_assign(&mut self, tensor_vec: &Self) {
499 self.iter_mut()
500 .zip(tensor_vec.iter())
501 .for_each(|(self_entry, entry)| *self_entry -= entry);
502 }
503}