1pub mod input;
2pub mod output;
3pub mod sddp;
4mod solver;
5use input::Input;
6use std::error::Error;
7use std::time::{Duration, Instant};
8
9fn show_greeting() {
10 println!(
11 "\nPOWE.RS - Power Optimization for the World of Energy - in pure RuSt"
12 );
13 println!(
14 "--------------------------------------------------------------------"
15 );
16}
17
18fn input_reading_line(input_path: &str) {
19 println!("\nReading input files from '{}'", input_path);
20}
21
22fn output_generation_line(input_path: &str) {
23 println!("\nWriting outputs to '{}'", input_path);
24}
25
26fn show_farewell(time: Duration) {
27 println!(
28 "\nTotal running time: {:.2} s",
29 time.as_millis() as f64 / 1000.0
30 )
31}
32
33pub fn run(input_args: &InputArgs) -> Result<(), Box<dyn Error>> {
34 show_greeting();
35
36 let begin = Instant::now();
37 let input = Input::build(&input_args.path);
38 let config = &input.config;
39 let recourse = &input.recourse;
40 let root = sddp::Node::new(0, input.system.build_sddp_system());
41
42 input_reading_line(&input_args.path);
43
44 let mut graph = sddp::Graph::new(root);
45
46 for n in 1..config.num_stages {
47 let node = sddp::Node::new(n, input.system.build_sddp_system());
48 graph.append(node);
49 }
50 let hydros_initial_storage = recourse.build_sddp_initial_storages();
51 let bus_loads = recourse.build_sddp_loads(config.num_stages);
52 let scenario_generator =
53 recourse.build_sddp_scenario_generator(config.num_stages);
54 sddp::train(
55 &mut graph,
56 config.num_iterations,
57 config.num_branchings,
58 &bus_loads,
59 &hydros_initial_storage,
60 &scenario_generator,
61 );
62 let trajectories = sddp::simulate(
63 &mut graph,
64 config.num_simulation_scenarios,
65 &bus_loads,
66 &hydros_initial_storage,
67 &scenario_generator,
68 );
69
70 output_generation_line(&input_args.path);
71 output::generate_outputs(&graph, &trajectories, &input_args.path)?;
72
73 show_farewell(begin.elapsed());
74
75 Ok(())
76}
77
78pub struct InputArgs {
79 pub path: String,
80}
81
82impl InputArgs {
83 pub fn build(args: &[String]) -> Result<Self, &'static str> {
84 if args.len() < 2 {
85 return Err("Not enough arguments [PATH]");
86 }
87
88 let path = args[1].clone();
89
90 Ok(Self { path })
91 }
92}