rateslib/dual/dual_ops/
zero.rs

1use crate::dual::dual::{Dual, Dual2};
2use crate::dual::enums::Number;
3use num_traits::Zero;
4
5impl Zero for Dual {
6    fn zero() -> Dual {
7        Dual::new(0.0, Vec::new())
8    }
9
10    fn is_zero(&self) -> bool {
11        *self == Dual::new(0.0, Vec::new())
12    }
13}
14
15impl Zero for Dual2 {
16    fn zero() -> Dual2 {
17        Dual2::new(0.0, Vec::new())
18    }
19
20    fn is_zero(&self) -> bool {
21        *self == Dual2::new(0.0, Vec::new())
22    }
23}
24
25impl Zero for Number {
26    fn zero() -> Number {
27        Number::F64(0.0_f64)
28    }
29
30    fn is_zero(&self) -> bool {
31        match self {
32            Number::F64(f) => *f == 0.0_f64,
33            Number::Dual(d) => *d == Dual::new(0.0, vec![]),
34            Number::Dual2(d) => *d == Dual2::new(0.0, vec![]),
35        }
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn is_zero_() {
45        assert!(Dual::zero().is_zero())
46    }
47
48    #[test]
49    fn is_zero2() {
50        let d = Dual2::zero();
51        assert!(d.is_zero());
52    }
53
54    #[test]
55    fn is_zero_enum() {
56        let d = Number::Dual2(Dual2::zero());
57        assert!(d.is_zero());
58    }
59}