''' This file is part of PM4Py (More Info: https://pm4py.fit.fraunhofer.de). PM4Py is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. PM4Py is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with PM4Py. If not, see . ''' from enum import Enum from typing import Optional, Dict, Any, Union import pandas as pd from pm4py import util as pmutil from pm4py.algo.discovery.inductive.dtypes.im_dfg import InductiveDFG from pm4py.algo.discovery.inductive.dtypes.im_ds import IMDataStructureUVCL, IMDataStructureDFG from pm4py.algo.discovery.inductive.variants.im import IMUVCL from pm4py.algo.discovery.inductive.variants.imf import IMFUVCL from pm4py.algo.discovery.inductive.variants.imd import IMD from pm4py.algo.discovery.inductive.variants.instances import IMInstance from pm4py.objects.dfg.obj import DFG from pm4py.objects.log.obj import EventLog from pm4py.objects.process_tree.obj import ProcessTree from pm4py.objects.process_tree.utils import generic as pt_util from pm4py.objects.process_tree.utils.generic import tree_sort from pm4py.util import constants import warnings from pm4py.util import exec_utils from pm4py.util import xes_constants as xes_util from pm4py.util.compression import util as comut from pm4py.util.compression.dtypes import UVCL class Parameters(Enum): ACTIVITY_KEY = constants.PARAMETER_CONSTANT_ACTIVITY_KEY TIMESTAMP_KEY = constants.PARAMETER_CONSTANT_TIMESTAMP_KEY CASE_ID_KEY = constants.PARAMETER_CONSTANT_CASEID_KEY class Variants(Enum): IM = IMInstance.IM IMf = IMInstance.IMf IMd = IMInstance.IMd def apply(obj: Union[EventLog, pd.DataFrame, DFG, UVCL], parameters: Optional[Dict[Any, Any]] = None, variant=Variants.IM) -> ProcessTree: if parameters is None: parameters = {} ack = exec_utils.get_param_value(Parameters.ACTIVITY_KEY, parameters, xes_util.DEFAULT_NAME_KEY) tk = exec_utils.get_param_value(Parameters.TIMESTAMP_KEY, parameters, xes_util.DEFAULT_TIMESTAMP_KEY) cidk = exec_utils.get_param_value(Parameters.CASE_ID_KEY, parameters, pmutil.constants.CASE_CONCEPT_NAME) process_tree = ProcessTree() if type(obj) is DFG: if variant is not Variants.IMd: if constants.SHOW_INTERNAL_WARNINGS: warnings.warn('Inductive Miner Variant requested for DFG artefact is not IMD, resorting back to IMD') imd = IMD(parameters) idfg = InductiveDFG(dfg=obj, skip=False) process_tree = imd.apply(IMDataStructureDFG(idfg), parameters) else: if type(obj) in [UVCL]: uvcl = obj else: uvcl = comut.get_variants(comut.project_univariate(obj, key=ack, df_glue=cidk, df_sorting_criterion_key=tk)) if variant is Variants.IM: im = IMUVCL(parameters) process_tree = im.apply(IMDataStructureUVCL(uvcl), parameters) if variant is Variants.IMf: imf = IMFUVCL(parameters) process_tree = imf.apply(IMDataStructureUVCL(uvcl), parameters) if variant is Variants.IMd: imd = IMD(parameters) idfg = InductiveDFG(dfg=comut.discover_dfg_uvcl(uvcl), skip=() in uvcl) process_tree = imd.apply(IMDataStructureDFG(idfg), parameters) process_tree = pt_util.fold(process_tree) tree_sort(process_tree) return process_tree