Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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 = []
Ejemplo n.º 3
0
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"