Skip to content

Commit

Permalink
Merge branch 'ft-844-progress-bar-alignments' into 'integration'
Browse files Browse the repository at this point in the history
Adding progress bar for alignments

See merge request pm4py/pm4py-core!322
  • Loading branch information
fit-sebastiaan-van-zelst committed Mar 17, 2021
2 parents 6ac7633 + 73944f7 commit 5de03f1
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 10 deletions.
16 changes: 16 additions & 0 deletions pm4py/algo/conformance/alignments/algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from enum import Enum
import sys
from pm4py.util.constants import PARAMETER_CONSTANT_ACTIVITY_KEY, PARAMETER_CONSTANT_CASEID_KEY
import pkgutil


class Variants(Enum):
Expand All @@ -36,6 +37,7 @@ class Parameters(Enum):
CASE_ID_KEY = PARAMETER_CONSTANT_CASEID_KEY
ACTIVITY_KEY = PARAMETER_CONSTANT_ACTIVITY_KEY
VARIANTS_IDX = "variants_idx"
SHOW_PROGRESS_BAR = "show_progress_bar"


DEFAULT_VARIANT = Variants.VERSION_STATE_EQUATION_A_STAR
Expand Down Expand Up @@ -133,6 +135,7 @@ def apply_log(log, petri_net, initial_marking, final_marking, parameters=None, v
sys.maxsize)
max_align_time_case = exec_utils.get_param_value(Parameters.PARAM_MAX_ALIGN_TIME_TRACE, parameters,
sys.maxsize)
show_progress_bar = exec_utils.get_param_value(Parameters.SHOW_PROGRESS_BAR, parameters, True)

parameters_best_worst = copy(parameters)

