src/convex.rs

branch
dev
changeset 86
d5b0e496b72f
parent 73
ca53a962106c
equal deleted inserted replaced
76:99ad55974e62 86:d5b0e496b72f
1 /*! 1 /*!
2 Some convex analysis basics 2 Some convex analysis basics
3 */ 3 */
4 4
5 use std::marker::PhantomData; 5 use std::marker::PhantomData;
6 use serde::{Serialize, Deserialize};
6 use crate::types::*; 7 use crate::types::*;
7 use crate::mapping::{Mapping, Space}; 8 use crate::mapping::{Mapping, Space};
8 use crate::linops::IdOp; 9 use crate::linops::IdOp;
9 use crate::instance::{Instance, InstanceMut, DecompositionMut}; 10 use crate::instance::{Instance, InstanceMut, DecompositionMut};
10 use crate::operator_arithmetic::{Constant, Weighted}; 11 use crate::operator_arithmetic::{Constant, Weighted};
66 *y = self.prox(τ, &*y); 67 *y = self.prox(τ, &*y);
67 } 68 }
68 } 69 }
69 70
70 71
72 #[derive(Serialize,Deserialize,Debug,Clone)]
71 pub struct NormConstraint<F : Float, E : NormExponent> { 73 pub struct NormConstraint<F : Float, E : NormExponent> {
72 radius : F, 74 radius : F,
73 norm : NormMapping<F, E>, 75 norm : NormMapping<F, E>,
74 } 76 }
75 77
158 assert!(self.radius >= F::ZERO); 160 assert!(self.radius >= F::ZERO);
159 NormProjection{ radius : self.radius, exponent : self.norm.exponent } 161 NormProjection{ radius : self.radius, exponent : self.norm.exponent }
160 } 162 }
161 } 163 }
162 164
165 #[derive(Serialize,Deserialize,Debug,Clone)]
163 pub struct NormProjection<F : Float, E : NormExponent> { 166 pub struct NormProjection<F : Float, E : NormExponent> {
164 radius : F, 167 radius : F,
165 exponent : E, 168 exponent : E,
166 } 169 }
167 170
192 } 195 }
193 } 196 }
194 197
195 198
196 /// The zero mapping 199 /// The zero mapping
197 pub struct Zero<Domain : Space, F : Num>(PhantomData<(Domain, F)>); 200 #[derive(Serialize,Deserialize,Debug,Clone)]
201 pub struct Zero<Domain : Space, F : Num>(
202 #[serde(skip)]
203 PhantomData<(Domain, F)>
204 );
198 205
199 impl<Domain : Space, F : Num> Zero<Domain, F> { 206 impl<Domain : Space, F : Num> Zero<Domain, F> {
200 pub fn new() -> Self { 207 pub fn new() -> Self {
201 Zero(PhantomData) 208 Zero(PhantomData)
202 } 209 }
245 } 252 }
246 } 253 }
247 254
248 255
249 /// The zero indicator 256 /// The zero indicator
250 pub struct ZeroIndicator<Domain : Space, F : Num>(PhantomData<(Domain, F)>); 257 #[derive(Serialize,Deserialize,Debug,Clone)]
258 pub struct ZeroIndicator<Domain : Space, F : Num>(
259 #[serde(skip)]
260 PhantomData<(Domain, F)>
261 );
251 262
252 impl<Domain : Space, F : Num> ZeroIndicator<Domain, F> { 263 impl<Domain : Space, F : Num> ZeroIndicator<Domain, F> {
253 pub fn new() -> Self { 264 pub fn new() -> Self {
254 ZeroIndicator(PhantomData) 265 ZeroIndicator(PhantomData)
255 } 266 }

mercurial