From acae09ababcea49f6fa92b83ae89983a7629fe79 Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Thu, 12 Jun 2025 15:22:29 +0300 Subject: [PATCH 01/12] Create settings for case arrival model optimization --- src/simod/settings/case_arrival_settings.py | 108 ++++++++++++++++++++ src/simod/settings/common_settings.py | 7 -- 2 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 src/simod/settings/case_arrival_settings.py diff --git a/src/simod/settings/case_arrival_settings.py b/src/simod/settings/case_arrival_settings.py new file mode 100644 index 00000000..784b3a54 --- /dev/null +++ b/src/simod/settings/case_arrival_settings.py @@ -0,0 +1,108 @@ +from enum import Enum +from typing import List, Optional, Tuple, Union + +from pix_framework.discovery.gateway_probabilities import GatewayProbabilitiesDiscoveryMethod +from pydantic import BaseModel + +from .common_settings import Metric +from ..utilities import parse_single_value_or_interval + + +class CaseArrivalSettings(BaseModel): + """ + Case arrival model configuration parameters. + + This class defines the ranges of the configurable parameters for optimizing the case arrival + model of a discovered BPS model, including the metric to assess the quality of each iteration, + iteration settings, and the threshold parameter to discard outlier observations. In each + iteration of the optimization process, the parameters are sampled from these values or ranges. + + Attributes + ---------- + optimization_metric : :class:`~simod.settings.common_settings.Metric` + 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. + outlier_threshold : Union[float, Tuple[float, float]], optional + Fixed value or range for the threshold used to filter outliers. + use_observed_arrival_distribution : bool + Boolean indicating whether to use the distribution of observed case arrival times (true), or to discover a + probability distribution function to model them (false). + """ + + optimization_metric: Metric = Metric.ARRIVAL_EMD + num_iterations: int = 10 + num_evaluations_per_iteration: int = 3 + outlier_threshold: Optional[Union[float, Tuple[float, float]]] = 20.0 + use_observed_arrival_distribution: bool = False + + @staticmethod + def one_shot() -> "CaseArrivalSettings": + """ + Instantiates the case arrival model configuration for the one-shot mode (i.e., no optimization, one single + iteration). + + Returns + ------- + :class:`CaseArrivalSettings` + Instance of the case arrival model configuration for the one-shot mode. + """ + return CaseArrivalSettings( + optimization_metric=Metric.THREE_GRAM_DISTANCE, + num_iterations=1, + num_evaluations_per_iteration=1, + outlier_threshold=20.0, + use_observed_arrival_distribution=False, + ) + + @staticmethod + def from_dict(config: dict) -> "CaseArrivalSettings": + """ + Instantiates the case arrival model configuration from a dictionary. + + Parameters + ---------- + config : dict + Dictionary with the configuration values for the case arrival model parameters. + + Returns + ------- + :class:`CaseArrivalSettings` + Instance of the case arrival model configuration for the specified dictionary values. + """ + optimization_metric = Metric.from_str(config.get("optimization_metric", "arrival_event_distribution")) + num_iterations = config.get("num_iterations", 10) + num_evaluations_per_iteration = config.get("num_evaluations_per_iteration", 3) + + outlier_threshold = parse_single_value_or_interval(config.get("outlier_threshold", (0.0, 50.0))) + use_observed_arrival_distribution = config.get("use_observed_arrival_distribution", False) + + return CaseArrivalSettings( + optimization_metric=optimization_metric, + num_iterations=num_iterations, + num_evaluations_per_iteration=num_evaluations_per_iteration, + outlier_threshold=outlier_threshold, + use_observed_arrival_distribution=use_observed_arrival_distribution, + ) + + def to_dict(self) -> dict: + """ + Translate the control-flow model configuration stored in this instance into a dictionary. + + Returns + ------- + dict + Python dictionary storing this configuration. + """ + dictionary = { + "optimization_metric": self.optimization_metric.value, + "num_iterations": self.num_iterations, + "num_evaluations_per_iteration": self.num_evaluations_per_iteration, + "outlier_threshold": self.outlier_threshold, + "use_observed_arrival_distribution": self.use_observed_arrival_distribution + } + + return dictionary diff --git a/src/simod/settings/common_settings.py b/src/simod/settings/common_settings.py index 484f21b2..69620616 100644 --- a/src/simod/settings/common_settings.py +++ b/src/simod/settings/common_settings.py @@ -149,9 +149,6 @@ class CommonSettings(BaseModel): Number of replications of the final evaluation to perform. evaluation_metrics : list List of :class:`Metric` evaluation metrics to use in the final evaluation. - use_observed_arrival_distribution : bool - Boolean indicating whether to use the distribution of observed case arrival times (true), or to discover a - probability distribution function to model them (false). clean_intermediate_files : bool Boolean indicating whether to delete all intermediate created files. discover_data_attributes : bool @@ -168,7 +165,6 @@ class CommonSettings(BaseModel): num_final_evaluations: int = 10 evaluation_metrics: List[Metric] = field(default_factory=list) # Common config - use_observed_arrival_distribution: bool = False clean_intermediate_files: bool = True discover_data_attributes: bool = False @@ -254,7 +250,6 @@ def from_dict(config: dict, config_dir: Optional[Path] = None) -> "CommonSetting ) num_final_evaluations = 10 - use_observed_arrival_distribution = config.get("use_observed_arrival_distribution", False) clean_up = config.get("clean_intermediate_files", True) discover_data_attributes = config.get("discover_data_attributes", False) @@ -266,7 +261,6 @@ def from_dict(config: dict, config_dir: Optional[Path] = None) -> "CommonSetting perform_final_evaluation=perform_final_evaluation, num_final_evaluations=num_final_evaluations, evaluation_metrics=metrics, - use_observed_arrival_distribution=use_observed_arrival_distribution, clean_intermediate_files=clean_up, discover_data_attributes=discover_data_attributes, ) @@ -287,7 +281,6 @@ def to_dict(self) -> dict: "process_model_path": str(self.process_model_path) if self.process_model_path is not None else None, "num_final_evaluations": self.num_final_evaluations, "evaluation_metrics": [str(metric) for metric in self.evaluation_metrics], - "use_observed_arrival_distribution": self.use_observed_arrival_distribution, "clean_intermediate_files": self.clean_intermediate_files, "discover_data_attributes": self.discover_data_attributes, } From 40c73724c6cbf122cf79ecf2ee1777f6c81c9138 Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Thu, 12 Jun 2025 16:00:59 +0300 Subject: [PATCH 02/12] Add case arrival settings to SIMOD settings and create tests --- src/simod/settings/simod_settings.py | 46 ++++++++++--- tests/test_settings/test_simod_settings.py | 75 ++++++++++++++++++++-- 2 files changed, 109 insertions(+), 12 deletions(-) diff --git a/src/simod/settings/simod_settings.py b/src/simod/settings/simod_settings.py index bb7b531e..f1bccdb7 100644 --- a/src/simod/settings/simod_settings.py +++ b/src/simod/settings/simod_settings.py @@ -5,6 +5,7 @@ import yaml from pydantic import BaseModel +from .case_arrival_settings import CaseArrivalSettings from .common_settings import CommonSettings from .control_flow_settings import ControlFlowSettings from .extraneous_delays_settings import ExtraneousDelaysSettings @@ -18,8 +19,8 @@ class SimodSettings(BaseModel): """ - SIMOD configuration v5 with the settings for all the stages and optimizations. - If configuration is provided in v2 or v4, it is automatically translated to v5. + SIMOD configuration v5.2 with the settings for all the stages and optimizations. + If configuration is provided in v2, v4, or v5 it is automatically translated to v5.2. Attributes ---------- @@ -34,16 +35,17 @@ class SimodSettings(BaseModel): extraneous_activity_delays : :class:`~simod.settings.extraneous_delays_settings.ExtraneousDelaysSettings` Configuration parameters for the extraneous delays model discovery stage. If not provided, the extraneous delays are not discovered. - version : int + version : float SIMOD version. """ common: CommonSettings = CommonSettings() preprocessing: PreprocessingSettings = PreprocessingSettings() + case_arrival: CaseArrivalSettings = CaseArrivalSettings() control_flow: ControlFlowSettings = ControlFlowSettings() resource_model: ResourceModelSettings = ResourceModelSettings() extraneous_activity_delays: Union[ExtraneousDelaysSettings, None] = None - version: int = 5 + version: float = 5.2 @staticmethod def default() -> "SimodSettings": @@ -59,6 +61,7 @@ def default() -> "SimodSettings": return SimodSettings( common=CommonSettings(), preprocessing=PreprocessingSettings(), + case_arrival=CaseArrivalSettings(), control_flow=ControlFlowSettings(), resource_model=ResourceModelSettings(), extraneous_activity_delays=ExtraneousDelaysSettings(), @@ -78,6 +81,7 @@ def one_shot() -> "SimodSettings": return SimodSettings( common=CommonSettings(), preprocessing=PreprocessingSettings(), + case_arrival=CaseArrivalSettings.one_shot(), control_flow=ControlFlowSettings.one_shot(), resource_model=ResourceModelSettings.one_shot(), extraneous_activity_delays=ExtraneousDelaysSettings(), @@ -101,13 +105,15 @@ def from_yaml(config: dict, config_dir: Optional[Path] = None) -> "SimodSettings :class:`SimodSettings` Instance of the SIMOD configuration for the specified dictionary values. """ - assert config["version"] in [2, 4, 5], "Configuration version must be 2, 4, or 5" + assert config["version"] in [2, 4, 5, 5.2], "Configuration version must be 2, 4, 5, or 5.2" # Transform from previous version to the latest if needed if config["version"] == 2: config = _parse_legacy_config_2(config) elif config["version"] == 4: config = _parse_legacy_config_4(config) + elif config["version"] == 5: + config = _parse_legacy_config_5(config) # Get each of the settings components if present, default otherwise if "common" in config: @@ -119,6 +125,11 @@ def from_yaml(config: dict, config_dir: Optional[Path] = None) -> "SimodSettings preprocessing_settings = PreprocessingSettings.from_dict(config["preprocessing"]) else: preprocessing_settings = PreprocessingSettings() + if "case_arrival" in config: + case_arrival_settings = CaseArrivalSettings.from_dict(config["case_arrival"]) + else: + print_notice("No 'case_arrival' settings provided, running Simod with default values.") + case_arrival_settings = CaseArrivalSettings() if "control_flow" in config: control_flow_settings = ControlFlowSettings.from_dict(config["control_flow"]) else: @@ -147,6 +158,7 @@ def from_yaml(config: dict, config_dir: Optional[Path] = None) -> "SimodSettings version=config["version"], common=common_settings, preprocessing=preprocessing_settings, + case_arrival=case_arrival_settings, control_flow=control_flow_settings, resource_model=resource_model_settings, extraneous_activity_delays=extraneous_delays_settings, @@ -184,6 +196,7 @@ def to_dict(self) -> dict: "version": self.version, "common": self.common.to_dict(), "preprocessing": self.preprocessing.to_dict(), + "case_arrival": self.case_arrival.to_dict(), "control_flow": self.control_flow.to_dict(), "resource_model": self.resource_model.to_dict(), } @@ -215,8 +228,8 @@ def to_yaml(self, output_dir: Path) -> Path: def _parse_legacy_config_2(config: dict) -> dict: parsed_config = copy.deepcopy(config) if config["version"] == 2: - # Transform dictionary from version 2 to 5 - parsed_config["version"] = 5 + # Transform dictionary from version 2 to 5.2 + parsed_config["version"] = 5.2 # Common elements if "log_path" in parsed_config["common"]: parsed_config["common"]["train_log_path"] = parsed_config["common"]["log_path"] @@ -255,11 +268,28 @@ def _parse_legacy_config_2(config: dict) -> dict: def _parse_legacy_config_4(config: dict) -> dict: parsed_config = copy.deepcopy(config) if config["version"] == 4: - # Transform dictionary from version 4 to 5 + # Transform dictionary from version 4 to 5.2 parsed_config["version"] = 5 # Common elements if "discover_case_attributes" in parsed_config["common"]: parsed_config["common"]["discover_data_attributes"] = parsed_config["common"]["discover_case_attributes"] del parsed_config["common"]["discover_case_attributes"] + # Transform from v5 to v5.2 + parsed_config = _parse_legacy_config_5(parsed_config) + # Return parsed configuration + return parsed_config + + +def _parse_legacy_config_5(config: dict) -> dict: + parsed_config = copy.deepcopy(config) + if config["version"] == 5: + # Transform dictionary from version 4 to 5 + parsed_config["version"] = 5.2 + # Common elements + if "use_observed_arrival_distribution" in parsed_config["common"]: + parsed_config["case_arrival"] = { + "use_observed_arrival_distribution": parsed_config["common"]["use_observed_arrival_distribution"] + } + del parsed_config["common"]["use_observed_arrival_distribution"] # Return parsed configuration return parsed_config diff --git a/tests/test_settings/test_simod_settings.py b/tests/test_settings/test_simod_settings.py index 2af91f68..ed267ae1 100644 --- a/tests/test_settings/test_simod_settings.py +++ b/tests/test_settings/test_simod_settings.py @@ -2,8 +2,61 @@ import yaml +from simod.settings.case_arrival_settings import CaseArrivalSettings from simod.settings.simod_settings import SimodSettings +settings_5_2 = """ +version: 5.2 +common: + train_log_path: assets/LoanApp_simplified.csv.gz + perform_final_evaluation: true + num_final_evaluations: 1 + evaluation_metrics: + - dl + - absolute_event_distribution + discover_data_attributes: true +preprocessing: + multitasking: false +case_arrival: + num_iterations: 2 + optimization_metric: arrival_event_distribution + num_evaluations_per_iteration: 4 + outlier_threshold: + - 5.0 + - 50.0 +control_flow: + num_iterations: 2 + mining_algorithm: sm1 + epsilon: + - 0.0 + - 1.0 + eta: + - 0.0 + - 1.0 + gateway_probabilities: + - equiprobable + - discovery + replace_or_joins: + - true + - false + prioritize_parallelism: + - true + - false +resource_model: + num_iterations: 2 + discover_prioritization_rules: true + resource_profiles: + discovery_type: differentiated_by_pool + granularity: 60 + confidence: + - 0.5 + - 0.85 + support: + - 0.01 + - 0.3 + participation: 0.4 +""" + settings_5 = """ version: 5 common: @@ -14,6 +67,7 @@ - dl - absolute_event_distribution discover_data_attributes: true + use_observed_arrival_distribution: true preprocessing: multitasking: false control_flow: @@ -95,8 +149,8 @@ """ -def test_configuration(): - config = yaml.safe_load(settings_5) +def test_latest_configuration(): + config = yaml.safe_load(settings_5_2) result = SimodSettings.from_yaml(config) assert result is not None @@ -106,11 +160,24 @@ def test_configuration(): assert_resource_model(config, result) -def test_configuration_legacy(): - ground_truth = SimodSettings.from_yaml(yaml.safe_load(settings_5)) +def test_configuration_legacy_5(): + ground_truth = SimodSettings.from_yaml(yaml.safe_load(settings_5_2)) + legacy = SimodSettings.from_yaml(yaml.safe_load(settings_5)) + + assert legacy is not None + assert legacy.case_arrival.use_observed_arrival_distribution + legacy.case_arrival = ground_truth.case_arrival # Override different case_arrival component to compare the rest + assert ground_truth.to_dict() == legacy.to_dict() + + +def test_configuration_legacy_4(): + ground_truth = SimodSettings.from_yaml(yaml.safe_load(settings_5_2)) legacy = SimodSettings.from_yaml(yaml.safe_load(settings_4)) assert legacy is not None + assert not legacy.case_arrival.use_observed_arrival_distribution + assert legacy.case_arrival.to_dict() == CaseArrivalSettings().to_dict() # Assert case arrival model is default + legacy.case_arrival = ground_truth.case_arrival # Override different case_arrival component to compare the rest assert ground_truth.to_dict() == legacy.to_dict() From ddf8ee4d678e36f021c07d87a313ecd60401691c Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Fri, 13 Jun 2025 13:59:25 +0300 Subject: [PATCH 03/12] Create optimizer and HyperParams structure for Case Arrival Model --- src/simod/case_arrival/__init__.py | 0 src/simod/case_arrival/optimizer.py | 289 ++++++++++++++++++++ src/simod/case_arrival/settings.py | 74 +++++ src/simod/settings/case_arrival_settings.py | 8 +- 4 files changed, 367 insertions(+), 4 deletions(-) create mode 100644 src/simod/case_arrival/__init__.py create mode 100644 src/simod/case_arrival/optimizer.py create mode 100644 src/simod/case_arrival/settings.py diff --git a/src/simod/case_arrival/__init__.py b/src/simod/case_arrival/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/simod/case_arrival/optimizer.py b/src/simod/case_arrival/optimizer.py new file mode 100644 index 00000000..6a52abab --- /dev/null +++ b/src/simod/case_arrival/optimizer.py @@ -0,0 +1,289 @@ +import json +import shutil +from pathlib import Path +from typing import List, Optional, Tuple + +import hyperopt +import numpy as np +import pandas as pd +from hyperopt import STATUS_FAIL, STATUS_OK, Trials, fmin, hp, tpe +from pix_framework.discovery.case_arrival import discover_case_arrival_model, CaseArrivalModel +from pix_framework.filesystem.file_manager import create_folder, get_random_folder_id, remove_asset + +from .settings import HyperoptIterationParams +from ..cli_formatter import print_message, print_step, print_subsection +from ..event_log.event_log import EventLog +from ..settings.case_arrival_settings import CaseArrivalSettings +from ..simulation.parameters.BPS_model import BPSModel +from ..simulation.prosimos import simulate_and_evaluate +from ..utilities import get_process_model_path, get_simulation_parameters_path, hyperopt_step + + +class CaseArrivalOptimizer: + """ + Optimizes the case-arrival of a business process simulation (BPS) model using hyperparameter + optimization. + + This class performs iterative optimization to refine the case arrival model of a BPS model.. + + The search space is built based on the parameters ranges in [settings]. + + Attributes + ---------- + event_log : :class:`EventLog` + Event log containing train and validation partitions. + initial_bps_model : :class:`BPSModel` + Business process simulation (BPS) model to use as a base, by replacing its control-flow model + with the discovered one in each iteration. + settings : :class:`~simod.settings.case_arrival_settings.CaseArrivalSettings` + Configuration settings to build the search space for the optimization process. + base_directory : :class:`pathlib.Path` + Root directory where output files will be stored. + best_bps_model : :class:`BPSModel`, optional + Best discovered BPS model after the optimization process. + evaluation_measurements : :class:`pandas.DataFrame` + Quality measures recorded for each hyperopt iteration. + + Notes + ----- + - Currently, this process only optimizes the threshold to discard outliers when learning the + inter-arrival probability distribution. + """ + + # Event log with train/validation partitions + event_log: EventLog + # BPS model taken as starting point + initial_bps_model: BPSModel + # Configuration settings + settings: CaseArrivalSettings + # Root directory for the output files + base_directory: Path + # Path to the best process model + best_bps_model: Optional[BPSModel] + # Quality measure of each hyperopt iteration + evaluation_measurements: pd.DataFrame + + # Set of trials for the hyperparameter optimization process + _bayes_trials = Trials + + def __init__( + self, + event_log: EventLog, + bps_model: BPSModel, + settings: CaseArrivalSettings, + base_directory: Path, + ): + # Save event log, optimization settings, and output directory + self.event_log = event_log + self.initial_bps_model = bps_model.deep_copy() + self.settings = settings + self.base_directory = base_directory + # Check if it is needed to discover the process model + self.best_bps_model = None + # Initialize table to store quality measures of each iteration + self.evaluation_measurements = pd.DataFrame( + columns=[ + "distance", + "metric", + "status", + "outlier_threshold", + ] + ) + # Instantiate trials for hyper-optimization process + self._bayes_trials = Trials() + self.iteration_index = 0 + + def _hyperopt_iteration(self, hyperopt_iteration_dict: dict): + # Report new iteration + print_subsection(f"Case Arrival Model optimization iteration {self.iteration_index}") + # Initialize status + status = STATUS_OK + # Create folder for this iteration + output_dir = self.base_directory / get_random_folder_id(prefix="iteration_") + create_folder(output_dir) + # Initialize BPS model for this iteration + current_bps_model = self.initial_bps_model.deep_copy() + # Parameters of this iteration + hyperopt_iteration_params = HyperoptIterationParams.from_hyperopt_dict( + hyperopt_dict=hyperopt_iteration_dict, + optimization_metric=self.settings.optimization_metric, + output_dir=output_dir, + project_name=self.event_log.process_name, + ) + print_message(f"Parameters: {hyperopt_iteration_params}") + + # Discover case arrival model + status, current_bps_model.case_arrival_model = hyperopt_step( + status, + self._discover_case_arrival_model, + hyperopt_iteration_params, + ) + + # Simulate candidate and evaluate its quality + status, evaluation_measurements = hyperopt_step( + status, + self._simulate_bps_model, + current_bps_model, + hyperopt_iteration_params.output_dir + ) + + # Define the response of this iteration + status, response = self._define_response( + status, evaluation_measurements, hyperopt_iteration_params.output_dir, current_bps_model.process_model + ) + print(f"Case Arrival Model optimization iteration response: {response}") + + # Save the quality of this evaluation and increase iteration index + self._process_measurements(hyperopt_iteration_params, status, evaluation_measurements) + self.iteration_index += 1 + + return response + + def run(self) -> HyperoptIterationParams: + """ + Run the case arrival optimization process. + + This method defines the hyperparameter search space and executes a + TPE-hyperparameter optimization process to discover the best case arrival model. + It evaluates multiple iterations and selects the best-performing set of parameters + for its discovery. + + Returns + ------- + :class:`~simod.case_arrival.settings.HyperoptIterationParams` + The parameters of the best iteration of the optimization process. + """ + # Define search space + self.iteration_index = 0 + search_space = self._define_search_space() + + # Launch optimization process + params_best_iteration = fmin( + fn=self._hyperopt_iteration, + space=search_space, + algo=tpe.suggest, + max_evals=self.settings.num_iterations, + trials=self._bayes_trials, + show_progressbar=False, + ) + params_best_iteration = hyperopt.space_eval(search_space, params_best_iteration) + + # Process best results + results = pd.DataFrame(self._bayes_trials.results).sort_values("loss") + best_result = results[results.status == STATUS_OK].iloc[0] + + # Re-build parameters of the best hyperopt iteration + best_hyperopt_parameters = HyperoptIterationParams.from_hyperopt_dict( + hyperopt_dict=params_best_iteration, + optimization_metric=self.settings.optimization_metric, + output_dir=best_result["output_dir"], + project_name=self.event_log.process_name, + ) + + # Instantiate best BPS model + self.best_bps_model = self.initial_bps_model.deep_copy() + # Update best process model (save it in base directory) + self.best_bps_model.process_model = get_process_model_path(self.base_directory, self.event_log.process_name) + shutil.copyfile(best_result["process_model_path"], self.best_bps_model.process_model) + # Update simulation parameters (save them in base directory) + best_parameters_path = get_simulation_parameters_path(self.base_directory, self.event_log.process_name) + shutil.copyfile( + get_simulation_parameters_path(best_result["output_dir"], self.event_log.process_name), best_parameters_path + ) + # Update case arrival model + self.best_bps_model.case_arrival_model = CaseArrivalModel.from_dict(json.load(open(best_parameters_path, "r"))) + + # Save evaluation measurements + self.evaluation_measurements.sort_values("distance", ascending=True, inplace=True) + self.evaluation_measurements.to_csv(self.base_directory / "evaluation_measures.csv", index=False) + + # Return settings of the best iteration + return best_hyperopt_parameters + + def _define_search_space(self) -> dict: + space = {} + # Outlier threshold + if isinstance(self.settings.outlier_threshold, tuple): + space["outlier_threshold"] = hp.uniform( + "outlier_threshold", + self.settings.outlier_threshold[0], + self.settings.outlier_threshold[1] + ) + else: + space["outlier_threshold"] = self.settings.outlier_threshold + return space + + def cleanup(self): + remove_asset(self.base_directory) + + @staticmethod + def _define_response( + status: str, + evaluation_measurements: list, + output_dir: Path, + process_model_path: Path + ) -> Tuple[str, dict]: + # Compute mean distance if status is OK + if status is STATUS_OK: + distance = np.mean([x["distance"] for x in evaluation_measurements]) + # Change status if distance value is negative + if distance < 0.0: + status = STATUS_FAIL + else: + distance = 1.0 + # Define response dict + response = { + "loss": distance, # Loss value for the fmin function + "status": status, # Status of the optimization iteration + "output_dir": output_dir, + "process_model_path": process_model_path, + } + # Return updated status and processed response + return status, response + + def _process_measurements(self, params: HyperoptIterationParams, status, evaluation_measurements): + optimization_parameters = params.to_dict() + optimization_parameters["status"] = status + + if status == STATUS_OK: + for measurement in evaluation_measurements: + values = { + "distance": measurement["distance"], + "metric": measurement["metric"], + } + values = values | optimization_parameters + self.evaluation_measurements = pd.concat([self.evaluation_measurements, pd.DataFrame([values])]) + else: + values = { + "distance": 0, + "metric": params.optimization_metric, + } + values = values | optimization_parameters + self.evaluation_measurements = pd.concat([self.evaluation_measurements, pd.DataFrame([values])]) + + def _discover_case_arrival_model(self, params: HyperoptIterationParams) -> CaseArrivalModel: + print_step(f"Discovering Case Arrival Model with threshold {params.outlier_threshold}") + return discover_case_arrival_model( + self.event_log.train_partition, + self.event_log.log_ids, + outlier_threshold=params.outlier_threshold, + ) + + def _simulate_bps_model(self, bps_model: BPSModel, output_dir: Path) -> List[dict]: + bps_model.replace_activity_names_with_ids() + + json_parameters_path = bps_model.to_json(output_dir, self.event_log.process_name) + + evaluation_measures = simulate_and_evaluate( + process_model_path=bps_model.process_model, + parameters_path=json_parameters_path, + output_dir=output_dir, + simulation_cases=self.event_log.validation_partition[self.event_log.log_ids.case].nunique(), + simulation_start_time=self.event_log.validation_partition[self.event_log.log_ids.start_time].min(), + validation_log=self.event_log.validation_partition, + validation_log_ids=self.event_log.log_ids, + metrics=[self.settings.optimization_metric], + num_simulations=self.settings.num_evaluations_per_iteration, + ) + + return evaluation_measures diff --git a/src/simod/case_arrival/settings.py b/src/simod/case_arrival/settings.py new file mode 100644 index 00000000..28aae4ea --- /dev/null +++ b/src/simod/case_arrival/settings.py @@ -0,0 +1,74 @@ +from dataclasses import dataclass +from pathlib import Path +from typing import Optional + +from simod.settings.common_settings import Metric + + +@dataclass +class HyperoptIterationParams: + """ + Parameters for a single iteration of the Case-Arrival optimization process. + + This class defines the configuration settings used during an iteration of the + optimization process of the case arrival model. + + Attributes + ---------- + output_dir : :class:`pathlib.Path` + Directory where all output files for the current iteration will be stored. + project_name : str + Name of the project, mainly used for file naming. + optimization_metric : :class:`Metric` + Metric used to evaluate the candidate process model in this iteration. + outlier_threshold : float, optional + Threshold to use when filtering outliers (positive number). + + Notes + ----- + - Currently, this process only tries different outlier thresholds. Implemented + as HyperOpt process for convenience and potential extension with more complex + case arrival model discovery. + """ + + # General settings + output_dir: Path # Directory where to output all the files of the current iteration + project_name: str # Name of the project for file naming + + optimization_metric: Metric # Metric to evaluate the candidate of this iteration + outlier_threshold: Optional[float] # Outlier threshold + + def to_dict(self) -> dict: + """ + Converts the instance into a dictionary representation of the optimization parameters. + + Returns + ------- + dict + A dictionary containing the optimization parameters for this iteration. + """ + optimization_parameters = { + "output_dir": str(self.output_dir), + "project_name": str(self.project_name), + "optimization_metric": str(self.optimization_metric), + "outlier_threshold": self.outlier_threshold, + } + + return optimization_parameters + + @staticmethod + def from_hyperopt_dict( + hyperopt_dict: dict, + optimization_metric: Metric, + output_dir: Path, + project_name: str, + ) -> "HyperoptIterationParams": + """Create the params for this run from the hyperopt dictionary returned by the fmin function.""" + outlier_threshold = hyperopt_dict.get("outlier_threshold", 20.0) + + return HyperoptIterationParams( + output_dir=output_dir, + project_name=project_name, + optimization_metric=optimization_metric, + outlier_threshold=outlier_threshold + ) diff --git a/src/simod/settings/case_arrival_settings.py b/src/simod/settings/case_arrival_settings.py index 784b3a54..55efda47 100644 --- a/src/simod/settings/case_arrival_settings.py +++ b/src/simod/settings/case_arrival_settings.py @@ -34,9 +34,9 @@ class CaseArrivalSettings(BaseModel): """ optimization_metric: Metric = Metric.ARRIVAL_EMD - num_iterations: int = 10 + num_iterations: int = 5 num_evaluations_per_iteration: int = 3 - outlier_threshold: Optional[Union[float, Tuple[float, float]]] = 20.0 + outlier_threshold: Optional[Union[float, Tuple[float, float]]] = (5.0, 50.0) use_observed_arrival_distribution: bool = False @staticmethod @@ -74,10 +74,10 @@ def from_dict(config: dict) -> "CaseArrivalSettings": Instance of the case arrival model configuration for the specified dictionary values. """ optimization_metric = Metric.from_str(config.get("optimization_metric", "arrival_event_distribution")) - num_iterations = config.get("num_iterations", 10) + num_iterations = config.get("num_iterations", 5) num_evaluations_per_iteration = config.get("num_evaluations_per_iteration", 3) - outlier_threshold = parse_single_value_or_interval(config.get("outlier_threshold", (0.0, 50.0))) + outlier_threshold = parse_single_value_or_interval(config.get("outlier_threshold", (5.0, 50.0))) use_observed_arrival_distribution = config.get("use_observed_arrival_distribution", False) return CaseArrivalSettings( From ccc251fb05b94e6ddc4d5b8ad4633ade12a058bc Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Fri, 13 Jun 2025 14:00:27 +0300 Subject: [PATCH 04/12] Refactor SIMOD pipeline to optimize case arrivals --- src/simod/runtime_meter.py | 1 + src/simod/simod.py | 71 +++++++++++++++++++++++++++++++++----- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/src/simod/runtime_meter.py b/src/simod/runtime_meter.py index bb4d38fb..b418e9a1 100644 --- a/src/simod/runtime_meter.py +++ b/src/simod/runtime_meter.py @@ -12,6 +12,7 @@ class RuntimeMeter: PREPROCESSING: str = "preprocessing" INITIAL_MODEL: str = "discover-initial-BPS-model" CONTROL_FLOW_MODEL: str = "optimize-control-flow-model" + CASE_ARRIVAL_MODEL: str = "case-arrival-model" RESOURCE_MODEL: str = "optimize-resource-model" DATA_ATTRIBUTES_MODEL: str = "discover-data-attributes" EXTRANEOUS_DELAYS: str = "discover-extraneous-delays" diff --git a/src/simod/simod.py b/src/simod/simod.py index 5e5992f9..301674a6 100644 --- a/src/simod/simod.py +++ b/src/simod/simod.py @@ -16,6 +16,8 @@ from simod.batching.discovery import discover_batching_rules from simod.branch_rules.discovery import discover_branch_rules, map_branch_rules_to_flows +from simod.case_arrival.optimizer import CaseArrivalOptimizer +from simod.case_arrival.settings import HyperoptIterationParams as CaseArrivalHyperoptIterationParams from simod.cli_formatter import print_section, print_subsection from simod.control_flow.discovery import discover_process_model, add_bpmn_diagram_to_model from simod.control_flow.optimizer import ControlFlowOptimizer @@ -66,6 +68,8 @@ class Simod: # Optimizer for the Control-Flow and Gateway Probabilities _control_flow_optimizer: Optional[ControlFlowOptimizer] + # Optimizer for the Case Arrival Model + _case_arrival_optimizer: Optional[CaseArrivalOptimizer] # Optimizer for the Resource Model _resource_model_optimizer: Optional[ResourceModelOptimizer] # Optimizer for the Extraneous Delay Timers @@ -89,6 +93,10 @@ def __init__( create_folder(self._control_flow_dir) self._resource_model_dir = self._output_dir / "resource_model" create_folder(self._resource_model_dir) + self._discover_inter_arrival_times = not self._settings.case_arrival.use_observed_arrival_distribution + if self._discover_inter_arrival_times: + self._case_arrival_dir = self._output_dir / "case_arrival" + create_folder(self._case_arrival_dir) if self._settings.extraneous_activity_delays is not None: self._extraneous_delays_dir = self._output_dir / "extraneous-delay-timers" create_folder(self._extraneous_delays_dir) @@ -134,9 +142,9 @@ def run(self, runtimes: Optional[RuntimeMeter] = None): print_section("Discovering initial BPS Model") runtimes.start(RuntimeMeter.INITIAL_MODEL) self._best_bps_model.case_arrival_model = discover_case_arrival_model( - self._event_log.train_validation_partition, # No optimization process here, use train + validation + self._event_log.train_partition, self._event_log.log_ids, - use_observed_arrival_distribution=self._settings.common.use_observed_arrival_distribution, + use_observed_arrival_distribution=self._settings.case_arrival.use_observed_arrival_distribution, ) calendar_discovery_parameters = CalendarDiscoveryParameters() self._best_bps_model.resource_model = discover_resource_model( @@ -177,6 +185,14 @@ def run(self, runtimes: Optional[RuntimeMeter] = None): self._best_bps_model.event_attributes = event_attributes runtimes.stop(RuntimeMeter.DATA_ATTRIBUTES_MODEL) + # --- Case Arrival Optimization --- # + if self._discover_inter_arrival_times: + print_section("Optimizing control-flow parameters") + runtimes.start(RuntimeMeter.CASE_ARRIVAL_MODEL) + best_case_arrival_params = self._optimize_case_arrival() + self._best_bps_model.case_arrival_model = self._case_arrival_optimizer.best_bps_model.case_arrival_model + runtimes.stop(RuntimeMeter.CASE_ARRIVAL_MODEL) + # --- Resource Model Discovery --- # print_section("Optimizing resource model parameters") runtimes.start(RuntimeMeter.RESOURCE_MODEL) @@ -201,7 +217,6 @@ def run(self, runtimes: Optional[RuntimeMeter] = None): runtimes.start(RuntimeMeter.FINAL_MODEL) self.final_bps_model = BPSModel( # Bypass all models already discovered with train+validation process_model=get_process_model_path(self._best_result_dir, self._event_log.process_name), - case_arrival_model=self._best_bps_model.case_arrival_model, case_attributes=self._best_bps_model.case_attributes, global_attributes=self._best_bps_model.global_attributes, event_attributes=self._best_bps_model.event_attributes, @@ -248,6 +263,19 @@ def run(self, runtimes: Optional[RuntimeMeter] = None): ) self.final_bps_model.gateway_probabilities = \ map_branch_rules_to_flows(self.final_bps_model.gateway_probabilities, self.final_bps_model.branch_rules) + # Case arrival model + if self._discover_inter_arrival_times: + self.final_bps_model.case_arrival_model = discover_case_arrival_model( + self._event_log.train_validation_partition, + self._event_log.log_ids, + outlier_threshold=best_case_arrival_params.outlier_threshold, + ) + else: + self.final_bps_model.case_arrival_model = discover_case_arrival_model( + self._event_log.train_validation_partition, + self._event_log.log_ids, + use_observed_arrival_distribution=True, + ) # Resource model print_subsection("Discovering best resource model") self.final_bps_model.resource_model = discover_resource_model( @@ -275,7 +303,8 @@ def run(self, runtimes: Optional[RuntimeMeter] = None): if best_resource_model_params.discover_batching_rules: print_subsection("Discovering batching rules") self.final_bps_model.batching_rules = discover_batching_rules( - self._event_log.train_validation_partition, self._event_log.log_ids + self._event_log.train_validation_partition, + self._event_log.log_ids, ) # Extraneous delays if self._best_bps_model.extraneous_delays is not None: @@ -303,7 +332,12 @@ def run(self, runtimes: Optional[RuntimeMeter] = None): # --- Export settings and clean temporal files --- # print_section(f"Exporting canonical model, runtimes, settings and cleaning up intermediate files") canonical_model_path = self._best_result_dir / "canonical_model.json" - _export_canonical_model(canonical_model_path, best_control_flow_params, best_resource_model_params) + _export_canonical_model( + file_path=canonical_model_path, + case_arrival_settings=best_case_arrival_params if self._discover_inter_arrival_times else None, + control_flow_settings=best_control_flow_params, + resource_model_settings=best_resource_model_params, + ) runtimes_model_path = self._best_result_dir / "runtimes.json" _export_runtimes(runtimes_model_path, runtimes) if self._settings.common.clean_intermediate_files: @@ -326,8 +360,22 @@ def _optimize_control_flow(self) -> ControlFlowHyperoptIterationParams: best_control_flow_params = self._control_flow_optimizer.run() return best_control_flow_params + def _optimize_case_arrival(self) -> CaseArrivalHyperoptIterationParams: + """ + Case Arrival (inter-arrival distribution) discovery. + """ + self._case_arrival_optimizer = CaseArrivalOptimizer( + event_log=self._event_log, + bps_model=self._best_bps_model, + settings=self._settings.case_arrival, + base_directory=self._case_arrival_dir, + ) + best_case_arrival_params = self._case_arrival_optimizer.run() + return best_case_arrival_params + def _optimize_resource_model( - self, model_activities: Optional[list[str]] = None + self, + model_activities: Optional[list[str]] = None, ) -> ResourceModelHyperoptIterationParams: """ Resource Model (resource profiles, calendars an activity performances) discovery. @@ -385,6 +433,8 @@ def _clean_up(self): print_section("Removing intermediate files") self._control_flow_optimizer.cleanup() self._resource_model_optimizer.cleanup() + if self._discover_inter_arrival_times: + self._case_arrival_optimizer.cleanup() if self._settings.extraneous_activity_delays is not None: self._extraneous_delays_optimizer.cleanup() if self._settings.common.process_model_path is None: @@ -394,13 +444,18 @@ def _clean_up(self): def _export_canonical_model( file_path: Path, + case_arrival_settings: Optional[CaseArrivalHyperoptIterationParams], control_flow_settings: ControlFlowHyperoptIterationParams, - calendar_settings: ResourceModelHyperoptIterationParams, + resource_model_settings: ResourceModelHyperoptIterationParams, ): + # Create dict with best params of each HyperOpt step canon = { "control_flow": control_flow_settings.to_dict(), - "calendars": calendar_settings.to_dict(), + "resource_model": resource_model_settings.to_dict(), } + if case_arrival_settings is not None: + canon["case_arrival"] = case_arrival_settings.to_dict() + # Export to file with open(file_path, "w") as f: json.dump(canon, f) From 6b59d14f64387dd7bc7ab13f9481e6a5fb734e51 Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Fri, 13 Jun 2025 14:00:56 +0300 Subject: [PATCH 05/12] Adapt and create main SIMOD tests --- resources/config/complete_configuration.yml | 6 +++ tests/assets/configuration_simod_basic.yml | 3 +- .../configuration_simod_with_extraneous.yml | 3 +- .../assets/configuration_simod_with_model.yml | 3 +- ...guration_simod_with_model_and_batching.yml | 2 +- ...ration_simod_with_model_and_extraneous.yml | 3 +- ...on_simod_with_model_and_prioritization.yml | 2 +- ...iguration_simod_with_observed_arrivals.yml | 50 +++++++++++++++++++ tests/test_simod.py | 25 ++++++++++ 9 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 tests/assets/configuration_simod_with_observed_arrivals.yml diff --git a/resources/config/complete_configuration.yml b/resources/config/complete_configuration.yml index f37603e7..ce2dcb65 100644 --- a/resources/config/complete_configuration.yml +++ b/resources/config/complete_configuration.yml @@ -55,6 +55,12 @@ preprocessing: concurrency_l2l: 0.9 # Length 2 loops threshold concurrency_l1l: 0.9 # Length 1 loops threshold +###################### +# Case Arrival model # +###################### +case_arrival: + + ################ # Control-flow # ################ diff --git a/tests/assets/configuration_simod_basic.yml b/tests/assets/configuration_simod_basic.yml index ceb269c6..30e5b55f 100644 --- a/tests/assets/configuration_simod_basic.yml +++ b/tests/assets/configuration_simod_basic.yml @@ -1,9 +1,10 @@ -version: 5 +version: 5.2 common: train_log_path: LoanApp_simplified.csv.gz test_log_path: LoanApp_simplified.csv.gz num_final_evaluations: 1 discover_data_attributes: true + clean_intermediate_files: false evaluation_metrics: - absolute_hourly_emd log_ids: diff --git a/tests/assets/configuration_simod_with_extraneous.yml b/tests/assets/configuration_simod_with_extraneous.yml index 835da3b0..18ee1944 100644 --- a/tests/assets/configuration_simod_with_extraneous.yml +++ b/tests/assets/configuration_simod_with_extraneous.yml @@ -1,7 +1,8 @@ -version: 5 +version: 5.2 common: train_log_path: LoanApp_simplified.csv.gz discover_data_attributes: true + clean_intermediate_files: false log_ids: case: case:concept:name activity: concept:name diff --git a/tests/assets/configuration_simod_with_model.yml b/tests/assets/configuration_simod_with_model.yml index bd205710..17fccbd9 100644 --- a/tests/assets/configuration_simod_with_model.yml +++ b/tests/assets/configuration_simod_with_model.yml @@ -1,8 +1,9 @@ -version: 5 +version: 5.2 common: train_log_path: LoanApp_simplified.csv.gz process_model_path: LoanApp_simplified.bpmn discover_data_attributes: true + clean_intermediate_files: false perform_final_evaluation: true num_final_evaluations: 1 evaluation_metrics: diff --git a/tests/assets/configuration_simod_with_model_and_batching.yml b/tests/assets/configuration_simod_with_model_and_batching.yml index 70eed272..f7c7a353 100644 --- a/tests/assets/configuration_simod_with_model_and_batching.yml +++ b/tests/assets/configuration_simod_with_model_and_batching.yml @@ -1,4 +1,4 @@ -version: 5 +version: 5.2 common: train_log_path: LoanApp_simplified.csv.gz test_log_path: LoanApp_simplified.csv.gz diff --git a/tests/assets/configuration_simod_with_model_and_extraneous.yml b/tests/assets/configuration_simod_with_model_and_extraneous.yml index e6a43cd8..6a315f51 100644 --- a/tests/assets/configuration_simod_with_model_and_extraneous.yml +++ b/tests/assets/configuration_simod_with_model_and_extraneous.yml @@ -1,8 +1,9 @@ -version: 5 +version: 5.2 common: train_log_path: LoanApp_simplified.csv.gz process_model_path: LoanApp_simplified.bpmn discover_data_attributes: true + clean_intermediate_files: false num_final_evaluations: 1 evaluation_metrics: - absolute_hourly_emd diff --git a/tests/assets/configuration_simod_with_model_and_prioritization.yml b/tests/assets/configuration_simod_with_model_and_prioritization.yml index cbd84653..8efd373d 100644 --- a/tests/assets/configuration_simod_with_model_and_prioritization.yml +++ b/tests/assets/configuration_simod_with_model_and_prioritization.yml @@ -1,4 +1,4 @@ -version: 5 +version: 5.2 common: train_log_path: LoanApp_simplified.csv.gz test_log_path: LoanApp_simplified.csv.gz diff --git a/tests/assets/configuration_simod_with_observed_arrivals.yml b/tests/assets/configuration_simod_with_observed_arrivals.yml new file mode 100644 index 00000000..46e75dc3 --- /dev/null +++ b/tests/assets/configuration_simod_with_observed_arrivals.yml @@ -0,0 +1,50 @@ +version: 5.2 +common: + train_log_path: LoanApp_simplified.csv.gz + discover_data_attributes: true + clean_intermediate_files: false + log_ids: + case: case:concept:name + activity: concept:name + resource: org:resource + start_time: start_timestamp + end_time: time:timestamp + enabled_time: enabled_time +preprocessing: + multitasking: false +case_arrival: + use_observed_arrival_distribution: true +control_flow: + optimization_metric: n_gram_distance + num_iterations: 3 + num_evaluations_per_iteration: 3 + discovery_algorithm: sm1 + epsilon: + - 0.0 + - 1.0 + eta: + - 0.0 + - 1.0 + replace_or_joins: + - true + - false + prioritize_parallelism: + - true + - false + gateway_probabilities: + - discovery + - equiprobable +resource_model: + optimization_metric: absolute_hourly_emd + num_iterations: 3 + num_evaluations_per_iteration: 3 + resource_profiles: + discovery_type: pool + granularity: 60 + confidence: + - 0.5 + - 0.85 + support: + - 0.01 + - 0.3 + participation: 0.4 diff --git a/tests/test_simod.py b/tests/test_simod.py index f0a19acf..e2930342 100644 --- a/tests/test_simod.py +++ b/tests/test_simod.py @@ -17,14 +17,25 @@ { "name": "Simod basic", "config_file": "configuration_simod_basic.yml", + "observed_arrivals": False, "expect_extraneous": False, "expect_batching_rules": False, "expect_prioritization_rules": False, "perform_final_evaluation": True, }, + { + "name": "Simod observed arrivals", + "config_file": "configuration_simod_with_observed_arrivals.yml", + "observed_arrivals": True, + "expect_extraneous": False, + "expect_batching_rules": False, + "expect_prioritization_rules": False, + "perform_final_evaluation": False, + }, { "name": "Simod extraneous", "config_file": "configuration_simod_with_extraneous.yml", + "observed_arrivals": False, "expect_extraneous": True, "expect_batching_rules": False, "expect_prioritization_rules": False, @@ -33,6 +44,7 @@ { "name": "Simod with model", "config_file": "configuration_simod_with_model.yml", + "observed_arrivals": False, "expect_extraneous": False, "expect_batching_rules": False, "expect_prioritization_rules": False, @@ -41,6 +53,7 @@ { "name": "Simod with model & extraneous", "config_file": "configuration_simod_with_model_and_extraneous.yml", + "observed_arrivals": False, "expect_extraneous": True, "expect_batching_rules": False, "expect_prioritization_rules": False, @@ -49,6 +62,7 @@ { "name": "Simod with model & prioritization", "config_file": "configuration_simod_with_model_and_prioritization.yml", + "observed_arrivals": False, "expect_extraneous": False, "expect_batching_rules": False, "expect_prioritization_rules": True, @@ -57,6 +71,7 @@ { "name": "Simod with model & batching", "config_file": "configuration_simod_with_model_and_batching.yml", + "observed_arrivals": False, "expect_extraneous": False, "expect_batching_rules": True, "expect_prioritization_rules": False, @@ -89,13 +104,23 @@ def test_simod(test_data, entry_point): assert optimizer.final_bps_model.process_model is not None assert optimizer.final_bps_model.resource_model is not None assert optimizer.final_bps_model.case_arrival_model is not None + case_arrival_model = optimizer.final_bps_model.case_arrival_model assert optimizer.final_bps_model.case_attributes is not None assert len(optimizer.final_bps_model.case_attributes) > 0 + if test_data["observed_arrivals"]: + assert case_arrival_model.inter_arrival_times["distribution_name"] == "histogram_sampling" + assert not (optimizer._output_dir / "case_arrival").exists() + else: + assert case_arrival_model.inter_arrival_times["distribution_name"] != "histogram_sampling" + assert (optimizer._output_dir / "case_arrival").exists() # Created folder for arrival optimization + assert len(os.listdir(optimizer._output_dir / "case_arrival")) > 0 # Folder not empty if test_data["expect_extraneous"]: assert optimizer.final_bps_model.extraneous_delays is not None assert len(optimizer.final_bps_model.extraneous_delays) == 2 + assert (optimizer._output_dir / "extraneous-delay-timers").exists() # Created folder for arrival optimization else: assert optimizer.final_bps_model.extraneous_delays is None + assert not (optimizer._output_dir / "extraneous-delay-timers").exists() if test_data["expect_batching_rules"]: # Check if any of the iterations has batching rules batching_found = _search_element_in_resource_model_iterations(optimizer._output_dir, BATCHING_RULES_KEY) From 1dcab76af30e0782c5169d251de217ea98c9f385 Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Fri, 13 Jun 2025 18:53:29 +0300 Subject: [PATCH 06/12] Add Case Arrival parameters to provided complete_configuration.yml example --- resources/config/complete_configuration.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/resources/config/complete_configuration.yml b/resources/config/complete_configuration.yml index ce2dcb65..7c71227b 100644 --- a/resources/config/complete_configuration.yml +++ b/resources/config/complete_configuration.yml @@ -31,9 +31,6 @@ common: - circadian_event_distribution - arrival_event_distribution - cycle_time_distribution - # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, - # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. - use_observed_arrival_distribution: false # Whether to delete all files created during the optimization phases or not clean_intermediate_files: true # Whether to discover global/case/event attributes and their update rules or not @@ -59,7 +56,22 @@ preprocessing: # Case Arrival model # ###################### case_arrival: - + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 ################ # Control-flow # From d4f33076afdd8e78d66e071622c127a4757d595b Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Mon, 21 Sep 2026 17:41:56 +0300 Subject: [PATCH 07/12] Supress pkg_resources warnings --- src/simod/__init__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/simod/__init__.py b/src/simod/__init__.py index e7b5ac10..8b4926b3 100644 --- a/src/simod/__init__.py +++ b/src/simod/__init__.py @@ -1 +1,10 @@ +import warnings + +# Supress HyperOpt TPE warning +warnings.filterwarnings( + "ignore", + category=UserWarning, + message=r".*pkg_resources is deprecated as an API.*" +) + __all__ = ["simod"] From 32f672da8e9ea7beb492d505334f775d20d15d79 Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Mon, 21 Sep 2026 17:43:25 +0300 Subject: [PATCH 08/12] Backup distance measures history of each optimization process --- src/simod/simod.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/simod/simod.py b/src/simod/simod.py index 301674a6..deec79aa 100644 --- a/src/simod/simod.py +++ b/src/simod/simod.py @@ -187,7 +187,7 @@ def run(self, runtimes: Optional[RuntimeMeter] = None): # --- Case Arrival Optimization --- # if self._discover_inter_arrival_times: - print_section("Optimizing control-flow parameters") + print_section("Optimizing case arrival parameters") runtimes.start(RuntimeMeter.CASE_ARRIVAL_MODEL) best_case_arrival_params = self._optimize_case_arrival() self._best_bps_model.case_arrival_model = self._case_arrival_optimizer.best_bps_model.case_arrival_model @@ -358,6 +358,10 @@ def _optimize_control_flow(self) -> ControlFlowHyperoptIterationParams: base_directory=self._control_flow_dir, ) best_control_flow_params = self._control_flow_optimizer.run() + shutil.copy( + self._control_flow_dir / "evaluation_measures.csv", + self._best_result_dir / "control_flow_iterations_measures.csv" + ) return best_control_flow_params def _optimize_case_arrival(self) -> CaseArrivalHyperoptIterationParams: @@ -371,6 +375,10 @@ def _optimize_case_arrival(self) -> CaseArrivalHyperoptIterationParams: base_directory=self._case_arrival_dir, ) best_case_arrival_params = self._case_arrival_optimizer.run() + shutil.copy( + self._case_arrival_dir / "evaluation_measures.csv", + self._best_result_dir / "arrival_model_iterations_measures.csv" + ) return best_case_arrival_params def _optimize_resource_model( @@ -388,6 +396,10 @@ def _optimize_resource_model( model_activities=model_activities, ) best_resource_model_params = self._resource_model_optimizer.run() + shutil.copy( + self._resource_model_dir / "evaluation_measures.csv", + self._best_result_dir / "resource_model_iterations_measures.csv" + ) return best_resource_model_params def _optimize_extraneous_activity_delays(self) -> List[ExtraneousDelay]: From fb9abf969fc01cb318ef4fa7e061f40cf8bf90a9 Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Mon, 21 Sep 2026 17:43:53 +0300 Subject: [PATCH 09/12] Update tests and legacy settings translation --- resources/config/complete_configuration.yml | 2 +- resources/config/configuration_example.yml | 2 +- .../config/configuration_example_data_aware.yml | 2 +- resources/config/configuration_example_fuzzy.yml | 2 +- .../configuration_example_with_evaluation.yml | 2 +- ...ration_example_with_provided_process_model.yml | 2 +- resources/config/configuration_one_shot.yml | 15 ++++++++++++++- src/simod/settings/simod_settings.py | 2 +- tests/test_bpic15.py | 7 +++++++ 9 files changed, 28 insertions(+), 8 deletions(-) diff --git a/resources/config/complete_configuration.yml b/resources/config/complete_configuration.yml index 7c71227b..a0037be5 100644 --- a/resources/config/complete_configuration.yml +++ b/resources/config/complete_configuration.yml @@ -1,4 +1,4 @@ -version: 5 +version: 5.2 ########## # Common # diff --git a/resources/config/configuration_example.yml b/resources/config/configuration_example.yml index 186512ea..aa371347 100644 --- a/resources/config/configuration_example.yml +++ b/resources/config/configuration_example.yml @@ -6,7 +6,7 @@ # - Increase the num_iterations to (potentially) improve the quality of that discovered model # # - Visit 'complete_configuration.yml' example for a description of all configurable parameters # ################################################################################################################# -version: 5 +version: 5.2 ########## # Common # ########## diff --git a/resources/config/configuration_example_data_aware.yml b/resources/config/configuration_example_data_aware.yml index aeaddffb..51f0047c 100644 --- a/resources/config/configuration_example_data_aware.yml +++ b/resources/config/configuration_example_data_aware.yml @@ -6,7 +6,7 @@ # - Increase the num_iterations to (potentially) improve the quality of that discovered model # # - Visit 'complete_configuration.yml' example for a description of all configurable parameters # ################################################################################################################# -version: 5 +version: 5.2 ########## # Common # ########## diff --git a/resources/config/configuration_example_fuzzy.yml b/resources/config/configuration_example_fuzzy.yml index 5e74418d..ced6af60 100644 --- a/resources/config/configuration_example_fuzzy.yml +++ b/resources/config/configuration_example_fuzzy.yml @@ -6,7 +6,7 @@ # - Increase the num_iterations to (potentially) improve the quality of that discovered model # # - Visit 'complete_configuration.yml' example for a description of all configurable parameters # ################################################################################################################# -version: 5 +version: 5.2 ########## # Common # ########## diff --git a/resources/config/configuration_example_with_evaluation.yml b/resources/config/configuration_example_with_evaluation.yml index 10f412a7..1e9a6187 100644 --- a/resources/config/configuration_example_with_evaluation.yml +++ b/resources/config/configuration_example_with_evaluation.yml @@ -4,7 +4,7 @@ # - Increase the num_iterations to (potentially) improve the quality of that discovered model # # - Visit 'complete_configuration.yml' example for a description of all configurable parameters # ################################################################################################################# -version: 5 +version: 5.2 ########## # Common # ########## diff --git a/resources/config/configuration_example_with_provided_process_model.yml b/resources/config/configuration_example_with_provided_process_model.yml index b490161d..95e331c5 100644 --- a/resources/config/configuration_example_with_provided_process_model.yml +++ b/resources/config/configuration_example_with_provided_process_model.yml @@ -4,7 +4,7 @@ # - Increase the num_iterations to (potentially) improve the quality of that discovered model # # - Visit 'complete_configuration.yml' example for a description of all configurable parameters # ################################################################################################################# -version: 5 +version: 5.2 ########## # Common # ########## diff --git a/resources/config/configuration_one_shot.yml b/resources/config/configuration_one_shot.yml index 9c45b7e8..7cfac9d8 100644 --- a/resources/config/configuration_one_shot.yml +++ b/resources/config/configuration_one_shot.yml @@ -4,7 +4,7 @@ ################################################################################################################# # - Visit 'complete_configuration.yml' example for a description of all configurable parameters # ################################################################################################################# -version: 5 +version: 5.2 ########## # Common # ########## @@ -19,6 +19,19 @@ common: enabled_time: "enabled_time" # If not present in the log, automatically computed start_time: "start_time" end_time: "end_time" +###################### +# Case Arrival model # +###################### +case_arrival: + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: 50.0 ################ # Control-flow # ################ diff --git a/src/simod/settings/simod_settings.py b/src/simod/settings/simod_settings.py index f1bccdb7..0727b919 100644 --- a/src/simod/settings/simod_settings.py +++ b/src/simod/settings/simod_settings.py @@ -283,7 +283,7 @@ def _parse_legacy_config_4(config: dict) -> dict: def _parse_legacy_config_5(config: dict) -> dict: parsed_config = copy.deepcopy(config) if config["version"] == 5: - # Transform dictionary from version 4 to 5 + # Transform dictionary from version 5 to 5.2 parsed_config["version"] = 5.2 # Common elements if "use_observed_arrival_distribution" in parsed_config["common"]: diff --git a/tests/test_bpic15.py b/tests/test_bpic15.py index 48dda69d..1877461b 100644 --- a/tests/test_bpic15.py +++ b/tests/test_bpic15.py @@ -16,4 +16,11 @@ def test_bpic15(entry_point): optimizer = Simod(settings, event_log=event_log) optimizer.run() + assert optimizer.final_bps_model.case_arrival_model is not None + assert optimizer.final_bps_model.process_model is not None + assert optimizer.final_bps_model.gateway_probabilities is not None assert optimizer.final_bps_model.resource_model is not None + assert optimizer.final_bps_model.extraneous_delays is not None + assert optimizer._control_flow_dir.exists() and any(optimizer._control_flow_dir.iterdir()) # not empty + assert optimizer._resource_model_dir.exists() and any(optimizer._resource_model_dir.iterdir()) # not empty + assert optimizer._case_arrival_dir.exists() and any(optimizer._case_arrival_dir.iterdir()) # not empty From 0ffc62606f1c82904d2867b82fc7459a1b5e74b9 Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Mon, 21 Sep 2026 17:45:05 +0300 Subject: [PATCH 10/12] Update benchmark files --- ...hmark_diff_extr.yml => BPIC_2012_diff.yml} | 41 +++++--- ...hmark_diff.yml => BPIC_2012_diff_extr.yml} | 63 ++++++----- ...{benchmark_fuzz.yml => BPIC_2012_fuzz.yml} | 49 +++++---- ..._fuzz_extr.yml => BPIC_2012_fuzz_extr.yml} | 49 +++++---- ...{benchmark_pool.yml => BPIC_2012_pool.yml} | 49 +++++---- .../benchmark/benchmark_diff_data_aware.yml | 98 ------------------ .../event_logs/LoanApp_simplified_test.csv.gz | Bin 101480 -> 0 bytes .../LoanApp_simplified_train.csv.gz | Bin 102558 -> 0 bytes resources/event_logs/PurchasingExample.csv.gz | Bin 99709 -> 0 bytes .../assets/bpic15/bpic15_1_with_model_v4.yml | 68 +++--------- 10 files changed, 165 insertions(+), 252 deletions(-) rename resources/config/benchmark/{benchmark_diff_extr.yml => BPIC_2012_diff.yml} (71%) rename resources/config/benchmark/{benchmark_diff.yml => BPIC_2012_diff_extr.yml} (58%) rename resources/config/benchmark/{benchmark_fuzz.yml => BPIC_2012_fuzz.yml} (60%) rename resources/config/benchmark/{benchmark_fuzz_extr.yml => BPIC_2012_fuzz_extr.yml} (64%) rename resources/config/benchmark/{benchmark_pool.yml => BPIC_2012_pool.yml} (64%) delete mode 100644 resources/config/benchmark/benchmark_diff_data_aware.yml delete mode 100644 resources/event_logs/LoanApp_simplified_test.csv.gz delete mode 100644 resources/event_logs/LoanApp_simplified_train.csv.gz delete mode 100644 resources/event_logs/PurchasingExample.csv.gz diff --git a/resources/config/benchmark/benchmark_diff_extr.yml b/resources/config/benchmark/BPIC_2012_diff.yml similarity index 71% rename from resources/config/benchmark/benchmark_diff_extr.yml rename to resources/config/benchmark/BPIC_2012_diff.yml index afb32fde..d4c3b79c 100644 --- a/resources/config/benchmark/benchmark_diff_extr.yml +++ b/resources/config/benchmark/BPIC_2012_diff.yml @@ -1,12 +1,12 @@ -version: 5 +version: 5.2 ########## # Common # ########## common: # Path to the event log in CSV format - train_log_path: ../../event_logs/BPIC_2012_W_train.csv.gz + train_log_path: ../../event_logs/BPIC_2012_train.csv.gz # Event log to evaluate the discovered BPS model with - test_log_path: ../../event_logs/BPIC_2012_W_test.csv.gz + test_log_path: ../../event_logs/BPIC_2012_test.csv.gz # Specify the name for each of the columns in the CSV file (XES standard by default) log_ids: case: "case_id" @@ -23,10 +23,31 @@ common: - absolute_event_distribution - relative_event_distribution - circadian_event_distribution + - circadian_workforce_distribution - arrival_event_distribution - cycle_time_distribution # Whether to discover case attributes or not discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 ################# # Preprocessing # ################# @@ -40,7 +61,7 @@ control_flow: # Metric to guide the optimization process (loss function to minimize) optimization_metric: two_gram_distance # Number of optimization iterations over the search space - num_iterations: 30 + num_iterations: 40 # Number of times to evaluate each iteration (using the mean of all of them) num_evaluations_per_iteration: 5 # Methods for discovering gateway probabilities @@ -89,14 +110,4 @@ resource_model: - 0.05 - 0.5 # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) - participation: 0.4 -##################### -# Extraneous delays # -##################### -extraneous_activity_delays: - # Method to compute the extraneous delay (naive or eclipse-aware) - discovery_method: eclipse-aware - # Metric to guide the optimization process (loss function to minimize) - optimization_metric: relative_emd - # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) - num_iterations: 20 + participation: 0.4 \ No newline at end of file diff --git a/resources/config/benchmark/benchmark_diff.yml b/resources/config/benchmark/BPIC_2012_diff_extr.yml similarity index 58% rename from resources/config/benchmark/benchmark_diff.yml rename to resources/config/benchmark/BPIC_2012_diff_extr.yml index 49c2cd3d..57e1a95f 100644 --- a/resources/config/benchmark/benchmark_diff.yml +++ b/resources/config/benchmark/BPIC_2012_diff_extr.yml @@ -1,14 +1,14 @@ -version: 5 +version: 5.2 ########## # Common # ########## common: # Path to the event log in CSV format - train_log_path: ../../event_logs/BPIC_2012_W_train.csv.gz + train_log_path: ../../event_logs/BPIC_2012_train.csv.gz # Event log to evaluate the discovered BPS model with - test_log_path: ../../event_logs/BPIC_2012_W_test.csv.gz - # Use observed arrival distributions - use_observed_arrival_distribution: false + test_log_path: ../../event_logs/BPIC_2012_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/BPIC_2012_diff/best_result/BPIC_2012_train.bpmn # Specify the name for each of the columns in the CSV file (XES standard by default) log_ids: case: "case_id" @@ -25,10 +25,31 @@ common: - absolute_event_distribution - relative_event_distribution - circadian_event_distribution + - circadian_workforce_distribution - arrival_event_distribution - cycle_time_distribution # Whether to discover case attributes or not discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 ################# # Preprocessing # ################# @@ -42,27 +63,11 @@ control_flow: # Metric to guide the optimization process (loss function to minimize) optimization_metric: two_gram_distance # Number of optimization iterations over the search space - num_iterations: 30 + num_iterations: 1 # Number of times to evaluate each iteration (using the mean of all of them) - num_evaluations_per_iteration: 5 + num_evaluations_per_iteration: 1 # Methods for discovering gateway probabilities gateway_probabilities: discovery - # Discover process model with SplitMiner v3 - mining_algorithm: sm1 - # Number of concurrent relations between events to be captured - epsilon: - - 0.05 - - 0.4 - # Threshold for filtering the incoming and outgoing edges - eta: - - 0.2 - - 0.7 - # Whether to replace non-trivial OR joins or not - replace_or_joins: - - true - - false - # Whether to prioritize parallelism over loops or not - prioritize_parallelism: true ################## # Resource model # ################## @@ -91,4 +96,14 @@ resource_model: - 0.05 - 0.5 # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) - participation: 0.4 \ No newline at end of file + participation: 0.4 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/benchmark_fuzz.yml b/resources/config/benchmark/BPIC_2012_fuzz.yml similarity index 60% rename from resources/config/benchmark/benchmark_fuzz.yml rename to resources/config/benchmark/BPIC_2012_fuzz.yml index 8c020907..c67c2da8 100644 --- a/resources/config/benchmark/benchmark_fuzz.yml +++ b/resources/config/benchmark/BPIC_2012_fuzz.yml @@ -1,12 +1,14 @@ -version: 5 +version: 5.2 ########## # Common # ########## common: # Path to the event log in CSV format - train_log_path: ../../event_logs/BPIC_2012_W_train.csv.gz + train_log_path: ../../event_logs/BPIC_2012_train.csv.gz # Event log to evaluate the discovered BPS model with - test_log_path: ../../event_logs/BPIC_2012_W_test.csv.gz + test_log_path: ../../event_logs/BPIC_2012_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/BPIC_2012_diff/best_result/BPIC_2012_train.bpmn # Specify the name for each of the columns in the CSV file (XES standard by default) log_ids: case: "case_id" @@ -23,10 +25,31 @@ common: - absolute_event_distribution - relative_event_distribution - circadian_event_distribution + - circadian_workforce_distribution - arrival_event_distribution - cycle_time_distribution # Whether to discover case attributes or not discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 ################# # Preprocessing # ################# @@ -40,27 +63,11 @@ control_flow: # Metric to guide the optimization process (loss function to minimize) optimization_metric: two_gram_distance # Number of optimization iterations over the search space - num_iterations: 30 + num_iterations: 1 # Number of times to evaluate each iteration (using the mean of all of them) - num_evaluations_per_iteration: 5 + num_evaluations_per_iteration: 1 # Methods for discovering gateway probabilities gateway_probabilities: discovery - # Discover process model with SplitMiner v3 - mining_algorithm: sm1 - # Number of concurrent relations between events to be captured - epsilon: - - 0.05 - - 0.4 - # Threshold for filtering the incoming and outgoing edges - eta: - - 0.2 - - 0.7 - # Whether to replace non-trivial OR joins or not - replace_or_joins: - - true - - false - # Whether to prioritize parallelism over loops or not - prioritize_parallelism: true ################## # Resource model # ################## diff --git a/resources/config/benchmark/benchmark_fuzz_extr.yml b/resources/config/benchmark/BPIC_2012_fuzz_extr.yml similarity index 64% rename from resources/config/benchmark/benchmark_fuzz_extr.yml rename to resources/config/benchmark/BPIC_2012_fuzz_extr.yml index dddd2da0..5338dd7a 100644 --- a/resources/config/benchmark/benchmark_fuzz_extr.yml +++ b/resources/config/benchmark/BPIC_2012_fuzz_extr.yml @@ -1,12 +1,14 @@ -version: 5 +version: 5.2 ########## # Common # ########## common: # Path to the event log in CSV format - train_log_path: ../../event_logs/BPIC_2012_W_train.csv.gz + train_log_path: ../../event_logs/BPIC_2012_train.csv.gz # Event log to evaluate the discovered BPS model with - test_log_path: ../../event_logs/BPIC_2012_W_test.csv.gz + test_log_path: ../../event_logs/BPIC_2012_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/BPIC_2012_diff/best_result/BPIC_2012_train.bpmn # Specify the name for each of the columns in the CSV file (XES standard by default) log_ids: case: "case_id" @@ -23,10 +25,31 @@ common: - absolute_event_distribution - relative_event_distribution - circadian_event_distribution + - circadian_workforce_distribution - arrival_event_distribution - cycle_time_distribution # Whether to discover case attributes or not discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 ################# # Preprocessing # ################# @@ -40,27 +63,11 @@ control_flow: # Metric to guide the optimization process (loss function to minimize) optimization_metric: two_gram_distance # Number of optimization iterations over the search space - num_iterations: 30 + num_iterations: 1 # Number of times to evaluate each iteration (using the mean of all of them) - num_evaluations_per_iteration: 5 + num_evaluations_per_iteration: 1 # Methods for discovering gateway probabilities gateway_probabilities: discovery - # Discover process model with SplitMiner v3 - mining_algorithm: sm1 - # Number of concurrent relations between events to be captured - epsilon: - - 0.05 - - 0.4 - # Threshold for filtering the incoming and outgoing edges - eta: - - 0.2 - - 0.7 - # Whether to replace non-trivial OR joins or not - replace_or_joins: - - true - - false - # Whether to prioritize parallelism over loops or not - prioritize_parallelism: true ################## # Resource model # ################## diff --git a/resources/config/benchmark/benchmark_pool.yml b/resources/config/benchmark/BPIC_2012_pool.yml similarity index 64% rename from resources/config/benchmark/benchmark_pool.yml rename to resources/config/benchmark/BPIC_2012_pool.yml index a6be57fb..4b3097de 100644 --- a/resources/config/benchmark/benchmark_pool.yml +++ b/resources/config/benchmark/BPIC_2012_pool.yml @@ -1,12 +1,14 @@ -version: 5 +version: 5.2 ########## # Common # ########## common: # Path to the event log in CSV format - train_log_path: ../../event_logs/BPIC_2012_W_train.csv.gz + train_log_path: ../../event_logs/BPIC_2012_train.csv.gz # Event log to evaluate the discovered BPS model with - test_log_path: ../../event_logs/BPIC_2012_W_test.csv.gz + test_log_path: ../../event_logs/BPIC_2012_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/BPIC_2012_diff/best_result/BPIC_2012_train.bpmn # Specify the name for each of the columns in the CSV file (XES standard by default) log_ids: case: "case_id" @@ -23,10 +25,31 @@ common: - absolute_event_distribution - relative_event_distribution - circadian_event_distribution + - circadian_workforce_distribution - arrival_event_distribution - cycle_time_distribution # Whether to discover case attributes or not discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 ################# # Preprocessing # ################# @@ -40,27 +63,11 @@ control_flow: # Metric to guide the optimization process (loss function to minimize) optimization_metric: two_gram_distance # Number of optimization iterations over the search space - num_iterations: 30 + num_iterations: 1 # Number of times to evaluate each iteration (using the mean of all of them) - num_evaluations_per_iteration: 5 + num_evaluations_per_iteration: 1 # Methods for discovering gateway probabilities gateway_probabilities: discovery - # Discover process model with SplitMiner v3 - mining_algorithm: sm1 - # Number of concurrent relations between events to be captured - epsilon: - - 0.05 - - 0.4 - # Threshold for filtering the incoming and outgoing edges - eta: - - 0.2 - - 0.7 - # Whether to replace non-trivial OR joins or not - replace_or_joins: - - true - - false - # Whether to prioritize parallelism over loops or not - prioritize_parallelism: true ################## # Resource model # ################## diff --git a/resources/config/benchmark/benchmark_diff_data_aware.yml b/resources/config/benchmark/benchmark_diff_data_aware.yml deleted file mode 100644 index 1c153804..00000000 --- a/resources/config/benchmark/benchmark_diff_data_aware.yml +++ /dev/null @@ -1,98 +0,0 @@ -version: 5 -########## -# Common # -########## -common: - # Path to the event log in CSV format - train_log_path: ../../event_logs/BPIC_2012_W_train.csv.gz - # Event log to evaluate the discovered BPS model with - test_log_path: ../../event_logs/BPIC_2012_W_test.csv.gz - # Specify the name for each of the columns in the CSV file (XES standard by default) - log_ids: - case: "case_id" - activity: "activity" - resource: "resource" - start_time: "start_time" - end_time: "end_time" - # Number of evaluations of the discovered BPS model - num_final_evaluations: 10 - # Metrics to evaluate the discovered BPS model - evaluation_metrics: - - 3_gram_distance - - 2_gram_distance - - absolute_event_distribution - - relative_event_distribution - - circadian_event_distribution - - arrival_event_distribution - - cycle_time_distribution - # Whether to discover case attributes or not - discover_data_attributes: true -################# -# Preprocessing # -################# -preprocessing: - multitasking: false - enable_time_concurrency_threshold: 0.5 -################ -# Control-flow # -################ -control_flow: - # Metric to guide the optimization process (loss function to minimize) - optimization_metric: two_gram_distance - # Number of optimization iterations over the search space - num_iterations: 30 - # Number of times to evaluate each iteration (using the mean of all of them) - num_evaluations_per_iteration: 5 - # Methods for discovering gateway probabilities - gateway_probabilities: discovery - # Discover process model with SplitMiner v3 - mining_algorithm: sm1 - # Number of concurrent relations between events to be captured - epsilon: - - 0.05 - - 0.4 - # Threshold for filtering the incoming and outgoing edges - eta: - - 0.2 - - 0.7 - # Whether to replace non-trivial OR joins or not - replace_or_joins: - - true - - false - # Whether to prioritize parallelism over loops or not - prioritize_parallelism: true - # Discover data-aware branching rules, i.e., BPMN decision points based on value of data attributes - discover_branch_rules: true - # Minimum f-score value to consider the discovered data-aware branching rules - f_score: - - 0.3 - - 0.9 -################## -# Resource model # -################## -resource_model: - # Metric to guide the optimization process (loss function to minimize) - optimization_metric: circadian_emd - # Number of optimization iterations over the search space - num_iterations: 40 - # Number of times to evaluate each iteration (using the mean of all of them) - num_evaluations_per_iteration: 5 - # Whether to discover prioritization or batching behavior - discover_prioritization_rules: false - discover_batching_rules: false - # Resource profiles configuration - resource_profiles: - # Resource profile discovery type - discovery_type: differentiated - # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) - granularity: 60 - # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) - confidence: - - 0.5 - - 0.85 - # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) - support: - - 0.05 - - 0.5 - # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) - participation: 0.4 \ No newline at end of file diff --git a/resources/event_logs/LoanApp_simplified_test.csv.gz b/resources/event_logs/LoanApp_simplified_test.csv.gz deleted file mode 100644 index 8174e0c131a7addc77c5aceab355438df91a8a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101480 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