Expand All @@ -151,12 +154,19 @@ def apply_log(log, petri_net, initial_marking, final_marking, parameters=None, v
for var in variants_list:
one_tr_per_var.append(log[variants_idxs[var][0]])

progress = None
if pkgutil.find_loader("tqdm") and show_progress_bar:
from tqdm.auto import tqdm
progress = tqdm(total=len(one_tr_per_var), desc="aligning log, completed variants :: ")

all_alignments = []
for trace in one_tr_per_var:
this_max_align_time = min(max_align_time_case, (max_align_time - (time.time() - start_time)) * 0.5)
parameters[Parameters.PARAM_MAX_ALIGN_TIME_TRACE] = this_max_align_time
all_alignments.append(apply_trace(trace, petri_net, initial_marking, final_marking, parameters=copy(parameters),
variant=variant))
if progress is not None:
progress.update()

al_idx = {}
for index_variant, variant in enumerate(variants_idxs):
Expand All @@ -178,6 +188,12 @@ def apply_log(log, petri_net, initial_marking, final_marking, parameters=None, v
(align['cost'] // align_utils.STD_MODEL_LOG_MOVE_COST) / (len(log[index]) + best_worst_cost))
else:
align['fitness'] = 0

# gracefully close progress bar
if progress is not None:
progress.close()
del progress

return alignments


Expand Down
1 change: 1 addition & 0 deletions pm4py/algo/conformance/decomp_alignments/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ class Parameters(Enum):
PARAM_TRACE_NET_COSTS = "trace_net_costs"
PARAM_MAX_ALIGN_TIME = "max_align_time"
PARAM_MAX_ALIGN_TIME_TRACE = "max_align_time_trace"
SHOW_PROGRESS_BAR = "show_progress_bar"
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
from pm4py.objects.log.log import Trace
import pkgutil
import sys
import time
from copy import copy

from pm4py.algo.conformance.alignments.variants import state_equation_less_memory
from pm4py.algo.conformance.decomp_alignments.parameters import Parameters
from pm4py.objects.log import log as log_implementation
from pm4py.objects.log.log import Trace
from pm4py.objects.log.util.xes import DEFAULT_NAME_KEY
from pm4py.objects.petri import align_utils as utils
from pm4py.util.constants import PARAMETER_CONSTANT_ACTIVITY_KEY
from pm4py.objects.petri import decomposition as decomp_utils
from pm4py.statistics.variants.log import get as variants_module
from pm4py import util as pm4pyutil
from copy import copy
from pm4py.algo.conformance.decomp_alignments.parameters import Parameters
from pm4py.util import exec_utils
from pm4py.algo.conformance.alignments.variants import state_equation_less_memory
import sys
import time
from pm4py.util import variants_util


Expand Down Expand Up @@ -133,13 +133,22 @@ def apply_log(log, list_nets, parameters=None):
"""
if parameters is None:
parameters = {}

show_progress_bar = exec_utils.get_param_value(Parameters.SHOW_PROGRESS_BAR, parameters, True)
icache = exec_utils.get_param_value(Parameters.ICACHE, parameters, dict())
mcache = exec_utils.get_param_value(Parameters.MCACHE, parameters, dict())

parameters[Parameters.ICACHE] = icache
parameters[Parameters.MCACHE] = mcache

variants_idxs = variants_module.get_variants_from_log_trace_idx(log, parameters=parameters)

progress = None
if pkgutil.find_loader("tqdm") and show_progress_bar:
from tqdm.auto import tqdm
progress = tqdm(total=len(variants_idxs),
desc="aligning log with decomposition/recomposition, completed variants :: ")

one_tr_per_var = []
variants_list = []
for index_variant, variant in enumerate(variants_idxs):
Expand All @@ -155,6 +164,8 @@ def apply_log(log, list_nets, parameters=None):
alignment = apply_trace(trace, list_nets, parameters=parameters)
else:
alignment = None
if progress is not None:
progress.update()
all_alignments.append(alignment)
al_idx = {}
for index_variant, variant in enumerate(variants_idxs):
Expand All @@ -163,6 +174,10 @@ def apply_log(log, list_nets, parameters=None):
alignments = []
for i in range(len(log)):
alignments.append(al_idx[i])
# gracefully close progress bar
if progress is not None:
progress.close()
del progress
return alignments


Expand Down
22 changes: 20 additions & 2 deletions pm4py/algo/conformance/tokenreplay/variants/token_replay.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from enum import Enum
from pm4py.util import exec_utils, constants
from pm4py.util import variants_util
import pkgutil


class Parameters(Enum):
Expand All @@ -27,6 +28,7 @@ class Parameters(Enum):
TRY_TO_REACH_FINAL_MARKING_THROUGH_HIDDEN = "try_to_reach_final_marking_through_hidden"
CONSIDER_REMAINING_IN_FITNESS = "consider_remaining_in_fitness"
ENABLE_PLTR_FITNESS = "enable_pltr_fitness"
SHOW_PROGRESS_BAR = "show_progress_bar"


class TechnicalParameters(Enum):
Expand Down Expand Up @@ -915,7 +917,7 @@ def apply_log(log, net, initial_marking, final_marking, enable_pltr_fitness=Fals
activity_key="concept:name", reach_mark_through_hidden=True, stop_immediately_unfit=False,
walk_through_hidden_trans=True, places_shortest_path_by_hidden=None,
variants=None, is_reduction=False, thread_maximum_ex_time=TechnicalParameters.MAX_DEF_THR_EX_TIME.value,
cleaning_token_flood=False, disable_variants=False, return_object_names=False):
cleaning_token_flood=False, disable_variants=False, return_object_names=False, show_progress_bar=True):
"""
Apply token-based replay to a log
Expand Down Expand Up @@ -990,6 +992,12 @@ def apply_log(log, net, initial_marking, final_marking, enable_pltr_fitness=Fals
if activity_key in log[0][0]:
if variants is None:
variants = get_variants_from_log(log, activity_key, disable_variants=disable_variants)

progress = None
if pkgutil.find_loader("tqdm") and show_progress_bar:
from tqdm.auto import tqdm
progress = tqdm(total=len(variants), desc="replaying log with TBR, completed variants :: ")

vc = variants_module.get_variants_sorted_by_count(variants)
threads = {}
threads_results = {}
Expand All @@ -1014,6 +1022,9 @@ def apply_log(log, net, initial_marking, final_marking, enable_pltr_fitness=Fals
cleaning_token_flood=cleaning_token_flood,
s_components=s_components, trace_occurrences=vc[i][1])
threads[variant].run()
if progress is not None:
progress.update()

t = threads[variant]
threads_results[variant] = {"trace_is_fit": copy(t.t_fit),
"trace_fitness": float(copy(t.t_value)),
Expand Down Expand Up @@ -1052,6 +1063,11 @@ def apply_log(log, net, initial_marking, final_marking, enable_pltr_fitness=Fals
if trace_variant in threads_results:
t = threads_results[trace_variant]
aligned_traces.append(t)

# gracefully close progress bar
if progress is not None:
progress.close()
del progress
else:
raise NoConceptNameException("at least an event is without " + activity_key)

Expand Down Expand Up @@ -1100,6 +1116,8 @@ def apply(log, net, initial_marking, final_marking, parameters=None):
activity_key = exec_utils.get_param_value(Parameters.ACTIVITY_KEY, parameters, xes_util.DEFAULT_NAME_KEY)
variants = exec_utils.get_param_value(Parameters.VARIANTS, parameters, None)

show_progress_bar = exec_utils.get_param_value(Parameters.SHOW_PROGRESS_BAR, parameters, True)

return apply_log(log, net, initial_marking, final_marking, enable_pltr_fitness=enable_pltr_fitness,
consider_remaining_in_fitness=consider_remaining_in_fitness,
reach_mark_through_hidden=try_to_reach_final_marking_through_hidden,
Expand All @@ -1108,7 +1126,7 @@ def apply(log, net, initial_marking, final_marking, parameters=None):
places_shortest_path_by_hidden=places_shortest_path_by_hidden, activity_key=activity_key,
variants=variants, is_reduction=is_reduction, thread_maximum_ex_time=thread_maximum_ex_time,
cleaning_token_flood=cleaning_token_flood, disable_variants=disable_variants,
return_object_names=return_names)
return_object_names=return_names, show_progress_bar=show_progress_bar)


def apply_variants_list(variants_list, net, initial_marking, final_marking, parameters=None):
Expand Down

0 comments on commit 5de03f1

Please sign in to comment.