Skip to content

Commit 5c468bd

Browse files
committed
Add demand satisfaction constraints
Closes #578.
1 parent 8850c4e commit 5c468bd

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

src/simulation/optimisation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ pub fn perform_dispatch_optimisation<'a>(
128128
let variables = add_variables(&mut problem, model, assets, year);
129129

130130
// Add constraints
131-
let constraint_keys = add_asset_constraints(&mut problem, &variables, model, assets);
131+
let constraint_keys = add_asset_constraints(&mut problem, &variables, model, assets, year);
132132

133133
// Solve problem
134134
let mut highs_model = problem.optimise(Sense::Minimise);

src/simulation/optimisation/constraints.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ pub struct ConstraintKeys {
5050
/// * `variables` - The variables in the problem
5151
/// * `model` - The model
5252
/// * `assets` - The asset pool
53+
/// * `year` - Current milestone year
5354
///
5455
/// # Returns:
5556
///
@@ -60,9 +61,10 @@ pub fn add_asset_constraints(
6061
variables: &VariableMap,
6162
model: &Model,
6263
assets: &AssetPool,
64+
year: u32,
6365
) -> ConstraintKeys {
6466
let commodity_balance_keys =
65-
add_commodity_balance_constraints(problem, variables, model, assets);
67+
add_commodity_balance_constraints(problem, variables, model, assets, year);
6668

6769
let capacity_keys =
6870
add_asset_capacity_constraints(problem, variables, assets, &model.time_slice_info);
@@ -86,14 +88,18 @@ fn add_commodity_balance_constraints(
8688
variables: &VariableMap,
8789
model: &Model,
8890
assets: &AssetPool,
91+
year: u32,
8992
) -> CommodityBalanceKeys {
9093
// Row offset in problem. This line **must** come before we add more constraints.
9194
let offset = problem.num_rows();
9295

9396
let mut keys = Vec::new();
9497
let mut terms = Vec::new();
9598
for (commodity_id, commodity) in model.commodities.iter() {
96-
if commodity.kind != CommodityType::SupplyEqualsDemand {
99+
if !matches!(
100+
commodity.kind,
101+
CommodityType::SupplyEqualsDemand | CommodityType::ServiceDemand
102+
) {
97103
continue;
98104
}
99105

@@ -111,8 +117,17 @@ fn add_commodity_balance_constraints(
111117
}
112118
}
113119

114-
// Add constraint
115-
problem.add_row(0.0..=0.0, terms.drain(..));
120+
// Add constraint. For SED commodities, the RHS is zero and for SVD commodities it
121+
// is the exogenous demand supplied by the user.
122+
let rhs = if commodity.kind == CommodityType::ServiceDemand {
123+
*commodity
124+
.demand
125+
.get(&(region_id.clone(), year, ts_selection.clone()))
126+
.unwrap()
127+
} else {
128+
0.0
129+
};
130+
problem.add_row(rhs..=rhs, terms.drain(..));
116131
keys.push((
117132
commodity_id.clone(),
118133
region_id.clone(),

0 commit comments

Comments
 (0)