solve_network: option to inject custom extra functionalities from source file

This commit is contained in:
Fabian Neumann 2023-12-29 17:19:19 +01:00
parent 0f6887793b
commit 8a11bdb4b1
7 changed files with 23 additions and 0 deletions

View File

@ -627,6 +627,7 @@ solving:
skip_iterations: true skip_iterations: true
rolling_horizon: false rolling_horizon: false
seed: 123 seed: 123
custom_extra_functionality: "data/custom_extra_functionality.py"
# options that go into the optimize function # options that go into the optimize function
track_iterations: false track_iterations: false
min_iterations: 4 min_iterations: 4

View File

@ -6,6 +6,7 @@ options,,,
-- skip_iterations,bool,"{'true','false'}","Skip iterating, do not update impedances of branches. Defaults to true." -- skip_iterations,bool,"{'true','false'}","Skip iterating, do not update impedances of branches. Defaults to true."
-- rolling_horizon,bool,"{'true','false'}","Whether to optimize the network in a rolling horizon manner, where the snapshot range is split into slices of size `horizon` which are solved consecutively." -- rolling_horizon,bool,"{'true','false'}","Whether to optimize the network in a rolling horizon manner, where the snapshot range is split into slices of size `horizon` which are solved consecutively."
-- seed,--,int,Random seed for increased deterministic behaviour. -- seed,--,int,Random seed for increased deterministic behaviour.
-- custom_extra_functionality,--,str,Path to a Python file with custom extra functionality code to be injected into the solving rules of the workflow.
-- track_iterations,bool,"{'true','false'}",Flag whether to store the intermediate branch capacities and objective function values are recorded for each iteration in ``network.lines['s_nom_opt_X']`` (where ``X`` labels the iteration) -- track_iterations,bool,"{'true','false'}",Flag whether to store the intermediate branch capacities and objective function values are recorded for each iteration in ``network.lines['s_nom_opt_X']`` (where ``X`` labels the iteration)
-- min_iterations,--,int,Minimum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. -- min_iterations,--,int,Minimum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run.
-- max_iterations,--,int,Maximum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. -- max_iterations,--,int,Maximum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run.

1 Unit Values Description
6 -- skip_iterations bool {'true','false'} Skip iterating, do not update impedances of branches. Defaults to true.
7 -- rolling_horizon bool {'true','false'} Whether to optimize the network in a rolling horizon manner, where the snapshot range is split into slices of size `horizon` which are solved consecutively.
8 -- seed -- int Random seed for increased deterministic behaviour.
9 -- custom_extra_functionality -- str Path to a Python file with custom extra functionality code to be injected into the solving rules of the workflow.
10 -- track_iterations bool {'true','false'} Flag whether to store the intermediate branch capacities and objective function values are recorded for each iteration in ``network.lines['s_nom_opt_X']`` (where ``X`` labels the iteration)
11 -- min_iterations -- int Minimum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run.
12 -- max_iterations -- int Maximum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run.

View File

@ -54,6 +54,11 @@ Upcoming Release
reconnected to the main Ukrainian grid with the configuration option reconnected to the main Ukrainian grid with the configuration option
`reconnect_crimea`. `reconnect_crimea`.
* Add option to reference an additional source file where users can specify
custom ``extra_functionality`` constraints in the configuration file. The
default setting points to an empty hull at
``data/custom_extra_functionality.py``.
**Bugs and Compatibility** **Bugs and Compatibility**

View File

@ -88,6 +88,9 @@ rule solve_sector_network_myopic:
co2_sequestration_potential=config["sector"].get( co2_sequestration_potential=config["sector"].get(
"co2_sequestration_potential", 200 "co2_sequestration_potential", 200
), ),
custom_extra_functionality=workflow.source_path(
config["solver"]["options"].get("custom_extra_functionality", "")
),
input: input:
network=RESULTS network=RESULTS
+ "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc",

View File

@ -11,6 +11,9 @@ rule solve_sector_network:
co2_sequestration_potential=config["sector"].get( co2_sequestration_potential=config["sector"].get(
"co2_sequestration_potential", 200 "co2_sequestration_potential", 200
), ),
custom_extra_functionality=workflow.source_path(
config["solver"]["options"].get("custom_extra_functionality", "")
),
input: input:
network=RESULTS network=RESULTS
+ "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc",

View File

@ -118,6 +118,9 @@ rule solve_sector_network_perfect:
co2_sequestration_potential=config["sector"].get( co2_sequestration_potential=config["sector"].get(
"co2_sequestration_potential", 200 "co2_sequestration_potential", 200
), ),
custom_extra_functionality=workflow.source_path(
config["solver"]["options"].get("custom_extra_functionality", "")
),
input: input:
network=RESULTS network=RESULTS
+ "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc",

View File

@ -26,7 +26,9 @@ Additionally, some extra constraints specified in :mod:`solve_network` are added
the workflow for all scenarios in the configuration file (``scenario:``) the workflow for all scenarios in the configuration file (``scenario:``)
based on the rule :mod:`solve_network`. based on the rule :mod:`solve_network`.
""" """
import importlib
import logging import logging
import os
import re import re
import numpy as np import numpy as np
@ -792,6 +794,11 @@ def extra_functionality(n, snapshots):
add_carbon_budget_constraint(n, snapshots) add_carbon_budget_constraint(n, snapshots)
add_retrofit_gas_boiler_constraint(n, snapshots) add_retrofit_gas_boiler_constraint(n, snapshots)
if snakemake.params.custom_extra_functionality:
source_path = snakemake.params.custom_extra_functionality
module_name = os.path.splitext(os.path.basename(source_path))[0]
module = importlib.import_module(module_name)
module.custom_extra_functionality(n, snapshots)
def solve_network(n, config, solving, opts="", **kwargs): def solve_network(n, config, solving, opts="", **kwargs):
set_of_options = solving["solver"]["options"] set_of_options = solving["solver"]["options"]