linfa_logistic/
float.rs

1use crate::argmin_param::ArgminParam;
2use argmin::core::ArgminFloat;
3use argmin_math::ArgminMul;
4use ndarray::{Dimension, Ix1, Ix2, NdFloat};
5use num_traits::FromPrimitive;
6
7/// A Float trait that captures the requirements we need for the various
8/// places we use floats. These are basically imposed by NdArray and Argmin.
9pub 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}