ftp_core/common/
func_ftp_rate.rs

1use crate::holding_struct::FtpResult;
2
3pub fn func_ftp_rate(ftp_result: &mut FtpResult, rownum: usize, colnum: usize, ncols: usize) {
4    let m_input_rate = &ftp_result.input_rate;
5
6    let m_stock_instal = match &ftp_result.stock_instal {
7        Some(m_stock_instal) => m_stock_instal,
8        None => {
9            eprintln!("m_stock_instal is None, cannot read value.");
10            return;
11        }
12    };
13
14    let m_varstock_instal = match &ftp_result.varstock_instal {
15        Some(m_varstock_instal) => m_varstock_instal,
16        None => {
17            eprintln!("m_varstock_instal is None, cannot read value.");
18            return;
19        }
20    };
21
22    let m_market_rate = match &ftp_result.market_rate {
23        Some(m_market_rate) => m_market_rate,
24        None => {
25            eprintln!("market_rate is None, cannot read value.");
26            return;
27        }
28    };
29
30    if let Some(ftp_rate) = &mut ftp_result.ftp_rate {
31        if rownum == 0 {
32            let mut num = 0.0;
33            let mut denum = 0.0;
34
35            for k in colnum..ncols - 1 {
36                num += m_varstock_instal[[0, k + 1]] * m_input_rate[[0, k]];
37                denum += m_varstock_instal[[0, k + 1]];
38            }
39
40            if denum != 0.0 {
41                ftp_rate[[rownum, colnum]] = num / denum;
42            } else {
43                ftp_rate[[rownum, colnum]] = 0.0;
44            }
45        } else {
46            // rownum > 0
47            let mut num1 = 0.0;
48            let mut num2 = 0.0;
49
50            let mut denum1 = 0.0;
51            let mut denum2 = 0.0;
52
53            for k in colnum..ncols - 1 {
54                num1 += m_varstock_instal[[rownum, k + 1]] * m_input_rate[[rownum, k]];
55                denum1 += m_varstock_instal[[rownum, k + 1]];
56                if k > colnum {
57                    num2 +=
58                        m_stock_instal[[rownum - 1, k + 1]] * m_market_rate[[rownum - 1, k + 1]];
59                    denum2 += m_stock_instal[[rownum - 1, k + 1]];
60                }
61            }
62
63            if denum1 + denum2 != 0.0 {
64                ftp_rate[[rownum, colnum]] = (num1 + num2) / (denum1 + denum2);
65            } else {
66                ftp_rate[[rownum, colnum]] = 0.0;
67            }
68        }
69    } else {
70        eprintln!("ftp_rate is None, cannot update value.");
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use crate::holding_struct::FtpResult;
78    use ndarray::{array, Array2};
79
80    fn create_test_ftp_result() -> FtpResult {
81        let outstanding = array![[1000.0], [1200.0]];
82        let profiles = array![[1.0, 0.5, 0.2], [1.0, 0.5, 0.2]];
83        let rates = array![[0.01, 0.02], [0.015, 0.025]];
84
85        let mut ftp_result = FtpResult::new(outstanding, profiles, rates);
86
87        // Initialiser les matrices optionnelles nécessaires
88        let (nrows, ncols) = ftp_result.input_profiles.dim();
89        ftp_result.varstock_instal = Some(Array2::<f64>::ones((nrows, ncols)));
90        ftp_result.stock_instal = Some(Array2::<f64>::ones((nrows, ncols)));
91        ftp_result.market_rate = Some(Array2::<f64>::ones((nrows, ncols)));
92        ftp_result.ftp_rate = Some(Array2::<f64>::zeros((nrows, ncols)));
93
94        ftp_result
95    }
96
97    #[test]
98    fn test_func_ftp_rate_first_row() {
99        let mut ftp_result = create_test_ftp_result();
100        let ncols = ftp_result.input_profiles.dim().1;
101
102        func_ftp_rate(&mut ftp_result, 0, 0, ncols);
103
104        assert!(ftp_result.ftp_rate.is_some());
105        let ftp_rate = ftp_result.ftp_rate.unwrap();
106        // Vérifier que la valeur a été calculée
107        assert_ne!(ftp_rate[[0, 0]], 0.0);
108    }
109
110    #[test]
111    fn test_func_ftp_rate_handles_none_values() {
112        let mut ftp_result = FtpResult::new(array![[1000.0]], array![[1.0, 0.5]], array![[0.01]]);
113
114        // Ne pas initialiser les matrices optionnelles
115        func_ftp_rate(&mut ftp_result, 0, 0, 2);
116
117        // Devrait gérer gracieusement les valeurs None
118        // (Le test.yml passe si aucune panique ne se produit)
119    }
120}