powers_rs/
lib.rs

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}