def execute_script(): log = pm4py.read_xes( os.path.join("..", "tests", "input_data", "receipt.xes")) net, im, fm = inductive_miner.apply( log, variant=inductive_miner.Variants.IM_CLEAN) idx = 0 # try to resolve the marking equation to find an heuristics and possible a vector of transitions # leading from im to fm sync_net, sync_im, sync_fm = pm4py.construct_synchronous_product_net( log[idx], net, im, fm) me_solver = marking_equation.build(sync_net, sync_im, sync_fm) h, x = me_solver.solve() firing_sequence, reach_fm1, explained_events = me_solver.get_firing_sequence( x) print("for trace at index " + str(idx) + ": marking equation h = ", h) print("x vector reaches fm = ", reach_fm1) print("firing sequence = ", firing_sequence) # it fails and the value of heuristics is low # # now let's try with extended marking equation to find the heuristics and the vector! eme_solver = extended_marking_equation.build(log[idx], sync_net, sync_im, sync_fm) h, x = eme_solver.solve() # the heuristics is much better firing_sequence, reach_fm2, explained_events = eme_solver.get_firing_sequence( x) print( "for trace at index " + str(idx) + ": extended marking equation h = ", h) print("x vector reaches fm = ", reach_fm2) print("firing sequence = ", firing_sequence)
def solve_extended_marking_equation(trace: Trace, sync_net: PetriNet, sync_im: Marking, sync_fm: Marking, split_points: Optional[List[int]] = None) -> float: """ Gets an heuristics value (underestimation of the cost of an alignment) between a trace and a synchronous product net using the extended marking equation with the standard cost function (e.g. sync moves get cost equal to 0, invisible moves get cost equal to 1, other move on model / move on log get cost equal to 10000), with an optimal provisioning of the split points Parameters ---------------- trace Trace sync_net Synchronous product net sync_im Initial marking (of the sync net) sync_fm Final marking (of the sync net) split_points If specified, the indexes of the events of the trace to be used as split points. If not specified, the split points are identified automatically Returns ---------------- h_value Heuristics value calculated resolving the marking equation """ from pm4py.algo.analysis.extended_marking_equation import algorithm as extended_marking_equation parameters = {} if split_points is not None: parameters[extended_marking_equation.Variants.CLASSIC.value.Parameters.SPLIT_IDX] = split_points me = extended_marking_equation.build(trace, sync_net, sync_im, sync_fm, parameters=parameters) return extended_marking_equation.get_h_value(me)