ftp_core/common/
func_ftp_int.rs1use 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 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 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 } else {
59 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 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 assert!(ftp_result.ftp_int.is_some());
112 }
113}