Mon, 12 May 2025 17:10:39 -0500
euclidean simplify fail
| 0 | 1 | /*! |
| 5 | 2 | Array containers that support vector space operations on floats. |
| 3 | For working with small vectors in $ℝ^2$ or $ℝ^3$. | |
| 0 | 4 | */ |
| 5 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
6 | use crate::euclidean::*; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
7 | use crate::instance::{BasicDecomposition, Instance}; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
8 | use crate::linops::{Linear, Mapping, AXPY}; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
9 | use crate::mapping::Space; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
10 | use crate::maputil::{map1, map1_mut, map2, map2_mut, FixedLength, FixedLengthMut}; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
11 | use crate::norms::*; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
12 | use crate::types::{Float, Num, SignedNum}; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
13 | use serde::ser::{Serialize, SerializeSeq, Serializer}; |
| 43 | 14 | use std::fmt::{Display, Formatter}; |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
15 | use std::ops::{ |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
16 | Add, AddAssign, Div, DivAssign, Index, IndexMut, Mul, MulAssign, Neg, Sub, SubAssign, |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
17 | }; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
18 | use std::slice::{Iter, IterMut}; |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
19 | |
| 5 | 20 | /// A container type for (short) `N`-dimensional vectors of element type `F`. |
| 21 | /// | |
| 22 | /// Supports basic operations of an [`Euclidean`] space, several [`Norm`]s, and | |
| 23 | /// fused [`AXPY`] operations, among others. | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
24 | #[derive(Copy, Clone, Debug, PartialEq, Eq)] |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
25 | pub struct Loc<const N: usize, F = f64>( |
| 5 | 26 | /// An array of the elements of the vector |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
27 | pub [F; N], |
| 5 | 28 | ); |
| 0 | 29 | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
30 | impl<F: Display, const N: usize> Display for Loc<N, F> { |
| 43 | 31 | // Required method |
| 32 | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
33 | write!(f, "[")?; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
34 | let mut comma = ""; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
35 | for e in self.iter() { |
| 43 | 36 | write!(f, "{comma}{e}")?; |
| 37 | comma = ", "; | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
38 | } |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
39 | write!(f, "]") |
| 43 | 40 | } |
| 41 | } | |
| 42 | ||
| 0 | 43 | // Need to manually implement as [F; N] serialisation is provided only for some N. |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
44 | impl<F, const N: usize> Serialize for Loc<N, F> |
| 0 | 45 | where |
| 46 | F: Serialize, | |
| 47 | { | |
| 48 | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> | |
| 49 | where | |
| 50 | S: Serializer, | |
| 51 | { | |
| 52 | let mut seq = serializer.serialize_seq(Some(N))?; | |
| 53 | for e in self.iter() { | |
| 54 | seq.serialize_element(e)?; | |
| 55 | } | |
| 56 | seq.end() | |
| 57 | } | |
| 58 | } | |
| 59 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
60 | impl<F, const N: usize> Loc<N, F> { |
| 5 | 61 | /// Creates a new `Loc` vector from an array. |
| 0 | 62 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
63 | pub fn new(arr: [F; N]) -> Self { |
| 0 | 64 | Loc(arr) |
| 65 | } | |
| 5 | 66 | |
| 67 | /// Returns an iterator over the elements of the vector | |
| 0 | 68 | #[inline] |
| 69 | pub fn iter(&self) -> Iter<'_, F> { | |
| 70 | self.0.iter() | |
| 71 | } | |
| 72 | ||
| 5 | 73 | /// Returns an iterator over mutable references to the elements of the vector |
| 0 | 74 | #[inline] |
| 75 | pub fn iter_mut(&mut self) -> IterMut<'_, F> { | |
| 76 | self.0.iter_mut() | |
| 77 | } | |
| 78 | } | |
| 79 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
80 | impl<F: Copy, const N: usize> Loc<N, F> { |
| 5 | 81 | /// Maps `g` over the elements of the vector, returning a new [`Loc`] vector |
| 0 | 82 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
83 | pub fn map<H>(&self, g: impl Fn(F) -> H) -> Loc<N, H> { |
| 0 | 84 | Loc::new(map1(self, |u| g(*u))) |
| 85 | } | |
| 86 | ||
| 5 | 87 | /// Maps `g` over pairs of elements of two vectors, retuning a new one. |
| 0 | 88 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
89 | pub fn map2<H>(&self, other: &Self, g: impl Fn(F, F) -> H) -> Loc<N, H> { |
| 0 | 90 | Loc::new(map2(self, other, |u, v| g(*u, *v))) |
| 91 | } | |
| 92 | ||
| 5 | 93 | /// Maps `g` over mutable references to elements of the vector. |
| 0 | 94 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
95 | pub fn map_mut(&mut self, g: impl Fn(&mut F)) { |
| 0 | 96 | map1_mut(self, g) |
| 97 | } | |
| 98 | ||
| 5 | 99 | /// Maps `g` over pairs of mutable references to elements of `self, and elements |
| 100 | /// of `other` vector. | |
| 0 | 101 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
102 | pub fn map2_mut(&mut self, other: &Self, g: impl Fn(&mut F, F)) { |
| 0 | 103 | map2_mut(self, other, |u, v| g(u, *v)) |
| 104 | } | |
| 105 | ||
| 5 | 106 | /// Maps `g` over the elements of `self` and returns the product of the results. |
| 0 | 107 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
108 | pub fn product_map<A: Num>(&self, g: impl Fn(F) -> A) -> A { |
| 0 | 109 | match N { |
| 5 | 110 | 1 => g(unsafe { *self.0.get_unchecked(0) }), |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
111 | 2 => g(unsafe { *self.0.get_unchecked(0) }) * g(unsafe { *self.0.get_unchecked(1) }), |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
112 | 3 => { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
113 | g(unsafe { *self.0.get_unchecked(0) }) |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
114 | * g(unsafe { *self.0.get_unchecked(1) }) |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
115 | * g(unsafe { *self.0.get_unchecked(2) }) |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
116 | } |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
117 | _ => self.iter().fold(A::ONE, |m, &x| m * g(x)), |
| 0 | 118 | } |
| 119 | } | |
| 120 | } | |
| 121 | ||
| 5 | 122 | /// Construct a [`Loc`]. |
| 123 | /// | |
| 124 | /// Use as | |
| 125 | /// ``` | |
| 126 | /// # use alg_tools::loc::Loc; | |
| 127 | /// # use alg_tools::loc; | |
| 128 | /// let x = loc![1.0, 2.0]; | |
| 129 | /// ``` | |
| 0 | 130 | #[macro_export] |
| 131 | macro_rules! loc { | |
| 132 | ($($x:expr),+ $(,)?) => { Loc::new([$($x),+]) } | |
| 133 | } | |
| 134 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
135 | impl<F, const N: usize> From<[F; N]> for Loc<N, F> { |
| 0 | 136 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
137 | fn from(other: [F; N]) -> Loc<N, F> { |
| 0 | 138 | Loc(other) |
| 139 | } | |
| 140 | } | |
| 141 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
142 | /*impl<F : Copy, const N : usize> From<&[F; N]> for Loc<N, F> { |
| 0 | 143 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
144 | fn from(other: &[F; N]) -> Loc<N, F> { |
| 0 | 145 | Loc(*other) |
| 146 | } | |
| 147 | }*/ | |
| 148 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
149 | impl<F> From<F> for Loc<1, F> { |
| 0 | 150 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
151 | fn from(other: F) -> Loc<1, F> { |
| 0 | 152 | Loc([other]) |
| 153 | } | |
| 154 | } | |
| 155 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
156 | impl<F> Loc<1, F> { |
|
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
28
diff
changeset
|
157 | #[inline] |
|
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
28
diff
changeset
|
158 | pub fn flatten1d(self) -> F { |
|
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
28
diff
changeset
|
159 | let Loc([v]) = self; |
|
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
28
diff
changeset
|
160 | v |
|
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
28
diff
changeset
|
161 | } |
|
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
28
diff
changeset
|
162 | } |
|
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
28
diff
changeset
|
163 | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
164 | impl<F, const N: usize> From<Loc<N, F>> for [F; N] { |
| 0 | 165 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
166 | fn from(other: Loc<N, F>) -> [F; N] { |
| 0 | 167 | other.0 |
| 168 | } | |
| 169 | } | |
| 170 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
171 | /*impl<F : Copy, const N : usize> From<&Loc<N, F>> for [F; N] { |
| 0 | 172 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
173 | fn from(other : &Loc<N, F>) -> [F; N] { |
| 0 | 174 | other.0 |
| 175 | } | |
| 176 | }*/ | |
| 177 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
178 | impl<F, const N: usize> IntoIterator for Loc<N, F> { |
| 0 | 179 | type Item = <[F; N] as IntoIterator>::Item; |
| 180 | type IntoIter = <[F; N] as IntoIterator>::IntoIter; | |
| 181 | ||
| 182 | #[inline] | |
| 183 | fn into_iter(self) -> Self::IntoIter { | |
| 184 | self.0.into_iter() | |
| 185 | } | |
| 186 | } | |
| 187 | ||
| 188 | // Indexing | |
| 189 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
190 | impl<F, Ix, const N: usize> Index<Ix> for Loc<N, F> |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
191 | where |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
192 | [F; N]: Index<Ix>, |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
193 | { |
| 0 | 194 | type Output = <[F; N] as Index<Ix>>::Output; |
| 195 | ||
| 196 | #[inline] | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
197 | fn index(&self, ix: Ix) -> &Self::Output { |
| 0 | 198 | self.0.index(ix) |
| 199 | } | |
| 200 | } | |
| 201 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
202 | impl<F, Ix, const N: usize> IndexMut<Ix> for Loc<N, F> |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
203 | where |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
204 | [F; N]: IndexMut<Ix>, |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
205 | { |
| 0 | 206 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
207 | fn index_mut(&mut self, ix: Ix) -> &mut Self::Output { |
| 0 | 208 | self.0.index_mut(ix) |
| 209 | } | |
| 210 | } | |
| 211 | ||
| 212 | // Arithmetic | |
| 213 | ||
| 214 | macro_rules! make_binop { | |
| 215 | ($trait:ident, $fn:ident, $trait_assign:ident, $fn_assign:ident) => { | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
216 | impl<F: Num, const N: usize> $trait<Loc<N, F>> for Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
217 | type Output = Loc<N, F>; |
| 0 | 218 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
219 | fn $fn(mut self, other: Loc<N, F>) -> Self::Output { |
| 0 | 220 | self.$fn_assign(other); |
| 221 | self | |
| 222 | } | |
| 223 | } | |
| 224 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
225 | impl<'a, F: Num, const N: usize> $trait<&'a Loc<N, F>> for Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
226 | type Output = Loc<N, F>; |
| 0 | 227 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
228 | fn $fn(mut self, other: &'a Loc<N, F>) -> Self::Output { |
| 0 | 229 | self.$fn_assign(other); |
| 230 | self | |
| 231 | } | |
| 232 | } | |
| 233 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
234 | impl<'b, F: Num, const N: usize> $trait<Loc<N, F>> for &'b Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
235 | type Output = Loc<N, F>; |
| 0 | 236 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
237 | fn $fn(self, other: Loc<N, F>) -> Self::Output { |
| 0 | 238 | self.map2(&other, |a, b| a.$fn(b)) |
| 239 | } | |
| 240 | } | |
| 241 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
242 | impl<'a, 'b, F: Num, const N: usize> $trait<&'a Loc<N, F>> for &'b Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
243 | type Output = Loc<N, F>; |
| 0 | 244 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
245 | fn $fn(self, other: &'a Loc<N, F>) -> Self::Output { |
| 0 | 246 | self.map2(other, |a, b| a.$fn(b)) |
| 247 | } | |
| 248 | } | |
| 249 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
250 | impl<F: Num, const N: usize> $trait_assign<Loc<N, F>> for Loc<N, F> { |
| 0 | 251 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
252 | fn $fn_assign(&mut self, other: Loc<N, F>) { |
| 0 | 253 | self.map2_mut(&other, |a, b| a.$fn_assign(b)) |
| 254 | } | |
| 255 | } | |
| 256 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
257 | impl<'a, F: Num, const N: usize> $trait_assign<&'a Loc<N, F>> for Loc<N, F> { |
| 0 | 258 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
259 | fn $fn_assign(&mut self, other: &'a Loc<N, F>) { |
| 0 | 260 | self.map2_mut(other, |a, b| a.$fn_assign(b)) |
| 261 | } | |
| 262 | } | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
263 | }; |
| 0 | 264 | } |
| 265 | ||
| 266 | make_binop!(Add, add, AddAssign, add_assign); | |
| 267 | make_binop!(Sub, sub, SubAssign, sub_assign); | |
| 268 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
269 | impl<F: Float, const N: usize> std::iter::Sum for Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
270 | fn sum<I: Iterator<Item = Loc<N, F>>>(mut iter: I) -> Self { |
|
28
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
271 | match iter.next() { |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
272 | None => Self::ORIGIN, |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
273 | Some(mut v) => { |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
274 | for w in iter { |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
275 | v += w |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
276 | } |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
277 | v |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
278 | } |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
279 | } |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
280 | } |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
281 | } |
|
331345346e7b
Implement std::iter::Sum for Loc<F, N>
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
282 | |
| 0 | 283 | macro_rules! make_scalarop_rhs { |
| 284 | ($trait:ident, $fn:ident, $trait_assign:ident, $fn_assign:ident) => { | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
285 | impl<F: Num, const N: usize> $trait<F> for Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
286 | type Output = Loc<N, F>; |
| 0 | 287 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
288 | fn $fn(self, b: F) -> Self::Output { |
| 0 | 289 | self.map(|a| a.$fn(b)) |
| 290 | } | |
| 291 | } | |
| 292 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
293 | impl<'a, F: Num, const N: usize> $trait<&'a F> for Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
294 | type Output = Loc<N, F>; |
| 0 | 295 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
296 | fn $fn(self, b: &'a F) -> Self::Output { |
| 0 | 297 | self.map(|a| a.$fn(*b)) |
| 298 | } | |
| 299 | } | |
| 300 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
301 | impl<'b, F: Num, const N: usize> $trait<F> for &'b Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
302 | type Output = Loc<N, F>; |
| 0 | 303 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
304 | fn $fn(self, b: F) -> Self::Output { |
| 0 | 305 | self.map(|a| a.$fn(b)) |
| 306 | } | |
| 307 | } | |
| 308 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
309 | impl<'a, 'b, F: Float, const N: usize> $trait<&'a F> for &'b Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
310 | type Output = Loc<N, F>; |
| 0 | 311 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
312 | fn $fn(self, b: &'a F) -> Self::Output { |
| 0 | 313 | self.map(|a| a.$fn(*b)) |
| 314 | } | |
| 315 | } | |
| 316 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
317 | impl<F: Num, const N: usize> $trait_assign<F> for Loc<N, F> { |
| 0 | 318 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
319 | fn $fn_assign(&mut self, b: F) { |
| 0 | 320 | self.map_mut(|a| a.$fn_assign(b)); |
| 321 | } | |
| 322 | } | |
| 323 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
324 | impl<'a, F: Num, const N: usize> $trait_assign<&'a F> for Loc<N, F> { |
| 0 | 325 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
326 | fn $fn_assign(&mut self, b: &'a F) { |
| 0 | 327 | self.map_mut(|a| a.$fn_assign(*b)); |
| 328 | } | |
| 329 | } | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
330 | }; |
| 0 | 331 | } |
| 332 | ||
| 333 | make_scalarop_rhs!(Mul, mul, MulAssign, mul_assign); | |
| 334 | make_scalarop_rhs!(Div, div, DivAssign, div_assign); | |
| 335 | ||
| 336 | macro_rules! make_unaryop { | |
| 337 | ($trait:ident, $fn:ident) => { | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
338 | impl<F: SignedNum, const N: usize> $trait for Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
339 | type Output = Loc<N, F>; |
| 0 | 340 | #[inline] |
| 341 | fn $fn(mut self) -> Self::Output { | |
| 342 | self.map_mut(|a| *a = (*a).$fn()); | |
| 343 | self | |
| 344 | } | |
| 345 | } | |
| 346 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
347 | impl<'a, F: SignedNum, const N: usize> $trait for &'a Loc<N, F> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
348 | type Output = Loc<N, F>; |
| 0 | 349 | #[inline] |
| 350 | fn $fn(self) -> Self::Output { | |
| 351 | self.map(|a| a.$fn()) | |
| 352 | } | |
| 353 | } | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
354 | }; |
| 0 | 355 | } |
| 356 | ||
| 357 | make_unaryop!(Neg, neg); | |
| 358 | ||
| 359 | macro_rules! make_scalarop_lhs { | |
| 360 | ($trait:ident, $fn:ident; $($f:ident)+) => { $( | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
361 | impl<const N : usize> $trait<Loc<N, $f>> for $f { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
362 | type Output = Loc<N, $f>; |
| 0 | 363 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
364 | fn $fn(self, v : Loc<N, $f>) -> Self::Output { |
| 0 | 365 | v.map(|b| self.$fn(b)) |
| 366 | } | |
| 367 | } | |
| 368 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
369 | impl<'a, const N : usize> $trait<&'a Loc<N, $f>> for $f { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
370 | type Output = Loc<N, $f>; |
| 0 | 371 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
372 | fn $fn(self, v : &'a Loc<N, $f>) -> Self::Output { |
| 0 | 373 | v.map(|b| self.$fn(b)) |
| 374 | } | |
| 375 | } | |
| 376 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
377 | impl<'b, const N : usize> $trait<Loc<N, $f>> for &'b $f { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
378 | type Output = Loc<N, $f>; |
| 0 | 379 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
380 | fn $fn(self, v : Loc<N, $f>) -> Self::Output { |
| 0 | 381 | v.map(|b| self.$fn(b)) |
| 382 | } | |
| 383 | } | |
| 384 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
385 | impl<'a, 'b, const N : usize> $trait<&'a Loc<N, $f>> for &'b $f { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
386 | type Output = Loc<N, $f>; |
| 0 | 387 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
388 | fn $fn(self, v : &'a Loc<N, $f>) -> Self::Output { |
| 0 | 389 | v.map(|b| self.$fn(b)) |
| 390 | } | |
| 391 | } | |
| 392 | )+ } | |
| 393 | } | |
| 394 | ||
| 395 | make_scalarop_lhs!(Mul, mul; f32 f64 i8 i16 i32 i64 isize u8 u16 u32 u64 usize); | |
| 396 | make_scalarop_lhs!(Div, div; f32 f64 i8 i16 i32 i64 isize u8 u16 u32 u64 usize); | |
| 397 | ||
| 398 | // Norms | |
| 399 | ||
| 400 | macro_rules! domination { | |
| 401 | ($norm:ident, $dominates:ident) => { | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
402 | impl<F: Float, const N: usize> Dominated<F, $dominates, Loc<N, F>> for $norm { |
| 0 | 403 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
404 | fn norm_factor(&self, _p: $dominates) -> F { |
| 0 | 405 | F::ONE |
| 406 | } | |
| 407 | #[inline] | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
408 | fn from_norm(&self, p_norm: F, _p: $dominates) -> F { |
| 0 | 409 | p_norm |
| 410 | } | |
| 411 | } | |
| 412 | }; | |
| 413 | ($norm:ident, $dominates:ident, $fn:path) => { | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
414 | impl<F: Float, const N: usize> Dominated<F, $dominates, Loc<N, F>> for $norm { |
| 0 | 415 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
416 | fn norm_factor(&self, _p: $dominates) -> F { |
| 0 | 417 | $fn(F::cast_from(N)) |
| 418 | } | |
| 419 | } | |
| 420 | }; | |
| 421 | } | |
| 422 | ||
| 423 | domination!(L1, L1); | |
| 424 | domination!(L2, L2); | |
| 425 | domination!(Linfinity, Linfinity); | |
| 426 | ||
| 427 | domination!(L1, L2, F::sqrt); | |
| 428 | domination!(L2, Linfinity, F::sqrt); | |
| 429 | domination!(L1, Linfinity, std::convert::identity); | |
| 430 | ||
| 431 | domination!(Linfinity, L1); | |
| 432 | domination!(Linfinity, L2); | |
| 433 | domination!(L2, L1); | |
| 434 | ||
| 131 | 435 | impl<F: Float, const N: usize> Euclidean for Loc<N, F> { |
| 0 | 436 | /// This implementation is not stabilised as it's meant to be used for very small vectors. |
| 437 | /// Use [`nalgebra`] for larger vectors. | |
| 438 | #[inline] | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
439 | fn dot<I: Instance<Self>>(&self, other: I) -> F { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
440 | self.0 |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
441 | .iter() |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
442 | .zip(other.ref_instance().0.iter()) |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
443 | .fold(F::ZERO, |m, (&v, &w)| m + v * w) |
| 0 | 444 | } |
| 445 | ||
| 446 | /// This implementation is not stabilised as it's meant to be used for very small vectors. | |
| 447 | /// Use [`nalgebra`] for larger vectors. | |
| 448 | #[inline] | |
| 449 | fn norm2_squared(&self) -> F { | |
| 450 | self.iter().fold(F::ZERO, |m, &v| m + v * v) | |
| 451 | } | |
| 452 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
453 | fn dist2_squared<I: Instance<Self>>(&self, other: I) -> F { |
| 0 | 454 | self.iter() |
|
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
455 | .zip(other.ref_instance().iter()) |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
456 | .fold(F::ZERO, |m, (&v, &w)| { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
457 | let d = v - w; |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
458 | m + d * d |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
459 | }) |
| 0 | 460 | } |
| 461 | ||
| 462 | #[inline] | |
| 463 | fn norm2(&self) -> F { | |
| 464 | // Optimisation for N==1 that avoids squaring and square rooting. | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
465 | if N == 1 { |
| 0 | 466 | unsafe { self.0.get_unchecked(0) }.abs() |
| 467 | } else { | |
| 468 | self.norm2_squared().sqrt() | |
| 469 | } | |
| 470 | } | |
| 471 | ||
| 472 | #[inline] | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
473 | fn dist2<I: Instance<Self>>(&self, other: I) -> F { |
| 0 | 474 | // Optimisation for N==1 that avoids squaring and square rooting. |
|
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
475 | let otherr = other.ref_instance(); |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
476 | if N == 1 { |
|
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
477 | unsafe { *self.0.get_unchecked(0) - *otherr.0.get_unchecked(0) }.abs() |
| 0 | 478 | } else { |
| 479 | self.dist2_squared(other).sqrt() | |
| 480 | } | |
| 481 | } | |
| 482 | } | |
| 483 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
484 | impl<F: Num, const N: usize> Loc<N, F> { |
| 52 | 485 | /// Origin point |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
486 | pub const ORIGIN: Self = Loc([F::ZERO; N]); |
| 0 | 487 | } |
| 488 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
489 | impl<F: Num + std::ops::Neg<Output = F>, const N: usize> Loc<N, F> { |
| 52 | 490 | /// Reflects along the given coordinate |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
491 | pub fn reflect(mut self, i: usize) -> Self { |
| 52 | 492 | self[i] = -self[i]; |
| 493 | self | |
| 494 | } | |
| 495 | ||
| 496 | /// Reflects along the given coordinate sequences | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
497 | pub fn reflect_many<I: IntoIterator<Item = usize>>(mut self, idxs: I) -> Self { |
| 52 | 498 | for i in idxs { |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
499 | self[i] = -self[i] |
| 52 | 500 | } |
| 501 | self | |
| 502 | } | |
| 503 | } | |
| 504 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
505 | impl<F: std::ops::Neg<Output = F>> Loc<2, F> { |
| 52 | 506 | /// Reflect x coordinate |
| 507 | pub fn reflect_x(self) -> Self { | |
| 508 | let Loc([x, y]) = self; | |
| 509 | [-x, y].into() | |
| 510 | } | |
| 511 | ||
| 512 | /// Reflect y coordinate | |
| 513 | pub fn reflect_y(self) -> Self { | |
| 514 | let Loc([x, y]) = self; | |
| 515 | [x, -y].into() | |
| 516 | } | |
| 517 | } | |
| 518 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
519 | impl<F: Float> Loc<2, F> { |
| 52 | 520 | /// Rotate by angle φ |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
521 | pub fn rotate(self, φ: F) -> Self { |
| 52 | 522 | let Loc([x, y]) = self; |
| 523 | let sin_φ = φ.sin(); | |
| 524 | let cos_φ = φ.cos(); | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
525 | [cos_φ * x - sin_φ * y, sin_φ * x + cos_φ * y].into() |
| 52 | 526 | } |
| 527 | } | |
| 528 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
529 | impl<F: std::ops::Neg<Output = F>> Loc<3, F> { |
| 52 | 530 | /// Reflect x coordinate |
| 531 | pub fn reflect_x(self) -> Self { | |
| 532 | let Loc([x, y, z]) = self; | |
| 533 | [-x, y, z].into() | |
| 534 | } | |
| 535 | ||
| 536 | /// Reflect y coordinate | |
| 537 | pub fn reflect_y(self) -> Self { | |
| 538 | let Loc([x, y, z]) = self; | |
| 539 | [x, -y, z].into() | |
| 540 | } | |
| 541 | ||
| 542 | /// Reflect y coordinate | |
| 543 | pub fn reflect_z(self) -> Self { | |
| 544 | let Loc([x, y, z]) = self; | |
| 545 | [x, y, -z].into() | |
| 546 | } | |
| 547 | } | |
| 548 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
549 | impl<F: Float> Loc<3, F> { |
| 52 | 550 | /// Rotate by angles (yaw, pitch, roll) |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
551 | pub fn rotate(self, Loc([φ, ψ, θ]): Self) -> Self { |
| 52 | 552 | let Loc([mut x, mut y, mut z]) = self; |
| 553 | let sin_φ = φ.sin(); | |
| 554 | let cos_φ = φ.cos(); | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
555 | [x, y, z] = [cos_φ * x - sin_φ * y, sin_φ * x + cos_φ * y, z]; |
| 52 | 556 | let sin_ψ = ψ.sin(); |
| 557 | let cos_ψ = ψ.cos(); | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
558 | [x, y, z] = [cos_ψ * x + sin_ψ * z, y, -sin_ψ * x + cos_ψ * z]; |
| 52 | 559 | let sin_θ = θ.sin(); |
| 560 | let cos_θ = θ.cos(); | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
561 | [x, y, z] = [x, cos_θ * y - sin_θ * z, sin_θ * y + cos_θ * z]; |
| 52 | 562 | [x, y, z].into() |
| 563 | } | |
| 564 | } | |
| 565 | ||
| 131 | 566 | impl<F: Float, const N: usize> StaticEuclidean for Loc<N, F> { |
| 0 | 567 | #[inline] |
| 568 | fn origin() -> Self { | |
| 569 | Self::ORIGIN | |
| 570 | } | |
| 571 | } | |
| 572 | ||
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
573 | /// The default norm for `Loc` is [`L2`]. |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
574 | impl<F: Float, const N: usize> Normed<F> for Loc<N, F> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
575 | type NormExp = L2; |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
576 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
577 | #[inline] |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
578 | fn norm_exponent(&self) -> Self::NormExp { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
579 | L2 |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
580 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
581 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
582 | // #[inline] |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
583 | // fn similar_origin(&self) -> Self { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
584 | // [F::ZERO; N].into() |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
585 | // } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
586 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
587 | #[inline] |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
588 | fn is_zero(&self) -> bool { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
589 | self.norm2_squared() == F::ZERO |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
590 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
591 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
592 | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
593 | impl<F: Float, const N: usize> HasDual<F> for Loc<N, F> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
594 | type DualSpace = Self; |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
595 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
596 | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
597 | impl<F: Float, const N: usize> Norm<L2, F> for Loc<N, F> { |
| 0 | 598 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
599 | fn norm(&self, _: L2) -> F { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
600 | self.norm2() |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
601 | } |
| 0 | 602 | } |
| 603 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
604 | impl<F: Float, const N: usize> Dist<F, L2> for Loc<N, F> { |
| 0 | 605 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
606 | fn dist<I: Instance<Self>>(&self, other: I, _: L2) -> F { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
607 | self.dist2(other) |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
608 | } |
| 0 | 609 | } |
| 610 | ||
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
611 | /* Implemented automatically as Euclidean. |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
612 | impl<F : Float, const N : usize> Projection<F, L2> for Loc<N, F> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
613 | #[inline] |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
614 | fn proj_ball_mut(&mut self, ρ : F, nrm : L2) { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
615 | let n = self.norm(nrm); |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
616 | if n > ρ { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
617 | *self *= ρ/n; |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
618 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
619 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
620 | }*/ |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
621 | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
622 | impl<F: Float, const N: usize> Norm<L1, F> for Loc<N, F> { |
| 0 | 623 | /// This implementation is not stabilised as it's meant to be used for very small vectors. |
| 624 | /// Use [`nalgebra`] for larger vectors. | |
| 625 | #[inline] | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
626 | fn norm(&self, _: L1) -> F { |
| 0 | 627 | self.iter().fold(F::ZERO, |m, v| m + v.abs()) |
| 628 | } | |
| 629 | } | |
| 630 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
631 | impl<F: Float, const N: usize> Dist<F, L1> for Loc<N, F> { |
| 0 | 632 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
633 | fn dist<I: Instance<Self>>(&self, other: I, _: L1) -> F { |
| 0 | 634 | self.iter() |
|
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
635 | .zip(other.ref_instance().iter()) |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
636 | .fold(F::ZERO, |m, (&v, &w)| m + (v - w).abs()) |
| 0 | 637 | } |
| 638 | } | |
| 639 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
640 | impl<F: Float, const N: usize> Projection<F, Linfinity> for Loc<N, F> { |
| 0 | 641 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
642 | fn proj_ball_mut(&mut self, ρ: F, _: Linfinity) { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
643 | self.iter_mut() |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
644 | .for_each(|v| *v = num_traits::clamp(*v, -ρ, ρ)) |
| 0 | 645 | } |
| 646 | } | |
| 647 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
648 | impl<F: Float, const N: usize> Norm<Linfinity, F> for Loc<N, F> { |
| 0 | 649 | /// This implementation is not stabilised as it's meant to be used for very small vectors. |
| 650 | /// Use [`nalgebra`] for larger vectors. | |
| 651 | #[inline] | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
652 | fn norm(&self, _: Linfinity) -> F { |
| 0 | 653 | self.iter().fold(F::ZERO, |m, v| m.max(v.abs())) |
| 654 | } | |
| 655 | } | |
| 656 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
657 | impl<F: Float, const N: usize> Dist<F, Linfinity> for Loc<N, F> { |
| 0 | 658 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
659 | fn dist<I: Instance<Self>>(&self, other: I, _: Linfinity) -> F { |
| 0 | 660 | self.iter() |
|
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
661 | .zip(other.ref_instance().iter()) |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
662 | .fold(F::ZERO, |m, (&v, &w)| m.max((v - w).abs())) |
| 0 | 663 | } |
| 664 | } | |
| 665 | ||
| 666 | // Misc. | |
| 667 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
668 | impl<A, const N: usize> FixedLength<N> for Loc<N, A> { |
| 0 | 669 | type Iter = std::array::IntoIter<A, N>; |
| 670 | type Elem = A; | |
| 671 | #[inline] | |
| 672 | fn fl_iter(self) -> Self::Iter { | |
| 673 | self.into_iter() | |
| 674 | } | |
| 675 | } | |
| 676 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
677 | impl<A, const N: usize> FixedLengthMut<N> for Loc<N, A> { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
678 | type IterMut<'a> |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
679 | = std::slice::IterMut<'a, A> |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
680 | where |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
681 | A: 'a; |
| 0 | 682 | #[inline] |
| 683 | fn fl_iter_mut(&mut self) -> Self::IterMut<'_> { | |
| 684 | self.iter_mut() | |
| 685 | } | |
| 686 | } | |
| 687 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
688 | impl<'a, A, const N: usize> FixedLength<N> for &'a Loc<N, A> { |
| 0 | 689 | type Iter = std::slice::Iter<'a, A>; |
| 690 | type Elem = &'a A; | |
| 691 | #[inline] | |
| 692 | fn fl_iter(self) -> Self::Iter { | |
| 693 | self.iter() | |
| 694 | } | |
| 695 | } | |
| 696 | ||
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
697 | impl<F: Num, const N: usize> Space for Loc<N, F> { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
698 | type Decomp = BasicDecomposition; |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
699 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
700 | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
701 | impl<F: Float, const N: usize> Mapping<Loc<N, F>> for Loc<N, F> { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
702 | type Codomain = F; |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
703 | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
704 | fn apply<I: Instance<Loc<N, F>>>(&self, x: I) -> Self::Codomain { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
705 | x.eval(|x̃| self.dot(x̃)) |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
706 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
707 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
708 | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
709 | impl<F: Float, const N: usize> Linear<Loc<N, F>> for Loc<N, F> {} |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
710 | |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
711 | impl<F: Float, const N: usize> AXPY<Loc<N, F>> for Loc<N, F> { |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
712 | type Field = F; |
|
62
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
713 | type Owned = Self; |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
714 | |
| 0 | 715 | #[inline] |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
716 | fn axpy<I: Instance<Loc<N, F>>>(&mut self, α: F, x: I, β: F) { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
717 | x.eval(|x̃| { |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
718 | if β == F::ZERO { |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
719 | map2_mut(self, x̃, |yi, xi| *yi = α * (*xi)) |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
720 | } else { |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
721 | map2_mut(self, x̃, |yi, xi| *yi = β * (*yi) + α * (*xi)) |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
722 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
52
diff
changeset
|
723 | }) |
| 0 | 724 | } |
| 725 | ||
| 726 | #[inline] | |
|
124
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
727 | fn copy_from<I: Instance<Loc<N, F>>>(&mut self, x: I) { |
|
6aa955ad8122
Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents:
64
diff
changeset
|
728 | x.eval(|x̃| map2_mut(self, x̃, |yi, xi| *yi = *xi)) |
| 0 | 729 | } |
|
62
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
730 | |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
731 | // #[inline] |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
732 | // fn make_origin_generator(&self) -> StaticEuclideanOriginGenerator { |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
733 | // StaticEuclideanOriginGenerator |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
734 | // } |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
735 | |
|
62
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
736 | #[inline] |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
737 | fn similar_origin(&self) -> Self::Owned { |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
738 | Self::ORIGIN |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
739 | } |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
740 | |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
741 | #[inline] |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
742 | fn similar_origin_inst<I: Instance<Self>>(_: I) -> Self::Owned { |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
743 | Self::ORIGIN |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
744 | } |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
745 | |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
746 | #[inline] |
|
62
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
747 | fn set_zero(&mut self) { |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
748 | *self = Self::ORIGIN; |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
749 | } |
| 0 | 750 | } |