src/convex.rs

Mon, 06 Jan 2025 20:29:25 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 06 Jan 2025 20:29:25 -0500
branch
dev
changeset 86
d5b0e496b72f
parent 73
ca53a962106c
permissions
-rw-r--r--

More Serialize / Deserialize / Debug derives

58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Some convex analysis basics
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 */
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
5 use std::marker::PhantomData;
86
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
6 use serde::{Serialize, Deserialize};
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
7 use crate::types::*;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
8 use crate::mapping::{Mapping, Space};
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
9 use crate::linops::IdOp;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
10 use crate::instance::{Instance, InstanceMut, DecompositionMut};
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
11 use crate::operator_arithmetic::{Constant, Weighted};
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
12 use crate::norms::*;
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.
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
18 pub trait ConvexMapping<Domain : Space, F : Num = f64> : Mapping<Domain, Codomain = F>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
19 {}
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 /// Trait for mappings with a Fenchel conjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 /// not be convex.
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
25 pub trait Conjugable<Domain : HasDual<F>, F : Num = f64> : Mapping<Domain> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
26 type Conjugate<'a> : ConvexMapping<Domain::DualSpace, F> where Self : 'a;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 fn conjugate(&self) -> Self::Conjugate<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 }
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 /// Trait for mappings with a Fenchel preconjugate
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 ///
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 /// 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
34 /// but a `Preconjugable` mapping has to be convex.
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
35 pub trait Preconjugable<Domain, Predual, F : Num = f64> : ConvexMapping<Domain, F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
36 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
37 Domain : Space,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
38 Predual : HasDual<F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
39 {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
40 type Preconjugate<'a> : Mapping<Predual> where Self : 'a;
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 fn preconjugate(&self) -> Self::Preconjugate<'_>;
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 }
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 /// Trait for mappings with a proximap map
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 /// The conjugate type has to implement [`ConvexMapping`], but a `Conjugable` mapping need
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 /// not be convex.
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
49 pub trait Prox<Domain : Space> : Mapping<Domain> {
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 type Prox<'a> : Mapping<Domain, Codomain=Domain> where Self : 'a;
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 /// Returns a proximal mapping with weight τ
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 fn prox_mapping(&self, τ : Self::Codomain) -> Self::Prox<'_>;
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 /// Calculate the proximal mapping with weight τ
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
56 fn prox<I : Instance<Domain>>(&self, τ : Self::Codomain, z : I) -> Domain {
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 self.prox_mapping(τ).apply(z)
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
60 /// Calculate the proximal mapping with weight τ in-place
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
61 fn prox_mut<'b>(&self, τ : Self::Codomain, y : &'b mut Domain)
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
62 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
63 &'b mut Domain : InstanceMut<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
64 Domain:: Decomp : DecompositionMut<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
65 for<'a> &'a Domain : Instance<Domain>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
66 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
67 *y = self.prox(τ, &*y);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
68 }
58
1a38447a89fa Convex analysis basics
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 }
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
86
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
72 #[derive(Serialize,Deserialize,Debug,Clone)]
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
73 pub struct NormConstraint<F : Float, E : NormExponent> {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
74 radius : F,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
75 norm : NormMapping<F, E>,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
76 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
77
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
78
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
79 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
80 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
81 Domain : Space,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
82 E : NormExponent,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
83 F : Float,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
84 Self : Mapping<Domain, Codomain=F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
85 {}
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
86
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
87
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
88 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
89 where
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
90 Domain : Space + Norm<F, E>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
91 F : Float,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
92 E : NormExponent,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
93 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
94 type Codomain = F;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
95
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
96 fn apply<I : Instance<Domain>>(&self, d : I) -> F {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
97 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
98 F::ZERO
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
99 } else {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
100 F::INFINITY
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
101 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
102 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
103 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
104
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
105 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
106 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
107 Domain : Space,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
108 E : NormExponent,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
109 F : Float,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
110 Self : Mapping<Domain, Codomain=F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
111 {}
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
112
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
113
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
114 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
115 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
116 E : HasDualExponent,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
117 F : Float,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
118 Domain : HasDual<F> + Norm<F, E> + Space,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
119 <Domain as HasDual<F>>::DualSpace : Norm<F, E::DualExp>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
120 {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
121 type Conjugate<'a> = NormConstraint<F, E::DualExp> where Self : 'a;
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
122
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
123 fn conjugate(&self) -> Self::Conjugate<'_> {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
124 NormConstraint {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
125 radius : F::ONE,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
126 norm : self.exponent.dual_exponent().as_mapping()
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
127 }
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 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
130
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
131 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
132 where
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
133 C : Constant<Type = F>,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
134 E : HasDualExponent,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
135 F : Float,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
136 Domain : HasDual<F> + Norm<F, E> + Space,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
137 <Domain as HasDual<F>>::DualSpace : Norm<F, E::DualExp>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
138 {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
139 type Conjugate<'a> = NormConstraint<F, E::DualExp> where Self : 'a;
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
140
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
141 fn conjugate(&self) -> Self::Conjugate<'_> {
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
142 NormConstraint {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
143 radius : self.weight.value(),
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
144 norm : self.base_fn.exponent.dual_exponent().as_mapping()
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
145 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
146 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
147 }
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
148
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
149 impl<Domain, E, F> Prox<Domain> for NormConstraint<F, E>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
150 where
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
151 Domain : Space + Norm<F, E>,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
152 E : NormExponent,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
153 F : Float,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
154 NormProjection<F, E> : Mapping<Domain, Codomain=Domain>,
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 type Prox<'a> = NormProjection<F, E> where Self : 'a;
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 #[inline]
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
159 fn prox_mapping(&self, _τ : Self::Codomain) -> Self::Prox<'_> {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
160 assert!(self.radius >= F::ZERO);
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
161 NormProjection{ radius : self.radius, exponent : self.norm.exponent }
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
86
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
165 #[derive(Serialize,Deserialize,Debug,Clone)]
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
166 pub struct NormProjection<F : Float, E : NormExponent> {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
167 radius : F,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
168 exponent : E,
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
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
171 /*
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
172 impl<F, Domain> Mapping<Domain> for NormProjection<F, L2>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
173 where
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
174 Domain : Space + Euclidean<F> + std::ops::MulAssign<F>,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
175 F : Float,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
176 {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
177 type Codomain = Domain;
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 fn apply<I : Instance<Domain>>(&self, d : I) -> Domain {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
180 d.own().proj_ball2(self.radius)
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
181 }
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
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
185 impl<F, E, Domain> Mapping<Domain> for NormProjection<F, E>
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
186 where
73
ca53a962106c remove unneeded trait bound
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
187 Domain : Space + Projection<F, E>,
72
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
188 F : Float,
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
189 E : NormExponent,
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 type Codomain = Domain;
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 fn apply<I : Instance<Domain>>(&self, d : I) -> Domain {
44a4f258a1ff NormConstraint with radius
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
194 d.own().proj_ball(self.radius, self.exponent)
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
195 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
196 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
197
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
198
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
199 /// The zero mapping
86
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
200 #[derive(Serialize,Deserialize,Debug,Clone)]
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
201 pub struct Zero<Domain : Space, F : Num>(
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
202 #[serde(skip)]
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
203 PhantomData<(Domain, F)>
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
204 );
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
205
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
206 impl<Domain : Space, F : Num> Zero<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
207 pub fn new() -> Self {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
208 Zero(PhantomData)
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
209 }
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
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
212 impl<Domain : Space, F : Num> Mapping<Domain> for Zero<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
213 type Codomain = F;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
214
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
215 /// Compute the value of `self` at `x`.
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
216 fn apply<I : Instance<Domain>>(&self, _x : I) -> Self::Codomain {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
217 F::ZERO
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
218 }
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 impl<Domain : Space, F : Num> ConvexMapping<Domain, F> for Zero<Domain, F> { }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
222
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
223
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
224 impl<Domain : HasDual<F>, F : Float> Conjugable<Domain, F> for Zero<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
225 type Conjugate<'a> = ZeroIndicator<Domain::DualSpace, F> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
226
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
227 #[inline]
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
228 fn conjugate(&self) -> Self::Conjugate<'_> {
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
229 ZeroIndicator::new()
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
230 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 58
diff changeset
231 }
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 impl<Domain, Predual, F : Float> Preconjugable<Domain, Predual, F> for Zero<Domain, F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
234 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
235 Domain : Space,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
236 Predual : HasDual<F>
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 type Preconjugate<'a> = ZeroIndicator<Predual, F> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
239
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
240 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
241 fn preconjugate(&self) -> Self::Preconjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
242 ZeroIndicator::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
243 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
244 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
245
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
246 impl<Domain : Space + Clone, F : Num> Prox<Domain> for Zero<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
247 type Prox<'a> = IdOp<Domain> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
248
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
249 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
250 fn prox_mapping(&self, _τ : Self::Codomain) -> Self::Prox<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
251 IdOp::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
252 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
253 }
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
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
256 /// The zero indicator
86
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
257 #[derive(Serialize,Deserialize,Debug,Clone)]
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
258 pub struct ZeroIndicator<Domain : Space, F : Num>(
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
259 #[serde(skip)]
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
260 PhantomData<(Domain, F)>
d5b0e496b72f More Serialize / Deserialize / Debug derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 73
diff changeset
261 );
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 impl<Domain : Space, F : Num> ZeroIndicator<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
264 pub fn new() -> Self {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
265 ZeroIndicator(PhantomData)
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
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
269 impl<Domain : Normed<F>, F : Float> Mapping<Domain> for ZeroIndicator<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
270 type Codomain = F;
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 /// Compute the value of `self` at `x`.
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
273 fn apply<I : Instance<Domain>>(&self, x : I) -> Self::Codomain {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
274 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
275 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
276 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
277
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
278 impl<Domain : Normed<F>, F : Float> ConvexMapping<Domain, F> for ZeroIndicator<Domain, F> { }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
279
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
280 impl<Domain : HasDual<F>, F : Float> Conjugable<Domain, F> for ZeroIndicator<Domain, F> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
281 type Conjugate<'a> = Zero<Domain::DualSpace, F> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
282
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
283 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
284 fn conjugate(&self) -> Self::Conjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
285 Zero::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
286 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
287 }
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 impl<Domain, Predual, F : Float> Preconjugable<Domain, Predual, F> for ZeroIndicator<Domain, F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
290 where
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
291 Domain : Normed<F>,
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
292 Predual : HasDual<F>
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
293 {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
294 type Preconjugate<'a> = Zero<Predual, F> where Self : 'a;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
295
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
296 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
297 fn preconjugate(&self) -> Self::Preconjugate<'_> {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
298 Zero::new()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
299 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
300 }

mercurial