Как я могу использовать аргумент nodematch, чтобы функция graph-edit-distance заметила разные метки моих петр inet -узлов? - PullRequest
0 голосов
/ 07 августа 2020

Я использую networkx для вычисления расстояния редактирования графа от петринетей, которые я создаю через альфа-майнер PM4PY из журналов событий. Они выглядят так: два процесса, отображаемые как петлине

Теперь при преобразовании моих петринетов в графы networkx (снова с использованием pm4py) и последующем вычислении GED с помощью networkx он выдает «0» как расстояние, потому что он не обрабатывает узлы » А "и" Б "как разные. Я по крайней мере ожидаю какое-то расстояние, так как хочу, чтобы он заметил, что узлы помечены по-другому. Вот где я понял, что приходит аргумент nodematch функции GED, который я пробовал несколькими способами, но, похоже, не могу найти правильный способ.

Это полный код, который я используя на этом этапе:

import numpy as np
#set eventlog import parameters
from pm4py.objects.log.importer.xes import importer as xes_importer
from pm4py.visualization.petrinet import visualizer as pn_visualizer
from pm4py.algo.discovery.alpha import algorithm as alpha_miner
import networkx as nx
from networkx.drawing.nx_agraph import to_agraph
from pm4py.objects.petri import networkx_graph

def return_eq(node1, node2):
    return node1 == node2


#import eventlog
log_path1 = os.path.join("Processes/nxtestprocess1.xes")
log1 = xes_importer.apply(log_path1)

log_path2 = os.path.join("Processes/nxtestprocess2.xes")
log2 = xes_importer.apply(log_path2)

#Loop - splits eventlog in two pieces according to slide-window
plotdata = []
gedarray = []

for x in range(0, 1):
    testlog1 = [log1[x]]
    testlog2 = [log2[x]]

    #create nets from eventlogs with alphaminer
    net1, im1, fm1 = alpha_miner.apply(testlog1)
    net2, im2, fm2 = alpha_miner.apply(testlog2)

    #create petrinets from nets
    net1viz = pn_visualizer.apply(net1, im1, fm1)
    net2viz = pn_visualizer.apply(net2, im2, fm2)

    #create nx graph
    nx_graph1, inv_dict1 = networkx_graph.create_networkx_directed_graph(net1)
    nx_graph2, inv_dict2 = networkx_graph.create_networkx_directed_graph(net2)

    #replace original labels with labels from inv_dict
    nx.relabel_nodes(nx_graph1, inv_dict1, copy=False)
    nx.relabel_nodes(nx_graph2, inv_dict2, copy=False)

    #calculate nx GED
    print(nx.graph_edit_distance(nx_graph1, nx_graph2, node_match=return_eq))

Я перемаркирую свои узлы (с «0, 1, 2, 3» на любое соответствие из словаря), пытаясь затем использовать аргумент nodematch, просто сравнение двух узлов, как показано в def функции return_eq. Это не так.

Может быть, у кого-нибудь есть опыт решения этой проблемы и может ли он дать мне небольшой намек?

...