33from flask_cors import CORS
44
55import pm4py
6+ from pm4py .objects .log .importer .xes import importer as xes_importer
67from enum import Enum
78
89import subprocess #to execute the layout-generator jar file
@@ -11,50 +12,39 @@ class Parameters:
1112 EVENT_LOG_DISCOVERY = None
1213 EVENT_LOG_CONFORMANCE = None
1314 BPMN_MODEL = None
14- PROCESS_TREE = None
1515 PETRI_NET = None
1616 IM = None
1717 FM = None
1818
1919app = Flask (__name__ )
2020CORS (app )
2121
22- @app .route ("/" )
23- def hello ():
24- return "Hello, from Flask!"
2522
2623@app .route ('/discover/inductive-miner' , methods = ["POST" ])
2724def discover_inductive_miner ():
2825 #read xes log
2926 log_stream = request .files .getlist ('file' )[0 ].read ()
3027 noise = request .form .get ('noise' )
3128
32- #serialize log, so that we can process it with pm4py
33- serialized_log = ('event_log' , log_stream )
34-
3529 #create pm4py event log object
36- Parameters .EVENT_LOG_DISCOVERY = pm4py .deserialize (serialized_log )
30+ Parameters .EVENT_LOG_DISCOVERY = xes_importer .deserialize (log_stream )
3731
3832 #discover petri net
3933 Parameters .PETRI_NET , Parameters .IM , Parameters .FM = pm4py .discover_petri_net_inductive (Parameters .EVENT_LOG_DISCOVERY , noise_threshold = float (noise ))
4034
4135 #convert petri net to bpmn
4236 Parameters .BPMN_MODEL = pm4py .convert_to_bpmn (Parameters .PETRI_NET , Parameters .IM , Parameters .FM )
43-
44- #generate the bpmn xml content from the bpmn graph model
45- #bpmn-file is a tuple: first element is BPMN, second element is the XML content
46- #bpmn_file = pm4py.utils.serialize(Parameters.BPMN_MODEL)
4737
4838 #generate the layout using layout-generators
4939 '''
50- TO BE FIXED
40+ TO BE IMPROVED in future iterations
5141 '''
5242 #layout-generators takes a bpmn file, so save the bpmn-file first
5343 pm4py .write_bpmn (Parameters .BPMN_MODEL , 'result.bpmn' )
54-
5544 #generate layout
5645 subprocess .call (['java' , '-jar' , 'bpmn-layout-generator-0.1.4-jar-with-dependencies.jar' , '--output=./result-with-layout.bpmn' , 'result.bpmn' ])
57- #get result and send it to frontend
46+
47+ #get result and send it
5848 file = open ('result-with-layout.bpmn' , 'r' )
5949 bpmn_xml_content = file .read ()
6050
@@ -66,14 +56,12 @@ def compute_alignment():
6656 #read xes log
6757 log_stream = request .files .getlist ('file' )[0 ].read ()
6858
69- #serialize log, so that we can process it with pm4py
70- serialized_log = ('event_log' , log_stream )
71-
7259 #create pm4py event log object
73- Parameters .EVENT_LOG_CONFORMANCE = pm4py .deserialize (serialized_log )
60+ Parameters .EVENT_LOG_CONFORMANCE = xes_importer .deserialize (log_stream )
61+
62+ #alignment can be only on done on Petri nets
7463 if Parameters .PETRI_NET is not None :
7564 aligned_traces = pm4py .conformance_diagnostics_alignments (Parameters .EVENT_LOG_CONFORMANCE , Parameters .PETRI_NET , Parameters .IM , Parameters .FM )
76- #print(aligned_traces)
7765 return flask .jsonify (aligned_traces )
7866 else :
7967 return flask .Response (response = "BPMN diagram is missing. \n Discover a model and then apply conformance checking" , status = 404 , mimetype = 'text/xml' )
@@ -82,14 +70,10 @@ def compute_alignment():
8270def xes_to_csv ():
8371 log_stream = request .files .getlist ('file' )[0 ].read ()
8472
85- #serialize log, so that we can process it with pm4py
86- serialized_log = ('event_log' , log_stream )
87-
8873 #create pm4py event log object
89- Parameters .EVENT_LOG_DISCOVERY = pm4py .deserialize (serialized_log )
90- log_df = pm4py .convert_to_dataframe (Parameters .EVENT_LOG_DISCOVERY )
91- return flask .jsonify (log_df .to_html ())
92-
74+ Parameters .EVENT_LOG_DISCOVERY = xes_importer .deserialize (log_stream )
75+ log_dataframe = pm4py .convert_to_dataframe (Parameters .EVENT_LOG_DISCOVERY )
76+ return flask .jsonify (log_dataframe .to_html ())
9377
9478
9579@app .route ('/stats/frequency' , methods = ["GET" ])
@@ -99,6 +83,5 @@ def compute_activity_frequency():
9983 return flask .jsonify (activity_freq_df .to_dict ())
10084
10185
102-
10386if __name__ == "__main__" :
10487 app .run ("localhost" , 6969 )
0 commit comments