From 74a6e5fad3df694e585f110f761a7d6b2d543553 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Wed, 1 Jul 2020 14:44:02 +0200 Subject: [PATCH] Add exp: compare GEDEnv with the GEDLIB version. --- .../experiments/ged/check_results_of_ged_env.py | 126 +++++++++++++++++++++ gklearn/ged/util/lsape_solver.py | 6 +- 2 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 gklearn/experiments/ged/check_results_of_ged_env.py diff --git a/gklearn/experiments/ged/check_results_of_ged_env.py b/gklearn/experiments/ged/check_results_of_ged_env.py new file mode 100644 index 0000000..7c81c5d --- /dev/null +++ b/gklearn/experiments/ged/check_results_of_ged_env.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Thu Jun 25 11:31:46 2020 + +@author: ljia +""" + +def xp_check_results_of_GEDEnv(): + """Compare results of GEDEnv to GEDLIB. + """ + """**1. Get dataset.**""" + + from gklearn.utils import Dataset + + # Predefined dataset name, use dataset "MUTAG". + ds_name = 'MUTAG' + + # Initialize a Dataset. + dataset = Dataset() + # Load predefined dataset "MUTAG". + dataset.load_predefined_dataset(ds_name) + + results1 = compute_geds_by_GEDEnv(dataset) + results2 = compute_geds_by_GEDLIB(dataset) + + # Show results. + import pprint + pp = pprint.PrettyPrinter(indent=4) # pretty print + print('Restuls using GEDEnv:') + pp.pprint(results1) + print() + print('Restuls using GEDLIB:') + pp.pprint(results2) + + return results1, results2 + + +def compute_geds_by_GEDEnv(dataset): + from gklearn.ged.env import GEDEnv + import numpy as np + + graph1 = dataset.graphs[0] + graph2 = dataset.graphs[1] + + ged_env = GEDEnv() # initailize GED environment. + ged_env.set_edit_cost('CONSTANT', # GED cost type. + edit_cost_constants=[3, 3, 1, 3, 3, 1] # edit costs. + ) + for g in dataset.graphs[0:10]: + ged_env.add_nx_graph(g, '') +# ged_env.add_nx_graph(graph1, '') # add graph1 +# ged_env.add_nx_graph(graph2, '') # add graph2 + listID = ged_env.get_all_graph_ids() # get list IDs of graphs + ged_env.init(init_type='LAZY_WITHOUT_SHUFFLED_COPIES') # initialize GED environment. + options = {'threads': 1 # parallel threads. + } + ged_env.set_method('BIPARTITE', # GED method. + options # options for GED method. + ) + ged_env.init_method() # initialize GED method. + + ged_mat = np.empty((10, 10)) + for i in range(0, 10): + for j in range(i, 10): + ged_env.run_method(i, j) # run. + ged_mat[i, j] = ged_env.get_upper_bound(i, j) + ged_mat[j, i] = ged_mat[i, j] + + results = {} + results['pi_forward'] = ged_env.get_forward_map(listID[0], listID[1]) # forward map. + results['pi_backward'] = ged_env.get_backward_map(listID[0], listID[1]) # backward map. + results['upper_bound'] = ged_env.get_upper_bound(listID[0], listID[1]) # GED bewteen two graphs. + results['runtime'] = ged_env.get_runtime(listID[0], listID[1]) + results['init_time'] = ged_env.get_init_time() + results['ged_mat'] = ged_mat + + return results + + +def compute_geds_by_GEDLIB(dataset): + from gklearn.gedlib import librariesImport, gedlibpy + from gklearn.ged.util import ged_options_to_string + import numpy as np + + graph1 = dataset.graphs[5] + graph2 = dataset.graphs[6] + + ged_env = gedlibpy.GEDEnv() # initailize GED environment. + ged_env.set_edit_cost('CONSTANT', # GED cost type. + edit_cost_constant=[3, 3, 1, 3, 3, 1] # edit costs. + ) +# ged_env.add_nx_graph(graph1, '') # add graph1 +# ged_env.add_nx_graph(graph2, '') # add graph2 + for g in dataset.graphs[0:10]: + ged_env.add_nx_graph(g, '') + listID = ged_env.get_all_graph_ids() # get list IDs of graphs + ged_env.init(init_option='LAZY_WITHOUT_SHUFFLED_COPIES') # initialize GED environment. + options = {'initialization-method': 'RANDOM', # or 'NODE', etc. + 'threads': 1 # parallel threads. + } + ged_env.set_method('BIPARTITE', # GED method. + ged_options_to_string(options) # options for GED method. + ) + ged_env.init_method() # initialize GED method. + + ged_mat = np.empty((10, 10)) + for i in range(0, 10): + for j in range(i, 10): + ged_env.run_method(i, j) # run. + ged_mat[i, j] = ged_env.get_upper_bound(i, j) + ged_mat[j, i] = ged_mat[i, j] + + results = {} + results['pi_forward'] = ged_env.get_forward_map(listID[0], listID[1]) # forward map. + results['pi_backward'] = ged_env.get_backward_map(listID[0], listID[1]) # backward map. + results['upper_bound'] = ged_env.get_upper_bound(listID[0], listID[1]) # GED bewteen two graphs. + results['runtime'] = ged_env.get_runtime(listID[0], listID[1]) + results['init_time'] = ged_env.get_init_time() + results['ged_mat'] = ged_mat + + return results + + +if __name__ == '__main__': + results1, results2 = xp_check_results_of_GEDEnv() \ No newline at end of file diff --git a/gklearn/ged/util/lsape_solver.py b/gklearn/ged/util/lsape_solver.py index 955f543..aef9c11 100644 --- a/gklearn/ged/util/lsape_solver.py +++ b/gklearn/ged/util/lsape_solver.py @@ -61,9 +61,9 @@ class LSAPESolver(object): """ self.clear_solution() if self.__solve_optimally: - row_id, col_id = linear_sum_assignment(self.__cost_matrix) # @todo: only hungarianLSAPE ('ECBP') can be used. - self.__row_to_col_assignments[0] = col_id - self.__col_to_row_assignments[0] = np.argsort(col_id) # @todo: might be slow, can use row_id + row_ind, col_ind = linear_sum_assignment(self.__cost_matrix) # @todo: only hungarianLSAPE ('ECBP') can be used. + self.__row_to_col_assignments[0] = col_ind + self.__col_to_row_assignments[0] = np.argsort(col_ind) # @todo: might be slow, can use row_ind self.__compute_cost_from_assignments() if num_solutions > 1: pass # @todo: