Source code for pm4py.algo.discovery.minimum_self_distance.variants.log
from enum import Enum
from typing import Union, Dict, Optional, Any
from pandas import DataFrame
import pm4py
from pm4py.objects.conversion.log import converter
from pm4py.objects.log.obj import EventLog, EventStream
from pm4py.util import constants, exec_utils, xes_constants
[docs]
class Parameters(Enum):
ACTIVITY_KEY = constants.PARAMETER_CONSTANT_ACTIVITY_KEY
[docs]
def apply(
log: Union[DataFrame, EventLog, EventStream],
parameters: Optional[Dict[Union[str, Parameters], Any]] = None,
) -> Dict[str, int]:
"""
This algorithm computes the minimum self-distance for each activity observed in an event log.
The self distance of a in <a> is infinity, of a in <a,a> is 0, in <a,b,a> is 1, etc.
The minimum self distance is the minimal observed self distance value in the event log.
The activity key needs to be specified in the parameters input object (if None, default value 'concept:name' is used).
Parameters
----------
log
event log (either EventLog or EventStream)
parameters
parameters object;
Returns
-------
dict mapping an activity to its self-distance, if it exists, otherwise it is not part of the dict.
"""
log = converter.apply(
log, variant=converter.Variants.TO_EVENT_LOG, parameters=parameters
)
act_key = exec_utils.get_param_value(
Parameters.ACTIVITY_KEY, parameters, xes_constants.DEFAULT_NAME_KEY
)
alphabet = pm4py.get_event_attribute_values(log, act_key)
log = list(map(lambda t: list(map(lambda e: e[act_key], t)), log))
min_self_distances = dict()
for a in alphabet:
if (
len(
list(
filter(
lambda t: len(t) > 1,
list(
map(
lambda t: list(filter(lambda e: e == a, t)),
log,
)
),
)
)
)
> 0
):
activity_indices = list(
filter(
lambda t: len(t) > 1,
list(
map(
lambda t: [i for i, x in enumerate(t) if x == a],
log,
)
),
)
)
min_self_distances[a] = min(
[
i
for l in list(
map(
lambda t: [
t[i] - t[i - 1] - 1
for i, x in enumerate(t)
if i > 0
],
activity_indices,
)
)
for i in l
]
)
return min_self_distances