def initialize_tree(self, dfg, initial_dfg, activities, second_iteration=False): """ Initialize the tree Parameters ----------- dfg Directly follows graph of this subtree initial_dfg Referral directly follows graph that should be taken in account adding hidden/loop transitions activities Activities of this subtree second_iteration Boolean that indicates if we are executing this method for the second time """ self.second_iteration = second_iteration if activities is None: self.activities = get_activities_from_dfg(dfg) else: self.activities = copy(activities) if second_iteration: self.dfg = clean_dfg_based_on_noise_thresh(self.dfg, self.activities, self.noise_threshold) else: self.dfg = copy(dfg) self.initial_dfg = initial_dfg self.outgoing = get_outgoing_edges(self.dfg) self.ingoing = get_ingoing_edges(self.dfg) self.self_loop_activities = get_activities_self_loop(self.dfg) self.initial_outgoing = get_outgoing_edges(self.initial_dfg) self.initial_ingoing = get_ingoing_edges(self.initial_dfg) self.activities_direction = get_activities_direction( self.dfg, self.activities) self.activities_dir_list = get_activities_dirlist( self.activities_direction) self.negated_dfg = negate(self.dfg) self.negated_activities = get_activities_from_dfg(self.negated_dfg) self.negated_outgoing = get_outgoing_edges(self.negated_dfg) self.negated_ingoing = get_ingoing_edges(self.negated_dfg) self.detected_cut = None self.children = [] if second_iteration: self.detect_cut(second_iteration=second_iteration)
def initialize_tree(self): """ Initialize the tree """ if self.activities is None: self.activities = list(set(y for x in self.traces for y in x)) else: if self.parent is not None and self.parent.detected_cut_add_info == "loop": self.get_traces_loop() else: self.traces = self.get_traces_general() if self.second_iteration: self.traces, self.activities = self.clean_traces_noise() self.start_activities = list(set(x[0] for x in self.traces if x)) self.end_activities = list(set(x[-1] for x in self.traces if x)) self.activities_occurrences = Counter( [y for x in self.traces for y in x]) self.dfg = Counter( (x[i - 1], x[i]) for x in self.traces for i in range(1, len(x))) self.dfg = [(x, y) for x, y in self.dfg.items()] self.initial_dfg = self.dfg self.outgoing = get_outgoing_edges(self.dfg) self.ingoing = get_ingoing_edges(self.dfg) self.self_loop_activities = get_activities_self_loop(self.dfg) self.activities_direction = get_activities_direction( self.dfg, self.activities) self.activities_dir_list = get_activities_dirlist( self.activities_direction) self.negated_dfg = negate(self.dfg) self.negated_activities = get_activities_from_dfg(self.negated_dfg) self.negated_outgoing = get_outgoing_edges(self.negated_dfg) self.negated_ingoing = get_ingoing_edges(self.negated_dfg) self.contains_empty_traces = min( len(x) for x in self.traces) == 0 if len(self.traces) > 0 else False self.must_insert_skip = self.contains_empty_traces if self.parent is not None and self.parent.detected_cut == "xor": self.must_insert_skip = False self.must_insert_skip = self.rec_must_insert_skip or self.must_insert_skip if not self.second_iteration: self.second_tree = self.clone_second_it() self.detected_cut = None self.children = []
def detect_cut(initial_dfg, dfg, parent, conf, process, initial_start_activities, initial_end_activities, activities): """ Detect generally a cut in the graph (applying all the algorithms) """ if dfg: # print('DFG' + str(dfg) + ' will be cut on ' + str(conf)) # print(dfg) # Find in order: xor, seq, par, loop, seq, flower ingoing = get_ingoing_edges(dfg) outgoing = get_outgoing_edges(dfg) start_activities = infer_start_activities(dfg) end_activities = infer_end_activities(dfg) if parent == "m": initial_start_activities = start_activities initial_end_activities = end_activities activities = get_activities_from_dfg(dfg) else: activities = set(activities) conn_components = detection_utils.get_connected_components(ingoing, outgoing, activities) # print("Init Start: " + str(initial_start_activities) + ", Init End: " + str(initial_end_activities)) # print(activities) xor_cut = detect_xor_cut(dfg, conn_components) if xor_cut[0]: found_cut = "xor" print(found_cut) for index, comp in enumerate(xor_cut[1]): # print(comp) filtered_dfg = filter_dfg_on_act(dfg, comp) save_cut(filtered_dfg, comp, parent, found_cut, index, conf, process, initial_start_activities, initial_end_activities) else: this_nx_graph = detection_utils.transform_dfg_to_directed_nx_graph(activities, dfg) strongly_connected_components = [list(x) for x in nx.strongly_connected_components(this_nx_graph)] # print(strongly_connected_components) seq_cut = detect_sequential_cut(dfg, strongly_connected_components) if seq_cut[0]: found_cut = "seq" print("seq") for index, comp in enumerate(seq_cut[1]): # print(comp) filter_dfg = filter_dfg_on_act(dfg, comp) print(filter_dfg) save_cut(filter_dfg, comp, parent, found_cut, index, conf, process, initial_start_activities, initial_end_activities) # self.put_skips_in_seq_cut()? else: negated_dfg = detection_utils.negate(dfg) negated_ingoing = get_ingoing_edges(negated_dfg) negated_outgoing = get_outgoing_edges(negated_dfg) par_cut = detect_parallel_cut(this_nx_graph, strongly_connected_components, negated_ingoing, negated_outgoing, activities, dfg, initial_start_activities, initial_end_activities, initial_dfg) if par_cut[0]: found_cut = "par" print("par") i = 0 for comp in par_cut[1]: i += 1 # print(comp) filtter_dfg = filter_dfg_on_act(dfg, comp) save_cut(filtter_dfg, comp, parent, found_cut, i, conf, process, initial_start_activities, initial_end_activities) else: start_activities = infer_start_activities(dfg) end_activities = infer_end_activities(dfg) loop_cut = detect_loop_cut(dfg, activities, start_activities, end_activities) if loop_cut[0]: if loop_cut[2]: found_cut = "loop" print("loop") for index, comp in enumerate(loop_cut[1]): # print(comp) filter_dfg = filter_dfg_on_act(dfg, comp) save_cut(filter_dfg, comp, parent, found_cut, index, conf, process, initial_start_activities, initial_end_activities) # if loop_cut[3]: # insert_skip else: found_cut = "seq2" print('seq 2') # self.need_loop_on_subtree = True for index, comp in enumerate(loop_cut[1]): # print(comp) filter_dfg = filter_dfg_on_act(dfg, comp) save_cut(filter_dfg, comp, parent, found_cut, index, conf, process, initial_start_activities, initial_end_activities) #insert_skip else: pass found_cut = "flower" print("flower") #save_cut(dfg, comp, parent, found_cut, 0, conf, process) return found_cut else: print("no DFG or base_xor") return "base_xor"