src/convex.rs

Tue, 29 Apr 2025 00:03:12 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 29 Apr 2025 00:03:12 -0500
branch
dev
changeset 104
e7f1cb4bec78
parent 88
086a59b3a2b4
child 105
103aa137fcb2
permissions
-rw-r--r--

Norm222

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
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
5 use crate::euclidean::Euclidean;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
6 use crate::instance::{DecompositionMut, Instance, InstanceMut};
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
9 use crate::norms::*;
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
10 use crate::operator_arithmetic::{Constant, Weighted};
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
11 use crate::types::*;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
12 use std::marker::PhantomData;
58
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 /// Trait for convex mappings. Has no features, just serves as a constraint
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 /// TODO: should constrain `Mapping::Codomain` to implement a partial order,
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 /// but this makes everything complicated with little benefit.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
18 pub trait ConvexMapping<Domain: Space, F: Num = f64>: Mapping<Domain, Codomain = F> {}
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 /// Trait for mappings with a Fenchel conjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 /// not be convex.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
24 pub trait Conjugable<Domain: HasDual<F>, F: Num = f64>: Mapping<Domain> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
25 type Conjugate<'a>: ConvexMapping<Domain::DualSpace, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
26 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
27 Self: 'a;
58
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 fn conjugate(&self) -> Self::Conjugate<'_>;
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
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 /// Trait for mappings with a Fenchel preconjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
38 Domain: Space,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
39 Predual: HasDual<F>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
40 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
41 type Preconjugate<'a>: Mapping<Predual>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
42 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
43 Self: 'a;
58
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 fn preconjugate(&self) -> Self::Preconjugate<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 /// Trait for mappings with a proximap map
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 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 /// not be convex.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
52 pub trait Prox<Domain: Space>: Mapping<Domain> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
53 type Prox<'a>: Mapping<Domain, Codomain = Domain>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
54 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
55 Self: 'a;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 /// Returns a proximal mapping with weight τ
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
58 fn prox_mapping(&self, τ: Self::Codomain) -> Self::Prox<'_>;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 /// Calculate the proximal mapping with weight τ
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
61 fn prox<I: Instance<Domain>>(&self, τ: Self::Codomain, z: I) -> Domain {
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 self.prox_mapping(τ).apply(z)
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
68 &'b mut Domain: InstanceMut<Domain>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
69 Domain::Decomp: DecompositionMut<Domain>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75
88
086a59b3a2b4 doc updates
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
76 /// Constraint to the unit ball of the norm described by `E`.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
77 pub struct NormConstraint<F: Float, E: NormExponent> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
78 radius: F,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
79 norm: NormMapping<F, E>,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
80 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
84 Domain: Space,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
85 E: NormExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
86 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
87 Self: Mapping<Domain, Codomain = F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
88 {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
89 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
90
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
93 Domain: Space + Norm<F, E>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
94 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
99 fn apply<I: Instance<Domain>>(&self, d: I) -> F {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
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
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
110 Domain: Space,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
111 E: NormExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
112 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
113 Self: Mapping<Domain, Codomain = F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
114 {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
119 E: HasDualExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
120 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
121 Domain: HasDual<F> + Norm<F, E> + Space,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
124 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
125 = NormConstraint<F, E::DualExp>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
126 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
127 Self: 'a;
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
128
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
129 fn conjugate(&self) -> Self::Conjugate<'_> {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
130 NormConstraint {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
131 radius: F::ONE,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
132 norm: self.exponent.dual_exponent().as_mapping(),
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
133 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
134 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
135 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
136
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
137 impl<C, E, F, Domain> Conjugable<Domain, F> for Weighted<NormMapping<F, E>, C>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
138 where
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
139 C: Constant<Type = F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
140 E: HasDualExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
141 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
142 Domain: HasDual<F> + Norm<F, E> + Space,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
143 <Domain as HasDual<F>>::DualSpace: Norm<F, E::DualExp>,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
144 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
145 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
146 = NormConstraint<F, E::DualExp>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
147 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
151 NormConstraint {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
152 radius: self.weight.value(),
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
153 norm: self.base_fn.exponent.dual_exponent().as_mapping(),
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
154 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
155 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
156 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
157
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
158 impl<Domain, E, F> Prox<Domain> for NormConstraint<F, E>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
159 where
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
160 Domain: Space + Norm<F, E>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
161 E: NormExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
162 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
163 NormProjection<F, E>: Mapping<Domain, Codomain = Domain>,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
164 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
165 type Prox<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
166 = NormProjection<F, E>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
167 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
168 Self: 'a;
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
169
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
170 #[inline]
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
171 fn prox_mapping(&self, _τ: Self::Codomain) -> Self::Prox<'_> {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
172 assert!(self.radius >= F::ZERO);
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
173 NormProjection {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
174 radius: self.radius,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
175 exponent: self.norm.exponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
176 }
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
177 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
178 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
179
88
086a59b3a2b4 doc updates
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
180 /// Projection to the unit ball of the norm described by `E`.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
181 pub struct NormProjection<F: Float, E: NormExponent> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
182 radius: F,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
183 exponent: E,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
184 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
185
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
186 /*
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
187 impl<F, Domain> Mapping<Domain> for NormProjection<F, L2>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
188 where
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
189 Domain : Space + Euclidean<F> + std::ops::MulAssign<F>,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
190 F : Float,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
191 {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
192 type Codomain = Domain;
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
193
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
194 fn apply<I : Instance<Domain>>(&self, d : I) -> Domain {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
195 d.own().proj_ball2(self.radius)
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
196 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
197 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
198 */
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
199
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
200 impl<F, E, Domain> Mapping<Domain> for NormProjection<F, E>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
201 where
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
202 Domain: Space + Projection<F, E>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
203 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
204 E: NormExponent,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
205 {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
206 type Codomain = Domain;
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
207
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
208 fn apply<I: Instance<Domain>>(&self, d: I) -> Domain {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
213 /// The zero mapping
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
233 impl<Domain: HasDual<F>, F: Float> Conjugable<Domain, F> for Zero<Domain, F> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
234 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
235 = ZeroIndicator<Domain::DualSpace, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
236 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
247 Domain: Space,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
248 Predual: HasDual<F>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
249 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
250 type Preconjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
251 = ZeroIndicator<Predual, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
252 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
261 impl<Domain: Space + Clone, F: Num> Prox<Domain> for Zero<Domain, F> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
262 type Prox<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
263 = IdOp<Domain>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
264 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
273 /// The zero indicator
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
293 impl<Domain: HasDual<F>, F: Float> Conjugable<Domain, F> for ZeroIndicator<Domain, F> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
294 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
295 = Zero<Domain::DualSpace, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
296 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
307 Domain: Normed<F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
308 Predual: HasDual<F>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
309 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
310 type Preconjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
311 = Zero<Predual, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
312 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
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
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
320
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
321 /// The squared Euclidean norm divided by two
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
322 pub struct Norm222<Domain: Space, F: Float>(PhantomData<(Domain, F)>);
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
323
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
324 impl<Domain: Euclidean<F>, F: Float> Norm222<Domain, F> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
325 pub fn new() -> Self {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
326 Norm222(PhantomData)
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
327 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
328 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
329
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
330 impl<Domain: Euclidean<F>, F: Float> Mapping<Domain> for Norm222<Domain, F> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
331 type Codomain = F;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
332
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
333 /// Compute the value of `self` at `x`.
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
334 fn apply<I: Instance<Domain>>(&self, x: I) -> Self::Codomain {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
335 x.eval(|z| z.norm2_squared() / F::TWO)
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
336 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
337 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
338
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
339 impl<Domain: Euclidean<F>, F: Float> ConvexMapping<Domain, F> for Norm222<Domain, F> {}
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
340
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
341 impl<Domain: Euclidean<F>, F: Float> Conjugable<Domain, F> for Norm222<Domain, F> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
342 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
343 = Self
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
344 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
345 Self: 'a;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
346
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
347 #[inline]
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
348 fn conjugate(&self) -> Self::Conjugate<'_> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
349 Self::new()
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
350 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
351 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
352
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
353 impl<Domain: Euclidean<F>, F: Float> Preconjugable<Domain, Domain, F> for Norm222<Domain, F> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
354 type Preconjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
355 = Self
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
356 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
357 Self: 'a;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
358
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
359 #[inline]
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
360 fn preconjugate(&self) -> Self::Preconjugate<'_> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
361 Self::new()
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
362 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
363 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
364
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
365 impl<Domain, F> Prox<Domain> for Norm222<Domain, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
366 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
367 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
368 Domain: Euclidean<F, Output = Domain>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
369 {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
370 type Prox<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
371 = Scaled<F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
372 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
373 Self: 'a;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
374
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
375 fn prox_mapping(&self, τ: F) -> Self::Prox<'_> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
376 Scaled(F::ONE / (F::ONE + τ))
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
377 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
378 }

mercurial