src/convex.rs

branch
dev
changeset 105
103aa137fcb2
parent 104
e7f1cb4bec78
child 106
1256e7f7f7ad
equal deleted inserted replaced
104:e7f1cb4bec78 105:103aa137fcb2
317 Zero::new() 317 Zero::new()
318 } 318 }
319 } 319 }
320 320
321 /// The squared Euclidean norm divided by two 321 /// The squared Euclidean norm divided by two
322 pub struct Norm222<Domain: Space, F: Float>(PhantomData<(Domain, F)>); 322 pub struct Norm222<F: Float>(PhantomData<F>);
323 323
324 impl<Domain: Euclidean<F>, F: Float> Norm222<Domain, F> { 324 impl</*Domain: Euclidean<F>,*/ F: Float> Norm222<F> {
325 pub fn new() -> Self { 325 pub fn new() -> Self {
326 Norm222(PhantomData) 326 Norm222(PhantomData)
327 } 327 }
328 } 328 }
329 329
330 impl<Domain: Euclidean<F>, F: Float> Mapping<Domain> for Norm222<Domain, F> { 330 impl<Domain: Euclidean<F>, F: Float> Mapping<Domain> for Norm222<F> {
331 type Codomain = F; 331 type Codomain = F;
332 332
333 /// Compute the value of `self` at `x`. 333 /// Compute the value of `self` at `x`.
334 fn apply<I: Instance<Domain>>(&self, x: I) -> Self::Codomain { 334 fn apply<I: Instance<Domain>>(&self, x: I) -> Self::Codomain {
335 x.eval(|z| z.norm2_squared() / F::TWO) 335 x.eval(|z| z.norm2_squared() / F::TWO)
336 } 336 }
337 } 337 }
338 338
339 impl<Domain: Euclidean<F>, F: Float> ConvexMapping<Domain, F> for Norm222<Domain, F> {} 339 impl<Domain: Euclidean<F>, F: Float> ConvexMapping<Domain, F> for Norm222<F> {}
340 340
341 impl<Domain: Euclidean<F>, F: Float> Conjugable<Domain, F> for Norm222<Domain, F> { 341 impl<Domain: Euclidean<F>, F: Float> Conjugable<Domain, F> for Norm222<F> {
342 type Conjugate<'a> 342 type Conjugate<'a>
343 = Self 343 = Self
344 where 344 where
345 Self: 'a; 345 Self: 'a;
346 346
348 fn conjugate(&self) -> Self::Conjugate<'_> { 348 fn conjugate(&self) -> Self::Conjugate<'_> {
349 Self::new() 349 Self::new()
350 } 350 }
351 } 351 }
352 352
353 impl<Domain: Euclidean<F>, F: Float> Preconjugable<Domain, Domain, F> for Norm222<Domain, F> { 353 impl<Domain: Euclidean<F>, F: Float> Preconjugable<Domain, Domain, F> for Norm222<F> {
354 type Preconjugate<'a> 354 type Preconjugate<'a>
355 = Self 355 = Self
356 where 356 where
357 Self: 'a; 357 Self: 'a;
358 358
360 fn preconjugate(&self) -> Self::Preconjugate<'_> { 360 fn preconjugate(&self) -> Self::Preconjugate<'_> {
361 Self::new() 361 Self::new()
362 } 362 }
363 } 363 }
364 364
365 impl<Domain, F> Prox<Domain> for Norm222<Domain, F> 365 impl<Domain, F> Prox<Domain> for Norm222<F>
366 where 366 where
367 F: Float, 367 F: Float,
368 Domain: Euclidean<F, Output = Domain>, 368 Domain: Euclidean<F, Output = Domain>,
369 { 369 {
370 type Prox<'a> 370 type Prox<'a>

mercurial