syqcmq1?l#ijo_+njbJIub>^MN&HmDMV7-h!61 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 X)Tf4mB^CW`8~U8D0Ho;IR57`>jU zQ5^|V9N&%-c-*#q$B5XI)@s!slV{=?IM8rZ0`O2Yq% z9w~d)-)D9wH}c&*qjiN`26Q?42oX3k_Zv4t3FXd`%0&ooBunK;+AkuPE8XHO${tNC z9fgKtOudh#+hW`btBYdxI?+e5NrnV+R0C1e3j}hg6*6`+NU6CVl#W{DdtkE1qzDNn zy>ww|&I)>`g3ndV#<6U`WVeBz8}`1LYBN_|i}TiEh`C(gq2-`v>`PO2!z+LvHes&+~}kH?9=(DQBF_-MwK zywU9-YuTF4bK>;;_+fk9szV&Ow)WqBuYJS^1O#2r;7)R<1`mlMZ@U9g`(ToUH(Kb~ z7xEpcMM(D(AJ5DBZ?wzq!ew6&w{HMW)($(7$I2RvRu1sjx>JzaQzy)Ew#?wX8-=%w zn^kE$K8bT@4=>6>sgy9@CX_Mz=~_m&g&}(1ZVp(;yT6Agf1qk$gFIFnE?>7{)JZt~ zJD{|j3s+mb@GODGvjw|VJGHAw>}w7>eb_90#Ga^Weh8^%K!qFJzo1H=AM|o+mL)b zV^aG-!9L|DduTth?p~3SHOD_86Qd`I>{Ww8JrIg{3PdvRZZwpBRrpf$0USm)R1TwG zWJWy2Fv#+i&tUM+q4=4mT_-n*h9F`P9Erzp>UCrAUdjBb@XOk_9a(N(Qk{Y1(BtqyZ3C^Of9lEZ)j?jFjR zUS-krGpHcv3nCA)mbA58M&J#!Q?F4>aH{ z$j=vET1IbPsq4A}Cl-=dj+WSGsvWsWP_K8WK6Po}+E)NfT7aM}kMCFg7zsXTxV+Id*R?FR3hdJQs^;ZDXHa+1TbTsqTljA?+PzWE<-^ldu$w$ zJcv%Ur=7|h7DWH{Pn*ia62%`o+`6{W_}bwSV_7B2L2Ars^6D+LbX;9jPtFtb-~EI> zqcro~jiM1Q!-sHM#@_Y!r$3NTGwL`6Yn1s)P3tQR@hc@Lw0DTI2e|}VA1!a8mmqdo zx=4LE-R=btu@@^esG8tdonOvR)N<}`hRiEYiTfgy>x|7NcHgb83=sU4ojuVDBOUNh zc^}x!^bC@oRQtSj@hh(Y2{2ZVE*x$Rg=~U>E0svi%O&K^c~_(TE7{9gmh}rf*}cUs z#`Qk?p2lF~<83adhMTQTl4ce+--b9GV*gW9=E&O}K`<&Xl*3B}G?ub&99W<>)H1#- zVuuCAMj?Kjnv=_4I#%8F|L0^SB>dZ)A)Rd&fF|kFe`BzyrsXd-%as9L%fB&SPZ)P-vy`P;xscD(iI11mpvlx%~waQi8Kkt&(UrKjHP3@VD#7ZQl!inSBlZQ00(L-``OeoObzvxjGxUFO@cycdqahHKA37g zO7-;9t4whSEsP>LOJNC7Z9-0xE*9E5%EAXfZPkdM$lX-$;;ie&xwydDZ@~gS^SY_k ze7U=)F@rb5dY4Rt`I0A@gb?lK&vvY_i}41TjbYvgUhcCsMVA?D(E(5ca&4iHV);!! zH8LDo#^bItt&I!!h`j3`%wMAUgQsfRLK^t#Yb>@q3~erDg1X^DPdgf1o(3iTBb8Aq9D4Px@s<%jAwM8XG(^8TTt2$IFYF?61htsJ1mt0o zuR4@S4M<*$qytKmo&=3_%~x}9JJm!^wf$&QJ^n>9%HN@54;S`NH#Si;6C9=8(U;o_bzChB@iqY#dh>Q!N`vuB0iV7z`~)8ZIQ0sA z5e|ZuoYA>L4t8fZ$P>?TYDoZxr|mxBjTLW+#b?#+9e?V6i+J^iJ`42H;>m zve-6&w!$C~*L}u{_e=l{lb?AL*c9%QZ)rHYZvXpbEnMP}joWisBUOkJ=#XF&(GH%) z3Wu<{0(jj&H|8isDHaPgOW1^JFLwm&?M_v$Km6~%JKIawfh`^B z9sJs&S*<~E4wKon_+F+aLX2}OrxDo(V!)deByexuCdT>ulhwP4!(^3n?SF{-sd&*q zoXA~S;-xmo+rz(H5ojg~&Tz-zFxu!6U8%!vUXXPn?p$evs;%&;lE9r>p4o4Thes?4o7;-nOP=3d9Db+p4@BTHDt) z{!?tnVC}#c=;+pM&`L^ArhDxDVfG#QQ(SKboxrcnhBhHUPLl}W7VY@NO z`2C!O`t`lvb-$EBikY1>+(Z8O>H6GB;|#P_W$*BdQikb4!=0tBkLPsl5dME5BkI3a@2L6! zAb;t2@@IM|+pEUQiZD4xv9k)2O?hoh9B>3z55B4bfU{@1fmA;8(JB^SGC_u4ow?LM>RxQP9`NnRP2NYs z-{Z5(-^|hh+NUrPlK`L(Y4c*s^qE<55Zezt-6q3-) zp~o0ctgOMm{72+%9g`7e@A%AzV>bnD3BW3VawKQ?mYxv94q&D`yghs?<$wrz(e>8) z{jUH-I3Fz=@E0i2PCZmUcN?R3t4>;5?Wt9;K0Sl2i~w8I z(?10%&;D55;DnBd&mX$ePEimWnMiHn@6zW3=BILy4`Y|H+p}hjn|B~xzCqB`8J-xu z1M;f?C5U6KF4`cDiv*Qvp5Fr1!np2+d7A54It@Y%YAI{cNRdj}a%bR!%E7rSzK7zEj$*6l zMZNt@ilG+wL|rCT#{&++Xik6SP~b>-$*6cdwJ-5P$sNaWeKYTDeLRp-QE?~5rpuC) zz6&0X|MUsT3p$$;@|L~9iysBD=o6U+U2-X(x8nHz6+DQxawr_wocd)ek~X6&a~Py! zD7ZDY&yzsYMW(!UciWPg*U1!B`)N&f*)K}I;-3&_@G$N5H)oz;OqQseS(o(uTR>T^ zv|yJB|0H*{Z{tHnUL*y@DV**X43r~EK?GAHo{aB*b)i8iJURMw;*N`Ib9*KWH%!jc zjjd9w-4XBH)JCLinxvs$WY7ei&5sDWidzf71Yuw$(`>n9ExRz{uTUrpAlY+J>Ztu$ z#;;_i0MS9=q;$?K*aP7I54AuQGIqWF1C23oZD9jM3kQI~_X#D|dXQM{Bzxmt%>RUa zPL{SOlE0I<$ae@EbcUmwHf1U=7VNyPo>Pk%PCxDjEOW02oO@@_o8-Y)gq${q1wk|S z9{TeORcY4KO7L|trjDh23>vH#N)()rxlY0~xS%!8$JjJn&+N6SAc9gIP^ZV#Ns7>UX2$_|?bxfm>Z@a@!V5O3%X)ZRMr?HQ`fi_q%9{~MXRX8#!km&9 z%xg%=!N9n8g)gP~hG0A0!0zBsdh~LCF+7mJ1rl=Zp1I)uc}^-=PbfI=@(F{d>(+@| zF8}NwuI>NuG?M5&%?+Qu9Yw7!K4ymW2zP*ckL>sfOZ#BwP^cq`cu&=;VEXANbJ7BX zs~`Tfx40ywwnSFeH)CObGM>vU@ge$-wSRwq&GV)SEx!T78o2$?|625NYs?n`mrBLe z_TyMT!vGp8FCL1os~=A;1yZCIE3>co@KK#6ikxEt1s|lIcWsO?l^CTP2HU(|8<+n% zzceZ;xV2r;;6gGg1jqbfS?t8UEB0-cQ0=5mmUHwB(?UT~T~`={?(AsL3y{6xC-ucfdH97Y-U?QqgGIAR=Jad_x1Ho;n zKHm%C!e-eqLDt_wlu^?B?nld$B70%!%h|TG<;wM!G!Qq*N%&J}H5UtkK_`226Hi!( zZ@cNA&4kb2nEXZ{sZGh3)9uXT{H$nT*DC6bp$zN6;c&=sRoN11XuiUeLv|fVcg4 zscVg+x4o86cpJbGs-3cSv}MjzGKz2LRWVZIn}#El{>Q*I<$X2I!!m7kV;YjiwT??t zuVzYLR^VE_sZ< zBsv?w*O5XRvU$Rd0kJ_*dES=+iX5UZb4rBlfdtF-KUF&H#6M8)zGus8_uhyb%*ffY zJXDEe3Q>o=Hy(hz+x7(2tjn_H!?Pm7)YN#@P1p9gL3BQd&ExmkkW!I+^71Yj`rIq1LoAv3^G$ogly^?OX3w5h*{nL`FoF0)&UBGPODZ&#IltS_99h{TP3wkt!%~xIBaf~sttHLvnZF(vFKj|TUWq%G7mCWV?HbX*vDo;Ef~HRGOMWxMC-Uy4+Iq#v4|%& z;+!YHO*Ic!TkK2(bLvvLbLw_kEDM6t&M-ilRQX{_4nf=8^i4Ov`qqyw;7&&_<#@XB z9;^LNoIJ$jbXMc|h$yadi<~xyL@$P(?-J0>k|@KHLVz=>b^bUu{cU&g(@M^fERLe- zi1*f%d_(Lzd_E*(0LC9eI|U>iGBYjd=hks9U}m7j7$oS71DJz-6O&n>p1@^AE17CG{^neT(6yz{x@3|+qx$H?rfuu;B^C5&22 zzviP4O2_Pe+vjNUeigxwMCfQHCA`S?BtCDPU3I(pCck8OUBum8>#cEb$6G|^*fum^#A3*sB`lDJB7Jc2g5jNt*dS^#txZKUBHGwv&B2RlM)oS8>ztC%vfj`FO zVK?IOs|K;@529W!uM5}){uewrS?Exjg6W*f2o@p21gn^J_bJm%M?H%pl-w&nAYE^m z8;p#r>%jwbCe2a zm6)dE?jB@Y43!N4vbtoRC@X_tY96kJ?1!gq$f-1?{AkjJJI`6(rQN8lQofG;_vtqu z5E?J}cx#u0EF0XUFpze8FLp}*TJDWlbh+KrGe{&+oKUTL-Zvz9hS?1FZ@%aMNcAL; z5E7vzbbNy47(?4vpZk=!yTa8Fh_a}*vy5n*0B@^qCgnHJ&1~bxZ&@TgD^T7q<*!Om z+)!p~8y?+WhABr6`jzKW9V*LRz^WVfLH*%Xc8bCHH z;3kqcffy8nlC=Kr2dVyNsEek1YjuwP<)edA*e6$moF+d6Fpa_PODs=lcV40yZY8({ zbk&``mN-9+LTT4J*Bt=%jdp4`^Q&xeS}fpg$3p~{*gxqF!{A(|`(sS}TDwjm!H$^l zBN26tD|2J0Ol1Uf6FYR_?B!O{GDbaK&IaxOLHEcYcAujDjHp@EbKw3r;UVTBxIqT{ zY%#}U6XtWKG)8#lkLiE4kcx3OvWL3oE&f@WfIgwW{xDNjAnxB5-c5~Hwemgm;fQH{tnTk~spXl7t#+B?|A>hU1vHIC0^OAlLma4=*`C`Q?N|Sqg z)wUSn4ou4-uA-|Xtuc7?9xwR~OQ|uTtFIzArF*vHD_VNzUuA`@QY8&;pcnxvHsQi} zQl3W!zprI!kIzISN+l|b0p)wIZd`J9Fz;vOzdEWNdspwX+|PLnJPTog8YXnNCX}Qp zKgN`cG4ysG9ATsV%v5){og@+19QOQModuiUK-uTCrnTd6`f48sGWjy|w|)q>hZ)-C zZIC*~hw5mot4D$gIrQvRDlrD8OysS3-nZ&*1!*6iQWcb2fee|5Zbn?v&*aIkGm zD0!Kx@l5Luu)QhJ`;PGKY0w-rC@Nn^<_#&9_@yH*w8i{vWwp~Zwi@4N8FS_+i^MU8-dv`U-!j5O(w3gNbu&P4CMQEC*+OYq?@uaot m*{UA_Sq@#yp(d5M3DY$U7PwHA^XvAEzffQCFGD8MTmJ{CMF|uD diff --git a/resources/event_logs/LoanApp_simplified_train.csv.gz b/resources/event_logs/LoanApp_simplified_train.csv.gz deleted file mode 100644 index b250be6cdd342bd380fbb84c18391a46f049fff5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102558 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 N{sKYwIOl-o4FEVWR^$Kx diff --git a/tests/assets/bpic15/bpic15_1_with_model_v4.yml b/tests/assets/bpic15/bpic15_1_with_model_v4.yml index 0068bcd4..3a95c25c 100644 --- a/tests/assets/bpic15/bpic15_1_with_model_v4.yml +++ b/tests/assets/bpic15/bpic15_1_with_model_v4.yml @@ -1,16 +1,8 @@ -version: 4 +version: 5.2 common: train_log_path: BPIC15_1.csv.gz process_model_path: BPIC15_1.bpmn - num_final_evaluations: 1 # Number of evaluations of the discovered BPS model. - evaluation_metrics: # Metrics to evaluate the discovered BPS model with. - - 3_gram_distance - - 2_gram_distance - - absolute_event_distribution - - relative_event_distribution - - circadian_event_distribution - - arrival_event_distribution - - cycle_time_distribution + num_final_evaluations: 1 clean_intermediate_files: false log_ids: case: case:concept:name @@ -20,48 +12,20 @@ common: end_time: time:timestamp enabled_time: enabled_time preprocessing: - multitasking: false # Reassign activity durations when happening in multitasking. - enable_time_concurrency_threshold: 0.5 # Concurrency threshold for the enabled time computation. - concurrency_df: 0.75 # Concurrency thresholds for the start time (and enabled time) estimations when - concurrency_l2l: 0.9 # the start time is missing in the train event log. Using the Heuristics Miner - concurrency_l1l: 0.9 # concurrency oracle. + multitasking: false + enable_time_concurrency_threshold: 0.5 + concurrency_df: 0.75 + concurrency_l2l: 0.9 + concurrency_l1l: 0.9 +case_arrival: + num_iterations: 1 + num_evaluations_per_iteration: 3 control_flow: - optimization_metric: n_gram_distance - num_iterations: 1 # Number of iterations to run the hyper-optimization process for control-flow discovery - num_evaluations_per_iteration: 5 # Number of times to evaluate each iteration (using the mean of all of them) - gateway_probabilities: # Methods to discover the probabilities of each gateway - - equiprobable - - discovery - discovery_algorithm: sm1 # Process model discovery algorithm: sm1 (Split Miner v1) or sm2 (Split Miner v2) - epsilon: - - 0.0 - - 1.0 - eta: - - 0.0 - - 1.0 - replace_or_joins: - - true - - false - prioritize_parallelism: - - true - - false + num_iterations: 1 + num_evaluations_per_iteration: 3 resource_model: - optimization_metric: circadian_event_distribution - num_iterations: 1 # Number of iterations to run the hyper-optimization process for control-flow discovery - num_evaluations_per_iteration: 5 # Number of times to evaluate each iteration (using the mean of all of them) - resource_profiles: - discovery_type: differentiated # Resource discovery type ('undifferentiated', 'pool', or 'differentiated') - granularity: - - 15 - - 60 - confidence: - - 0.5 - - 0.85 - support: - - 0.01 - - 0.3 - participation: 0.4 + num_iterations: 1 + num_evaluations_per_iteration: 3 extraneous_activity_delays: - optimization_metric: relative_event_distribution - num_iterations: 1 # Number of iterations of the optimization process (if 1, direct discovery without optimization) - num_evaluations_per_iteration: 3 # Number of times to evaluate each iteration (using the mean of all of them) + num_iterations: 1 + num_evaluations_per_iteration: 3 From 76b5ebae381cfac5722ff96c5ade2eb722e9a052 Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Mon, 21 Sep 2026 17:47:25 +0300 Subject: [PATCH 11/12] Update dependencies, Python version, and GitHub action --- .github/workflows/simod.yml | 4 +-- README.md | 2 +- pyproject.toml | 60 ++++++++++++++++++------------------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/.github/workflows/simod.yml b/.github/workflows/simod.yml index ecb35738..dfd70775 100644 --- a/.github/workflows/simod.yml +++ b/.github/workflows/simod.yml @@ -28,7 +28,7 @@ jobs: timeout-minutes: 120 strategy: matrix: - python-version: [ '3.9' ] + python-version: [ '3.11' ] steps: - uses: actions/checkout@v3 with: @@ -121,7 +121,7 @@ jobs: if: github.ref == 'refs/heads/master' strategy: matrix: - python-version: [ '3.9' ] + python-version: [ '3.11' ] environment: name: PyPI url: https://pypi.org/p/simod diff --git a/README.md b/README.md index b8887ddf..75ca8473 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ the [Prosimos](https://github.com/AutomatedProcessImprovement/Prosimos) simulato | Dependency | Version | Notes | |------------|---------|------------------------------------------------------------------------------------------------------------------------------------------------| -| Python | 3.9 | For Windows, [Python 3.9.13](https://www.python.org/downloads/release/python-3913/) is the last distribution with Windows installers. | +| Python | 3.11 | For Windows, [Python 3.9.13](https://www.python.org/downloads/release/python-3913/) is the last distribution with Windows installers. | | Java | 1.8 | For example, use [Amazon Corretto 8](https://docs.aws.amazon.com/corretto/latest/corretto-8-ug/downloads-list.html). | | Poetry | latest | If using Docker or compiling from source, use [Poetry](https://python-poetry.org/) for building, installing, and managing Python dependencies. | diff --git a/pyproject.toml b/pyproject.toml index 70a0141e..4084f878 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "simod" -version = "5.1.6" +version = "5.2.0" authors = [ "Ihar Suvorau ", "David Chapela ", @@ -15,40 +15,40 @@ readme = "README.md" packages = [{ include = "simod", from = "src" }] [tool.poetry.dependencies] -python = "^3.9,<3.12" -click = "^8.1.3" -hyperopt = "^0.2.7" -lxml = "^5.3.0" -matplotlib = "^3.6.0" -networkx = "^3.2.1" -numpy = "^1.24.23" -pandas = "^2.1.0" -pendulum = "^3.0.0" -pydantic = "^2.3.0" -python-dotenv = "^1.0.0" -python-multipart = "^0.0.12" -pytz = "^2024.2" -PyYAML = "^6.0" -requests = "^2.28.2" -scipy = "^1.13.0" +python = ">=3.11,<3.13" +click = "^8.4.2" +hyperopt = "^0.3.0" +lxml = "^6.1.1" +matplotlib = "^3.11.1" +networkx = "^3.6.1" +numpy = "^2.4.6" +pandas = "^2.3.3" +pendulum = "^3.2.0" +pydantic = "^2.13.4" +python-dotenv = "^1.2.2" +python-multipart = "^0.0.32" +pytz = "^2026.3" +PyYAML = "^6.0.3" +requests = "^2.34.2" +scipy = "^1.17.1" statistics = "^1.0.3.5" -tqdm = "^4.64.1" -xmltodict = "^0.13.0" -prosimos = "^2.0.6" -extraneous-activity-delays = "^2.1.21" +tqdm = "^4.70.0" +xmltodict = "^1.0.4" +prosimos = "^2.1.0" +extraneous-activity-delays = "^2.3.0" openxes-cli-py = "^0.1.15" -pix-framework = "^0.13.17" -log-distance-measures = "^2.0.0" +pix-framework = "^0.15.0" +log-distance-measures = "^2.2.0" [tool.poetry.group.dev.dependencies] -pytest = "^7.1.3" -pytest-cov = "^4" +pytest = "^9.0.1" +pytest-cov = "^7.0.0" memory-profiler = "^0.61.0" -pylint = "^2.17.4" -setuptools = "^67.8.0" -seaborn = "^0.12.2" -pytest-benchmark = "^4.0.0" -snakeviz = "^2.2.0" +pylint = "^4.0.3" +setuptools = "^80.9.0" +seaborn = "^0.13.2" +pytest-benchmark = "^5.2.3" +snakeviz = "^2.2.2" [tool.poetry.scripts] simod = "simod.cli:main" From 5856d049510089bd45928112eaab9a4666c3226e Mon Sep 17 00:00:00 2001 From: David Chapela de la Campa Date: Mon, 21 Sep 2026 17:48:19 +0300 Subject: [PATCH 12/12] Update benchmark configurations --- .../benchmark/AcademicCredentials_diff.yml | 113 ++++++++++++++++++ .../AcademicCredentials_diff_extr.yml | 109 +++++++++++++++++ .../benchmark/AcademicCredentials_fuzz.yml | 92 ++++++++++++++ .../AcademicCredentials_fuzz_extr.yml | 102 ++++++++++++++++ .../benchmark/AcademicCredentials_pool.yml | 99 +++++++++++++++ resources/config/benchmark/BPIC_2017_diff.yml | 113 ++++++++++++++++++ .../config/benchmark/BPIC_2017_diff_extr.yml | 109 +++++++++++++++++ resources/config/benchmark/BPIC_2017_fuzz.yml | 92 ++++++++++++++ .../config/benchmark/BPIC_2017_fuzz_extr.yml | 102 ++++++++++++++++ resources/config/benchmark/BPIC_2017_pool.yml | 99 +++++++++++++++ .../benchmark/Governmental_Agency_diff.yml | 113 ++++++++++++++++++ .../Governmental_Agency_diff_extr.yml | 109 +++++++++++++++++ .../benchmark/Governmental_Agency_fuzz.yml | 92 ++++++++++++++ .../Governmental_Agency_fuzz_extr.yml | 102 ++++++++++++++++ .../benchmark/Governmental_Agency_pool.yml | 99 +++++++++++++++ resources/config/benchmark/P2PFin_diff.yml | 113 ++++++++++++++++++ .../config/benchmark/P2PFin_diff_extr.yml | 109 +++++++++++++++++ resources/config/benchmark/P2PFin_fuzz.yml | 92 ++++++++++++++ .../config/benchmark/P2PFin_fuzz_extr.yml | 102 ++++++++++++++++ resources/config/benchmark/P2PFin_pool.yml | 99 +++++++++++++++ .../benchmark/WorkOrders_postdrift_diff.yml | 113 ++++++++++++++++++ .../WorkOrders_postdrift_diff_extr.yml | 109 +++++++++++++++++ .../benchmark/WorkOrders_postdrift_fuzz.yml | 92 ++++++++++++++ .../WorkOrders_postdrift_fuzz_extr.yml | 102 ++++++++++++++++ .../benchmark/WorkOrders_postdrift_pool.yml | 99 +++++++++++++++ .../benchmark/WorkOrders_predrift_diff.yml | 113 ++++++++++++++++++ .../WorkOrders_predrift_diff_extr.yml | 109 +++++++++++++++++ .../benchmark/WorkOrders_predrift_fuzz.yml | 92 ++++++++++++++ .../WorkOrders_predrift_fuzz_extr.yml | 102 ++++++++++++++++ .../benchmark/WorkOrders_predrift_pool.yml | 99 +++++++++++++++ 30 files changed, 3090 insertions(+) create mode 100644 resources/config/benchmark/AcademicCredentials_diff.yml create mode 100644 resources/config/benchmark/AcademicCredentials_diff_extr.yml create mode 100644 resources/config/benchmark/AcademicCredentials_fuzz.yml create mode 100644 resources/config/benchmark/AcademicCredentials_fuzz_extr.yml create mode 100644 resources/config/benchmark/AcademicCredentials_pool.yml create mode 100644 resources/config/benchmark/BPIC_2017_diff.yml create mode 100644 resources/config/benchmark/BPIC_2017_diff_extr.yml create mode 100644 resources/config/benchmark/BPIC_2017_fuzz.yml create mode 100644 resources/config/benchmark/BPIC_2017_fuzz_extr.yml create mode 100644 resources/config/benchmark/BPIC_2017_pool.yml create mode 100644 resources/config/benchmark/Governmental_Agency_diff.yml create mode 100644 resources/config/benchmark/Governmental_Agency_diff_extr.yml create mode 100644 resources/config/benchmark/Governmental_Agency_fuzz.yml create mode 100644 resources/config/benchmark/Governmental_Agency_fuzz_extr.yml create mode 100644 resources/config/benchmark/Governmental_Agency_pool.yml create mode 100644 resources/config/benchmark/P2PFin_diff.yml create mode 100644 resources/config/benchmark/P2PFin_diff_extr.yml create mode 100644 resources/config/benchmark/P2PFin_fuzz.yml create mode 100644 resources/config/benchmark/P2PFin_fuzz_extr.yml create mode 100644 resources/config/benchmark/P2PFin_pool.yml create mode 100644 resources/config/benchmark/WorkOrders_postdrift_diff.yml create mode 100644 resources/config/benchmark/WorkOrders_postdrift_diff_extr.yml create mode 100644 resources/config/benchmark/WorkOrders_postdrift_fuzz.yml create mode 100644 resources/config/benchmark/WorkOrders_postdrift_fuzz_extr.yml create mode 100644 resources/config/benchmark/WorkOrders_postdrift_pool.yml create mode 100644 resources/config/benchmark/WorkOrders_predrift_diff.yml create mode 100644 resources/config/benchmark/WorkOrders_predrift_diff_extr.yml create mode 100644 resources/config/benchmark/WorkOrders_predrift_fuzz.yml create mode 100644 resources/config/benchmark/WorkOrders_predrift_fuzz_extr.yml create mode 100644 resources/config/benchmark/WorkOrders_predrift_pool.yml diff --git a/resources/config/benchmark/AcademicCredentials_diff.yml b/resources/config/benchmark/AcademicCredentials_diff.yml new file mode 100644 index 00000000..99e019da --- /dev/null +++ b/resources/config/benchmark/AcademicCredentials_diff.yml @@ -0,0 +1,113 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/AcademicCredentials_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/AcademicCredentials_test.csv.gz + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery + # Discover process model with SplitMiner v3 + mining_algorithm: sm1 + # Number of concurrent relations between events to be captured + epsilon: + - 0.05 + - 0.4 + # Threshold for filtering the incoming and outgoing edges + eta: + - 0.2 + - 0.7 + # Whether to replace non-trivial OR joins or not + replace_or_joins: + - true + - false + # Whether to prioritize parallelism over loops or not + prioritize_parallelism: true +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 \ No newline at end of file diff --git a/resources/config/benchmark/AcademicCredentials_diff_extr.yml b/resources/config/benchmark/AcademicCredentials_diff_extr.yml new file mode 100644 index 00000000..0409306e --- /dev/null +++ b/resources/config/benchmark/AcademicCredentials_diff_extr.yml @@ -0,0 +1,109 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/AcademicCredentials_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/AcademicCredentials_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/AcademicCredentials_diff/best_result/AcademicCredentials_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/AcademicCredentials_fuzz.yml b/resources/config/benchmark/AcademicCredentials_fuzz.yml new file mode 100644 index 00000000..8c300773 --- /dev/null +++ b/resources/config/benchmark/AcademicCredentials_fuzz.yml @@ -0,0 +1,92 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/AcademicCredentials_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/AcademicCredentials_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/AcademicCredentials_diff/best_result/AcademicCredentials_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 diff --git a/resources/config/benchmark/AcademicCredentials_fuzz_extr.yml b/resources/config/benchmark/AcademicCredentials_fuzz_extr.yml new file mode 100644 index 00000000..9c4cf7bb --- /dev/null +++ b/resources/config/benchmark/AcademicCredentials_fuzz_extr.yml @@ -0,0 +1,102 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/AcademicCredentials_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/AcademicCredentials_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/AcademicCredentials_diff/best_result/AcademicCredentials_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/AcademicCredentials_pool.yml b/resources/config/benchmark/AcademicCredentials_pool.yml new file mode 100644 index 00000000..be806a2c --- /dev/null +++ b/resources/config/benchmark/AcademicCredentials_pool.yml @@ -0,0 +1,99 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/AcademicCredentials_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/AcademicCredentials_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/AcademicCredentials_diff/best_result/AcademicCredentials_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: pool + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 diff --git a/resources/config/benchmark/BPIC_2017_diff.yml b/resources/config/benchmark/BPIC_2017_diff.yml new file mode 100644 index 00000000..9db075c3 --- /dev/null +++ b/resources/config/benchmark/BPIC_2017_diff.yml @@ -0,0 +1,113 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/BPIC_2017_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/BPIC_2017_test.csv.gz + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery + # Discover process model with SplitMiner v3 + mining_algorithm: sm1 + # Number of concurrent relations between events to be captured + epsilon: + - 0.05 + - 0.4 + # Threshold for filtering the incoming and outgoing edges + eta: + - 0.2 + - 0.7 + # Whether to replace non-trivial OR joins or not + replace_or_joins: + - true + - false + # Whether to prioritize parallelism over loops or not + prioritize_parallelism: true +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 \ No newline at end of file diff --git a/resources/config/benchmark/BPIC_2017_diff_extr.yml b/resources/config/benchmark/BPIC_2017_diff_extr.yml new file mode 100644 index 00000000..d81f3818 --- /dev/null +++ b/resources/config/benchmark/BPIC_2017_diff_extr.yml @@ -0,0 +1,109 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/BPIC_2017_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/BPIC_2017_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/BPIC_2017_diff/best_result/BPIC_2017_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/BPIC_2017_fuzz.yml b/resources/config/benchmark/BPIC_2017_fuzz.yml new file mode 100644 index 00000000..e06c5774 --- /dev/null +++ b/resources/config/benchmark/BPIC_2017_fuzz.yml @@ -0,0 +1,92 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/BPIC_2017_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/BPIC_2017_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/BPIC_2017_diff/best_result/BPIC_2017_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 diff --git a/resources/config/benchmark/BPIC_2017_fuzz_extr.yml b/resources/config/benchmark/BPIC_2017_fuzz_extr.yml new file mode 100644 index 00000000..5d24f8b4 --- /dev/null +++ b/resources/config/benchmark/BPIC_2017_fuzz_extr.yml @@ -0,0 +1,102 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/BPIC_2017_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/BPIC_2017_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/BPIC_2017_diff/best_result/BPIC_2017_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/BPIC_2017_pool.yml b/resources/config/benchmark/BPIC_2017_pool.yml new file mode 100644 index 00000000..6ef5916d --- /dev/null +++ b/resources/config/benchmark/BPIC_2017_pool.yml @@ -0,0 +1,99 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/BPIC_2017_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/BPIC_2017_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/BPIC_2017_diff/best_result/BPIC_2017_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: pool + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 diff --git a/resources/config/benchmark/Governmental_Agency_diff.yml b/resources/config/benchmark/Governmental_Agency_diff.yml new file mode 100644 index 00000000..2b195ffc --- /dev/null +++ b/resources/config/benchmark/Governmental_Agency_diff.yml @@ -0,0 +1,113 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/Governmental_Agency_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/Governmental_Agency_test.csv.gz + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery + # Discover process model with SplitMiner v3 + mining_algorithm: sm1 + # Number of concurrent relations between events to be captured + epsilon: + - 0.05 + - 0.4 + # Threshold for filtering the incoming and outgoing edges + eta: + - 0.2 + - 0.7 + # Whether to replace non-trivial OR joins or not + replace_or_joins: + - true + - false + # Whether to prioritize parallelism over loops or not + prioritize_parallelism: true +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 \ No newline at end of file diff --git a/resources/config/benchmark/Governmental_Agency_diff_extr.yml b/resources/config/benchmark/Governmental_Agency_diff_extr.yml new file mode 100644 index 00000000..a01285c0 --- /dev/null +++ b/resources/config/benchmark/Governmental_Agency_diff_extr.yml @@ -0,0 +1,109 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/Governmental_Agency_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/Governmental_Agency_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/Governmental_Agency_diff/best_result/Governmental_Agency_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/Governmental_Agency_fuzz.yml b/resources/config/benchmark/Governmental_Agency_fuzz.yml new file mode 100644 index 00000000..f037dbd2 --- /dev/null +++ b/resources/config/benchmark/Governmental_Agency_fuzz.yml @@ -0,0 +1,92 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/Governmental_Agency_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/Governmental_Agency_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/Governmental_Agency_diff/best_result/Governmental_Agency_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 diff --git a/resources/config/benchmark/Governmental_Agency_fuzz_extr.yml b/resources/config/benchmark/Governmental_Agency_fuzz_extr.yml new file mode 100644 index 00000000..8be9432a --- /dev/null +++ b/resources/config/benchmark/Governmental_Agency_fuzz_extr.yml @@ -0,0 +1,102 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/Governmental_Agency_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/Governmental_Agency_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/Governmental_Agency_diff/best_result/Governmental_Agency_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/Governmental_Agency_pool.yml b/resources/config/benchmark/Governmental_Agency_pool.yml new file mode 100644 index 00000000..70ca90d4 --- /dev/null +++ b/resources/config/benchmark/Governmental_Agency_pool.yml @@ -0,0 +1,99 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/Governmental_Agency_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/Governmental_Agency_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/Governmental_Agency_diff/best_result/Governmental_Agency_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: pool + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 diff --git a/resources/config/benchmark/P2PFin_diff.yml b/resources/config/benchmark/P2PFin_diff.yml new file mode 100644 index 00000000..3d136979 --- /dev/null +++ b/resources/config/benchmark/P2PFin_diff.yml @@ -0,0 +1,113 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/P2PFin_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/P2PFin_test.csv.gz + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery + # Discover process model with SplitMiner v3 + mining_algorithm: sm1 + # Number of concurrent relations between events to be captured + epsilon: + - 0.05 + - 0.4 + # Threshold for filtering the incoming and outgoing edges + eta: + - 0.2 + - 0.7 + # Whether to replace non-trivial OR joins or not + replace_or_joins: + - true + - false + # Whether to prioritize parallelism over loops or not + prioritize_parallelism: true +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 \ No newline at end of file diff --git a/resources/config/benchmark/P2PFin_diff_extr.yml b/resources/config/benchmark/P2PFin_diff_extr.yml new file mode 100644 index 00000000..aa33e3c9 --- /dev/null +++ b/resources/config/benchmark/P2PFin_diff_extr.yml @@ -0,0 +1,109 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/P2PFin_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/P2PFin_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/P2PFin_diff/best_result/P2PFin_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/P2PFin_fuzz.yml b/resources/config/benchmark/P2PFin_fuzz.yml new file mode 100644 index 00000000..6fe24f5a --- /dev/null +++ b/resources/config/benchmark/P2PFin_fuzz.yml @@ -0,0 +1,92 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/P2PFin_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/P2PFin_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/P2PFin_diff/best_result/P2PFin_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 diff --git a/resources/config/benchmark/P2PFin_fuzz_extr.yml b/resources/config/benchmark/P2PFin_fuzz_extr.yml new file mode 100644 index 00000000..84db14db --- /dev/null +++ b/resources/config/benchmark/P2PFin_fuzz_extr.yml @@ -0,0 +1,102 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/P2PFin_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/P2PFin_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/P2PFin_diff/best_result/P2PFin_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/P2PFin_pool.yml b/resources/config/benchmark/P2PFin_pool.yml new file mode 100644 index 00000000..e3ab987b --- /dev/null +++ b/resources/config/benchmark/P2PFin_pool.yml @@ -0,0 +1,99 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/P2PFin_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/P2PFin_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/P2PFin_diff/best_result/P2PFin_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: pool + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 diff --git a/resources/config/benchmark/WorkOrders_postdrift_diff.yml b/resources/config/benchmark/WorkOrders_postdrift_diff.yml new file mode 100644 index 00000000..06011c26 --- /dev/null +++ b/resources/config/benchmark/WorkOrders_postdrift_diff.yml @@ -0,0 +1,113 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_postdrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_postdrift_test.csv.gz + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery + # Discover process model with SplitMiner v3 + mining_algorithm: sm1 + # Number of concurrent relations between events to be captured + epsilon: + - 0.05 + - 0.4 + # Threshold for filtering the incoming and outgoing edges + eta: + - 0.2 + - 0.7 + # Whether to replace non-trivial OR joins or not + replace_or_joins: + - true + - false + # Whether to prioritize parallelism over loops or not + prioritize_parallelism: true +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 \ No newline at end of file diff --git a/resources/config/benchmark/WorkOrders_postdrift_diff_extr.yml b/resources/config/benchmark/WorkOrders_postdrift_diff_extr.yml new file mode 100644 index 00000000..c2a45030 --- /dev/null +++ b/resources/config/benchmark/WorkOrders_postdrift_diff_extr.yml @@ -0,0 +1,109 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_postdrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_postdrift_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/WorkOrders_postdrift_diff/best_result/WorkOrders_postdrift_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/WorkOrders_postdrift_fuzz.yml b/resources/config/benchmark/WorkOrders_postdrift_fuzz.yml new file mode 100644 index 00000000..21eb2fc0 --- /dev/null +++ b/resources/config/benchmark/WorkOrders_postdrift_fuzz.yml @@ -0,0 +1,92 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_postdrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_postdrift_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/WorkOrders_postdrift_diff/best_result/WorkOrders_postdrift_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 diff --git a/resources/config/benchmark/WorkOrders_postdrift_fuzz_extr.yml b/resources/config/benchmark/WorkOrders_postdrift_fuzz_extr.yml new file mode 100644 index 00000000..5604bc01 --- /dev/null +++ b/resources/config/benchmark/WorkOrders_postdrift_fuzz_extr.yml @@ -0,0 +1,102 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_postdrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_postdrift_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/WorkOrders_postdrift_diff/best_result/WorkOrders_postdrift_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/WorkOrders_postdrift_pool.yml b/resources/config/benchmark/WorkOrders_postdrift_pool.yml new file mode 100644 index 00000000..9946ce5f --- /dev/null +++ b/resources/config/benchmark/WorkOrders_postdrift_pool.yml @@ -0,0 +1,99 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_postdrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_postdrift_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/WorkOrders_postdrift_diff/best_result/WorkOrders_postdrift_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: pool + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 diff --git a/resources/config/benchmark/WorkOrders_predrift_diff.yml b/resources/config/benchmark/WorkOrders_predrift_diff.yml new file mode 100644 index 00000000..dd6061d5 --- /dev/null +++ b/resources/config/benchmark/WorkOrders_predrift_diff.yml @@ -0,0 +1,113 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_predrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_predrift_test.csv.gz + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery + # Discover process model with SplitMiner v3 + mining_algorithm: sm1 + # Number of concurrent relations between events to be captured + epsilon: + - 0.05 + - 0.4 + # Threshold for filtering the incoming and outgoing edges + eta: + - 0.2 + - 0.7 + # Whether to replace non-trivial OR joins or not + replace_or_joins: + - true + - false + # Whether to prioritize parallelism over loops or not + prioritize_parallelism: true +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 \ No newline at end of file diff --git a/resources/config/benchmark/WorkOrders_predrift_diff_extr.yml b/resources/config/benchmark/WorkOrders_predrift_diff_extr.yml new file mode 100644 index 00000000..be2e7576 --- /dev/null +++ b/resources/config/benchmark/WorkOrders_predrift_diff_extr.yml @@ -0,0 +1,109 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_predrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_predrift_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/WorkOrders_predrift_diff/best_result/WorkOrders_predrift_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/WorkOrders_predrift_fuzz.yml b/resources/config/benchmark/WorkOrders_predrift_fuzz.yml new file mode 100644 index 00000000..fd1772b8 --- /dev/null +++ b/resources/config/benchmark/WorkOrders_predrift_fuzz.yml @@ -0,0 +1,92 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_predrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_predrift_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/WorkOrders_predrift_diff/best_result/WorkOrders_predrift_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 diff --git a/resources/config/benchmark/WorkOrders_predrift_fuzz_extr.yml b/resources/config/benchmark/WorkOrders_predrift_fuzz_extr.yml new file mode 100644 index 00000000..96a40f33 --- /dev/null +++ b/resources/config/benchmark/WorkOrders_predrift_fuzz_extr.yml @@ -0,0 +1,102 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_predrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_predrift_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/WorkOrders_predrift_diff/best_result/WorkOrders_predrift_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: differentiated_fuzzy + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + fuzzy_angle: + - 0.1 + - 0.9 +##################### +# Extraneous delays # +##################### +extraneous_activity_delays: + # Method to compute the extraneous delay (naive or eclipse-aware) + discovery_method: eclipse-aware + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: relative_emd + # Number of optimization iterations over the search space (1 = direct discovery, no optimization stage) + num_iterations: 20 diff --git a/resources/config/benchmark/WorkOrders_predrift_pool.yml b/resources/config/benchmark/WorkOrders_predrift_pool.yml new file mode 100644 index 00000000..316a9adf --- /dev/null +++ b/resources/config/benchmark/WorkOrders_predrift_pool.yml @@ -0,0 +1,99 @@ +version: 5.2 +########## +# Common # +########## +common: + # Path to the event log in CSV format + train_log_path: ../../event_logs/WorkOrders_predrift_train.csv.gz + # Event log to evaluate the discovered BPS model with + test_log_path: ../../event_logs/WorkOrders_predrift_test.csv.gz + # Use this process model and skip its discovery + process_model_path: ../../../outputs/WorkOrders_predrift_diff/best_result/WorkOrders_predrift_train.bpmn + # Specify the name for each of the columns in the CSV file (XES standard by default) + log_ids: + case: "case_id" + activity: "activity" + resource: "resource" + start_time: "start_time" + end_time: "end_time" + # Number of evaluations of the discovered BPS model + num_final_evaluations: 10 + # Metrics to evaluate the discovered BPS model + evaluation_metrics: + - 3_gram_distance + - 2_gram_distance + - absolute_event_distribution + - relative_event_distribution + - circadian_event_distribution + - circadian_workforce_distribution + - arrival_event_distribution + - cycle_time_distribution + # Whether to discover case attributes or not + discover_data_attributes: false +###################### +# Case Arrival model # +###################### +case_arrival: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: arrival_event_distribution + # Number of optimization iterations over the search space + num_iterations: 5 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 3 + # Whether to simulate the arrival times using the distribution of inter-arrival times observed in the training log, + # or fitting a parameterized probabilistic distribution (e.g., norm, expon) with these observed values. + use_observed_arrival_distribution: false + # When fitting a probabilistic distribution, threshold used to filter out outliers in the sample of inter-arrival + # times observed in the training event log (fixed or range between two floats). Increasing the outlier threshold + # increases the "range" of accepted values, thus, potentially decreasing the number of observations considered + # an outlier. + outlier_threshold: + - 5.0 + - 50.0 +################# +# Preprocessing # +################# +preprocessing: + multitasking: false + enable_time_concurrency_threshold: 0.5 +################ +# Control-flow # +################ +control_flow: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: two_gram_distance + # Number of optimization iterations over the search space + num_iterations: 1 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 1 + # Methods for discovering gateway probabilities + gateway_probabilities: discovery +################## +# Resource model # +################## +resource_model: + # Metric to guide the optimization process (loss function to minimize) + optimization_metric: circadian_emd + # Number of optimization iterations over the search space + num_iterations: 40 + # Number of times to evaluate each iteration (using the mean of all of them) + num_evaluations_per_iteration: 5 + # Whether to discover prioritization or batching behavior + discover_prioritization_rules: false + discover_batching_rules: false + # Resource profiles configuration + resource_profiles: + # Resource profile discovery type + discovery_type: pool + # Time granularity (in minutes) for the resource calendar (the higher the density of events in the log, the smaller the granularity can be) + granularity: 60 + # Minimum confidence of the intervals in the discovered calendar (of a resource or set of resources) + confidence: + - 0.5 + - 0.85 + # Minimum support of the intervals in the discovered calendar (of a resource or set of resources) + support: + - 0.05 + - 0.5 + # Participation of a resource in the process to discover a calendar for them (gathered together otherwise) + participation: 0.4