src/convex.rs

Fri, 20 Dec 2024 16:14:17 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 20 Dec 2024 16:14:17 -0500
branch
dev
changeset 79
d63e40672dd6
parent 60
848ecc05becf
child 72
44a4f258a1ff
child 80
f802ddbabcfc
permissions
-rw-r--r--

AXPY as LinSpace attempts, difficulties with Pairs and nalgebra

nalgebra should allow various storages, so InstanceMut as &self, but that won't work.

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
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
5 use std::marker::PhantomData;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
6 use crate::types::*;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
7 use crate::mapping::{Mapping, Space};
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
8 use crate::linops::IdOp;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
9 use crate::instance::{Instance, InstanceMut, DecompositionMut};
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
10 use crate::norms::*;
58
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 /// Trait for convex mappings. Has no features, just serves as a constraint
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 /// TODO: should constrain `Mapping::Codomain` to implement a partial order,
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 /// but this makes everything complicated with little benefit.
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
16 pub trait ConvexMapping<Domain : Space, F : Num = f64> : Mapping<Domain, Codomain = F>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
17 {}
58
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 /// Trait for mappings with a Fenchel conjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 /// not be convex.
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
23 pub trait Conjugable<Domain : HasDual<F>, F : Num = f64> : Mapping<Domain> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
24 type Conjugate<'a> : ConvexMapping<Domain::DualSpace, F> where Self : 'a;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 fn conjugate(&self) -> Self::Conjugate<'_>;
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
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 /// Trait for mappings with a Fenchel preconjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 /// In contrast to [`Conjugable`], the preconjugate need not implement [`ConvexMapping`],
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
32 /// but a `Preconjugable` mapping has to be convex.
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
33 pub trait Preconjugable<Domain, Predual, F : Num = f64> : ConvexMapping<Domain, F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
34 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
35 Domain : Space,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
36 Predual : HasDual<F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
37 {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
38 type Preconjugate<'a> : Mapping<Predual> where Self : 'a;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 fn preconjugate(&self) -> Self::Preconjugate<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 /// Trait for mappings with a proximap map
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 /// not be convex.
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
47 pub trait Prox<Domain : Space> : Mapping<Domain> {
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 type Prox<'a> : Mapping<Domain, Codomain=Domain> where Self : 'a;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 /// Returns a proximal mapping with weight τ
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 fn prox_mapping(&self, τ : Self::Codomain) -> Self::Prox<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 /// Calculate the proximal mapping with weight τ
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
54 fn prox<I : Instance<Domain>>(&self, τ : Self::Codomain, z : I) -> Domain {
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 self.prox_mapping(τ).apply(z)
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
57
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
58 /// Calculate the proximal mapping with weight τ in-place
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
59 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
60 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
61 &'b mut Domain : InstanceMut<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
62 Domain:: Decomp : DecompositionMut<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
63 for<'a> &'a Domain : Instance<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
64 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
65 *y = self.prox(τ, &*y);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
66 }
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
69
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
70 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
71
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
72 impl<Domain, E, F> ConvexMapping<Domain, F> for NormMapping<F, E>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
73 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
74 Domain : Space,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
75 E : NormExponent,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
76 F : Float,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
77 Self : Mapping<Domain, Codomain=F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
78 {}
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
79
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
80
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
81 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
82 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
83 Domain : Space + Norm<F, E>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
84 F : Float,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
85 E : NormExponent,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
86 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
87 type Codomain = F;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
88
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
89 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
90 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
91 F::ZERO
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
92 } else {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
93 F::INFINITY
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
94 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
95 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
96 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
97
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
98 impl<Domain, E, F> ConvexMapping<Domain, F> for NormConjugate<F, E>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
99 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
100 Domain : Space,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
101 E : NormExponent,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
102 F : Float,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
103 Self : Mapping<Domain, Codomain=F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
104 {}
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
105
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
106
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
107 impl<E, F, Domain> Conjugable<Domain, F> for NormMapping<F, E>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
108 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
109 E : HasDualExponent,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
110 F : Float,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
111 Domain : HasDual<F> + Norm<F, E> + Space,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
112 <Domain as HasDual<F>>::DualSpace : Norm<F, E::DualExp>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
113 {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
114 type Conjugate<'a> = NormConjugate<F, E::DualExp> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
115
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
116 fn conjugate(&self) -> Self::Conjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
117 NormConjugate(self.exponent.dual_exponent().as_mapping())
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
118 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
119 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
120
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
121
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
122 /// The zero mapping
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
123 pub struct Zero<Domain : Space, F : Num>(PhantomData<(Domain, F)>);
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
124
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
125 impl<Domain : Space, F : Num> Zero<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
126 pub fn new() -> Self {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
127 Zero(PhantomData)
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
128 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
129 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
130
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
131 impl<Domain : Space, F : Num> Mapping<Domain> for Zero<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
132 type Codomain = F;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
133
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
134 /// Compute the value of `self` at `x`.
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
135 fn apply<I : Instance<Domain>>(&self, _x : I) -> Self::Codomain {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
136 F::ZERO
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
137 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
138 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
139
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
140 impl<Domain : Space, F : Num> ConvexMapping<Domain, F> for Zero<Domain, F> { }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
141
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
142
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
143 impl<Domain : HasDual<F>, F : Float> Conjugable<Domain, F> for Zero<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
144 type Conjugate<'a> = ZeroIndicator<Domain::DualSpace, F> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
145
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
146 #[inline]
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
147 fn conjugate(&self) -> Self::Conjugate<'_> {
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
148 ZeroIndicator::new()
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
149 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
150 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
151
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
152 impl<Domain, Predual, F : Float> Preconjugable<Domain, Predual, F> for Zero<Domain, F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
153 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
154 Domain : Space,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
155 Predual : HasDual<F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
156 {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
157 type Preconjugate<'a> = ZeroIndicator<Predual, F> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
158
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
159 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
160 fn preconjugate(&self) -> Self::Preconjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
161 ZeroIndicator::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
162 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
163 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
164
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
165 impl<Domain : Space + Clone, F : Num> Prox<Domain> for Zero<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
166 type Prox<'a> = IdOp<Domain> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
167
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
168 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
169 fn prox_mapping(&self, _τ : Self::Codomain) -> Self::Prox<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
170 IdOp::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
171 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
172 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
173
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
174
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
175 /// The zero indicator
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
176 pub struct ZeroIndicator<Domain : Space, F : Num>(PhantomData<(Domain, F)>);
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
177
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
178 impl<Domain : Space, F : Num> ZeroIndicator<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
179 pub fn new() -> Self {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
180 ZeroIndicator(PhantomData)
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
181 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
182 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
183
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
184 impl<Domain : Normed<F>, F : Float> Mapping<Domain> for ZeroIndicator<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
185 type Codomain = F;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
186
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
187 /// Compute the value of `self` at `x`.
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
188 fn apply<I : Instance<Domain>>(&self, x : I) -> Self::Codomain {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
189 x.eval(|x̃| if x̃.is_zero() { F::ZERO } else { F::INFINITY })
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
190 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
191 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
192
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
193 impl<Domain : Normed<F>, F : Float> ConvexMapping<Domain, F> for ZeroIndicator<Domain, F> { }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
194
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
195 impl<Domain : HasDual<F>, F : Float> Conjugable<Domain, F> for ZeroIndicator<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
196 type Conjugate<'a> = Zero<Domain::DualSpace, F> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
197
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
198 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
199 fn conjugate(&self) -> Self::Conjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
200 Zero::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
201 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
202 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
203
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
204 impl<Domain, Predual, F : Float> Preconjugable<Domain, Predual, F> for ZeroIndicator<Domain, F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
205 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
206 Domain : Normed<F>,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
207 Predual : HasDual<F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
208 {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
209 type Preconjugate<'a> = Zero<Predual, F> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
210
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
211 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
212 fn preconjugate(&self) -> Self::Preconjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
213 Zero::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
214 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
215 }

mercurial