1use crate::agent::AgentMap;
3use crate::commodity::{CommodityID, CommodityMap};
4use crate::process::ProcessMap;
5use crate::region::{Region, RegionID, RegionMap};
6use crate::simulation::investment::InvestmentSet;
7use crate::time_slice::TimeSliceInfo;
8use std::collections::HashMap;
9use std::path::PathBuf;
10
11pub mod parameters;
12pub use parameters::{ALLOW_BROKEN_OPTION_NAME, ModelParameters, broken_model_options_allowed};
13
14pub struct Model {
16 pub model_path: PathBuf,
18 pub parameters: ModelParameters,
20 pub agents: AgentMap,
22 pub commodities: CommodityMap,
24 pub processes: ProcessMap,
26 pub time_slice_info: TimeSliceInfo,
28 pub regions: RegionMap,
30 pub investment_order: HashMap<u32, Vec<InvestmentSet>>,
32}
33
34impl Model {
35 pub fn iter_years(&self) -> impl Iterator<Item = u32> + '_ {
37 self.parameters.milestone_years.iter().copied()
38 }
39
40 pub fn iter_regions(&self) -> indexmap::map::Keys<'_, RegionID, Region> {
42 self.regions.keys()
43 }
44
45 pub fn iter_markets(&self) -> impl Iterator<Item = (CommodityID, RegionID)> + '_ {
47 self.commodities.keys().flat_map(move |commodity_id| {
48 self.regions
49 .keys()
50 .map(move |region_id| (commodity_id.clone(), region_id.clone()))
51 })
52 }
53}