rateslib/curves/
nodes.rs

1use crate::dual::{Dual, Dual2, Number};
2use chrono::{DateTime, NaiveDateTime};
3use indexmap::IndexMap;
4use serde::{Deserialize, Serialize};
5use std::cmp::PartialEq;
6
7/// Datetime indexed values of a specific [ADOrder](`crate::dual::ADOrder`).
8#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
9pub enum Nodes {
10    F64(IndexMap<NaiveDateTime, f64>),
11    Dual(IndexMap<NaiveDateTime, Dual>),
12    Dual2(IndexMap<NaiveDateTime, Dual2>),
13}
14
15#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
16pub enum NodesTimestamp {
17    F64(IndexMap<i64, f64>),
18    Dual(IndexMap<i64, Dual>),
19    Dual2(IndexMap<i64, Dual2>),
20}
21
22impl NodesTimestamp {
23    pub fn first_key(&self) -> i64 {
24        match self {
25            NodesTimestamp::F64(m) => *m.first().unwrap().0,
26            NodesTimestamp::Dual(m) => *m.first().unwrap().0,
27            NodesTimestamp::Dual2(m) => *m.first().unwrap().0,
28        }
29    }
30}
31
32impl From<Nodes> for NodesTimestamp {
33    fn from(value: Nodes) -> Self {
34        match value {
35            Nodes::F64(m) => NodesTimestamp::F64(IndexMap::from_iter(
36                m.into_iter().map(|(k, v)| (k.and_utc().timestamp(), v)),
37            )),
38            Nodes::Dual(m) => NodesTimestamp::Dual(IndexMap::from_iter(
39                m.into_iter().map(|(k, v)| (k.and_utc().timestamp(), v)),
40            )),
41            Nodes::Dual2(m) => NodesTimestamp::Dual2(IndexMap::from_iter(
42                m.into_iter().map(|(k, v)| (k.and_utc().timestamp(), v)),
43            )),
44        }
45    }
46}
47
48impl From<NodesTimestamp> for Nodes {
49    fn from(value: NodesTimestamp) -> Self {
50        match value {
51            NodesTimestamp::F64(m) => {
52                Nodes::F64(IndexMap::from_iter(m.into_iter().map(|(k, v)| {
53                    (DateTime::from_timestamp(k, 0).unwrap().naive_utc(), v)
54                })))
55            }
56            NodesTimestamp::Dual(m) => {
57                Nodes::Dual(IndexMap::from_iter(m.into_iter().map(|(k, v)| {
58                    (DateTime::from_timestamp(k, 0).unwrap().naive_utc(), v)
59                })))
60            }
61            NodesTimestamp::Dual2(m) => {
62                Nodes::Dual2(IndexMap::from_iter(m.into_iter().map(|(k, v)| {
63                    (DateTime::from_timestamp(k, 0).unwrap().naive_utc(), v)
64                })))
65            }
66        }
67    }
68}
69
70impl NodesTimestamp {
71    // fn keys_as_f64(&self) -> Vec<f64> {
72    //     match self {
73    //         NodesTimestamp::F64(m) => m.keys().cloned().map(|x| x as f64).collect(),
74    //         NodesTimestamp::Dual(m) => m.keys().cloned().map(|x| x as f64).collect(),
75    //         NodesTimestamp::Dual2(m) => m.keys().cloned().map(|x| x as f64).collect(),
76    //     }
77    // }
78
79    pub(crate) fn sort_keys(&mut self) {
80        match self {
81            NodesTimestamp::F64(m) => m.sort_keys(),
82            NodesTimestamp::Dual(m) => m.sort_keys(),
83            NodesTimestamp::Dual2(m) => m.sort_keys(),
84        }
85    }
86
87    pub(crate) fn keys(&self) -> Vec<i64> {
88        match self {
89            NodesTimestamp::F64(m) => m.keys().cloned().collect(),
90            NodesTimestamp::Dual(m) => m.keys().cloned().collect(),
91            NodesTimestamp::Dual2(m) => m.keys().cloned().collect(),
92        }
93    }
94
95    pub(crate) fn index_map(&self) -> IndexMap<NaiveDateTime, Number> {
96        macro_rules! create_map {
97            ($map:ident, $Variant:ident) => {
98                IndexMap::from_iter($map.clone().into_iter().map(|(k, v)| {
99                    (
100                        DateTime::from_timestamp(k, 0).unwrap().naive_utc(),
101                        Number::$Variant(v),
102                    )
103                }))
104            };
105        }
106
107        match self {
108            NodesTimestamp::F64(m) => create_map!(m, F64),
109            NodesTimestamp::Dual(m) => create_map!(m, Dual),
110            NodesTimestamp::Dual2(m) => create_map!(m, Dual2),
111        }
112    }
113}
114
115//     /// Refactors the `get_index` method of an IndexMap and type casts the return values.
116//     pub(crate) fn get_index_as_f64(&self, index: usize) -> (f64, Number) {
117//         match self {
118//             NodesTimestamp::F64(m) => {
119//                 let (k, v) = m.get_index(index).unwrap();
120//                 (*k as f64, Number::F64(*v))
121//             },
122//             NodesTimestamp::Dual(m) => {
123//                 let (k, v) = m.get_index(index).unwrap();
124//                 (*k as f64, Number::Dual(v.clone()))
125//             },
126//             NodesTimestamp::Dual2(m) => {
127//                 let (k, v) = m.get_index(index).unwrap();
128//                 (*k as f64, Number::Dual2(v.clone()))
129//             },
130//         }
131//     }