| 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 |