Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relative capacity limits based on multiple projects #1048

Merged
merged 1 commit into from
Oct 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions db/csvs_test_examples/csv_structure.csv
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ project/project_new_binary_build_size,data_dependent,project_new_binary_build_si
project/project_capacity_groups/requirements,data_dependent,project_capacity_group_requirement_scenario_id,project_capacity_group_requirements,simple,,0,0,,,,
project/project_capacity_groups/projects,data_dependent,project_capacity_group_scenario_id,project_capacity_groups,simple,,0,0,,,,
project/relative_capacity,data_dependent,project_relative_capacity_requirement_scenario_id,project_relative_capacity_requirements,simple,,0,0,,,,
project/relative_capacity/mappings,data_dependent,prj_for_lim_map_id,project_relative_capacity_requirements_map,simple,,1,0,,,inputs_project_relative_capacity_requirements,project_relative_capacity_requirement_scenario_id
project/project_fuels,data_dependent,project_fuel_scenario_id,project_fuels,simple,,1,0,,,inputs_project_operational_chars,project_operational_chars_scenario_id
project/project_heat_rate_curves,data_dependent,heat_rate_curves_scenario_id,project_heat_rate_curves,simple,,1,0,,,inputs_project_operational_chars,project_operational_chars_scenario_id
project/project_variable_om_curves,data_dependent,variable_om_curves_scenario_id,project_variable_om_curves,simple,,1,0,,,inputs_project_operational_chars,project_operational_chars_scenario_id
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
project,project_for_limits,period,min_relative_capacity_limit_new,max_relative_capacity_limit_new,min_relative_capacity_limit_total,max_relative_capacity_limit_total
Solar,Wind,2020,,,,2
project,period,prj_for_lim_map_id,min_relative_capacity_limit_new,max_relative_capacity_limit_new,min_relative_capacity_limit_total,max_relative_capacity_limit_total
Solar,2020,1,,,,2
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
project_for_limits
Wind
22 changes: 20 additions & 2 deletions db/db_schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -1163,19 +1163,37 @@ CREATE TABLE inputs_project_relative_capacity_requirements
(
project_relative_capacity_requirement_scenario_id INTEGER,
project VARCHAR(64),
project_for_limits VARCHAR(64),
period INTEGER,
prj_for_lim_map_id INTEGER,
min_relative_capacity_limit_new FLOAT,
max_relative_capacity_limit_new FLOAT,
min_relative_capacity_limit_total FLOAT,
max_relative_capacity_limit_total FLOAT,
PRIMARY KEY (project_relative_capacity_requirement_scenario_id, project,
project_for_limits, period),
period, prj_for_lim_map_id),
FOREIGN KEY (project_relative_capacity_requirement_scenario_id) REFERENCES
subscenarios_project_relative_capacity_requirements
(project_relative_capacity_requirement_scenario_id)
);

DROP TABLE IF EXISTS subscenarios_project_relative_capacity_requirements_map;
CREATE TABLE subscenarios_project_relative_capacity_requirements_map
(
project VARCHAR(64),
prj_for_lim_map_id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(32),
description VARCHAR(128)
);

DROP TABLE IF EXISTS inputs_project_relative_capacity_requirements_map;
CREATE TABLE inputs_project_relative_capacity_requirements_map
(
project VARCHAR(64),
prj_for_lim_map_id INTEGER,
project_for_limits VARCHAR(64),
PRIMARY KEY (project, prj_for_lim_map_id, project_for_limits)
);


-- Group project mapping
DROP TABLE IF EXISTS subscenarios_project_capacity_groups;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
project project_for_limits period min_relative_capacity_limit_new max_relative_capacity_limit_new min_relative_capacity_limit_total max_relative_capacity_limit_total
Solar Wind 2020 . . . 2.0
project period min_relative_capacity_limit_new max_relative_capacity_limit_new min_relative_capacity_limit_total max_relative_capacity_limit_total
Solar 2020 . . . 2.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
project period project_for_limit
Solar 2020 Wind
158 changes: 105 additions & 53 deletions gridpath/project/capacity/relative_capacity.py

Large diffs are not rendered by default.

71 changes: 35 additions & 36 deletions tests/project/capacity/test_relative_capacity.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2016-2020 Blue Marble Analytics LLC.
# Copyright 2016-2023 Blue Marble Analytics LLC.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -95,86 +95,85 @@ def test_initialized_components(self):
)
instance = m.create_instance(data)

