rateslib/dual/dual_ops/
convert.rs1use crate::dual::dual::{Dual, Dual2};
2use crate::dual::enums::{ADOrder, Number};
3use std::convert::From;
4
5pub fn set_order(value: Number, order: ADOrder, vars: Vec<String>) -> Number {
31 match (value, order) {
32 (Number::F64(f), ADOrder::Zero) => Number::F64(f),
33 (Number::Dual(d), ADOrder::Zero) => Number::F64(d.real),
34 (Number::Dual2(d), ADOrder::Zero) => Number::F64(d.real),
35 (Number::F64(f), ADOrder::One) => Number::Dual(Dual::new(f, vars)),
36 (Number::Dual(d), ADOrder::One) => Number::Dual(d),
37 (Number::Dual2(d), ADOrder::One) => Number::Dual(Dual::from(d)),
38 (Number::F64(f), ADOrder::Two) => Number::Dual2(Dual2::new(f, vars)),
39 (Number::Dual(d), ADOrder::Two) => Number::Dual2(Dual2::from(d)),
40 (Number::Dual2(d), ADOrder::Two) => Number::Dual2(d),
41 }
42}
43
44pub fn set_order_clone(value: &Number, order: ADOrder, vars: Vec<String>) -> Number {
48 match (value, order) {
49 (Number::F64(f), ADOrder::Zero) => Number::F64(*f),
50 (Number::Dual(d), ADOrder::Zero) => Number::F64(d.real),
51 (Number::Dual2(d), ADOrder::Zero) => Number::F64(d.real),
52 (Number::F64(f), ADOrder::One) => Number::Dual(Dual::new(*f, vars)),
53 (Number::Dual(d), ADOrder::One) => Number::Dual(d.clone()),
54 (Number::Dual2(d), ADOrder::One) => Number::Dual(Dual::from(d)),
55 (Number::F64(f), ADOrder::Two) => Number::Dual2(Dual2::new(*f, vars)),
56 (Number::Dual(d), ADOrder::Two) => Number::Dual2(Dual2::from(d)),
57 (Number::Dual2(d), ADOrder::Two) => Number::Dual2(d.clone()),
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn test_set_order_with_conversion() {
67 let f = 2.5_f64;
68 let d = set_order(Number::F64(f), ADOrder::One, vec!["var1".to_string()]);
69 assert_eq!(d, Number::Dual(Dual::new(2.5, vec!["var1".to_string()])));
70
71 let d2 = set_order(d, ADOrder::Two, vec![]);
72 assert_eq!(d2, Number::Dual2(Dual2::new(2.5, vec!["var1".to_string()])));
73
74 let f = set_order(d2, ADOrder::Zero, vec![]);
75 assert_eq!(f, Number::F64(2.5_f64));
76 }
77
78 #[test]
79 fn test_docstring() {
80 let f_ = Number::F64(2.5_f64);
81 let d_ = set_order(f_, ADOrder::One, vec!["x".to_string()]);
82 let d = Dual::from(d_);
83 assert_eq!(d, Dual::new(2.5_f64, vec!["x".to_string()])); }
85}