src/mapping/dataterm.rs

Tue, 29 Apr 2025 07:55:18 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 29 Apr 2025 07:55:18 -0500
branch
dev
changeset 105
103aa137fcb2
child 109
943c6b3b9414
permissions
-rw-r--r--

sketch

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
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 use super::{DifferentiableImpl, DifferentiableMapping, /*LipschitzDifferentiableImpl,*/ Mapping,};
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 use crate::convex::ConvexMapping;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 use crate::instance::{Instance, Space};
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 use crate::linops::{/*BoundedLinear,*/ Linear, Preadjointable};
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 //use crate::norms::{Norm, NormExponent, L2};
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 use crate::types::Float;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 use std::ops::Sub;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 //use serde::{Deserialize, Serialize};
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 /// Functions of the form $\frac{1}{2}\|Ax-b\|_2^2$ for an operator $A$
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 /// to a [`Euclidean`] space.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 pub struct DataTerm<
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 Domain: Space,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 A: Mapping<Domain>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 G: Mapping<A::Codomain, Codomain = F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 > {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 opA: A,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 b: <A as Mapping<Domain>>::Codomain,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 g: G,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 #[allow(non_snake_case)]
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 impl<F: Float, Domain: Space, A: Mapping<Domain>, G: Mapping<A::Codomain, Codomain = F>>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 DataTerm<F, Domain, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 pub fn new(opA: A, b: A::Codomain, g: G) -> Self {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 DataTerm { opA, b, g }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 pub fn operator(&self) -> &'_ A {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 &self.opA
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 pub fn data(&self) -> &'_ <A as Mapping<Domain>>::Codomain {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 &self.b
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 pub fn fidelity(&self) -> &'_ G {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 &self.g
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 //+ AdjointProductBoundedBy<RNDM<F, N>, P, FloatType = F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 impl<F, X, A, G> Mapping<X> for DataTerm<F, X, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 where
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 X: Space,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 A: Mapping<X>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 G: Mapping<A::Codomain, Codomain = F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 A::Codomain: for<'a> Sub<&'a A::Codomain, Output = A::Codomain>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 type Codomain = F;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 fn apply<I: Instance<X>>(&self, x: I) -> F {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 // TODO: possibly (if at all more effcient) use GEMV once generalised
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 // to not require preallocation. However, Rust should be pretty efficient
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 // at not doing preallocations or anything here, as the result of self.opA.apply()
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 // can be consumed, so maybe GEMV is no use.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 self.g.apply(self.opA.apply(x) - &self.b)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 impl<F, X, A, G> ConvexMapping<X, F> for DataTerm<F, X, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 where
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 X: Space,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 A: Linear<X>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 G: ConvexMapping<A::Codomain, F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 A::Codomain: for<'a> Sub<&'a A::Codomain, Output = A::Codomain>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 impl<F, X, Y, A, G> DifferentiableImpl<X> for DataTerm<F, X, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 where
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 X: Space,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 Y: Space + for<'a> Sub<&'a Y, Output = Y>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 //<A as Mapping<X>>::Codomain: Euclidean<F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 A: Linear<X, Codomain = Y> + Preadjointable<X, G::DerivativeDomain>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 //<<A as Mapping<X>>::Codomain as Euclidean<F>>::Output: Instance<<A as Mapping<X>>::Codomain>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 G: DifferentiableMapping<Y, Codomain = F>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 type Derivative = A::PreadjointCodomain;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 fn differential_impl<I: Instance<X>>(&self, x: I) -> Self::Derivative {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 // TODO: possibly (if at all more effcient) use GEMV once generalised
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 // to not require preallocation. However, Rust should be pretty efficient
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 // at not doing preallocations or anything here, as the result of self.opA.apply()
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 // can be consumed, so maybe GEMV is no use.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 //self.opA.preadjoint().apply(self.opA.apply(x) - self.b)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 self.opA
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 .preadjoint()
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 .apply(self.g.diff_ref().apply(self.opA.apply(x) - &self.b))
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 /*
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 impl<'a, F, X, ExpX, Y, ExpY, A, G> LipschitzDifferentiableImpl<X, ExpX> for DataTerm<F, X, A, G>
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 where
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 F: Float,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 X: Space + Clone + Norm<F, ExpX>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 Y: Space + Norm<F, ExpY>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 ExpX: NormExponent,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 ExpY: NormExponent,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 A: Clone + BoundedLinear<X, ExpX, L2, F, Codomain = Y>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 G: Mapping<Y, Codomain = F> + LipschitzDifferentiableImpl<Y, ExpY>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 Self: DifferentiableImpl<X>,
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 type FloatType = F;
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 fn diff_lipschitz_factor(&self, seminorm: ExpX) -> Option<F> {
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 Some(self.opA.opnorm_bound(seminorm, L2).powi(2))
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 }
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 */

mercurial