ftp_core/common/
func_ftp_int.rs

1use crate::holding_struct::FtpResult;
2
3pub fn func_ftp_int(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_int) = &mut ftp_result.ftp_int {
31        if rownum == 0 {
32            //println!("row0 - rownum = {} ; colnum = {}; ncols = {}", rownum, colnum, ncols);
33            let mut num = 0.0;
34
35            for k in colnum..ncols - 1 {
36                num += m_varstock_instal[[0, k + 1]] * m_input_rate[[0, k]];
37            }
38
39            ftp_int[[rownum, colnum]] = num / 12.0;
40        } else {
41            // rownum > 0
42
43            let mut num1 = 0.0;
44            let mut num2 = 0.0;
45
46            for k in colnum..ncols - 1 {
47                num1 += m_varstock_instal[[rownum, k + 1]] * m_input_rate[[rownum, k]];
48                if k > colnum {
49                    num2 +=
50                        m_stock_instal[[rownum - 1, k + 1]] * m_market_rate[[rownum - 1, k + 1]];
51                }
52            }
53
54            ftp_int[[rownum, colnum]] = (num1 + num2) / 12.0;
55        }
56
57    // ftp_rate[[rownum, colnum]] = m_input_rate[[rownum, colnum]];
58    } else {
59        // Handle the case where varstock_amort is None, if necessary
60        eprintln!("ftp_rate is None, cannot update value.");
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67    use crate::holding_struct::FtpResult;
68    use ndarray::{array, Array2};
69
70    fn create_test_ftp_result() -> FtpResult {
71        let outstanding = array![[1000.0]];
72        let profiles = array![[1.0, 0.5, 0.2]];
73        let rates = array![[0.01, 0.02]];
74
75        let mut ftp_result = FtpResult::new(outstanding, profiles, rates);
76
77        let (nrows, ncols) = ftp_result.input_profiles.dim();
78        ftp_result.varstock_instal = Some(Array2::<f64>::ones((nrows, ncols)));
79        ftp_result.stock_instal = Some(Array2::<f64>::ones((nrows, ncols)));
80        ftp_result.market_rate = Some(Array2::<f64>::ones((nrows, ncols)));
81        ftp_result.ftp_int = Some(Array2::<f64>::zeros((nrows, ncols)));
82
83        ftp_result
84    }
85
86    #[test]
87    fn test_func_ftp_int_calculation() {
88        let mut ftp_result = create_test_ftp_result();
89        let ncols = ftp_result.input_profiles.dim().1;
90
91        func_ftp_int(&mut ftp_result, 0, 0, ncols);
92
93        assert!(ftp_result.ftp_int.is_some());
94        let ftp_int = ftp_result.ftp_int.unwrap();
95        assert!(ftp_int[[0, 0]].is_finite());
96    }
97
98    #[test]
99    fn test_func_ftp_int_division_by_zero_handling() {
100        let mut ftp_result = create_test_ftp_result();
101        let ncols = ftp_result.input_profiles.dim().1;
102
103        // Configurer pour provoquer une division par zéro
104        if let Some(ref mut varstock_instal) = ftp_result.varstock_instal {
105            varstock_instal.fill(0.0);
106        }
107
108        func_ftp_int(&mut ftp_result, 0, 0, ncols);
109
110        // Vérifier que la fonction ne panique pas
111        assert!(ftp_result.ftp_int.is_some());
112    }
113}