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, [], []]
예제 #2
0
    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]