def initialize_tree(self, dfg, log, initial_dfg, activities, second_iteration=False, end_call=True, parameters=None): """ Initialize the tree Parameters ----------- dfg Directly follows graph of this subtree log the event log_skeleton 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.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 = [] self.log = log self.original_log = log self.parameters = parameters self.detect_cut(second_iteration=False, parameters=parameters)
def check_loop_need(spec_tree_struct): """ Check whether a forced loop transitions shall be added Parameters ----------- spec_tree_struct Internal tree structure (after application of Inductive Miner) Returns ----------- need_loop_on_subtree Checks if the loop on the subtree is needed """ self_loop_activities = set(get_activities_self_loop(spec_tree_struct.initial_dfg)) self_loop_activities = self_loop_activities.intersection(set(spec_tree_struct.activities)) need_loop_on_subtree = len(self_loop_activities) > 0 return need_loop_on_subtree