src/convex.rs

Tue, 31 Dec 2024 08:30:02 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 31 Dec 2024 08:30:02 -0500
branch
dev
changeset 59
9226980e45a7
parent 58
1a38447a89fa
child 60
848ecc05becf
permissions
-rw-r--r--

Significantly simplify Mapping / Apply through Instance

58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Some convex analysis basics
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 */
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
5 use crate::types::*;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
6 use crate::mapping::{Mapping, Space};
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
7 use crate::instance::{Instance, InstanceMut, DecompositionMut};
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
8 use crate::norms::*;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 /// Trait for convex mappings. Has no features, just serves as a constraint
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 /// TODO: should constrain `Mapping::Codomain` to implement a partial order,
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 /// but this makes everything complicated with little benefit.
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
14 pub trait ConvexMapping<Domain : Space> : Mapping<Domain>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
15 {}
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 /// Trait for mappings with a Fenchel conjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 /// not be convex.
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
21 pub trait Conjugable<Domain : Space> : Mapping<Domain> {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
22 type DualDomain : Space;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 type Conjugate<'a> : ConvexMapping<Self::DualDomain> where Self : 'a;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 fn conjugate(&self) -> Self::Conjugate<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 /// Trait for mappings with a Fenchel preconjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 /// In contrast to [`Conjugable`], the preconjugate need not implement [`ConvexMapping`],
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 /// but a `Preconjugable` mapping has be convex.
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
32 pub trait Preconjugable<Domain : Space> : ConvexMapping<Domain> {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
33 type PredualDomain : Space;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 type Preconjugate<'a> : Mapping<Self::PredualDomain> where Self : 'a;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 fn preconjugate(&self) -> Self::Preconjugate<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 /// Trait for mappings with a proximap map
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 /// not be convex.
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
43 pub trait Prox<Domain : Space> : Mapping<Domain> {
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 type Prox<'a> : Mapping<Domain, Codomain=Domain> where Self : 'a;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 /// Returns a proximal mapping with weight τ
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 fn prox_mapping(&self, τ : Self::Codomain) -> Self::Prox<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 /// Calculate the proximal mapping with weight τ
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
50 fn prox<I : Instance<Domain>>(&self, τ : Self::Codomain, z : I) -> Domain {
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 self.prox_mapping(τ).apply(z)
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
53
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
54 /// Calculate the proximal mapping with weight τ in-place
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
55 fn prox_mut<'b>(&self, τ : Self::Codomain, y : &'b mut Domain)
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
56 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
57 &'b mut Domain : InstanceMut<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
58 Domain:: Decomp : DecompositionMut<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
59 for<'a> &'a Domain : Instance<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
60 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
61 *y = self.prox(τ, &*y);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
62 }
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
65
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
66 pub struct NormConjugate<F : Float, E : NormExponent>(NormMapping<F, E>);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
67
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
68 impl<Domain, E, F> ConvexMapping<Domain> for NormMapping<F, E>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
69 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
70 Domain : Space,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
71 E : NormExponent,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
72 F : Float,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
73 Self : Mapping<Domain, Codomain=F> {}
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
74
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
75
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
76 impl<Domain, E, F> ConvexMapping<Domain> for NormConjugate<F, E>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
77 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
78 Domain : Space,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
79 E : NormExponent,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
80 F : Float,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
81 Self : Mapping<Domain, Codomain=F> {}
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
82
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
83
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
84 impl<F, E, Domain> Mapping<Domain> for NormConjugate<F, E>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
85 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
86 Domain : Space + Norm<F, E>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
87 F : Float,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
88 E : NormExponent,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
89 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
90 type Codomain = F;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
91
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
92 fn apply<I : Instance<Domain>>(&self, d : I) -> F {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
93 if d.eval(|x| x.norm(self.0.exponent)) <= F::ONE {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
94 F::ZERO
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
95 } else {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
96 F::INFINITY
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
97 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
98 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
99 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
100
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
101
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
102
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
103 impl<E, F, Domain> Conjugable<Domain> for NormMapping<F, E>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
104 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
105 E : NormExponent + Clone,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
106 F : Float,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
107 Domain : Norm<F, E> + Space,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
108 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
109
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
110 type DualDomain = Domain;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
111 type Conjugate<'a> = NormConjugate<F, E> where Self : 'a;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
112
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
113 fn conjugate(&self) -> Self::Conjugate<'_> {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
114 NormConjugate(self.clone())
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
115 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
116 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
117

mercurial