1use crate::argmin_param::ArgminParam;
2use argmin::core::ArgminFloat;
3use argmin_math::ArgminMul;
4use ndarray::{Dimension, Ix1, Ix2, NdFloat};
5use num_traits::FromPrimitive;
6
7pub trait Float:
10 ArgminFloat
11 + NdFloat
12 + Default
13 + Clone
14 + FromPrimitive
15 + ArgminMul<ArgminParam<Self, Ix1>, ArgminParam<Self, Ix1>>
16 + ArgminMul<ArgminParam<Self, Ix2>, ArgminParam<Self, Ix2>>
17 + linfa::Float
18{
19 const POSITIVE_LABEL: Self;
20 const NEGATIVE_LABEL: Self;
21}
22
23impl<D: Dimension> ArgminMul<ArgminParam<Self, D>, ArgminParam<Self, D>> for f64 {
24 fn mul(&self, other: &ArgminParam<Self, D>) -> ArgminParam<Self, D> {
25 ArgminParam(&other.0 * *self)
26 }
27}
28
29impl<D: Dimension> ArgminMul<ArgminParam<Self, D>, ArgminParam<Self, D>> for f32 {
30 fn mul(&self, other: &ArgminParam<Self, D>) -> ArgminParam<Self, D> {
31 ArgminParam(&other.0 * *self)
32 }
33}
34
35impl Float for f32 {
36 const POSITIVE_LABEL: Self = 1.0;
37 const NEGATIVE_LABEL: Self = -1.0;
38}
39
40impl Float for f64 {
41 const POSITIVE_LABEL: Self = 1.0;
42 const NEGATIVE_LABEL: Self = -1.0;
43}