Skip to content

Commit

Permalink
feat(pm4py): OCPN - specification of the variant of inductive miner t…
Browse files Browse the repository at this point in the history
…o be used
  • Loading branch information
fit-alessandro-berti committed Jan 27, 2023
1 parent a6bbd64 commit 7e59696
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 9 deletions.
23 changes: 16 additions & 7 deletions pm4py/algo/discovery/ocel/ocpn/variants/wo_annotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@
from typing import Optional, Dict, Any
from pm4py.objects.dfg.obj import DFG
from pm4py.objects.conversion.process_tree import converter as tree_converter
from pm4py.objects.ocel.util import flattening


class Parameters(Enum):
EVENT_ACTIVITY = ocel_constants.PARAM_EVENT_ACTIVITY
OBJECT_TYPE = ocel_constants.PARAM_OBJECT_TYPE
INDUCTIVE_MINER_VARIANT = "inductive_miner_variant"
DOUBLE_ARC_THRESHOLD = "double_arc_threshold"


Expand Down Expand Up @@ -43,6 +45,8 @@ def apply(ocel: OCEL, parameters: Optional[Dict[Any, Any]] = None) -> Dict[str,
parameters = {}

double_arc_threshold = exec_utils.get_param_value(Parameters.DOUBLE_ARC_THRESHOLD, parameters, 0.0)
inductive_miner_variant = exec_utils.get_param_value(Parameters.INDUCTIVE_MINER_VARIANT, parameters, "im")

ocdfg = ocdfg_discovery.apply(ocel, parameters=parameters)

petri_nets = {}
Expand All @@ -69,13 +73,18 @@ def apply(ocel: OCEL, parameters: Optional[Dict[Any, Any]] = None) -> Dict[str,

double_arcs_on_activity[ot] = is_activity_double

obj = DFG()
obj._graph = Counter(dfg)
obj._start_activities = Counter(start_activities)
obj._end_activities = Counter(end_activities)

process_tree = inductive_miner.apply(obj, variant=inductive_miner.Variants.IMd)
petri_nets[ot] = tree_converter.apply(process_tree)
process_tree = None
if inductive_miner_variant == "imd":
obj = DFG()
obj._graph = Counter(dfg)
obj._start_activities = Counter(start_activities)
obj._end_activities = Counter(end_activities)
process_tree = inductive_miner.apply(obj, variant=inductive_miner.Variants.IMd, parameters=parameters)
elif inductive_miner_variant == "im":
flat_log = flattening.flatten(ocel, ot, parameters=parameters)
process_tree = inductive_miner.apply(flat_log, parameters=parameters)

petri_nets[ot] = tree_converter.apply(process_tree, parameters=parameters)

ocdfg["petri_nets"] = petri_nets
ocdfg["double_arcs_on_activity"] = double_arcs_on_activity
Expand Down
6 changes: 4 additions & 2 deletions pm4py/ocel.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ def discover_ocdfg(ocel: OCEL, business_hours=False, business_hour_slots=constan
return ocdfg_discovery.apply(ocel, parameters=parameters)


def discover_oc_petri_net(ocel: OCEL) -> Dict[str, Any]:
def discover_oc_petri_net(ocel: OCEL, inductive_miner_variant: str = "im") -> Dict[str, Any]:
"""
Discovers an object-centric Petri net from the provided object-centric event log.
Expand All @@ -232,7 +232,9 @@ def discover_oc_petri_net(ocel: OCEL) -> Dict[str, Any]:
ocpn = pm4py.discover_oc_petri_net(ocel)
"""
from pm4py.algo.discovery.ocel.ocpn import algorithm as ocpn_discovery
return ocpn_discovery.apply(ocel)
parameters = {}
parameters["inductive_miner_variant"] = inductive_miner_variant
return ocpn_discovery.apply(ocel, parameters=parameters)


def discover_objects_graph(ocel: OCEL, graph_type: str = "object_interaction") -> Set[Tuple[str, str]]:
Expand Down

0 comments on commit 7e59696

Please sign in to comment.