Tue, 31 Dec 2024 09:12:43 -0500
Try to have Field as member type in Mappings etc.
5 | 1 | /*! |
2 | Traits for mathematical functions. | |
3 | */ | |
0 | 4 | |
5 | use std::marker::PhantomData; | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
6 | use crate::types::{Float, HasRealField, HasScalarField}; |
0 | 7 | use serde::Serialize; |
8 | use crate::loc::Loc; | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
9 | use std::borrow::Cow; |
0 | 10 | |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
11 | /// Trait for application of `Self` as a mathematical function or operator on `X`. |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
12 | pub trait Apply<X> { |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
13 | type Output; |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
14 | |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
15 | /// Compute the value of `self` at `x`. |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
16 | fn apply(&self, x : X) -> Self::Output; |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
17 | } |
0 | 18 | |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
19 | /// This blanket implementation is a workaround helper to Rust trait system limitations. |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
20 | /// |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
21 | /// It is introduced because the trait system does not allow blanket implementations of both |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
22 | /// [`Apply<X>`] and [`Apply<&'a X>`]. With this, the latter is implemented automatically for |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
23 | /// the reference, which can be sufficient to apply the operation in another blanket implementation. |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
24 | impl<'a, T, X> Apply<X> for &'a T where T : Apply<X> { |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
25 | type Output = <T as Apply<X>>::Output; |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
26 | |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
27 | #[inline] |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
28 | fn apply(&self, x : X) -> Self::Output { |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
29 | (*self).apply(x) |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
30 | } |
0 | 31 | } |
32 | ||
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
33 | /// A mapping from `Domain` to `Codomain`. |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
34 | /// |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
35 | /// This is automatically implemented when the relevant [`Apply`] are implemented. |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
36 | pub trait Mapping<Domain> : Apply<Domain, Output=Self::Codomain> |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
37 | + for<'a> Apply<&'a Domain, Output=Self::Codomain> { |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
38 | type Codomain; |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
39 | } |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
40 | |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
41 | impl<Domain, Codomain, T> Mapping<Domain> for T |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
42 | where T : Apply<Domain, Output=Codomain> + for<'a> Apply<&'a Domain, Output=Codomain> { |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
43 | type Codomain = Codomain; |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
44 | } |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
45 | |
36
6a4b44b2cdf2
Add DifferentiableRealMapping shorthand
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
46 | /// Automatically implemented shorthand for referring to [`Mapping`]s from [`Loc<F, N>`] to `F`. |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
47 | pub trait RealMapping<F : Float, const N : usize> |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
48 | : Mapping<Loc<F, N>, Codomain = F> + HasRealField<RealField = F> {} |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
49 | |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
50 | impl<F : Float, T, const N : usize> RealMapping<F, N> for T |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
51 | where T : Mapping<Loc<F, N>, Codomain = F> + HasRealField<RealField = F> {} |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
52 | |
36
6a4b44b2cdf2
Add DifferentiableRealMapping shorthand
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
53 | /// Automatically implemented shorthand for referring to differentiable [`Mapping`]s from |
6a4b44b2cdf2
Add DifferentiableRealMapping shorthand
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
54 | /// [`Loc<F, N>`] to `F`. |
6a4b44b2cdf2
Add DifferentiableRealMapping shorthand
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
55 | pub trait DifferentiableRealMapping<F : Float, const N : usize> |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
56 | : DifferentiableMapping<Loc<F, N>, Codomain = F, DerivativeDomain=Loc<F, N>> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
57 | + RealMapping<F, N> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
58 | + HasRealField<RealField=F> {} |
36
6a4b44b2cdf2
Add DifferentiableRealMapping shorthand
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
59 | |
6a4b44b2cdf2
Add DifferentiableRealMapping shorthand
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
60 | impl<F : Float, T, const N : usize> DifferentiableRealMapping<F, N> for T |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
61 | where T : DifferentiableMapping<Loc<F, N>, Codomain = F, DerivativeDomain=Loc<F, N>> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
62 | + RealMapping<F, N> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
63 | + HasRealField<RealField=F> {} |
36
6a4b44b2cdf2
Add DifferentiableRealMapping shorthand
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
64 | |
6a4b44b2cdf2
Add DifferentiableRealMapping shorthand
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
65 | |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
66 | /// A helper trait alias for referring to [`Mapping`]s from [`Loc<F, N>`] to [`Loc<F, M>`]. |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
67 | pub trait RealVectorField<F : Float, const N : usize, const M : usize> |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
68 | : Mapping<Loc<F, N>, Codomain = Loc<F, M>> + HasRealField<RealField=F> {} |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
69 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
70 | impl<F : Float, T, const N : usize, const M : usize> RealVectorField<F, N, M> for T |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
71 | where T : Mapping<Loc<F, N>, Codomain = Loc<F, M>> + HasRealField<RealField=F> {} |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
72 | |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
73 | |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
74 | /// Trait for calculation the differential of `Self` as a mathematical function on `X`. |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
75 | pub trait Differentiable<X> : Sized + HasRealField { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
76 | type Derivative : HasRealField<RealField = Self::RealField>; |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
77 | |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
78 | /// Compute the differential of `self` at `x`. |
47
a0db98c16ab5
Some Differentiable simplifications and clarifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
44
diff
changeset
|
79 | fn differential(&self, x : X) -> Self::Derivative; |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
80 | } |
0 | 81 | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
82 | // impl<'g, X, G : Differentiable<X>> Differentiable<X> for &'g G { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
83 | // type Derivative = G::Derivative; |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
84 | // #[inline] |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
85 | // fn differential(&self, x : X) -> Self::Derivative { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
86 | // (*self).differential(x) |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
87 | // } |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
88 | // } |
49 | 89 | |
5 | 90 | /// A differentiable mapping from `Domain` to [`Mapping::Codomain`], with differentials |
91 | /// `Differential`. | |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
92 | /// |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
93 | /// This is automatically implemented when the relevant [`Differentiate`] are implemented. |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
94 | pub trait DifferentiableMapping<Domain> |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
95 | : Mapping<Domain> |
48 | 96 | + Differentiable<Domain, Derivative=Self::DerivativeDomain> |
97 | + for<'a> Differentiable<&'a Domain, Derivative=Self::DerivativeDomain> { | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
98 | type DerivativeDomain : HasRealField<RealField=Self::RealField>; |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
99 | type Differential<'b> : Mapping<Domain, Codomain=Self::DerivativeDomain> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
100 | + HasRealField<RealField=Self::RealField> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
101 | + Clone where Self : 'b; |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
102 | |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
103 | /// Form the differential mapping of `self`. |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
104 | fn diff(self) -> Self::Differential<'static>; |
48 | 105 | /// Form the differential mapping of `self`. |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
106 | fn diff_ref(&self) -> Self::Differential<'_>; |
48 | 107 | } |
108 | ||
109 | ||
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
110 | impl<Domain : Clone, Derivative, T> DifferentiableMapping<Domain> for T |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
111 | where T : Mapping<Domain> + Clone |
48 | 112 | + Differentiable<Domain, Derivative=Derivative> |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
113 | + for<'a> Differentiable<&'a Domain, Derivative=Derivative>, |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
114 | Derivative : HasRealField<RealField = T::RealField> { |
48 | 115 | type DerivativeDomain = Derivative; |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
116 | type Differential<'b> = Differential<'b, Domain, Self> where Self : 'b + Clone; |
48 | 117 | |
118 | /// Form the differential mapping of `self`. | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
119 | fn diff(self) -> Self::Differential<'static> { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
120 | Differential{ g : Cow::Owned(self), _space : PhantomData } |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
121 | } |
44 | 122 | |
123 | /// Form the differential mapping of `self`. | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
124 | fn diff_ref(&self) -> Self::Differential<'_> { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
125 | Differential{ g : Cow::Borrowed(self), _space : PhantomData } |
44 | 126 | } |
0 | 127 | } |
128 | ||
5 | 129 | /// A sum of [`Mapping`]s. |
0 | 130 | #[derive(Serialize, Debug, Clone)] |
131 | pub struct Sum<Domain, M : Mapping<Domain>> { | |
132 | components : Vec<M>, | |
133 | _domain : PhantomData<Domain>, | |
134 | } | |
135 | ||
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
136 | impl<Domain, M : Mapping<Domain> + HasScalarField> HasScalarField for Sum<Domain, M> { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
137 | type Field = M::Field; |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
138 | } |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
139 | |
5 | 140 | impl<Domain, M : Mapping<Domain>> Sum<Domain, M> { |
141 | /// Construct from an iterator. | |
142 | pub fn new<I : Iterator<Item = M>>(iter : I) -> Self { | |
143 | Sum { components : iter.collect(), _domain : PhantomData } | |
144 | } | |
39 | 145 | |
146 | /// Iterate over the component functions of the sum | |
147 | pub fn iter(&self) -> std::slice::Iter<'_, M> { | |
148 | self.components.iter() | |
149 | } | |
5 | 150 | } |
151 | ||
152 | ||
42
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
153 | impl<Domain, M> Apply<Domain> for Sum<Domain, M> |
0 | 154 | where M : Mapping<Domain>, |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
155 | M::Codomain : std::iter::Sum { |
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
156 | type Output = M::Codomain; |
0 | 157 | |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
158 | fn apply(&self, x : Domain) -> Self::Output { |
42
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
159 | self.components.iter().map(|c| c.apply(&x)).sum() |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
160 | } |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
161 | } |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
162 | |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
163 | impl<'a, Domain, M> Apply<&'a Domain> for Sum<Domain, M> |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
164 | where M : Mapping<Domain>, |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
165 | M::Codomain : std::iter::Sum { |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
166 | type Output = M::Codomain; |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
167 | |
b4d369698556
Sum Apply implementation improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
39
diff
changeset
|
168 | fn apply(&self, x : &'a Domain) -> Self::Output { |
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
169 | self.components.iter().map(|c| c.apply(x)).sum() |
0 | 170 | } |
171 | } | |
172 | ||
29
7fd0984743b5
Rename Differentiate → Differentiable
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
173 | impl<Domain, M> Differentiable<Domain> for Sum<Domain, M> |
0 | 174 | where M : DifferentiableMapping<Domain>, |
175 | M :: Codomain : std::iter::Sum, | |
48 | 176 | M :: DerivativeDomain : std::iter::Sum, |
0 | 177 | Domain : Copy { |
178 | ||
48 | 179 | type Derivative = M::DerivativeDomain; |
0 | 180 | |
47
a0db98c16ab5
Some Differentiable simplifications and clarifications
Tuomo Valkonen <tuomov@iki.fi>
parents:
44
diff
changeset
|
181 | fn differential(&self, x : Domain) -> Self::Derivative { |
0 | 182 | self.components.iter().map(|c| c.differential(x)).sum() |
183 | } | |
184 | } | |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
185 | |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
186 | /// Container for the differential [`Mapping`] of a [`Differentiable`] mapping. |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
187 | #[derive(Clone, Debug)] |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
188 | pub struct Differential<'a, X, G : 'a + DifferentiableMapping<X> + Clone> { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
189 | g : Cow<'a, G>, |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
190 | _space : PhantomData<X> |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
191 | } |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
192 | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
193 | impl<'a, X, G : DifferentiableMapping<X> + Clone> Differential<'a, X, G> { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
194 | pub fn base_fn(&'a self) -> &'a G { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
195 | &*self.g |
49 | 196 | } |
197 | } | |
198 | ||
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
199 | |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
200 | impl<'a, X, G> HasScalarField for Differential<'a, X, G> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
201 | where G : 'a + DifferentiableMapping<X> + HasScalarField + Clone { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
202 | type Field = G::Field; |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
203 | } |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
204 | |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
205 | impl<'b, X, G : DifferentiableMapping<X> + Clone> Apply<X> for Differential<'b, X, G> { |
48 | 206 | type Output = G::DerivativeDomain; |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
207 | |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
208 | #[inline] |
48 | 209 | fn apply(&self, x : X) -> Self::Output { |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
210 | self.g.differential(x) |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
211 | } |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
212 | } |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
213 | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
214 | impl<'a, 'b, X, G : 'b + DifferentiableMapping<X> + Clone> Apply<&'a X> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
215 | for Differential<'b, X, G> { |
48 | 216 | type Output = G::DerivativeDomain; |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
217 | |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
218 | #[inline] |
48 | 219 | fn apply(&self, x : &'a X) -> Self::Output { |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
220 | self.g.differential(x) |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
221 | } |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
222 | } |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
223 | |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
224 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
225 | /// Container for flattening [`Loc`]`<F, 1>` codomain of a [`Mapping`] to `F`. |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
226 | pub struct FlattenedCodomain<X, F, G : Mapping<X, Codomain=Loc<F, 1>>> { |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
227 | g : G, |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
228 | _phantoms : PhantomData<(X, F)> |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
229 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
230 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
231 | impl<X, F, G : Mapping<X, Codomain=Loc<F, 1>>> Apply<X> for FlattenedCodomain<X, F, G> { |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
232 | type Output = F; |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
233 | |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
234 | #[inline] |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
235 | fn apply(&self, x : X) -> Self::Output { |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
236 | self.g.apply(x).flatten1d() |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
237 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
238 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
239 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
240 | /// An auto-trait for constructing a [`FlattenCodomain`] structure for |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
241 | /// flattening the codomain of a [`Mapping`] from [`Loc`]`<F, 1>` to `F`. |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
242 | pub trait FlattenCodomain<X, F> : Mapping<X, Codomain=Loc<F, 1>> + Sized { |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
243 | /// Flatten the codomain from [`Loc`]`<F, 1>` to `F`. |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
244 | fn flatten_codomain(self) -> FlattenedCodomain<X, F, Self> { |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
245 | FlattenedCodomain{ g : self, _phantoms : PhantomData } |
34
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
246 | } |
3dbc04100b09
Add Differential struct and DifferentiableMapping.diff
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
247 | } |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
248 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
249 | impl<X, F, G : Sized + Mapping<X, Codomain=Loc<F, 1>>> FlattenCodomain<X, F> for G {} |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
250 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
251 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
252 | /// Container for dimensional slicing [`Loc`]`<F, N>` codomain of a [`Mapping`] to `F`. |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
253 | pub struct SlicedCodomain< |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
254 | 'a, X, F, |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
255 | G : Mapping<X, Codomain=Loc<F, N>> + Clone, |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
256 | const N : usize |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
257 | > { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
258 | g : Cow<'a, G>, |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
259 | slice : usize, |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
260 | _phantoms : PhantomData<(X, F)> |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
261 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
262 | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
263 | impl<'a, X, F, G, const N : usize> HasScalarField for SlicedCodomain<'a, X, F, G, N> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
264 | where G : HasScalarField + Mapping<X, Codomain=Loc<F, N>> + Clone { |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
265 | type Field = G::Field; |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
266 | } |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
267 | |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
268 | impl<'a, X, F : Copy, G : Mapping<X, Codomain=Loc<F, N>> + Clone, const N : usize> Apply<X> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
269 | for SlicedCodomain<'a, X, F, G, N> { |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
270 | type Output = F; |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
271 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
272 | #[inline] |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
273 | fn apply(&self, x : X) -> Self::Output { |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
274 | let tmp : [F; N] = self.g.apply(x).into(); |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
275 | // Safety: `slice_codomain` below checks the range. |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
276 | unsafe { *tmp.get_unchecked(self.slice) } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
277 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
278 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
279 | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
280 | impl<'a, 'b, X, F : Copy, G : Mapping<X, Codomain=Loc<F, N>> + Clone, const N : usize> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
281 | Apply<&'b X> |
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
282 | for SlicedCodomain<'a, X, F, G, N> { |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
283 | type Output = F; |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
284 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
285 | #[inline] |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
286 | fn apply(&self, x : &'b X) -> Self::Output { |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
287 | let tmp : [F; N] = self.g.apply(x).into(); |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
288 | // Safety: `slice_codomain` below checks the range. |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
289 | unsafe { *tmp.get_unchecked(self.slice) } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
290 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
291 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
292 | |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
293 | /// An auto-trait for constructing a [`FlattenCodomain`] structure for |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
294 | /// flattening the codomain of a [`Mapping`] from [`Loc`]`<F, 1>` to `F`. |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
295 | pub trait SliceCodomain<X, F : Copy, const N : usize> : Mapping<X, Codomain=Loc<F, N>> + Clone + Sized { |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
296 | /// Flatten the codomain from [`Loc`]`<F, 1>` to `F`. |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
297 | fn slice_codomain(self, slice : usize) -> SlicedCodomain<'static, X, F, Self, N> { |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
298 | assert!(slice < N); |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
299 | SlicedCodomain{ g : Cow::Owned(self), slice, _phantoms : PhantomData } |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
300 | } |
44 | 301 | |
302 | /// Flatten the codomain from [`Loc`]`<F, 1>` to `F`. | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
303 | fn slice_codomain_ref(&self, slice : usize) -> SlicedCodomain<'_, X, F, Self, N> { |
44 | 304 | assert!(slice < N); |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
305 | SlicedCodomain{ g : Cow::Borrowed(self), slice, _phantoms : PhantomData } |
44 | 306 | } |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
307 | } |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
308 | |
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
49
diff
changeset
|
309 | impl<X, F : Copy, G : Sized + Mapping<X, Codomain=Loc<F, N>> + Clone, const N : usize> |
35
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
310 | SliceCodomain<X, F, N> |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
311 | for G {} |
3b82a9d16307
Add Mapping codomain slicing and RealVectorField
Tuomo Valkonen <tuomov@iki.fi>
parents:
34
diff
changeset
|
312 |