| 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 |