Source code for simod.settings.extraneous_delays_settings
from extraneous_activity_delays.config import (
OptimizationMetric as ExtraneousDelaysOptimizationMetric,
DiscoveryMethod as ExtraneousDelaysDiscoveryMethod,
)
from pydantic import BaseModel
from simod.settings.common_settings import Metric
[docs]
class ExtraneousDelaysSettings(BaseModel):
"""
Configuration settings for extraneous delay optimization.
This class defines parameters for discovering and optimizing extraneous
delays in process simulations, including optimization metrics, discovery
methods, and iteration settings. In each iteration of the optimization process, the
parameters are sampled from these values or ranges.
Attributes
----------
optimization_metric : :class:`ExtraneousDelaysOptimizationMetric`
The metric used to evaluate process model quality at each iteration of the optimization process (i.e.,
loss function).
num_iterations : int
The number of optimization iterations to perform.
num_evaluations_per_iteration : int
The number of replications for the evaluations of each iteration.
discovery_method : :class:`ExtraneousDelaysDiscoveryMethod`
The method used to discover extraneous delays.
"""
optimization_metric: ExtraneousDelaysOptimizationMetric = ExtraneousDelaysOptimizationMetric.RELATIVE_EMD
discovery_method: ExtraneousDelaysDiscoveryMethod = ExtraneousDelaysDiscoveryMethod.COMPLEX
num_iterations: int = 1
num_evaluations_per_iteration: int = 3
[docs]
@staticmethod
def from_dict(config: dict) -> "ExtraneousDelaysSettings":
"""
Instantiates the extraneous delays model configuration from a dictionary.
Parameters
----------
config : dict
Dictionary with the configuration values for the extraneous delays model parameters.
Returns
-------
:class:`ExtraneousDelaysSettings`
Instance of the extraneous delays model configuration for the specified dictionary values.
"""
optimization_metric = ExtraneousDelaysSettings._match_metric(
config.get("optimization_metric", "relative_event_distribution")
)
discovery_method = ExtraneousDelaysSettings._match_method(config.get("discovery_method", "eclipse-aware"))
num_iterations = config.get("num_iterations", 1)
num_evaluations_per_iteration = config.get("num_evaluations_per_iteration", 3)
return ExtraneousDelaysSettings(
optimization_metric=optimization_metric,
discovery_method=discovery_method,
num_iterations=num_iterations,
num_evaluations_per_iteration=num_evaluations_per_iteration,
)
[docs]
def to_dict(self) -> dict:
"""
Translate the extraneous delays model configuration stored in this instance into a dictionary.
Returns
-------
dict
Python dictionary storing this configuration.
"""
return {
"optimization_metric": str(self.optimization_metric.name),
"discovery_method": str(self.discovery_method.name),
"num_iterations": self.num_iterations,
"num_evaluations_per_iteration": self.num_evaluations_per_iteration,
}
@staticmethod
def _match_metric(metric: str) -> ExtraneousDelaysOptimizationMetric:
metric = Metric.from_str(metric)
if metric == Metric.ABSOLUTE_EMD:
return ExtraneousDelaysOptimizationMetric.ABSOLUTE_EMD
elif metric == Metric.CYCLE_TIME_EMD:
return ExtraneousDelaysOptimizationMetric.CYCLE_TIME
elif metric == Metric.CIRCADIAN_EMD:
return ExtraneousDelaysOptimizationMetric.CIRCADIAN_EMD
elif metric == Metric.RELATIVE_EMD:
return ExtraneousDelaysOptimizationMetric.RELATIVE_EMD
else:
raise ValueError(f"Unknown extraneous delays optimization metric {metric}")
@staticmethod
def _match_method(method: str) -> ExtraneousDelaysDiscoveryMethod:
if method.lower() in ["naive", "naiv", "naiiv"]:
return ExtraneousDelaysDiscoveryMethod.NAIVE
elif method.lower() in ["complex", "eclipse-aware", "eclipseaware", "eclipse aware"]:
return ExtraneousDelaysDiscoveryMethod.COMPLEX
else:
raise ValueError(f"Unknown extraneous delays discovery method {method}")