1use crate::asset::AssetPool;
3use crate::model::Model;
4use crate::output::DataWriter;
5use anyhow::{bail, Result};
6use log::info;
7use std::path::Path;
8
9pub mod optimisation;
10use optimisation::perform_dispatch_optimisation;
11pub mod investment;
12use investment::perform_agent_investment;
13pub mod prices;
14pub use prices::CommodityPrices;
15
16pub fn run(model: Model, mut assets: AssetPool, output_path: &Path) -> Result<()> {
23 let mut writer = DataWriter::create(output_path)?;
24
25 let mut opt_results = None; for year in model.iter_years() {
27 info!("Milestone year: {year}");
28
29 assets.decomission_old(year);
31
32 if let Some((solution, prices)) = opt_results {
34 perform_agent_investment(&model, &solution, &prices, &mut assets);
35
36 bail!("Agent investment is not yet implemented. Exiting...");
39 }
40
41 assets.commission_new(year);
44
45 writer.write_assets(year, assets.iter())?;
48
49 let solution = perform_dispatch_optimisation(&model, &assets, year)?;
51 let prices = CommodityPrices::from_model_and_solution(&model, &solution, &assets);
52
53 writer.write_flows(year, &assets, solution.iter_commodity_flows_for_assets())?;
55 writer.write_prices(year, &prices)?;
56
57 opt_results = Some((solution, prices));
58 }
59
60 writer.flush()?;
61
62 Ok(())
63}