src/convex.rs

Fri, 05 Sep 2025 00:48:59 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 05 Sep 2025 00:48:59 -0500
branch
dev
changeset 177
b071a1b484f8
parent 168
93daa824c04a
permissions
-rw-r--r--

AXPY implementation reductions

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
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
5 use crate::error::DynResult;
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
6 use crate::euclidean::Euclidean;
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
7 use crate::instance::{ClosedSpace, DecompositionMut, Instance};
129
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
8 use crate::linops::{IdOp, Scaled, SimpleZeroOp, AXPY};
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
9 use crate::mapping::{DifferentiableImpl, LipschitzDifferentiableImpl, Mapping, Space};
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
10 use crate::norms::*;
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
11 use crate::operator_arithmetic::{Constant, Weighted};
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
12 use crate::types::*;
106
1256e7f7f7ad Added missing derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
13 use serde::{Deserialize, Serialize};
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
14 use std::marker::PhantomData;
58
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 /// Trait for convex mappings. Has no features, just serves as a constraint
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 /// TODO: should constrain `Mapping::Codomain` to implement a partial order,
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 /// but this makes everything complicated with little benefit.
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
20 pub trait ConvexMapping<Domain: Space, F: Num = f64>: Mapping<Domain, Codomain = F> {
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 108
diff changeset
21 /// Returns (a lower estimate of) the factor of strong convexity in the norm of `Domain`.
108
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
22 fn factor_of_strong_convexity(&self) -> F {
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
23 F::ZERO
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
24 }
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
25 }
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 /// Trait for mappings with a Fenchel conjugate
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 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 /// not be convex.
107
441d30e66a4a Missing restriction in Conjugable
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
31 pub trait Conjugable<Domain: HasDual<F>, F: Num = f64>: Mapping<Domain, Codomain = F> {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
32 type Conjugate<'a>: ConvexMapping<Domain::DualSpace, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
33 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
34 Self: 'a;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 fn conjugate(&self) -> Self::Conjugate<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 /// Trait for mappings with a Fenchel preconjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 /// 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
42 /// but a `Preconjugable` mapping has to be convex.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
43 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
44 where
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
45 Domain: Space,
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
46 Predual: HasDual<F>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
47 {
107
441d30e66a4a Missing restriction in Conjugable
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
48 type Preconjugate<'a>: Mapping<Predual, Codomain = F>
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
49 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
50 Self: 'a;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 fn preconjugate(&self) -> Self::Preconjugate<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 /// Trait for mappings with a proximap map
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 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 /// not be convex.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
59 pub trait Prox<Domain: Space>: Mapping<Domain> {
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
60 type Prox<'a>: Mapping<Domain, Codomain = Domain::Principal>
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
61 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
62 Self: 'a;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 /// Returns a proximal mapping with weight τ
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
65 fn prox_mapping(&self, τ: Self::Codomain) -> Self::Prox<'_>;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 /// Calculate the proximal mapping with weight τ
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
68 fn prox<I: Instance<Domain>>(&self, τ: Self::Codomain, z: I) -> Domain::Principal {
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 self.prox_mapping(τ).apply(z)
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 }
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 /// Calculate the proximal mapping with weight τ in-place
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
73 fn prox_mut<'b>(&self, τ: Self::Codomain, y: &'b mut Domain::Principal)
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
74 where
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
75 Domain::Decomp: DecompositionMut<Domain>,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
76 for<'a> &'a Domain::Principal: Instance<Domain>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
77 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
78 *y = self.prox(τ, &*y);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
79 }
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81
88
086a59b3a2b4 doc updates
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
82 /// Constraint to the unit ball of the norm described by `E`.
106
1256e7f7f7ad Added missing derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
83 #[derive(Copy, Clone, Debug, Serialize, Deserialize)]
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
84 pub struct NormConstraint<F: Float, E: NormExponent> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
85 radius: F,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
86 norm: NormMapping<F, E>,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
87 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
88
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
89 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
90 where
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
91 Domain: Space,
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
92 E: NormExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
93 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
94 Self: Mapping<Domain, Codomain = F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
95 {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
96 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
97
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
98 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
99 where
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
100 Domain: Space,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
101 Domain::Principal: Norm<E, F>,
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
102 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
103 E: NormExponent,
59
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 type Codomain = F;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
106
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
107 fn apply<I: Instance<Domain>>(&self, d: I) -> F {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
108 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
109 F::ZERO
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
110 } else {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
111 F::INFINITY
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
112 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
113 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
114 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
115
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
116 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
117 where
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
118 Domain: Space,
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
119 E: NormExponent,
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 Self: Mapping<Domain, Codomain = F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
122 {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
123 }
60
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<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
126 where
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
127 E: HasDualExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
128 F: Float,
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
129 Domain: HasDual<F>,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
130 Domain::Principal: Norm<E, F>,
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
131 <Domain as HasDual<F>>::DualSpace: Norm<E::DualExp, F>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
132 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
133 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
134 = NormConstraint<F, E::DualExp>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
135 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
136 Self: 'a;
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
137
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
138 fn conjugate(&self) -> Self::Conjugate<'_> {
146
3f9a03f95457 wrap sketch
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
139 NormConstraint { radius: F::ONE, norm: self.exponent.dual_exponent().as_mapping() }
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
140 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
141 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
142
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
143 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
144 where
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
145 C: Constant<Type = F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
146 E: HasDualExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
147 F: Float,
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
148 Domain: HasDual<F>,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
149 Domain::Principal: Norm<E, F>,
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
150 <Domain as HasDual<F>>::DualSpace: Norm<E::DualExp, F>,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
151 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
152 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
153 = NormConstraint<F, E::DualExp>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
154 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
155 Self: 'a;
60
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 fn conjugate(&self) -> Self::Conjugate<'_> {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
158 NormConstraint {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
159 radius: self.weight.value(),
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
160 norm: self.base_fn.exponent.dual_exponent().as_mapping(),
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
161 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
162 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
163 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
164
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
165 impl<Domain, E, F> Prox<Domain> for NormConstraint<F, E>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
166 where
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
167 Domain: Space,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
168 Domain::Principal: Norm<E, F>,
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
169 E: NormExponent,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
170 F: Float,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
171 NormProjection<F, E>: Mapping<Domain, Codomain = Domain::Principal>,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
172 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
173 type Prox<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
174 = NormProjection<F, E>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
175 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
176 Self: 'a;
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 #[inline]
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
179 fn prox_mapping(&self, _τ: Self::Codomain) -> Self::Prox<'_> {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
180 assert!(self.radius >= F::ZERO);
146
3f9a03f95457 wrap sketch
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
181 NormProjection { radius: self.radius, exponent: self.norm.exponent }
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
182 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
183 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
184
88
086a59b3a2b4 doc updates
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
185 /// Projection to the unit ball of the norm described by `E`.
106
1256e7f7f7ad Added missing derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
186 #[derive(Copy, Clone, Debug, Serialize, Deserialize)]
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
187 pub struct NormProjection<F: Float, E: NormExponent> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
188 radius: F,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
189 exponent: E,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
190 }
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 /*
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
193 impl<F, Domain> Mapping<Domain> for NormProjection<F, L2>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
194 where
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
195 Domain : Space + Euclidean<F> + std::ops::MulAssign<F>,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
196 F : Float,
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 type Codomain = Domain;
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 fn apply<I : Instance<Domain>>(&self, d : I) -> Domain {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
201 d.own().proj_ball2(self.radius)
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
202 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
203 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
204 */
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 impl<F, E, Domain> Mapping<Domain> for NormProjection<F, E>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
207 where
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
208 Domain: Space,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
209 Domain::Principal: ClosedSpace + Projection<F, E>,
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
210 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
211 E: NormExponent,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
212 {
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
213 type Codomain = Domain::Principal;
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
214
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
215 fn apply<I: Instance<Domain>>(&self, d: I) -> Self::Codomain {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
216 d.own().proj_ball(self.radius, self.exponent)
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
217 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
218 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
219
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
220 /// The zero mapping
106
1256e7f7f7ad Added missing derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
221 #[derive(Copy, Clone, Debug, Serialize, Deserialize)]
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
222 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
223
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
224 impl<Domain: Space, F: Num> Zero<Domain, F> {
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
225 pub fn new() -> Self {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
226 Zero(PhantomData)
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
227 }
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
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
230 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
231 type Codomain = F;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
232
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
233 /// Compute the value of `self` at `x`.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
234 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
235 F::ZERO
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
236 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
237 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
238
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
239 impl<Domain: Space, F: Float> ConvexMapping<Domain, F> for Zero<Domain, F> {}
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
240
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
241 impl<Domain: HasDual<F>, F: Float> Conjugable<Domain, F> for Zero<Domain, F> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
242 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
243 = ZeroIndicator<Domain::DualSpace, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
244 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
245 Self: 'a;
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
246
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
247 #[inline]
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
248 fn conjugate(&self) -> Self::Conjugate<'_> {
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
249 ZeroIndicator::new()
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
250 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
251 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
252
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
253 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
254 where
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 108
diff changeset
255 Domain: Normed<F>,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
256 Predual: HasDual<F, PrincipalV = Predual>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
257 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
258 type Preconjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
259 = ZeroIndicator<Predual, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
260 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
261 Self: 'a;
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
262
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
263 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
264 fn preconjugate(&self) -> Self::Preconjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
265 ZeroIndicator::new()
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 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
268
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
269 impl<Domain: Space, F: Num> Prox<Domain> for Zero<Domain, F> {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
270 type Prox<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
271 = IdOp<Domain>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
272 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
273 Self: 'a;
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
274
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
275 #[inline]
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
276 fn prox_mapping(&self, _τ: Self::Codomain) -> Self::Prox<'_> {
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
277 IdOp::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
278 }
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
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
281 /// The zero indicator
106
1256e7f7f7ad Added missing derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
282 #[derive(Copy, Clone, Debug, Serialize, Deserialize)]
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
283 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
284
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
285 impl<Domain: Space, F: Num> ZeroIndicator<Domain, F> {
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
286 pub fn new() -> Self {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
287 ZeroIndicator(PhantomData)
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
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
291 impl<Domain, F> Mapping<Domain> for ZeroIndicator<Domain, F>
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
292 where
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
293 F: Float,
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
294 Domain: Space,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
295 Domain::Principal: Normed<F>,
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
296 {
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
297 type Codomain = F;
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 /// Compute the value of `self` at `x`.
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
300 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
301 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
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
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
305 impl<Domain, F: Float> ConvexMapping<Domain, F> for ZeroIndicator<Domain, F>
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
306 where
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
307 Domain: Space,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
308 Domain::Principal: Normed<F>,
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
309 {
108
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
310 fn factor_of_strong_convexity(&self) -> F {
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
311 F::INFINITY
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
312 }
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
313 }
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
314
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
315 impl<Domain, F: Float> Conjugable<Domain, F> for ZeroIndicator<Domain, F>
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
316 where
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
317 Domain: HasDual<F>,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
318 Domain::PrincipalV: Normed<F>,
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
319 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
320 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
321 = Zero<Domain::DualSpace, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
322 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
323 Self: 'a;
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
324
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
325 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
326 fn conjugate(&self) -> Self::Conjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
327 Zero::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
328 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
329 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
330
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
331 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
332 where
163
b4a47e8e80d1 convexity etc. fubar
Tuomo Valkonen <tuomov@iki.fi>
parents: 154
diff changeset
333 Domain: Space,
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
334 Domain::Principal: Normed<F>,
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
335 Predual: HasDual<F>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
336 {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
337 type Preconjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
338 = Zero<Predual, F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
339 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
340 Self: 'a;
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
341
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
342 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
343 fn preconjugate(&self) -> Self::Preconjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
344 Zero::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
345 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
346 }
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
347
129
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
348 impl<Domain, F> Prox<Domain> for ZeroIndicator<Domain, F>
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
349 where
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
350 Domain: AXPY<Field = F, PrincipalV = Domain> + Normed<F>,
129
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
351 F: Float,
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
352 {
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
353 type Prox<'a>
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
354 = SimpleZeroOp
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
355 where
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
356 Self: 'a;
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
357
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
358 /// Returns a proximal mapping with weight τ
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
359 fn prox_mapping(&self, _τ: F) -> Self::Prox<'_> {
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
360 return SimpleZeroOp;
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
361 }
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
362 }
d2994e34a5f5 Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
363
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
364 /// The squared Euclidean norm divided by two
106
1256e7f7f7ad Added missing derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
365 #[derive(Copy, Clone, Serialize, Deserialize)]
105
Tuomo Valkonen <tuomov@iki.fi>
parents: 104
diff changeset
366 pub struct Norm222<F: Float>(PhantomData<F>);
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
367
105
Tuomo Valkonen <tuomov@iki.fi>
parents: 104
diff changeset
368 impl</*Domain: Euclidean<F>,*/ F: Float> Norm222<F> {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
369 pub fn new() -> Self {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
370 Norm222(PhantomData)
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
371 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
372 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
373
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
374 impl<X: Euclidean<F>, F: Float> Mapping<X> for Norm222<F> {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
375 type Codomain = F;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
376
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
377 /// Compute the value of `self` at `x`.
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
378 fn apply<I: Instance<X>>(&self, x: I) -> Self::Codomain {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
379 x.eval(|z| z.norm2_squared() / F::TWO)
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
380 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
381 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
382
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
383 impl<X: Euclidean<F>, F: Float> ConvexMapping<X, F> for Norm222<F> {
108
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
384 fn factor_of_strong_convexity(&self) -> F {
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
385 F::ONE
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
386 }
6be459f08b66 factor_of_strong_convexity
Tuomo Valkonen <tuomov@iki.fi>
parents: 107
diff changeset
387 }
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
388
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
389 impl<X: Euclidean<F>, F: Float> Conjugable<X, F> for Norm222<F> {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
390 type Conjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
391 = Self
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
392 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
393 Self: 'a;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
394
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
395 #[inline]
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
396 fn conjugate(&self) -> Self::Conjugate<'_> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
397 Self::new()
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
398 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
399 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
400
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
401 impl<X: Euclidean<F>, F: Float> Preconjugable<X, X, F> for Norm222<F> {
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
402 type Preconjugate<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
403 = Self
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
404 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
405 Self: 'a;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
406
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
407 #[inline]
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
408 fn preconjugate(&self) -> Self::Preconjugate<'_> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
409 Self::new()
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
410 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
411 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
412
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
413 impl<X, F> Prox<X> for Norm222<F>
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
414 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
415 F: Float,
151
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
416 X: Euclidean<F>,
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
417 {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
418 type Prox<'a>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
419 = Scaled<F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
420 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
421 Self: 'a;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
422
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
423 fn prox_mapping(&self, τ: F) -> Self::Prox<'_> {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
424 Scaled(F::ONE / (F::ONE + τ))
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
425 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 88
diff changeset
426 }
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
427
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
428 impl<X, F> DifferentiableImpl<X> for Norm222<F>
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
429 where
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
430 F: Float,
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
431 X: Euclidean<F>,
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
432 {
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 163
diff changeset
433 type Derivative = X::PrincipalV;
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
434
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
435 fn differential_impl<I: Instance<X>>(&self, x: I) -> Self::Derivative {
168
93daa824c04a No supertraits for Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
436 x.own()
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
437 }
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
438 }
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
439
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
440 impl<X, F> LipschitzDifferentiableImpl<X, L2> for Norm222<F>
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
441 where
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
442 F: Float,
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
443 X: Euclidean<F>,
112
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
444 {
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
445 type FloatType = F;
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
446
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
447 fn diff_lipschitz_factor(&self, _: L2) -> DynResult<Self::FloatType> {
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
448 Ok(F::ONE)
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
449 }
ed8124f1af1d Missing Norm222 traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
450 }

mercurial