Skip to content

Commit 4c25f5c

Browse files
committed
Don't allow processes to consume SVD commodities
Closes #627.
1 parent a698fee commit 4c25f5c

1 file changed

Lines changed: 50 additions & 4 deletions

File tree

src/input/process.rs

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,13 @@ fn validate_svd_commodity(
277277
// We're only interested in processes which produce this commodity
278278
continue;
279279
};
280-
if flow.coeff <= 0.0 {
281-
// Check if it's a producer
282-
continue;
283-
}
280+
ensure!(
281+
flow.coeff > 0.0,
282+
"SVD commodity {} is consumed by process {}. \
283+
SVD commodities can only be produced, not consumed.",
284+
commodity.id,
285+
process_id
286+
);
284287

285288
// If the process has availability >0 in any time slice for this selection, we accept it
286289
let availabilities = availabilities.get(process_id).unwrap();
@@ -313,6 +316,7 @@ mod tests {
313316
use crate::time_slice::{TimeSliceID, TimeSliceLevel};
314317
use indexmap::indexmap;
315318
use rstest::{fixture, rstest};
319+
use std::iter;
316320

317321
#[fixture]
318322
fn commodity_sed() -> Commodity {
@@ -562,4 +566,46 @@ mod tests {
562566
"Commodity commodity_other is neither produced or consumed."
563567
);
564568
}
569+
570+
#[rstest]
571+
fn test_validate_svd_commodity_invalid_consumed(
572+
commodity_svd: Commodity,
573+
time_slice_info: TimeSliceInfo,
574+
time_slice: TimeSliceID,
575+
) {
576+
let commodity_svd = Rc::new(commodity_svd);
577+
let region_id = RegionID("GBR".into());
578+
let availabilities = HashMap::from_iter([(
579+
"process1".into(),
580+
ProcessActivityLimitsMap::from_iter([(
581+
(region_id.clone(), 2010, time_slice.clone()),
582+
0.1..=0.9,
583+
)]),
584+
)]);
585+
let flows = HashMap::from_iter(iter::once((
586+
"process1".into(),
587+
ProcessFlowsMap::from_iter([(
588+
(region_id.clone(), 2010),
589+
indexmap! { commodity_svd.id.clone() => ProcessFlow {
590+
commodity: Rc::clone(&commodity_svd),
591+
coeff: -10.0,
592+
kind: FlowType::Fixed,
593+
cost: 1.0
594+
}},
595+
)]),
596+
)));
597+
assert_error!(
598+
validate_svd_commodity(
599+
&time_slice_info,
600+
&commodity_svd,
601+
&flows,
602+
&availabilities,
603+
&region_id,
604+
2010,
605+
&time_slice.into()
606+
),
607+
"SVD commodity commodity_svd is consumed by process process1. \
608+
SVD commodities can only be produced, not consumed."
609+
);
610+
}
565611
}

0 commit comments

Comments
 (0)