src/mapping.rs

branch
dev
changeset 29
7fd0984743b5
parent 13
465fa2121ccb
child 34
3dbc04100b09
child 77
cf8ef9463664
equal deleted inserted replaced
28:331345346e7b 29:7fd0984743b5
49 impl<F : Float, T, const N : usize> RealMapping<F, N> for T 49 impl<F : Float, T, const N : usize> RealMapping<F, N> for T
50 where T : Mapping<Loc<F, N>, Codomain = F> {} 50 where T : Mapping<Loc<F, N>, Codomain = F> {}
51 51
52 52
53 /// Trait for calculation the differential of `Self` as a mathematical function on `X`. 53 /// Trait for calculation the differential of `Self` as a mathematical function on `X`.
54 pub trait Differentiate<X> { 54 pub trait Differentiable<X> {
55 type Output; 55 type Output;
56 56
57 /// Compute the differential of `self` at `x`. 57 /// Compute the differential of `self` at `x`.
58 fn differential(&self, x : X) -> Self::Output; 58 fn differential(&self, x : X) -> Self::Output;
59 } 59 }
63 /// `Differential`. 63 /// `Differential`.
64 /// 64 ///
65 /// This is automatically implemented when the relevant [`Differentiate`] are implemented. 65 /// This is automatically implemented when the relevant [`Differentiate`] are implemented.
66 pub trait DifferentiableMapping<Domain> 66 pub trait DifferentiableMapping<Domain>
67 : Mapping<Domain> 67 : Mapping<Domain>
68 + Differentiate<Domain, Output=Self::Differential> 68 + Differentiable<Domain, Output=Self::Differential>
69 + for<'a> Differentiate<&'a Domain, Output=Self::Differential>{ 69 + for<'a> Differentiable<&'a Domain, Output=Self::Differential>{
70 type Differential; 70 type Differential;
71 } 71 }
72 72
73 73
74 impl<Domain, Differential, T> DifferentiableMapping<Domain> for T 74 impl<Domain, Differential, T> DifferentiableMapping<Domain> for T
75 where T : Mapping<Domain> 75 where T : Mapping<Domain>
76 + Differentiate<Domain, Output=Differential> 76 + Differentiable<Domain, Output=Differential>
77 + for<'a> Differentiate<&'a Domain, Output=Differential> { 77 + for<'a> Differentiable<&'a Domain, Output=Differential> {
78 type Differential = Differential; 78 type Differential = Differential;
79 } 79 }
80 80
81 /// A sum of [`Mapping`]s. 81 /// A sum of [`Mapping`]s.
82 #[derive(Serialize, Debug, Clone)] 82 #[derive(Serialize, Debug, Clone)]
101 fn apply(&self, x : Domain) -> Self::Output { 101 fn apply(&self, x : Domain) -> Self::Output {
102 self.components.iter().map(|c| c.apply(x)).sum() 102 self.components.iter().map(|c| c.apply(x)).sum()
103 } 103 }
104 } 104 }
105 105
106 impl<Domain, M> Differentiate<Domain> for Sum<Domain, M> 106 impl<Domain, M> Differentiable<Domain> for Sum<Domain, M>
107 where M : DifferentiableMapping<Domain>, 107 where M : DifferentiableMapping<Domain>,
108 M :: Codomain : std::iter::Sum, 108 M :: Codomain : std::iter::Sum,
109 M :: Differential : std::iter::Sum, 109 M :: Differential : std::iter::Sum,
110 Domain : Copy { 110 Domain : Copy {
111 111

mercurial