Source code for apem.order_book_based_model.euphemia.euphemia_config
from typing import Any, Mapping, Optional
from apem.order_book_based_model.euphemia.data.parsing.zonal_scenario import ZonalScenario
from apem.order_book_based_model.euphemia.enums.cut_types import CutTypes
from apem.order_book_based_model.euphemia.enums.datasets import OrderBookBased_Datasets
[docs]
class EuphemiaConfig:
"""
Configuration object and override validation for Euphemia algorithm.
"""
def __init__(self) -> None:
self.scenario: Optional[ZonalScenario] = None
self.set_dataset(OrderBookBased_Datasets.GENERATED_SMALL) # "Generated Small" as base dataset
# Core Euphemia behavior
self.disable_reinsertion = True # Disable automatic start of reinsertions
self.calculate_corrected_welfare = False # Deduct surplus of inelastic demand from welfare (24 periods only)
self.cutting_strategy = CutTypes.CB # Cutting strategy to be used
# Algorithm parameters
self.price_lower_bound = -500 # Lower price bound
self.price_upper_bound = 4000 # Upper price bound
self.beta_MIC = 0.1 # Parameter how much paradoxically accepted MIC must be OTM
self.delta_load_gradient = 5000 # Parameter how much paradoxically accepted load gradient must be OTM
self.delta_PAB = 50 # currently not in use
self.epsilon = 1e-4 # Epsilon for Gurobi float values
self.max_iterations = 50 # Iteration Limit
self.reinsertion_max_iterations = 10 # Iteration limit for reinsertion runs
self.max_prb_reinsertion_attempts = None # Optional cap for attempted PRB block reinsertions
self.big_m = 10 ** 6 # Big-M value used in master/pricing formulations
self.network_model = "ATC" # One of: "ATC", "FBMC"
# Solver parameters
self.lazy_constraints = 1
self.output_flag = 0
self.time_limit = None
self.mip_gap = None
self.threads = None
self.seed = None
[docs]
def set_dataset(self, dataset: OrderBookBased_Datasets) -> None:
"""
Set the dataset to use.
"""
self.dataset = dataset.name
self.scenario = dataset.value.parse_data()
[docs]
def apply_overrides(self, overrides: Mapping[str, Any]) -> None:
"""
Apply validated configuration overrides from ``config.json``.
"""
if not overrides:
return
allowed_keys = {
"disable_reinsertion",
"calculate_corrected_welfare",
"price_lower_bound",
"price_upper_bound",
"beta_MIC",
"delta_load_gradient",
"delta_PAB",
"epsilon",
"max_iterations",
"reinsertion_max_iterations",
"max_prb_reinsertion_attempts",
"big_m",
"network_model",
"lazy_constraints",
"output_flag",
"time_limit",
"mip_gap",
"threads",
"seed",
}
unknown = sorted(set(overrides) - allowed_keys)
if unknown:
raise ValueError(
"Invalid Euphemia configuration key(s): "
+ ", ".join(unknown)
)
for key, value in overrides.items():
setattr(self, key, value)
self.network_model = str(self.network_model).upper()
if self.network_model not in {"ATC", "FBMC"}:
raise ValueError("Invalid Euphemia configuration key value: network_model must be 'ATC' or 'FBMC'.")