1use crate::agent::AgentMap;
3use crate::asset::AssetRef;
4use crate::commodity::{CommodityID, CommodityMap};
5use crate::process::ProcessMap;
6use crate::region::{Region, RegionID, RegionMap};
7use crate::simulation::investment::InvestmentSet;
8use crate::time_slice::TimeSliceInfo;
9use std::collections::HashMap;
10use std::path::PathBuf;
11
12pub mod parameters;
13pub use parameters::{ALLOW_BROKEN_OPTION_NAME, ModelParameters, broken_model_options_allowed};
14
15pub struct Model {
17 pub model_path: PathBuf,
19 pub parameters: ModelParameters,
21 pub agents: AgentMap,
23 pub commodities: CommodityMap,
25 pub processes: ProcessMap,
27 pub time_slice_info: TimeSliceInfo,
29 pub regions: RegionMap,
31 pub user_assets: Vec<AssetRef>,
33 pub investment_order: HashMap<u32, Vec<InvestmentSet>>,
35}
36
37impl Model {
38 pub fn iter_years(&self) -> impl Iterator<Item = u32> + '_ {
40 self.parameters.milestone_years.iter().copied()
41 }
42
43 pub fn iter_regions(&self) -> indexmap::map::Keys<'_, RegionID, Region> {
45 self.regions.keys()
46 }
47
48 pub fn iter_markets(&self) -> impl Iterator<Item = (CommodityID, RegionID)> + '_ {
50 self.commodities.keys().flat_map(move |commodity_id| {
51 self.regions
52 .keys()
53 .map(move |region_id| (commodity_id.clone(), region_id.clone()))
54 })
55 }
56}