コード例 #1
0
ファイル: data_reallife.py プロジェクト: lvzheqi/pm4py-source
def split_real_life_data(file):
    name = file.split(".")[0]
    logs = pd.read_csv(PATH + file)["trace"].tolist()
    # log_test = random.sample(logs, len(logs) // 2)
    # pd.DataFrame(log_test, columns=["trace"]).to_csv(PATH + name + "_test.csv", index=False)
    log_tree = logs[0: len(logs)//10]
    pd.DataFrame(log_tree, columns=["trace"]).to_csv(PATH + name + "_tree.csv", index=False)
    tree = inductive_miner.apply_tree(list_to_xes(log_tree))
    m_trees = []
    print(str(tree))
    for i in range(1, 5):
        log_part = logs[i*len(logs)//10: len(logs)//10*(i+1)]
        pd.DataFrame(log_part, columns=["trace"]).to_csv(PATH + name + "_part" + str(i + 1) + ".csv", index=False)
        m_tree = inductive_miner.apply_tree(list_to_xes(log_part))
        m_trees.append(m_tree)
        print(str(tree) == str(m_tree))
        print(pt_compare.apply(tree, m_tree))
コード例 #2
0
 def test_tree_receipt(self):
     # to avoid static method warnings in tests,
     # that by construction of the unittest package have to be expressed in such way
     self.dummy_variable = "dummy_value"
     log = xes_importer.import_log(
         os.path.join(INPUT_DATA_DIR, "receipt.xes"))
     tree = inductive_miner.apply_tree(log)
     gviz = pt_vis_factory.apply(tree)
     del gviz
コード例 #3
0
def SPIMDFbTree(context):
    args = context.args
    inputFile = os.path.join(args.inputData, os.listdir(args.inputData)[0])
    log = xes_importer.import_log(inputFile)
    tree = inductive_miner.apply_tree(log)
    gviz = pt_vis_factory.apply(tree)
    pt_vis_factory.save(gviz,
                        os.path.join(args.outputData, "inductive-miner.png"))

    return args.outputData
コード例 #4
0
ファイル: data_reallife.py プロジェクト: lvzheqi/pm4py-source
def result(file):
    name = file.split(".")[0]
    logs = pd.read_csv(PATH + file)["trace"].tolist()
    for rd in range(1):
        log = list_to_xes(random.sample(logs, len(logs)//10))
        # log = pd.read_csv("../../../data/reallife_test.csv")["trace"].tolist()
        tree_log = pd.read_csv(PATH + name + "_tree.csv")["trace"].tolist()
        tree = inductive_miner.apply_tree(list_to_xes(tree_log))
        print(ra_pt_utils.pt_depth(str(tree)))
        m_trees = []
        for i in range(4):
            m_tree_log = pd.read_csv(PATH + name + "_part" + str(i + 1) + ".csv")["trace"].tolist()
            m_tree = inductive_miner.apply_tree(list_to_xes(m_tree_log))
            print(ra_pt_utils.pt_depth(str(m_tree)))
            print(len(ra_pt_utils.parse_tree_to_a_bfs_sequence(m_tree)), "+")

            m_trees.append(m_tree)
            res_com = pt_compare.apply(tree, m_tree)
            print(len(ra_pt_utils.parse_tree_to_a_bfs_sequence(res_com.subtree1)),
                  len(ra_pt_utils.parse_tree_to_a_bfs_sequence(res_com.subtree2)))
コード例 #5
0
 def test_tree_running_example_dfg_based_old(self):
     # to avoid static method warnings in tests,
     # that by construction of the unittest package have to be expressed in such way
     self.dummy_variable = "dummy_value"
     log = xes_importer.import_log(
         os.path.join(INPUT_DATA_DIR, "running-example.xes"))
     tree = inductive_miner.apply_tree(
         log, variant=inductive_miner.DFG_BASED_OLD_VERSION)
     gviz = pt_vis_factory.apply(tree)
     del gviz
     # test log generation
     log = pt_semantics.generate_log(tree)
     del log
コード例 #6
0
def run_inductive_and_evaluate(log_for_pd, log_for_eval):
    '''
    Given 2 event logs, it runs the inductive miner and evaluate the result of the process models
    :param log_for_pd: logs that will be used to discover the process models (e.g., might be truncated)
    :param log_for_eval: logs that will be replayed on top of the discovered process model (e.g., will not be truncated = ground truth)
    :return: The evaluation of the process model in a dictionary.
    '''

    # Discover petri net from log
    tree = inductive_miner.apply_tree(log_for_pd)
    net, initial_marking, final_marking = pt_conv_factory.apply(tree, variant=pt_conv_factory.TO_PETRI_NET)

    # Replay the log on top of the discovered process model
    inductive_evaluation_result = evaluation_factory.apply(log_for_eval, net, initial_marking, final_marking)
    inductive_evaluation_result.update(inductive_evaluation_result['fitness'])
    inductive_evaluation_result['discovered_pt'] = str(tree)
    del inductive_evaluation_result['fitness']
    return inductive_evaluation_result
コード例 #7
0
def execute_script():
    # import a log
    log = importer.apply(
        os.path.join("..", "tests", "input_data", "receipt.xes"))
    # found a filtered version of the log that is used to discover a process model
    filtered_log = variants_filter.apply_auto_filter(deepcopy(log))
    # discover a process tree using inductive miner
    tree = inductive_miner.apply_tree(filtered_log)
    print(tree)
    # apply the conversion of a process tree into a Petri net
    net, im, fm = converter.apply(tree)
    # Footprints discovery: discover a list of footprints
    # for all the cases of the log
    fp_log = footprints_discovery.apply(log)
    # discover the footpritns from the process tree
    fp_tree = footprints_discovery.apply(tree)
    # discover the footpritns from the Petri net
    fp_net = footprints_discovery.apply(net, im)
    print(len(fp_tree["sequence"]), len(fp_tree["parallel"]),
          len(fp_net["sequence"]), len(fp_net["parallel"]))
    print(fp_tree["sequence"] == fp_net["sequence"]
          and fp_tree["parallel"] == fp_net["parallel"])
    # apply the footprints conformance checking
    conf = footprints_conformance.apply(fp_log, fp_net)
    for trace_an in conf:
        if trace_an:
            # print the first anomalous trace (containing deviations
            # that are contained in the trace but not allowed by the model)
            print(trace_an)
            break
    # finds the footprints for the entire log (not case-by-case, but taking
    # the relations that appear inside the entire log)
    fp_log_entire = footprints_discovery.apply(
        log, variant=footprints_discovery.Variants.ENTIRE_EVENT_LOG)
    # visualize the footprint table
    gviz = fp_visualizer.apply(fp_log_entire,
                               fp_net,
                               parameters={"format": "svg"})
    fp_visualizer.view(gviz)
コード例 #8
0
            pnml_exporter.export_net(heu_model,
                                     heu_initial_marking,
                                     os.path.join(
                                         pnmlFolder,
                                         logNamePrefix + "_alpha.pnml"),
                                     final_marking=heu_final_marking)
            t2 = time.time()
            print("time interlapsed for calculating Heuristics Model",
                  (t2 - t1))
            print(
                "heuristics is_sound_wfnet",
                check_soundness.check_petri_wfnet_and_soundness(heu_model,
                                                                debug=True))

            t1 = time.time()
            tree = inductive.apply_tree(log, parameters=parameters_discovery)
            inductive_model, inductive_im, inductive_fm = inductive.apply(
                log, parameters=parameters_discovery)
            pnml_exporter.export_net(inductive_model,
                                     inductive_im,
                                     os.path.join(
                                         pnmlFolder,
                                         logNamePrefix + "_inductive.pnml"),
                                     final_marking=inductive_fm)
            generated_log = pt_semantics.generate_log(tree)
            print("first trace of log",
                  [x["concept:name"] for x in generated_log[0]])
            t2 = time.time()
            print("time interlapsed for calculating Inductive Model",
                  (t2 - t1))
            print(
コード例 #9
0
ファイル: views.py プロジェクト: ngtom/PCubes-PADS2019
def model(request, log_id, cube_id):
    values = request.GET.get("values")
    if (values == None):
        values = "{}"
    values = json.loads(values)

    def convert(value, dtype):
        if (dtype == 'float'):
            return float(value)
        elif (dtype == 'int'):
            return int(value)
        elif (dtype == 'date'):
            return convert_date(value)
        elif (dtype == 'bool'):
            return bool(value)
        else:
            return value

    def convert_date(value):
        # Construct datetime object to filter with pymongo
        time_format = "%Y-%m-%dT%H:%M:%S.%f"
        time_format = "%Y-%m-%d %H:%M:%S.%f"
        if ("." not in value):
            time_format = time_format[:-3]

        return datetime.strptime(value, time_format)

    algo = request.GET.get("algorithm")

    values_ = {}

    # Convert to attribute id to name like it is in the events.
    values_ = {}
    for key in values:
        if (key != 'log'):
            attribute = Attribute.objects.get(pk=key)
            if (":" in attribute.parent):
                parent = attribute.parent.split(':')[0]
                d_name = attribute.parent.split(':')[1]
                name = attribute.name

                # Query for elements of dictionary
                queryname = parent + ":" + d_name + ".children." + name
            else:
                queryname = attribute.name
                if (attribute.parent == "trace"):
                    queryname = 'trace:' + queryname

            if ("to" in values[key]):
                lower = values[key].split("to")[0].strip()
                upper = values[key].split('to')[1].strip()

                lower = convert(lower, attribute.dtype)
                upper = convert(upper, attribute.dtype)

                values_[queryname] = {'$gt': lower, '$lt': upper}
            else:
                value = convert(values[key], attribute.dtype)
                values_[queryname] = value

    values_['log'] = log_id
    values = values_

    client = MongoClient(host=DATABASES['default']['HOST'])
    db = client[DATABASES['default']['NAME']]
    trace_collection = db['traces']
    event_collection = db['events']

    t1 = time()
    all_events = event_collection.find(values)
    t2 = time()
    print("Time to get events: {}".format(t2 - t1))

    t1 = time()
    traces = groupby(all_events, key=lambda e: e['trace:_id'])
    t2 = time()
    print("Time to get traces: {}".format(t2 - t1))

    t1 = time()
    traces = [log_lib.log.Trace(g) for k, g in traces]
    t2 = time()
    print("Time to make list: {}".format(t2 - t1))

    # log_list = [log_lib.log.Trace([log_lib.log.Event(t_e) for t_e in all_events if t_e['trace:_id'] == db_trace['_id']]) for db_trace in db_traces]

    t1 = time()
    log = log_lib.log.EventLog(traces)
    t2 = time()
    print("Time to make event log: {}".format(t2 - t1))

    # for db_trace in db_traces:

    #     pm4py_trace = log_lib.log.Trace([log_lib.log.Event(t_e) for t_e in all_events if t_e['trace:_id'] == db_trace['_id']])

    #     log.append(pm4py_trace)
    #     print(len(log))

    # pm_events = []
    # traces = {str(e['trace:_id']): log_lib.log.Trace() for e in events}

    # for event in events:
    #     trace = trace_collection.find_one({"_id": event['trace:_id']})

    #     t = traces[str(event['trace:_id'])]
    #     del event['_id']
    #     del event['trace:_id']

    #     e = log_lib.log.Event(event)
    #     t.append(e)

    # log.append(traces.items())
    # for trace in traces:
    #     log.append(traces[trace])

    parameters = {"format": "svg"}

    event_log = EventLog.objects.get(pk=log_id)
    filename = str(event_log.pk) + algo + ".svg"

    t1 = time()
    if (algo == "alpha"):
        net, initial_marking, final_marking = alpha_miner.apply(log)
        gviz = pn_vis_factory.apply(net,
                                    initial_marking,
                                    final_marking,
                                    parameters=parameters)
        pn_vis_factory.save(gviz, filename)
    elif (algo == "inductive"):
        mine_tree = request.GET.get("mine_tree")
        if (mine_tree == 'true'):
            tree = inductive_miner.apply_tree(log)
            gviz = pt_vis_factory.apply(tree, parameters=parameters)
            pt_vis_factory.save(gviz, filename)
        else:
            net, initial_marking, final_marking = inductive_miner.apply(log)
            gviz = pn_vis_factory.apply(net,
                                        initial_marking,
                                        final_marking,
                                        parameters=parameters)
            pn_vis_factory.save(gviz, filename)
    elif (algo == "heuristic"):

        dependency_thresh = float(request.GET.get("dependency_thresh"))
        and_measure_thresh = float(request.GET.get("and_measure_thresh"))
        min_act_count = float(request.GET.get("min_act_count"))
        min_dfg_occurrences = float(request.GET.get("min_dfg_occurrences"))
        dfg_pre_cleaning_noise_thresh = float(
            request.GET.get("dfg_pre_cleaning_noise_thresh"))

        h_params = {
            'dependency_thresh': dependency_thresh,
            'and_measure_thresh': and_measure_thresh,
            'min_act_count': min_act_count,
            'min_dfg_occurrences': min_dfg_occurrences,
            'dfg_pre_cleaning_noise_thresh': dfg_pre_cleaning_noise_thresh,
        }

        net, im, fm = heuristics_miner.apply(log, parameters=h_params)
        gviz = pn_vis_factory.apply(net, im, fm, parameters=parameters)
        pn_vis_factory.save(gviz, filename)

    t2 = time()
    print("Time pm4py: {}".format(t2 - t1))

    svg = open(filename, "rb")
    svg_content = svg.read()
    svg.close()

    # Tdelete file, it's not required anymore
    os.remove(svg.name)

    return HttpResponse(svg_content, content_type="image/svg+xml")
コード例 #10
0
weak_dfg_fixed_percentage = percentageFixDFG(weak_dfg_fixed)

excellent_average = averagePerPersonFixDFG(
    excellent_dfg_fixed, len(ex1_personal_log_1['org:resource'].unique()))
weak_average = averagePerPersonFixDFG(
    weak_dfg_fixed, len(ex1_personal_log_2['org:resource'].unique()))

diff_absolute = diffTwoMatrix(excellent_average, weak_average)

dfg_miner_time_diff_absolute = diffTwoMatrix(dfg_miner_excellent_dfg,
                                             dfg_miner_weak_dfg)

#Inductive Miner
from pm4py.algo.discovery.inductive import factory as inductive_miner

tree = inductive_miner.apply_tree(ex1_personal_log_1_converted)

from pm4py.visualization.process_tree import factory as pt_vis_factory

gviz = pt_vis_factory.apply(tree)
pt_vis_factory.view(gviz)

from pm4py.algo.discovery.inductive import factory as inductive_miner

net, initial_marking, final_marking = inductive_miner.apply(
    ex1_personal_log_1_converted)
from pm4py.visualization.petrinet import factory as pn_vis_factory

gviz = pn_vis_factory.apply(net, initial_marking, final_marking)
pn_vis_factory.view(gviz)
コード例 #11
0
log_start = start_activities_filter.get_start_activities(sorted_log)
filtered_log = start_activities_filter.apply(sorted_log, ["A"])
# print(rrr)
# from pm4py.algo.discovery.simple.model.log import factory as simple_algorithm

# net, initial_marking, final_marking = simple_algorithm.apply(conv_log, classic_output=True, parameters={"max_no_variants": 20})
# gviz = pn_vis_factory.apply(net, im, fm)
# pn_vis_factory.view(gviz)

# print(ooo)
from pm4py.algo.discovery.alpha import factory as alpha_miner
# the same exact discovery technique can be applied directly to Pandas dataframes! :)
from pm4py.algo.discovery.inductive import factory as inductive_miner
# discovers an accepting Petri net
net, im, fm = inductive_miner.apply(filtered_log)
tree = inductive_miner.apply_tree(filtered_log)
# print(tree)
from pm4py.visualization.process_tree import factory as pt_vis_factory

##########################################################
# gviz = pt_vis_factory.apply(tree)
# pt_vis_factory.view(gviz)
# print(net,im,fm)

# perform a visualization of the Petri net that is discovered
from pm4py.visualization.petrinet import factory as pn_vis_factory
# gviz = pn_vis_factory.apply(net, im, fm)
# pn_vis_factory.view(gviz)

# ############################################
コード例 #12
0
ファイル: data_reallife.py プロジェクト: lvzheqi/pm4py-source
def inductive_to_petri_net(log):
    tree = inductive_miner.apply_tree(log)
    gviz = pt_vis_factory.apply(tree)
    pt_vis_factory.view(gviz)
    return tree