# Set: RELATIVE_CAPACITY_PROJECT_PAIR_PERIODS
expected_prj_prd = sorted(
[("Battery", "Wind", 2020), ("Battery", "Wind", 2030)]
)
# Set: REL_CAP_PRJ_PRD
expected_prj_prd = sorted([("Battery", 2020), ("Battery", 2030)])
actual_prj_prd = sorted(
[
(prj, prj_l, period)
(prj, period)
for (
prj,
prj_l,
period,
) in instance.RELATIVE_CAPACITY_PROJECT_PAIR_PERIODS
) in instance.REL_CAP_PRJ_PRD
]
)
self.assertListEqual(expected_prj_prd, actual_prj_prd)

# Set: PRJS_FOR_REL_CAP_LIMIT
expected_prj_prd = {
("Battery", 2020): ["Wind"],
("Battery", 2030): ["Wind", "Battery_Binary"],
}
actual_prj_prd = {
(prj, period): [prj for prj in instance.PRJS_FOR_REL_CAP_LIMIT[prj, period]]
for (
prj,
period,
) in instance.REL_CAP_PRJ_PRD
}
self.assertDictEqual(expected_prj_prd, actual_prj_prd)

# Params: min_relative_capacity_limit_new
expected_new_min = {
("Battery", "Wind", 2020): 0,
("Battery", "Wind", 2030): 1,
("Battery", 2020): 0,
("Battery", 2030): 1,
}
actual_new_min = {
(prj, prj_for_lim, prd): instance.min_relative_capacity_limit_new[
prj, prj_for_lim, prd
]
(prj, prd): instance.min_relative_capacity_limit_new[prj, prd]
for (
prj,
prj_for_lim,
prd,
) in instance.RELATIVE_CAPACITY_PROJECT_PAIR_PERIODS
) in instance.REL_CAP_PRJ_PRD
}
self.assertDictEqual(expected_new_min, actual_new_min)

# # Params: max_relative_capacity_limit_new
expected_new_max = {
("Battery", "Wind", 2020): 2,
("Battery", "Wind", 2030): float("inf"),
("Battery", 2020): 2,
("Battery", 2030): float("inf"),
}
actual_new_max = {
(prj, prj_for_lim, prd): instance.max_relative_capacity_limit_new[
prj, prj_for_lim, prd
]
(prj, prd): instance.max_relative_capacity_limit_new[prj, prd]
for (
prj,
prj_for_lim,
prd,
) in instance.RELATIVE_CAPACITY_PROJECT_PAIR_PERIODS
) in instance.REL_CAP_PRJ_PRD
}
self.assertDictEqual(expected_new_max, actual_new_max)

# Params: min_relative_capacity_limit_total
expected_total_min = {
("Battery", "Wind", 2020): 3,
("Battery", "Wind", 2030): 0,
("Battery", 2020): 3,
("Battery", 2030): 0,
}
actual_total_min = {
(prj, prj_for_lim, prd): instance.min_relative_capacity_limit_total[
prj, prj_for_lim, prd
]
(prj, prd): instance.min_relative_capacity_limit_total[prj, prd]
for (
prj,
prj_for_lim,
prd,
) in instance.RELATIVE_CAPACITY_PROJECT_PAIR_PERIODS
) in instance.REL_CAP_PRJ_PRD
}
self.assertDictEqual(expected_total_min, actual_total_min)

# Params: max_relative_capacity_limit_total
expected_total_max = {
("Battery", "Wind", 2020): float("inf"),
("Battery", "Wind", 2030): 4,
("Battery", 2020): float("inf"),
("Battery", 2030): 4,
}
actual_total_max = {
(prj, prj_for_lim, prd): instance.max_relative_capacity_limit_total[
prj, prj_for_lim, prd
]
(prj, prd): instance.max_relative_capacity_limit_total[prj, prd]
for (
prj,
prj_for_lim,
prd,
) in instance.RELATIVE_CAPACITY_PROJECT_PAIR_PERIODS
) in instance.REL_CAP_PRJ_PRD
}
self.assertDictEqual(expected_total_max, actual_total_max)
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
project project_for_limits period min_relative_capacity_limit_new max_relative_capacity_limit_new min_relative_capacity_limit_total max_relative_capacity_limit_total
Battery Wind 2020 . 2 3 .
Battery Wind 2030 1 . . 4
project period min_relative_capacity_limit_new max_relative_capacity_limit_new min_relative_capacity_limit_total max_relative_capacity_limit_total
Battery 2020 . 2 3 .
Battery 2030 1 . . 4
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
project period project_for_limit
Battery 2020 Wind
Battery 2030 Wind
Battery 2030 Battery_Binary
Loading