def detect_loop_cut(self): """ Detect loop cut """ start_activities = self.start_activities if len(start_activities) == 0: start_activities = infer_start_activities_from_prev_connections_and_current_dfg(self.initial_dfg, self.dfg, self.activities) end_activities = self.end_activities end_activities = list(set(end_activities) - set(start_activities)) if len(end_activities) == 0: end_activities = infer_end_activities_from_succ_connections_and_current_dfg(self.initial_dfg, self.dfg, self.activities) end_activities = list(set(end_activities) - set(start_activities)) if len(end_activities) == 0: end_activities = infer_end_activities_from_succ_connections_and_current_dfg(self.initial_dfg, self.dfg, self.activities, include_self=False) all_end_activities = copy(end_activities) end_activities = list(set(end_activities) - set(start_activities)) end_activities_that_are_also_start = list(set(all_end_activities) - set(end_activities)) do_part = [] redo_part = [] dangerous_redo_part = [] exit_part = [] for sa in start_activities: do_part.append(sa) for ea in end_activities: exit_part.append(ea) for act in self.activities: if act not in start_activities and act not in end_activities: input_connected_activities = get_all_activities_connected_as_input_to_activity(self.dfg, act) output_connected_activities = get_all_activities_connected_as_output_to_activity(self.dfg, act) if set(output_connected_activities).issubset(start_activities) and set(start_activities).issubset( output_connected_activities): if len(input_connected_activities.intersection(exit_part)) > 0: dangerous_redo_part.append(act) redo_part.append(act) else: do_part.append(act) if len(do_part) > 0 and (len(redo_part) > 0 or len(exit_part)) > 0: if len(redo_part) > 0: return [True, [do_part + exit_part, redo_part], len(end_activities_that_are_also_start) > 0] else: return [True, [do_part, redo_part + exit_part], len(end_activities_that_are_also_start) > 0] return [False, [], []]
def detect_loop_cut(self, conn_components, this_nx_graph, strongly_connected_components): """ Detect loop cut Parameters -------------- conn_components Connected components of the graph this_nx_graph NX graph calculated on the DFG strongly_connected_components Strongly connected components """ all_start_activities = self.start_activities all_end_activities = self.end_activities start_activities = all_start_activities end_activities = list(set(all_end_activities) - set(all_start_activities)) start_act_that_are_also_end = list(set(all_end_activities) - set(end_activities)) do_part = [] redo_part = [] dangerous_redo_part = [] exit_part = [] for sa in start_activities: do_part.append(sa) for ea in end_activities: exit_part.append(ea) for act in self.activities: if act not in start_activities and act not in end_activities: input_connected_activities = get_all_activities_connected_as_input_to_activity(self.dfg, act) output_connected_activities = get_all_activities_connected_as_output_to_activity(self.dfg, act) if set(output_connected_activities).issubset(start_activities) and set(start_activities).issubset( output_connected_activities): if len(input_connected_activities.intersection(exit_part)) > 0: dangerous_redo_part.append(act) redo_part.append(act) else: do_part.append(act) if len(do_part) > 0 and (len(redo_part) > 0 or len(exit_part)) > 0: if len(redo_part) > 0: return [True, [do_part + exit_part, redo_part], True, len(start_act_that_are_also_end) > 0] else: return [True, [do_part, redo_part + exit_part], False, len(start_act_that_are_also_end) > 0] return [False, [], False]
def detect_loop_cut(dfg, activities, start_activities, end_activities): """ Detect loop cut """ all_start_activities = start_activities all_end_activities = list( set(end_activities).intersection(set(infer_end_activities(dfg)))) start_activities = all_start_activities end_activities = list(set(all_end_activities) - set(all_start_activities)) start_act_that_are_also_end = list( set(all_end_activities) - set(end_activities)) do_part = [] redo_part = [] dangerous_redo_part = [] exit_part = [] for sa in start_activities: do_part.append(sa) for ea in end_activities: exit_part.append(ea) for act in activities: if act not in start_activities and act not in end_activities: input_connected_activities = get_all_activities_connected_as_input_to_activity( dfg, act) output_connected_activities = get_all_activities_connected_as_output_to_activity( dfg, act) if set(output_connected_activities).issubset( start_activities) and set(start_activities).issubset( output_connected_activities): if len(input_connected_activities.intersection(exit_part)) > 0: dangerous_redo_part.append(act) redo_part.append(act) else: do_part.append(act) if (len(do_part) + len(exit_part)) > 0 and len(redo_part) > 0: return [ True, [do_part + exit_part, redo_part], True, len(start_act_that_are_also_end) > 0 ] return [False, [], False]