Skip to content

Commit e199559

Browse files
committed
Use ProcessMap to represent processes everywhere in input code
1 parent 1775a0a commit e199559

4 files changed

Lines changed: 18 additions & 21 deletions

File tree

src/input/process.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use itertools::iproduct;
1111
use serde::Deserialize;
1212
use std::collections::{HashMap, HashSet};
1313
use std::path::Path;
14+
use std::rc::Rc;
1415

1516
mod availability;
1617
use availability::read_process_availabilities;
@@ -69,6 +70,8 @@ pub fn read_processes(
6970

7071
// Add data to Process objects
7172
for (id, process) in processes.iter_mut() {
73+
// This will always succeed as we know there will only be one reference to the process here
74+
let process = Rc::get_mut(process).unwrap();
7275
process.activity_limits = activity_limits
7376
.remove(id)
7477
.with_context(|| format!("Missing availabilities for process {id}"))?;
@@ -80,20 +83,14 @@ pub fn read_processes(
8083
.with_context(|| format!("Missing parameters for process {id}"))?;
8184
}
8285

83-
// Create ProcessMap
84-
let mut process_map = ProcessMap::new();
85-
for (id, process) in processes {
86-
process_map.insert(id, process.into());
87-
}
88-
89-
Ok(process_map)
86+
Ok(processes)
9087
}
9188

9289
fn read_processes_file(
9390
model_dir: &Path,
9491
milestone_years: &[u32],
9592
region_ids: &HashSet<RegionID>,
96-
) -> Result<HashMap<ProcessID, Process>> {
93+
) -> Result<ProcessMap> {
9794
let file_path = model_dir.join(PROCESSES_FILE_NAME);
9895
let processes_csv = read_csv(&file_path)?;
9996
read_processes_file_from_iter(processes_csv, milestone_years, region_ids)
@@ -104,11 +101,11 @@ fn read_processes_file_from_iter<I>(
104101
iter: I,
105102
milestone_years: &[u32],
106103
region_ids: &HashSet<RegionID>,
107-
) -> Result<HashMap<ProcessID, Process>>
104+
) -> Result<ProcessMap>
108105
where
109106
I: Iterator<Item = ProcessRaw>,
110107
{
111-
let mut processes = HashMap::new();
108+
let mut processes = ProcessMap::new();
112109
for process_raw in iter {
113110
let start_year = process_raw.start_year.unwrap_or(milestone_years[0]);
114111
let end_year = process_raw
@@ -143,7 +140,7 @@ where
143140
};
144141

145142
ensure!(
146-
processes.insert(process_raw.id, process).is_none(),
143+
processes.insert(process_raw.id, process.into()).is_none(),
147144
"Duplicate process ID"
148145
);
149146
}

src/input/process/availability.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Code for reading process availabilities CSV file
22
use super::super::*;
3-
use crate::process::{Process, ProcessActivityLimitsMap, ProcessID};
3+
use crate::process::{ProcessActivityLimitsMap, ProcessID, ProcessMap};
44
use crate::region::parse_region_str;
55
use crate::time_slice::TimeSliceInfo;
66
use crate::year::parse_year_str;
@@ -77,7 +77,7 @@ enum LimitType {
7777
/// error.
7878
pub fn read_process_availabilities(
7979
model_dir: &Path,
80-
processes: &HashMap<ProcessID, Process>,
80+
processes: &ProcessMap,
8181
time_slice_info: &TimeSliceInfo,
8282
) -> Result<HashMap<ProcessID, ProcessActivityLimitsMap>> {
8383
let file_path = model_dir.join(PROCESS_AVAILABILITIES_FILE_NAME);
@@ -89,7 +89,7 @@ pub fn read_process_availabilities(
8989
/// Process raw process availabilities input data into [`ProcessActivityLimitsMap`]s
9090
fn read_process_availabilities_from_iter<I>(
9191
iter: I,
92-
processes: &HashMap<ProcessID, Process>,
92+
processes: &ProcessMap,
9393
time_slice_info: &TimeSliceInfo,
9494
) -> Result<HashMap<ProcessID, ProcessActivityLimitsMap>>
9595
where
@@ -147,7 +147,7 @@ where
147147
/// Check that the activity limits cover every time slice and all regions/years of the process
148148
fn validate_activity_limits_maps(
149149
map: &HashMap<ProcessID, ProcessActivityLimitsMap>,
150-
processes: &HashMap<ProcessID, Process>,
150+
processes: &ProcessMap,
151151
time_slice_info: &TimeSliceInfo,
152152
) -> Result<()> {
153153
for (process_id, map) in map.iter() {

src/input/process/flow.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Code for reading process flows file
22
use super::super::*;
33
use crate::commodity::CommodityMap;
4-
use crate::process::{FlowType, Process, ProcessFlow, ProcessFlowsMap, ProcessID};
4+
use crate::process::{FlowType, Process, ProcessFlow, ProcessFlowsMap, ProcessID, ProcessMap};
55
use crate::region::parse_region_str;
66
use crate::year::parse_year_str;
77
use anyhow::{ensure, Context, Result};
@@ -55,7 +55,7 @@ impl ProcessFlowRaw {
5555
/// Read process flows from a CSV file
5656
pub fn read_process_flows(
5757
model_dir: &Path,
58-
processes: &HashMap<ProcessID, Process>,
58+
processes: &ProcessMap,
5959
commodities: &CommodityMap,
6060
) -> Result<HashMap<ProcessID, ProcessFlowsMap>> {
6161
let file_path = model_dir.join(PROCESS_FLOWS_FILE_NAME);
@@ -67,7 +67,7 @@ pub fn read_process_flows(
6767
/// Read 'ProcessFlowRaw' records from an iterator and convert them into 'ProcessFlow' records.
6868
fn read_process_flows_from_iter<I>(
6969
iter: I,
70-
processes: &HashMap<ProcessID, Process>,
70+
processes: &ProcessMap,
7171
commodities: &CommodityMap,
7272
) -> Result<HashMap<ProcessID, ProcessFlowsMap>>
7373
where

src/input/process/parameter.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Code for reading process parameters CSV file
22
use super::super::*;
3-
use crate::process::{Process, ProcessID, ProcessParameter, ProcessParameterMap};
3+
use crate::process::{ProcessID, ProcessMap, ProcessParameter, ProcessParameterMap};
44
use crate::region::parse_region_str;
55
use crate::year::parse_year_str;
66
use ::log::warn;
@@ -95,7 +95,7 @@ impl ProcessParameterRaw {
9595
/// Read process parameters from the specified model directory
9696
pub fn read_process_parameters(
9797
model_dir: &Path,
98-
processes: &HashMap<ProcessID, Process>,
98+
processes: &ProcessMap,
9999
) -> Result<HashMap<ProcessID, ProcessParameterMap>> {
100100
let file_path = model_dir.join(PROCESS_PARAMETERS_FILE_NAME);
101101
let iter = read_csv::<ProcessParameterRaw>(&file_path)?;
@@ -104,7 +104,7 @@ pub fn read_process_parameters(
104104

105105
fn read_process_parameters_from_iter<I>(
106106
iter: I,
107-
processes: &HashMap<ProcessID, Process>,
107+
processes: &ProcessMap,
108108
) -> Result<HashMap<ProcessID, ProcessParameterMap>>
109109
where
110110
I: Iterator<Item = ProcessParameterRaw>,

0 commit comments

Comments
 (0)