ftp_core/common/
func_ftp_rate.rs1use 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 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 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 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 func_ftp_rate(&mut ftp_result, 0, 0, 2);
116
117 }
120}