Tue, 29 Apr 2025 07:55:18 -0500
sketch
| 58 | 1 | /*! |
| 2 | Some convex analysis basics | |
| 3 | */ | |
| 4 | ||
| 104 | 5 | use crate::euclidean::Euclidean; |
| 6 | use crate::instance::{DecompositionMut, Instance, InstanceMut}; | |
| 7 | use crate::linops::{IdOp, Scaled}; | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
8 | use crate::mapping::{Mapping, Space}; |
| 104 | 9 | use crate::norms::*; |
| 72 | 10 | use crate::operator_arithmetic::{Constant, Weighted}; |
| 104 | 11 | use crate::types::*; |
| 12 | use std::marker::PhantomData; | |
| 58 | 13 | |
| 14 | /// Trait for convex mappings. Has no features, just serves as a constraint | |
| 15 | /// | |
| 16 | /// TODO: should constrain `Mapping::Codomain` to implement a partial order, | |
| 17 | /// but this makes everything complicated with little benefit. | |
| 104 | 18 | pub trait ConvexMapping<Domain: Space, F: Num = f64>: Mapping<Domain, Codomain = F> {} |
| 58 | 19 | |
| 20 | /// Trait for mappings with a Fenchel conjugate | |
| 21 | /// | |
| 22 | /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need | |
| 23 | /// not be convex. | |
| 104 | 24 | pub trait Conjugable<Domain: HasDual<F>, F: Num = f64>: Mapping<Domain> { |
| 25 | type Conjugate<'a>: ConvexMapping<Domain::DualSpace, F> | |
| 26 | where | |
| 27 | Self: 'a; | |
| 58 | 28 | |
| 29 | fn conjugate(&self) -> Self::Conjugate<'_>; | |
| 30 | } | |
| 31 | ||
| 32 | /// Trait for mappings with a Fenchel preconjugate | |
| 33 | /// | |
| 34 | /// 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
|
35 | /// but a `Preconjugable` mapping has to be convex. |
| 104 | 36 | pub trait Preconjugable<Domain, Predual, F: Num = f64>: ConvexMapping<Domain, F> |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
37 | where |
| 104 | 38 | Domain: Space, |
| 39 | Predual: HasDual<F>, | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
40 | { |
| 104 | 41 | type Preconjugate<'a>: Mapping<Predual> |
| 42 | where | |
| 43 | Self: 'a; | |
| 58 | 44 | |
| 45 | fn preconjugate(&self) -> Self::Preconjugate<'_>; | |
| 46 | } | |
| 47 | ||
| 48 | /// Trait for mappings with a proximap map | |
| 49 | /// | |
| 50 | /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need | |
| 51 | /// not be convex. | |
| 104 | 52 | pub trait Prox<Domain: Space>: Mapping<Domain> { |
| 53 | type Prox<'a>: Mapping<Domain, Codomain = Domain> | |
| 54 | where | |
| 55 | Self: 'a; | |
| 58 | 56 | |
| 57 | /// Returns a proximal mapping with weight τ | |
| 104 | 58 | fn prox_mapping(&self, τ: Self::Codomain) -> Self::Prox<'_>; |
| 58 | 59 | |
| 60 | /// Calculate the proximal mapping with weight τ | |
| 104 | 61 | fn prox<I: Instance<Domain>>(&self, τ: Self::Codomain, z: I) -> Domain { |
| 58 | 62 | self.prox_mapping(τ).apply(z) |
| 63 | } | |
|
59
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 | /// Calculate the proximal mapping with weight τ in-place |
| 104 | 66 | fn prox_mut<'b>(&self, τ: Self::Codomain, y: &'b mut Domain) |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
67 | where |
| 104 | 68 | &'b mut Domain: InstanceMut<Domain>, |
| 69 | Domain::Decomp: DecompositionMut<Domain>, | |
| 70 | for<'a> &'a Domain: Instance<Domain>, | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
71 | { |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
72 | *y = self.prox(τ, &*y); |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
73 | } |
| 58 | 74 | } |
| 75 | ||
| 88 | 76 | /// Constraint to the unit ball of the norm described by `E`. |
| 104 | 77 | pub struct NormConstraint<F: Float, E: NormExponent> { |
| 78 | radius: F, | |
| 79 | norm: NormMapping<F, E>, | |
| 72 | 80 | } |
| 81 | ||
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
82 | 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
|
83 | where |
| 104 | 84 | Domain: Space, |
| 85 | E: NormExponent, | |
| 86 | F: Float, | |
| 87 | Self: Mapping<Domain, Codomain = F>, | |
| 88 | { | |
| 89 | } | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
90 | |
| 72 | 91 | impl<F, E, Domain> Mapping<Domain> for NormConstraint<F, E> |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
92 | where |
| 104 | 93 | Domain: Space + Norm<F, E>, |
| 94 | F: Float, | |
| 95 | E: NormExponent, | |
|
59
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 | type Codomain = F; |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
98 | |
| 104 | 99 | fn apply<I: Instance<Domain>>(&self, d: I) -> F { |
| 72 | 100 | if d.eval(|x| x.norm(self.norm.exponent)) <= self.radius { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
101 | F::ZERO |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
102 | } else { |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
103 | F::INFINITY |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
104 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
105 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
106 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
107 | |
| 72 | 108 | impl<Domain, E, F> ConvexMapping<Domain, F> for NormConstraint<F, E> |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
109 | where |
| 104 | 110 | Domain: Space, |
| 111 | E: NormExponent, | |
| 112 | F: Float, | |
| 113 | Self: Mapping<Domain, Codomain = F>, | |
| 114 | { | |
| 115 | } | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
116 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
117 | 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
|
118 | where |
| 104 | 119 | E: HasDualExponent, |
| 120 | F: Float, | |
| 121 | Domain: HasDual<F> + Norm<F, E> + Space, | |
| 122 | <Domain as HasDual<F>>::DualSpace: Norm<F, E::DualExp>, | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
123 | { |
| 104 | 124 | type Conjugate<'a> |
| 125 | = NormConstraint<F, E::DualExp> | |
| 126 | where | |
| 127 | Self: 'a; | |
| 72 | 128 | |
| 129 | fn conjugate(&self) -> Self::Conjugate<'_> { | |
| 130 | NormConstraint { | |
| 104 | 131 | radius: F::ONE, |
| 132 | norm: self.exponent.dual_exponent().as_mapping(), | |
| 72 | 133 | } |
| 134 | } | |
| 135 | } | |
| 136 | ||
| 137 | impl<C, E, F, Domain> Conjugable<Domain, F> for Weighted<NormMapping<F, E>, C> | |
| 138 | where | |
| 104 | 139 | C: Constant<Type = F>, |
| 140 | E: HasDualExponent, | |
| 141 | F: Float, | |
| 142 | Domain: HasDual<F> + Norm<F, E> + Space, | |
| 143 | <Domain as HasDual<F>>::DualSpace: Norm<F, E::DualExp>, | |
| 72 | 144 | { |
| 104 | 145 | type Conjugate<'a> |
| 146 | = NormConstraint<F, E::DualExp> | |
| 147 | where | |
| 148 | Self: 'a; | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
149 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
150 | fn conjugate(&self) -> Self::Conjugate<'_> { |
| 72 | 151 | NormConstraint { |
| 104 | 152 | radius: self.weight.value(), |
| 153 | norm: self.base_fn.exponent.dual_exponent().as_mapping(), | |
| 72 | 154 | } |
| 155 | } | |
| 156 | } | |
| 157 | ||
| 158 | impl<Domain, E, F> Prox<Domain> for NormConstraint<F, E> | |
| 159 | where | |
| 104 | 160 | Domain: Space + Norm<F, E>, |
| 161 | E: NormExponent, | |
| 162 | F: Float, | |
| 163 | NormProjection<F, E>: Mapping<Domain, Codomain = Domain>, | |
| 72 | 164 | { |
| 104 | 165 | type Prox<'a> |
| 166 | = NormProjection<F, E> | |
| 167 | where | |
| 168 | Self: 'a; | |
| 72 | 169 | |
| 170 | #[inline] | |
| 104 | 171 | fn prox_mapping(&self, _τ: Self::Codomain) -> Self::Prox<'_> { |
| 72 | 172 | assert!(self.radius >= F::ZERO); |
| 104 | 173 | NormProjection { |
| 174 | radius: self.radius, | |
| 175 | exponent: self.norm.exponent, | |
| 176 | } | |
| 72 | 177 | } |
| 178 | } | |
| 179 | ||
| 88 | 180 | /// Projection to the unit ball of the norm described by `E`. |
| 104 | 181 | pub struct NormProjection<F: Float, E: NormExponent> { |
| 182 | radius: F, | |
| 183 | exponent: E, | |
| 72 | 184 | } |
| 185 | ||
| 186 | /* | |
| 187 | impl<F, Domain> Mapping<Domain> for NormProjection<F, L2> | |
| 188 | where | |
| 189 | Domain : Space + Euclidean<F> + std::ops::MulAssign<F>, | |
| 190 | F : Float, | |
| 191 | { | |
| 192 | type Codomain = Domain; | |
| 193 | ||
| 194 | fn apply<I : Instance<Domain>>(&self, d : I) -> Domain { | |
| 195 | d.own().proj_ball2(self.radius) | |
| 196 | } | |
| 197 | } | |
| 198 | */ | |
| 199 | ||
| 200 | impl<F, E, Domain> Mapping<Domain> for NormProjection<F, E> | |
| 201 | where | |
| 104 | 202 | Domain: Space + Projection<F, E>, |
| 203 | F: Float, | |
| 204 | E: NormExponent, | |
| 72 | 205 | { |
| 206 | type Codomain = Domain; | |
| 207 | ||
| 104 | 208 | fn apply<I: Instance<Domain>>(&self, d: I) -> Domain { |
| 72 | 209 | d.own().proj_ball(self.radius, self.exponent) |
|
60
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 | } |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
212 | |
| 104 | 213 | /// The zero mapping |
| 214 | pub struct Zero<Domain: Space, F: Num>(PhantomData<(Domain, F)>); | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
215 | |
| 104 | 216 | impl<Domain: Space, F: Num> Zero<Domain, F> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
217 | pub fn new() -> Self { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
218 | Zero(PhantomData) |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
219 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
220 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
221 | |
| 104 | 222 | impl<Domain: Space, F: Num> Mapping<Domain> for Zero<Domain, F> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
223 | type Codomain = F; |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
224 | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
225 | /// Compute the value of `self` at `x`. |
| 104 | 226 | fn apply<I: Instance<Domain>>(&self, _x: I) -> Self::Codomain { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
227 | F::ZERO |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
228 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
229 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
230 | |
| 104 | 231 | impl<Domain: Space, F: Num> ConvexMapping<Domain, F> for Zero<Domain, F> {} |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
232 | |
| 104 | 233 | impl<Domain: HasDual<F>, F: Float> Conjugable<Domain, F> for Zero<Domain, F> { |
| 234 | type Conjugate<'a> | |
| 235 | = ZeroIndicator<Domain::DualSpace, F> | |
| 236 | where | |
| 237 | Self: 'a; | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
238 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
239 | #[inline] |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
240 | fn conjugate(&self) -> Self::Conjugate<'_> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
241 | ZeroIndicator::new() |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
242 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
243 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
58
diff
changeset
|
244 | |
| 104 | 245 | impl<Domain, Predual, F: Float> Preconjugable<Domain, Predual, F> for Zero<Domain, F> |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
246 | where |
| 104 | 247 | Domain: Space, |
| 248 | Predual: HasDual<F>, | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
249 | { |
| 104 | 250 | type Preconjugate<'a> |
| 251 | = ZeroIndicator<Predual, F> | |
| 252 | where | |
| 253 | Self: 'a; | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
254 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
255 | #[inline] |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
256 | fn preconjugate(&self) -> Self::Preconjugate<'_> { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
257 | ZeroIndicator::new() |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
258 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
259 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
260 | |
| 104 | 261 | impl<Domain: Space + Clone, F: Num> Prox<Domain> for Zero<Domain, F> { |
| 262 | type Prox<'a> | |
| 263 | = IdOp<Domain> | |
| 264 | where | |
| 265 | Self: 'a; | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
266 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
267 | #[inline] |
| 104 | 268 | fn prox_mapping(&self, _τ: Self::Codomain) -> Self::Prox<'_> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
269 | IdOp::new() |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
270 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
271 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
272 | |
| 104 | 273 | /// The zero indicator |
| 274 | pub struct ZeroIndicator<Domain: Space, F: Num>(PhantomData<(Domain, F)>); | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
275 | |
| 104 | 276 | impl<Domain: Space, F: Num> ZeroIndicator<Domain, F> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
277 | pub fn new() -> Self { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
278 | ZeroIndicator(PhantomData) |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
279 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
280 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
281 | |
| 104 | 282 | impl<Domain: Normed<F>, F: Float> Mapping<Domain> for ZeroIndicator<Domain, F> { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
283 | type Codomain = F; |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
284 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
285 | /// Compute the value of `self` at `x`. |
| 104 | 286 | fn apply<I: Instance<Domain>>(&self, x: I) -> Self::Codomain { |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
287 | 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
|
288 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
289 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
290 | |
| 104 | 291 | impl<Domain: Normed<F>, F: Float> ConvexMapping<Domain, F> for ZeroIndicator<Domain, F> {} |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
292 | |
| 104 | 293 | impl<Domain: HasDual<F>, F: Float> Conjugable<Domain, F> for ZeroIndicator<Domain, F> { |
| 294 | type Conjugate<'a> | |
| 295 | = Zero<Domain::DualSpace, F> | |
| 296 | where | |
| 297 | Self: 'a; | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
298 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
299 | #[inline] |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
300 | fn conjugate(&self) -> Self::Conjugate<'_> { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
301 | Zero::new() |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
302 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
303 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
304 | |
| 104 | 305 | impl<Domain, Predual, F: Float> Preconjugable<Domain, Predual, F> for ZeroIndicator<Domain, F> |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
306 | where |
| 104 | 307 | Domain: Normed<F>, |
| 308 | Predual: HasDual<F>, | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
309 | { |
| 104 | 310 | type Preconjugate<'a> |
| 311 | = Zero<Predual, F> | |
| 312 | where | |
| 313 | Self: 'a; | |
|
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
314 | |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
315 | #[inline] |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
316 | fn preconjugate(&self) -> Self::Preconjugate<'_> { |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
317 | Zero::new() |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
318 | } |
|
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
319 | } |
| 104 | 320 | |
| 321 | /// The squared Euclidean norm divided by two | |
| 105 | 322 | pub struct Norm222<F: Float>(PhantomData<F>); |
| 104 | 323 | |
| 105 | 324 | impl</*Domain: Euclidean<F>,*/ F: Float> Norm222<F> { |
| 104 | 325 | pub fn new() -> Self { |
| 326 | Norm222(PhantomData) | |
| 327 | } | |
| 328 | } | |
| 329 | ||
| 105 | 330 | impl<Domain: Euclidean<F>, F: Float> Mapping<Domain> for Norm222<F> { |
| 104 | 331 | type Codomain = F; |
| 332 | ||
| 333 | /// Compute the value of `self` at `x`. | |
| 334 | fn apply<I: Instance<Domain>>(&self, x: I) -> Self::Codomain { | |
| 335 | x.eval(|z| z.norm2_squared() / F::TWO) | |
| 336 | } | |
| 337 | } | |
| 338 | ||
| 105 | 339 | impl<Domain: Euclidean<F>, F: Float> ConvexMapping<Domain, F> for Norm222<F> {} |
| 104 | 340 | |
| 105 | 341 | impl<Domain: Euclidean<F>, F: Float> Conjugable<Domain, F> for Norm222<F> { |
| 104 | 342 | type Conjugate<'a> |
| 343 | = Self | |
| 344 | where | |
| 345 | Self: 'a; | |
| 346 | ||
| 347 | #[inline] | |
| 348 | fn conjugate(&self) -> Self::Conjugate<'_> { | |
| 349 | Self::new() | |
| 350 | } | |
| 351 | } | |
| 352 | ||
| 105 | 353 | impl<Domain: Euclidean<F>, F: Float> Preconjugable<Domain, Domain, F> for Norm222<F> { |
| 104 | 354 | type Preconjugate<'a> |
| 355 | = Self | |
| 356 | where | |
| 357 | Self: 'a; | |
| 358 | ||
| 359 | #[inline] | |
| 360 | fn preconjugate(&self) -> Self::Preconjugate<'_> { | |
| 361 | Self::new() | |
| 362 | } | |
| 363 | } | |
| 364 | ||
| 105 | 365 | impl<Domain, F> Prox<Domain> for Norm222<F> |
| 104 | 366 | where |
| 367 | F: Float, | |
| 368 | Domain: Euclidean<F, Output = Domain>, | |
| 369 | { | |
| 370 | type Prox<'a> | |
| 371 | = Scaled<F> | |
| 372 | where | |
| 373 | Self: 'a; | |
| 374 | ||
| 375 | fn prox_mapping(&self, τ: F) -> Self::Prox<'_> { | |
| 376 | Scaled(F::ONE / (F::ONE + τ)) | |
| 377 | } | |
| 378 | } |