process_mining / pm4py /examples /data_petri_nets.py
linpershey's picture
Add 'pm4py/' from commit '80970016c5e1e79af7c37df0dd88e17587fe7bcf'
b4ba3ec
raw
history blame
1.91 kB
import os
import pm4py
from pm4py.algo.conformance.alignments.petri_net import algorithm as alignments
from pm4py.objects.petri_net.data_petri_nets import semantics
from pm4py.objects.petri_net.data_petri_nets.data_marking import DataMarking
from pm4py.objects.log.importer.xes import importer as xes_importer
from examples import examples_conf
import importlib.util
def get_trans_by_name(net, name):
ret = [x for x in net.transitions if x.name == name]
if len(ret) == 0:
return None
return ret[0]
def execute_script():
log = xes_importer.apply(os.path.join("..", "tests", "input_data", "roadtraffic100traces.xes"))
net, im, fm = pm4py.read_pnml(os.path.join("..", "tests", "input_data", "data_petri_net.pnml"), auto_guess_final_marking=True)
if importlib.util.find_spec("graphviz"):
pm4py.view_petri_net(net, im, fm, format=examples_conf.TARGET_IMG_FORMAT)
aligned_traces = alignments.apply(log, net, im, fm, variant=alignments.Variants.VERSION_DIJKSTRA_LESS_MEMORY, parameters={"ret_tuple_as_trans_desc": True})
for index, trace in enumerate(log):
aligned_trace = aligned_traces[index]
al = [(x[0][0], get_trans_by_name(net, x[0][1])) for x in aligned_trace["alignment"]]
m = DataMarking(im)
idx = 0
for el in al:
if el[1] is not None:
en_t = semantics.enabled_transitions(net, m, trace[min(idx, len(trace) - 1)])
if el[1] in en_t:
if "guard" in el[1].properties:
print(el[1], "GUARD SATISFIED", el[1].properties["guard"], m)
m = semantics.execute(el[1], net, m, trace[min(idx, len(trace) - 1)])
else:
print("TRANSITION UNAVAILABLE! Guards are blocking")
if el[0] != ">>":
idx = idx + 1
if __name__ == "__main__":
execute_script()