Source code for monee.problem.metric
from abc import ABC, abstractmethod
import monee.model as md
class PerformanceMetric(ABC):
"""
No docstring provided.
"""
@abstractmethod
def calc(self, network: md.Network):
"""
No docstring provided.
"""
class ResilienceMetric(ABC):
"""
No docstring provided.
"""
@abstractmethod
def gather(self, network: md.Network, step, **kwargs):
"""
No docstring provided.
"""
@abstractmethod
def calc(self):
"""
No docstring provided.
"""
class rlist(list):
"""
No docstring provided.
"""
def __init__(self, default):
self._default = default
def __setitem__(self, key, value):
"""
No docstring provided.
"""
if key >= len(self):
self += [self._default] * (key - len(self) + 1)
super().__setitem__(key, value)
def is_load(component):
"""
No docstring provided.
"""
model = component.model
grid = component.grid
return (
isinstance(model, md.PowerLoad)
or (isinstance(model, md.Sink) and isinstance(grid, md.GasGrid))
or isinstance(model, md.HeatExchangerLoad)
or isinstance(model, md.ExtPowerGrid)
or isinstance(model, md.ExtHydrGrid)
and isinstance(grid, md.GasGrid)
)
[docs]
class GeneralResiliencePerformanceMetric(PerformanceMetric):
"""
No docstring provided.
"""
[docs]
def get_relevant_components(self, network: md.Network):
"""
No docstring provided.
"""
return [
component
for component in network.childs + network.branches
if is_load(component)
]
[docs]
def calc(self, network, inv=False, include_ext_grid=True):
"""
No docstring provided.
"""
relevant_components = self.get_relevant_components(network)
power_load_curtailed = 0
heat_load_curtailed = 0
gas_load_curtailed = 0
for component in relevant_components:
model = component.model
if component.ignored or not component.active:
if isinstance(model, md.PowerLoad):
power_load_curtailed += md.upper(model.p_mw)
if isinstance(model, md.Sink):
gas_load_curtailed += (
md.upper(model.mass_flow)
* 3.6
* component.grid.higher_heating_value
)
if isinstance(model, md.HeatExchangerLoad):
heat_load_curtailed += md.upper(model.q_w) / 10**6
continue
if isinstance(model, md.ExtHydrGrid) and include_ext_grid:
if md.value(model.mass_flow) < 0:
# only if ext grid needs to feed in (load would need to be shedded)
gas_load_curtailed += (
-md.value(model.mass_flow)
* 3.6
* component.grid.higher_heating_value
)
if isinstance(model, md.ExtPowerGrid) and include_ext_grid:
if md.value(model.p_mw) < 0:
# only if ext grid needs to feed in (load would need to be shedded)
power_load_curtailed += -md.value(model.p_mw)
if isinstance(model, md.PowerLoad):
power_load_curtailed += md.upper(model.p_mw) - md.value(
model.p_mw
) * md.value(model.regulation)
if isinstance(model, md.Sink):
gas_load_curtailed += (
(
md.upper(model.mass_flow)
- md.value(model.mass_flow) * md.value(model.regulation)
)
* 3.6
* component.grid.higher_heating_value
)
if isinstance(model, md.HeatExchangerLoad):
heat_load_curtailed += (
md.upper(model.q_w)
- md.value(model.q_w) * md.value(model.regulation)
) / 10**6
if inv:
return (-power_load_curtailed, -heat_load_curtailed, -gas_load_curtailed)
else:
return (power_load_curtailed, heat_load_curtailed, gas_load_curtailed)