예제 #1
0
def ged(args):
    timeout = 300

    ind1, ind2 = args
    G1 = cgp_2_dag(ind1.active_net_list())
    G2 = cgp_2_dag(ind2.active_net_list())
    #G1 = ind1
    #G2 = ind2
    duration = 0
    start = time.time()
    sim_gp = None
    while duration <= timeout and sim_gp == None:
        for v in similarity.optimize_graph_edit_distance(G1,
                                                         G2,
                                                         node_match=match):
            sim_gp = v
            duration = time.time() - start
            if duration > timeout:
                print('Timeout')
                break
        break

    print('SIM: {}'.format(sim_gp))

    return sim_gp, ind2
def compute_ged(sample_graph: nx.DiGraph, reference_graph: nx.DiGraph, use_edge_cost: bool = False) \
        -> Tuple[float, float]:

    ged_generator = optimize_graph_edit_distance(
        sample_graph,
        reference_graph,
        node_match=lambda v, u: v['label'] == u['label'],
        edge_match=lambda e1, e2: e1['label'] == e2['label'],
        edge_ins_cost=lambda e: 1 if use_edge_cost else 0,
        edge_del_cost=lambda e: 1 if use_edge_cost else 0)
    total_size = sample_graph.number_of_nodes(
    ) + reference_graph.number_of_nodes()
    if use_edge_cost:
        total_size += sample_graph.number_of_edges(
        ) + reference_graph.number_of_edges()
    ged = total_size

    while True:
        try:
            new_ged = func_timeout(0.1, next, args=(ged_generator, ))
            ged = new_ged
        except (FunctionTimedOut, StopIteration):
            break

    return ged, total_size
예제 #3
0
 def test_optimize_graph_edit_distance(self):
     G1 = circular_ladder_graph(2)
     G2 = circular_ladder_graph(6)
     bestcost = 1000
     for cost in optimize_graph_edit_distance(G1, G2):
         assert cost < bestcost
         bestcost = cost
     assert bestcost == 22
예제 #4
0
def compGraphSimilarity(t1, t2, hyper=True, debug=False):
    if len(t1) == 0 and len(t2) == 0:
        return {}, 0
    res = 0
    simi = {}
    keys1 = list(t1.keys())
    keys2 = list(t2.keys())
    share = [x for x in keys1 if x in keys2]
    keys = list(set(keys1 + keys2))
    for key in keys:
        if key not in keys1:
            triples1 = []
            triples2 = t2[key]
        if key not in keys2:
            triples2 = []
            triples1 = t1[key]
        if key in share:
            triples1 = t1[key]
            triples2 = t2[key]
        if not hyper:
            dg1 = createGraph(triples1)
            dg2 = createGraph(triples2)
        else:
            dg1 = createHyperGraph(triples1)
            dg2 = createHyperGraph(triples2)

        nor = max(graph_edit_distance(dg1, nx.DiGraph()),
                  graph_edit_distance(dg2, nx.DiGraph()))

        if len(dg1.nodes()) <= 8 or len(dg2.nodes()) <= 8:
            simi[key] = graph_edit_distance(dg1, dg2)
            print('graph edit distance ...')
            if debug:
                print(f'len of nodes1: {len(dg1.nodes())}')
                print(f'len of edges1: {len(dg1.edges())}')
                print(f'len of nodes2: {len(dg2.nodes())}')
                print(f'len of edges2: {len(dg2.edges())}')
        else:
            print('try optimize_graph_edit_distance function ...')
            print(f'len of nodes1: {len(dg1.nodes())}')
            print(f'len of edges1: {len(dg1.edges())}')
            print(f'len of nodes2: {len(dg2.nodes())}')
            print(f'len of edges2: {len(dg2.edges())}')
            ith = 0
            for v in optimize_graph_edit_distance(dg1, dg2):
                ith += 1
                minv = v
                print(f'optimize {ith} times: {v}')
            simi[key] = minv

        simi[key] = simi[key] / nor

    for i, j in simi.items():
        res += j
    res = res / len(simi)
    return simi, res
예제 #5
0
def sim_measure(G1, G2):
    for distance in optimize_graph_edit_distance(
            G1,
            G2,
            node_subst_cost=node_subst_cost,
            node_del_cost=lambda e: 2,
            node_ins_cost=lambda e: 2,
            edge_subst_cost=edge_subst_cost,
            edge_del_cost=lambda e: 2,
            edge_ins_cost=lambda e: 2):
        max_distance = 8 * (max(len(G1.nodes), len(G2.nodes)) +
                            max(len(G1.edges), len(G2.edges)) + 1)
        yield 1 - (distance / max_distance)