1mod cut;
2mod fcf;
3pub mod graph;
4mod initial_condition;
5pub mod input;
6mod log;
7pub mod output;
8mod risk_measure;
9pub mod scenario;
10pub mod sddp;
11mod solver;
12mod state;
13mod stochastic_process;
14pub mod subproblem;
15mod system;
16pub mod utils;
17use input::Input;
18use std::error::Error;
19use std::time::Instant;
20
21pub fn run(input_args: &InputArgs) -> Result<(), Box<dyn Error>> {
22 log::show_greeting();
23
24 let begin = Instant::now();
25 let input = Input::build(&input_args.path);
26 let config = &input.config;
27 let recourse = &input.recourse;
28 let graph_input = &input.graph;
29
30 log::input_reading_line(&input_args.path);
31
32 let seed = config.seed;
33
34 let node_data_graph = graph_input.build_sddp_graph(&input.system)?;
35 let initial_condition = recourse.build_sddp_initial_condition();
36
37 let saa = recourse.generate_sddp_noises(&node_data_graph, seed);
38
39 let mut sddp_algo =
40 sddp::SddpAlgorithm::new(node_data_graph, initial_condition, seed)
41 .unwrap();
42
43 sddp_algo.train(config.num_iterations, config.num_forward_passes, &saa)?;
44
45 let simulation_handlers =
46 sddp_algo.simulate(config.num_simulation_scenarios, &saa)?;
47
48 log::output_generation_line(&input_args.path);
49 output::generate_outputs(
50 &sddp_algo.future_cost_function_graph,
51 &simulation_handlers,
52 &sddp_algo.study_period_ids,
53 &input_args.path,
54 )?;
55
56 log::show_farewell(begin.elapsed());
57
58 Ok(())
59}
60
61pub struct InputArgs {
62 pub path: String,
63}
64
65impl InputArgs {
66 pub fn build(args: &[String]) -> Result<Self, &'static str> {
67 if args.len() < 2 {
68 return Err("Not enough arguments [PATH]");
69 }
70
71 let path = args[1].clone();
72
73 Ok(Self { path })
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80
81 #[test]
82 fn test_input_args_build_success() {
83 let args = vec!["program_name".to_string(), "some/path".to_string()];
84 let input_args = InputArgs::build(&args).unwrap();
85 assert_eq!(input_args.path, "some/path");
86 }
87
88 #[test]
89 fn test_input_args_build_fail() {
90 let args = vec!["program_name".to_string()];
91 let result = InputArgs::build(&args);
92 assert!(result.is_err());
93 assert_eq!(result.err().unwrap(), "Not enough arguments [PATH]");
94 }
95}