Skip to content

Commit

Permalink
[WIP] Rename accumulated_* and correctly compute accumulated energy u…
Browse files Browse the repository at this point in the history
…nits
  • Loading branch information
abelsiqueira committed Feb 5, 2025
1 parent a639f52 commit cafe367
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 70 deletions.
4 changes: 2 additions & 2 deletions src/constraints/capacity.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Adds the capacity constraints for all asset types to the model
"""
function add_capacity_constraints!(connection, model, expressions, constraints, profiles)
## unpack from expressions
expr_acc = expressions[:accumulated_units].expressions[:assets]
expr_acc = expressions[:accumulated_asset_units].expressions[:assets]

## Expressions used by capacity constraints
# - Create capacity limit for outgoing flows
Expand Down Expand Up @@ -344,7 +344,7 @@ function _append_capacity_data_to_indices(connection, table_name)
LEFT JOIN asset_commission
ON cons.asset = asset_commission.asset
AND cons.year = asset_commission.commission_year
LEFT JOIN expr_accumulated_units AS expr_acc
LEFT JOIN expr_accumulated_asset_units AS expr_acc
ON cons.asset = expr_acc.asset
AND cons.year = expr_acc.milestone_year
LEFT OUTER JOIN assets_profiles
Expand Down
4 changes: 2 additions & 2 deletions src/constraints/ramping-and-unit-commitment.jl
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ function add_ramping_constraints!(connection, model, variables, expressions, con
# - Limit to the units on (i.e. commitment)
let table_name = :limit_units_on, cons = constraints[table_name]
indices = _append_accumulated_units_data(connection, table_name)
expr_acc = expressions[:accumulated_units].expressions[:assets]
expr_acc = expressions[:accumulated_asset_units].expressions[:assets]
attach_constraint!(
model,
cons,
Expand Down Expand Up @@ -272,7 +272,7 @@ function _append_accumulated_units_data(connection, table_name)
ANY_VALUE(cons.time_block_end) AS time_block_end,
ARRAY_AGG(expr_acc.index) AS acc_indices,
FROM cons_$table_name AS cons
LEFT JOIN expr_accumulated_units AS expr_acc
LEFT JOIN expr_accumulated_asset_units AS expr_acc
ON cons.asset = expr_acc.asset
AND cons.year = expr_acc.milestone_year
GROUP BY cons.index
Expand Down
36 changes: 29 additions & 7 deletions src/expressions/multi-year.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function create_multi_year_expressions!(connection, model, variables, expression

_create_multi_year_expressions_indices!(connection, expressions)

let table_name = :accumulated_units, expr = expressions[table_name]
let table_name = :accumulated_asset_units, expr = expressions[table_name]
var_inv = variables[:assets_investment].container
var_dec = variables[:assets_decommission].container

Expand Down Expand Up @@ -58,13 +58,16 @@ function create_multi_year_expressions!(connection, model, variables, expression
end for row in indices
],
)
end

let table_name = :accumulated_energy_units, expr = expressions[table_name]
var_energy_inv = variables[:assets_investment_energy].container
var_energy_dec = variables[:assets_decommission_energy].container

indices = DuckDB.query(connection, "FROM expr_$table_name ORDER BY index")
attach_expression!(
expr,
:assets_energy,
:energy,
JuMP.AffExpr[
if ismissing(row.var_energy_decommission_indices) &&
ismissing(row.var_energy_investment_index)
Expand Down Expand Up @@ -158,18 +161,15 @@ function _create_multi_year_expressions_indices!(connection, expressions)
connection,
"
CREATE OR REPLACE TEMP SEQUENCE id START 1;
CREATE OR REPLACE TABLE expr_accumulated_units AS
CREATE OR REPLACE TABLE expr_accumulated_asset_units AS
SELECT
nextval('id') AS index,
asset_both.asset AS asset,
asset_both.milestone_year AS milestone_year,
asset_both.commission_year AS commission_year,
ANY_VALUE(asset_both.initial_units) AS initial_units,
ANY_VALUE(asset_both.initial_storage_units) AS initial_storage_units,
ARRAY_AGG(var_dec.index) FILTER (var_dec.index IS NOT NULL) AS var_decommission_indices,
ANY_VALUE(var_inv.index) AS var_investment_index,
ARRAY_AGG(var_energy_dec.index) FILTER (var_energy_dec.index IS NOT NULL) AS var_energy_decommission_indices,
ANY_VALUE(var_energy_inv.index) AS var_energy_investment_index,
FROM asset_both
LEFT JOIN var_assets_decommission AS var_dec
ON asset_both.asset = var_dec.asset
Expand All @@ -178,13 +178,35 @@ function _create_multi_year_expressions_indices!(connection, expressions)
LEFT JOIN var_assets_investment AS var_inv
ON asset_both.asset = var_inv.asset
AND asset_both.commission_year = var_inv.milestone_year
GROUP BY asset_both.asset, asset_both.milestone_year, asset_both.commission_year
",
)

DuckDB.query(
connection,
"
CREATE OR REPLACE TEMP SEQUENCE id START 1;
CREATE OR REPLACE TABLE expr_accumulated_energy_units AS
SELECT
nextval('id') AS index,
asset_both.asset AS asset,
asset_both.milestone_year AS milestone_year,
asset_both.commission_year AS commission_year,
ANY_VALUE(asset_both.initial_storage_units) AS initial_storage_units,
ARRAY_AGG(var_energy_dec.index) FILTER (var_energy_dec.index IS NOT NULL) AS var_energy_decommission_indices,
ANY_VALUE(var_energy_inv.index) AS var_energy_investment_index,
FROM asset_both
LEFT JOIN asset
ON asset.asset = asset_both.asset
LEFT JOIN var_assets_decommission_energy AS var_energy_dec
ON asset_both.asset = var_energy_dec.asset
AND asset_both.commission_year = var_energy_dec.commission_year
AND asset_both.milestone_year >= var_energy_dec.milestone_year
LEFT JOIN var_assets_investment_energy AS var_energy_inv
ON asset_both.asset = var_energy_inv.asset
AND asset_both.commission_year = var_energy_inv.milestone_year
WHERE
asset.type == 'storage'
GROUP BY asset_both.asset, asset_both.milestone_year, asset_both.commission_year
",
)
Expand Down Expand Up @@ -218,7 +240,7 @@ function _create_multi_year_expressions_indices!(connection, expressions)
",
)

for expr_name in (:accumulated_units, :accumulated_flow_units)
for expr_name in (:accumulated_asset_units, :accumulated_energy_units, :accumulated_flow_units)
expressions[expr_name] = TulipaExpression(connection, "expr_$expr_name")
end

Expand Down
75 changes: 21 additions & 54 deletions src/expressions/storage.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@ function add_storage_expressions!(connection, model, expressions)
nextval('id') AS index,
asset_milestone.asset,
asset_milestone.milestone_year,
ANY_VALUE(asset.capacity) AS capacity,
ANY_VALUE(asset.capacity_storage_energy) AS capacity_storage_energy,
ANY_VALUE(asset.energy_to_power_ratio) AS energy_to_power_ratio,
ANY_VALUE(asset.storage_method_energy) AS storage_method_energy,
SUM(expr_acc.initial_storage_units) AS accumulated_initial_storage_units,
ARRAY_AGG(expr_acc.index) AS acc_indices,
FROM asset_milestone
LEFT JOIN asset
ON asset_milestone.asset = asset.asset
LEFT JOIN expr_accumulated_units AS expr_acc
LEFT JOIN expr_accumulated_energy_units AS expr_acc
ON asset_milestone.asset = expr_acc.asset
AND asset_milestone.milestone_year = expr_acc.milestone_year
WHERE
Expand All @@ -27,67 +31,30 @@ function add_storage_expressions!(connection, model, expressions)
expressions[:accumulated_energy_capacity] =
TulipaExpression(connection, "expr_accumulated_energy_capacity")

expr_acc = expressions[:accumulated_units].expressions[:assets_energy]
expr_acc = expressions[:accumulated_energy_units].expressions[:energy]

# TODO: Reevaluate the accumulated_energy_capacity definition
let table_name = :accumulated_energy_capacity, expr = expressions[table_name]
indices = DuckDB.query(connection, "FROM expr_$table_name")
attach_expression!(
expr,
:energy_capacity,
JuMP.AffExpr[
@expression(
model,
row.capacity_storage_energy *
sum(expr_acc[acc_index] for acc_index in row.acc_indices)
) for row in indices
[
begin
capacity_for_initial = row.capacity_storage_energy
capacity_for_variation = if row.storage_method_energy
row.capacity_storage_energy
else
row.energy_to_power_ratio * row.capacity
end
@expression(
model,
capacity_for_initial * row.accumulated_initial_storage_units +
capacity_for_variation *
sum(expr_acc[acc_index] for acc_index in row.acc_indices)
)
end for row in indices
],
)
end

# assets_investment_energy = variables[:assets_investment_energy].lookup
# assets_decommission_energy_simple_method =
# variables[:assets_decommission_energy_simple_method].lookup
# accumulated_investment_units_using_simple_method =
# model[:accumulated_investment_units_using_simple_method]
# accumulated_decommission_units_using_simple_method =
# model[:accumulated_decommission_units_using_simple_method]
#
# @expression(
# model,
# accumulated_energy_units_simple_method[
# y ∈ sets.Y,
# a ∈ sets.Ase[y]∩sets.decommissionable_assets_using_simple_method,
# ],
# sum(values(graph[a].initial_storage_units[y])) + sum(
# assets_investment_energy[yy, a] for
# yy in sets.Y if a ∈ (sets.Ase[yy] ∩ sets.investable_assets_using_simple_method[yy]) &&
# sets.starting_year_using_simple_method[(y, a)] ≤ yy ≤ y
# ) - sum(
# assets_decommission_energy_simple_method[yy, a] for yy in sets.Y if
# a ∈ sets.Ase[yy] && sets.starting_year_using_simple_method[(y, a)] ≤ yy ≤ y
# )
# )
# @expression(
# model,
# accumulated_energy_capacity[y ∈ sets.Y, a ∈ sets.As],
# if graph[a].storage_method_energy &&
# a ∈ sets.Ase ∩ sets.decommissionable_assets_using_simple_method
# graph[a].capacity_storage_energy * accumulated_energy_units_simple_method[y, a]
# else
# (
# graph[a].capacity_storage_energy * sum(values(graph[a].initial_storage_units[y])) +
# if a ∈ sets.Ai[y] ∩ sets.decommissionable_assets_using_simple_method
# graph[a].energy_to_power_ratio *
# graph[a].capacity *
# (
# accumulated_investment_units_using_simple_method[a, y] -
# accumulated_decommission_units_using_simple_method[a, y]
# )
# else
# 0.0
# end
# )
# end
# )
end
11 changes: 6 additions & 5 deletions src/objective.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ function add_objective!(
assets_investment_energy = variables[:assets_investment_energy].lookup
flows_investment = variables[:flows_investment].lookup

expr_accumulated_units = expressions[:accumulated_units]
expr_accumulated_asset_units = expressions[:accumulated_asset_units]
expr_accumulated_energy_units = expressions[:accumulated_energy_units]
expr_accumulated_flow_units = expressions[:accumulated_flow_units]

# Create a dict of weights for assets investment discounts
Expand Down Expand Up @@ -54,8 +55,8 @@ function add_objective!(
graph[row.asset].fixed_cost[row.milestone_year] *
graph[row.asset].capacity *
acc_unit for (row, acc_unit) in zip(
eachrow(expr_accumulated_units.indices),
expr_accumulated_units.expressions[:assets],
eachrow(expr_accumulated_asset_units.indices),
expr_accumulated_asset_units.expressions[:assets],
)
)
)
Expand All @@ -77,8 +78,8 @@ function add_objective!(
graph[row.asset].fixed_cost_storage_energy[row.milestone_year] *
graph[row.asset].capacity_storage_energy *
acc_unit for (row, acc_unit) in zip(
eachrow(expr_accumulated_units.indices),
expr_accumulated_units.expressions[:assets_energy],
eachrow(expr_accumulated_energy_units.indices),
expr_accumulated_energy_units.expressions[:energy],
)
)
)
Expand Down

0 comments on commit cafe367

Please sign in to comment.