@@ -60,6 +60,8 @@ class Parameters(Enum):
6060 VARIANTS_IDX = "variants_idx"
6161 SHOW_PROGRESS_BAR = "show_progress_bar"
6262 CORES = 'cores'
63+ BEST_WORST_COST_INTERNAL = "best_worst_cost_internal"
64+ FITNESS_ROUND_DIGITS = "fitness_round_digits"
6365
6466
6567DEFAULT_VARIANT = Variants .VERSION_STATE_EQUATION_A_STAR
@@ -116,9 +118,43 @@ def apply_trace(trace, petri_net, initial_marking, final_marking, parameters=Non
116118 """
117119 if parameters is None :
118120 parameters = copy ({PARAMETER_CONSTANT_ACTIVITY_KEY : DEFAULT_NAME_KEY })
119- return exec_utils .get_variant (variant ).apply (trace , petri_net , initial_marking , final_marking ,
121+
122+ parameters = copy (parameters )
123+ best_worst_cost = exec_utils .get_param_value (Parameters .BEST_WORST_COST_INTERNAL , parameters ,
124+ __get_best_worst_cost (petri_net , initial_marking , final_marking , variant , parameters ))
125+
126+ ali = exec_utils .get_variant (variant ).apply (trace , petri_net , initial_marking , final_marking ,
120127 parameters = parameters )
121128
129+ trace_cost_function = exec_utils .get_param_value (Parameters .PARAM_TRACE_COST_FUNCTION , parameters , [])
130+ # Instead of using the length of the trace, use the sum of the trace cost function
131+ trace_cost_function_sum = sum (trace_cost_function )
132+
133+ ltrace_bwc = trace_cost_function_sum + best_worst_cost
134+
135+ fitness = 1 - (ali ['cost' ] // align_utils .STD_MODEL_LOG_MOVE_COST ) / (
136+ ltrace_bwc // align_utils .STD_MODEL_LOG_MOVE_COST ) if ltrace_bwc > 0 else 0
137+
138+ # other possibility: avoid integer division but proceed to rounding.
139+ # could lead to small differences with respect to the adopted-since-now fitness
140+ # (since it is rounded)
141+
142+ """
143+ initial_trace_cost_function = exec_utils.get_param_value(Parameters.PARAM_TRACE_COST_FUNCTION, parameters, None)
144+ initial_model_cost_function = exec_utils.get_param_value(Parameters.PARAM_MODEL_COST_FUNCTION, parameters, None)
145+ initial_sync_cost_function = exec_utils.get_param_value(Parameters.PARAM_SYNC_COST_FUNCTION, parameters, None)
146+ uses_standard_cost_function = initial_trace_cost_function is None and initial_model_cost_function is None and \
147+ initial_sync_cost_function is None
148+
149+ fitness = 1 - ali['cost'] / ltrace_bwc if ltrace_bwc > 0 else 0
150+ fitness_round_digits = exec_utils.get_param_value(Parameters.FITNESS_ROUND_DIGITS, parameters, 3)
151+ fitness = round(fitness, fitness_round_digits)
152+ """
153+
154+ ali ["fitness" ] = fitness
155+
156+ return ali
157+
122158
123159def apply_log (log , petri_net , initial_marking , final_marking , parameters = None , variant = DEFAULT_VARIANT ):
124160 """
@@ -161,6 +197,7 @@ def apply_log(log, petri_net, initial_marking, final_marking, parameters=None, v
161197 best_worst_cost = __get_best_worst_cost (petri_net , initial_marking , final_marking , variant , parameters )
162198 variants_idxs , one_tr_per_var = __get_variants_structure (log , parameters )
163199 progress = __get_progress_bar (len (one_tr_per_var ), parameters )
200+ parameters [Parameters .BEST_WORST_COST_INTERNAL ] = best_worst_cost
164201
165202 all_alignments = []
166203 for trace in one_tr_per_var :
@@ -172,7 +209,6 @@ def apply_log(log, petri_net, initial_marking, final_marking, parameters=None, v
172209 progress .update ()
173210
174211 alignments = __form_alignments (log , variants_idxs , all_alignments )
175- __assign_fitness (log , alignments , best_worst_cost )
176212 __close_progress_bar (progress )
177213
178214 return alignments
@@ -207,6 +243,7 @@ def apply_multiprocessing(log, petri_net, initial_marking, final_marking, parame
207243
208244 best_worst_cost = __get_best_worst_cost (petri_net , initial_marking , final_marking , variant , parameters )
209245 variants_idxs , one_tr_per_var = __get_variants_structure (log , parameters )
246+ parameters [Parameters .BEST_WORST_COST_INTERNAL ] = best_worst_cost
210247
211248 all_alignments = []
212249 with ProcessPoolExecutor (max_workers = num_cores ) as executor :
@@ -229,7 +266,6 @@ def apply_multiprocessing(log, petri_net, initial_marking, final_marking, parame
229266 __close_progress_bar (progress )
230267
231268 alignments = __form_alignments (log , variants_idxs , all_alignments )
232- __assign_fitness (log , alignments , best_worst_cost )
233269
234270 return alignments
235271
@@ -281,15 +317,6 @@ def __form_alignments(log, variants_idxs, all_alignments):
281317 return alignments
282318
283319
284- def __assign_fitness (log , alignments , best_worst_cost ):
285- for index , align in enumerate (alignments ):
286- ltrace_bwc = len (log [index ]) + best_worst_cost
287- if ltrace_bwc > 0 :
288- align ['fitness' ] = 1 - ((align ['cost' ] // align_utils .STD_MODEL_LOG_MOVE_COST ) / ltrace_bwc )
289- else :
290- align ['fitness' ] = 0
291-
292-
293320def __close_progress_bar (progress ):
294321 if progress is not None :
295322 progress .close ()
0 commit comments