powers_rs/
lib.rs

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}