src/mapping/dataterm.rs

Mon, 01 Sep 2025 13:51:03 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 01 Sep 2025 13:51:03 -0500
branch
dev
changeset 150
c4e394a9c84c
parent 128
f75bf34adda0
child 191
794833f18a05
permissions
-rw-r--r--

fubar

105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 General deata terms of the form $g(Ax-b)$ for an operator $A$
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 to a [`Euclidean`] space, and a function g on that space.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 */
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 #![allow(non_snake_case)]
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
8 use super::{DifferentiableImpl, DifferentiableMapping, LipschitzDifferentiableImpl, Mapping};
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 use crate::convex::ConvexMapping;
110
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
10 use crate::error::DynResult;
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 128
diff changeset
11 use crate::instance::{ClosedSpace, Instance, Space};
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
12 use crate::linops::{BoundedLinear, Linear, Preadjointable};
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
13 use crate::norms::{Normed, L2};
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 use crate::types::Float;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 use std::ops::Sub;
110
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
16
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 //use serde::{Deserialize, Serialize};
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18
111
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
19 /// Functions of the form $g(Ax-b)$ for an operator $A$, data $b$, and fidelity $g$.
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 pub struct DataTerm<
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 Domain: Space,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 A: Mapping<Domain>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 G: Mapping<A::Codomain, Codomain = F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 > {
111
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
26 // The operator A
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 opA: A,
111
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
28 // The data b
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 b: <A as Mapping<Domain>>::Codomain,
111
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
30 // The outer fidelity
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 g: G,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33
111
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
34 // Derive has troubles with `b`.
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
35 impl<F, Domain, A, G> Clone for DataTerm<F, Domain, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
36 where
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
37 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
38 Domain: Space,
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
39 A: Mapping<Domain> + Clone,
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
40 <A as Mapping<Domain>>::Codomain: Clone,
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
41 G: Mapping<A::Codomain, Codomain = F> + Clone,
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
42 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
43 fn clone(&self) -> Self {
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 128
diff changeset
44 DataTerm { opA: self.opA.clone(), b: self.b.clone(), g: self.g.clone() }
111
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
45 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
46 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
47
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 #[allow(non_snake_case)]
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 impl<F: Float, Domain: Space, A: Mapping<Domain>, G: Mapping<A::Codomain, Codomain = F>>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 DataTerm<F, Domain, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 pub fn new(opA: A, b: A::Codomain, g: G) -> Self {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 DataTerm { opA, b, g }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 pub fn operator(&self) -> &'_ A {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 &self.opA
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 pub fn data(&self) -> &'_ <A as Mapping<Domain>>::Codomain {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 &self.b
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 pub fn fidelity(&self) -> &'_ G {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 &self.g
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 111
diff changeset
69 //+ AdjointProductBoundedBy<RNDM<N, F>, P, FloatType = F>,
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 impl<F, X, A, G> Mapping<X> for DataTerm<F, X, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 where
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 X: Space,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 A: Mapping<X>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 G: Mapping<A::Codomain, Codomain = F>,
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 128
diff changeset
77 A::Codomain: ClosedSpace + for<'a> Sub<&'a A::Codomain, Output = A::Codomain>,
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 type Codomain = F;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 fn apply<I: Instance<X>>(&self, x: I) -> F {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 // TODO: possibly (if at all more effcient) use GEMV once generalised
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 // to not require preallocation. However, Rust should be pretty efficient
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 // at not doing preallocations or anything here, as the result of self.opA.apply()
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 // can be consumed, so maybe GEMV is no use.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 self.g.apply(self.opA.apply(x) - &self.b)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 impl<F, X, A, G> ConvexMapping<X, F> for DataTerm<F, X, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 where
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 F: Float,
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
93 X: Normed<F>,
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 A: Linear<X>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 G: ConvexMapping<A::Codomain, F>,
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 128
diff changeset
96 A::Codomain: ClosedSpace + Normed<F> + for<'a> Sub<&'a A::Codomain, Output = A::Codomain>,
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 impl<F, X, Y, A, G> DifferentiableImpl<X> for DataTerm<F, X, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 where
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 X: Space,
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 128
diff changeset
104 Y: Space + Instance<Y> + for<'a> Sub<&'a Y, Output = Y>,
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 //<A as Mapping<X>>::Codomain: Euclidean<F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 A: Linear<X, Codomain = Y> + Preadjointable<X, G::DerivativeDomain>,
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 128
diff changeset
107 G::DerivativeDomain: Instance<G::DerivativeDomain>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 128
diff changeset
108 A::PreadjointCodomain: ClosedSpace,
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 //<<A as Mapping<X>>::Codomain as Euclidean<F>>::Output: Instance<<A as Mapping<X>>::Codomain>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 G: DifferentiableMapping<Y, Codomain = F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 type Derivative = A::PreadjointCodomain;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 fn differential_impl<I: Instance<X>>(&self, x: I) -> Self::Derivative {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 // TODO: possibly (if at all more effcient) use GEMV once generalised
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 // to not require preallocation. However, Rust should be pretty efficient
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 // at not doing preallocations or anything here, as the result of self.opA.apply()
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 // can be consumed, so maybe GEMV is no use.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 //self.opA.preadjoint().apply(self.opA.apply(x) - self.b)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 self.opA
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 .preadjoint()
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 .apply(self.g.diff_ref().apply(self.opA.apply(x) - &self.b))
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
126 impl<'a, F, X, Y, A, G> LipschitzDifferentiableImpl<X, X::NormExp> for DataTerm<F, X, A, G>
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 where
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 F: Float,
128
f75bf34adda0 Switch from Cow to MyCow for DifferentiableImpl to avoid Clone trait bound
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
129 X: Normed<F>,
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
130 Y: Normed<F>,
128
f75bf34adda0 Switch from Cow to MyCow for DifferentiableImpl to avoid Clone trait bound
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
131 A: BoundedLinear<X, X::NormExp, L2, F, Codomain = Y>,
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
132 G: Mapping<Y, Codomain = F> + LipschitzDifferentiableImpl<Y, Y::NormExp>,
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 Self: DifferentiableImpl<X>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 type FloatType = F;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136
110
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
137 fn diff_lipschitz_factor(&self, seminorm: X::NormExp) -> DynResult<F> {
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
138 Ok(self.opA.opnorm_bound(seminorm, L2)?.powi(2))
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 }

mercurial