src/mapping/dataterm.rs

branch
dev
changeset 150
c4e394a9c84c
parent 128
f75bf34adda0
child 191
794833f18a05
equal deleted inserted replaced
149:2f1798c65fd6 150:c4e394a9c84c
6 #![allow(non_snake_case)] 6 #![allow(non_snake_case)]
7 7
8 use super::{DifferentiableImpl, DifferentiableMapping, LipschitzDifferentiableImpl, Mapping}; 8 use super::{DifferentiableImpl, DifferentiableMapping, LipschitzDifferentiableImpl, Mapping};
9 use crate::convex::ConvexMapping; 9 use crate::convex::ConvexMapping;
10 use crate::error::DynResult; 10 use crate::error::DynResult;
11 use crate::instance::{Instance, Space}; 11 use crate::instance::{ClosedSpace, Instance, Space};
12 use crate::linops::{BoundedLinear, Linear, Preadjointable}; 12 use crate::linops::{BoundedLinear, Linear, Preadjointable};
13 use crate::norms::{Normed, L2}; 13 use crate::norms::{Normed, L2};
14 use crate::types::Float; 14 use crate::types::Float;
15 use std::ops::Sub; 15 use std::ops::Sub;
16 16
39 A: Mapping<Domain> + Clone, 39 A: Mapping<Domain> + Clone,
40 <A as Mapping<Domain>>::Codomain: Clone, 40 <A as Mapping<Domain>>::Codomain: Clone,
41 G: Mapping<A::Codomain, Codomain = F> + Clone, 41 G: Mapping<A::Codomain, Codomain = F> + Clone,
42 { 42 {
43 fn clone(&self) -> Self { 43 fn clone(&self) -> Self {
44 DataTerm { 44 DataTerm { opA: self.opA.clone(), b: self.b.clone(), g: self.g.clone() }
45 opA: self.opA.clone(),
46 b: self.b.clone(),
47 g: self.g.clone(),
48 }
49 } 45 }
50 } 46 }
51 47
52 #[allow(non_snake_case)] 48 #[allow(non_snake_case)]
53 impl<F: Float, Domain: Space, A: Mapping<Domain>, G: Mapping<A::Codomain, Codomain = F>> 49 impl<F: Float, Domain: Space, A: Mapping<Domain>, G: Mapping<A::Codomain, Codomain = F>>
76 where 72 where
77 F: Float, 73 F: Float,
78 X: Space, 74 X: Space,
79 A: Mapping<X>, 75 A: Mapping<X>,
80 G: Mapping<A::Codomain, Codomain = F>, 76 G: Mapping<A::Codomain, Codomain = F>,
81 A::Codomain: for<'a> Sub<&'a A::Codomain, Output = A::Codomain>, 77 A::Codomain: ClosedSpace + for<'a> Sub<&'a A::Codomain, Output = A::Codomain>,
82 { 78 {
83 type Codomain = F; 79 type Codomain = F;
84 80
85 fn apply<I: Instance<X>>(&self, x: I) -> F { 81 fn apply<I: Instance<X>>(&self, x: I) -> F {
86 // TODO: possibly (if at all more effcient) use GEMV once generalised 82 // TODO: possibly (if at all more effcient) use GEMV once generalised
95 where 91 where
96 F: Float, 92 F: Float,
97 X: Normed<F>, 93 X: Normed<F>,
98 A: Linear<X>, 94 A: Linear<X>,
99 G: ConvexMapping<A::Codomain, F>, 95 G: ConvexMapping<A::Codomain, F>,
100 A::Codomain: Normed<F> + for<'a> Sub<&'a A::Codomain, Output = A::Codomain>, 96 A::Codomain: ClosedSpace + Normed<F> + for<'a> Sub<&'a A::Codomain, Output = A::Codomain>,
101 { 97 {
102 } 98 }
103 99
104 impl<F, X, Y, A, G> DifferentiableImpl<X> for DataTerm<F, X, A, G> 100 impl<F, X, Y, A, G> DifferentiableImpl<X> for DataTerm<F, X, A, G>
105 where 101 where
106 F: Float, 102 F: Float,
107 X: Space, 103 X: Space,
108 Y: Space + for<'a> Sub<&'a Y, Output = Y>, 104 Y: Space + Instance<Y> + for<'a> Sub<&'a Y, Output = Y>,
109 //<A as Mapping<X>>::Codomain: Euclidean<F>, 105 //<A as Mapping<X>>::Codomain: Euclidean<F>,
110 A: Linear<X, Codomain = Y> + Preadjointable<X, G::DerivativeDomain>, 106 A: Linear<X, Codomain = Y> + Preadjointable<X, G::DerivativeDomain>,
107 G::DerivativeDomain: Instance<G::DerivativeDomain>,
108 A::PreadjointCodomain: ClosedSpace,
111 //<<A as Mapping<X>>::Codomain as Euclidean<F>>::Output: Instance<<A as Mapping<X>>::Codomain>, 109 //<<A as Mapping<X>>::Codomain as Euclidean<F>>::Output: Instance<<A as Mapping<X>>::Codomain>,
112 G: DifferentiableMapping<Y, Codomain = F>, 110 G: DifferentiableMapping<Y, Codomain = F>,
113 { 111 {
114 type Derivative = A::PreadjointCodomain; 112 type Derivative = A::PreadjointCodomain;
115 113

mercurial