From 3bcc60c479e52c00ff42f9afc9d601d24b60830a Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Wed, 29 Apr 2020 10:42:57 +0200 Subject: [PATCH 01/17] Fix a bug in increasing orders in MGE. --- gklearn/ged/median/median_graph_estimator.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gklearn/ged/median/median_graph_estimator.py b/gklearn/ged/median/median_graph_estimator.py index b5a829c..114c312 100644 --- a/gklearn/ged/median/median_graph_estimator.py +++ b/gklearn/ged/median/median_graph_estimator.py @@ -1115,7 +1115,12 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no continue for label in median_labels: weights[label_id] = min(weights[label_id], self.__ged_env.get_node_rel_cost(dict(label), dict(node_labels[label_id]))) - selected_label_id = urng.choice(range(0, len(weights)), size=1, p=np.array(weights) / np.sum(weights))[0] # for c++ test: xxx[iii] + sum_weight = np.sum(weights) + if sum_weight == 0: + p = np.array([1 / len(weights)] * len(weights)) + else: + p = np.array(weights) / np.sum(weights) + selected_label_id = urng.choice(range(0, len(weights)), size=1, p=p)[0] # for c++ test: xxx[iii] # iii += 1 for c++ test median_labels.append(node_labels[selected_label_id]) already_selected[selected_label_id] = True From 9a365fac98a05e88343a9f1d7bf86a5b102da1da Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Thu, 30 Apr 2020 10:31:08 +0200 Subject: [PATCH 02/17] Fix bugs for enum and add test for median preimage generator. --- gklearn/ged/env/common_types.py | 11 ++-- gklearn/ged/median/median_graph_estimator.py | 2 +- gklearn/tests/test_median_preimage_generator.py | 71 +++++++++++++++++++++++++ gklearn/utils/utils.py | 11 ++-- 4 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 gklearn/tests/test_median_preimage_generator.py diff --git a/gklearn/ged/env/common_types.py b/gklearn/ged/env/common_types.py index 2face25..d195b11 100644 --- a/gklearn/ged/env/common_types.py +++ b/gklearn/ged/env/common_types.py @@ -6,12 +6,13 @@ Created on Thu Mar 19 18:17:38 2020 @author: ljia """ -from enum import Enum, auto +from enum import Enum, unique +@unique class AlgorithmState(Enum): """can be used to specify the state of an algorithm. """ - CALLED = auto # The algorithm has been called. - INITIALIZED = auto # The algorithm has been initialized. - CONVERGED = auto # The algorithm has converged. - TERMINATED = auto # The algorithm has terminated. \ No newline at end of file + CALLED = 1 # The algorithm has been called. + INITIALIZED = 2 # The algorithm has been initialized. + CONVERGED = 3 # The algorithm has converged. + TERMINATED = 4 # The algorithm has terminated. \ No newline at end of file diff --git a/gklearn/ged/median/median_graph_estimator.py b/gklearn/ged/median/median_graph_estimator.py index 114c312..df21601 100644 --- a/gklearn/ged/median/median_graph_estimator.py +++ b/gklearn/ged/median/median_graph_estimator.py @@ -302,7 +302,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no self.__median_id = gen_median_id self.__state = AlgorithmState.TERMINATED - # Get ExchangeGraph representations of the input graphs. + # Get NetworkX graph representations of the input graphs. graphs = {} for graph_id in graph_ids: # @todo: get_nx_graph() function may need to be modified according to the coming code. diff --git a/gklearn/tests/test_median_preimage_generator.py b/gklearn/tests/test_median_preimage_generator.py new file mode 100644 index 0000000..c81bb7c --- /dev/null +++ b/gklearn/tests/test_median_preimage_generator.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Jan 14 15:39:29 2020 + +@author: ljia +""" +import multiprocessing +import functools +from gklearn.preimage.utils import generate_median_preimages_by_class + + +def test_median_preimage_generator(): + """MAO, Treelet, using CONSTANT, symbolic only. + """ + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'MAO' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 3, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(polynomialkernel, d=4, c=1e+7) + kernel_options = {'name': 'Treelet', # + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 1, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save = ds_name + '.' + kernel_options['name'] + '.symb.pytest/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert', 'random']: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=range(0, 4)) \ No newline at end of file diff --git a/gklearn/utils/utils.py b/gklearn/utils/utils.py index 9223b7a..14dc7c1 100644 --- a/gklearn/utils/utils.py +++ b/gklearn/utils/utils.py @@ -1,7 +1,7 @@ import networkx as nx import numpy as np from copy import deepcopy -from enum import Enum, auto +from enum import Enum, unique #from itertools import product # from tqdm import tqdm @@ -467,8 +467,9 @@ def get_mlti_dim_edge_attrs(G, attr_names): attributes.append(tuple(attrs[aname] for aname in attr_names)) return attributes - +@unique class SpecialLabel(Enum): - """can be used to define special labels. - """ - DUMMY = auto # The dummy label. \ No newline at end of file + """can be used to define special labels. + """ + DUMMY = 1 # The dummy label. + # DUMMY = auto # enum.auto does not exist in Python 3.5. \ No newline at end of file From c2e88d927429934d6065941662852b9080879194 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Thu, 30 Apr 2020 10:38:44 +0200 Subject: [PATCH 03/17] Update requirement.txt for pre-image. --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 85aabf8..56401d4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,6 @@ networkx>=2.2 scikit-learn>=0.20.0 tabulate>=0.8.2 tqdm>=4.26.0 -# cvxpy # for preimage. -# cvxopt # for preimage. -# mosek # for preimage. +cvxpy # for preimage. +cvxopt # for preimage. +mosek # for preimage. From 1191009381a92137d89c65dc217f44d30f714b92 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Sat, 2 May 2020 16:39:28 +0200 Subject: [PATCH 04/17] Update requirements. --- README.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3958704..7cfdecc 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ A Python package for graph kernels, graph edit distances and graph pre-image pro ## Requirements * python>=3.5 -* numpy>=1.15.2 +* numpy>=1.16.2 * scipy>=1.1.0 * matplotlib>=3.0.0 * networkx>=2.2 diff --git a/requirements.txt b/requirements.txt index 56401d4..853d485 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy>=1.15.2 +numpy>=1.16.2 scipy>=1.1.0 matplotlib>=3.0.0 networkx>=2.2 From f5439ee8a1fd181907ec7142af9e789044773d4f Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Sat, 2 May 2020 16:47:38 +0200 Subject: [PATCH 05/17] Update requirements. --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 853d485..4dcd662 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,6 @@ networkx>=2.2 scikit-learn>=0.20.0 tabulate>=0.8.2 tqdm>=4.26.0 -cvxpy # for preimage. -cvxopt # for preimage. -mosek # for preimage. +cvxpy>=1.0.31 # for preimage. +cvxopt>=1.2.5 # for preimage. +mosek>=9.2.5 # for preimage. From 1772f64ccba3d8cc2432ee8afbf54bc2835bdc51 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Sat, 2 May 2020 17:15:08 +0200 Subject: [PATCH 06/17] Update requirements. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4dcd662..47a91a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,4 @@ tabulate>=0.8.2 tqdm>=4.26.0 cvxpy>=1.0.31 # for preimage. cvxopt>=1.2.5 # for preimage. -mosek>=9.2.5 # for preimage. +mosek>=9.2.5; python_version >= '3.6' # for preimage. From 34e82bfce8e5860342cb4f7b3420be3773de1c12 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Thu, 7 May 2020 17:05:27 +0200 Subject: [PATCH 07/17] Add parallel functions to MGE. --- gklearn/ged/median/median_graph_estimator.py | 282 +- gklearn/ged/median/test_median_graph_estimator.py | 8 +- gklearn/ged/median/utils.py | 2 + gklearn/ged/util/util.py | 2 + gklearn/gedlib/gedlibpy.cpp | 2934 ++++++++++---------- .../gedlibpy.cpython-36m-x86_64-linux-gnu.so | Bin 33390352 -> 33390352 bytes gklearn/gedlib/gedlibpy.pyx | 10 +- gklearn/preimage/median_preimage_generator.py | 8 +- 8 files changed, 1708 insertions(+), 1538 deletions(-) diff --git a/gklearn/ged/median/median_graph_estimator.py b/gklearn/ged/median/median_graph_estimator.py index df21601..9e0db71 100644 --- a/gklearn/ged/median/median_graph_estimator.py +++ b/gklearn/ged/median/median_graph_estimator.py @@ -13,6 +13,9 @@ import time from tqdm import tqdm import sys import networkx as nx +import multiprocessing +from multiprocessing import Pool +from functools import partial class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined node? @@ -47,6 +50,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no self.__desired_num_random_inits = 10 self.__use_real_randomness = True self.__seed = 0 + self.__parallel = True self.__update_order = True self.__refine = True self.__time_limit_in_sec = 0 @@ -125,6 +129,16 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no else: raise Exception('Invalid argument "' + opt_val + '" for option stdout. Usage: options = "[--stdout 0|1|2] [...]"') + + elif opt_name == 'parallel': + if opt_val == 'TRUE': + self.__parallel = True + + elif opt_val == 'FALSE': + self.__parallel = False + + else: + raise Exception('Invalid argument "' + opt_val + '" for option parallel. Usage: options = "[--parallel TRUE|FALSE] [...]"') elif opt_name == 'update-order': if opt_val == 'TRUE': @@ -312,7 +326,6 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no # print(graphs[0].nodes(data=True)) # print(graphs[0].edges(data=True)) # print(nx.adjacency_matrix(graphs[0])) - # Construct initial medians. medians = [] @@ -356,30 +369,12 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no self.__ged_env.load_nx_graph(median, gen_median_id) self.__ged_env.init(self.__ged_env.get_init_type()) - # Print information about current iteration. - if self.__print_to_stdout == 2: - progress = tqdm(desc='Computing initial node maps', total=len(graph_ids), file=sys.stdout) - # Compute node maps and sum of distances for initial median. - self.__sum_of_distances = 0 - self.__node_maps_from_median.clear() - for graph_id in graph_ids: - self.__ged_env.run_method(gen_median_id, graph_id) - self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(gen_median_id, graph_id) -# print(self.__node_maps_from_median[graph_id]) - self.__sum_of_distances += self.__node_maps_from_median[graph_id].induced_cost() -# print(self.__sum_of_distances) - # Print information about current iteration. - if self.__print_to_stdout == 2: - progress.update(1) - + self.__compute_init_node_maps(graph_ids, gen_median_id) + self.__best_init_sum_of_distances = min(self.__best_init_sum_of_distances, self.__sum_of_distances) self.__ged_env.load_nx_graph(median, set_median_id) # print(self.__best_init_sum_of_distances) - - # Print information about current iteration. - if self.__print_to_stdout == 2: - print('\n') # Run block gradient descent from initial median. converged = False @@ -434,7 +429,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no # print(self.__node_maps_from_median[graph_id].induced_cost()) # xxx = self.__node_maps_from_median[graph_id] self.__ged_env.compute_induced_cost(gen_median_id, graph_id, self.__node_maps_from_median[graph_id]) -# print('---------------------------------------') +# print('---------------------------------------') # print(self.__node_maps_from_median[graph_id].induced_cost()) # @todo:!!!!!!!!!!!!!!!!!!!!!!!!!!!!This value is a slight different from the c++ program, which might be a bug! Use it very carefully! @@ -637,6 +632,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no self.__desired_num_random_inits = 10 self.__use_real_randomness = True self.__seed = 0 + self.__parallel = True self.__update_order = True self.__refine = True self.__time_limit_in_sec = 0 @@ -682,35 +678,123 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def __compute_medoid(self, graph_ids, timer, initial_medians): # Use method selected for initialization phase. self.__ged_env.set_method(self.__init_method, self.__init_options) - - # Print information about current iteration. - if self.__print_to_stdout == 2: - progress = tqdm(desc='Computing medoid', total=len(graph_ids), file=sys.stdout) - + # Compute the medoid. - medoid_id = graph_ids[0] - best_sum_of_distances = np.inf - for g_id in graph_ids: - if timer.expired(): - self.__state = AlgorithmState.CALLED - break - sum_of_distances = 0 - for h_id in graph_ids: - self.__ged_env.run_method(g_id, h_id) - sum_of_distances += self.__ged_env.get_upper_bound(g_id, h_id) - if sum_of_distances < best_sum_of_distances: - best_sum_of_distances = sum_of_distances - medoid_id = g_id - + if self.__parallel: + # @todo: notice when parallel self.__ged_env is not modified. + sum_of_distances_list = [np.inf] * len(graph_ids) + len_itr = len(graph_ids) + itr = zip(graph_ids, range(0, len(graph_ids))) + n_jobs = multiprocessing.cpu_count() + if len_itr < 100 * n_jobs: + chunksize = int(len_itr / n_jobs) + 1 + else: + chunksize = 100 + def init_worker(ged_env_toshare): + global G_ged_env + G_ged_env = ged_env_toshare + do_fun = partial(_compute_medoid_parallel, graph_ids) + pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(self.__ged_env,)) + if self.__print_to_stdout == 2: + iterator = tqdm(pool.imap_unordered(do_fun, itr, chunksize), + desc='Computing medoid', file=sys.stdout) + else: + iterator = pool.imap_unordered(do_fun, itr, chunksize) + for i, dis in iterator: + sum_of_distances_list[i] = dis + pool.close() + pool.join() + + medoid_id = np.argmin(sum_of_distances_list) + best_sum_of_distances = sum_of_distances_list[medoid_id] + + initial_medians.append(self.__ged_env.get_nx_graph(medoid_id, True, True, False)) # @todo + + else: # Print information about current iteration. if self.__print_to_stdout == 2: - progress.update(1) - initial_medians.append(self.__ged_env.get_nx_graph(medoid_id, True, True, False)) # @todo + progress = tqdm(desc='Computing medoid', total=len(graph_ids), file=sys.stdout) - # Print information about current iteration. - if self.__print_to_stdout == 2: - print('\n') + medoid_id = graph_ids[0] + best_sum_of_distances = np.inf + for g_id in graph_ids: + if timer.expired(): + self.__state = AlgorithmState.CALLED + break + sum_of_distances = 0 + for h_id in graph_ids: + self.__ged_env.run_method(g_id, h_id) + sum_of_distances += self.__ged_env.get_upper_bound(g_id, h_id) + if sum_of_distances < best_sum_of_distances: + best_sum_of_distances = sum_of_distances + medoid_id = g_id + + # Print information about current iteration. + if self.__print_to_stdout == 2: + progress.update(1) + + initial_medians.append(self.__ged_env.get_nx_graph(medoid_id, True, True, False)) # @todo + + # Print information about current iteration. + if self.__print_to_stdout == 2: + print('\n') + + + def __compute_init_node_maps(self, graph_ids, gen_median_id): + # Compute node maps and sum of distances for initial median. + if self.__parallel: + # @todo: notice when parallel self.__ged_env is not modified. + self.__sum_of_distances = 0 + self.__node_maps_from_median.clear() + sum_of_distances_list = [0] * len(graph_ids) + + len_itr = len(graph_ids) + itr = graph_ids + n_jobs = multiprocessing.cpu_count() + if len_itr < 100 * n_jobs: + chunksize = int(len_itr / n_jobs) + 1 + else: + chunksize = 100 + def init_worker(ged_env_toshare): + global G_ged_env + G_ged_env = ged_env_toshare + do_fun = partial(_compute_init_node_maps_parallel, gen_median_id) + pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(self.__ged_env,)) + if self.__print_to_stdout == 2: + iterator = tqdm(pool.imap_unordered(do_fun, itr, chunksize), + desc='Computing initial node maps', file=sys.stdout) + else: + iterator = pool.imap_unordered(do_fun, itr, chunksize) + for g_id, sod, node_maps in iterator: + sum_of_distances_list[g_id] = sod + self.__node_maps_from_median[g_id] = node_maps + pool.close() + pool.join() + self.__sum_of_distances = np.sum(sum_of_distances_list) +# xxx = self.__node_maps_from_median + + else: + # Print information about current iteration. + if self.__print_to_stdout == 2: + progress = tqdm(desc='Computing initial node maps', total=len(graph_ids), file=sys.stdout) + + self.__sum_of_distances = 0 + self.__node_maps_from_median.clear() + for graph_id in graph_ids: + self.__ged_env.run_method(gen_median_id, graph_id) + self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(gen_median_id, graph_id) + # print(self.__node_maps_from_median[graph_id]) + self.__sum_of_distances += self.__node_maps_from_median[graph_id].induced_cost() + # print(self.__sum_of_distances) + # Print information about current iteration. + if self.__print_to_stdout == 2: + progress.update(1) + + # Print information about current iteration. + if self.__print_to_stdout == 2: + print('\n') + def __termination_criterion_met(self, converged, timer, itr, itrs_without_update): if timer.expired() or (itr >= self.__max_itrs if self.__max_itrs >= 0 else False): @@ -816,26 +900,57 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def __update_node_maps(self): - # Print information about current iteration. - if self.__print_to_stdout == 2: - progress = tqdm(desc='Updating node maps', total=len(self.__node_maps_from_median), file=sys.stdout) - # Update the node maps. - node_maps_were_modified = False - for graph_id, node_map in self.__node_maps_from_median.items(): - self.__ged_env.run_method(self.__median_id, graph_id) - if self.__ged_env.get_upper_bound(self.__median_id, graph_id) < node_map.induced_cost() - self.__epsilon: -# xxx = self.__node_maps_from_median[graph_id] - self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(self.__median_id, graph_id) -# yyy = self.__node_maps_from_median[graph_id] - node_maps_were_modified = True + if self.__parallel: + # @todo: notice when parallel self.__ged_env is not modified. + node_maps_were_modified = False +# xxx = self.__node_maps_from_median.copy() + + len_itr = len(self.__node_maps_from_median) + itr = [item for item in self.__node_maps_from_median.items()] + n_jobs = multiprocessing.cpu_count() + if len_itr < 100 * n_jobs: + chunksize = int(len_itr / n_jobs) + 1 + else: + chunksize = 100 + def init_worker(ged_env_toshare): + global G_ged_env + G_ged_env = ged_env_toshare + do_fun = partial(_update_node_maps_parallel, self.__median_id, self.__epsilon) + pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(self.__ged_env,)) + if self.__print_to_stdout == 2: + iterator = tqdm(pool.imap_unordered(do_fun, itr, chunksize), + desc='Updating node maps', file=sys.stdout) + else: + iterator = pool.imap_unordered(do_fun, itr, chunksize) + for g_id, node_map, nm_modified in iterator: + self.__node_maps_from_median[g_id] = node_map + if nm_modified: + node_maps_were_modified = True + pool.close() + pool.join() +# yyy = self.__node_maps_from_median.copy() + + else: # Print information about current iteration. if self.__print_to_stdout == 2: - progress.update(1) - - # Print information about current iteration. - if self.__print_to_stdout == 2: - print('\n') + progress = tqdm(desc='Updating node maps', total=len(self.__node_maps_from_median), file=sys.stdout) + + node_maps_were_modified = False + for graph_id, node_map in self.__node_maps_from_median.items(): + self.__ged_env.run_method(self.__median_id, graph_id) + if self.__ged_env.get_upper_bound(self.__median_id, graph_id) < node_map.induced_cost() - self.__epsilon: + # xxx = self.__node_maps_from_median[graph_id] + self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(self.__median_id, graph_id) + # yyy = self.__node_maps_from_median[graph_id] + node_maps_were_modified = True + # Print information about current iteration. + if self.__print_to_stdout == 2: + progress.update(1) + + # Print information about current iteration. + if self.__print_to_stdout == 2: + print('\n') # Return true if the node maps were modified. return node_maps_were_modified @@ -1230,7 +1345,8 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def __add_node_to_median(self, best_config, best_label, median): # Update the median. - median.add_node(nx.number_of_nodes(median), **best_label) + nb_nodes_median = nx.number_of_nodes(median) + median.add_node(nb_nodes_median, **best_label) # Update the node maps. for graph_id, node_map in self.__node_maps_from_median.items(): @@ -1494,4 +1610,40 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no # median_label = {} # for key, val in median.items(): # median_label[key] = str(val) -# return median_label \ No newline at end of file +# return median_label + + +def _compute_medoid_parallel(graph_ids, itr): + g_id = itr[0] + i = itr[1] + # @todo: timer not considered here. +# if timer.expired(): +# self.__state = AlgorithmState.CALLED +# break + sum_of_distances = 0 + for h_id in graph_ids: + G_ged_env.run_method(g_id, h_id) + sum_of_distances += G_ged_env.get_upper_bound(g_id, h_id) + return i, sum_of_distances + + +def _compute_init_node_maps_parallel(gen_median_id, itr): + graph_id = itr + G_ged_env.run_method(gen_median_id, graph_id) + node_maps_from_median = G_ged_env.get_node_map(gen_median_id, graph_id) +# print(self.__node_maps_from_median[graph_id]) + sum_of_distance = node_maps_from_median.induced_cost() +# print(self.__sum_of_distances) + return graph_id, sum_of_distance, node_maps_from_median + + +def _update_node_maps_parallel(median_id, epsilon, itr): + graph_id = itr[0] + node_map = itr[1] + + node_maps_were_modified = False + G_ged_env.run_method(median_id, graph_id) + if G_ged_env.get_upper_bound(median_id, graph_id) < node_map.induced_cost() - epsilon: + node_map = G_ged_env.get_node_map(median_id, graph_id) + node_maps_were_modified = True + return graph_id, node_map, node_maps_were_modified \ No newline at end of file diff --git a/gklearn/ged/median/test_median_graph_estimator.py b/gklearn/ged/median/test_median_graph_estimator.py index 7497bab..60bce83 100644 --- a/gklearn/ged/median/test_median_graph_estimator.py +++ b/gklearn/ged/median/test_median_graph_estimator.py @@ -53,7 +53,7 @@ def test_median_graph_estimator(): mge.set_refine_method(algo, '--threads ' + str(threads) + ' --initial-solutions ' + str(initial_solutions) + ' --ratio-runs-from-initial-solutions 1') mge_options = '--time-limit ' + str(time_limit) + ' --stdout 2 --init-type ' + init_type - mge_options += ' --random-inits ' + str(num_inits) + ' --seed ' + '1' + ' --update-order TRUE --refine FALSE --randomness PSEUDO '# @todo: std::to_string(rng()) + mge_options += ' --random-inits ' + str(num_inits) + ' --seed ' + '1' + ' --update-order TRUE --refine FALSE --randomness PSEUDO --parallel TRUE '# @todo: std::to_string(rng()) # Select the GED algorithm. algo_options = '--threads ' + str(threads) + algo_options_suffix @@ -127,7 +127,7 @@ def test_median_graph_estimator_symb(): mge.set_refine_method(algo, '--threads ' + str(threads) + ' --initial-solutions ' + str(initial_solutions) + ' --ratio-runs-from-initial-solutions 1') mge_options = '--time-limit ' + str(time_limit) + ' --stdout 2 --init-type ' + init_type - mge_options += ' --random-inits ' + str(num_inits) + ' --seed ' + '1' + ' --update-order TRUE --refine FALSE'# @todo: std::to_string(rng()) + mge_options += ' --random-inits ' + str(num_inits) + ' --seed ' + '1' + ' --update-order TRUE --refine FALSE --randomness PSEUDO --parallel TRUE '# @todo: std::to_string(rng()) # Select the GED algorithm. algo_options = '--threads ' + str(threads) + algo_options_suffix @@ -155,5 +155,5 @@ def test_median_graph_estimator_symb(): if __name__ == '__main__': - set_median, gen_median = test_median_graph_estimator() - # set_median, gen_median = test_median_graph_estimator_symb() \ No newline at end of file + # set_median, gen_median = test_median_graph_estimator() + set_median, gen_median = test_median_graph_estimator_symb() \ No newline at end of file diff --git a/gklearn/ged/median/utils.py b/gklearn/ged/median/utils.py index 908cb11..5c4c52f 100644 --- a/gklearn/ged/median/utils.py +++ b/gklearn/ged/median/utils.py @@ -30,6 +30,8 @@ def mge_options_to_string(options): opt_str += '--randomness ' + str(val) + ' ' elif key == 'verbose': opt_str += '--stdout ' + str(val) + ' ' + elif key == 'parallel': + opt_str += '--parallel ' + ('TRUE' if val else 'FALSE') + ' ' elif key == 'update_order': opt_str += '--update-order ' + ('TRUE' if val else 'FALSE') + ' ' elif key == 'refine': diff --git a/gklearn/ged/util/util.py b/gklearn/ged/util/util.py index a18b0cb..d72c2e6 100644 --- a/gklearn/ged/util/util.py +++ b/gklearn/ged/util/util.py @@ -54,6 +54,8 @@ def compute_geds(graphs, options={}, parallel=False): ged_env.add_nx_graph(g, '') listID = ged_env.get_all_graph_ids() ged_env.init() + if parallel: + options['threads'] = 1 ged_env.set_method(options['method'], ged_options_to_string(options)) ged_env.init_method() diff --git a/gklearn/gedlib/gedlibpy.cpp b/gklearn/gedlib/gedlibpy.cpp index 58aa1fd..18e7cd8 100644 --- a/gklearn/gedlib/gedlibpy.cpp +++ b/gklearn/gedlib/gedlibpy.cpp @@ -1173,9 +1173,9 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; */ typedef npy_cdouble __pyx_t_5numpy_complex_t; -/* "gedlibpy.pyx":180 - * +/* "gedlibpy.pyx":182 * + * # @cython.auto_pickle(True) * cdef class GEDEnv: # <<<<<<<<<<<<<< * """Cython wrapper class for C++ class PyGEDEnv * """ @@ -2155,6 +2155,8 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, cha static PyTypeObject *__pyx_ptype_7cpython_5array_array = 0; static CYTHON_INLINE int __pyx_f_7cpython_5array_extend_buffer(arrayobject *, char *, Py_ssize_t); /*proto*/ +/* Module declarations from 'cython' */ + /* Module declarations from 'gedlibpy' */ static PyTypeObject *__pyx_ptype_8gedlibpy_GEDEnv = 0; static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_std__in_string(std::string const &); /*proto*/ @@ -2685,7 +2687,7 @@ static PyObject *__pyx_codeobj__37; static PyObject *__pyx_codeobj__39; /* Late includes */ -/* "gedlibpy.pyx":128 +/* "gedlibpy.pyx":129 * * * def get_edit_cost_options() : # <<<<<<<<<<<<<< @@ -2720,7 +2722,7 @@ static PyObject *__pyx_pf_8gedlibpy_get_edit_cost_options(CYTHON_UNUSED PyObject PyObject *__pyx_t_6 = NULL; __Pyx_RefNannySetupContext("get_edit_cost_options", 0); - /* "gedlibpy.pyx":139 + /* "gedlibpy.pyx":140 * """ * * return [option.decode('utf-8') for option in getEditCostStringOptions()] # <<<<<<<<<<<<<< @@ -2729,13 +2731,13 @@ static PyObject *__pyx_pf_8gedlibpy_get_edit_cost_options(CYTHON_UNUSED PyObject */ __Pyx_XDECREF(__pyx_r); { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); try { __pyx_t_2 = pyged::getEditCostStringOptions(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 139, __pyx_L1_error) + __PYX_ERR(0, 140, __pyx_L1_error) } __pyx_t_4 = &__pyx_t_2; __pyx_t_3 = __pyx_t_4->begin(); @@ -2744,9 +2746,9 @@ static PyObject *__pyx_pf_8gedlibpy_get_edit_cost_options(CYTHON_UNUSED PyObject __pyx_t_5 = *__pyx_t_3; ++__pyx_t_3; __pyx_7genexpr__pyx_v_option = __pyx_t_5; - __pyx_t_6 = __Pyx_decode_cpp_string(__pyx_7genexpr__pyx_v_option, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error) + __pyx_t_6 = __Pyx_decode_cpp_string(__pyx_7genexpr__pyx_v_option, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 139, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } } /* exit inner scope */ @@ -2754,7 +2756,7 @@ static PyObject *__pyx_pf_8gedlibpy_get_edit_cost_options(CYTHON_UNUSED PyObject __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":128 + /* "gedlibpy.pyx":129 * * * def get_edit_cost_options() : # <<<<<<<<<<<<<< @@ -2774,7 +2776,7 @@ static PyObject *__pyx_pf_8gedlibpy_get_edit_cost_options(CYTHON_UNUSED PyObject return __pyx_r; } -/* "gedlibpy.pyx":142 +/* "gedlibpy.pyx":143 * * * def get_method_options() : # <<<<<<<<<<<<<< @@ -2809,7 +2811,7 @@ static PyObject *__pyx_pf_8gedlibpy_2get_method_options(CYTHON_UNUSED PyObject * PyObject *__pyx_t_6 = NULL; __Pyx_RefNannySetupContext("get_method_options", 0); - /* "gedlibpy.pyx":152 + /* "gedlibpy.pyx":153 * .. note:: Prefer the list_of_method_options attribute of this module. * """ * return [option.decode('utf-8') for option in getMethodStringOptions()] # <<<<<<<<<<<<<< @@ -2818,13 +2820,13 @@ static PyObject *__pyx_pf_8gedlibpy_2get_method_options(CYTHON_UNUSED PyObject * */ __Pyx_XDECREF(__pyx_r); { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); try { __pyx_t_2 = pyged::getMethodStringOptions(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 152, __pyx_L1_error) + __PYX_ERR(0, 153, __pyx_L1_error) } __pyx_t_4 = &__pyx_t_2; __pyx_t_3 = __pyx_t_4->begin(); @@ -2833,9 +2835,9 @@ static PyObject *__pyx_pf_8gedlibpy_2get_method_options(CYTHON_UNUSED PyObject * __pyx_t_5 = *__pyx_t_3; ++__pyx_t_3; __pyx_8genexpr1__pyx_v_option = __pyx_t_5; - __pyx_t_6 = __Pyx_decode_cpp_string(__pyx_8genexpr1__pyx_v_option, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_t_6 = __Pyx_decode_cpp_string(__pyx_8genexpr1__pyx_v_option, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 152, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } } /* exit inner scope */ @@ -2843,7 +2845,7 @@ static PyObject *__pyx_pf_8gedlibpy_2get_method_options(CYTHON_UNUSED PyObject * __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":142 + /* "gedlibpy.pyx":143 * * * def get_method_options() : # <<<<<<<<<<<<<< @@ -2863,7 +2865,7 @@ static PyObject *__pyx_pf_8gedlibpy_2get_method_options(CYTHON_UNUSED PyObject * return __pyx_r; } -/* "gedlibpy.pyx":155 +/* "gedlibpy.pyx":156 * * * def get_init_options() : # <<<<<<<<<<<<<< @@ -2898,7 +2900,7 @@ static PyObject *__pyx_pf_8gedlibpy_4get_init_options(CYTHON_UNUSED PyObject *__ PyObject *__pyx_t_6 = NULL; __Pyx_RefNannySetupContext("get_init_options", 0); - /* "gedlibpy.pyx":165 + /* "gedlibpy.pyx":166 * .. note:: Prefer the list_of_init_options attribute of this module. * """ * return [option.decode('utf-8') for option in getInitStringOptions()] # <<<<<<<<<<<<<< @@ -2907,13 +2909,13 @@ static PyObject *__pyx_pf_8gedlibpy_4get_init_options(CYTHON_UNUSED PyObject *__ */ __Pyx_XDECREF(__pyx_r); { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); try { __pyx_t_2 = pyged::getInitStringOptions(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 165, __pyx_L1_error) + __PYX_ERR(0, 166, __pyx_L1_error) } __pyx_t_4 = &__pyx_t_2; __pyx_t_3 = __pyx_t_4->begin(); @@ -2922,9 +2924,9 @@ static PyObject *__pyx_pf_8gedlibpy_4get_init_options(CYTHON_UNUSED PyObject *__ __pyx_t_5 = *__pyx_t_3; ++__pyx_t_3; __pyx_8genexpr2__pyx_v_option = __pyx_t_5; - __pyx_t_6 = __Pyx_decode_cpp_string(__pyx_8genexpr2__pyx_v_option, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_6 = __Pyx_decode_cpp_string(__pyx_8genexpr2__pyx_v_option, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 165, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 166, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } } /* exit inner scope */ @@ -2932,7 +2934,7 @@ static PyObject *__pyx_pf_8gedlibpy_4get_init_options(CYTHON_UNUSED PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":155 + /* "gedlibpy.pyx":156 * * * def get_init_options() : # <<<<<<<<<<<<<< @@ -2952,7 +2954,7 @@ static PyObject *__pyx_pf_8gedlibpy_4get_init_options(CYTHON_UNUSED PyObject *__ return __pyx_r; } -/* "gedlibpy.pyx":168 +/* "gedlibpy.pyx":169 * * * def get_dummy_node() : # <<<<<<<<<<<<<< @@ -2982,7 +2984,7 @@ static PyObject *__pyx_pf_8gedlibpy_6get_dummy_node(CYTHON_UNUSED PyObject *__py PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("get_dummy_node", 0); - /* "gedlibpy.pyx":177 + /* "gedlibpy.pyx":178 * .. note:: A dummy node is used when a node isn't associated to an other node. * """ * return getDummyNode() # <<<<<<<<<<<<<< @@ -2994,15 +2996,15 @@ static PyObject *__pyx_pf_8gedlibpy_6get_dummy_node(CYTHON_UNUSED PyObject *__py __pyx_t_1 = pyged::getDummyNode(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 177, __pyx_L1_error) + __PYX_ERR(0, 178, __pyx_L1_error) } - __pyx_t_2 = __Pyx_PyInt_FromSize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 177, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_FromSize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 178, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":168 + /* "gedlibpy.pyx":169 * * * def get_dummy_node() : # <<<<<<<<<<<<<< @@ -3021,12 +3023,12 @@ static PyObject *__pyx_pf_8gedlibpy_6get_dummy_node(CYTHON_UNUSED PyObject *__py return __pyx_r; } -/* "gedlibpy.pyx":187 +/* "gedlibpy.pyx":189 * * * def __cinit__(self): # <<<<<<<<<<<<<< + * # self.c_env = PyGEDEnv() * self.c_env = new PyGEDEnv() - * */ /* Python wrapper */ @@ -3051,9 +3053,9 @@ static int __pyx_pf_8gedlibpy_6GEDEnv___cinit__(struct __pyx_obj_8gedlibpy_GEDEn pyged::PyGEDEnv *__pyx_t_1; __Pyx_RefNannySetupContext("__cinit__", 0); - /* "gedlibpy.pyx":188 - * + /* "gedlibpy.pyx":191 * def __cinit__(self): + * # self.c_env = PyGEDEnv() * self.c_env = new PyGEDEnv() # <<<<<<<<<<<<<< * * @@ -3062,16 +3064,16 @@ static int __pyx_pf_8gedlibpy_6GEDEnv___cinit__(struct __pyx_obj_8gedlibpy_GEDEn __pyx_t_1 = new pyged::PyGEDEnv(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 188, __pyx_L1_error) + __PYX_ERR(0, 191, __pyx_L1_error) } __pyx_v_self->c_env = __pyx_t_1; - /* "gedlibpy.pyx":187 + /* "gedlibpy.pyx":189 * * * def __cinit__(self): # <<<<<<<<<<<<<< + * # self.c_env = PyGEDEnv() * self.c_env = new PyGEDEnv() - * */ /* function exit code */ @@ -3085,7 +3087,7 @@ static int __pyx_pf_8gedlibpy_6GEDEnv___cinit__(struct __pyx_obj_8gedlibpy_GEDEn return __pyx_r; } -/* "gedlibpy.pyx":191 +/* "gedlibpy.pyx":194 * * * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -3108,7 +3110,7 @@ static void __pyx_pf_8gedlibpy_6GEDEnv_2__dealloc__(struct __pyx_obj_8gedlibpy_G __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "gedlibpy.pyx":192 + /* "gedlibpy.pyx":195 * * def __dealloc__(self): * del self.c_env # <<<<<<<<<<<<<< @@ -3117,7 +3119,7 @@ static void __pyx_pf_8gedlibpy_6GEDEnv_2__dealloc__(struct __pyx_obj_8gedlibpy_G */ delete __pyx_v_self->c_env; - /* "gedlibpy.pyx":191 + /* "gedlibpy.pyx":194 * * * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -3129,7 +3131,7 @@ static void __pyx_pf_8gedlibpy_6GEDEnv_2__dealloc__(struct __pyx_obj_8gedlibpy_G __Pyx_RefNannyFinishContext(); } -/* "gedlibpy.pyx":195 +/* "gedlibpy.pyx":203 * * * def is_initialized(self) : # <<<<<<<<<<<<<< @@ -3158,7 +3160,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_4is_initialized(struct __pyx_obj_8ge PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("is_initialized", 0); - /* "gedlibpy.pyx":204 + /* "gedlibpy.pyx":212 * .. note:: This function exists for internals verifications but you can use it for your code. * """ * return self.c_env.isInitialized() # <<<<<<<<<<<<<< @@ -3170,15 +3172,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_4is_initialized(struct __pyx_obj_8ge __pyx_t_1 = __pyx_v_self->c_env->isInitialized(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 204, __pyx_L1_error) + __PYX_ERR(0, 212, __pyx_L1_error) } - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 204, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 212, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":195 + /* "gedlibpy.pyx":203 * * * def is_initialized(self) : # <<<<<<<<<<<<<< @@ -3197,7 +3199,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_4is_initialized(struct __pyx_obj_8ge return __pyx_r; } -/* "gedlibpy.pyx":207 +/* "gedlibpy.pyx":215 * * * def restart_env(self) : # <<<<<<<<<<<<<< @@ -3224,7 +3226,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_6restart_env(struct __pyx_obj_8gedli __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("restart_env", 0); - /* "gedlibpy.pyx":214 + /* "gedlibpy.pyx":222 * .. note:: You can now delete and add somes graphs after initialization so you can avoid this function. * """ * self.c_env.restartEnv() # <<<<<<<<<<<<<< @@ -3235,10 +3237,10 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_6restart_env(struct __pyx_obj_8gedli __pyx_v_self->c_env->restartEnv(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 214, __pyx_L1_error) + __PYX_ERR(0, 222, __pyx_L1_error) } - /* "gedlibpy.pyx":207 + /* "gedlibpy.pyx":215 * * * def restart_env(self) : # <<<<<<<<<<<<<< @@ -3258,7 +3260,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_6restart_env(struct __pyx_obj_8gedli return __pyx_r; } -/* "gedlibpy.pyx":217 +/* "gedlibpy.pyx":225 * * * def load_GXL_graphs(self, path_folder, path_XML, node_type, edge_type) : # <<<<<<<<<<<<<< @@ -3304,23 +3306,23 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_9load_GXL_graphs(PyObject *__pyx_v_s case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_path_XML)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("load_GXL_graphs", 1, 4, 4, 1); __PYX_ERR(0, 217, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("load_GXL_graphs", 1, 4, 4, 1); __PYX_ERR(0, 225, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_type)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("load_GXL_graphs", 1, 4, 4, 2); __PYX_ERR(0, 217, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("load_GXL_graphs", 1, 4, 4, 2); __PYX_ERR(0, 225, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_edge_type)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("load_GXL_graphs", 1, 4, 4, 3); __PYX_ERR(0, 217, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("load_GXL_graphs", 1, 4, 4, 3); __PYX_ERR(0, 225, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "load_GXL_graphs") < 0)) __PYX_ERR(0, 217, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "load_GXL_graphs") < 0)) __PYX_ERR(0, 225, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; @@ -3337,7 +3339,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_9load_GXL_graphs(PyObject *__pyx_v_s } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("load_GXL_graphs", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 217, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("load_GXL_graphs", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 225, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.load_GXL_graphs", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -3362,14 +3364,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_8load_GXL_graphs(struct __pyx_obj_8g bool __pyx_t_7; __Pyx_RefNannySetupContext("load_GXL_graphs", 0); - /* "gedlibpy.pyx":233 + /* "gedlibpy.pyx":241 * .. note:: You can call this function multiple times if you want, but not after an init call. * """ * self.c_env.loadGXLGraph(path_folder.encode('utf-8'), path_XML.encode('utf-8'), node_type, edge_type) # <<<<<<<<<<<<<< * * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_path_folder, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 233, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_path_folder, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -3383,12 +3385,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_8load_GXL_graphs(struct __pyx_obj_8g } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 233, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 233, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_path_XML, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 233, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_path_XML, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -3402,21 +3404,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_8load_GXL_graphs(struct __pyx_obj_8g } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 233, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 233, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_node_type); if (unlikely((__pyx_t_6 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 233, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_edge_type); if (unlikely((__pyx_t_7 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 233, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_node_type); if (unlikely((__pyx_t_6 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 241, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_edge_type); if (unlikely((__pyx_t_7 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 241, __pyx_L1_error) try { __pyx_v_self->c_env->loadGXLGraph(__pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 233, __pyx_L1_error) + __PYX_ERR(0, 241, __pyx_L1_error) } - /* "gedlibpy.pyx":217 + /* "gedlibpy.pyx":225 * * * def load_GXL_graphs(self, path_folder, path_XML, node_type, edge_type) : # <<<<<<<<<<<<<< @@ -3439,7 +3441,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_8load_GXL_graphs(struct __pyx_obj_8g return __pyx_r; } -/* "gedlibpy.pyx":236 +/* "gedlibpy.pyx":244 * * * def graph_ids(self) : # <<<<<<<<<<<<<< @@ -3468,7 +3470,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_10graph_ids(struct __pyx_obj_8gedlib PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("graph_ids", 0); - /* "gedlibpy.pyx":245 + /* "gedlibpy.pyx":253 * .. note:: Prefer this function if you have huges structures with lots of graphs. * """ * return self.c_env.getGraphIds() # <<<<<<<<<<<<<< @@ -3480,15 +3482,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_10graph_ids(struct __pyx_obj_8gedlib __pyx_t_1 = __pyx_v_self->c_env->getGraphIds(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 245, __pyx_L1_error) + __PYX_ERR(0, 253, __pyx_L1_error) } - __pyx_t_2 = __pyx_convert_pair_to_py_size_t____size_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 245, __pyx_L1_error) + __pyx_t_2 = __pyx_convert_pair_to_py_size_t____size_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 253, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":236 + /* "gedlibpy.pyx":244 * * * def graph_ids(self) : # <<<<<<<<<<<<<< @@ -3507,7 +3509,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_10graph_ids(struct __pyx_obj_8gedlib return __pyx_r; } -/* "gedlibpy.pyx":248 +/* "gedlibpy.pyx":256 * * * def get_all_graph_ids(self) : # <<<<<<<<<<<<<< @@ -3536,7 +3538,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_12get_all_graph_ids(struct __pyx_obj PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("get_all_graph_ids", 0); - /* "gedlibpy.pyx":257 + /* "gedlibpy.pyx":265 * .. note:: The last ID is equal to (number of graphs - 1). The order correspond to the loading order. * """ * return self.c_env.getAllGraphIds() # <<<<<<<<<<<<<< @@ -3548,15 +3550,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_12get_all_graph_ids(struct __pyx_obj __pyx_t_1 = __pyx_v_self->c_env->getAllGraphIds(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 257, __pyx_L1_error) + __PYX_ERR(0, 265, __pyx_L1_error) } - __pyx_t_2 = __pyx_convert_vector_to_py_size_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 257, __pyx_L1_error) + __pyx_t_2 = __pyx_convert_vector_to_py_size_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 265, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":248 + /* "gedlibpy.pyx":256 * * * def get_all_graph_ids(self) : # <<<<<<<<<<<<<< @@ -3575,7 +3577,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_12get_all_graph_ids(struct __pyx_obj return __pyx_r; } -/* "gedlibpy.pyx":260 +/* "gedlibpy.pyx":268 * * * def get_graph_class(self, id) : # <<<<<<<<<<<<<< @@ -3605,7 +3607,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_14get_graph_class(struct __pyx_obj_8 PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("get_graph_class", 0); - /* "gedlibpy.pyx":272 + /* "gedlibpy.pyx":280 * .. note:: An empty string can be a class. * """ * return self.c_env.getGraphClass(id) # <<<<<<<<<<<<<< @@ -3613,20 +3615,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_14get_graph_class(struct __pyx_obj_8 * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 272, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 280, __pyx_L1_error) try { __pyx_t_2 = __pyx_v_self->c_env->getGraphClass(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 272, __pyx_L1_error) + __PYX_ERR(0, 280, __pyx_L1_error) } - __pyx_t_3 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 272, __pyx_L1_error) + __pyx_t_3 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 280, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":260 + /* "gedlibpy.pyx":268 * * * def get_graph_class(self, id) : # <<<<<<<<<<<<<< @@ -3645,7 +3647,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_14get_graph_class(struct __pyx_obj_8 return __pyx_r; } -/* "gedlibpy.pyx":275 +/* "gedlibpy.pyx":283 * * * def get_graph_name(self, id) : # <<<<<<<<<<<<<< @@ -3675,7 +3677,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_16get_graph_name(struct __pyx_obj_8g PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("get_graph_name", 0); - /* "gedlibpy.pyx":287 + /* "gedlibpy.pyx":295 * .. note:: An empty string can be a name. * """ * return self.c_env.getGraphName(id).decode('utf-8') # <<<<<<<<<<<<<< @@ -3683,20 +3685,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_16get_graph_name(struct __pyx_obj_8g * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 287, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 295, __pyx_L1_error) try { __pyx_t_2 = __pyx_v_self->c_env->getGraphName(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 287, __pyx_L1_error) + __PYX_ERR(0, 295, __pyx_L1_error) } - __pyx_t_3 = __Pyx_decode_cpp_string(__pyx_t_2, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 287, __pyx_L1_error) + __pyx_t_3 = __Pyx_decode_cpp_string(__pyx_t_2, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 295, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":275 + /* "gedlibpy.pyx":283 * * * def get_graph_name(self, id) : # <<<<<<<<<<<<<< @@ -3715,7 +3717,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_16get_graph_name(struct __pyx_obj_8g return __pyx_r; } -/* "gedlibpy.pyx":290 +/* "gedlibpy.pyx":298 * * * def add_graph(self, name="", classe="") : # <<<<<<<<<<<<<< @@ -3763,7 +3765,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_19add_graph(PyObject *__pyx_v_self, } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_graph") < 0)) __PYX_ERR(0, 290, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_graph") < 0)) __PYX_ERR(0, 298, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -3780,7 +3782,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_19add_graph(PyObject *__pyx_v_self, } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("add_graph", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 290, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_graph", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 298, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.add_graph", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -3804,7 +3806,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_18add_graph(struct __pyx_obj_8gedlib size_t __pyx_t_6; __Pyx_RefNannySetupContext("add_graph", 0); - /* "gedlibpy.pyx":304 + /* "gedlibpy.pyx":312 * .. note:: You can call this function without parameters. You can also use this function after initialization, call init() after you're finished your modifications. * """ * return self.c_env.addGraph(name.encode('utf-8'), classe.encode('utf-8')) # <<<<<<<<<<<<<< @@ -3812,7 +3814,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_18add_graph(struct __pyx_obj_8gedlib * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_name, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_name, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 312, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -3826,12 +3828,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_18add_graph(struct __pyx_obj_8gedlib } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 304, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 312, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 312, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_classe, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_classe, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 312, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -3845,24 +3847,24 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_18add_graph(struct __pyx_obj_8gedlib } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 304, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 312, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 312, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; try { __pyx_t_6 = __pyx_v_self->c_env->addGraph(__pyx_t_4, __pyx_t_5); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 304, __pyx_L1_error) + __PYX_ERR(0, 312, __pyx_L1_error) } - __pyx_t_1 = __Pyx_PyInt_FromSize_t(__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_FromSize_t(__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 312, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":290 + /* "gedlibpy.pyx":298 * * * def add_graph(self, name="", classe="") : # <<<<<<<<<<<<<< @@ -3883,7 +3885,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_18add_graph(struct __pyx_obj_8gedlib return __pyx_r; } -/* "gedlibpy.pyx":307 +/* "gedlibpy.pyx":315 * * * def add_node(self, graph_id, node_id, node_label): # <<<<<<<<<<<<<< @@ -3926,17 +3928,17 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_21add_node(PyObject *__pyx_v_self, P case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_id)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_node", 1, 3, 3, 1); __PYX_ERR(0, 307, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_node", 1, 3, 3, 1); __PYX_ERR(0, 315, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_label)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_node", 1, 3, 3, 2); __PYX_ERR(0, 307, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_node", 1, 3, 3, 2); __PYX_ERR(0, 315, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_node") < 0)) __PYX_ERR(0, 307, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_node") < 0)) __PYX_ERR(0, 315, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -3951,7 +3953,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_21add_node(PyObject *__pyx_v_self, P } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("add_node", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 307, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_node", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 315, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.add_node", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -3975,15 +3977,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_20add_node(struct __pyx_obj_8gedlibp std::map __pyx_t_6; __Pyx_RefNannySetupContext("add_node", 0); - /* "gedlibpy.pyx":321 + /* "gedlibpy.pyx":329 * .. note:: You can also use this function after initialization, but only on a newly added graph. Call init() after you're finished your modifications. * """ * self.c_env.addNode(graph_id, node_id.encode('utf-8'), encode_your_map(node_label)) # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 321, __pyx_L1_error) - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_id, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 321, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_id, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 329, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { @@ -3997,12 +3999,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_20add_node(struct __pyx_obj_8gedlibp } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 321, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 329, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 321, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 329, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 329, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { @@ -4016,19 +4018,19 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_20add_node(struct __pyx_obj_8gedlibp } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_v_node_label) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_node_label); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 321, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 329, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 321, __pyx_L1_error) + __pyx_t_6 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 329, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; try { __pyx_v_self->c_env->addNode(__pyx_t_1, __pyx_t_5, __pyx_t_6); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 321, __pyx_L1_error) + __PYX_ERR(0, 329, __pyx_L1_error) } - /* "gedlibpy.pyx":307 + /* "gedlibpy.pyx":315 * * * def add_node(self, graph_id, node_id, node_label): # <<<<<<<<<<<<<< @@ -4051,7 +4053,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_20add_node(struct __pyx_obj_8gedlibp return __pyx_r; } -/* "gedlibpy.pyx":324 +/* "gedlibpy.pyx":332 * * * def add_edge(self, graph_id, tail, head, edge_label, ignore_duplicates=True) : # <<<<<<<<<<<<<< @@ -4101,19 +4103,19 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_23add_edge(PyObject *__pyx_v_self, P case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_tail)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_edge", 0, 4, 5, 1); __PYX_ERR(0, 324, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_edge", 0, 4, 5, 1); __PYX_ERR(0, 332, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_head)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_edge", 0, 4, 5, 2); __PYX_ERR(0, 324, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_edge", 0, 4, 5, 2); __PYX_ERR(0, 332, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_edge_label)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_edge", 0, 4, 5, 3); __PYX_ERR(0, 324, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_edge", 0, 4, 5, 3); __PYX_ERR(0, 332, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: @@ -4123,7 +4125,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_23add_edge(PyObject *__pyx_v_self, P } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_edge") < 0)) __PYX_ERR(0, 324, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_edge") < 0)) __PYX_ERR(0, 332, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -4145,7 +4147,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_23add_edge(PyObject *__pyx_v_self, P } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("add_edge", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 324, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_edge", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 332, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.add_edge", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -4171,15 +4173,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_22add_edge(struct __pyx_obj_8gedlibp bool __pyx_t_8; __Pyx_RefNannySetupContext("add_edge", 0); - /* "gedlibpy.pyx":342 + /* "gedlibpy.pyx":350 * .. note:: You can also use this function after initialization, but only on a newly added graph. Call init() after you're finished your modifications. * """ * self.c_env.addEdge(graph_id, tail.encode('utf-8'), head.encode('utf-8'), encode_your_map(edge_label), ignore_duplicates) # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 342, __pyx_L1_error) - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_tail, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 342, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 350, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_tail, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { @@ -4193,12 +4195,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_22add_edge(struct __pyx_obj_8gedlibp } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 342, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 342, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_head, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 342, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_head, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { @@ -4212,12 +4214,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_22add_edge(struct __pyx_obj_8gedlibp } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 342, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 342, __pyx_L1_error) + __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 342, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { @@ -4231,20 +4233,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_22add_edge(struct __pyx_obj_8gedlibp } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_v_edge_label) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_edge_label); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 342, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_7 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 342, __pyx_L1_error) + __pyx_t_7 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_ignore_duplicates); if (unlikely((__pyx_t_8 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 342, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_ignore_duplicates); if (unlikely((__pyx_t_8 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 350, __pyx_L1_error) try { __pyx_v_self->c_env->addEdge(__pyx_t_1, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_8); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 342, __pyx_L1_error) + __PYX_ERR(0, 350, __pyx_L1_error) } - /* "gedlibpy.pyx":324 + /* "gedlibpy.pyx":332 * * * def add_edge(self, graph_id, tail, head, edge_label, ignore_duplicates=True) : # <<<<<<<<<<<<<< @@ -4267,7 +4269,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_22add_edge(struct __pyx_obj_8gedlibp return __pyx_r; } -/* "gedlibpy.pyx":345 +/* "gedlibpy.pyx":353 * * * def add_symmetrical_edge(self, graph_id, tail, head, edge_label) : # <<<<<<<<<<<<<< @@ -4313,23 +4315,23 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_25add_symmetrical_edge(PyObject *__p case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_tail)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_symmetrical_edge", 1, 4, 4, 1); __PYX_ERR(0, 345, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_symmetrical_edge", 1, 4, 4, 1); __PYX_ERR(0, 353, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_head)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_symmetrical_edge", 1, 4, 4, 2); __PYX_ERR(0, 345, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_symmetrical_edge", 1, 4, 4, 2); __PYX_ERR(0, 353, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_edge_label)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_symmetrical_edge", 1, 4, 4, 3); __PYX_ERR(0, 345, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_symmetrical_edge", 1, 4, 4, 3); __PYX_ERR(0, 353, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_symmetrical_edge") < 0)) __PYX_ERR(0, 345, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_symmetrical_edge") < 0)) __PYX_ERR(0, 353, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; @@ -4346,7 +4348,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_25add_symmetrical_edge(PyObject *__p } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("add_symmetrical_edge", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 345, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_symmetrical_edge", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 353, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.add_symmetrical_edge", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -4374,14 +4376,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_24add_symmetrical_edge(struct __pyx_ std::map __pyx_t_7; __Pyx_RefNannySetupContext("add_symmetrical_edge", 0); - /* "gedlibpy.pyx":361 + /* "gedlibpy.pyx":369 * .. note:: You can also use this function after initialization, but only on a newly added graph. Call init() after you're finished your modifications. * """ * tailB = tail.encode('utf-8') # <<<<<<<<<<<<<< * headB = head.encode('utf-8') * edgeLabelB = encode_your_map(edge_label) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_tail, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 361, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_tail, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 369, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -4395,20 +4397,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_24add_symmetrical_edge(struct __pyx_ } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 361, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 369, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_tailB = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":362 + /* "gedlibpy.pyx":370 * """ * tailB = tail.encode('utf-8') * headB = head.encode('utf-8') # <<<<<<<<<<<<<< * edgeLabelB = encode_your_map(edge_label) * self.c_env.addEdge(graph_id, tailB, headB, edgeLabelB, True) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_head, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 362, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_head, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 370, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -4422,20 +4424,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_24add_symmetrical_edge(struct __pyx_ } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 362, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 370, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_headB = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":363 + /* "gedlibpy.pyx":371 * tailB = tail.encode('utf-8') * headB = head.encode('utf-8') * edgeLabelB = encode_your_map(edge_label) # <<<<<<<<<<<<<< * self.c_env.addEdge(graph_id, tailB, headB, edgeLabelB, True) * self.c_env.addEdge(graph_id, headB, tailB, edgeLabelB, True) */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 363, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -4449,49 +4451,49 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_24add_symmetrical_edge(struct __pyx_ } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_edge_label) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_edge_label); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 363, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_edgeLabelB = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":364 + /* "gedlibpy.pyx":372 * headB = head.encode('utf-8') * edgeLabelB = encode_your_map(edge_label) * self.c_env.addEdge(graph_id, tailB, headB, edgeLabelB, True) # <<<<<<<<<<<<<< * self.c_env.addEdge(graph_id, headB, tailB, edgeLabelB, True) * */ - __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 364, __pyx_L1_error) - __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_v_tailB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 364, __pyx_L1_error) - __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_headB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 364, __pyx_L1_error) - __pyx_t_7 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_v_edgeLabelB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 364, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 372, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_v_tailB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 372, __pyx_L1_error) + __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_headB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 372, __pyx_L1_error) + __pyx_t_7 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_v_edgeLabelB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 372, __pyx_L1_error) try { __pyx_v_self->c_env->addEdge(__pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7, 1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 364, __pyx_L1_error) + __PYX_ERR(0, 372, __pyx_L1_error) } - /* "gedlibpy.pyx":365 + /* "gedlibpy.pyx":373 * edgeLabelB = encode_your_map(edge_label) * self.c_env.addEdge(graph_id, tailB, headB, edgeLabelB, True) * self.c_env.addEdge(graph_id, headB, tailB, edgeLabelB, True) # <<<<<<<<<<<<<< * * */ - __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 365, __pyx_L1_error) - __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_headB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 365, __pyx_L1_error) - __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_v_tailB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 365, __pyx_L1_error) - __pyx_t_7 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_v_edgeLabelB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 365, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 373, __pyx_L1_error) + __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_headB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 373, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_string_from_py_std__in_string(__pyx_v_tailB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 373, __pyx_L1_error) + __pyx_t_7 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_v_edgeLabelB); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 373, __pyx_L1_error) try { __pyx_v_self->c_env->addEdge(__pyx_t_4, __pyx_t_6, __pyx_t_5, __pyx_t_7, 1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 365, __pyx_L1_error) + __PYX_ERR(0, 373, __pyx_L1_error) } - /* "gedlibpy.pyx":345 + /* "gedlibpy.pyx":353 * * * def add_symmetrical_edge(self, graph_id, tail, head, edge_label) : # <<<<<<<<<<<<<< @@ -4517,7 +4519,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_24add_symmetrical_edge(struct __pyx_ return __pyx_r; } -/* "gedlibpy.pyx":368 +/* "gedlibpy.pyx":376 * * * def clear_graph(self, graph_id) : # <<<<<<<<<<<<<< @@ -4545,22 +4547,22 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_26clear_graph(struct __pyx_obj_8gedl size_t __pyx_t_1; __Pyx_RefNannySetupContext("clear_graph", 0); - /* "gedlibpy.pyx":377 + /* "gedlibpy.pyx":385 * .. note:: Call init() after you're finished your modifications. * """ * self.c_env.clearGraph(graph_id) # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 385, __pyx_L1_error) try { __pyx_v_self->c_env->clearGraph(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 377, __pyx_L1_error) + __PYX_ERR(0, 385, __pyx_L1_error) } - /* "gedlibpy.pyx":368 + /* "gedlibpy.pyx":376 * * * def clear_graph(self, graph_id) : # <<<<<<<<<<<<<< @@ -4580,7 +4582,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_26clear_graph(struct __pyx_obj_8gedl return __pyx_r; } -/* "gedlibpy.pyx":380 +/* "gedlibpy.pyx":388 * * * def get_graph_internal_id(self, graph_id) : # <<<<<<<<<<<<<< @@ -4610,7 +4612,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_28get_graph_internal_id(struct __pyx PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("get_graph_internal_id", 0); - /* "gedlibpy.pyx":392 + /* "gedlibpy.pyx":400 * .. note:: These functions allow to collect all the graph's informations. * """ * return self.c_env.getGraphInternalId(graph_id) # <<<<<<<<<<<<<< @@ -4618,20 +4620,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_28get_graph_internal_id(struct __pyx * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 392, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 400, __pyx_L1_error) try { __pyx_t_2 = __pyx_v_self->c_env->getGraphInternalId(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 392, __pyx_L1_error) + __PYX_ERR(0, 400, __pyx_L1_error) } - __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 392, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 400, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":380 + /* "gedlibpy.pyx":388 * * * def get_graph_internal_id(self, graph_id) : # <<<<<<<<<<<<<< @@ -4650,7 +4652,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_28get_graph_internal_id(struct __pyx return __pyx_r; } -/* "gedlibpy.pyx":395 +/* "gedlibpy.pyx":403 * * * def get_graph_num_nodes(self, graph_id) : # <<<<<<<<<<<<<< @@ -4680,7 +4682,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_30get_graph_num_nodes(struct __pyx_o PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("get_graph_num_nodes", 0); - /* "gedlibpy.pyx":407 + /* "gedlibpy.pyx":415 * .. note:: These functions allow to collect all the graph's informations. * """ * return self.c_env.getGraphNumNodes(graph_id) # <<<<<<<<<<<<<< @@ -4688,20 +4690,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_30get_graph_num_nodes(struct __pyx_o * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 407, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 415, __pyx_L1_error) try { __pyx_t_2 = __pyx_v_self->c_env->getGraphNumNodes(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 407, __pyx_L1_error) + __PYX_ERR(0, 415, __pyx_L1_error) } - __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 407, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 415, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":395 + /* "gedlibpy.pyx":403 * * * def get_graph_num_nodes(self, graph_id) : # <<<<<<<<<<<<<< @@ -4720,7 +4722,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_30get_graph_num_nodes(struct __pyx_o return __pyx_r; } -/* "gedlibpy.pyx":410 +/* "gedlibpy.pyx":418 * * * def get_graph_num_edges(self, graph_id) : # <<<<<<<<<<<<<< @@ -4750,7 +4752,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_32get_graph_num_edges(struct __pyx_o PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("get_graph_num_edges", 0); - /* "gedlibpy.pyx":422 + /* "gedlibpy.pyx":430 * .. note:: These functions allow to collect all the graph's informations. * """ * return self.c_env.getGraphNumEdges(graph_id) # <<<<<<<<<<<<<< @@ -4758,20 +4760,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_32get_graph_num_edges(struct __pyx_o * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 422, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 430, __pyx_L1_error) try { __pyx_t_2 = __pyx_v_self->c_env->getGraphNumEdges(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 422, __pyx_L1_error) + __PYX_ERR(0, 430, __pyx_L1_error) } - __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 422, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 430, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":410 + /* "gedlibpy.pyx":418 * * * def get_graph_num_edges(self, graph_id) : # <<<<<<<<<<<<<< @@ -4790,7 +4792,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_32get_graph_num_edges(struct __pyx_o return __pyx_r; } -/* "gedlibpy.pyx":425 +/* "gedlibpy.pyx":433 * * * def get_original_node_ids(self, graph_id) : # <<<<<<<<<<<<<< @@ -4825,7 +4827,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_34get_original_node_ids(struct __pyx PyObject *__pyx_t_7 = NULL; __Pyx_RefNannySetupContext("get_original_node_ids", 0); - /* "gedlibpy.pyx":437 + /* "gedlibpy.pyx":445 * .. note:: These functions allow to collect all the graph's informations. * """ * return [gid.decode('utf-8') for gid in self.c_env.getGraphOriginalNodeIds(graph_id)] # <<<<<<<<<<<<<< @@ -4834,14 +4836,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_34get_original_node_ids(struct __pyx */ __Pyx_XDECREF(__pyx_r); { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 437, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 445, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 437, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 445, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getGraphOriginalNodeIds(__pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 437, __pyx_L1_error) + __PYX_ERR(0, 445, __pyx_L1_error) } __pyx_t_5 = &__pyx_t_3; __pyx_t_4 = __pyx_t_5->begin(); @@ -4850,9 +4852,9 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_34get_original_node_ids(struct __pyx __pyx_t_6 = *__pyx_t_4; ++__pyx_t_4; __pyx_8genexpr3__pyx_v_gid = __pyx_t_6; - __pyx_t_7 = __Pyx_decode_cpp_string(__pyx_8genexpr3__pyx_v_gid, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 437, __pyx_L1_error) + __pyx_t_7 = __Pyx_decode_cpp_string(__pyx_8genexpr3__pyx_v_gid, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 445, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_7))) __PYX_ERR(0, 437, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_7))) __PYX_ERR(0, 445, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } } /* exit inner scope */ @@ -4860,7 +4862,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_34get_original_node_ids(struct __pyx __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":425 + /* "gedlibpy.pyx":433 * * * def get_original_node_ids(self, graph_id) : # <<<<<<<<<<<<<< @@ -4880,7 +4882,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_34get_original_node_ids(struct __pyx return __pyx_r; } -/* "gedlibpy.pyx":440 +/* "gedlibpy.pyx":448 * * * def get_graph_node_labels(self, graph_id) : # <<<<<<<<<<<<<< @@ -4918,7 +4920,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_36get_graph_node_labels(struct __pyx PyObject *__pyx_t_10 = NULL; __Pyx_RefNannySetupContext("get_graph_node_labels", 0); - /* "gedlibpy.pyx":452 + /* "gedlibpy.pyx":460 * .. note:: These functions allow to collect all the graph's informations. * """ * return [decode_your_map(node_label) for node_label in self.c_env.getGraphNodeLabels(graph_id)] # <<<<<<<<<<<<<< @@ -4927,14 +4929,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_36get_graph_node_labels(struct __pyx */ __Pyx_XDECREF(__pyx_r); { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 452, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 460, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 452, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 460, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getGraphNodeLabels(__pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 452, __pyx_L1_error) + __PYX_ERR(0, 460, __pyx_L1_error) } __pyx_t_5 = &__pyx_t_3; __pyx_t_4 = __pyx_t_5->begin(); @@ -4943,9 +4945,9 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_36get_graph_node_labels(struct __pyx __pyx_t_6 = *__pyx_t_4; ++__pyx_t_4; __pyx_8genexpr4__pyx_v_node_label = __pyx_t_6; - __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 452, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 460, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_8genexpr4__pyx_v_node_label); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 452, __pyx_L1_error) + __pyx_t_9 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_8genexpr4__pyx_v_node_label); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 460, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_8))) { @@ -4960,10 +4962,10 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_36get_graph_node_labels(struct __pyx __pyx_t_7 = (__pyx_t_10) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_10, __pyx_t_9) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 452, __pyx_L1_error) + if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 460, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_7))) __PYX_ERR(0, 452, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_7))) __PYX_ERR(0, 460, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } } /* exit inner scope */ @@ -4971,7 +4973,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_36get_graph_node_labels(struct __pyx __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":440 + /* "gedlibpy.pyx":448 * * * def get_graph_node_labels(self, graph_id) : # <<<<<<<<<<<<<< @@ -4994,7 +4996,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_36get_graph_node_labels(struct __pyx return __pyx_r; } -/* "gedlibpy.pyx":455 +/* "gedlibpy.pyx":463 * * * def get_graph_edges(self, graph_id) : # <<<<<<<<<<<<<< @@ -5027,7 +5029,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_38get_graph_edges(struct __pyx_obj_8 PyObject *__pyx_t_6 = NULL; __Pyx_RefNannySetupContext("get_graph_edges", 0); - /* "gedlibpy.pyx":467 + /* "gedlibpy.pyx":475 * .. note:: These functions allow to collect all the graph's informations. * """ * return decode_graph_edges(self.c_env.getGraphEdges(graph_id)) # <<<<<<<<<<<<<< @@ -5035,16 +5037,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_38get_graph_edges(struct __pyx_obj_8 * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_graph_edges); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 467, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_graph_edges); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 475, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 467, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 475, __pyx_L1_error) try { __pyx_t_4 = __pyx_v_self->c_env->getGraphEdges(__pyx_t_3); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 467, __pyx_L1_error) + __PYX_ERR(0, 475, __pyx_L1_error) } - __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_pair_3c_size_t_2c_size_t_3e_______std_3a__3a_map_3c_std_3a__3a_string_2c_std_3a__3a_string_3e___(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 467, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_pair_3c_size_t_2c_size_t_3e_______std_3a__3a_map_3c_std_3a__3a_string_2c_std_3a__3a_string_3e___(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 475, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -5059,14 +5061,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_38get_graph_edges(struct __pyx_obj_8 __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 467, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 475, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":455 + /* "gedlibpy.pyx":463 * * * def get_graph_edges(self, graph_id) : # <<<<<<<<<<<<<< @@ -5088,7 +5090,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_38get_graph_edges(struct __pyx_obj_8 return __pyx_r; } -/* "gedlibpy.pyx":470 +/* "gedlibpy.pyx":478 * * * def get_graph_adjacence_matrix(self, graph_id) : # <<<<<<<<<<<<<< @@ -5118,7 +5120,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_40get_graph_adjacence_matrix(struct PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("get_graph_adjacence_matrix", 0); - /* "gedlibpy.pyx":482 + /* "gedlibpy.pyx":490 * .. note:: These functions allow to collect all the graph's informations. * """ * return self.c_env.getGraphAdjacenceMatrix(graph_id) # <<<<<<<<<<<<<< @@ -5126,20 +5128,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_40get_graph_adjacence_matrix(struct * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 482, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_graph_id); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 490, __pyx_L1_error) try { __pyx_t_2 = __pyx_v_self->c_env->getGraphAdjacenceMatrix(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 482, __pyx_L1_error) + __PYX_ERR(0, 490, __pyx_L1_error) } - __pyx_t_3 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_size_t_3e___(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 482, __pyx_L1_error) + __pyx_t_3 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_size_t_3e___(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":470 + /* "gedlibpy.pyx":478 * * * def get_graph_adjacence_matrix(self, graph_id) : # <<<<<<<<<<<<<< @@ -5158,7 +5160,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_40get_graph_adjacence_matrix(struct return __pyx_r; } -/* "gedlibpy.pyx":485 +/* "gedlibpy.pyx":493 * * * def set_edit_cost(self, edit_cost, edit_cost_constant = []) : # <<<<<<<<<<<<<< @@ -5203,7 +5205,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_43set_edit_cost(PyObject *__pyx_v_se } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_edit_cost") < 0)) __PYX_ERR(0, 485, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_edit_cost") < 0)) __PYX_ERR(0, 493, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -5219,7 +5221,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_43set_edit_cost(PyObject *__pyx_v_se } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("set_edit_cost", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 485, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("set_edit_cost", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 493, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.set_edit_cost", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -5245,28 +5247,28 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_42set_edit_cost(struct __pyx_obj_8ge std::vector __pyx_t_7; __Pyx_RefNannySetupContext("set_edit_cost", 0); - /* "gedlibpy.pyx":497 + /* "gedlibpy.pyx":505 * .. note:: Try to make sure the edit cost function exists with list_of_edit_cost_options, raise an error otherwise. * """ * if edit_cost in list_of_edit_cost_options: # <<<<<<<<<<<<<< * edit_cost_b = edit_cost.encode('utf-8') * self.c_env.setEditCost(edit_cost_b, edit_cost_constant) */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_list_of_edit_cost_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 497, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_list_of_edit_cost_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 505, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_v_edit_cost, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 497, __pyx_L1_error) + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_v_edit_cost, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 505, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = (__pyx_t_2 != 0); if (likely(__pyx_t_3)) { - /* "gedlibpy.pyx":498 + /* "gedlibpy.pyx":506 * """ * if edit_cost in list_of_edit_cost_options: * edit_cost_b = edit_cost.encode('utf-8') # <<<<<<<<<<<<<< * self.c_env.setEditCost(edit_cost_b, edit_cost_constant) * else: */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_edit_cost, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 498, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_edit_cost, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 506, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { @@ -5280,29 +5282,29 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_42set_edit_cost(struct __pyx_obj_8ge } __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 498, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 506, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_edit_cost_b = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":499 + /* "gedlibpy.pyx":507 * if edit_cost in list_of_edit_cost_options: * edit_cost_b = edit_cost.encode('utf-8') * self.c_env.setEditCost(edit_cost_b, edit_cost_constant) # <<<<<<<<<<<<<< * else: * raise EditCostError("This edit cost function doesn't exist, please see list_of_edit_cost_options for selecting a edit cost function") */ - __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_edit_cost_b); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 499, __pyx_L1_error) - __pyx_t_7 = __pyx_convert_vector_from_py_double(__pyx_v_edit_cost_constant); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 499, __pyx_L1_error) + __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_edit_cost_b); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_7 = __pyx_convert_vector_from_py_double(__pyx_v_edit_cost_constant); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 507, __pyx_L1_error) try { __pyx_v_self->c_env->setEditCost(__pyx_t_6, __pyx_t_7); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 499, __pyx_L1_error) + __PYX_ERR(0, 507, __pyx_L1_error) } - /* "gedlibpy.pyx":497 + /* "gedlibpy.pyx":505 * .. note:: Try to make sure the edit cost function exists with list_of_edit_cost_options, raise an error otherwise. * """ * if edit_cost in list_of_edit_cost_options: # <<<<<<<<<<<<<< @@ -5312,7 +5314,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_42set_edit_cost(struct __pyx_obj_8ge goto __pyx_L3; } - /* "gedlibpy.pyx":501 + /* "gedlibpy.pyx":509 * self.c_env.setEditCost(edit_cost_b, edit_cost_constant) * else: * raise EditCostError("This edit cost function doesn't exist, please see list_of_edit_cost_options for selecting a edit cost function") # <<<<<<<<<<<<<< @@ -5320,7 +5322,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_42set_edit_cost(struct __pyx_obj_8ge * */ /*else*/ { - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_EditCostError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 501, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_EditCostError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { @@ -5334,16 +5336,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_42set_edit_cost(struct __pyx_obj_8ge } __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_This_edit_cost_function_doesn_t) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_This_edit_cost_function_doesn_t); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 501, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 501, __pyx_L1_error) + __PYX_ERR(0, 509, __pyx_L1_error) } __pyx_L3:; - /* "gedlibpy.pyx":485 + /* "gedlibpy.pyx":493 * * * def set_edit_cost(self, edit_cost, edit_cost_constant = []) : # <<<<<<<<<<<<<< @@ -5367,7 +5369,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_42set_edit_cost(struct __pyx_obj_8ge return __pyx_r; } -/* "gedlibpy.pyx":504 +/* "gedlibpy.pyx":512 * * * def set_personal_edit_cost(self, edit_cost_constant = []) : # <<<<<<<<<<<<<< @@ -5405,7 +5407,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_45set_personal_edit_cost(PyObject *_ } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_personal_edit_cost") < 0)) __PYX_ERR(0, 504, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_personal_edit_cost") < 0)) __PYX_ERR(0, 512, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -5419,7 +5421,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_45set_personal_edit_cost(PyObject *_ } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("set_personal_edit_cost", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 504, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("set_personal_edit_cost", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 512, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.set_personal_edit_cost", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -5438,22 +5440,22 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_44set_personal_edit_cost(struct __py std::vector __pyx_t_1; __Pyx_RefNannySetupContext("set_personal_edit_cost", 0); - /* "gedlibpy.pyx":514 + /* "gedlibpy.pyx":522 * .. note::You have to modify the C++ function to use it. Please see the documentation to add your Edit Cost function. * """ * self.c_env.setPersonalEditCost(edit_cost_constant) # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __pyx_convert_vector_from_py_double(__pyx_v_edit_cost_constant); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 514, __pyx_L1_error) + __pyx_t_1 = __pyx_convert_vector_from_py_double(__pyx_v_edit_cost_constant); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 522, __pyx_L1_error) try { __pyx_v_self->c_env->setPersonalEditCost(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 514, __pyx_L1_error) + __PYX_ERR(0, 522, __pyx_L1_error) } - /* "gedlibpy.pyx":504 + /* "gedlibpy.pyx":512 * * * def set_personal_edit_cost(self, edit_cost_constant = []) : # <<<<<<<<<<<<<< @@ -5473,7 +5475,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_44set_personal_edit_cost(struct __py return __pyx_r; } -/* "gedlibpy.pyx":517 +/* "gedlibpy.pyx":525 * * * def init(self, init_option='EAGER_WITHOUT_SHUFFLED_COPIES', print_to_stdout=False) : # <<<<<<<<<<<<<< @@ -5521,7 +5523,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_47init(PyObject *__pyx_v_self, PyObj } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init") < 0)) __PYX_ERR(0, 517, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "init") < 0)) __PYX_ERR(0, 525, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -5538,7 +5540,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_47init(PyObject *__pyx_v_self, PyObj } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("init", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 517, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("init", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 525, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.init", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -5564,28 +5566,28 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_46init(struct __pyx_obj_8gedlibpy_GE bool __pyx_t_7; __Pyx_RefNannySetupContext("init", 0); - /* "gedlibpy.pyx":528 + /* "gedlibpy.pyx":536 * .. note:: Try to make sure the option exists with list_of_init_options or choose no options, raise an error otherwise. * """ * if init_option in list_of_init_options: # <<<<<<<<<<<<<< * init_option_b = init_option.encode('utf-8') * self.c_env.initEnv(init_option_b, print_to_stdout) */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_list_of_init_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 528, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_list_of_init_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 536, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_v_init_option, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 528, __pyx_L1_error) + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_v_init_option, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 536, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = (__pyx_t_2 != 0); if (likely(__pyx_t_3)) { - /* "gedlibpy.pyx":529 + /* "gedlibpy.pyx":537 * """ * if init_option in list_of_init_options: * init_option_b = init_option.encode('utf-8') # <<<<<<<<<<<<<< * self.c_env.initEnv(init_option_b, print_to_stdout) * else: */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_init_option, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_init_option, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 537, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { @@ -5599,29 +5601,29 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_46init(struct __pyx_obj_8gedlibpy_GE } __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 529, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 537, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_init_option_b = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":530 + /* "gedlibpy.pyx":538 * if init_option in list_of_init_options: * init_option_b = init_option.encode('utf-8') * self.c_env.initEnv(init_option_b, print_to_stdout) # <<<<<<<<<<<<<< * else: * raise InitError("This init option doesn't exist, please see list_of_init_options for selecting an option. You can choose any options.") */ - __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_init_option_b); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 530, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_print_to_stdout); if (unlikely((__pyx_t_7 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 530, __pyx_L1_error) + __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_init_option_b); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_print_to_stdout); if (unlikely((__pyx_t_7 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(0, 538, __pyx_L1_error) try { __pyx_v_self->c_env->initEnv(__pyx_t_6, __pyx_t_7); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 530, __pyx_L1_error) + __PYX_ERR(0, 538, __pyx_L1_error) } - /* "gedlibpy.pyx":528 + /* "gedlibpy.pyx":536 * .. note:: Try to make sure the option exists with list_of_init_options or choose no options, raise an error otherwise. * """ * if init_option in list_of_init_options: # <<<<<<<<<<<<<< @@ -5631,7 +5633,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_46init(struct __pyx_obj_8gedlibpy_GE goto __pyx_L3; } - /* "gedlibpy.pyx":532 + /* "gedlibpy.pyx":540 * self.c_env.initEnv(init_option_b, print_to_stdout) * else: * raise InitError("This init option doesn't exist, please see list_of_init_options for selecting an option. You can choose any options.") # <<<<<<<<<<<<<< @@ -5639,7 +5641,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_46init(struct __pyx_obj_8gedlibpy_GE * */ /*else*/ { - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_InitError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 532, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_InitError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { @@ -5653,16 +5655,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_46init(struct __pyx_obj_8gedlibpy_GE } __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_This_init_option_doesn_t_exist_p) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_This_init_option_doesn_t_exist_p); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 532, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 532, __pyx_L1_error) + __PYX_ERR(0, 540, __pyx_L1_error) } __pyx_L3:; - /* "gedlibpy.pyx":517 + /* "gedlibpy.pyx":525 * * * def init(self, init_option='EAGER_WITHOUT_SHUFFLED_COPIES', print_to_stdout=False) : # <<<<<<<<<<<<<< @@ -5686,7 +5688,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_46init(struct __pyx_obj_8gedlibpy_GE return __pyx_r; } -/* "gedlibpy.pyx":535 +/* "gedlibpy.pyx":543 * * * def set_method(self, method, options="") : # <<<<<<<<<<<<<< @@ -5731,7 +5733,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_49set_method(PyObject *__pyx_v_self, } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_method") < 0)) __PYX_ERR(0, 535, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_method") < 0)) __PYX_ERR(0, 543, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -5747,7 +5749,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_49set_method(PyObject *__pyx_v_self, } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("set_method", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 535, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("set_method", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 543, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.set_method", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -5773,28 +5775,28 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_48set_method(struct __pyx_obj_8gedli std::string __pyx_t_7; __Pyx_RefNannySetupContext("set_method", 0); - /* "gedlibpy.pyx":547 + /* "gedlibpy.pyx":555 * .. note:: Try to make sure the edit cost function exists with list_of_method_options, raise an error otherwise. Call init_method() after your set. * """ * if method in list_of_method_options: # <<<<<<<<<<<<<< * method_b = method.encode('utf-8') * self.c_env.setMethod(method_b, options.encode('utf-8')) */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_list_of_method_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 547, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_list_of_method_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 555, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_v_method, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 547, __pyx_L1_error) + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_v_method, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 555, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = (__pyx_t_2 != 0); if (likely(__pyx_t_3)) { - /* "gedlibpy.pyx":548 + /* "gedlibpy.pyx":556 * """ * if method in list_of_method_options: * method_b = method.encode('utf-8') # <<<<<<<<<<<<<< * self.c_env.setMethod(method_b, options.encode('utf-8')) * else: */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_method, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 548, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_method, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 556, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { @@ -5808,21 +5810,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_48set_method(struct __pyx_obj_8gedli } __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 548, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 556, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_method_b = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":549 + /* "gedlibpy.pyx":557 * if method in list_of_method_options: * method_b = method.encode('utf-8') * self.c_env.setMethod(method_b, options.encode('utf-8')) # <<<<<<<<<<<<<< * else: * raise MethodError("This method doesn't exist, please see list_of_method_options for selecting a method") */ - __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_method_b); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 549, __pyx_L1_error) - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_options, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 549, __pyx_L1_error) + __pyx_t_6 = __pyx_convert_string_from_py_std__in_string(__pyx_v_method_b); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 557, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_options, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 557, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { @@ -5836,19 +5838,19 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_48set_method(struct __pyx_obj_8gedli } __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 549, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 557, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_7 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 549, __pyx_L1_error) + __pyx_t_7 = __pyx_convert_string_from_py_std__in_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 557, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; try { __pyx_v_self->c_env->setMethod(__pyx_t_6, __pyx_t_7); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 549, __pyx_L1_error) + __PYX_ERR(0, 557, __pyx_L1_error) } - /* "gedlibpy.pyx":547 + /* "gedlibpy.pyx":555 * .. note:: Try to make sure the edit cost function exists with list_of_method_options, raise an error otherwise. Call init_method() after your set. * """ * if method in list_of_method_options: # <<<<<<<<<<<<<< @@ -5858,7 +5860,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_48set_method(struct __pyx_obj_8gedli goto __pyx_L3; } - /* "gedlibpy.pyx":551 + /* "gedlibpy.pyx":559 * self.c_env.setMethod(method_b, options.encode('utf-8')) * else: * raise MethodError("This method doesn't exist, please see list_of_method_options for selecting a method") # <<<<<<<<<<<<<< @@ -5866,7 +5868,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_48set_method(struct __pyx_obj_8gedli * */ /*else*/ { - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_MethodError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 551, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_MethodError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 559, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { @@ -5880,16 +5882,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_48set_method(struct __pyx_obj_8gedli } __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_This_method_doesn_t_exist_please) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_This_method_doesn_t_exist_please); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 551, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 559, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 551, __pyx_L1_error) + __PYX_ERR(0, 559, __pyx_L1_error) } __pyx_L3:; - /* "gedlibpy.pyx":535 + /* "gedlibpy.pyx":543 * * * def set_method(self, method, options="") : # <<<<<<<<<<<<<< @@ -5913,7 +5915,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_48set_method(struct __pyx_obj_8gedli return __pyx_r; } -/* "gedlibpy.pyx":554 +/* "gedlibpy.pyx":562 * * * def init_method(self) : # <<<<<<<<<<<<<< @@ -5940,7 +5942,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_50init_method(struct __pyx_obj_8gedl __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_method", 0); - /* "gedlibpy.pyx":561 + /* "gedlibpy.pyx":569 * .. note:: Call this function after set the method. You can't launch computation or change the method after that. * """ * self.c_env.initMethod() # <<<<<<<<<<<<<< @@ -5951,10 +5953,10 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_50init_method(struct __pyx_obj_8gedl __pyx_v_self->c_env->initMethod(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 561, __pyx_L1_error) + __PYX_ERR(0, 569, __pyx_L1_error) } - /* "gedlibpy.pyx":554 + /* "gedlibpy.pyx":562 * * * def init_method(self) : # <<<<<<<<<<<<<< @@ -5974,7 +5976,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_50init_method(struct __pyx_obj_8gedl return __pyx_r; } -/* "gedlibpy.pyx":564 +/* "gedlibpy.pyx":572 * * * def get_init_time(self) : # <<<<<<<<<<<<<< @@ -6003,7 +6005,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_52get_init_time(struct __pyx_obj_8ge PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("get_init_time", 0); - /* "gedlibpy.pyx":571 + /* "gedlibpy.pyx":579 * :rtype: double * """ * return self.c_env.getInitime() # <<<<<<<<<<<<<< @@ -6015,15 +6017,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_52get_init_time(struct __pyx_obj_8ge __pyx_t_1 = __pyx_v_self->c_env->getInitime(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 571, __pyx_L1_error) + __PYX_ERR(0, 579, __pyx_L1_error) } - __pyx_t_2 = PyFloat_FromDouble(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 571, __pyx_L1_error) + __pyx_t_2 = PyFloat_FromDouble(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 579, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":564 + /* "gedlibpy.pyx":572 * * * def get_init_time(self) : # <<<<<<<<<<<<<< @@ -6042,7 +6044,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_52get_init_time(struct __pyx_obj_8ge return __pyx_r; } -/* "gedlibpy.pyx":574 +/* "gedlibpy.pyx":582 * * * def run_method(self, g, h) : # <<<<<<<<<<<<<< @@ -6082,11 +6084,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_55run_method(PyObject *__pyx_v_self, case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("run_method", 1, 2, 2, 1); __PYX_ERR(0, 574, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("run_method", 1, 2, 2, 1); __PYX_ERR(0, 582, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "run_method") < 0)) __PYX_ERR(0, 574, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "run_method") < 0)) __PYX_ERR(0, 582, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -6099,7 +6101,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_55run_method(PyObject *__pyx_v_self, } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("run_method", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 574, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("run_method", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 582, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.run_method", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6119,23 +6121,23 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_54run_method(struct __pyx_obj_8gedli size_t __pyx_t_2; __Pyx_RefNannySetupContext("run_method", 0); - /* "gedlibpy.pyx":586 + /* "gedlibpy.pyx":594 * .. note:: This function only compute the distance between two graphs, without returning a result. Use the differents function to see the result between the two graphs. * """ * self.c_env.runMethod(g, h) # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 586, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 586, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 594, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 594, __pyx_L1_error) try { __pyx_v_self->c_env->runMethod(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 586, __pyx_L1_error) + __PYX_ERR(0, 594, __pyx_L1_error) } - /* "gedlibpy.pyx":574 + /* "gedlibpy.pyx":582 * * * def run_method(self, g, h) : # <<<<<<<<<<<<<< @@ -6155,7 +6157,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_54run_method(struct __pyx_obj_8gedli return __pyx_r; } -/* "gedlibpy.pyx":589 +/* "gedlibpy.pyx":597 * * * def get_upper_bound(self, g, h) : # <<<<<<<<<<<<<< @@ -6195,11 +6197,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_57get_upper_bound(PyObject *__pyx_v_ case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_upper_bound", 1, 2, 2, 1); __PYX_ERR(0, 589, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_upper_bound", 1, 2, 2, 1); __PYX_ERR(0, 597, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_upper_bound") < 0)) __PYX_ERR(0, 589, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_upper_bound") < 0)) __PYX_ERR(0, 597, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -6212,7 +6214,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_57get_upper_bound(PyObject *__pyx_v_ } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_upper_bound", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 589, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_upper_bound", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 597, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_upper_bound", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6234,7 +6236,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_56get_upper_bound(struct __pyx_obj_8 PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("get_upper_bound", 0); - /* "gedlibpy.pyx":604 + /* "gedlibpy.pyx":612 * .. note:: The upper bound is equivalent to the result of the pessimist edit distance cost. Methods are heuristics so the library can't compute the real perfect result because it's NP-Hard problem. * """ * return self.c_env.getUpperBound(g, h) # <<<<<<<<<<<<<< @@ -6242,21 +6244,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_56get_upper_bound(struct __pyx_obj_8 * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 604, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 604, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 612, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 612, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getUpperBound(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 604, __pyx_L1_error) + __PYX_ERR(0, 612, __pyx_L1_error) } - __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 604, __pyx_L1_error) + __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 612, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":589 + /* "gedlibpy.pyx":597 * * * def get_upper_bound(self, g, h) : # <<<<<<<<<<<<<< @@ -6275,7 +6277,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_56get_upper_bound(struct __pyx_obj_8 return __pyx_r; } -/* "gedlibpy.pyx":607 +/* "gedlibpy.pyx":615 * * * def get_lower_bound(self, g, h) : # <<<<<<<<<<<<<< @@ -6315,11 +6317,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_59get_lower_bound(PyObject *__pyx_v_ case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_lower_bound", 1, 2, 2, 1); __PYX_ERR(0, 607, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_lower_bound", 1, 2, 2, 1); __PYX_ERR(0, 615, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_lower_bound") < 0)) __PYX_ERR(0, 607, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_lower_bound") < 0)) __PYX_ERR(0, 615, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -6332,7 +6334,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_59get_lower_bound(PyObject *__pyx_v_ } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_lower_bound", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 607, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_lower_bound", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 615, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_lower_bound", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6354,7 +6356,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_58get_lower_bound(struct __pyx_obj_8 PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("get_lower_bound", 0); - /* "gedlibpy.pyx":622 + /* "gedlibpy.pyx":630 * .. note:: This function can be ignored, because lower bound doesn't have a crucial utility. * """ * return self.c_env.getLowerBound(g, h) # <<<<<<<<<<<<<< @@ -6362,21 +6364,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_58get_lower_bound(struct __pyx_obj_8 * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 622, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 622, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 630, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 630, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getLowerBound(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 622, __pyx_L1_error) + __PYX_ERR(0, 630, __pyx_L1_error) } - __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 622, __pyx_L1_error) + __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 630, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":607 + /* "gedlibpy.pyx":615 * * * def get_lower_bound(self, g, h) : # <<<<<<<<<<<<<< @@ -6395,7 +6397,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_58get_lower_bound(struct __pyx_obj_8 return __pyx_r; } -/* "gedlibpy.pyx":625 +/* "gedlibpy.pyx":633 * * * def get_forward_map(self, g, h) : # <<<<<<<<<<<<<< @@ -6435,11 +6437,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_61get_forward_map(PyObject *__pyx_v_ case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_forward_map", 1, 2, 2, 1); __PYX_ERR(0, 625, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_forward_map", 1, 2, 2, 1); __PYX_ERR(0, 633, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_forward_map") < 0)) __PYX_ERR(0, 625, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_forward_map") < 0)) __PYX_ERR(0, 633, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -6452,7 +6454,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_61get_forward_map(PyObject *__pyx_v_ } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_forward_map", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 625, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_forward_map", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 633, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_forward_map", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6474,7 +6476,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_60get_forward_map(struct __pyx_obj_8 PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("get_forward_map", 0); - /* "gedlibpy.pyx":640 + /* "gedlibpy.pyx":648 * .. note:: I don't know how to connect the two map to reconstruct the adjacence matrix. Please come back when I know how it's work ! * """ * return self.c_env.getForwardMap(g, h) # <<<<<<<<<<<<<< @@ -6482,21 +6484,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_60get_forward_map(struct __pyx_obj_8 * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 648, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 648, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getForwardMap(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 640, __pyx_L1_error) + __PYX_ERR(0, 648, __pyx_L1_error) } - __pyx_t_4 = __pyx_convert_vector_to_py_npy_uint64(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 640, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_vector_to_py_npy_uint64(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 648, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":625 + /* "gedlibpy.pyx":633 * * * def get_forward_map(self, g, h) : # <<<<<<<<<<<<<< @@ -6515,7 +6517,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_60get_forward_map(struct __pyx_obj_8 return __pyx_r; } -/* "gedlibpy.pyx":643 +/* "gedlibpy.pyx":651 * * * def get_backward_map(self, g, h) : # <<<<<<<<<<<<<< @@ -6555,11 +6557,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_63get_backward_map(PyObject *__pyx_v case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_backward_map", 1, 2, 2, 1); __PYX_ERR(0, 643, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_backward_map", 1, 2, 2, 1); __PYX_ERR(0, 651, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_backward_map") < 0)) __PYX_ERR(0, 643, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_backward_map") < 0)) __PYX_ERR(0, 651, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -6572,7 +6574,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_63get_backward_map(PyObject *__pyx_v } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_backward_map", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 643, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_backward_map", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 651, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_backward_map", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6594,7 +6596,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_62get_backward_map(struct __pyx_obj_ PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("get_backward_map", 0); - /* "gedlibpy.pyx":658 + /* "gedlibpy.pyx":666 * .. note:: I don't know how to connect the two map to reconstruct the adjacence matrix. Please come back when I know how it's work ! * """ * return self.c_env.getBackwardMap(g, h) # <<<<<<<<<<<<<< @@ -6602,21 +6604,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_62get_backward_map(struct __pyx_obj_ * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 658, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 658, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 666, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 666, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getBackwardMap(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 658, __pyx_L1_error) + __PYX_ERR(0, 666, __pyx_L1_error) } - __pyx_t_4 = __pyx_convert_vector_to_py_npy_uint64(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 658, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_vector_to_py_npy_uint64(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 666, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":643 + /* "gedlibpy.pyx":651 * * * def get_backward_map(self, g, h) : # <<<<<<<<<<<<<< @@ -6635,7 +6637,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_62get_backward_map(struct __pyx_obj_ return __pyx_r; } -/* "gedlibpy.pyx":661 +/* "gedlibpy.pyx":669 * * * def get_node_image(self, g, h, node_id) : # <<<<<<<<<<<<<< @@ -6678,17 +6680,17 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_65get_node_image(PyObject *__pyx_v_s case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_node_image", 1, 3, 3, 1); __PYX_ERR(0, 661, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_image", 1, 3, 3, 1); __PYX_ERR(0, 669, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_id)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_node_image", 1, 3, 3, 2); __PYX_ERR(0, 661, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_image", 1, 3, 3, 2); __PYX_ERR(0, 669, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_node_image") < 0)) __PYX_ERR(0, 661, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_node_image") < 0)) __PYX_ERR(0, 669, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -6703,7 +6705,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_65get_node_image(PyObject *__pyx_v_s } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_node_image", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 661, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_image", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 669, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_node_image", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6726,7 +6728,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_64get_node_image(struct __pyx_obj_8g PyObject *__pyx_t_5 = NULL; __Pyx_RefNannySetupContext("get_node_image", 0); - /* "gedlibpy.pyx":679 + /* "gedlibpy.pyx":687 * * """ * return self.c_env.getNodeImage(g, h, node_id) # <<<<<<<<<<<<<< @@ -6734,22 +6736,22 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_64get_node_image(struct __pyx_obj_8g * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 679, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 679, __pyx_L1_error) - __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_node_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 679, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 687, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 687, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_node_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 687, __pyx_L1_error) try { __pyx_t_4 = __pyx_v_self->c_env->getNodeImage(__pyx_t_1, __pyx_t_2, __pyx_t_3); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 679, __pyx_L1_error) + __PYX_ERR(0, 687, __pyx_L1_error) } - __pyx_t_5 = __Pyx_PyInt_FromSize_t(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 679, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_FromSize_t(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 687, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":661 + /* "gedlibpy.pyx":669 * * * def get_node_image(self, g, h, node_id) : # <<<<<<<<<<<<<< @@ -6768,7 +6770,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_64get_node_image(struct __pyx_obj_8g return __pyx_r; } -/* "gedlibpy.pyx":682 +/* "gedlibpy.pyx":690 * * * def get_node_pre_image(self, g, h, node_id) : # <<<<<<<<<<<<<< @@ -6811,17 +6813,17 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_67get_node_pre_image(PyObject *__pyx case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_node_pre_image", 1, 3, 3, 1); __PYX_ERR(0, 682, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_pre_image", 1, 3, 3, 1); __PYX_ERR(0, 690, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_id)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_node_pre_image", 1, 3, 3, 2); __PYX_ERR(0, 682, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_pre_image", 1, 3, 3, 2); __PYX_ERR(0, 690, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_node_pre_image") < 0)) __PYX_ERR(0, 682, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_node_pre_image") < 0)) __PYX_ERR(0, 690, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -6836,7 +6838,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_67get_node_pre_image(PyObject *__pyx } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_node_pre_image", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 682, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_pre_image", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 690, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_node_pre_image", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6859,7 +6861,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_66get_node_pre_image(struct __pyx_ob PyObject *__pyx_t_5 = NULL; __Pyx_RefNannySetupContext("get_node_pre_image", 0); - /* "gedlibpy.pyx":700 + /* "gedlibpy.pyx":708 * * """ * return self.c_env.getNodePreImage(g, h, node_id) # <<<<<<<<<<<<<< @@ -6867,22 +6869,22 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_66get_node_pre_image(struct __pyx_ob * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 700, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 700, __pyx_L1_error) - __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_node_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 700, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 708, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 708, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_node_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 708, __pyx_L1_error) try { __pyx_t_4 = __pyx_v_self->c_env->getNodePreImage(__pyx_t_1, __pyx_t_2, __pyx_t_3); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 700, __pyx_L1_error) + __PYX_ERR(0, 708, __pyx_L1_error) } - __pyx_t_5 = __Pyx_PyInt_FromSize_t(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 700, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_FromSize_t(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 708, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":682 + /* "gedlibpy.pyx":690 * * * def get_node_pre_image(self, g, h, node_id) : # <<<<<<<<<<<<<< @@ -6901,7 +6903,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_66get_node_pre_image(struct __pyx_ob return __pyx_r; } -/* "gedlibpy.pyx":703 +/* "gedlibpy.pyx":711 * * * def get_induced_cost(self, g, h) : # <<<<<<<<<<<<<< @@ -6941,11 +6943,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_69get_induced_cost(PyObject *__pyx_v case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_induced_cost", 1, 2, 2, 1); __PYX_ERR(0, 703, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_induced_cost", 1, 2, 2, 1); __PYX_ERR(0, 711, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_induced_cost") < 0)) __PYX_ERR(0, 703, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_induced_cost") < 0)) __PYX_ERR(0, 711, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -6958,7 +6960,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_69get_induced_cost(PyObject *__pyx_v } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_induced_cost", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 703, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_induced_cost", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 711, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_induced_cost", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6980,7 +6982,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_68get_induced_cost(struct __pyx_obj_ PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("get_induced_cost", 0); - /* "gedlibpy.pyx":719 + /* "gedlibpy.pyx":727 * * """ * return self.c_env.getInducedCost(g, h) # <<<<<<<<<<<<<< @@ -6988,21 +6990,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_68get_induced_cost(struct __pyx_obj_ * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 719, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 719, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 727, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 727, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getInducedCost(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 719, __pyx_L1_error) + __PYX_ERR(0, 727, __pyx_L1_error) } - __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 719, __pyx_L1_error) + __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 727, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":703 + /* "gedlibpy.pyx":711 * * * def get_induced_cost(self, g, h) : # <<<<<<<<<<<<<< @@ -7021,7 +7023,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_68get_induced_cost(struct __pyx_obj_ return __pyx_r; } -/* "gedlibpy.pyx":722 +/* "gedlibpy.pyx":730 * * * def get_node_map(self, g, h) : # <<<<<<<<<<<<<< @@ -7061,11 +7063,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_71get_node_map(PyObject *__pyx_v_sel case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_node_map", 1, 2, 2, 1); __PYX_ERR(0, 722, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_map", 1, 2, 2, 1); __PYX_ERR(0, 730, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_node_map") < 0)) __PYX_ERR(0, 722, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_node_map") < 0)) __PYX_ERR(0, 730, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -7078,7 +7080,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_71get_node_map(PyObject *__pyx_v_sel } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_node_map", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 722, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_map", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 730, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_node_map", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -7125,41 +7127,41 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged Py_ssize_t __pyx_t_17; __Pyx_RefNannySetupContext("get_node_map", 0); - /* "gedlibpy.pyx":737 + /* "gedlibpy.pyx":745 * .. note:: This function creates datas so use it if necessary, however you can understand how assignement works with this example. * """ * map_as_relation = self.c_env.getNodeMap(g, h) # <<<<<<<<<<<<<< * induced_cost = self.c_env.getInducedCost(g, h) # @todo: the C++ implementation for this function in GedLibBind.ipp re-call get_node_map() once more, this is not neccessary. * source_map = [item.first if item.first < len(map_as_relation) else np.inf for item in map_as_relation] # item.first < len(map_as_relation) is not exactly correct. */ - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 737, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 737, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 745, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 745, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getNodeMap(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 737, __pyx_L1_error) + __PYX_ERR(0, 745, __pyx_L1_error) } __pyx_v_map_as_relation = __pyx_t_3; - /* "gedlibpy.pyx":738 + /* "gedlibpy.pyx":746 * """ * map_as_relation = self.c_env.getNodeMap(g, h) * induced_cost = self.c_env.getInducedCost(g, h) # @todo: the C++ implementation for this function in GedLibBind.ipp re-call get_node_map() once more, this is not neccessary. # <<<<<<<<<<<<<< * source_map = [item.first if item.first < len(map_as_relation) else np.inf for item in map_as_relation] # item.first < len(map_as_relation) is not exactly correct. * # print(source_map) */ - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 738, __pyx_L1_error) - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 738, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 746, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 746, __pyx_L1_error) try { __pyx_t_4 = __pyx_v_self->c_env->getInducedCost(__pyx_t_2, __pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 738, __pyx_L1_error) + __PYX_ERR(0, 746, __pyx_L1_error) } __pyx_v_induced_cost = __pyx_t_4; - /* "gedlibpy.pyx":739 + /* "gedlibpy.pyx":747 * map_as_relation = self.c_env.getNodeMap(g, h) * induced_cost = self.c_env.getInducedCost(g, h) # @todo: the C++ implementation for this function in GedLibBind.ipp re-call get_node_map() once more, this is not neccessary. * source_map = [item.first if item.first < len(map_as_relation) else np.inf for item in map_as_relation] # item.first < len(map_as_relation) is not exactly correct. # <<<<<<<<<<<<<< @@ -7167,7 +7169,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged * target_map = [item.second if item.second < len(map_as_relation) else np.inf for item in map_as_relation] */ { /* enter inner scope */ - __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 739, __pyx_L1_error) + __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 747, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __pyx_v_map_as_relation.begin(); for (;;) { @@ -7175,32 +7177,32 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged __pyx_t_7 = *__pyx_t_6; ++__pyx_t_6; __pyx_8genexpr5__pyx_v_item = __pyx_t_7; - __pyx_t_9 = __pyx_convert_vector_to_py_std_3a__3a_pair_3c_size_t_2c_size_t_3e___(__pyx_v_map_as_relation); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 739, __pyx_L1_error) + __pyx_t_9 = __pyx_convert_vector_to_py_std_3a__3a_pair_3c_size_t_2c_size_t_3e___(__pyx_v_map_as_relation); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 747, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_10 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 739, __pyx_L1_error) + __pyx_t_10 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 747, __pyx_L1_error) __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (((__pyx_8genexpr5__pyx_v_item.first < __pyx_t_10) != 0)) { - __pyx_t_9 = __Pyx_PyInt_FromSize_t(__pyx_8genexpr5__pyx_v_item.first); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 739, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyInt_FromSize_t(__pyx_8genexpr5__pyx_v_item.first); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 747, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_8 = __pyx_t_9; __pyx_t_9 = 0; } else { - __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 739, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 747, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_inf); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 739, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_inf); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 747, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_8 = __pyx_t_11; __pyx_t_11 = 0; } - if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_t_8))) __PYX_ERR(0, 739, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_t_8))) __PYX_ERR(0, 747, __pyx_L1_error) __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } } /* exit inner scope */ __pyx_v_source_map = ((PyObject*)__pyx_t_5); __pyx_t_5 = 0; - /* "gedlibpy.pyx":741 + /* "gedlibpy.pyx":749 * source_map = [item.first if item.first < len(map_as_relation) else np.inf for item in map_as_relation] # item.first < len(map_as_relation) is not exactly correct. * # print(source_map) * target_map = [item.second if item.second < len(map_as_relation) else np.inf for item in map_as_relation] # <<<<<<<<<<<<<< @@ -7208,7 +7210,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged * num_node_source = len([item for item in source_map if item != np.inf]) */ { /* enter inner scope */ - __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 741, __pyx_L1_error) + __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 749, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __pyx_v_map_as_relation.begin(); for (;;) { @@ -7216,32 +7218,32 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged __pyx_t_7 = *__pyx_t_6; ++__pyx_t_6; __pyx_8genexpr6__pyx_v_item = __pyx_t_7; - __pyx_t_11 = __pyx_convert_vector_to_py_std_3a__3a_pair_3c_size_t_2c_size_t_3e___(__pyx_v_map_as_relation); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 741, __pyx_L1_error) + __pyx_t_11 = __pyx_convert_vector_to_py_std_3a__3a_pair_3c_size_t_2c_size_t_3e___(__pyx_v_map_as_relation); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 749, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); - __pyx_t_10 = PyObject_Length(__pyx_t_11); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 741, __pyx_L1_error) + __pyx_t_10 = PyObject_Length(__pyx_t_11); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 749, __pyx_L1_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; if (((__pyx_8genexpr6__pyx_v_item.second < __pyx_t_10) != 0)) { - __pyx_t_11 = __Pyx_PyInt_FromSize_t(__pyx_8genexpr6__pyx_v_item.second); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 741, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyInt_FromSize_t(__pyx_8genexpr6__pyx_v_item.second); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 749, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_8 = __pyx_t_11; __pyx_t_11 = 0; } else { - __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 741, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 749, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_inf); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 741, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_inf); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 749, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_t_8 = __pyx_t_9; __pyx_t_9 = 0; } - if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_t_8))) __PYX_ERR(0, 741, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_t_8))) __PYX_ERR(0, 749, __pyx_L1_error) __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } } /* exit inner scope */ __pyx_v_target_map = ((PyObject*)__pyx_t_5); __pyx_t_5 = 0; - /* "gedlibpy.pyx":743 + /* "gedlibpy.pyx":751 * target_map = [item.second if item.second < len(map_as_relation) else np.inf for item in map_as_relation] * # print(target_map) * num_node_source = len([item for item in source_map if item != np.inf]) # <<<<<<<<<<<<<< @@ -7249,30 +7251,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged * num_node_target = len([item for item in target_map if item != np.inf]) */ { /* enter inner scope */ - __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 743, __pyx_L9_error) + __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 751, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_8 = __pyx_v_source_map; __Pyx_INCREF(__pyx_t_8); __pyx_t_10 = 0; for (;;) { if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_8)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_10); __Pyx_INCREF(__pyx_t_9); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 743, __pyx_L9_error) + __pyx_t_9 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_10); __Pyx_INCREF(__pyx_t_9); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 751, __pyx_L9_error) #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_8, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 743, __pyx_L9_error) + __pyx_t_9 = PySequence_ITEM(__pyx_t_8, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 751, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_9); #endif __Pyx_XDECREF_SET(__pyx_8genexpr7__pyx_v_item, __pyx_t_9); __pyx_t_9 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 743, __pyx_L9_error) + __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 751, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_inf); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 743, __pyx_L9_error) + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_inf); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 751, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_t_9 = PyObject_RichCompare(__pyx_8genexpr7__pyx_v_item, __pyx_t_11, Py_NE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 743, __pyx_L9_error) + __pyx_t_9 = PyObject_RichCompare(__pyx_8genexpr7__pyx_v_item, __pyx_t_11, Py_NE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 751, __pyx_L9_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_12 < 0)) __PYX_ERR(0, 743, __pyx_L9_error) + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_12 < 0)) __PYX_ERR(0, 751, __pyx_L9_error) __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (__pyx_t_12) { - if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_8genexpr7__pyx_v_item))) __PYX_ERR(0, 743, __pyx_L9_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_8genexpr7__pyx_v_item))) __PYX_ERR(0, 751, __pyx_L9_error) } } __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; @@ -7283,11 +7285,11 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged goto __pyx_L1_error; __pyx_L13_exit_scope:; } /* exit inner scope */ - __pyx_t_10 = PyList_GET_SIZE(__pyx_t_5); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 743, __pyx_L1_error) + __pyx_t_10 = PyList_GET_SIZE(__pyx_t_5); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 751, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_num_node_source = __pyx_t_10; - /* "gedlibpy.pyx":745 + /* "gedlibpy.pyx":753 * num_node_source = len([item for item in source_map if item != np.inf]) * # print(num_node_source) * num_node_target = len([item for item in target_map if item != np.inf]) # <<<<<<<<<<<<<< @@ -7295,30 +7297,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged * */ { /* enter inner scope */ - __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 745, __pyx_L16_error) + __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 753, __pyx_L16_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_8 = __pyx_v_target_map; __Pyx_INCREF(__pyx_t_8); __pyx_t_10 = 0; for (;;) { if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_8)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_10); __Pyx_INCREF(__pyx_t_9); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 745, __pyx_L16_error) + __pyx_t_9 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_10); __Pyx_INCREF(__pyx_t_9); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 753, __pyx_L16_error) #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_8, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 745, __pyx_L16_error) + __pyx_t_9 = PySequence_ITEM(__pyx_t_8, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 753, __pyx_L16_error) __Pyx_GOTREF(__pyx_t_9); #endif __Pyx_XDECREF_SET(__pyx_8genexpr8__pyx_v_item, __pyx_t_9); __pyx_t_9 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 745, __pyx_L16_error) + __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 753, __pyx_L16_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_inf); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 745, __pyx_L16_error) + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_inf); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 753, __pyx_L16_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_t_9 = PyObject_RichCompare(__pyx_8genexpr8__pyx_v_item, __pyx_t_11, Py_NE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 745, __pyx_L16_error) + __pyx_t_9 = PyObject_RichCompare(__pyx_8genexpr8__pyx_v_item, __pyx_t_11, Py_NE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 753, __pyx_L16_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_12 < 0)) __PYX_ERR(0, 745, __pyx_L16_error) + __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_12 < 0)) __PYX_ERR(0, 753, __pyx_L16_error) __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (__pyx_t_12) { - if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_8genexpr8__pyx_v_item))) __PYX_ERR(0, 745, __pyx_L16_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_8genexpr8__pyx_v_item))) __PYX_ERR(0, 753, __pyx_L16_error) } } __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; @@ -7329,22 +7331,22 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged goto __pyx_L1_error; __pyx_L20_exit_scope:; } /* exit inner scope */ - __pyx_t_10 = PyList_GET_SIZE(__pyx_t_5); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 745, __pyx_L1_error) + __pyx_t_10 = PyList_GET_SIZE(__pyx_t_5); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 753, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_num_node_target = __pyx_t_10; - /* "gedlibpy.pyx":748 + /* "gedlibpy.pyx":756 * # print(num_node_target) * * node_map = NodeMap(num_node_source, num_node_target) # <<<<<<<<<<<<<< * # print(node_map.get_forward_map(), node_map.get_backward_map()) * for i in range(len(source_map)): */ - __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_NodeMap); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 748, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_NodeMap); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 756, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_num_node_source); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 748, __pyx_L1_error) + __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_num_node_source); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 756, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_11 = PyInt_FromSsize_t(__pyx_v_num_node_target); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 748, __pyx_L1_error) + __pyx_t_11 = PyInt_FromSsize_t(__pyx_v_num_node_target); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 756, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_13 = NULL; __pyx_t_14 = 0; @@ -7361,7 +7363,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_8)) { PyObject *__pyx_temp[3] = {__pyx_t_13, __pyx_t_9, __pyx_t_11}; - __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 748, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 756, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; @@ -7371,7 +7373,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_8)) { PyObject *__pyx_temp[3] = {__pyx_t_13, __pyx_t_9, __pyx_t_11}; - __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 748, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 756, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; @@ -7379,7 +7381,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged } else #endif { - __pyx_t_15 = PyTuple_New(2+__pyx_t_14); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 748, __pyx_L1_error) + __pyx_t_15 = PyTuple_New(2+__pyx_t_14); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 756, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); if (__pyx_t_13) { __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_13); __pyx_t_13 = NULL; @@ -7390,7 +7392,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged PyTuple_SET_ITEM(__pyx_t_15, 1+__pyx_t_14, __pyx_t_11); __pyx_t_9 = 0; __pyx_t_11 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_15, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 748, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_15, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 756, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; } @@ -7398,30 +7400,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged __pyx_v_node_map = __pyx_t_5; __pyx_t_5 = 0; - /* "gedlibpy.pyx":750 + /* "gedlibpy.pyx":758 * node_map = NodeMap(num_node_source, num_node_target) * # print(node_map.get_forward_map(), node_map.get_backward_map()) * for i in range(len(source_map)): # <<<<<<<<<<<<<< * node_map.add_assignment(source_map[i], target_map[i]) * node_map.set_induced_cost(induced_cost) */ - __pyx_t_10 = PyList_GET_SIZE(__pyx_v_source_map); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 750, __pyx_L1_error) + __pyx_t_10 = PyList_GET_SIZE(__pyx_v_source_map); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 758, __pyx_L1_error) __pyx_t_16 = __pyx_t_10; for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) { __pyx_v_i = __pyx_t_17; - /* "gedlibpy.pyx":751 + /* "gedlibpy.pyx":759 * # print(node_map.get_forward_map(), node_map.get_backward_map()) * for i in range(len(source_map)): * node_map.add_assignment(source_map[i], target_map[i]) # <<<<<<<<<<<<<< * node_map.set_induced_cost(induced_cost) * */ - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_map, __pyx_n_s_add_assignment); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 751, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_map, __pyx_n_s_add_assignment); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 759, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_15 = __Pyx_GetItemInt_List(__pyx_v_source_map, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 751, __pyx_L1_error) + __pyx_t_15 = __Pyx_GetItemInt_List(__pyx_v_source_map, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 759, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); - __pyx_t_11 = __Pyx_GetItemInt_List(__pyx_v_target_map, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 751, __pyx_L1_error) + __pyx_t_11 = __Pyx_GetItemInt_List(__pyx_v_target_map, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 759, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_9 = NULL; __pyx_t_14 = 0; @@ -7438,7 +7440,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_8)) { PyObject *__pyx_temp[3] = {__pyx_t_9, __pyx_t_15, __pyx_t_11}; - __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 751, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 759, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; @@ -7448,7 +7450,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_8)) { PyObject *__pyx_temp[3] = {__pyx_t_9, __pyx_t_15, __pyx_t_11}; - __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 751, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 759, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; @@ -7456,7 +7458,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged } else #endif { - __pyx_t_13 = PyTuple_New(2+__pyx_t_14); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 751, __pyx_L1_error) + __pyx_t_13 = PyTuple_New(2+__pyx_t_14); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 759, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_13); if (__pyx_t_9) { __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9); __pyx_t_9 = NULL; @@ -7467,7 +7469,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_14, __pyx_t_11); __pyx_t_15 = 0; __pyx_t_11 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 751, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 759, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; } @@ -7475,16 +7477,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } - /* "gedlibpy.pyx":752 + /* "gedlibpy.pyx":760 * for i in range(len(source_map)): * node_map.add_assignment(source_map[i], target_map[i]) * node_map.set_induced_cost(induced_cost) # <<<<<<<<<<<<<< * * return node_map */ - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_map, __pyx_n_s_set_induced_cost); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 752, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_map, __pyx_n_s_set_induced_cost); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 760, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_13 = PyFloat_FromDouble(__pyx_v_induced_cost); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 752, __pyx_L1_error) + __pyx_t_13 = PyFloat_FromDouble(__pyx_v_induced_cost); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 760, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_13); __pyx_t_11 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { @@ -7499,12 +7501,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged __pyx_t_5 = (__pyx_t_11) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_11, __pyx_t_13) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_13); __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; - if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 752, __pyx_L1_error) + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 760, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - /* "gedlibpy.pyx":754 + /* "gedlibpy.pyx":762 * node_map.set_induced_cost(induced_cost) * * return node_map # <<<<<<<<<<<<<< @@ -7516,7 +7518,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged __pyx_r = __pyx_v_node_map; goto __pyx_L0; - /* "gedlibpy.pyx":722 + /* "gedlibpy.pyx":730 * * * def get_node_map(self, g, h) : # <<<<<<<<<<<<<< @@ -7545,7 +7547,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_70get_node_map(struct __pyx_obj_8ged return __pyx_r; } -/* "gedlibpy.pyx":757 +/* "gedlibpy.pyx":765 * * * def get_assignment_matrix(self, g, h) : # <<<<<<<<<<<<<< @@ -7585,11 +7587,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_73get_assignment_matrix(PyObject *__ case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_assignment_matrix", 1, 2, 2, 1); __PYX_ERR(0, 757, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_assignment_matrix", 1, 2, 2, 1); __PYX_ERR(0, 765, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_assignment_matrix") < 0)) __PYX_ERR(0, 757, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_assignment_matrix") < 0)) __PYX_ERR(0, 765, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -7602,7 +7604,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_73get_assignment_matrix(PyObject *__ } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_assignment_matrix", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 757, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_assignment_matrix", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 765, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_assignment_matrix", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -7624,7 +7626,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_72get_assignment_matrix(struct __pyx PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("get_assignment_matrix", 0); - /* "gedlibpy.pyx":772 + /* "gedlibpy.pyx":780 * .. note:: This function creates datas so use it if necessary. * """ * return self.c_env.getAssignmentMatrix(g, h) # <<<<<<<<<<<<<< @@ -7632,21 +7634,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_72get_assignment_matrix(struct __pyx * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 772, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 772, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 780, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 780, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getAssignmentMatrix(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 772, __pyx_L1_error) + __PYX_ERR(0, 780, __pyx_L1_error) } - __pyx_t_4 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_int_3e___(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 772, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_int_3e___(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 780, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":757 + /* "gedlibpy.pyx":765 * * * def get_assignment_matrix(self, g, h) : # <<<<<<<<<<<<<< @@ -7665,7 +7667,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_72get_assignment_matrix(struct __pyx return __pyx_r; } -/* "gedlibpy.pyx":775 +/* "gedlibpy.pyx":783 * * * def get_all_map(self, g, h) : # <<<<<<<<<<<<<< @@ -7705,11 +7707,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_75get_all_map(PyObject *__pyx_v_self case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_all_map", 1, 2, 2, 1); __PYX_ERR(0, 775, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_all_map", 1, 2, 2, 1); __PYX_ERR(0, 783, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_map") < 0)) __PYX_ERR(0, 775, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_map") < 0)) __PYX_ERR(0, 783, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -7722,7 +7724,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_75get_all_map(PyObject *__pyx_v_self } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_all_map", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 775, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_all_map", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 783, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_all_map", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -7744,7 +7746,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_74get_all_map(struct __pyx_obj_8gedl PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("get_all_map", 0); - /* "gedlibpy.pyx":790 + /* "gedlibpy.pyx":798 * .. note:: This function duplicates data so please don't use it. I also don't know how to connect the two map to reconstruct the adjacence matrix. Please come back when I know how it's work ! * """ * return self.c_env.getAllMap(g, h) # <<<<<<<<<<<<<< @@ -7752,21 +7754,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_74get_all_map(struct __pyx_obj_8gedl * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 790, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 790, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 798, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 798, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getAllMap(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 790, __pyx_L1_error) + __PYX_ERR(0, 798, __pyx_L1_error) } - __pyx_t_4 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_npy_uint64_3e___(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 790, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_npy_uint64_3e___(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 798, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":775 + /* "gedlibpy.pyx":783 * * * def get_all_map(self, g, h) : # <<<<<<<<<<<<<< @@ -7785,7 +7787,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_74get_all_map(struct __pyx_obj_8gedl return __pyx_r; } -/* "gedlibpy.pyx":793 +/* "gedlibpy.pyx":801 * * * def get_runtime(self, g, h) : # <<<<<<<<<<<<<< @@ -7825,11 +7827,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_77get_runtime(PyObject *__pyx_v_self case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_runtime", 1, 2, 2, 1); __PYX_ERR(0, 793, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_runtime", 1, 2, 2, 1); __PYX_ERR(0, 801, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_runtime") < 0)) __PYX_ERR(0, 793, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_runtime") < 0)) __PYX_ERR(0, 801, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -7842,7 +7844,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_77get_runtime(PyObject *__pyx_v_self } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_runtime", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 793, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_runtime", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 801, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_runtime", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -7864,7 +7866,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_76get_runtime(struct __pyx_obj_8gedl PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("get_runtime", 0); - /* "gedlibpy.pyx":808 + /* "gedlibpy.pyx":816 * .. note:: Python is a bit longer than C++ due to the functions's encapsulate. * """ * return self.c_env.getRuntime(g,h) # <<<<<<<<<<<<<< @@ -7872,21 +7874,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_76get_runtime(struct __pyx_obj_8gedl * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 808, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 808, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_As_size_t(__pyx_v_g); if (unlikely((__pyx_t_1 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 816, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_size_t(__pyx_v_h); if (unlikely((__pyx_t_2 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 816, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->c_env->getRuntime(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 808, __pyx_L1_error) + __PYX_ERR(0, 816, __pyx_L1_error) } - __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 808, __pyx_L1_error) + __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 816, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":793 + /* "gedlibpy.pyx":801 * * * def get_runtime(self, g, h) : # <<<<<<<<<<<<<< @@ -7905,7 +7907,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_76get_runtime(struct __pyx_obj_8gedl return __pyx_r; } -/* "gedlibpy.pyx":811 +/* "gedlibpy.pyx":819 * * * def quasimetric_cost(self) : # <<<<<<<<<<<<<< @@ -7934,7 +7936,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_78quasimetric_cost(struct __pyx_obj_ PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("quasimetric_cost", 0); - /* "gedlibpy.pyx":825 + /* "gedlibpy.pyx":833 * .. warning:: run_method() between the same two graph must be called before this function. * """ * return self.c_env.quasimetricCosts() # <<<<<<<<<<<<<< @@ -7946,15 +7948,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_78quasimetric_cost(struct __pyx_obj_ __pyx_t_1 = __pyx_v_self->c_env->quasimetricCosts(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 825, __pyx_L1_error) + __PYX_ERR(0, 833, __pyx_L1_error) } - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 825, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 833, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":811 + /* "gedlibpy.pyx":819 * * * def quasimetric_cost(self) : # <<<<<<<<<<<<<< @@ -7973,7 +7975,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_78quasimetric_cost(struct __pyx_obj_ return __pyx_r; } -/* "gedlibpy.pyx":828 +/* "gedlibpy.pyx":836 * * * def hungarian_LSAP(self, matrix_cost) : # <<<<<<<<<<<<<< @@ -8003,7 +8005,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_80hungarian_LSAP(struct __pyx_obj_8g PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("hungarian_LSAP", 0); - /* "gedlibpy.pyx":839 + /* "gedlibpy.pyx":847 * .. seealso:: hungarian_LSAPE() * """ * return self.c_env.hungarianLSAP(matrix_cost) # <<<<<<<<<<<<<< @@ -8011,20 +8013,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_80hungarian_LSAP(struct __pyx_obj_8g * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_convert_vector_from_py_std_3a__3a_vector_3c_size_t_3e___(__pyx_v_matrix_cost); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 839, __pyx_L1_error) + __pyx_t_1 = __pyx_convert_vector_from_py_std_3a__3a_vector_3c_size_t_3e___(__pyx_v_matrix_cost); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 847, __pyx_L1_error) try { __pyx_t_2 = __pyx_v_self->c_env->hungarianLSAP(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 839, __pyx_L1_error) + __PYX_ERR(0, 847, __pyx_L1_error) } - __pyx_t_3 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_size_t_3e___(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 839, __pyx_L1_error) + __pyx_t_3 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_size_t_3e___(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 847, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":828 + /* "gedlibpy.pyx":836 * * * def hungarian_LSAP(self, matrix_cost) : # <<<<<<<<<<<<<< @@ -8043,7 +8045,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_80hungarian_LSAP(struct __pyx_obj_8g return __pyx_r; } -/* "gedlibpy.pyx":842 +/* "gedlibpy.pyx":850 * * * def hungarian_LSAPE(self, matrix_cost) : # <<<<<<<<<<<<<< @@ -8073,7 +8075,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_82hungarian_LSAPE(struct __pyx_obj_8 PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("hungarian_LSAPE", 0); - /* "gedlibpy.pyx":853 + /* "gedlibpy.pyx":861 * .. seealso:: hungarian_LSAP() * """ * return self.c_env.hungarianLSAPE(matrix_cost) # <<<<<<<<<<<<<< @@ -8081,20 +8083,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_82hungarian_LSAPE(struct __pyx_obj_8 * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_convert_vector_from_py_std_3a__3a_vector_3c_double_3e___(__pyx_v_matrix_cost); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 853, __pyx_L1_error) + __pyx_t_1 = __pyx_convert_vector_from_py_std_3a__3a_vector_3c_double_3e___(__pyx_v_matrix_cost); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 861, __pyx_L1_error) try { __pyx_t_2 = __pyx_v_self->c_env->hungarianLSAPE(__pyx_t_1); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 853, __pyx_L1_error) + __PYX_ERR(0, 861, __pyx_L1_error) } - __pyx_t_3 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_double_3e___(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 853, __pyx_L1_error) + __pyx_t_3 = __pyx_convert_vector_to_py_std_3a__3a_vector_3c_double_3e___(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 861, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":842 + /* "gedlibpy.pyx":850 * * * def hungarian_LSAPE(self, matrix_cost) : # <<<<<<<<<<<<<< @@ -8113,7 +8115,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_82hungarian_LSAPE(struct __pyx_obj_8 return __pyx_r; } -/* "gedlibpy.pyx":856 +/* "gedlibpy.pyx":864 * * * def add_random_graph(self, name, classe, list_of_nodes, list_of_edges, ignore_duplicates=True) : # <<<<<<<<<<<<<< @@ -8163,19 +8165,19 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_85add_random_graph(PyObject *__pyx_v case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_classe)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_random_graph", 0, 4, 5, 1); __PYX_ERR(0, 856, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_random_graph", 0, 4, 5, 1); __PYX_ERR(0, 864, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_list_of_nodes)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_random_graph", 0, 4, 5, 2); __PYX_ERR(0, 856, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_random_graph", 0, 4, 5, 2); __PYX_ERR(0, 864, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_list_of_edges)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_random_graph", 0, 4, 5, 3); __PYX_ERR(0, 856, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_random_graph", 0, 4, 5, 3); __PYX_ERR(0, 864, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: @@ -8185,7 +8187,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_85add_random_graph(PyObject *__pyx_v } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_random_graph") < 0)) __PYX_ERR(0, 856, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_random_graph") < 0)) __PYX_ERR(0, 864, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -8207,7 +8209,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_85add_random_graph(PyObject *__pyx_v } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("add_random_graph", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 856, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_random_graph", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 864, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.add_random_graph", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -8239,14 +8241,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ PyObject *__pyx_t_11 = NULL; __Pyx_RefNannySetupContext("add_random_graph", 0); - /* "gedlibpy.pyx":876 + /* "gedlibpy.pyx":884 * * """ * id = self.add_graph(name, classe) # <<<<<<<<<<<<<< * for node in list_of_nodes: * self.add_node(id, node[0], node[1]) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_graph); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 876, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_graph); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 884, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_4 = 0; @@ -8263,7 +8265,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_name, __pyx_v_classe}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 876, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 884, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -8271,13 +8273,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_name, __pyx_v_classe}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 876, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 884, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 876, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 884, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL; @@ -8288,7 +8290,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ __Pyx_INCREF(__pyx_v_classe); __Pyx_GIVEREF(__pyx_v_classe); PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_classe); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 876, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 884, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } @@ -8296,7 +8298,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ __pyx_v_id = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":877 + /* "gedlibpy.pyx":885 * """ * id = self.add_graph(name, classe) * for node in list_of_nodes: # <<<<<<<<<<<<<< @@ -8307,26 +8309,26 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ __pyx_t_1 = __pyx_v_list_of_nodes; __Pyx_INCREF(__pyx_t_1); __pyx_t_6 = 0; __pyx_t_7 = NULL; } else { - __pyx_t_6 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_list_of_nodes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 877, __pyx_L1_error) + __pyx_t_6 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_list_of_nodes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 885, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 877, __pyx_L1_error) + __pyx_t_7 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 885, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_7)) { if (likely(PyList_CheckExact(__pyx_t_1))) { if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 877, __pyx_L1_error) + __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 885, __pyx_L1_error) #else - __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 877, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 885, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); #endif } else { if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 877, __pyx_L1_error) + __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 885, __pyx_L1_error) #else - __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 877, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 885, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); #endif } @@ -8336,7 +8338,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 877, __pyx_L1_error) + else __PYX_ERR(0, 885, __pyx_L1_error) } break; } @@ -8345,18 +8347,18 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ __Pyx_XDECREF_SET(__pyx_v_node, __pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":878 + /* "gedlibpy.pyx":886 * id = self.add_graph(name, classe) * for node in list_of_nodes: * self.add_node(id, node[0], node[1]) # <<<<<<<<<<<<<< * for edge in list_of_edges: * self.add_edge(id, edge[0], edge[1], edge[2], ignore_duplicates) */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_node); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 878, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_node); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 886, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_node, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 878, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_node, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 886, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_node, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 878, __pyx_L1_error) + __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_node, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 886, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = NULL; __pyx_t_4 = 0; @@ -8373,7 +8375,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_v_id, __pyx_t_3, __pyx_t_8}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_4, 3+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 878, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_4, 3+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 886, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -8383,7 +8385,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_v_id, __pyx_t_3, __pyx_t_8}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_4, 3+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 878, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_4, 3+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 886, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -8391,7 +8393,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ } else #endif { - __pyx_t_10 = PyTuple_New(3+__pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 878, __pyx_L1_error) + __pyx_t_10 = PyTuple_New(3+__pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 886, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); if (__pyx_t_9) { __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9); __pyx_t_9 = NULL; @@ -8405,14 +8407,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ PyTuple_SET_ITEM(__pyx_t_10, 2+__pyx_t_4, __pyx_t_8); __pyx_t_3 = 0; __pyx_t_8 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 878, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 886, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":877 + /* "gedlibpy.pyx":885 * """ * id = self.add_graph(name, classe) * for node in list_of_nodes: # <<<<<<<<<<<<<< @@ -8422,7 +8424,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":879 + /* "gedlibpy.pyx":887 * for node in list_of_nodes: * self.add_node(id, node[0], node[1]) * for edge in list_of_edges: # <<<<<<<<<<<<<< @@ -8433,26 +8435,26 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ __pyx_t_1 = __pyx_v_list_of_edges; __Pyx_INCREF(__pyx_t_1); __pyx_t_6 = 0; __pyx_t_7 = NULL; } else { - __pyx_t_6 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_list_of_edges); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 879, __pyx_L1_error) + __pyx_t_6 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_list_of_edges); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 887, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 879, __pyx_L1_error) + __pyx_t_7 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 887, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_7)) { if (likely(PyList_CheckExact(__pyx_t_1))) { if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 879, __pyx_L1_error) + __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 887, __pyx_L1_error) #else - __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 879, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 887, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); #endif } else { if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 879, __pyx_L1_error) + __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 887, __pyx_L1_error) #else - __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 879, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 887, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); #endif } @@ -8462,7 +8464,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 879, __pyx_L1_error) + else __PYX_ERR(0, 887, __pyx_L1_error) } break; } @@ -8471,20 +8473,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ __Pyx_XDECREF_SET(__pyx_v_edge, __pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":880 + /* "gedlibpy.pyx":888 * self.add_node(id, node[0], node[1]) * for edge in list_of_edges: * self.add_edge(id, edge[0], edge[1], edge[2], ignore_duplicates) # <<<<<<<<<<<<<< * return id * */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_edge); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 880, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_edge); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 880, __pyx_L1_error) + __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 880, __pyx_L1_error) + __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_edge, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 880, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_edge, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_9 = NULL; __pyx_t_4 = 0; @@ -8501,7 +8503,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[6] = {__pyx_t_9, __pyx_v_id, __pyx_t_10, __pyx_t_8, __pyx_t_3, __pyx_v_ignore_duplicates}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_4, 5+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 880, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_4, 5+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 888, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; @@ -8512,7 +8514,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[6] = {__pyx_t_9, __pyx_v_id, __pyx_t_10, __pyx_t_8, __pyx_t_3, __pyx_v_ignore_duplicates}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_4, 5+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 880, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_4, 5+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 888, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; @@ -8521,7 +8523,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ } else #endif { - __pyx_t_11 = PyTuple_New(5+__pyx_t_4); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 880, __pyx_L1_error) + __pyx_t_11 = PyTuple_New(5+__pyx_t_4); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); if (__pyx_t_9) { __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL; @@ -8541,14 +8543,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ __pyx_t_10 = 0; __pyx_t_8 = 0; __pyx_t_3 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_11, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 880, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_11, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; } __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":879 + /* "gedlibpy.pyx":887 * for node in list_of_nodes: * self.add_node(id, node[0], node[1]) * for edge in list_of_edges: # <<<<<<<<<<<<<< @@ -8558,7 +8560,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":881 + /* "gedlibpy.pyx":889 * for edge in list_of_edges: * self.add_edge(id, edge[0], edge[1], edge[2], ignore_duplicates) * return id # <<<<<<<<<<<<<< @@ -8570,7 +8572,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ __pyx_r = __pyx_v_id; goto __pyx_L0; - /* "gedlibpy.pyx":856 + /* "gedlibpy.pyx":864 * * * def add_random_graph(self, name, classe, list_of_nodes, list_of_edges, ignore_duplicates=True) : # <<<<<<<<<<<<<< @@ -8599,7 +8601,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_84add_random_graph(struct __pyx_obj_ return __pyx_r; } -/* "gedlibpy.pyx":884 +/* "gedlibpy.pyx":892 * * * def add_nx_graph(self, g, classe, ignore_duplicates=True) : # <<<<<<<<<<<<<< @@ -8643,7 +8645,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_87add_nx_graph(PyObject *__pyx_v_sel case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_classe)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("add_nx_graph", 0, 2, 3, 1); __PYX_ERR(0, 884, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_nx_graph", 0, 2, 3, 1); __PYX_ERR(0, 892, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: @@ -8653,7 +8655,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_87add_nx_graph(PyObject *__pyx_v_sel } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_nx_graph") < 0)) __PYX_ERR(0, 884, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_nx_graph") < 0)) __PYX_ERR(0, 892, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -8671,7 +8673,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_87add_nx_graph(PyObject *__pyx_v_sel } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("add_nx_graph", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 884, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("add_nx_graph", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 892, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.add_nx_graph", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -8706,16 +8708,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged PyObject *__pyx_t_14 = NULL; __Pyx_RefNannySetupContext("add_nx_graph", 0); - /* "gedlibpy.pyx":898 + /* "gedlibpy.pyx":906 * * """ * id = self.add_graph(g.name, classe) # <<<<<<<<<<<<<< * for node in g.nodes: * self.add_node(id, str(node), g.nodes[node]) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_graph); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 898, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_graph); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 906, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_name); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 898, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_name); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 906, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; @@ -8732,7 +8734,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_3, __pyx_v_classe}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 898, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 906, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -8741,14 +8743,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_3, __pyx_v_classe}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 898, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 906, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } else #endif { - __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 898, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 906, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -8759,7 +8761,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged __Pyx_GIVEREF(__pyx_v_classe); PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_classe); __pyx_t_3 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 898, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 906, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } @@ -8767,22 +8769,22 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged __pyx_v_id = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":899 + /* "gedlibpy.pyx":907 * """ * id = self.add_graph(g.name, classe) * for node in g.nodes: # <<<<<<<<<<<<<< * self.add_node(id, str(node), g.nodes[node]) * for edge in g.edges: */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_nodes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 899, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_nodes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 907, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) { __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0; __pyx_t_8 = NULL; } else { - __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 899, __pyx_L1_error) + __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 907, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 899, __pyx_L1_error) + __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 907, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; for (;;) { @@ -8790,17 +8792,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged if (likely(PyList_CheckExact(__pyx_t_2))) { if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 899, __pyx_L1_error) + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 907, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 899, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 907, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } else { if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 899, __pyx_L1_error) + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 907, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 899, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 907, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } @@ -8810,7 +8812,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 899, __pyx_L1_error) + else __PYX_ERR(0, 907, __pyx_L1_error) } break; } @@ -8819,20 +8821,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged __Pyx_XDECREF_SET(__pyx_v_node, __pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":900 + /* "gedlibpy.pyx":908 * id = self.add_graph(g.name, classe) * for node in g.nodes: * self.add_node(id, str(node), g.nodes[node]) # <<<<<<<<<<<<<< * for edge in g.edges: * self.add_edge(id, str(edge[0]), str(edge[1]), g.get_edge_data(edge[0], edge[1]), ignore_duplicates) */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_node); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 900, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_node); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 908, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_node); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 900, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_node); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 908, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_nodes); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 900, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_nodes); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 908, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_9 = __Pyx_PyObject_GetItem(__pyx_t_4, __pyx_v_node); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 900, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetItem(__pyx_t_4, __pyx_v_node); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 908, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; @@ -8850,7 +8852,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_id, __pyx_t_3, __pyx_t_9}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 900, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 908, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -8860,7 +8862,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_id, __pyx_t_3, __pyx_t_9}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 900, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 908, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -8868,7 +8870,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged } else #endif { - __pyx_t_10 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 900, __pyx_L1_error) + __pyx_t_10 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 908, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -8882,14 +8884,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged PyTuple_SET_ITEM(__pyx_t_10, 2+__pyx_t_5, __pyx_t_9); __pyx_t_3 = 0; __pyx_t_9 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 900, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 908, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":899 + /* "gedlibpy.pyx":907 * """ * id = self.add_graph(g.name, classe) * for node in g.nodes: # <<<<<<<<<<<<<< @@ -8899,22 +8901,22 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":901 + /* "gedlibpy.pyx":909 * for node in g.nodes: * self.add_node(id, str(node), g.nodes[node]) * for edge in g.edges: # <<<<<<<<<<<<<< * self.add_edge(id, str(edge[0]), str(edge[1]), g.get_edge_data(edge[0], edge[1]), ignore_duplicates) * return id */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_edges); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 901, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_edges); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 909, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) { __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0; __pyx_t_8 = NULL; } else { - __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 901, __pyx_L1_error) + __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 909, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 901, __pyx_L1_error) + __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 909, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; for (;;) { @@ -8922,17 +8924,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged if (likely(PyList_CheckExact(__pyx_t_1))) { if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 901, __pyx_L1_error) + __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 909, __pyx_L1_error) #else - __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 901, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 909, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); #endif } else { if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 901, __pyx_L1_error) + __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 909, __pyx_L1_error) #else - __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 901, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 909, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); #endif } @@ -8942,7 +8944,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 901, __pyx_L1_error) + else __PYX_ERR(0, 909, __pyx_L1_error) } break; } @@ -8951,30 +8953,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged __Pyx_XDECREF_SET(__pyx_v_edge, __pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":902 + /* "gedlibpy.pyx":910 * self.add_node(id, str(node), g.nodes[node]) * for edge in g.edges: * self.add_edge(id, str(edge[0]), str(edge[1]), g.get_edge_data(edge[0], edge[1]), ignore_duplicates) # <<<<<<<<<<<<<< * return id * */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_edge); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_edge); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_9 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_10); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_10); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_10); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_10); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_get_edge_data); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_g, __pyx_n_s_get_edge_data); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_11 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_11 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); - __pyx_t_12 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_12 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __pyx_t_13 = NULL; __pyx_t_5 = 0; @@ -8991,7 +8993,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[3] = {__pyx_t_13, __pyx_t_11, __pyx_t_12}; - __pyx_t_10 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; @@ -9001,7 +9003,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[3] = {__pyx_t_13, __pyx_t_11, __pyx_t_12}; - __pyx_t_10 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; @@ -9009,7 +9011,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged } else #endif { - __pyx_t_14 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_14 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); if (__pyx_t_13) { __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13); __pyx_t_13 = NULL; @@ -9020,7 +9022,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged PyTuple_SET_ITEM(__pyx_t_14, 1+__pyx_t_5, __pyx_t_12); __pyx_t_11 = 0; __pyx_t_12 = 0; - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_14, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_14, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; } @@ -9040,7 +9042,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[6] = {__pyx_t_4, __pyx_v_id, __pyx_t_9, __pyx_t_3, __pyx_t_10, __pyx_v_ignore_duplicates}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_5, 5+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_5, 5+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; @@ -9051,7 +9053,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[6] = {__pyx_t_4, __pyx_v_id, __pyx_t_9, __pyx_t_3, __pyx_t_10, __pyx_v_ignore_duplicates}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_5, 5+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_5, 5+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; @@ -9060,7 +9062,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged } else #endif { - __pyx_t_14 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_14 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -9080,14 +9082,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged __pyx_t_9 = 0; __pyx_t_3 = 0; __pyx_t_10 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_14, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 902, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_14, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":901 + /* "gedlibpy.pyx":909 * for node in g.nodes: * self.add_node(id, str(node), g.nodes[node]) * for edge in g.edges: # <<<<<<<<<<<<<< @@ -9097,7 +9099,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":903 + /* "gedlibpy.pyx":911 * for edge in g.edges: * self.add_edge(id, str(edge[0]), str(edge[1]), g.get_edge_data(edge[0], edge[1]), ignore_duplicates) * return id # <<<<<<<<<<<<<< @@ -9109,7 +9111,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged __pyx_r = __pyx_v_id; goto __pyx_L0; - /* "gedlibpy.pyx":884 + /* "gedlibpy.pyx":892 * * * def add_nx_graph(self, g, classe, ignore_duplicates=True) : # <<<<<<<<<<<<<< @@ -9141,7 +9143,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_86add_nx_graph(struct __pyx_obj_8ged return __pyx_r; } -/* "gedlibpy.pyx":906 +/* "gedlibpy.pyx":914 * * * def compute_ged_on_two_graphs(self, g1, g2, edit_cost, method, options, init_option="EAGER_WITHOUT_SHUFFLED_COPIES") : # <<<<<<<<<<<<<< @@ -9194,25 +9196,25 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_89compute_ged_on_two_graphs(PyObject case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_g2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, 1); __PYX_ERR(0, 906, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, 1); __PYX_ERR(0, 914, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_edit_cost)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, 2); __PYX_ERR(0, 906, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, 2); __PYX_ERR(0, 914, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_method)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, 3); __PYX_ERR(0, 906, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, 3); __PYX_ERR(0, 914, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_options)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, 4); __PYX_ERR(0, 906, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, 4); __PYX_ERR(0, 914, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: @@ -9222,7 +9224,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_89compute_ged_on_two_graphs(PyObject } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_ged_on_two_graphs") < 0)) __PYX_ERR(0, 906, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_ged_on_two_graphs") < 0)) __PYX_ERR(0, 914, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -9246,7 +9248,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_89compute_ged_on_two_graphs(PyObject } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 906, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_ged_on_two_graphs", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 914, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.compute_ged_on_two_graphs", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -9274,14 +9276,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ PyObject *__pyx_t_6 = NULL; __Pyx_RefNannySetupContext("compute_ged_on_two_graphs", 0); - /* "gedlibpy.pyx":929 + /* "gedlibpy.pyx":937 * * """ * if self.is_initialized() : # <<<<<<<<<<<<<< * self.restart_env() * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_initialized); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 929, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_initialized); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 937, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -9295,21 +9297,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 929, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 937, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 929, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 937, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_4) { - /* "gedlibpy.pyx":930 + /* "gedlibpy.pyx":938 * """ * if self.is_initialized() : * self.restart_env() # <<<<<<<<<<<<<< * * g = self.add_nx_graph(g1, "") */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_restart_env); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 930, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_restart_env); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 938, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -9323,12 +9325,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 930, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 938, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":929 + /* "gedlibpy.pyx":937 * * """ * if self.is_initialized() : # <<<<<<<<<<<<<< @@ -9337,14 +9339,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ */ } - /* "gedlibpy.pyx":932 + /* "gedlibpy.pyx":940 * self.restart_env() * * g = self.add_nx_graph(g1, "") # <<<<<<<<<<<<<< * h = self.add_nx_graph(g2, "") * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_nx_graph); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 932, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_nx_graph); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 940, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_5 = 0; @@ -9361,7 +9363,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_g1, __pyx_kp_u_}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 932, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 940, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -9369,13 +9371,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_g1, __pyx_kp_u_}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 932, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 940, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 932, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 940, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3); __pyx_t_3 = NULL; @@ -9386,7 +9388,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_INCREF(__pyx_kp_u_); __Pyx_GIVEREF(__pyx_kp_u_); PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_kp_u_); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 932, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 940, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } @@ -9394,14 +9396,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __pyx_v_g = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":933 + /* "gedlibpy.pyx":941 * * g = self.add_nx_graph(g1, "") * h = self.add_nx_graph(g2, "") # <<<<<<<<<<<<<< * * self.set_edit_cost(edit_cost) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_nx_graph); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 933, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_nx_graph); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 941, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = NULL; __pyx_t_5 = 0; @@ -9418,7 +9420,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_g2, __pyx_kp_u_}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 933, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 941, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -9426,13 +9428,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_g2, __pyx_kp_u_}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 933, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 941, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 933, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 941, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__pyx_t_6) { __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); __pyx_t_6 = NULL; @@ -9443,7 +9445,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_INCREF(__pyx_kp_u_); __Pyx_GIVEREF(__pyx_kp_u_); PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_5, __pyx_kp_u_); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 933, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 941, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } @@ -9451,14 +9453,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __pyx_v_h = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":935 + /* "gedlibpy.pyx":943 * h = self.add_nx_graph(g2, "") * * self.set_edit_cost(edit_cost) # <<<<<<<<<<<<<< * self.init(init_option) * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_edit_cost); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 935, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_edit_cost); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 943, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -9472,19 +9474,19 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_edit_cost) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_edit_cost); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 935, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 943, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":936 + /* "gedlibpy.pyx":944 * * self.set_edit_cost(edit_cost) * self.init(init_option) # <<<<<<<<<<<<<< * * self.set_method(method, options) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 936, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 944, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -9498,19 +9500,19 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_init_option) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_init_option); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 936, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 944, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":938 + /* "gedlibpy.pyx":946 * self.init(init_option) * * self.set_method(method, options) # <<<<<<<<<<<<<< * self.init_method() * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 938, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 946, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_5 = 0; @@ -9527,7 +9529,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_method, __pyx_v_options}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 938, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 946, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -9535,13 +9537,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_method, __pyx_v_options}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 938, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 946, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 938, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 946, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3); __pyx_t_3 = NULL; @@ -9552,21 +9554,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_INCREF(__pyx_v_options); __Pyx_GIVEREF(__pyx_v_options); PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_options); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 938, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 946, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":939 + /* "gedlibpy.pyx":947 * * self.set_method(method, options) * self.init_method() # <<<<<<<<<<<<<< * * resDistance = 0 */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 939, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 947, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -9580,12 +9582,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ } __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_6) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 939, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 947, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":941 + /* "gedlibpy.pyx":949 * self.init_method() * * resDistance = 0 # <<<<<<<<<<<<<< @@ -9595,26 +9597,26 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_INCREF(__pyx_int_0); __pyx_v_resDistance = __pyx_int_0; - /* "gedlibpy.pyx":942 + /* "gedlibpy.pyx":950 * * resDistance = 0 * resMapping = [] # <<<<<<<<<<<<<< * self.run_method(g, h) * resDistance = self.get_upper_bound(g, h) */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 942, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 950, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_resMapping = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":943 + /* "gedlibpy.pyx":951 * resDistance = 0 * resMapping = [] * self.run_method(g, h) # <<<<<<<<<<<<<< * resDistance = self.get_upper_bound(g, h) * resMapping = self.get_node_map(g, h) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_run_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 943, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_run_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 951, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = NULL; __pyx_t_5 = 0; @@ -9631,7 +9633,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 943, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 951, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -9639,13 +9641,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 943, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 951, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 943, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 951, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__pyx_t_6) { __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); __pyx_t_6 = NULL; @@ -9656,21 +9658,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_INCREF(__pyx_v_h); __Pyx_GIVEREF(__pyx_v_h); PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_5, __pyx_v_h); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 943, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 951, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":944 + /* "gedlibpy.pyx":952 * resMapping = [] * self.run_method(g, h) * resDistance = self.get_upper_bound(g, h) # <<<<<<<<<<<<<< * resMapping = self.get_node_map(g, h) * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_upper_bound); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 944, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_upper_bound); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 952, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_5 = 0; @@ -9687,7 +9689,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 944, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 952, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -9695,13 +9697,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 944, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 952, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 944, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 952, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3); __pyx_t_3 = NULL; @@ -9712,7 +9714,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_INCREF(__pyx_v_h); __Pyx_GIVEREF(__pyx_v_h); PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 944, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 952, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } @@ -9720,14 +9722,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_DECREF_SET(__pyx_v_resDistance, __pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":945 + /* "gedlibpy.pyx":953 * self.run_method(g, h) * resDistance = self.get_upper_bound(g, h) * resMapping = self.get_node_map(g, h) # <<<<<<<<<<<<<< * * return resDistance, resMapping */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_node_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 945, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_node_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 953, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = NULL; __pyx_t_5 = 0; @@ -9744,7 +9746,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 945, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 953, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -9752,13 +9754,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 945, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 953, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 945, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 953, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__pyx_t_6) { __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); __pyx_t_6 = NULL; @@ -9769,7 +9771,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_INCREF(__pyx_v_h); __Pyx_GIVEREF(__pyx_v_h); PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_5, __pyx_v_h); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 945, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 953, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } @@ -9777,7 +9779,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __Pyx_DECREF_SET(__pyx_v_resMapping, __pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":947 + /* "gedlibpy.pyx":955 * resMapping = self.get_node_map(g, h) * * return resDistance, resMapping # <<<<<<<<<<<<<< @@ -9785,7 +9787,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 947, __pyx_L1_error) + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 955, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_resDistance); __Pyx_GIVEREF(__pyx_v_resDistance); @@ -9797,7 +9799,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":906 + /* "gedlibpy.pyx":914 * * * def compute_ged_on_two_graphs(self, g1, g2, edit_cost, method, options, init_option="EAGER_WITHOUT_SHUFFLED_COPIES") : # <<<<<<<<<<<<<< @@ -9823,7 +9825,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_88compute_ged_on_two_graphs(struct _ return __pyx_r; } -/* "gedlibpy.pyx":950 +/* "gedlibpy.pyx":958 * * * def compute_edit_distance_on_nx_graphs(self, dataset, classes, edit_cost, method, options, init_option="EAGER_WITHOUT_SHUFFLED_COPIES") : # <<<<<<<<<<<<<< @@ -9876,25 +9878,25 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_91compute_edit_distance_on_nx_graphs case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_classes)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, 1); __PYX_ERR(0, 950, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, 1); __PYX_ERR(0, 958, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_edit_cost)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, 2); __PYX_ERR(0, 950, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, 2); __PYX_ERR(0, 958, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_method)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, 3); __PYX_ERR(0, 950, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, 3); __PYX_ERR(0, 958, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_options)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, 4); __PYX_ERR(0, 950, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, 4); __PYX_ERR(0, 958, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: @@ -9904,7 +9906,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_91compute_edit_distance_on_nx_graphs } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_edit_distance_on_nx_graphs") < 0)) __PYX_ERR(0, 950, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_edit_distance_on_nx_graphs") < 0)) __PYX_ERR(0, 958, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -9928,7 +9930,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_91compute_edit_distance_on_nx_graphs } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 950, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_nx_graphs", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 958, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.compute_edit_distance_on_nx_graphs", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -9964,14 +9966,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs PyObject *__pyx_t_12 = NULL; __Pyx_RefNannySetupContext("compute_edit_distance_on_nx_graphs", 0); - /* "gedlibpy.pyx":974 + /* "gedlibpy.pyx":982 * * """ * if self.is_initialized() : # <<<<<<<<<<<<<< * self.restart_env() * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_initialized); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 974, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_initialized); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 982, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -9985,21 +9987,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 974, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 982, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 974, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 982, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_4) { - /* "gedlibpy.pyx":975 + /* "gedlibpy.pyx":983 * """ * if self.is_initialized() : * self.restart_env() # <<<<<<<<<<<<<< * * print("Loading graphs in progress...") */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_restart_env); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 975, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_restart_env); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 983, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -10013,12 +10015,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 975, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 983, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":974 + /* "gedlibpy.pyx":982 * * """ * if self.is_initialized() : # <<<<<<<<<<<<<< @@ -10027,18 +10029,18 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs */ } - /* "gedlibpy.pyx":977 + /* "gedlibpy.pyx":985 * self.restart_env() * * print("Loading graphs in progress...") # <<<<<<<<<<<<<< * for graph in dataset : * self.add_nx_graph(graph, classes) */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 977, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 985, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":978 + /* "gedlibpy.pyx":986 * * print("Loading graphs in progress...") * for graph in dataset : # <<<<<<<<<<<<<< @@ -10049,26 +10051,26 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __pyx_t_1 = __pyx_v_dataset; __Pyx_INCREF(__pyx_t_1); __pyx_t_5 = 0; __pyx_t_6 = NULL; } else { - __pyx_t_5 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_dataset); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 978, __pyx_L1_error) + __pyx_t_5 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_dataset); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 986, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 978, __pyx_L1_error) + __pyx_t_6 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 986, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_6)) { if (likely(PyList_CheckExact(__pyx_t_1))) { if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 978, __pyx_L1_error) + __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 986, __pyx_L1_error) #else - __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 978, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 986, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); #endif } else { if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 978, __pyx_L1_error) + __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 986, __pyx_L1_error) #else - __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 978, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 986, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); #endif } @@ -10078,7 +10080,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 978, __pyx_L1_error) + else __PYX_ERR(0, 986, __pyx_L1_error) } break; } @@ -10087,14 +10089,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __Pyx_XDECREF_SET(__pyx_v_graph, __pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":979 + /* "gedlibpy.pyx":987 * print("Loading graphs in progress...") * for graph in dataset : * self.add_nx_graph(graph, classes) # <<<<<<<<<<<<<< * listID = self.graph_ids() * print("Graphs loaded ! ") */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_nx_graph); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 979, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_nx_graph); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 987, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = NULL; __pyx_t_8 = 0; @@ -10111,7 +10113,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_graph, __pyx_v_classes}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 979, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 987, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_2); } else @@ -10119,13 +10121,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_graph, __pyx_v_classes}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 979, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 987, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_2); } else #endif { - __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 979, __pyx_L1_error) + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 987, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); if (__pyx_t_7) { __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; @@ -10136,14 +10138,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __Pyx_INCREF(__pyx_v_classes); __Pyx_GIVEREF(__pyx_v_classes); PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_classes); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_9, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 979, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_9, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 987, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":978 + /* "gedlibpy.pyx":986 * * print("Loading graphs in progress...") * for graph in dataset : # <<<<<<<<<<<<<< @@ -10153,14 +10155,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":980 + /* "gedlibpy.pyx":988 * for graph in dataset : * self.add_nx_graph(graph, classes) * listID = self.graph_ids() # <<<<<<<<<<<<<< * print("Graphs loaded ! ") * print("Number of graphs = " + str(listID[1])) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_graph_ids); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 980, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_graph_ids); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 988, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -10174,51 +10176,51 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 980, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 988, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_listID = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":981 + /* "gedlibpy.pyx":989 * self.add_nx_graph(graph, classes) * listID = self.graph_ids() * print("Graphs loaded ! ") # <<<<<<<<<<<<<< * print("Number of graphs = " + str(listID[1])) * */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 981, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 989, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":982 + /* "gedlibpy.pyx":990 * listID = self.graph_ids() * print("Graphs loaded ! ") * print("Number of graphs = " + str(listID[1])) # <<<<<<<<<<<<<< * * self.set_edit_cost(edit_cost) */ - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 982, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 990, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 982, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 990, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Number_of_graphs, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 982, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Number_of_graphs, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 990, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 982, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 990, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":984 + /* "gedlibpy.pyx":992 * print("Number of graphs = " + str(listID[1])) * * self.set_edit_cost(edit_cost) # <<<<<<<<<<<<<< * print("Initialization in progress...") * self.init(init_option) */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_edit_cost); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_edit_cost); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 992, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { @@ -10232,30 +10234,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_3, __pyx_v_edit_cost) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_edit_cost); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 992, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":985 + /* "gedlibpy.pyx":993 * * self.set_edit_cost(edit_cost) * print("Initialization in progress...") # <<<<<<<<<<<<<< * self.init(init_option) * print("Initialization terminated !") */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 985, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 993, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":986 + /* "gedlibpy.pyx":994 * self.set_edit_cost(edit_cost) * print("Initialization in progress...") * self.init(init_option) # <<<<<<<<<<<<<< * print("Initialization terminated !") * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 986, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 994, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { @@ -10269,30 +10271,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_3, __pyx_v_init_option) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_init_option); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 986, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 994, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":987 + /* "gedlibpy.pyx":995 * print("Initialization in progress...") * self.init(init_option) * print("Initialization terminated !") # <<<<<<<<<<<<<< * * self.set_method(method, options) */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 987, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 995, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":989 + /* "gedlibpy.pyx":997 * print("Initialization terminated !") * * self.set_method(method, options) # <<<<<<<<<<<<<< * self.init_method() * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 989, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 997, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = NULL; __pyx_t_8 = 0; @@ -10309,7 +10311,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_1)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_method, __pyx_v_options}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 989, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 997, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_2); } else @@ -10317,13 +10319,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_method, __pyx_v_options}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 989, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 997, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_2); } else #endif { - __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 989, __pyx_L1_error) + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 997, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3); __pyx_t_3 = NULL; @@ -10334,21 +10336,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __Pyx_INCREF(__pyx_v_options); __Pyx_GIVEREF(__pyx_v_options); PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_options); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_9, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 989, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_9, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 997, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":990 + /* "gedlibpy.pyx":998 * * self.set_method(method, options) * self.init_method() # <<<<<<<<<<<<<< * * resDistance = [[]] */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init_method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 990, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init_method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 998, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_9 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { @@ -10362,21 +10364,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __pyx_t_2 = (__pyx_t_9) ? __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_9) : __Pyx_PyObject_CallNoArg(__pyx_t_1); __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 990, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 998, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":992 + /* "gedlibpy.pyx":1000 * self.init_method() * * resDistance = [[]] # <<<<<<<<<<<<<< * resMapping = [[]] * for g in range(listID[0], listID[1]) : */ - __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 992, __pyx_L1_error) + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1000, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 992, __pyx_L1_error) + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1000, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); @@ -10384,16 +10386,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __pyx_v_resDistance = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":993 + /* "gedlibpy.pyx":1001 * * resDistance = [[]] * resMapping = [[]] # <<<<<<<<<<<<<< * for g in range(listID[0], listID[1]) : * print("Computation between graph " + str(g) + " with all the others including himself.") */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 993, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1001, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 993, __pyx_L1_error) + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1001, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_1); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); @@ -10401,18 +10403,18 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __pyx_v_resMapping = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":994 + /* "gedlibpy.pyx":1002 * resDistance = [[]] * resMapping = [[]] * for g in range(listID[0], listID[1]) : # <<<<<<<<<<<<<< * print("Computation between graph " + str(g) + " with all the others including himself.") * for h in range(listID[0], listID[1]) : */ - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_listID, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_listID, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1002, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1002, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1002, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2); @@ -10420,16 +10422,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_1); __pyx_t_2 = 0; __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1002, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) { __pyx_t_9 = __pyx_t_1; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0; __pyx_t_6 = NULL; } else { - __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1002, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_6 = Py_TYPE(__pyx_t_9)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_6 = Py_TYPE(__pyx_t_9)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1002, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; for (;;) { @@ -10437,17 +10439,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs if (likely(PyList_CheckExact(__pyx_t_9))) { if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 1002, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1002, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } else { if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 1002, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 994, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1002, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } @@ -10457,7 +10459,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 994, __pyx_L1_error) + else __PYX_ERR(0, 1002, __pyx_L1_error) } break; } @@ -10466,38 +10468,38 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __Pyx_XDECREF_SET(__pyx_v_g, __pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":995 + /* "gedlibpy.pyx":1003 * resMapping = [[]] * for g in range(listID[0], listID[1]) : * print("Computation between graph " + str(g) + " with all the others including himself.") # <<<<<<<<<<<<<< * for h in range(listID[0], listID[1]) : * #print("Computation between graph " + str(g) + " and graph " + str(h)) */ - __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_g); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 995, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_g); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1003, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Computation_between_graph, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 995, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Computation_between_graph, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1003, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_t_2, __pyx_kp_u_with_all_the_others_including_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 995, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_t_2, __pyx_kp_u_with_all_the_others_including_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1003, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 995, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1003, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":996 + /* "gedlibpy.pyx":1004 * for g in range(listID[0], listID[1]) : * print("Computation between graph " + str(g) + " with all the others including himself.") * for h in range(listID[0], listID[1]) : # <<<<<<<<<<<<<< * #print("Computation between graph " + str(g) + " and graph " + str(h)) * self.run_method(g, h) */ - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_listID, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_listID, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1004, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1004, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1004, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); @@ -10505,16 +10507,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __pyx_t_2 = 0; __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1004, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) { __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0; __pyx_t_11 = NULL; } else { - __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1004, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1004, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; for (;;) { @@ -10522,17 +10524,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs if (likely(PyList_CheckExact(__pyx_t_3))) { if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 1004, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1004, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } else { if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 1004, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 996, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1004, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } @@ -10542,7 +10544,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 996, __pyx_L1_error) + else __PYX_ERR(0, 1004, __pyx_L1_error) } break; } @@ -10551,14 +10553,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __Pyx_XDECREF_SET(__pyx_v_h, __pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":998 + /* "gedlibpy.pyx":1006 * for h in range(listID[0], listID[1]) : * #print("Computation between graph " + str(g) + " and graph " + str(h)) * self.run_method(g, h) # <<<<<<<<<<<<<< * resDistance[g][h] = self.get_upper_bound(g, h) * resMapping[g][h] = self.get_node_map(g, h) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_run_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 998, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_run_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1006, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_7 = NULL; __pyx_t_8 = 0; @@ -10575,7 +10577,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 998, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1006, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -10583,13 +10585,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 998, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1006, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_12 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 998, __pyx_L1_error) + __pyx_t_12 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1006, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); if (__pyx_t_7) { __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7); __pyx_t_7 = NULL; @@ -10600,21 +10602,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __Pyx_INCREF(__pyx_v_h); __Pyx_GIVEREF(__pyx_v_h); PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_8, __pyx_v_h); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 998, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1006, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":999 + /* "gedlibpy.pyx":1007 * #print("Computation between graph " + str(g) + " and graph " + str(h)) * self.run_method(g, h) * resDistance[g][h] = self.get_upper_bound(g, h) # <<<<<<<<<<<<<< * resMapping[g][h] = self.get_node_map(g, h) * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_upper_bound); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 999, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_upper_bound); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1007, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_12 = NULL; __pyx_t_8 = 0; @@ -10631,7 +10633,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_12, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 999, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1007, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -10639,13 +10641,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_12, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 999, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1007, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_7 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 999, __pyx_L1_error) + __pyx_t_7 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1007, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (__pyx_t_12) { __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_12); __pyx_t_12 = NULL; @@ -10656,25 +10658,25 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __Pyx_INCREF(__pyx_v_h); __Pyx_GIVEREF(__pyx_v_h); PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_8, __pyx_v_h); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 999, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1007, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_resDistance, __pyx_v_g); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 999, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_resDistance, __pyx_v_g); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1007, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (unlikely(PyObject_SetItem(__pyx_t_2, __pyx_v_h, __pyx_t_1) < 0)) __PYX_ERR(0, 999, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_t_2, __pyx_v_h, __pyx_t_1) < 0)) __PYX_ERR(0, 1007, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1000 + /* "gedlibpy.pyx":1008 * self.run_method(g, h) * resDistance[g][h] = self.get_upper_bound(g, h) * resMapping[g][h] = self.get_node_map(g, h) # <<<<<<<<<<<<<< * * print("Finish ! The return contains edit distances and NodeMap but you can check the result with graphs'ID until you restart the environment") */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_node_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1000, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_node_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1008, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_7 = NULL; __pyx_t_8 = 0; @@ -10691,7 +10693,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1000, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1008, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -10699,13 +10701,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1000, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1008, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_12 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1000, __pyx_L1_error) + __pyx_t_12 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1008, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); if (__pyx_t_7) { __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7); __pyx_t_7 = NULL; @@ -10716,18 +10718,18 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __Pyx_INCREF(__pyx_v_h); __Pyx_GIVEREF(__pyx_v_h); PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_8, __pyx_v_h); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1000, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1008, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_resMapping, __pyx_v_g); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1000, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_resMapping, __pyx_v_g); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1008, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (unlikely(PyObject_SetItem(__pyx_t_2, __pyx_v_h, __pyx_t_1) < 0)) __PYX_ERR(0, 1000, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_t_2, __pyx_v_h, __pyx_t_1) < 0)) __PYX_ERR(0, 1008, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":996 + /* "gedlibpy.pyx":1004 * for g in range(listID[0], listID[1]) : * print("Computation between graph " + str(g) + " with all the others including himself.") * for h in range(listID[0], listID[1]) : # <<<<<<<<<<<<<< @@ -10737,7 +10739,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":994 + /* "gedlibpy.pyx":1002 * resDistance = [[]] * resMapping = [[]] * for g in range(listID[0], listID[1]) : # <<<<<<<<<<<<<< @@ -10747,18 +10749,18 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs } __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - /* "gedlibpy.pyx":1002 + /* "gedlibpy.pyx":1010 * resMapping[g][h] = self.get_node_map(g, h) * * print("Finish ! The return contains edit distances and NodeMap but you can check the result with graphs'ID until you restart the environment") # <<<<<<<<<<<<<< * return resDistance, resMapping * */ - __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1002, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1010, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - /* "gedlibpy.pyx":1003 + /* "gedlibpy.pyx":1011 * * print("Finish ! The return contains edit distances and NodeMap but you can check the result with graphs'ID until you restart the environment") * return resDistance, resMapping # <<<<<<<<<<<<<< @@ -10766,7 +10768,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1003, __pyx_L1_error) + __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1011, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_INCREF(__pyx_v_resDistance); __Pyx_GIVEREF(__pyx_v_resDistance); @@ -10778,7 +10780,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs __pyx_t_9 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":950 + /* "gedlibpy.pyx":958 * * * def compute_edit_distance_on_nx_graphs(self, dataset, classes, edit_cost, method, options, init_option="EAGER_WITHOUT_SHUFFLED_COPIES") : # <<<<<<<<<<<<<< @@ -10808,7 +10810,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_90compute_edit_distance_on_nx_graphs return __pyx_r; } -/* "gedlibpy.pyx":1006 +/* "gedlibpy.pyx":1014 * * * def compute_edit_distance_on_GXl_graphs(self, path_folder, path_XML, edit_cost, method, options="", init_option="EAGER_WITHOUT_SHUFFLED_COPIES") : # <<<<<<<<<<<<<< @@ -10862,19 +10864,19 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_93compute_edit_distance_on_GXl_graph case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_path_XML)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_GXl_graphs", 0, 4, 6, 1); __PYX_ERR(0, 1006, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_GXl_graphs", 0, 4, 6, 1); __PYX_ERR(0, 1014, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_edit_cost)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_GXl_graphs", 0, 4, 6, 2); __PYX_ERR(0, 1006, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_GXl_graphs", 0, 4, 6, 2); __PYX_ERR(0, 1014, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_method)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_GXl_graphs", 0, 4, 6, 3); __PYX_ERR(0, 1006, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_GXl_graphs", 0, 4, 6, 3); __PYX_ERR(0, 1014, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: @@ -10890,7 +10892,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_93compute_edit_distance_on_GXl_graph } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_edit_distance_on_GXl_graphs") < 0)) __PYX_ERR(0, 1006, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_edit_distance_on_GXl_graphs") < 0)) __PYX_ERR(0, 1014, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -10915,7 +10917,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_93compute_edit_distance_on_GXl_graph } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_GXl_graphs", 0, 4, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1006, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_edit_distance_on_GXl_graphs", 0, 4, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1014, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.compute_edit_distance_on_GXl_graphs", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -10948,14 +10950,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph PyObject *__pyx_t_12 = NULL; __Pyx_RefNannySetupContext("compute_edit_distance_on_GXl_graphs", 0); - /* "gedlibpy.pyx":1030 + /* "gedlibpy.pyx":1038 * """ * * if self.is_initialized() : # <<<<<<<<<<<<<< * self.restart_env() * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_initialized); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1030, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_initialized); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1038, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -10969,21 +10971,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1030, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1038, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1030, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1038, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_4) { - /* "gedlibpy.pyx":1031 + /* "gedlibpy.pyx":1039 * * if self.is_initialized() : * self.restart_env() # <<<<<<<<<<<<<< * * print("Loading graphs in progress...") */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_restart_env); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1031, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_restart_env); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1039, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -10997,12 +10999,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1031, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1039, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1030 + /* "gedlibpy.pyx":1038 * """ * * if self.is_initialized() : # <<<<<<<<<<<<<< @@ -11011,25 +11013,25 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph */ } - /* "gedlibpy.pyx":1033 + /* "gedlibpy.pyx":1041 * self.restart_env() * * print("Loading graphs in progress...") # <<<<<<<<<<<<<< * self.load_GXL_graphs(path_folder, path_XML) * listID = self.graph_ids() */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1033, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1041, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1034 + /* "gedlibpy.pyx":1042 * * print("Loading graphs in progress...") * self.load_GXL_graphs(path_folder, path_XML) # <<<<<<<<<<<<<< * listID = self.graph_ids() * print("Graphs loaded ! ") */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_load_GXL_graphs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1034, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_load_GXL_graphs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1042, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_5 = 0; @@ -11046,7 +11048,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_path_folder, __pyx_v_path_XML}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1034, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1042, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -11054,13 +11056,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_path_folder, __pyx_v_path_XML}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1034, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1042, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1034, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1042, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3); __pyx_t_3 = NULL; @@ -11071,21 +11073,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph __Pyx_INCREF(__pyx_v_path_XML); __Pyx_GIVEREF(__pyx_v_path_XML); PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_path_XML); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1034, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1042, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1035 + /* "gedlibpy.pyx":1043 * print("Loading graphs in progress...") * self.load_GXL_graphs(path_folder, path_XML) * listID = self.graph_ids() # <<<<<<<<<<<<<< * print("Graphs loaded ! ") * print("Number of graphs = " + str(listID[1])) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_graph_ids); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1035, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_graph_ids); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1043, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -11099,51 +11101,51 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph } __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_6) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1035, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1043, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_listID = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":1036 + /* "gedlibpy.pyx":1044 * self.load_GXL_graphs(path_folder, path_XML) * listID = self.graph_ids() * print("Graphs loaded ! ") # <<<<<<<<<<<<<< * print("Number of graphs = " + str(listID[1])) * */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1036, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1044, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1037 + /* "gedlibpy.pyx":1045 * listID = self.graph_ids() * print("Graphs loaded ! ") * print("Number of graphs = " + str(listID[1])) # <<<<<<<<<<<<<< * * self.set_edit_cost(edit_cost) */ - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1037, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1045, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1037, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1045, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Number_of_graphs, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1037, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Number_of_graphs, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1045, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1037, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1045, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":1039 + /* "gedlibpy.pyx":1047 * print("Number of graphs = " + str(listID[1])) * * self.set_edit_cost(edit_cost) # <<<<<<<<<<<<<< * print("Initialization in progress...") * self.init(init_option) */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_edit_cost); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1039, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_edit_cost); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1047, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { @@ -11157,30 +11159,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph } __pyx_t_2 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_6, __pyx_v_edit_cost) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_edit_cost); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1039, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1047, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":1040 + /* "gedlibpy.pyx":1048 * * self.set_edit_cost(edit_cost) * print("Initialization in progress...") # <<<<<<<<<<<<<< * self.init(init_option) * print("Initialization terminated !") */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1040, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1048, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":1041 + /* "gedlibpy.pyx":1049 * self.set_edit_cost(edit_cost) * print("Initialization in progress...") * self.init(init_option) # <<<<<<<<<<<<<< * print("Initialization terminated !") * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1041, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1049, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { @@ -11194,30 +11196,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph } __pyx_t_2 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_6, __pyx_v_init_option) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_init_option); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1041, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1049, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":1042 + /* "gedlibpy.pyx":1050 * print("Initialization in progress...") * self.init(init_option) * print("Initialization terminated !") # <<<<<<<<<<<<<< * * self.set_method(method, options) */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1042, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1050, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":1044 + /* "gedlibpy.pyx":1052 * print("Initialization terminated !") * * self.set_method(method, options) # <<<<<<<<<<<<<< * self.init_method() * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1044, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_set_method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1052, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = NULL; __pyx_t_5 = 0; @@ -11234,7 +11236,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_1)) { PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_method, __pyx_v_options}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1044, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1052, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_2); } else @@ -11242,13 +11244,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { PyObject *__pyx_temp[3] = {__pyx_t_6, __pyx_v_method, __pyx_v_options}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1044, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1052, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_2); } else #endif { - __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1044, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1052, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__pyx_t_6) { __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); __pyx_t_6 = NULL; @@ -11259,21 +11261,21 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph __Pyx_INCREF(__pyx_v_options); __Pyx_GIVEREF(__pyx_v_options); PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_5, __pyx_v_options); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1044, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1052, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":1045 + /* "gedlibpy.pyx":1053 * * self.set_method(method, options) * self.init_method() # <<<<<<<<<<<<<< * * #res = [] */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init_method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1045, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_init_method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1053, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { @@ -11287,23 +11289,23 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph } __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1045, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1053, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":1048 + /* "gedlibpy.pyx":1056 * * #res = [] * for g in range(listID[0], listID[1]) : # <<<<<<<<<<<<<< * print("Computation between graph " + str(g) + " with all the others including himself.") * for h in range(listID[0], listID[1]) : */ - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_listID, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_listID, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1056, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1056, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1056, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); @@ -11311,16 +11313,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __pyx_t_2 = 0; __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1056, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) { __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0; __pyx_t_8 = NULL; } else { - __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1056, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1056, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; for (;;) { @@ -11328,17 +11330,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph if (likely(PyList_CheckExact(__pyx_t_3))) { if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 1056, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1056, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } else { if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 1056, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1048, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1056, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } @@ -11348,7 +11350,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 1048, __pyx_L1_error) + else __PYX_ERR(0, 1056, __pyx_L1_error) } break; } @@ -11357,38 +11359,38 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph __Pyx_XDECREF_SET(__pyx_v_g, __pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1049 + /* "gedlibpy.pyx":1057 * #res = [] * for g in range(listID[0], listID[1]) : * print("Computation between graph " + str(g) + " with all the others including himself.") # <<<<<<<<<<<<<< * for h in range(listID[0], listID[1]) : * #print("Computation between graph " + str(g) + " and graph " + str(h)) */ - __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_g); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1049, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_g); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1057, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Computation_between_graph, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1049, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Computation_between_graph, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1057, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_t_2, __pyx_kp_u_with_all_the_others_including_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1049, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_t_2, __pyx_kp_u_with_all_the_others_including_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1057, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1049, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1057, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":1050 + /* "gedlibpy.pyx":1058 * for g in range(listID[0], listID[1]) : * print("Computation between graph " + str(g) + " with all the others including himself.") * for h in range(listID[0], listID[1]) : # <<<<<<<<<<<<<< * #print("Computation between graph " + str(g) + " and graph " + str(h)) * self.run_method(g,h) */ - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_listID, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_listID, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1058, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_listID, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1058, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1058, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2); @@ -11396,16 +11398,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); __pyx_t_2 = 0; __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1058, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) { __pyx_t_6 = __pyx_t_1; __Pyx_INCREF(__pyx_t_6); __pyx_t_9 = 0; __pyx_t_10 = NULL; } else { - __pyx_t_9 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_9 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1058, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_10 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 1058, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; for (;;) { @@ -11413,17 +11415,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph if (likely(PyList_CheckExact(__pyx_t_6))) { if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_6)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 1058, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_6, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_6, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1058, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } else { if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_6)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 1058, __pyx_L1_error) #else - __pyx_t_1 = PySequence_ITEM(__pyx_t_6, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1050, __pyx_L1_error) + __pyx_t_1 = PySequence_ITEM(__pyx_t_6, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1058, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); #endif } @@ -11433,7 +11435,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 1050, __pyx_L1_error) + else __PYX_ERR(0, 1058, __pyx_L1_error) } break; } @@ -11442,14 +11444,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph __Pyx_XDECREF_SET(__pyx_v_h, __pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1052 + /* "gedlibpy.pyx":1060 * for h in range(listID[0], listID[1]) : * #print("Computation between graph " + str(g) + " and graph " + str(h)) * self.run_method(g,h) # <<<<<<<<<<<<<< * #res.append((get_upper_bound(g,h), get_node_map(g,h), get_runtime(g,h))) * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_run_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1052, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_run_method); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1060, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_11 = NULL; __pyx_t_5 = 0; @@ -11466,7 +11468,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_11, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1052, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1060, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -11474,13 +11476,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[3] = {__pyx_t_11, __pyx_v_g, __pyx_v_h}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1052, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1060, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_12 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1052, __pyx_L1_error) + __pyx_t_12 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1060, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); if (__pyx_t_11) { __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_11); __pyx_t_11 = NULL; @@ -11491,14 +11493,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph __Pyx_INCREF(__pyx_v_h); __Pyx_GIVEREF(__pyx_v_h); PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_5, __pyx_v_h); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1052, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1060, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1050 + /* "gedlibpy.pyx":1058 * for g in range(listID[0], listID[1]) : * print("Computation between graph " + str(g) + " with all the others including himself.") * for h in range(listID[0], listID[1]) : # <<<<<<<<<<<<<< @@ -11508,7 +11510,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - /* "gedlibpy.pyx":1048 + /* "gedlibpy.pyx":1056 * * #res = [] * for g in range(listID[0], listID[1]) : # <<<<<<<<<<<<<< @@ -11518,29 +11520,29 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1057 + /* "gedlibpy.pyx":1065 * #return res * * print ("Finish ! You can check the result with each ID of graphs ! There are in the return") # <<<<<<<<<<<<<< * print ("Please don't restart the environment or recall this function, you will lose your results !") * return listID */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1057, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1065, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1058 + /* "gedlibpy.pyx":1066 * * print ("Finish ! You can check the result with each ID of graphs ! There are in the return") * print ("Please don't restart the environment or recall this function, you will lose your results !") # <<<<<<<<<<<<<< * return listID * */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1058, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1066, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1059 + /* "gedlibpy.pyx":1067 * print ("Finish ! You can check the result with each ID of graphs ! There are in the return") * print ("Please don't restart the environment or recall this function, you will lose your results !") * return listID # <<<<<<<<<<<<<< @@ -11552,7 +11554,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph __pyx_r = __pyx_v_listID; goto __pyx_L0; - /* "gedlibpy.pyx":1006 + /* "gedlibpy.pyx":1014 * * * def compute_edit_distance_on_GXl_graphs(self, path_folder, path_XML, edit_cost, method, options="", init_option="EAGER_WITHOUT_SHUFFLED_COPIES") : # <<<<<<<<<<<<<< @@ -11579,7 +11581,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_92compute_edit_distance_on_GXl_graph return __pyx_r; } -/* "gedlibpy.pyx":1062 +/* "gedlibpy.pyx":1070 * * * def get_num_node_labels(self): # <<<<<<<<<<<<<< @@ -11608,7 +11610,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_94get_num_node_labels(struct __pyx_o PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("get_num_node_labels", 0); - /* "gedlibpy.pyx":1071 + /* "gedlibpy.pyx":1079 * .. note:: If 1 is returned, the nodes are unlabeled. * """ * return self.c_env.getNumNodeLabels() # <<<<<<<<<<<<<< @@ -11620,15 +11622,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_94get_num_node_labels(struct __pyx_o __pyx_t_1 = __pyx_v_self->c_env->getNumNodeLabels(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1071, __pyx_L1_error) + __PYX_ERR(0, 1079, __pyx_L1_error) } - __pyx_t_2 = __Pyx_PyInt_FromSize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1071, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_FromSize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1079, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1062 + /* "gedlibpy.pyx":1070 * * * def get_num_node_labels(self): # <<<<<<<<<<<<<< @@ -11647,7 +11649,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_94get_num_node_labels(struct __pyx_o return __pyx_r; } -/* "gedlibpy.pyx":1074 +/* "gedlibpy.pyx":1082 * * * def get_node_label(self, label_id): # <<<<<<<<<<<<<< @@ -11680,7 +11682,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_96get_node_label(struct __pyx_obj_8g PyObject *__pyx_t_6 = NULL; __Pyx_RefNannySetupContext("get_node_label", 0); - /* "gedlibpy.pyx":1083 + /* "gedlibpy.pyx":1091 * :rtype: dict{string : string} * """ * return decode_your_map(self.c_env.getNodeLabel(label_id)) # <<<<<<<<<<<<<< @@ -11688,16 +11690,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_96get_node_label(struct __pyx_obj_8g * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1083, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1091, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_label_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1083, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_label_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1091, __pyx_L1_error) try { __pyx_t_4 = __pyx_v_self->c_env->getNodeLabel(__pyx_t_3); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1083, __pyx_L1_error) + __PYX_ERR(0, 1091, __pyx_L1_error) } - __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1083, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1091, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -11712,14 +11714,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_96get_node_label(struct __pyx_obj_8g __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1083, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1091, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1074 + /* "gedlibpy.pyx":1082 * * * def get_node_label(self, label_id): # <<<<<<<<<<<<<< @@ -11741,7 +11743,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_96get_node_label(struct __pyx_obj_8g return __pyx_r; } -/* "gedlibpy.pyx":1086 +/* "gedlibpy.pyx":1094 * * * def get_num_edge_labels(self): # <<<<<<<<<<<<<< @@ -11770,7 +11772,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_98get_num_edge_labels(struct __pyx_o PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("get_num_edge_labels", 0); - /* "gedlibpy.pyx":1095 + /* "gedlibpy.pyx":1103 * .. note:: If 1 is returned, the edges are unlabeled. * """ * return self.c_env.getNumEdgeLabels() # <<<<<<<<<<<<<< @@ -11782,15 +11784,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_98get_num_edge_labels(struct __pyx_o __pyx_t_1 = __pyx_v_self->c_env->getNumEdgeLabels(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1095, __pyx_L1_error) + __PYX_ERR(0, 1103, __pyx_L1_error) } - __pyx_t_2 = __Pyx_PyInt_FromSize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1095, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_FromSize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1103, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1086 + /* "gedlibpy.pyx":1094 * * * def get_num_edge_labels(self): # <<<<<<<<<<<<<< @@ -11809,7 +11811,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_98get_num_edge_labels(struct __pyx_o return __pyx_r; } -/* "gedlibpy.pyx":1098 +/* "gedlibpy.pyx":1106 * * * def get_edge_label(self, label_id): # <<<<<<<<<<<<<< @@ -11842,7 +11844,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_100get_edge_label(struct __pyx_obj_8 PyObject *__pyx_t_6 = NULL; __Pyx_RefNannySetupContext("get_edge_label", 0); - /* "gedlibpy.pyx":1107 + /* "gedlibpy.pyx":1115 * :rtype: dict{string : string} * """ * return decode_your_map(self.c_env.getEdgeLabel(label_id)) # <<<<<<<<<<<<<< @@ -11850,16 +11852,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_100get_edge_label(struct __pyx_obj_8 * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1107, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_label_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1107, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_As_size_t(__pyx_v_label_id); if (unlikely((__pyx_t_3 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1115, __pyx_L1_error) try { __pyx_t_4 = __pyx_v_self->c_env->getEdgeLabel(__pyx_t_3); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1107, __pyx_L1_error) + __PYX_ERR(0, 1115, __pyx_L1_error) } - __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1107, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -11874,14 +11876,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_100get_edge_label(struct __pyx_obj_8 __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1107, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1098 + /* "gedlibpy.pyx":1106 * * * def get_edge_label(self, label_id): # <<<<<<<<<<<<<< @@ -11903,7 +11905,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_100get_edge_label(struct __pyx_obj_8 return __pyx_r; } -/* "gedlibpy.pyx":1121 +/* "gedlibpy.pyx":1129 * # return self.c_env.getNumNodes(graph_id) * * def get_avg_num_nodes(self): # <<<<<<<<<<<<<< @@ -11932,7 +11934,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_102get_avg_num_nodes(struct __pyx_ob PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("get_avg_num_nodes", 0); - /* "gedlibpy.pyx":1128 + /* "gedlibpy.pyx":1136 * :rtype: double * """ * return self.c_env.getAvgNumNodes() # <<<<<<<<<<<<<< @@ -11944,15 +11946,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_102get_avg_num_nodes(struct __pyx_ob __pyx_t_1 = __pyx_v_self->c_env->getAvgNumNodes(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1128, __pyx_L1_error) + __PYX_ERR(0, 1136, __pyx_L1_error) } - __pyx_t_2 = PyFloat_FromDouble(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1128, __pyx_L1_error) + __pyx_t_2 = PyFloat_FromDouble(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1136, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1121 + /* "gedlibpy.pyx":1129 * # return self.c_env.getNumNodes(graph_id) * * def get_avg_num_nodes(self): # <<<<<<<<<<<<<< @@ -11971,7 +11973,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_102get_avg_num_nodes(struct __pyx_ob return __pyx_r; } -/* "gedlibpy.pyx":1130 +/* "gedlibpy.pyx":1138 * return self.c_env.getAvgNumNodes() * * def get_node_rel_cost(self, node_label_1, node_label_2): # <<<<<<<<<<<<<< @@ -12011,11 +12013,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_105get_node_rel_cost(PyObject *__pyx case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_label_2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_node_rel_cost", 1, 2, 2, 1); __PYX_ERR(0, 1130, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_rel_cost", 1, 2, 2, 1); __PYX_ERR(0, 1138, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_node_rel_cost") < 0)) __PYX_ERR(0, 1130, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_node_rel_cost") < 0)) __PYX_ERR(0, 1138, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -12028,7 +12030,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_105get_node_rel_cost(PyObject *__pyx } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_node_rel_cost", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1130, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_node_rel_cost", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1138, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_node_rel_cost", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -12052,7 +12054,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_104get_node_rel_cost(struct __pyx_ob double __pyx_t_6; __Pyx_RefNannySetupContext("get_node_rel_cost", 0); - /* "gedlibpy.pyx":1141 + /* "gedlibpy.pyx":1149 * :rtype: double * """ * return self.c_env.getNodeRelCost(encode_your_map(node_label_1), encode_your_map(node_label_2)) # <<<<<<<<<<<<<< @@ -12060,7 +12062,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_104get_node_rel_cost(struct __pyx_ob * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1141, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1149, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12074,12 +12076,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_104get_node_rel_cost(struct __pyx_ob } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_node_label_1) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_node_label_1); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1141, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1149, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1141, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1149, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1141, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1149, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12093,24 +12095,24 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_104get_node_rel_cost(struct __pyx_ob } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_node_label_2) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_node_label_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1141, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1149, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_5 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1141, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1149, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; try { __pyx_t_6 = __pyx_v_self->c_env->getNodeRelCost(__pyx_t_4, __pyx_t_5); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1141, __pyx_L1_error) + __PYX_ERR(0, 1149, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1141, __pyx_L1_error) + __pyx_t_1 = PyFloat_FromDouble(__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1149, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1130 + /* "gedlibpy.pyx":1138 * return self.c_env.getAvgNumNodes() * * def get_node_rel_cost(self, node_label_1, node_label_2): # <<<<<<<<<<<<<< @@ -12131,7 +12133,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_104get_node_rel_cost(struct __pyx_ob return __pyx_r; } -/* "gedlibpy.pyx":1144 +/* "gedlibpy.pyx":1152 * * * def get_node_del_cost(self, node_label): # <<<<<<<<<<<<<< @@ -12163,7 +12165,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_106get_node_del_cost(struct __pyx_ob double __pyx_t_5; __Pyx_RefNannySetupContext("get_node_del_cost", 0); - /* "gedlibpy.pyx":1153 + /* "gedlibpy.pyx":1161 * :rtype: double * """ * return self.c_env.getNodeDelCost(encode_your_map(node_label)) # <<<<<<<<<<<<<< @@ -12171,7 +12173,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_106get_node_del_cost(struct __pyx_ob * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1153, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1161, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12185,24 +12187,24 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_106get_node_del_cost(struct __pyx_ob } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_node_label) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_node_label); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1153, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1161, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1153, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1161, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; try { __pyx_t_5 = __pyx_v_self->c_env->getNodeDelCost(__pyx_t_4); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1153, __pyx_L1_error) + __PYX_ERR(0, 1161, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1153, __pyx_L1_error) + __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1161, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1144 + /* "gedlibpy.pyx":1152 * * * def get_node_del_cost(self, node_label): # <<<<<<<<<<<<<< @@ -12223,7 +12225,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_106get_node_del_cost(struct __pyx_ob return __pyx_r; } -/* "gedlibpy.pyx":1156 +/* "gedlibpy.pyx":1164 * * * def get_node_ins_cost(self, node_label): # <<<<<<<<<<<<<< @@ -12255,7 +12257,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_108get_node_ins_cost(struct __pyx_ob double __pyx_t_5; __Pyx_RefNannySetupContext("get_node_ins_cost", 0); - /* "gedlibpy.pyx":1165 + /* "gedlibpy.pyx":1173 * :rtype: double * """ * return self.c_env.getNodeInsCost(encode_your_map(node_label)) # <<<<<<<<<<<<<< @@ -12263,7 +12265,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_108get_node_ins_cost(struct __pyx_ob * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1165, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1173, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12277,24 +12279,24 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_108get_node_ins_cost(struct __pyx_ob } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_node_label) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_node_label); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1165, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1173, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1165, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1173, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; try { __pyx_t_5 = __pyx_v_self->c_env->getNodeInsCost(__pyx_t_4); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1165, __pyx_L1_error) + __PYX_ERR(0, 1173, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1165, __pyx_L1_error) + __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1173, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1156 + /* "gedlibpy.pyx":1164 * * * def get_node_ins_cost(self, node_label): # <<<<<<<<<<<<<< @@ -12315,7 +12317,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_108get_node_ins_cost(struct __pyx_ob return __pyx_r; } -/* "gedlibpy.pyx":1168 +/* "gedlibpy.pyx":1176 * * * def get_median_node_label(self, node_labels): # <<<<<<<<<<<<<< @@ -12353,7 +12355,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py std::map __pyx_t_9; __Pyx_RefNannySetupContext("get_median_node_label", 0); - /* "gedlibpy.pyx":1177 + /* "gedlibpy.pyx":1185 * :rtype: dict{string : string} * """ * node_labels_b = [encode_your_map(node_label) for node_label in node_labels] # <<<<<<<<<<<<<< @@ -12361,32 +12363,32 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py * */ { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1177, __pyx_L5_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1185, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_1); if (likely(PyList_CheckExact(__pyx_v_node_labels)) || PyTuple_CheckExact(__pyx_v_node_labels)) { __pyx_t_2 = __pyx_v_node_labels; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; __pyx_t_4 = NULL; } else { - __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_node_labels); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1177, __pyx_L5_error) + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_node_labels); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1185, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1177, __pyx_L5_error) + __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1185, __pyx_L5_error) } for (;;) { if (likely(!__pyx_t_4)) { if (likely(PyList_CheckExact(__pyx_t_2))) { if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 1177, __pyx_L5_error) + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 1185, __pyx_L5_error) #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1177, __pyx_L5_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1185, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); #endif } else { if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 1177, __pyx_L5_error) + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 1185, __pyx_L5_error) #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1177, __pyx_L5_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1185, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); #endif } @@ -12396,7 +12398,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 1177, __pyx_L5_error) + else __PYX_ERR(0, 1185, __pyx_L5_error) } break; } @@ -12404,7 +12406,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py } __Pyx_XDECREF_SET(__pyx_8genexpr9__pyx_v_node_label, __pyx_t_5); __pyx_t_5 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1177, __pyx_L5_error) + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1185, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { @@ -12418,10 +12420,10 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py } __pyx_t_5 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_6, __pyx_t_7, __pyx_8genexpr9__pyx_v_node_label) : __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_8genexpr9__pyx_v_node_label); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1177, __pyx_L5_error) + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1185, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(0, 1177, __pyx_L5_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(0, 1185, __pyx_L5_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -12435,7 +12437,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py __pyx_v_node_labels_b = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1178 + /* "gedlibpy.pyx":1186 * """ * node_labels_b = [encode_your_map(node_label) for node_label in node_labels] * return decode_your_map(self.c_env.getMedianNodeLabel(node_labels_b)) # <<<<<<<<<<<<<< @@ -12443,16 +12445,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1178, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1186, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = __pyx_convert_vector_from_py_std_3a__3a_map_3c_std_3a__3a_string_2c_std_3a__3a_string_3e___(__pyx_v_node_labels_b); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1178, __pyx_L1_error) + __pyx_t_8 = __pyx_convert_vector_from_py_std_3a__3a_map_3c_std_3a__3a_string_2c_std_3a__3a_string_3e___(__pyx_v_node_labels_b); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1186, __pyx_L1_error) try { __pyx_t_9 = __pyx_v_self->c_env->getMedianNodeLabel(__pyx_t_8); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1178, __pyx_L1_error) + __PYX_ERR(0, 1186, __pyx_L1_error) } - __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1178, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1186, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12467,14 +12469,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1178, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1186, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1168 + /* "gedlibpy.pyx":1176 * * * def get_median_node_label(self, node_labels): # <<<<<<<<<<<<<< @@ -12499,7 +12501,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_110get_median_node_label(struct __py return __pyx_r; } -/* "gedlibpy.pyx":1181 +/* "gedlibpy.pyx":1189 * * * def get_edge_rel_cost(self, edge_label_1, edge_label_2): # <<<<<<<<<<<<<< @@ -12539,11 +12541,11 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_113get_edge_rel_cost(PyObject *__pyx case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_edge_label_2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("get_edge_rel_cost", 1, 2, 2, 1); __PYX_ERR(0, 1181, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_edge_rel_cost", 1, 2, 2, 1); __PYX_ERR(0, 1189, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_edge_rel_cost") < 0)) __PYX_ERR(0, 1181, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_edge_rel_cost") < 0)) __PYX_ERR(0, 1189, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -12556,7 +12558,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_113get_edge_rel_cost(PyObject *__pyx } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_edge_rel_cost", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1181, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_edge_rel_cost", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1189, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_edge_rel_cost", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -12580,7 +12582,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_112get_edge_rel_cost(struct __pyx_ob double __pyx_t_6; __Pyx_RefNannySetupContext("get_edge_rel_cost", 0); - /* "gedlibpy.pyx":1192 + /* "gedlibpy.pyx":1200 * :rtype: double * """ * return self.c_env.getEdgeRelCost(encode_your_map(edge_label_1), encode_your_map(edge_label_2)) # <<<<<<<<<<<<<< @@ -12588,7 +12590,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_112get_edge_rel_cost(struct __pyx_ob * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1192, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1200, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12602,12 +12604,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_112get_edge_rel_cost(struct __pyx_ob } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_edge_label_1) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_edge_label_1); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1192, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1200, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1192, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1200, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1192, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1200, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12621,24 +12623,24 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_112get_edge_rel_cost(struct __pyx_ob } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_edge_label_2) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_edge_label_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1192, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1200, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_5 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1192, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1200, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; try { __pyx_t_6 = __pyx_v_self->c_env->getEdgeRelCost(__pyx_t_4, __pyx_t_5); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1192, __pyx_L1_error) + __PYX_ERR(0, 1200, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1192, __pyx_L1_error) + __pyx_t_1 = PyFloat_FromDouble(__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1200, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1181 + /* "gedlibpy.pyx":1189 * * * def get_edge_rel_cost(self, edge_label_1, edge_label_2): # <<<<<<<<<<<<<< @@ -12659,7 +12661,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_112get_edge_rel_cost(struct __pyx_ob return __pyx_r; } -/* "gedlibpy.pyx":1195 +/* "gedlibpy.pyx":1203 * * * def get_edge_del_cost(self, edge_label): # <<<<<<<<<<<<<< @@ -12691,7 +12693,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_114get_edge_del_cost(struct __pyx_ob double __pyx_t_5; __Pyx_RefNannySetupContext("get_edge_del_cost", 0); - /* "gedlibpy.pyx":1204 + /* "gedlibpy.pyx":1212 * :rtype: double * """ * return self.c_env.getEdgeDelCost(encode_your_map(edge_label)) # <<<<<<<<<<<<<< @@ -12699,7 +12701,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_114get_edge_del_cost(struct __pyx_ob * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1204, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1212, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12713,24 +12715,24 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_114get_edge_del_cost(struct __pyx_ob } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_edge_label) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_edge_label); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1204, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1212, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1204, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1212, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; try { __pyx_t_5 = __pyx_v_self->c_env->getEdgeDelCost(__pyx_t_4); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1204, __pyx_L1_error) + __PYX_ERR(0, 1212, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1204, __pyx_L1_error) + __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1212, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1195 + /* "gedlibpy.pyx":1203 * * * def get_edge_del_cost(self, edge_label): # <<<<<<<<<<<<<< @@ -12751,7 +12753,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_114get_edge_del_cost(struct __pyx_ob return __pyx_r; } -/* "gedlibpy.pyx":1207 +/* "gedlibpy.pyx":1215 * * * def get_edge_ins_cost(self, edge_label): # <<<<<<<<<<<<<< @@ -12783,7 +12785,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_116get_edge_ins_cost(struct __pyx_ob double __pyx_t_5; __Pyx_RefNannySetupContext("get_edge_ins_cost", 0); - /* "gedlibpy.pyx":1216 + /* "gedlibpy.pyx":1224 * :rtype: double * """ * return self.c_env.getEdgeInsCost(encode_your_map(edge_label)) # <<<<<<<<<<<<<< @@ -12791,7 +12793,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_116get_edge_ins_cost(struct __pyx_ob * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1216, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1224, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12805,24 +12807,24 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_116get_edge_ins_cost(struct __pyx_ob } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_edge_label) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_edge_label); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1216, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1224, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1216, __pyx_L1_error) + __pyx_t_4 = __pyx_convert_map_from_py_std_3a__3a_string__and_std_3a__3a_string(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1224, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; try { __pyx_t_5 = __pyx_v_self->c_env->getEdgeInsCost(__pyx_t_4); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1216, __pyx_L1_error) + __PYX_ERR(0, 1224, __pyx_L1_error) } - __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1216, __pyx_L1_error) + __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1224, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1207 + /* "gedlibpy.pyx":1215 * * * def get_edge_ins_cost(self, edge_label): # <<<<<<<<<<<<<< @@ -12843,7 +12845,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_116get_edge_ins_cost(struct __pyx_ob return __pyx_r; } -/* "gedlibpy.pyx":1219 +/* "gedlibpy.pyx":1227 * * * def get_median_edge_label(self, edge_labels): # <<<<<<<<<<<<<< @@ -12881,7 +12883,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py std::map __pyx_t_9; __Pyx_RefNannySetupContext("get_median_edge_label", 0); - /* "gedlibpy.pyx":1228 + /* "gedlibpy.pyx":1236 * :rtype: dict{string : string} * """ * edge_labels_b = [encode_your_map(edge_label) for edge_label in edge_labels] # <<<<<<<<<<<<<< @@ -12889,32 +12891,32 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py * */ { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1228, __pyx_L5_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1236, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_1); if (likely(PyList_CheckExact(__pyx_v_edge_labels)) || PyTuple_CheckExact(__pyx_v_edge_labels)) { __pyx_t_2 = __pyx_v_edge_labels; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; __pyx_t_4 = NULL; } else { - __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_edge_labels); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1228, __pyx_L5_error) + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_edge_labels); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1236, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1228, __pyx_L5_error) + __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1236, __pyx_L5_error) } for (;;) { if (likely(!__pyx_t_4)) { if (likely(PyList_CheckExact(__pyx_t_2))) { if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 1228, __pyx_L5_error) + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 1236, __pyx_L5_error) #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1228, __pyx_L5_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1236, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); #endif } else { if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 1228, __pyx_L5_error) + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 1236, __pyx_L5_error) #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1228, __pyx_L5_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1236, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); #endif } @@ -12924,7 +12926,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 1228, __pyx_L5_error) + else __PYX_ERR(0, 1236, __pyx_L5_error) } break; } @@ -12932,7 +12934,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py } __Pyx_XDECREF_SET(__pyx_9genexpr10__pyx_v_edge_label, __pyx_t_5); __pyx_t_5 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1228, __pyx_L5_error) + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_encode_your_map); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1236, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { @@ -12946,10 +12948,10 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py } __pyx_t_5 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_6, __pyx_t_7, __pyx_9genexpr10__pyx_v_edge_label) : __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_9genexpr10__pyx_v_edge_label); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1228, __pyx_L5_error) + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1236, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(0, 1228, __pyx_L5_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(0, 1236, __pyx_L5_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -12963,7 +12965,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py __pyx_v_edge_labels_b = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1229 + /* "gedlibpy.pyx":1237 * """ * edge_labels_b = [encode_your_map(edge_label) for edge_label in edge_labels] * return decode_your_map(self.c_env.getMedianEdgeLabel(edge_label_b)) # <<<<<<<<<<<<<< @@ -12971,19 +12973,19 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py * */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1237, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_edge_label_b); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1229, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_edge_label_b); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1237, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_8 = __pyx_convert_vector_from_py_std_3a__3a_map_3c_std_3a__3a_string_2c_std_3a__3a_string_3e___(__pyx_t_5); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1229, __pyx_L1_error) + __pyx_t_8 = __pyx_convert_vector_from_py_std_3a__3a_map_3c_std_3a__3a_string_2c_std_3a__3a_string_3e___(__pyx_t_5); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1237, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; try { __pyx_t_9 = __pyx_v_self->c_env->getMedianEdgeLabel(__pyx_t_8); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1229, __pyx_L1_error) + __PYX_ERR(0, 1237, __pyx_L1_error) } - __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1229, __pyx_L1_error) + __pyx_t_5 = __pyx_convert_map_to_py_std_3a__3a_string____std_3a__3a_string(__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1237, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -12998,14 +13000,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1237, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1219 + /* "gedlibpy.pyx":1227 * * * def get_median_edge_label(self, edge_labels): # <<<<<<<<<<<<<< @@ -13030,7 +13032,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_118get_median_edge_label(struct __py return __pyx_r; } -/* "gedlibpy.pyx":1232 +/* "gedlibpy.pyx":1240 * * * def get_nx_graph(self, graph_id, adj_matrix=True, adj_lists=False, edge_list=False): # @todo # <<<<<<<<<<<<<< @@ -13095,7 +13097,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_121get_nx_graph(PyObject *__pyx_v_se } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_nx_graph") < 0)) __PYX_ERR(0, 1232, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_nx_graph") < 0)) __PYX_ERR(0, 1240, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -13117,7 +13119,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_121get_nx_graph(PyObject *__pyx_v_se } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("get_nx_graph", 0, 1, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1232, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("get_nx_graph", 0, 1, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1240, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.get_nx_graph", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -13156,16 +13158,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge PyObject *(*__pyx_t_12)(PyObject *); __Pyx_RefNannySetupContext("get_nx_graph", 0); - /* "gedlibpy.pyx":1255 + /* "gedlibpy.pyx":1263 * The obtained graph. * """ * graph = nx.Graph() # <<<<<<<<<<<<<< * graph.graph['id'] = graph_id * */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_nx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1255, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_nx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Graph); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1255, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Graph); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = NULL; @@ -13180,32 +13182,32 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge } __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_3); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1255, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_graph = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":1256 + /* "gedlibpy.pyx":1264 * """ * graph = nx.Graph() * graph.graph['id'] = graph_id # <<<<<<<<<<<<<< * * nb_nodes = self.get_graph_num_nodes(graph_id) */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_graph, __pyx_n_s_graph); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1256, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_graph, __pyx_n_s_graph); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1264, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_n_u_id, __pyx_v_graph_id) < 0)) __PYX_ERR(0, 1256, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_n_u_id, __pyx_v_graph_id) < 0)) __PYX_ERR(0, 1264, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1258 + /* "gedlibpy.pyx":1266 * graph.graph['id'] = graph_id * * nb_nodes = self.get_graph_num_nodes(graph_id) # <<<<<<<<<<<<<< * original_node_ids = self.get_original_node_ids(graph_id) * node_labels = self.get_graph_node_labels(graph_id) */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_graph_num_nodes); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1258, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_graph_num_nodes); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1266, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { @@ -13219,20 +13221,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge } __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_v_graph_id) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_graph_id); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1258, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1266, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_nb_nodes = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":1259 + /* "gedlibpy.pyx":1267 * * nb_nodes = self.get_graph_num_nodes(graph_id) * original_node_ids = self.get_original_node_ids(graph_id) # <<<<<<<<<<<<<< * node_labels = self.get_graph_node_labels(graph_id) * # print(original_node_ids) */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_original_node_ids); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1259, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_original_node_ids); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1267, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { @@ -13246,20 +13248,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge } __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_v_graph_id) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_graph_id); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1259, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1267, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_original_node_ids = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":1260 + /* "gedlibpy.pyx":1268 * nb_nodes = self.get_graph_num_nodes(graph_id) * original_node_ids = self.get_original_node_ids(graph_id) * node_labels = self.get_graph_node_labels(graph_id) # <<<<<<<<<<<<<< * # print(original_node_ids) * # print(node_labels) */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_graph_node_labels); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1260, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_graph_node_labels); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { @@ -13273,32 +13275,32 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge } __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_v_graph_id) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_graph_id); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1260, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_node_labels = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":1263 + /* "gedlibpy.pyx":1271 * # print(original_node_ids) * # print(node_labels) * graph.graph['original_node_ids'] = original_node_ids # <<<<<<<<<<<<<< * * for node_id in range(0, nb_nodes): */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_graph, __pyx_n_s_graph); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1263, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_graph, __pyx_n_s_graph); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1271, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_n_u_original_node_ids, __pyx_v_original_node_ids) < 0)) __PYX_ERR(0, 1263, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_n_u_original_node_ids, __pyx_v_original_node_ids) < 0)) __PYX_ERR(0, 1271, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1265 + /* "gedlibpy.pyx":1273 * graph.graph['original_node_ids'] = original_node_ids * * for node_id in range(0, nb_nodes): # <<<<<<<<<<<<<< * graph.add_node(node_id, **node_labels[node_id]) * # graph.nodes[node_id]['original_node_id'] = original_node_ids[node_id] */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1265, __pyx_L1_error) + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_int_0); __Pyx_GIVEREF(__pyx_int_0); @@ -13306,16 +13308,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge __Pyx_INCREF(__pyx_v_nb_nodes); __Pyx_GIVEREF(__pyx_v_nb_nodes); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_nb_nodes); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1265, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (likely(PyList_CheckExact(__pyx_t_3)) || PyTuple_CheckExact(__pyx_t_3)) { __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_4 = 0; __pyx_t_5 = NULL; } else { - __pyx_t_4 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1265, __pyx_L1_error) + __pyx_t_4 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1265, __pyx_L1_error) + __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1273, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; for (;;) { @@ -13323,17 +13325,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge if (likely(PyList_CheckExact(__pyx_t_1))) { if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 1265, __pyx_L1_error) + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 1273, __pyx_L1_error) #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1265, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif } else { if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 1265, __pyx_L1_error) + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 1273, __pyx_L1_error) #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1265, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif } @@ -13343,7 +13345,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 1265, __pyx_L1_error) + else __PYX_ERR(0, 1273, __pyx_L1_error) } break; } @@ -13352,43 +13354,43 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge __Pyx_XDECREF_SET(__pyx_v_node_id, __pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1266 + /* "gedlibpy.pyx":1274 * * for node_id in range(0, nb_nodes): * graph.add_node(node_id, **node_labels[node_id]) # <<<<<<<<<<<<<< * # graph.nodes[node_id]['original_node_id'] = original_node_ids[node_id] * */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_graph, __pyx_n_s_add_node); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1266, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_graph, __pyx_n_s_add_node); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1274, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1266, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1274, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_node_id); __Pyx_GIVEREF(__pyx_v_node_id); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_node_id); - __pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_node_labels, __pyx_v_node_id); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1266, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_node_labels, __pyx_v_node_id); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1274, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (unlikely(__pyx_t_7 == Py_None)) { PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType"); - __PYX_ERR(0, 1266, __pyx_L1_error) + __PYX_ERR(0, 1274, __pyx_L1_error) } if (likely(PyDict_CheckExact(__pyx_t_7))) { - __pyx_t_6 = PyDict_Copy(__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1266, __pyx_L1_error) + __pyx_t_6 = PyDict_Copy(__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1274, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } else { - __pyx_t_6 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, __pyx_t_7, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1266, __pyx_L1_error) + __pyx_t_6 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, __pyx_t_7, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1274, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1266, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1274, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - /* "gedlibpy.pyx":1265 + /* "gedlibpy.pyx":1273 * graph.graph['original_node_ids'] = original_node_ids * * for node_id in range(0, nb_nodes): # <<<<<<<<<<<<<< @@ -13398,14 +13400,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1269 + /* "gedlibpy.pyx":1277 * # graph.nodes[node_id]['original_node_id'] = original_node_ids[node_id] * * edges = self.get_graph_edges(graph_id) # <<<<<<<<<<<<<< * for (head, tail), labels in edges.items(): * graph.add_edge(head, tail, **labels) */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_graph_edges); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1269, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_graph_edges); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1277, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { @@ -13419,13 +13421,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge } __pyx_t_1 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_6, __pyx_v_graph_id) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_v_graph_id); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1269, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1277, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_v_edges = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":1270 + /* "gedlibpy.pyx":1278 * * edges = self.get_graph_edges(graph_id) * for (head, tail), labels in edges.items(): # <<<<<<<<<<<<<< @@ -13435,9 +13437,9 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge __pyx_t_4 = 0; if (unlikely(__pyx_v_edges == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); - __PYX_ERR(0, 1270, __pyx_L1_error) + __PYX_ERR(0, 1278, __pyx_L1_error) } - __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_edges, 0, __pyx_n_s_items, (&__pyx_t_8), (&__pyx_t_9)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1270, __pyx_L1_error) + __pyx_t_7 = __Pyx_dict_iterator(__pyx_v_edges, 0, __pyx_n_s_items, (&__pyx_t_8), (&__pyx_t_9)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_7; @@ -13445,7 +13447,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge while (1) { __pyx_t_10 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_8, &__pyx_t_4, &__pyx_t_7, &__pyx_t_6, NULL, __pyx_t_9); if (unlikely(__pyx_t_10 == 0)) break; - if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 1270, __pyx_L1_error) + if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 1278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_GOTREF(__pyx_t_6); if ((likely(PyTuple_CheckExact(__pyx_t_7))) || (PyList_CheckExact(__pyx_t_7))) { @@ -13454,7 +13456,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 1270, __pyx_L1_error) + __PYX_ERR(0, 1278, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS if (likely(PyTuple_CheckExact(sequence))) { @@ -13467,15 +13469,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); #else - __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1270, __pyx_L1_error) + __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1270, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } else { Py_ssize_t index = -1; - __pyx_t_11 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1270, __pyx_L1_error) + __pyx_t_11 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext; @@ -13483,7 +13485,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge __Pyx_GOTREF(__pyx_t_2); index = 1; __pyx_t_3 = __pyx_t_12(__pyx_t_11); if (unlikely(!__pyx_t_3)) goto __pyx_L7_unpacking_failed; __Pyx_GOTREF(__pyx_t_3); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 2) < 0) __PYX_ERR(0, 1270, __pyx_L1_error) + if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 2) < 0) __PYX_ERR(0, 1278, __pyx_L1_error) __pyx_t_12 = NULL; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; goto __pyx_L8_unpacking_done; @@ -13491,7 +13493,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_t_12 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 1270, __pyx_L1_error) + __PYX_ERR(0, 1278, __pyx_L1_error) __pyx_L8_unpacking_done:; } __Pyx_XDECREF_SET(__pyx_v_head, __pyx_t_2); @@ -13501,16 +13503,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge __Pyx_XDECREF_SET(__pyx_v_labels, __pyx_t_6); __pyx_t_6 = 0; - /* "gedlibpy.pyx":1271 + /* "gedlibpy.pyx":1279 * edges = self.get_graph_edges(graph_id) * for (head, tail), labels in edges.items(): * graph.add_edge(head, tail, **labels) # <<<<<<<<<<<<<< * # print(edges) * */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_graph, __pyx_n_s_add_edge); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1271, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_graph, __pyx_n_s_add_edge); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1279, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1271, __pyx_L1_error) + __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1279, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_v_head); __Pyx_GIVEREF(__pyx_v_head); @@ -13520,16 +13522,16 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_tail); if (unlikely(__pyx_v_labels == Py_None)) { PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType"); - __PYX_ERR(0, 1271, __pyx_L1_error) + __PYX_ERR(0, 1279, __pyx_L1_error) } if (likely(PyDict_CheckExact(__pyx_v_labels))) { - __pyx_t_3 = PyDict_Copy(__pyx_v_labels); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1271, __pyx_L1_error) + __pyx_t_3 = PyDict_Copy(__pyx_v_labels); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1279, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); } else { - __pyx_t_3 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, __pyx_v_labels, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1271, __pyx_L1_error) + __pyx_t_3 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, __pyx_v_labels, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1279, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); } - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_7, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1271, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_7, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1279, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; @@ -13538,7 +13540,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1274 + /* "gedlibpy.pyx":1282 * # print(edges) * * return graph # <<<<<<<<<<<<<< @@ -13550,7 +13552,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge __pyx_r = __pyx_v_graph; goto __pyx_L0; - /* "gedlibpy.pyx":1232 + /* "gedlibpy.pyx":1240 * * * def get_nx_graph(self, graph_id, adj_matrix=True, adj_lists=False, edge_list=False): # @todo # <<<<<<<<<<<<<< @@ -13583,7 +13585,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_120get_nx_graph(struct __pyx_obj_8ge return __pyx_r; } -/* "gedlibpy.pyx":1277 +/* "gedlibpy.pyx":1285 * * * def get_init_type(self): # <<<<<<<<<<<<<< @@ -13612,7 +13614,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_122get_init_type(struct __pyx_obj_8g PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("get_init_type", 0); - /* "gedlibpy.pyx":1286 + /* "gedlibpy.pyx":1294 * Initialization type in string. * """ * return self.c_env.getInitType().decode('utf-8') # <<<<<<<<<<<<<< @@ -13624,15 +13626,15 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_122get_init_type(struct __pyx_obj_8g __pyx_t_1 = __pyx_v_self->c_env->getInitType(); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1286, __pyx_L1_error) + __PYX_ERR(0, 1294, __pyx_L1_error) } - __pyx_t_2 = __Pyx_decode_cpp_string(__pyx_t_1, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1286, __pyx_L1_error) + __pyx_t_2 = __Pyx_decode_cpp_string(__pyx_t_1, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1294, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "gedlibpy.pyx":1277 + /* "gedlibpy.pyx":1285 * * * def get_init_type(self): # <<<<<<<<<<<<<< @@ -13651,7 +13653,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_122get_init_type(struct __pyx_obj_8g return __pyx_r; } -/* "gedlibpy.pyx":1308 +/* "gedlibpy.pyx":1316 * * * def load_nx_graph(self, nx_graph, graph_id, graph_name='', graph_class=''): # <<<<<<<<<<<<<< @@ -13699,7 +13701,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_125load_nx_graph(PyObject *__pyx_v_s case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_graph_id)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("load_nx_graph", 0, 2, 4, 1); __PYX_ERR(0, 1308, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("load_nx_graph", 0, 2, 4, 1); __PYX_ERR(0, 1316, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: @@ -13715,7 +13717,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_125load_nx_graph(PyObject *__pyx_v_s } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "load_nx_graph") < 0)) __PYX_ERR(0, 1308, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "load_nx_graph") < 0)) __PYX_ERR(0, 1316, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -13736,7 +13738,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_125load_nx_graph(PyObject *__pyx_v_s } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("load_nx_graph", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1308, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("load_nx_graph", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1316, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.load_nx_graph", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -13773,7 +13775,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g __Pyx_RefNannySetupContext("load_nx_graph", 0); __Pyx_INCREF(__pyx_v_graph_id); - /* "gedlibpy.pyx":1331 + /* "gedlibpy.pyx":1339 * The ID of the newly loaded graph. * """ * if graph_id is None: # <<<<<<<<<<<<<< @@ -13784,14 +13786,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "gedlibpy.pyx":1332 + /* "gedlibpy.pyx":1340 * """ * if graph_id is None: * graph_id = self.add_graph(graph_name, graph_class) # <<<<<<<<<<<<<< * else: * self.clear_graph(graph_id) */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_graph); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1332, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_graph); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1340, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; __pyx_t_6 = 0; @@ -13808,7 +13810,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_v_graph_name, __pyx_v_graph_class}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1332, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1340, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_3); } else @@ -13816,13 +13818,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_v_graph_name, __pyx_v_graph_class}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1332, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1340, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_3); } else #endif { - __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1332, __pyx_L1_error) + __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1340, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (__pyx_t_5) { __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL; @@ -13833,7 +13835,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g __Pyx_INCREF(__pyx_v_graph_class); __Pyx_GIVEREF(__pyx_v_graph_class); PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_v_graph_class); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1332, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1340, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } @@ -13841,7 +13843,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g __Pyx_DECREF_SET(__pyx_v_graph_id, __pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1331 + /* "gedlibpy.pyx":1339 * The ID of the newly loaded graph. * """ * if graph_id is None: # <<<<<<<<<<<<<< @@ -13851,7 +13853,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g goto __pyx_L3; } - /* "gedlibpy.pyx":1334 + /* "gedlibpy.pyx":1342 * graph_id = self.add_graph(graph_name, graph_class) * else: * self.clear_graph(graph_id) # <<<<<<<<<<<<<< @@ -13859,7 +13861,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g * self.add_node(graph_id, str(node), nx_graph.nodes[node]) */ /*else*/ { - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_clear_graph); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1334, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_clear_graph); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1342, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_7 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { @@ -13873,29 +13875,29 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g } __pyx_t_3 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_7, __pyx_v_graph_id) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_graph_id); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1334, __pyx_L1_error) + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1342, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_L3:; - /* "gedlibpy.pyx":1335 + /* "gedlibpy.pyx":1343 * else: * self.clear_graph(graph_id) * for node in nx_graph.nodes: # <<<<<<<<<<<<<< * self.add_node(graph_id, str(node), nx_graph.nodes[node]) * for edge in nx_graph.edges: */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_nx_graph, __pyx_n_s_nodes); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1335, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_nx_graph, __pyx_n_s_nodes); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1343, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (likely(PyList_CheckExact(__pyx_t_3)) || PyTuple_CheckExact(__pyx_t_3)) { __pyx_t_4 = __pyx_t_3; __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0; __pyx_t_9 = NULL; } else { - __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1335, __pyx_L1_error) + __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1343, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1335, __pyx_L1_error) + __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1343, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; for (;;) { @@ -13903,17 +13905,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g if (likely(PyList_CheckExact(__pyx_t_4))) { if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(0, 1335, __pyx_L1_error) + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(0, 1343, __pyx_L1_error) #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1335, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1343, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif } else { if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(0, 1335, __pyx_L1_error) + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(0, 1343, __pyx_L1_error) #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1335, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1343, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif } @@ -13923,7 +13925,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 1335, __pyx_L1_error) + else __PYX_ERR(0, 1343, __pyx_L1_error) } break; } @@ -13932,20 +13934,20 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g __Pyx_XDECREF_SET(__pyx_v_node, __pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1336 + /* "gedlibpy.pyx":1344 * self.clear_graph(graph_id) * for node in nx_graph.nodes: * self.add_node(graph_id, str(node), nx_graph.nodes[node]) # <<<<<<<<<<<<<< * for edge in nx_graph.edges: * self.add_edge(graph_id, str(edge[0]), str(edge[1]), nx_graph.get_edge_data(edge[0], edge[1])) */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_node); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1336, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_node); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - __pyx_t_5 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_node); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1336, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_node); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_nx_graph, __pyx_n_s_nodes); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 1336, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_nx_graph, __pyx_n_s_nodes); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 1344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_11 = __Pyx_PyObject_GetItem(__pyx_t_10, __pyx_v_node); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1336, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyObject_GetItem(__pyx_t_10, __pyx_v_node); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_10 = NULL; @@ -13963,7 +13965,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_v_graph_id, __pyx_t_5, __pyx_t_11}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1336, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1344, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; @@ -13973,7 +13975,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_v_graph_id, __pyx_t_5, __pyx_t_11}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1336, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_6, 3+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1344, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; @@ -13981,7 +13983,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g } else #endif { - __pyx_t_12 = PyTuple_New(3+__pyx_t_6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1336, __pyx_L1_error) + __pyx_t_12 = PyTuple_New(3+__pyx_t_6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); if (__pyx_t_10) { __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; @@ -13995,14 +13997,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_6, __pyx_t_11); __pyx_t_5 = 0; __pyx_t_11 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1336, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1335 + /* "gedlibpy.pyx":1343 * else: * self.clear_graph(graph_id) * for node in nx_graph.nodes: # <<<<<<<<<<<<<< @@ -14012,22 +14014,22 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "gedlibpy.pyx":1337 + /* "gedlibpy.pyx":1345 * for node in nx_graph.nodes: * self.add_node(graph_id, str(node), nx_graph.nodes[node]) * for edge in nx_graph.edges: # <<<<<<<<<<<<<< * self.add_edge(graph_id, str(edge[0]), str(edge[1]), nx_graph.get_edge_data(edge[0], edge[1])) * return graph_id */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_nx_graph, __pyx_n_s_edges); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1337, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_nx_graph, __pyx_n_s_edges); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1345, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) { __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_8 = 0; __pyx_t_9 = NULL; } else { - __pyx_t_8 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1337, __pyx_L1_error) + __pyx_t_8 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1345, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_9 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1337, __pyx_L1_error) + __pyx_t_9 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1345, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; for (;;) { @@ -14035,17 +14037,17 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g if (likely(PyList_CheckExact(__pyx_t_3))) { if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(0, 1337, __pyx_L1_error) + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(0, 1345, __pyx_L1_error) #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1337, __pyx_L1_error) + __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1345, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); #endif } else { if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(0, 1337, __pyx_L1_error) + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(0, 1345, __pyx_L1_error) #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1337, __pyx_L1_error) + __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1345, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); #endif } @@ -14055,7 +14057,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 1337, __pyx_L1_error) + else __PYX_ERR(0, 1345, __pyx_L1_error) } break; } @@ -14064,30 +14066,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g __Pyx_XDECREF_SET(__pyx_v_edge, __pyx_t_4); __pyx_t_4 = 0; - /* "gedlibpy.pyx":1338 + /* "gedlibpy.pyx":1346 * self.add_node(graph_id, str(node), nx_graph.nodes[node]) * for edge in nx_graph.edges: * self.add_edge(graph_id, str(edge[0]), str(edge[1]), nx_graph.get_edge_data(edge[0], edge[1])) # <<<<<<<<<<<<<< * return graph_id * */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_edge); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_edge); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - __pyx_t_12 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_12 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); - __pyx_t_11 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_12); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_12); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - __pyx_t_12 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_12 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); - __pyx_t_5 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_12); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_t_12); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_nx_graph, __pyx_n_s_get_edge_data); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_nx_graph, __pyx_n_s_get_edge_data); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_13 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_13 = __Pyx_GetItemInt(__pyx_v_edge, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_13); - __pyx_t_14 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_14 = __Pyx_GetItemInt(__pyx_v_edge, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); __pyx_t_15 = NULL; __pyx_t_6 = 0; @@ -14104,7 +14106,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_10)) { PyObject *__pyx_temp[3] = {__pyx_t_15, __pyx_t_13, __pyx_t_14}; - __pyx_t_12 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; @@ -14114,7 +14116,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { PyObject *__pyx_temp[3] = {__pyx_t_15, __pyx_t_13, __pyx_t_14}; - __pyx_t_12 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; @@ -14122,7 +14124,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g } else #endif { - __pyx_t_16 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_16 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_16); if (__pyx_t_15) { __Pyx_GIVEREF(__pyx_t_15); PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_15); __pyx_t_15 = NULL; @@ -14133,7 +14135,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g PyTuple_SET_ITEM(__pyx_t_16, 1+__pyx_t_6, __pyx_t_14); __pyx_t_13 = 0; __pyx_t_14 = 0; - __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_16, NULL); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_16, NULL); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; } @@ -14153,7 +14155,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[5] = {__pyx_t_10, __pyx_v_graph_id, __pyx_t_11, __pyx_t_5, __pyx_t_12}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; @@ -14164,7 +14166,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[5] = {__pyx_t_10, __pyx_v_graph_id, __pyx_t_11, __pyx_t_5, __pyx_t_12}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; @@ -14173,7 +14175,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g } else #endif { - __pyx_t_16 = PyTuple_New(4+__pyx_t_6); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_16 = PyTuple_New(4+__pyx_t_6); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_16); if (__pyx_t_10) { __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_10); __pyx_t_10 = NULL; @@ -14190,14 +14192,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g __pyx_t_11 = 0; __pyx_t_5 = 0; __pyx_t_12 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_16, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1338, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_16, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "gedlibpy.pyx":1337 + /* "gedlibpy.pyx":1345 * for node in nx_graph.nodes: * self.add_node(graph_id, str(node), nx_graph.nodes[node]) * for edge in nx_graph.edges: # <<<<<<<<<<<<<< @@ -14207,7 +14209,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1339 + /* "gedlibpy.pyx":1347 * for edge in nx_graph.edges: * self.add_edge(graph_id, str(edge[0]), str(edge[1]), nx_graph.get_edge_data(edge[0], edge[1])) * return graph_id # <<<<<<<<<<<<<< @@ -14219,7 +14221,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g __pyx_r = __pyx_v_graph_id; goto __pyx_L0; - /* "gedlibpy.pyx":1308 + /* "gedlibpy.pyx":1316 * * * def load_nx_graph(self, nx_graph, graph_id, graph_name='', graph_class=''): # <<<<<<<<<<<<<< @@ -14251,7 +14253,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_124load_nx_graph(struct __pyx_obj_8g return __pyx_r; } -/* "gedlibpy.pyx":1342 +/* "gedlibpy.pyx":1350 * * * def compute_induced_cost(self, g_id, h_id, node_map): # <<<<<<<<<<<<<< @@ -14294,17 +14296,17 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_127compute_induced_cost(PyObject *__ case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h_id)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_induced_cost", 1, 3, 3, 1); __PYX_ERR(0, 1342, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_induced_cost", 1, 3, 3, 1); __PYX_ERR(0, 1350, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_map)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("compute_induced_cost", 1, 3, 3, 2); __PYX_ERR(0, 1342, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_induced_cost", 1, 3, 3, 2); __PYX_ERR(0, 1350, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_induced_cost") < 0)) __PYX_ERR(0, 1342, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "compute_induced_cost") < 0)) __PYX_ERR(0, 1350, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -14319,7 +14321,7 @@ static PyObject *__pyx_pw_8gedlibpy_6GEDEnv_127compute_induced_cost(PyObject *__ } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("compute_induced_cost", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1342, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("compute_induced_cost", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1350, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.GEDEnv.compute_induced_cost", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -14356,26 +14358,26 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx double __pyx_t_12; __Pyx_RefNannySetupContext("compute_induced_cost", 0); - /* "gedlibpy.pyx":1359 + /* "gedlibpy.pyx":1367 * None. * """ * relation = [] # <<<<<<<<<<<<<< * node_map.as_relation(relation) * # print(relation) */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1359, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1367, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_relation = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1360 + /* "gedlibpy.pyx":1368 * """ * relation = [] * node_map.as_relation(relation) # <<<<<<<<<<<<<< * # print(relation) * dummy_node = get_dummy_node() */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_map, __pyx_n_s_as_relation); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1360, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_map, __pyx_n_s_as_relation); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1368, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -14389,19 +14391,19 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_relation) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_relation); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1360, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1368, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1362 + /* "gedlibpy.pyx":1370 * node_map.as_relation(relation) * # print(relation) * dummy_node = get_dummy_node() # <<<<<<<<<<<<<< * # print(dummy_node) * for i, val in enumerate(relation): */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_get_dummy_node); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1362, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_get_dummy_node); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1370, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { @@ -14415,13 +14417,13 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1362, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1370, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_dummy_node = __pyx_t_1; __pyx_t_1 = 0; - /* "gedlibpy.pyx":1364 + /* "gedlibpy.pyx":1372 * dummy_node = get_dummy_node() * # print(dummy_node) * for i, val in enumerate(relation): # <<<<<<<<<<<<<< @@ -14434,45 +14436,45 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx for (;;) { if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 1364, __pyx_L1_error) + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 1372, __pyx_L1_error) #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1364, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_3); __pyx_t_3 = 0; __Pyx_INCREF(__pyx_t_1); __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_1); - __pyx_t_3 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1364, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_3; __pyx_t_3 = 0; - /* "gedlibpy.pyx":1365 + /* "gedlibpy.pyx":1373 * # print(dummy_node) * for i, val in enumerate(relation): * val1 = dummy_node if val[0] == np.inf else val[0] # <<<<<<<<<<<<<< * val2 = dummy_node if val[1] == np.inf else val[1] * relation[i] = tuple((val1, val2)) */ - __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_val, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1365, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_val, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1373, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1365, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1373, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_inf); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1365, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_inf); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1373, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = PyObject_RichCompare(__pyx_t_5, __pyx_t_7, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1365, __pyx_L1_error) + __pyx_t_6 = PyObject_RichCompare(__pyx_t_5, __pyx_t_7, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1373, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 1365, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 1373, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (__pyx_t_8) { __Pyx_INCREF(__pyx_v_dummy_node); __pyx_t_3 = __pyx_v_dummy_node; } else { - __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_val, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1365, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_val, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1373, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_3 = __pyx_t_6; __pyx_t_6 = 0; @@ -14480,30 +14482,30 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx __Pyx_XDECREF_SET(__pyx_v_val1, __pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1366 + /* "gedlibpy.pyx":1374 * for i, val in enumerate(relation): * val1 = dummy_node if val[0] == np.inf else val[0] * val2 = dummy_node if val[1] == np.inf else val[1] # <<<<<<<<<<<<<< * relation[i] = tuple((val1, val2)) * # print(relation) */ - __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_val, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1366, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_val, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1374, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1366, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1374, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_inf); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1366, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_inf); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1374, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1366, __pyx_L1_error) + __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1374, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 1366, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 1374, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; if (__pyx_t_8) { __Pyx_INCREF(__pyx_v_dummy_node); __pyx_t_3 = __pyx_v_dummy_node; } else { - __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_val, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1366, __pyx_L1_error) + __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_val, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1374, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_3 = __pyx_t_7; __pyx_t_7 = 0; @@ -14511,14 +14513,14 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx __Pyx_XDECREF_SET(__pyx_v_val2, __pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1367 + /* "gedlibpy.pyx":1375 * val1 = dummy_node if val[0] == np.inf else val[0] * val2 = dummy_node if val[1] == np.inf else val[1] * relation[i] = tuple((val1, val2)) # <<<<<<<<<<<<<< * # print(relation) * induced_cost = self.c_env.computeInducedCost(g_id, h_id, relation) */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1367, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1375, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_val1); __Pyx_GIVEREF(__pyx_v_val1); @@ -14526,10 +14528,10 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx __Pyx_INCREF(__pyx_v_val2); __Pyx_GIVEREF(__pyx_v_val2); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_val2); - if (unlikely(PyObject_SetItem(__pyx_v_relation, __pyx_v_i, __pyx_t_3) < 0)) __PYX_ERR(0, 1367, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_v_relation, __pyx_v_i, __pyx_t_3) < 0)) __PYX_ERR(0, 1375, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "gedlibpy.pyx":1364 + /* "gedlibpy.pyx":1372 * dummy_node = get_dummy_node() * # print(dummy_node) * for i, val in enumerate(relation): # <<<<<<<<<<<<<< @@ -14540,34 +14542,34 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1369 + /* "gedlibpy.pyx":1377 * relation[i] = tuple((val1, val2)) * # print(relation) * induced_cost = self.c_env.computeInducedCost(g_id, h_id, relation) # <<<<<<<<<<<<<< * node_map.set_induced_cost(induced_cost) * */ - __pyx_t_9 = __Pyx_PyInt_As_size_t(__pyx_v_g_id); if (unlikely((__pyx_t_9 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1369, __pyx_L1_error) - __pyx_t_10 = __Pyx_PyInt_As_size_t(__pyx_v_h_id); if (unlikely((__pyx_t_10 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1369, __pyx_L1_error) - __pyx_t_11 = __pyx_convert_vector_from_py_std_3a__3a_pair_3c_size_t_2c_size_t_3e___(__pyx_v_relation); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1369, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyInt_As_size_t(__pyx_v_g_id); if (unlikely((__pyx_t_9 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyInt_As_size_t(__pyx_v_h_id); if (unlikely((__pyx_t_10 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L1_error) + __pyx_t_11 = __pyx_convert_vector_from_py_std_3a__3a_pair_3c_size_t_2c_size_t_3e___(__pyx_v_relation); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1377, __pyx_L1_error) try { __pyx_t_12 = __pyx_v_self->c_env->computeInducedCost(__pyx_t_9, __pyx_t_10, __pyx_t_11); } catch(...) { __Pyx_CppExn2PyErr(); - __PYX_ERR(0, 1369, __pyx_L1_error) + __PYX_ERR(0, 1377, __pyx_L1_error) } __pyx_v_induced_cost = __pyx_t_12; - /* "gedlibpy.pyx":1370 + /* "gedlibpy.pyx":1378 * # print(relation) * induced_cost = self.c_env.computeInducedCost(g_id, h_id, relation) * node_map.set_induced_cost(induced_cost) # <<<<<<<<<<<<<< * * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_map, __pyx_n_s_set_induced_cost); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1370, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node_map, __pyx_n_s_set_induced_cost); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyFloat_FromDouble(__pyx_v_induced_cost); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1370, __pyx_L1_error) + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_induced_cost); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { @@ -14582,12 +14584,12 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_126compute_induced_cost(struct __pyx __pyx_t_1 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_7, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1370, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1342 + /* "gedlibpy.pyx":1350 * * * def compute_induced_cost(self, g_id, h_id, node_map): # <<<<<<<<<<<<<< @@ -14726,7 +14728,7 @@ static PyObject *__pyx_pf_8gedlibpy_6GEDEnv_130__setstate_cython__(CYTHON_UNUSED return __pyx_r; } -/* "gedlibpy.pyx":1400 +/* "gedlibpy.pyx":1408 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< @@ -14767,11 +14769,11 @@ static PyObject *__pyx_pw_8gedlibpy_13EditCostError_1__init__(PyObject *__pyx_se case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_message)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 1400, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 1408, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 1400, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 1408, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -14784,7 +14786,7 @@ static PyObject *__pyx_pw_8gedlibpy_13EditCostError_1__init__(PyObject *__pyx_se } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1400, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1408, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.EditCostError.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -14802,16 +14804,16 @@ static PyObject *__pyx_pf_8gedlibpy_13EditCostError___init__(CYTHON_UNUSED PyObj __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); - /* "gedlibpy.pyx":1407 + /* "gedlibpy.pyx":1415 * :type message: string * """ * self.message = message # <<<<<<<<<<<<<< * * */ - if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_message, __pyx_v_message) < 0) __PYX_ERR(0, 1407, __pyx_L1_error) + if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_message, __pyx_v_message) < 0) __PYX_ERR(0, 1415, __pyx_L1_error) - /* "gedlibpy.pyx":1400 + /* "gedlibpy.pyx":1408 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< @@ -14831,7 +14833,7 @@ static PyObject *__pyx_pf_8gedlibpy_13EditCostError___init__(CYTHON_UNUSED PyObj return __pyx_r; } -/* "gedlibpy.pyx":1417 +/* "gedlibpy.pyx":1425 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< @@ -14872,11 +14874,11 @@ static PyObject *__pyx_pw_8gedlibpy_11MethodError_1__init__(PyObject *__pyx_self case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_message)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 1417, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 1425, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 1417, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 1425, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -14889,7 +14891,7 @@ static PyObject *__pyx_pw_8gedlibpy_11MethodError_1__init__(PyObject *__pyx_self } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1417, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1425, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.MethodError.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -14907,16 +14909,16 @@ static PyObject *__pyx_pf_8gedlibpy_11MethodError___init__(CYTHON_UNUSED PyObjec __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); - /* "gedlibpy.pyx":1424 + /* "gedlibpy.pyx":1432 * :type message: string * """ * self.message = message # <<<<<<<<<<<<<< * * */ - if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_message, __pyx_v_message) < 0) __PYX_ERR(0, 1424, __pyx_L1_error) + if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_message, __pyx_v_message) < 0) __PYX_ERR(0, 1432, __pyx_L1_error) - /* "gedlibpy.pyx":1417 + /* "gedlibpy.pyx":1425 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< @@ -14936,7 +14938,7 @@ static PyObject *__pyx_pf_8gedlibpy_11MethodError___init__(CYTHON_UNUSED PyObjec return __pyx_r; } -/* "gedlibpy.pyx":1434 +/* "gedlibpy.pyx":1442 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< @@ -14977,11 +14979,11 @@ static PyObject *__pyx_pw_8gedlibpy_9InitError_1__init__(PyObject *__pyx_self, P case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_message)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 1434, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 1442, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 1434, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 1442, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -14994,7 +14996,7 @@ static PyObject *__pyx_pw_8gedlibpy_9InitError_1__init__(PyObject *__pyx_self, P } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1434, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1442, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("gedlibpy.InitError.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -15012,16 +15014,16 @@ static PyObject *__pyx_pf_8gedlibpy_9InitError___init__(CYTHON_UNUSED PyObject * __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); - /* "gedlibpy.pyx":1441 + /* "gedlibpy.pyx":1449 * :type message: string * """ * self.message = message # <<<<<<<<<<<<<< * * */ - if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_message, __pyx_v_message) < 0) __PYX_ERR(0, 1441, __pyx_L1_error) + if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_message, __pyx_v_message) < 0) __PYX_ERR(0, 1449, __pyx_L1_error) - /* "gedlibpy.pyx":1434 + /* "gedlibpy.pyx":1442 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< @@ -15041,7 +15043,7 @@ static PyObject *__pyx_pf_8gedlibpy_9InitError___init__(CYTHON_UNUSED PyObject * return __pyx_r; } -/* "gedlibpy.pyx":1448 +/* "gedlibpy.pyx":1456 * ######################################### * * def encode_your_map(map_u): # <<<<<<<<<<<<<< @@ -15081,19 +15083,19 @@ static PyObject *__pyx_pf_8gedlibpy_8encode_your_map(CYTHON_UNUSED PyObject *__p PyObject *__pyx_t_9 = NULL; __Pyx_RefNannySetupContext("encode_your_map", 0); - /* "gedlibpy.pyx":1460 + /* "gedlibpy.pyx":1468 * * """ * res = {} # <<<<<<<<<<<<<< * for key, value in map_u.items(): * res[key.encode('utf-8')] = value.encode('utf-8') */ - __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1460, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1468, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_res = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1461 + /* "gedlibpy.pyx":1469 * """ * res = {} * for key, value in map_u.items(): # <<<<<<<<<<<<<< @@ -15103,9 +15105,9 @@ static PyObject *__pyx_pf_8gedlibpy_8encode_your_map(CYTHON_UNUSED PyObject *__p __pyx_t_2 = 0; if (unlikely(__pyx_v_map_u == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); - __PYX_ERR(0, 1461, __pyx_L1_error) + __PYX_ERR(0, 1469, __pyx_L1_error) } - __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_map_u, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1461, __pyx_L1_error) + __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_map_u, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1469, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_5; @@ -15113,7 +15115,7 @@ static PyObject *__pyx_pf_8gedlibpy_8encode_your_map(CYTHON_UNUSED PyObject *__p while (1) { __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4); if (unlikely(__pyx_t_7 == 0)) break; - if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 1461, __pyx_L1_error) + if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 1469, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_5); @@ -15121,14 +15123,14 @@ static PyObject *__pyx_pf_8gedlibpy_8encode_your_map(CYTHON_UNUSED PyObject *__p __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_6); __pyx_t_6 = 0; - /* "gedlibpy.pyx":1462 + /* "gedlibpy.pyx":1470 * res = {} * for key, value in map_u.items(): * res[key.encode('utf-8')] = value.encode('utf-8') # <<<<<<<<<<<<<< * return res * */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1462, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1470, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_8 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { @@ -15142,10 +15144,10 @@ static PyObject *__pyx_pf_8gedlibpy_8encode_your_map(CYTHON_UNUSED PyObject *__p } __pyx_t_6 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_8, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1462, __pyx_L1_error) + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1470, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_key, __pyx_n_s_encode); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1462, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_key, __pyx_n_s_encode); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1470, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { @@ -15159,16 +15161,16 @@ static PyObject *__pyx_pf_8gedlibpy_8encode_your_map(CYTHON_UNUSED PyObject *__p } __pyx_t_5 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_9, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1462, __pyx_L1_error) + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1470, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (unlikely(PyDict_SetItem(__pyx_v_res, __pyx_t_5, __pyx_t_6) < 0)) __PYX_ERR(0, 1462, __pyx_L1_error) + if (unlikely(PyDict_SetItem(__pyx_v_res, __pyx_t_5, __pyx_t_6) < 0)) __PYX_ERR(0, 1470, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1463 + /* "gedlibpy.pyx":1471 * for key, value in map_u.items(): * res[key.encode('utf-8')] = value.encode('utf-8') * return res # <<<<<<<<<<<<<< @@ -15180,7 +15182,7 @@ static PyObject *__pyx_pf_8gedlibpy_8encode_your_map(CYTHON_UNUSED PyObject *__p __pyx_r = __pyx_v_res; goto __pyx_L0; - /* "gedlibpy.pyx":1448 + /* "gedlibpy.pyx":1456 * ######################################### * * def encode_your_map(map_u): # <<<<<<<<<<<<<< @@ -15206,7 +15208,7 @@ static PyObject *__pyx_pf_8gedlibpy_8encode_your_map(CYTHON_UNUSED PyObject *__p return __pyx_r; } -/* "gedlibpy.pyx":1466 +/* "gedlibpy.pyx":1474 * * * def decode_your_map(map_b): # <<<<<<<<<<<<<< @@ -15246,19 +15248,19 @@ static PyObject *__pyx_pf_8gedlibpy_10decode_your_map(CYTHON_UNUSED PyObject *__ PyObject *__pyx_t_9 = NULL; __Pyx_RefNannySetupContext("decode_your_map", 0); - /* "gedlibpy.pyx":1478 + /* "gedlibpy.pyx":1486 * * """ * res = {} # <<<<<<<<<<<<<< * for key, value in map_b.items(): * res[key.decode('utf-8')] = value.decode('utf-8') */ - __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1478, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1486, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_res = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1479 + /* "gedlibpy.pyx":1487 * """ * res = {} * for key, value in map_b.items(): # <<<<<<<<<<<<<< @@ -15268,9 +15270,9 @@ static PyObject *__pyx_pf_8gedlibpy_10decode_your_map(CYTHON_UNUSED PyObject *__ __pyx_t_2 = 0; if (unlikely(__pyx_v_map_b == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); - __PYX_ERR(0, 1479, __pyx_L1_error) + __PYX_ERR(0, 1487, __pyx_L1_error) } - __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_map_b, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1479, __pyx_L1_error) + __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_map_b, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1487, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_5; @@ -15278,7 +15280,7 @@ static PyObject *__pyx_pf_8gedlibpy_10decode_your_map(CYTHON_UNUSED PyObject *__ while (1) { __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4); if (unlikely(__pyx_t_7 == 0)) break; - if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 1479, __pyx_L1_error) + if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 1487, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_5); @@ -15286,14 +15288,14 @@ static PyObject *__pyx_pf_8gedlibpy_10decode_your_map(CYTHON_UNUSED PyObject *__ __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_6); __pyx_t_6 = 0; - /* "gedlibpy.pyx":1480 + /* "gedlibpy.pyx":1488 * res = {} * for key, value in map_b.items(): * res[key.decode('utf-8')] = value.decode('utf-8') # <<<<<<<<<<<<<< * return res * */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_decode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1480, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_decode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_8 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { @@ -15307,10 +15309,10 @@ static PyObject *__pyx_pf_8gedlibpy_10decode_your_map(CYTHON_UNUSED PyObject *__ } __pyx_t_6 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_8, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1480, __pyx_L1_error) + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_key, __pyx_n_s_decode); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1480, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_key, __pyx_n_s_decode); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { @@ -15324,16 +15326,16 @@ static PyObject *__pyx_pf_8gedlibpy_10decode_your_map(CYTHON_UNUSED PyObject *__ } __pyx_t_5 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_9, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_kp_u_utf_8); __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1480, __pyx_L1_error) + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (unlikely(PyDict_SetItem(__pyx_v_res, __pyx_t_5, __pyx_t_6) < 0)) __PYX_ERR(0, 1480, __pyx_L1_error) + if (unlikely(PyDict_SetItem(__pyx_v_res, __pyx_t_5, __pyx_t_6) < 0)) __PYX_ERR(0, 1488, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1481 + /* "gedlibpy.pyx":1489 * for key, value in map_b.items(): * res[key.decode('utf-8')] = value.decode('utf-8') * return res # <<<<<<<<<<<<<< @@ -15345,7 +15347,7 @@ static PyObject *__pyx_pf_8gedlibpy_10decode_your_map(CYTHON_UNUSED PyObject *__ __pyx_r = __pyx_v_res; goto __pyx_L0; - /* "gedlibpy.pyx":1466 + /* "gedlibpy.pyx":1474 * * * def decode_your_map(map_b): # <<<<<<<<<<<<<< @@ -15371,7 +15373,7 @@ static PyObject *__pyx_pf_8gedlibpy_10decode_your_map(CYTHON_UNUSED PyObject *__ return __pyx_r; } -/* "gedlibpy.pyx":1484 +/* "gedlibpy.pyx":1492 * * * def decode_graph_edges(map_edge_b): # <<<<<<<<<<<<<< @@ -15410,19 +15412,19 @@ static PyObject *__pyx_pf_8gedlibpy_12decode_graph_edges(CYTHON_UNUSED PyObject PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("decode_graph_edges", 0); - /* "gedlibpy.pyx":1502 + /* "gedlibpy.pyx":1510 * This is a helper function for function `GEDEnv.get_graph_edges()`. * """ * map_edges = {} # <<<<<<<<<<<<<< * for key, value in map_edge_b.items(): * map_edges[key] = decode_your_map(value) */ - __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1502, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1510, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_map_edges = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1503 + /* "gedlibpy.pyx":1511 * """ * map_edges = {} * for key, value in map_edge_b.items(): # <<<<<<<<<<<<<< @@ -15432,9 +15434,9 @@ static PyObject *__pyx_pf_8gedlibpy_12decode_graph_edges(CYTHON_UNUSED PyObject __pyx_t_2 = 0; if (unlikely(__pyx_v_map_edge_b == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); - __PYX_ERR(0, 1503, __pyx_L1_error) + __PYX_ERR(0, 1511, __pyx_L1_error) } - __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_map_edge_b, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1503, __pyx_L1_error) + __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_map_edge_b, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1511, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_5; @@ -15442,7 +15444,7 @@ static PyObject *__pyx_pf_8gedlibpy_12decode_graph_edges(CYTHON_UNUSED PyObject while (1) { __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4); if (unlikely(__pyx_t_7 == 0)) break; - if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 1503, __pyx_L1_error) + if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 1511, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_5); @@ -15450,14 +15452,14 @@ static PyObject *__pyx_pf_8gedlibpy_12decode_graph_edges(CYTHON_UNUSED PyObject __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_6); __pyx_t_6 = 0; - /* "gedlibpy.pyx":1504 + /* "gedlibpy.pyx":1512 * map_edges = {} * for key, value in map_edge_b.items(): * map_edges[key] = decode_your_map(value) # <<<<<<<<<<<<<< * return map_edges * */ - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1504, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_decode_your_map); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_8 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { @@ -15471,15 +15473,15 @@ static PyObject *__pyx_pf_8gedlibpy_12decode_graph_edges(CYTHON_UNUSED PyObject } __pyx_t_6 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_8, __pyx_v_value) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_value); __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1504, __pyx_L1_error) + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(PyDict_SetItem(__pyx_v_map_edges, __pyx_v_key, __pyx_t_6) < 0)) __PYX_ERR(0, 1504, __pyx_L1_error) + if (unlikely(PyDict_SetItem(__pyx_v_map_edges, __pyx_v_key, __pyx_t_6) < 0)) __PYX_ERR(0, 1512, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1505 + /* "gedlibpy.pyx":1513 * for key, value in map_edge_b.items(): * map_edges[key] = decode_your_map(value) * return map_edges # <<<<<<<<<<<<<< @@ -15491,7 +15493,7 @@ static PyObject *__pyx_pf_8gedlibpy_12decode_graph_edges(CYTHON_UNUSED PyObject __pyx_r = __pyx_v_map_edges; goto __pyx_L0; - /* "gedlibpy.pyx":1484 + /* "gedlibpy.pyx":1492 * * * def decode_graph_edges(map_edge_b): # <<<<<<<<<<<<<< @@ -20776,12 +20778,12 @@ static int __pyx_import_star_set(PyObject *o, PyObject* py_name, char *name) { "UINT32_t", "X", "Y", + "__pyx_ctuple_2ae87__58ae9__std__in_map__lAngstd__in_pair__lAngsize_t__comma_size_t__rAng__comma_std__in_map__lAngstd__in_string__comma_std__in_string__rAng__rAng__etc__etc", + "__pyx_ctuple_2ae87__58ae9__std__in_map__lAngstd__in_pair__lAngsize_t__comma_size_t__rAng__comma_std__in_map__lAngstd__in_string__comma_std__in_string__rAng__rAng__etc__etc_struct", "__pyx_ctuple_Py_ssize_t", "__pyx_ctuple_Py_ssize_t__and_Py_ssize_t", "__pyx_ctuple_Py_ssize_t__and_Py_ssize_t_struct", "__pyx_ctuple_Py_ssize_t_struct", - "__pyx_ctuple_bfa21__6a9b6__std__in_map__lAngstd__in_pair__lAngsize_t__comma_size_t__rAng__comma_std__in_map__lAngstd__in_string__comma_std__in_string__rAng__rAng__etc__etc", - "__pyx_ctuple_bfa21__6a9b6__std__in_map__lAngstd__in_pair__lAngsize_t__comma_size_t__rAng__comma_std__in_map__lAngstd__in_string__comma_std__in_string__rAng__rAng__etc__etc_struct", "__pyx_ctuple_double", "__pyx_ctuple_double_struct", "__pyx_ctuple_size_t", @@ -21149,9 +21151,9 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 750, __pyx_L1_error) - __pyx_builtin_print = __Pyx_GetBuiltinName(__pyx_n_s_print); if (!__pyx_builtin_print) __PYX_ERR(0, 977, __pyx_L1_error) - __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(0, 1364, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 758, __pyx_L1_error) + __pyx_builtin_print = __Pyx_GetBuiltinName(__pyx_n_s_print); if (!__pyx_builtin_print) __PYX_ERR(0, 985, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(0, 1372, __pyx_L1_error) __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(2, 272, __pyx_L1_error) __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(2, 856, __pyx_L1_error) @@ -21166,80 +21168,80 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "gedlibpy.pyx":977 + /* "gedlibpy.pyx":985 * self.restart_env() * * print("Loading graphs in progress...") # <<<<<<<<<<<<<< * for graph in dataset : * self.add_nx_graph(graph, classes) */ - __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_Loading_graphs_in_progress); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 977, __pyx_L1_error) + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_Loading_graphs_in_progress); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 985, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "gedlibpy.pyx":981 + /* "gedlibpy.pyx":989 * self.add_nx_graph(graph, classes) * listID = self.graph_ids() * print("Graphs loaded ! ") # <<<<<<<<<<<<<< * print("Number of graphs = " + str(listID[1])) * */ - __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_Graphs_loaded); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 981, __pyx_L1_error) + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_Graphs_loaded); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 989, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "gedlibpy.pyx":985 + /* "gedlibpy.pyx":993 * * self.set_edit_cost(edit_cost) * print("Initialization in progress...") # <<<<<<<<<<<<<< * self.init(init_option) * print("Initialization terminated !") */ - __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_Initialization_in_progress); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 985, __pyx_L1_error) + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_Initialization_in_progress); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 993, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "gedlibpy.pyx":987 + /* "gedlibpy.pyx":995 * print("Initialization in progress...") * self.init(init_option) * print("Initialization terminated !") # <<<<<<<<<<<<<< * * self.set_method(method, options) */ - __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_Initialization_terminated); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 987, __pyx_L1_error) + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_Initialization_terminated); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 995, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - /* "gedlibpy.pyx":1002 + /* "gedlibpy.pyx":1010 * resMapping[g][h] = self.get_node_map(g, h) * * print("Finish ! The return contains edit distances and NodeMap but you can check the result with graphs'ID until you restart the environment") # <<<<<<<<<<<<<< * return resDistance, resMapping * */ - __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Finish_The_return_contains_edit); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 1002, __pyx_L1_error) + __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Finish_The_return_contains_edit); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 1010, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); - /* "gedlibpy.pyx":1057 + /* "gedlibpy.pyx":1065 * #return res * * print ("Finish ! You can check the result with each ID of graphs ! There are in the return") # <<<<<<<<<<<<<< * print ("Please don't restart the environment or recall this function, you will lose your results !") * return listID */ - __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_Finish_You_can_check_the_result); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 1057, __pyx_L1_error) + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_Finish_You_can_check_the_result); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 1065, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); - /* "gedlibpy.pyx":1058 + /* "gedlibpy.pyx":1066 * * print ("Finish ! You can check the result with each ID of graphs ! There are in the return") * print ("Please don't restart the environment or recall this function, you will lose your results !") # <<<<<<<<<<<<<< * return listID * */ - __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_Please_don_t_restart_the_environ); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 1058, __pyx_L1_error) + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_Please_don_t_restart_the_environ); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 1066, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); @@ -21339,122 +21341,122 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__19); __Pyx_GIVEREF(__pyx_tuple__19); - /* "gedlibpy.pyx":128 + /* "gedlibpy.pyx":129 * * * def get_edit_cost_options() : # <<<<<<<<<<<<<< * """ * Searchs the differents edit cost functions and returns the result. */ - __pyx_tuple__21 = PyTuple_Pack(1, __pyx_n_s_option); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_n_s_option); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__21); __Pyx_GIVEREF(__pyx_tuple__21); - __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_get_edit_cost_options, 128, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_get_edit_cost_options, 129, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(0, 129, __pyx_L1_error) - /* "gedlibpy.pyx":142 + /* "gedlibpy.pyx":143 * * * def get_method_options() : # <<<<<<<<<<<<<< * """ * Searchs the differents method for edit distance computation between graphs and returns the result. */ - __pyx_tuple__23 = PyTuple_Pack(1, __pyx_n_s_option); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 142, __pyx_L1_error) + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_n_s_option); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__23); __Pyx_GIVEREF(__pyx_tuple__23); - __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_get_method_options, 142, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 142, __pyx_L1_error) + __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_get_method_options, 143, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 143, __pyx_L1_error) - /* "gedlibpy.pyx":155 + /* "gedlibpy.pyx":156 * * * def get_init_options() : # <<<<<<<<<<<<<< * """ * Searchs the differents initialization parameters for the environment computation for graphs and returns the result. */ - __pyx_tuple__25 = PyTuple_Pack(1, __pyx_n_s_option); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 155, __pyx_L1_error) + __pyx_tuple__25 = PyTuple_Pack(1, __pyx_n_s_option); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 156, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__25); __Pyx_GIVEREF(__pyx_tuple__25); - __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_get_init_options, 155, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(0, 155, __pyx_L1_error) + __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_get_init_options, 156, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(0, 156, __pyx_L1_error) - /* "gedlibpy.pyx":168 + /* "gedlibpy.pyx":169 * * * def get_dummy_node() : # <<<<<<<<<<<<<< * """ * Returns the ID of a dummy node. */ - __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_get_dummy_node, 168, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 168, __pyx_L1_error) + __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_get_dummy_node, 169, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 169, __pyx_L1_error) - /* "gedlibpy.pyx":1400 + /* "gedlibpy.pyx":1408 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< * """ * Inits the error with its message. */ - __pyx_tuple__28 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_message); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 1400, __pyx_L1_error) + __pyx_tuple__28 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_message); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 1408, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__28); __Pyx_GIVEREF(__pyx_tuple__28); - __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_init_2, 1400, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 1400, __pyx_L1_error) + __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_init_2, 1408, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 1408, __pyx_L1_error) - /* "gedlibpy.pyx":1417 + /* "gedlibpy.pyx":1425 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< * """ * Inits the error with its message. */ - __pyx_tuple__30 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_message); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 1417, __pyx_L1_error) + __pyx_tuple__30 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_message); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 1425, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__30); __Pyx_GIVEREF(__pyx_tuple__30); - __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_init_2, 1417, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 1417, __pyx_L1_error) + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_init_2, 1425, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 1425, __pyx_L1_error) - /* "gedlibpy.pyx":1434 + /* "gedlibpy.pyx":1442 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< * """ * Inits the error with its message. */ - __pyx_tuple__32 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_message); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 1434, __pyx_L1_error) + __pyx_tuple__32 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_message); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 1442, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__32); __Pyx_GIVEREF(__pyx_tuple__32); - __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_init_2, 1434, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 1434, __pyx_L1_error) + __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_init_2, 1442, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 1442, __pyx_L1_error) - /* "gedlibpy.pyx":1448 + /* "gedlibpy.pyx":1456 * ######################################### * * def encode_your_map(map_u): # <<<<<<<<<<<<<< * """ * Encodes Python unicode strings in dictionnary `map` to utf-8 byte strings for C++ functions. */ - __pyx_tuple__34 = PyTuple_Pack(4, __pyx_n_s_map_u, __pyx_n_s_res, __pyx_n_s_key, __pyx_n_s_value); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 1448, __pyx_L1_error) + __pyx_tuple__34 = PyTuple_Pack(4, __pyx_n_s_map_u, __pyx_n_s_res, __pyx_n_s_key, __pyx_n_s_value); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 1456, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__34); __Pyx_GIVEREF(__pyx_tuple__34); - __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_encode_your_map, 1448, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(0, 1448, __pyx_L1_error) + __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_encode_your_map, 1456, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(0, 1456, __pyx_L1_error) - /* "gedlibpy.pyx":1466 + /* "gedlibpy.pyx":1474 * * * def decode_your_map(map_b): # <<<<<<<<<<<<<< * """ * Decodes utf-8 byte strings in `map` from C++ functions to Python unicode strings. */ - __pyx_tuple__36 = PyTuple_Pack(4, __pyx_n_s_map_b, __pyx_n_s_res, __pyx_n_s_key, __pyx_n_s_value); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 1466, __pyx_L1_error) + __pyx_tuple__36 = PyTuple_Pack(4, __pyx_n_s_map_b, __pyx_n_s_res, __pyx_n_s_key, __pyx_n_s_value); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 1474, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__36); __Pyx_GIVEREF(__pyx_tuple__36); - __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_decode_your_map, 1466, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 1466, __pyx_L1_error) + __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_decode_your_map, 1474, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 1474, __pyx_L1_error) - /* "gedlibpy.pyx":1484 + /* "gedlibpy.pyx":1492 * * * def decode_graph_edges(map_edge_b): # <<<<<<<<<<<<<< * """ * Decode utf-8 byte strings in graph edges `map` from C++ functions to Python unicode strings. */ - __pyx_tuple__38 = PyTuple_Pack(4, __pyx_n_s_map_edge_b, __pyx_n_s_map_edges, __pyx_n_s_key, __pyx_n_s_value); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 1484, __pyx_L1_error) + __pyx_tuple__38 = PyTuple_Pack(4, __pyx_n_s_map_edge_b, __pyx_n_s_map_edges, __pyx_n_s_key, __pyx_n_s_value); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 1492, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__38); __Pyx_GIVEREF(__pyx_tuple__38); - __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_decode_graph_edges, 1484, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 1484, __pyx_L1_error) + __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gedlibpy_pyx, __pyx_n_s_decode_graph_edges, 1492, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 1492, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -21507,15 +21509,15 @@ static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ - if (PyType_Ready(&__pyx_type_8gedlibpy_GEDEnv) < 0) __PYX_ERR(0, 180, __pyx_L1_error) + if (PyType_Ready(&__pyx_type_8gedlibpy_GEDEnv) < 0) __PYX_ERR(0, 182, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_8gedlibpy_GEDEnv.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_8gedlibpy_GEDEnv.tp_dictoffset && __pyx_type_8gedlibpy_GEDEnv.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_8gedlibpy_GEDEnv.tp_getattro = __Pyx_PyObject_GenericGetAttr; } - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_GEDEnv, (PyObject *)&__pyx_type_8gedlibpy_GEDEnv) < 0) __PYX_ERR(0, 180, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type_8gedlibpy_GEDEnv) < 0) __PYX_ERR(0, 180, __pyx_L1_error) + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_GEDEnv, (PyObject *)&__pyx_type_8gedlibpy_GEDEnv) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_8gedlibpy_GEDEnv) < 0) __PYX_ERR(0, 182, __pyx_L1_error) __pyx_ptype_8gedlibpy_GEDEnv = &__pyx_type_8gedlibpy_GEDEnv; __Pyx_RefNannyFinishContext(); return 0; @@ -21793,588 +21795,588 @@ if (!__Pyx_RefNanny) { if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif - /* "gedlibpy.pyx":115 - * ############################# + /* "gedlibpy.pyx":116 * + * import cython * import numpy as np # <<<<<<<<<<<<<< * import networkx as nx * from gklearn.ged.env import NodeMap */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 115, __pyx_L1_error) + __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 116, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 115, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 116, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":116 - * + /* "gedlibpy.pyx":117 + * import cython * import numpy as np * import networkx as nx # <<<<<<<<<<<<<< * from gklearn.ged.env import NodeMap * */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_networkx, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 116, __pyx_L1_error) + __pyx_t_1 = __Pyx_Import(__pyx_n_s_networkx, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_nx, __pyx_t_1) < 0) __PYX_ERR(0, 116, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_nx, __pyx_t_1) < 0) __PYX_ERR(0, 117, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":117 + /* "gedlibpy.pyx":118 * import numpy as np * import networkx as nx * from gklearn.ged.env import NodeMap # <<<<<<<<<<<<<< * * # import librariesImport */ - __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 118, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_NodeMap); __Pyx_GIVEREF(__pyx_n_s_NodeMap); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_NodeMap); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_gklearn_ged_env, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_2 = __Pyx_Import(__pyx_n_s_gklearn_ged_env, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_NodeMap); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 117, __pyx_L1_error) + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_NodeMap); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 118, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_NodeMap, __pyx_t_1) < 0) __PYX_ERR(0, 117, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_NodeMap, __pyx_t_1) < 0) __PYX_ERR(0, 118, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "gedlibpy.pyx":120 + /* "gedlibpy.pyx":121 * * # import librariesImport * from ctypes import * # <<<<<<<<<<<<<< * import os * lib1 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/fann/libdoublefann.so') */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 120, __pyx_L1_error) + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s__20); __Pyx_GIVEREF(__pyx_n_s__20); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s__20); - __pyx_t_1 = __Pyx_Import(__pyx_n_s_ctypes, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 120, __pyx_L1_error) + __pyx_t_1 = __Pyx_Import(__pyx_n_s_ctypes, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 121, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (__pyx_import_star(__pyx_t_1) < 0) __PYX_ERR(0, 120, __pyx_L1_error); + if (__pyx_import_star(__pyx_t_1) < 0) __PYX_ERR(0, 121, __pyx_L1_error); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":121 + /* "gedlibpy.pyx":122 * # import librariesImport * from ctypes import * * import os # <<<<<<<<<<<<<< * lib1 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/fann/libdoublefann.so') * lib2 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/libsvm.3.22/libsvm.so') */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_os, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 121, __pyx_L1_error) + __pyx_t_1 = __Pyx_Import(__pyx_n_s_os, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_os, __pyx_t_1) < 0) __PYX_ERR(0, 121, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_os, __pyx_t_1) < 0) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":122 + /* "gedlibpy.pyx":123 * from ctypes import * * import os * lib1 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/fann/libdoublefann.so') # <<<<<<<<<<<<<< * lib2 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/libsvm.3.22/libsvm.so') * lib3 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/nomad/libnomad.so') */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_cdll); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_cdll); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LoadLibrary); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LoadLibrary); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_os); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_os); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_path); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_path); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_dirname); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_dirname); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_os); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_os); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_path); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_path); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_realpath); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_realpath); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_file); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_file); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_kp_u_lib_fann_libdoublefann_so); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_kp_u_lib_fann_libdoublefann_so); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_lib1, __pyx_t_4) < 0) __PYX_ERR(0, 122, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_lib1, __pyx_t_4) < 0) __PYX_ERR(0, 123, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "gedlibpy.pyx":123 + /* "gedlibpy.pyx":124 * import os * lib1 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/fann/libdoublefann.so') * lib2 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/libsvm.3.22/libsvm.so') # <<<<<<<<<<<<<< * lib3 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/nomad/libnomad.so') * lib4 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/nomad/libsgtelib.so') */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_cdll); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_cdll); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_LoadLibrary); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_LoadLibrary); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_os); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_os); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_path); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_path); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_dirname); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_dirname); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_os); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_os); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_path); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_path); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_realpath); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_realpath); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_file); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_file); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_kp_u_lib_libsvm_3_22_libsvm_so); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_kp_u_lib_libsvm_3_22_libsvm_so); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_lib2, __pyx_t_1) < 0) __PYX_ERR(0, 123, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_lib2, __pyx_t_1) < 0) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":124 + /* "gedlibpy.pyx":125 * lib1 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/fann/libdoublefann.so') * lib2 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/libsvm.3.22/libsvm.so') * lib3 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/nomad/libnomad.so') # <<<<<<<<<<<<<< * lib4 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/nomad/libsgtelib.so') * */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_cdll); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_cdll); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LoadLibrary); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LoadLibrary); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_os); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_os); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_path); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_path); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_dirname); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_dirname); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_os); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_os); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_path); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_path); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_realpath); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_realpath); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_file); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_file); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_kp_u_lib_nomad_libnomad_so); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_kp_u_lib_nomad_libnomad_so); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_lib3, __pyx_t_4) < 0) __PYX_ERR(0, 124, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_lib3, __pyx_t_4) < 0) __PYX_ERR(0, 125, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "gedlibpy.pyx":125 + /* "gedlibpy.pyx":126 * lib2 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/libsvm.3.22/libsvm.so') * lib3 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/nomad/libnomad.so') * lib4 = cdll.LoadLibrary(os.path.dirname(os.path.realpath(__file__)) + '/lib/nomad/libsgtelib.so') # <<<<<<<<<<<<<< * * */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_cdll); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_cdll); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_LoadLibrary); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_LoadLibrary); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_os); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_os); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_path); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_path); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_dirname); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_dirname); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_os); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_os); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_path); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_path); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_realpath); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_realpath); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_file); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_file); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_kp_u_lib_nomad_libsgtelib_so); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_kp_u_lib_nomad_libsgtelib_so); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_lib4, __pyx_t_1) < 0) __PYX_ERR(0, 125, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_lib4, __pyx_t_1) < 0) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":128 + /* "gedlibpy.pyx":129 * * * def get_edit_cost_options() : # <<<<<<<<<<<<<< * """ * Searchs the differents edit cost functions and returns the result. */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_1get_edit_cost_options, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_1get_edit_cost_options, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_edit_cost_options, __pyx_t_1) < 0) __PYX_ERR(0, 128, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_edit_cost_options, __pyx_t_1) < 0) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":142 + /* "gedlibpy.pyx":143 * * * def get_method_options() : # <<<<<<<<<<<<<< * """ * Searchs the differents method for edit distance computation between graphs and returns the result. */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_3get_method_options, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_3get_method_options, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_method_options, __pyx_t_1) < 0) __PYX_ERR(0, 142, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_method_options, __pyx_t_1) < 0) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":155 + /* "gedlibpy.pyx":156 * * * def get_init_options() : # <<<<<<<<<<<<<< * """ * Searchs the differents initialization parameters for the environment computation for graphs and returns the result. */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_5get_init_options, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 155, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_5get_init_options, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_init_options, __pyx_t_1) < 0) __PYX_ERR(0, 155, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_init_options, __pyx_t_1) < 0) __PYX_ERR(0, 156, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":168 + /* "gedlibpy.pyx":169 * * * def get_dummy_node() : # <<<<<<<<<<<<<< * """ * Returns the ID of a dummy node. */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_7get_dummy_node, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 168, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_7get_dummy_node, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 169, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_dummy_node, __pyx_t_1) < 0) __PYX_ERR(0, 168, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_dummy_node, __pyx_t_1) < 0) __PYX_ERR(0, 169, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":485 + /* "gedlibpy.pyx":493 * * * def set_edit_cost(self, edit_cost, edit_cost_constant = []) : # <<<<<<<<<<<<<< * """ * Sets an edit cost function to the environment, if it exists. */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 485, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 493, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_k__2 = __pyx_t_1; __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":504 + /* "gedlibpy.pyx":512 * * * def set_personal_edit_cost(self, edit_cost_constant = []) : # <<<<<<<<<<<<<< * """ * Sets an personal edit cost function to the environment. */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 504, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_k__3 = __pyx_t_1; __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1377 + /* "gedlibpy.pyx":1385 * ##################################################################### * * list_of_edit_cost_options = get_edit_cost_options() # <<<<<<<<<<<<<< * list_of_method_options = get_method_options() * list_of_init_options = get_init_options() */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_get_edit_cost_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1377, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_get_edit_cost_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1385, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1377, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1385, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_list_of_edit_cost_options, __pyx_t_5) < 0) __PYX_ERR(0, 1377, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_list_of_edit_cost_options, __pyx_t_5) < 0) __PYX_ERR(0, 1385, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - /* "gedlibpy.pyx":1378 + /* "gedlibpy.pyx":1386 * * list_of_edit_cost_options = get_edit_cost_options() * list_of_method_options = get_method_options() # <<<<<<<<<<<<<< * list_of_init_options = get_init_options() * */ - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_get_method_options); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1378, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_get_method_options); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1378, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_list_of_method_options, __pyx_t_1) < 0) __PYX_ERR(0, 1378, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_list_of_method_options, __pyx_t_1) < 0) __PYX_ERR(0, 1386, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1379 + /* "gedlibpy.pyx":1387 * list_of_edit_cost_options = get_edit_cost_options() * list_of_method_options = get_method_options() * list_of_init_options = get_init_options() # <<<<<<<<<<<<<< * * */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_get_init_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1379, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_get_init_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1387, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1379, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1387, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_list_of_init_options, __pyx_t_5) < 0) __PYX_ERR(0, 1379, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_list_of_init_options, __pyx_t_5) < 0) __PYX_ERR(0, 1387, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - /* "gedlibpy.pyx":1386 + /* "gedlibpy.pyx":1394 * ##################### * * class Error(Exception): # <<<<<<<<<<<<<< * """ * Class for error's management. This one is general. */ - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1386, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); __Pyx_GIVEREF(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); - __pyx_t_1 = __Pyx_CalculateMetaclass(NULL, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1386, __pyx_L1_error) + __pyx_t_1 = __Pyx_CalculateMetaclass(NULL, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_1, __pyx_t_5, __pyx_n_s_Error, __pyx_n_s_Error, (PyObject *) NULL, __pyx_n_s_gedlibpy, __pyx_kp_s_Class_for_error_s_management_Th); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1386, __pyx_L1_error) + __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_1, __pyx_t_5, __pyx_n_s_Error, __pyx_n_s_Error, (PyObject *) NULL, __pyx_n_s_gedlibpy, __pyx_kp_s_Class_for_error_s_management_Th); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_1, __pyx_n_s_Error, __pyx_t_5, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1386, __pyx_L1_error) + __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_1, __pyx_n_s_Error, __pyx_t_5, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_Error, __pyx_t_4) < 0) __PYX_ERR(0, 1386, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_Error, __pyx_t_4) < 0) __PYX_ERR(0, 1394, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - /* "gedlibpy.pyx":1393 + /* "gedlibpy.pyx":1401 * * * class EditCostError(Error) : # <<<<<<<<<<<<<< * """ * Class for Edit Cost Error. Raise an error if an edit cost function doesn't exist in the library (not in list_of_edit_cost_options). */ - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_Error); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1393, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_Error); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1401, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1393, __pyx_L1_error) + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1401, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_CalculateMetaclass(NULL, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1393, __pyx_L1_error) + __pyx_t_5 = __Pyx_CalculateMetaclass(NULL, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1401, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_5, __pyx_t_1, __pyx_n_s_EditCostError, __pyx_n_s_EditCostError, (PyObject *) NULL, __pyx_n_s_gedlibpy, __pyx_kp_s_Class_for_Edit_Cost_Error_Raise); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1393, __pyx_L1_error) + __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_5, __pyx_t_1, __pyx_n_s_EditCostError, __pyx_n_s_EditCostError, (PyObject *) NULL, __pyx_n_s_gedlibpy, __pyx_kp_s_Class_for_Edit_Cost_Error_Raise); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1401, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - /* "gedlibpy.pyx":1400 + /* "gedlibpy.pyx":1408 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< * """ * Inits the error with its message. */ - __pyx_t_4 = __Pyx_CyFunction_NewEx(&__pyx_mdef_8gedlibpy_13EditCostError_1__init__, 0, __pyx_n_s_EditCostError___init, NULL, __pyx_n_s_gedlibpy, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1400, __pyx_L1_error) + __pyx_t_4 = __Pyx_CyFunction_NewEx(&__pyx_mdef_8gedlibpy_13EditCostError_1__init__, 0, __pyx_n_s_EditCostError___init, NULL, __pyx_n_s_gedlibpy, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_init_2, __pyx_t_4) < 0) __PYX_ERR(0, 1400, __pyx_L1_error) + if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_init_2, __pyx_t_4) < 0) __PYX_ERR(0, 1408, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "gedlibpy.pyx":1393 + /* "gedlibpy.pyx":1401 * * * class EditCostError(Error) : # <<<<<<<<<<<<<< * """ * Class for Edit Cost Error. Raise an error if an edit cost function doesn't exist in the library (not in list_of_edit_cost_options). */ - __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_5, __pyx_n_s_EditCostError, __pyx_t_1, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1393, __pyx_L1_error) + __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_5, __pyx_n_s_EditCostError, __pyx_t_1, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1401, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_EditCostError, __pyx_t_4) < 0) __PYX_ERR(0, 1393, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_EditCostError, __pyx_t_4) < 0) __PYX_ERR(0, 1401, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1410 + /* "gedlibpy.pyx":1418 * * * class MethodError(Error) : # <<<<<<<<<<<<<< * """ * Class for Method Error. Raise an error if a computation method doesn't exist in the library (not in list_of_method_options). */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_Error); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1410, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_Error); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1410, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_CalculateMetaclass(NULL, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1410, __pyx_L1_error) + __pyx_t_1 = __Pyx_CalculateMetaclass(NULL, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_1, __pyx_t_5, __pyx_n_s_MethodError, __pyx_n_s_MethodError, (PyObject *) NULL, __pyx_n_s_gedlibpy, __pyx_kp_s_Class_for_Method_Error_Raise_an); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1410, __pyx_L1_error) + __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_1, __pyx_t_5, __pyx_n_s_MethodError, __pyx_n_s_MethodError, (PyObject *) NULL, __pyx_n_s_gedlibpy, __pyx_kp_s_Class_for_Method_Error_Raise_an); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - /* "gedlibpy.pyx":1417 + /* "gedlibpy.pyx":1425 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< * """ * Inits the error with its message. */ - __pyx_t_4 = __Pyx_CyFunction_NewEx(&__pyx_mdef_8gedlibpy_11MethodError_1__init__, 0, __pyx_n_s_MethodError___init, NULL, __pyx_n_s_gedlibpy, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1417, __pyx_L1_error) + __pyx_t_4 = __Pyx_CyFunction_NewEx(&__pyx_mdef_8gedlibpy_11MethodError_1__init__, 0, __pyx_n_s_MethodError___init, NULL, __pyx_n_s_gedlibpy, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1425, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_init_2, __pyx_t_4) < 0) __PYX_ERR(0, 1417, __pyx_L1_error) + if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_init_2, __pyx_t_4) < 0) __PYX_ERR(0, 1425, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "gedlibpy.pyx":1410 + /* "gedlibpy.pyx":1418 * * * class MethodError(Error) : # <<<<<<<<<<<<<< * """ * Class for Method Error. Raise an error if a computation method doesn't exist in the library (not in list_of_method_options). */ - __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_1, __pyx_n_s_MethodError, __pyx_t_5, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1410, __pyx_L1_error) + __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_1, __pyx_n_s_MethodError, __pyx_t_5, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_MethodError, __pyx_t_4) < 0) __PYX_ERR(0, 1410, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_MethodError, __pyx_t_4) < 0) __PYX_ERR(0, 1418, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - /* "gedlibpy.pyx":1427 + /* "gedlibpy.pyx":1435 * * * class InitError(Error) : # <<<<<<<<<<<<<< * """ * Class for Init Error. Raise an error if an init option doesn't exist in the library (not in list_of_init_options). */ - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_Error); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1427, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_Error); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1435, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1427, __pyx_L1_error) + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1435, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_CalculateMetaclass(NULL, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1427, __pyx_L1_error) + __pyx_t_5 = __Pyx_CalculateMetaclass(NULL, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1435, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_5, __pyx_t_1, __pyx_n_s_InitError, __pyx_n_s_InitError, (PyObject *) NULL, __pyx_n_s_gedlibpy, __pyx_kp_s_Class_for_Init_Error_Raise_an_e); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1427, __pyx_L1_error) + __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_5, __pyx_t_1, __pyx_n_s_InitError, __pyx_n_s_InitError, (PyObject *) NULL, __pyx_n_s_gedlibpy, __pyx_kp_s_Class_for_Init_Error_Raise_an_e); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1435, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - /* "gedlibpy.pyx":1434 + /* "gedlibpy.pyx":1442 * :type message: string * """ * def __init__(self, message): # <<<<<<<<<<<<<< * """ * Inits the error with its message. */ - __pyx_t_4 = __Pyx_CyFunction_NewEx(&__pyx_mdef_8gedlibpy_9InitError_1__init__, 0, __pyx_n_s_InitError___init, NULL, __pyx_n_s_gedlibpy, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1434, __pyx_L1_error) + __pyx_t_4 = __Pyx_CyFunction_NewEx(&__pyx_mdef_8gedlibpy_9InitError_1__init__, 0, __pyx_n_s_InitError___init, NULL, __pyx_n_s_gedlibpy, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1442, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_init_2, __pyx_t_4) < 0) __PYX_ERR(0, 1434, __pyx_L1_error) + if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_init_2, __pyx_t_4) < 0) __PYX_ERR(0, 1442, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "gedlibpy.pyx":1427 + /* "gedlibpy.pyx":1435 * * * class InitError(Error) : # <<<<<<<<<<<<<< * """ * Class for Init Error. Raise an error if an init option doesn't exist in the library (not in list_of_init_options). */ - __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_5, __pyx_n_s_InitError, __pyx_t_1, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1427, __pyx_L1_error) + __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_5, __pyx_n_s_InitError, __pyx_t_1, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1435, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_InitError, __pyx_t_4) < 0) __PYX_ERR(0, 1427, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_InitError, __pyx_t_4) < 0) __PYX_ERR(0, 1435, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1448 + /* "gedlibpy.pyx":1456 * ######################################### * * def encode_your_map(map_u): # <<<<<<<<<<<<<< * """ * Encodes Python unicode strings in dictionnary `map` to utf-8 byte strings for C++ functions. */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_9encode_your_map, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1448, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_9encode_your_map, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1456, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_encode_your_map, __pyx_t_1) < 0) __PYX_ERR(0, 1448, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_encode_your_map, __pyx_t_1) < 0) __PYX_ERR(0, 1456, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1466 + /* "gedlibpy.pyx":1474 * * * def decode_your_map(map_b): # <<<<<<<<<<<<<< * """ * Decodes utf-8 byte strings in `map` from C++ functions to Python unicode strings. */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_11decode_your_map, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1466, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_11decode_your_map, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1474, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_decode_your_map, __pyx_t_1) < 0) __PYX_ERR(0, 1466, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_decode_your_map, __pyx_t_1) < 0) __PYX_ERR(0, 1474, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "gedlibpy.pyx":1484 + /* "gedlibpy.pyx":1492 * * * def decode_graph_edges(map_edge_b): # <<<<<<<<<<<<<< * """ * Decode utf-8 byte strings in graph edges `map` from C++ functions to Python unicode strings. */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_13decode_graph_edges, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1484, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8gedlibpy_13decode_graph_edges, NULL, __pyx_n_s_gedlibpy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_decode_graph_edges, __pyx_t_1) < 0) __PYX_ERR(0, 1484, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_decode_graph_edges, __pyx_t_1) < 0) __PYX_ERR(0, 1492, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gedlibpy.pyx":1 diff --git a/gklearn/gedlib/gedlibpy.cpython-36m-x86_64-linux-gnu.so b/gklearn/gedlib/gedlibpy.cpython-36m-x86_64-linux-gnu.so index 94b9401a92d6d6d3fa7ba03c3b42d0924d074018..9d24796d0afff95aaaad76f57ff8c9a29bc1b9e1 100644 GIT binary patch delta 118767 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 zHvkC(oK6$~00000Q}0Pv01>|k&<8gF2?Lf+6aWAK002|9P1gVszzEO>HvkC(kWLf; z00000Q>S}&01?3m&<8gF2?L5w6aWAK002{4_k;iu!j}&dPZcf02+#*N00{$rP80wD z0000}c|JS<5yS}c1UCQ)19wgo0000008>VwCjb$}mr)Z>6)naH@&q>k2?J?P6aWAK z002|Y-MIh}#|ZKSHvkC(VonqQ00000Q_U#@0TIZTlM_!Y0m+xZ6HgU?$_R-CHvkC( zKu#0@00000Q-5ah01?Xw@&q>k2?H}u6aWAK002{y9De{2%m@P*HvkC(C{7dr00000 zQ{^#@01?dyi3K+R2?H2T6aWAK002{z4p;yY&Is}ZHvkC(3r-XO00000Q=~o)0TIs# z0~j{|2?GF56aWAK002`Q{af4s5zq)S1vdZ*1Nco80000008IiuUHvkC(h)fg!00000Q)ER)01@j5c?UND2?Kac6aWAK z002`8KMMg7>k>01@&C0~j{|2?GdB6aWAK002{gr$zt~^9TbNHvkC(_)8Q300000Q;{3H01@;E z0~j{|2?OX$6aWAK002{AX#@cg^_QO)PZcfp2m=^500{%gOB4VA0000}L4_01*obPX#vs2?Kaa6aWAK002{x4rKrl3<*yKHvkC(Xi5|S00000 zQ~XpU01*wBuNhAjEe;7@8#e$614v2~0000008_bC2LKTd39|<`00{#yN)!M90000} zg*+et5fGR08BY}#5eZ%!HvkC(2uc(H00000Q*>;{01*#% z00000080000008`3ZJ^&FO2@)SS00{#yNfZD80000}S*4Z$5g(Un8&52MAPLzYHvkC( z@JJK@00000Q$lyC01+Vx?FTmi2?Nkb6aWAK002{HUwHr#A_=nxHvkC(ut*dD00000 zQ(EdE01+bzvj;Z-2?LNw6aWAK002`9gjN6%BngckHvkC(a7YvY00000Q}m_%01+h# zjUG1u2?J0_6aWAK005Df6dX?+0VbC*98VQlCkfdfHvkC(5J(gN00000Q-Lx%01+q& z*&jCm2?Ov)6aWAK002|jcY**BDGAvhHvkC(&_@&i00000Q-D&I01+w)*&jCm2?MZ4 z6aWAK002`Q-NFD7E0>=fPb?QK2@fGR00{$dM-%`60000}VQ-ND5iOVE98W9(E|(7- zPZcdM2~r_900{#SM-%`60000}2|*D75iki-AvXXC1Mo%^0000008?Q!1pyH;mr)&0 z6#+7rXB|&07c&XhAvXXC1CT}(0000008@#OIsg$gm#Q64ELk-P8X`9U2?J0@6aWAK z002`3W&r>ZHVF(0HvkC(Fh&#r00000Q~U>?01-C{3<@^@2?G#D6aWAK002{2ZGZp~ zI0^3wHvkC(@I@2=00000Q;)Uo01-KtFCI@7EjkI(2{!-<1F%ID0000008>IQ9RLwK z2^u0d00{$-MHB!40000}2=smc5j>Z19#1R*J(r#yPb>jGm&+bcECD~4_#RIz0YH}} zA5Sa+L6=e=Pb>jKmwz8mEdfK9tshS;0YsPDA5Sa+MVAL4Pb>jOmoy+xECENCVIWT| z0Z5mQAWtj-Nte4IPb>jSm*^l*ECEZG6(LV70Zf-dAx|s;O_y&WPb?Qs3Ew3*00{%2 zJQM%`0000}2hvdh5l@%0Ax|s;P?z5!PZcdu2?n(e00{%|$Tt800000}Du*io5mE^T zwGIFY1L(*%0000008Q z4gd)Q(8xCc00000Q?Fq=01;LR2DJ_V2?NN;Hvj+t002{rR2KjdR|y8S4gd)Qz{ocM z00000Q}dn!01;T1k0MVMEm;W$wGIFY1F*<90000008`_azyJ|i2?n(e00{%A$Tt80 z0000}6bQ8d5nGqhB2N`rTnPrX4gd)Qn8-H(00000Q(V?P01;gY2DJ_V2?LPGHvj+t z002|;iw*!0UI_-Z4gd)Qh{!hp00000Q=AOe01;ma2DJ_V2?K!0Hvj+t002{EN-F>n zV3$85PZcd;2?n(e00{$d$Tt800000}D%Rux5n>4jwGIFY18B%M0000008{R-v;Yxf zmw_Ws6kZ1ZV3jp4gd)Q2*@`8 z00000Q#CM*01ob}m*FH&6O7CIAt7 z2?n(e00{%A$2R}~0000}RXx)H5qp=BB~KMud2DJ_V2?I#SHvj+t002{loCp9BhY1F?4gd)QK*u)#00000QwiJI z01=3nuO?3wEr|&RwGIFY12D%o0000008`41zyJ}72?n(e00{#q$2R}~0000}Iw5cX z5sR1cCQlVvj0py{4gd)Q7{@mN00000Q;;A|01=G|2DJ_V2?G$vHvj+t002|REKUFs zjtK^}4gd)Q2*)=700000Q}HxV01=M~2DJ_V2?GGfHvj+t002{VZ=V1Wke6R4PZceZ z2?n(e00{%|#y0=}0000}jtjE@5t0c8wGIFY1L(##0000008=7ENB|L&m!T(5674gd)Qz{WQK00000Q#L1W01=p%4=7I+Etv@hwGIFY1F*(7 z0000008_RI^8gW=2?n(e00{%A#y0=}0000}3sgk_5u2A$C{GnxoCyZC4gd)Qn8r5% z00000Q+0Vb01=%D2DJ_V2?LPEHvj+t002`qKllI~k01>7M2DJ_V2?I#RHvj+t002|go(TaFrwInN4gd)Q zK*l!!00000Q?!by01>E{Zz)d|EvX3xwGIFY12D!n0000008`q&od6N42?n(e00{#q z#y0=}0000}+%a_k5v!N6DNhwytO*9S4gd)Q7{)gM00000Qx6q<01>ST2DJ_V2?G$u zHvj+t002`7etZBCt_cRU4gd)Q2*x)600000Q#%u(01>YV2DJ_V2?GGeHvj+t002`$ zCvN}|u$LbyPZce(2?n(e00{%|#Ww%|0000}f)=R&5wZyewGIFY1L(y!0000008?zh zF#r*>mtiVT6tc2DJ_V2?NN*Hvj+t002|ioIL;$w+RNd4gd)Qz{NKJ00000Q{x5(0TH;D&niz9 zEx8E>wGIFY1F*$60000008`!zy#Nuq2?n(e00{%A#Ww%|0000}z_?j2DJ_V2?LPDHvj+t002|=BjErMz6l1k4gd)Q zh{ZPm00000Q-9=l01>|l2DJ_V2?Kz|Hvj+t002{tdZc01?QSFDy?LEy)Q6wGIFY12Dxm0000008{el zmH-jT2?n(e00{#q#Ww%|0000}pSK4A5zCixEKe0#%n1gy4gd)Q7{xaL00000Q#M$8 z01?dz2DJ_V2?G$tHvj+t002{!LJ9y8&Ity!4gd)Q2*o!500000Qv%=M01?j#2DJ_V z2?GGdHvj+t002|DBE$d@(3jsVPZcfE2?n(e00{%|#5Vu{0000}_c5z+|;wGIFY z1L(vz0000008{-TA^;K7mmw`r6c*4gd)Q z(8ModG2?n(e00{%A#5Vu{0000} znD77q5!;v1El(9$+zAG?4gd)Qn8Y^#00000Q$r#;01@2@2DJ_V2?LPCHvj+t002`$ z`~?6J-U$Y^4gd)Qh{QJl00000Q&Ob@01@8_2DJ_V2?Kz{Hvj+t002|3<*)z|;Fmux zPZcfU2?n(e00{$d#5Vu{0000}lM2!R5#k93wGIFY18BrI0000008=LY@&FOzmw_%% z6BRY01@p82DJ_V2?G$sHvj+t002`NMk@dj?g<994gd)Q2*fu400000 zQ^ocF01@vA2DJ_V2?GGcHvj+t002{3OqKu<@Ry%2PZcfk2?n(e00{%|!#4l`0000} zi^Pop5%LKJwGIFY1L(sy0000008`Eu009y6m*Fo@6;_X!5I z4gd)Qz{58H00000Q;7MK01^0?PcTmvE%^xswGIFY1F*w40000008@081_2TJ2?n(e z00{%A!#4l`0000}Jzzxu5&M^sFi#a){0RoN4gd)Qn8P;!00000Q00000 zQ_W|)01*ZX2DJ_V2?I#OHvj+t002`KBD??*2MPwY4gd)QK*Kix00000Q>@7i0TEf3 zuQ5**Em{f&wGIFY12Drk0000008{mczW@_01oD>f0q|DPaYSH3Trqw00{%2 zhc^HK0000}sgRxk5sjBjG*2iO~GbN~@Qm&!CxCl{9sC^J>riaR#|2?M}u zHvj+t002`(hWr2#f0t`FPbdM!my|b8C;=ary*E!v0g;yoI8Sf^@0WQvPbdL3m!ddN zC;qjj+fs&PbU}b zEj>Xu00{%29yb600000}Z|A-M5ipk>Jx?bAj+aF}PbdM>mu@{zCjoMomOW1=0nV4c zJx?cDDli;EHvkC(Kp8gx00000Qy$7601@Iaqd_+S2?GEaHvj+t002`r2gm>sf-%fN zHvkC(Ko>Uv00000QwKyo01@6X^g%ZO2?Kx@Hvj+t002_}OrHP|I+s2^PbdNPmuEgt zCjlOpk3LT*0b-Z9K2InCx|iWTPbU|ZIX^=;00{$N4mSV*0000}2xtTW5tf%9KTj1c z{y9HGHvkC(zzsJ500000QyKsw01^K=fX5C12?HRvHvj+t002{p?kWHgXP03=PZa@Z zmv=u;C;`xypg&I)0nwMXKTjwDb(h~iPZa@nm-RnSC>I($Q$#la2?HPrHvj+t002|$ z{R;sR8<#XdPqP=9P##4$00{#?t~USx0000}*(?J95#5*mKu;$DB9|sXPbU|`QG`V| z00{$tt2Y1u0000}+YJc;5y_WiK~E0fd(jLQfR| zQ->x(PlqN#P=_W$QHLf%Qimo&Q->x(REH))Rfi@*R);1+SBEA-ScfJ;S%)ST!$t?U56$@UWX<^Uxy|_V236`VTUF{VuvO|V}~X}WQQg~Wrrq0W``z1XNM+2 zXon_3X@@34YKJC5YlkL6Y=zdWY~!dx!8#e24H$ zeTVQ%ez)*Te-6EW_h$yR4gdpX4QK!#?%zKE5%*_800000p8@%p4*?PMX9l$n00V*z zXaFN(01@&e`RMn00003C=X}=BX|H2WoHJp4gey-F24W~W@kD8 z0001=0sbr701-=P&;$Sg18EOv03&Yz5ld$VwGIFu2Z~|<5ld(3whjP3B8kIC01;eg zWdQ&HOmYAbU1vG~00000p8+5XLjV!|W;y@>00D*%XaFO001^FWh7V`}mo^K44lC_u zIsgCw0mTn!03v!>_y7^^W{v{@03taZZ2%GOW{v{@06rp~$qWGz@|SN5fFOV8W;y@> z00RIJXaFN~F#r+gX3zux03&lU01@YA&;$Sg0G|OkYqJ0m&t^IR0009k5NH4+WpZ)= z5zl4@wGIFuk-U5W5zl4@wGIFPp8@_Fv;YyhW;y@>00DLoXaFCPynFx=x@HEo4geq3 zu95%|x@HEo4ggGP01>-px~P8+08DNG5xZu(s15)=OmqMd#AXJy4gdfEp8-^{WB?Je zW;y@>00X%YXaFN+a&iC>vStRg4gen(odW?8vStRg4geqV5q1C(vStRg4ggGYWpe-# zvt~K~0001=0peLG01=F4IsgCw0|F6f03%@l5sYSc&<+42VgM10W_N$k4ggGTa&G_; zjb;Y54gfw(X#f$CX1b^j08DNG5s_xPs15)C0G|Q;X2<{$gl0Mb0003g5oiD-VE_?? zW_QpI03%`m5rk%U&<+3qp8=tK`v4J4WI_M{00SfxXaFO401-@N2DJ_VivhB@ga8r# zWVQiVYT5u10%cjX1pt2l0000Yfj&k65lv)G0000YAfo*M5lv)G0000Ym(%tD5l&>v z0000-Q4(kXA~-IK01;ng;SFd2N3;=W03vN9hyW2{WI)6Y06roBFlqo1Vq`$X4gdfE zN7NB$03vN9hyW30WHJB%06roBFlqo1W@It|00000NAwYB03v^FB!~bJZ)7q6002HB z05EC*5pQHN0000007n!OXaFK@B!~bJcw{mF002HB05EC*5qM-W0000007o-`002HB05EC*5wK+C0000007oJdXaFK@B!~bJxnwc`002HB05EC*5xHbC z0000007pU-XaFK@B!~bJ!er$D002HB05EC*5yE8U0000007qgIXaFK@B!~bJ%VaVD z002HB05E@Q01?Y%G5`Po002jV6KDV;Z6t^Q5!7Vm0000!A^0000-`x9sYOm<;x01@D1LI3~&Om+Yf;baE2 z4gfw(Z*FA(5$a?*0000Y{!|D65$a?*0000YFH3)301@kC`PL2qOmby(01@nDIsgCw zJ|fPbVgM2EWCpbk00000K1_CDYyc7WWI_M{08DgkZ~zhbWCpbk06rqlpke?K`(y^S z4gdfE0G|PUpq>B`yJ7~l4gdp<6lee+Z6t^Q5xZhK0000Yfj&k65xio`0000YAfo*M z5xjq5$^ZZWBA3(l01>@n$^ZZWK1^?JWdISX5XaEstVmbf-0MOzt09*ud zqyQ0VVmbf-0OI2=09w6hL01<&= z2DJ_VhvzN;C6EUI07A~7VgM0=mt+xuHUWZ{n-PE@0fLvj5r829aF^Z@fMo%0mqZeP zUjf0Fq!NI+0o%7;6M$F&0dlvu6o9e;0d==(7JxYce>7rt5H|n;yBuf$AA{Mq01-7} z&;$SgAEp9m01-7}IsgCw9|Uov01-A~IsgCwA9Ugl0TDK0&;$Sg)&gQ-WB?IkVj{SZ zvH%e`Vs;QW03sP=_y7?&Vg|Ji03v|dw*V12Vg|Ji07q;bXaFM4pke?KU}6Tf4gdg0 zejI23ew7-{5oBTpwGIG2BF>;<01;$j2DJ_V002HB z>w7-{5oKZqwGIG2BF>;<01;(k2DJ_V0002j0&*bZ01*UY0WuwE03S0N009vMVmbf- z03V6aYyc4iVs;QW08DUia{v(qVmbf-08D8Be-Q;@IsgCwB9@d~01*aaTM{<_MYg8&iXVLAW+03`M<09-Q~009xhRH1e z5x8MG00001p&n=e9{`nv01>!hG|vtIAEp9m01>!hOgaDn03!3Io&XWKVFtAh03zrr z1OO4bVFtAh03!O(!T=GvVFtAh03tk^;s6o4VFtAh03xcA{QwcXVZFr;07rx#XaH0A zi3b4@#g`8nfE9nmVFtAh00{%=zBd2>00000J|fwN0ss-qVFtAh06rqlpke?K&S3_% z4gdfE0HOmBp#lIAm0>yn0004>0gqq801-T42DJ_V0Ye{X03Y2E&;SuUVFtAh03XC1 zTL2L}VFtAh03&O601-T42DJ_VB8kIC01-W52DJ_VBHMqzC;$;YVM8Bi06ro!F%bX} zKw-M54gezXvvB|sL16~94geyY^bP5(4ge7Y zVFtAh0NVI20BvD%X8;icVFtAh04(}00Bvh`01*RW2DJ_Ve)}!}VP*gk1Ys&6XaKGJ zE&xKro1_2{1z~8%4giP!E&xJQGIIbC24T9W4ggsGE&yI21^@sxAZP$0iNi+#5glO$ zwGIG6{uu-j01+Lx+#7%l0Rj1!=^TI{0r{5-9e^}{=wJr54gdkiA!q;}-4W0L5$IqB zwGIFyZ(?cy5$IqBwGIFuhLc4A5$IqBwGIGGZ2%GKU_&2h005r>ER1ph5z}Bg00001 z=ptwUBW(Z?(_lj%XaFDH-gE#F(_nYE4ge!za%TV$(_m2n002h~B4_|2X~E0@5!GNi z0001g07oApXaFK=)?hjS0000-F(POHB5A?Q01?+= z*kC#U0000-RU&8rB5A?Q01??>IsgCw07qvcXaFK=+F&{W0000-c_L^4B5A?Q z01?|@IsgCw07r`=XaFK=++aEY0001GN1Y;Q03vC@%m5MHU^)N*002j?B4_|2 zX~E0@5#C@r00000N5LX!03vC@%m5MJU^)N*002HBR)*F95#eCH#SQ>WX#f%8U^)N* z06rpV!OQ>=%rEt0QOt zBW(Z?$6!MrXaE490%BIl01>ZXIsgCw0Hy^100000)Bykh000000i4ArXaH?(01>a3 zgdcz;0kM~EfAOW(M5+Hyk0kfAmAb=nNvzJ;RfF=R7mw_OF zAOWrX#f$wmk%R=Bmu#fG$Vi@0l}A5BY-G>jbH|~ z4gdjkC};p5hLc4A5shGX&<+42ZEOG$jbPlz4gepR87%-2jbJ(e001AeLuLRGjbH|~ z4gen_8+ZT_j$j704geo#_uBvwj$j704geoW(+U6)j$j704geoa%bfrbj$j704ggGV zZ~zgHU_&2h07p|OXaFLkjQIdD5td*EwGIFPM`b8z03xG|`2Z1^U0e3vaGfFBWjU_&2h0N?{J09?c!TL2M!mt7=)9|2gGeI$S& zAy{BTA7}tl1TO$w0r%nn5m;bR0RRA=1TO$WiNi+#5m}eMB!C`&NMJeu0004$DQEyA zZ*Tw+NMJ)BXaFB=B!~bJNMHuF4genk_u>E%NMKO`002yMZEye)Nni%G4gg1YDQEy9 zqm20g5m8_UwGIFPJ|gRTKL8O_Ua4}I$#F1 z4ggS~1poj5002psTP1)JAv$0~A7}s#1upE%Dqv9o002yM zZEye)D_{n-4gfwP>w7-{5jJ23wGIG2BF>;<01-A|2DJ_V0002P0Uh&J01+Hu2DJ_V zpr8c+00000NdN!<000000i3`pXaH?*Z~ze@9AHBqXaG_MF92Kt_u>E%9AHra006`W zF91S`!$$xS9hXxkfF)lHU^)N*00AB=XaFN`Z~zeuU_&2h03U56hyW1`UE%>0eO+000400K);f)dBz!E%#FxM*fF1$5 zm)|IWAb+}FLmy}W0ae8TA{%%B5xQSd0RR92R8ySv4ge9nUk0@f00B?{p8<9Cp#Tx4 zUpfE)00Gi1XaFN`Z~zgeUqc^g03U56hyW3$Uk0@f03QMO;s6n*Ur_-708DgkZ~zgg zUk0@f06rq?dp`gXwqFLd4gfwP&Y)rd5w>3jwG9pc0002P0byNq01=>E%pkGk|000400G|QjEh_*Kj9)qc0004TE@%KFZ*Tw+j9)_^XaFB= zB!~bJj9&(|4genk_u>E%j9*a!002yMZEye)j$a0~4gfwP>w7-{5u9HJwGIG2BF>;< z01=#D2DJ_V0002P0l(Bs01E%abHmZ002!2F92b5ZEye) zb6*Cv4gi@7F90O~0000&>w7-{5qX#3Du5J!d0zgduUF8}}l0G|P};8Oq*U0(*Z z4gdjqFK7TGZ*Tw+U0*{VXaFA~8+ZT_U0+cF0001=0g5;n01-4_chC+10r4+r03U{v zMF0^rUw6qVqs(e5ma9ywrZOI5j9^1wGIFxZ>#SB5jJ0U&<+59 zN7OH903yzyVgM0RUk0@f002HB>w7-{5mjFXwGIG2BF>;<01;JR2DJ_V0001=0qF8f z01*;j2DJ_V0m?9F03TBZQ2-GVUk0@f03RiG*#Hp|Uk0@f03TOVcK{I*Uk0@f03Y6- za{v(&Uk0@f03&T{cK{I+Uk0@f03WV@8pr?<6kj?30019J22lVJ6kj?3001J1!$$xS z6<-Fm4gez2gBJi16<-Fm4gezTD<}XF7GDOn4gg1+FlYcG>w7-{5hGs)wGIG2BF>;< z01+c!2DJ_V002j=FlYcG&Y)rd5iMT^wGIFPJ|gRTKL8OgUk0@f06rqlpke@j5ief` zwGIFP005r>opj*<5%FFIwGIFQr7>s#A5#WV01@$C2DJ_VA6HX%01@$C2DJ_VA0>9# z01@$C2DJ_VAG1Sd01@(D2DJ_VBW-JU01@(D2DJ_VAHWa{0TJ?E2DJ_VBV=!501@(D z2DJ_V)&gQ-WB?HkUrcUu01@+lUIw)e07sTFXaFJv?SlXj^;<01^3K2DJ_V07r%~XaFM4pke?K{ayyO4gdf?BF>;<01^IP2DJ_V z0000!BF>;<01*#g2DJ_V005r>qVEC$5z1Z$wGIFQ05WI*A5#WV01?W6UU$$A03TOV zcK{K}UIw)e08D8B5zAh>s15)ktqWZM5zAh>s15)=BA@@v01?ezchC+1OmuB<01?h! z2DJ_V005r>Prrfy5xiaowGIFQH!^4dA7}U501>=i2DJ_VA0>9#01>=i2DJ_VB5fpy z01>@j2DJ_V0G|O@C~p9N5qn++wGIFQ?=olrA0>9#015w>0iwGIG2BF>;< z01>uc2DJ_V002HB>w7-{5w~6jwGIG2BF>;<01>xd2DJ_V0002P0iCGY01-f!s4jpZ ze?VRawGIF%3oig%SCrKN5kOwh1ONbG3oig%=}yZ45kOwh1ONc73oig%R5Eh_5kX!; z0002_3oig%i-=SJ5kX$35H|ot3@-rI0%Bog01u0d=>DFMtXGe*#`Q00001 z2sUT{A3dJ#01*OS2DJ_Vivg=A=>QQdUW)-Y1S0?uFkVb@Wpn@$1711+001IPH?sf{ z1YQQU4gexnI0pd{1zrZV4geyoJ`Mp923`iW4geyA+=~Da2VMrX4gexzjP3vt2wn!Y z4gey+Q!W4z30?-Z4gexy45gL;5ei-gwGIGBi*|4gfwP&Y)rd5jb83wGIFP06rq?dp`gXIbH^}4gfwP&Y)rd z5jkE4wGIFP006@QX%?XX5%QP8F@PaT@?8eC4gfL@F92L6cG&w7-{5&xGgGJqff z|CdcNfM@~fm$ov1AuZ`$2DJ_V-wrPTT%It801@e32DJ_VXAds`7G*eS07#<+00000 z0AL0H01@q%1T%oG0o9kXGk|M<%v}bx4gdqsIA{PPZ(?cy5zJi%wGIFuo-l_15zJi% zwGIFxml8n$5zSo&wGIGGbZ`I>&RuuV4gfw(W&jb~UCO);06t7|Wpe-#-dzT@4gfwP z&Y)rd5#L<~wGIFP0001=0hgoK01?4m2DJ_V0r@y+03&p801?4mchC-h03V((hX4`5 zT?Vxd005r>zo&cv5%XL+00003J2_|oBX44A01@+C2DJ_VAD%FW01@+C2DJ_VA8jOv z01@+C2DJ_VOmuJn5%gSl&<+3qp8-NGDgY68Tn4oc009*`XaFN`a4`T8cU%Uw4ge!> za54Z9cU%Uw4gen>sEYu95qDhW0000Vo#CJW5qDfV0000V)J;wR5qDfV0001s0Rie$ z01@0=NAfvn08C;45rGF%3=4gepN7dQYBGF-Z-4geqX*Sr7`GF<7l4genl0T2KYGhDsJ4geqe(82%_ zGhDsJ4genwc`yKf5i?x9#SQ=;By)ZM5i?vm0000Ypbkd>5j0!|wGIGBvpQ%1OlxI% z01-D_2DJ_VB5fpy01-D_2DJ_VJ|fkwk^m7vTn4oc0000-#X4vJOmJ^=01;JOx~L8S z06t7`Z*u?01W14geoV zNq_(m>07;j#SQ=;_Yv0s5$RjK#SQ=;gYKyS5$any0000V&aRRG5$any0001s0b(&# z01^3H)&gQ-WB?KTTOttY)c_IeTe_$Y03t|9fB+HfTL!fb03!Gi*8mahTL!fb03sOM zl>ia!TL!fb03zn-KL8Q!TfMvv07vaRXaFM4pke?&5%60EwGIFPNB=u$03yzyVgM2K zTL!fb002iHJZJzS>w7-{5&c^RwGIG2BF>;<01^FL2DJ_V002inJZJ!y5jcPwe@9P`Xe65z$*Z00003rYIsgCw0Zlz<03Qrff&dYD2%cs9U^%0000->^*1z zBF>;<01=&A2DJ_V06rqlpke?KqFV;F4gdfEp8p zI9mp_4gen|cG&;<01;_h2DJ_V z07uV0XaFMXdp`gXUTRwgwGIG2BF>;<01;|i2DJ_V002kfK4<_U&Y)rd5p7!rwGIFP zNAo^t03yzyVgM0!TL!fb002HB3+M;|5sX^~wGIG2BF>;<01=K`2DJ_V0002P0r)?0 z01*|J$vS``Iu~0s&kg{e5-$Kkk-U5W5g1zrwGII25-$K=KpFr5UqEO8LZzQa01+Eo z2DJ_V9uqGBLO=5i0TCOQBs+j40U?)3JAgF-BA0(VfFJ=Pm!LasBRqgXRRCKCwGIFS%Rp!VAKekq z01*IN2DJ_V0G|Q-W4Qnk^;!nC4gdoHL1+LYZ(?cy5%pRIwGIFyYh`%=5%pRIwGIGG zZ2%GWT3Edf006@Q2)Gph5#yJ+Jb)or<5~u_4gh}?F92K+>D2%c<5~u_4gh%-F91Sv zctrpaos15)h zVGm>g5w==70000VPFKzV5w}`80000V^%oxi5x8190000-H$!LuOl|-XyIQ)a4gfw( zasUy%S_ZWa0000-Q$uI~Ol|-X!&AY5)<7S_ZWa07Mxt0AX?f5sX>} zwGIHI87}}{Fb4ntIz(syLe8LK01=Ou(LaDae;`@`QAKC~ABK}f01+Ts2DJ_VA8jOv z01+Ts2DJ_VBXnW_5g=LywGIFu1MGYN5g=LywGIH*0%Bog01<>*BHKQI01+Wt2DJ_V zN9aUo03wgIB>)jLS_ZWa07uJ2XaFMnJGuZ7I9fUY0000!BE%hA01-o42DJ_VJ|fPb z1Y!UYPM48DfD?aUS_ZWa002icMQ8vb0F{IQ5qnxR&kg`0aD-C;5qw$(wGIG2BI|oU z01<#%2DJ_VJ|fPbVgM0w7-{5#3n^wGIG2BF>;<01@3;2DJ_V002iYMrZ&c>w7-{5#Ct_ zwGIG2BF>;<01@6<2DJ_V002HB>w7-{5#Lz`wGIG2BF>;<01@9=2DJ_V0001=0eBHu z01>iT2DJ_V0gy&$03RiG*#Hr;Sq8NZ03ZH|2LV|TvRRNuXaFCAuloQIvRS>w4geyF z!$$xSw^;_Y4gdfX2*sxk0G|ODD;59|dRYdw4gdqeMrZ&Z-4W0L5qen$wGIFyVRB~x z5qen$wGIFP!vW}y%K#B@mwG~gAuVuO2DJ_V{24C*ZDDd}01gZB8kIC z0101-ZyW<-D?N7@w)5k6T4wGIFo9WMY}n)oUJ5k6T4 zwGIHW9WMZj0W6s{01;MMLc|?g01-b~2DJ_Vo*pj%LW#pi01-cz(L{hG0YaDdM1VdW zNLi{%XaEC|uzwdmO=tkc#03BV0001x6951aNtaPYfN=p-m%~MXH33zZ`9*+xe=AuA zwGIFS3QK4JAKekq01+!$2DJ_VBVlr901+!$2DJ_VBWrg65i3~+wGIFxiNi+#5iD5- zwGIFx^?L*X5iMC-wGIFPp8+x4I{*>USO&EY009e3XaFDG5zqh;(O3qx4gep-9a{hq z(OA934geo5j8gy+(O9~u4geode|rM}5z$x%wGIG_0W6s{01+ZtOk-~V5z<(85H|oK zNYe@c5z|-(wGIFx>^&F&5!6@)wGIFxA{%%B5!F}*wGIFxBfLHU5!YA-wGIFxt)71X z5!qMWZe#!v+gQ4&4ggGUYXA}4QdqjE4geyF z!$$xS-B<>-4gg2)OK1R0aBp(}5%*ZSs15*3X#f%TSh}bV002HB>w7-{5g}OywGIG2 zBF>;<01+Ws2DJ_V0002P0e?2Y01>p8#7BT2f3#S35H|pUATI!1#2s4z5wuvn#SQ@A zATI!IZeaisv{<^R4gh;0F92Lf(+U6)wO9tV4gl~WF92a?01>uWLI9P7 z01>xXG|vtIm?AF#LUY6B01>!Yy~Pdy;UX^pVQBynxmdcW4gfqOF91S`!$$xSx>yFa zmt#nPApy*ng-C#Lf1OwcwGIFSrA=r6AG_BE01=&72DJ_VAH*G701=&7y~PdyA1#bi z01=&7x~L8SBHaA2DJ_VBA6L101=^B zIsgCw0G|PAS+4*QHds0U0004wPG|rh3Irbj5jR){wGIFue>3Qr01-G?j!tL*ABnHZ z01-J@2DJ_VAF;kV01-M^y~PdyA8%(-01-P_x~L8SA7_sY01-S`&;$SgivjSD1pyI` zSc?I%jWYldidc&Qb5*JU5rSULaz0000069~P<4gl8zIIk!G5hz#zyH02T zAJ#e001+uz&;$SgA1Xvf01+x!2DJ_V0G|QEgCPJBe*joI0000198YKf9~e0(01*LL z2DJ_VA7_sY01*OM&;$SgA8DH?01*RNIsgCwivjSD1pyHoSc?I%jWYld7FbMcWqAM* z1y}~P4ggGWZ*u?<23WeN4gdhx0{IN*01@U_0e??u03X&l&;SwVSI`6i03T$!Pyi9= zS2_Rye*hnMd=CH-=~ud_4gen%{0;yS>Q}m`4geoVKNbKH>sPv{4geys1}p#(?N_>} z4gezk4YmLg?pM$R0001=0a~}h01?Yq2DJ_V1LjX?03W^@PXH0jSI`6i03Qd6VgM1$ zSGuSU03Uj5+5i#ESGuSU03YbnT>ufxSGuSUAOIimgh~Jr%~#L_0019)Z3h4m%~#L_ z001BA8tMQM&XcP2DJ_V17}cZ03&Z=Y5)fQchC+1 z0G|OrfKvbwwNyF)0004aTxb9v?Pihy5w%nXwGIG_0f)o)01N?W4geyNNZJ4qyHp0X4geyXNZJ4qyi^9Y4geyhNZJ4q zy;KIZ4gg2xP-p-m`Rg;<01;4C2DJ_V07pMjXaFM4 zpke?KQB?-D4gdg0QBi0BBF>;<01;tT2DJ_V07qj{XaFM4pke?KV^s#V4gdg0bx~*l zBF>;<01|Hvj+t002{buloQIg;fT%4gd)QD8M%W0000007p|&XaFM4pke?K ziB$%*4gdg0Wm0GWBF>;<01=E;2DJ_V07sWnXaH0Ai3b4@ja9{`4u1d%10cXR00000 z08@Og`v4J*RR*;V00{#az&8K@00000N2yY103yzyVgM15RR*;V002k3QfL4o&Y)rd z5t3B~wGIFPN6k`b03yzyVgM19RR*;V002kdQfL4o&Y)rd5tda3wGIFPNAXf<03yzy zVgM1DRR*;V002h=Q&ngHBF>;<01=#32DJ_V07n&5XaFM4pke?KomB?44gdg0CsSwu zBF>;<01=;62DJ_V07qFE{`c8lw zDXdinwGIFPN1an>08{vh2LTbSRmG;<01>oR2DJ_V07vsvXaH0Ai3b4@wN=HZ4gd)Q@V_?z00000Q+%)c z01>rS2DJ_V2?OZAHvj+t0000-1ypDNBF>;<01>%W2DJ_V07n;8XaFM4pke?Kyj2FZ z4gdg0NmOV6Q}~Go0TI1b#itGu00{%&zc&B?0000}e6RZe5xtk{Pk;<01?7f2DJ_V07rjRXaFM4pke?K#Z?Bi4gdg0kyK~^BF>;<01?Jj2DJ_V z07s)#XaFM4pke?K$yElm4gdg0wNz*TBF>;<01?bp2DJ_V07u7EXaFM4pke?K%~b}q z4gdg0*;Hr%BF>;<01?k@RR*;V002h|RcHWH_=yJr5!hA5rw#xK1JJ)W0000008@Og z`v4KxRR*;V00{%gzc&B?00000M;%pY03yzyVgM1`RR*;V002i%RcHWH_=yJr5#3eA zrw#xK1HivG0000008@Og`v4K$m+(-48ztdY2DJ_V07r9GXaFM4pke?K4gdg0 zrB!GEQ}~Go0TJbwFj0UNSLIa(wGIFY1E{|@00000002j~RcHVr&Y)rd5$RP1wGIFP zN6A%a03yzyVgM2BRR*;V002k(RcHWH_=yJr5$#pQrw#xK1E9Y*0000008@Og`v4K` zmz+_68-MXt2DJ_V07oBIXaFM4pke?K@>K@44gdg0F;-{*BF>;<01@?72DJ_V07pYs zXaFM4pke?K_EiS84gdg0RaR&KBF>;<01^3B2DJ_V07qw5XaFM4pke?K{8a|E4gdg0 zc~)ouBF>;<01^FF2DJ_V07r{fXaFM4pke?K|0q=kwGIFPN4-{P08{vh2LTZXR>h|d z00{$-zc&B?0000}e6RZe5eS!FQh*zO3|0oU4gdg00as`MQ}~Go0TB&W#itGc2?Kz? zHvj+t002{buloQI4ORxV4gd)Qc)vFQ0000007ny7XaFM4pke?K5mpAZ4gdg0C0A$w zBF>;<01*^c2DJ_V07q9>XaH0Ai3b4@6;{Qk4gd)QaKASI00000Q+%)c01*{dRtB{W z00{$Vzc&B?00000M`>4R03yzyVgL~tRtB{W002jOS7-nt&Y)rd5gb+qwGIFPN3Bh|d00{$Nzc&B?0000}e6RZe5gnIKQ-B+PAyx*p4gdg0(N|~yBF>;< z01+Zq2DJ_V07v6jXaFM4pke?KB~}Kt4gdg0^;c*BBF>;<01+lu2DJ_V07nN{XaFM4 zpke?KDOLux4gdg08CYllBF>;<01+%!2DJ_V07olWXaFM4pke?KEmj7#4gdg0Jy>V} zBF>;<01+>LRtB{W002i%SZDwu&Y)rd5j$1}wGIFPM`2iK03yzyVgM0GRtB{W002jG zSZDwu&Y)rd5mQzMwGIFPM}=5u03yzyVgM0eRtB{W002j~SZDxK_=yJr5rS65rw#xK z15m#=0000008@Og`v4JwRtB{W00{#~zc&B?0000-07uDKXaFM4pke?KhE@i(4gdg0 z+gNA-BF>;<01=2*2DJ_V07ng3XaH0Ai3b4@kygd04gd)QK)*Kt00000Q+%)c01=Uw zu2g^;<01>=a2DJ_V07t!9 zXaFM4pke?Ky;cUb4gdg0&sk^yBF>;<01>`c2DJ_V07n5@XaH0Ai3b4@$5zFs4gd)Q zAip;N00000Q+%)c01?Ml2DJ_V2?H3vHvj+t0000-6Iy5hBF>;<01@3*2DJ_V07oTS zXJ`N-&Y)rd5$RS2wGIFPM>kq%03yzyVgM29RtB{W002ixT4(?w&Y)rd5$je4wGIFP zM_XEG03yzyVgM2BRtB{W002jgT4(@M_=yJr5%pHZrw#xK0}#JA0000008@Og`v4L3 zmo8R-8-EK|2DJ_V07tP}XaFM4pke?K7gq+g4gdg0!&+znBF>;<01+5h2DJ_V07unY zXaFM4pke?K8CM3i4gdg0=UQk0BF>;<01+Bj2DJ_V07n^HXaH0Ai3b4@BUi2DJ_VJ|fPbVgM11R|d5X00000p8=s4{Qwc2 zR0g#U00I77XaFBc0+s*~om2+34ge!$WoCZ>5uH^2TxbB+0%Bog01>ZLB4_v801=*4 z2DJ_VBEDu#01=*42DJ_VBES#~0TG^52DJ_VN8wy(03yzyVgM1QR0g#U002HB>w7-{ z5wKJSwGIG2BF>;<01>cM2DJ_V0000J2p`D~0G|OlIW7PZj#N4T0004bU1$IwNdkYC z01=K<2DJ_VAHHTy01=K<2DJ_VAC+$a01=K<&;$SgAAm+=01=K<&;$Sg9|c)L01=K< zIsgCwB5fpy01=N=2DJ_VB8kIC01=Q>IsgCwJ|fPbVgM19R0g#U0001=0c=|s01qA za+haWfIoj#R5}0v00E){3!upW5lvJ&00001p8>63g8&g3R5}0v00F38XaI`=8v4xu z5l2)aeMs5>5gSwnwGIGBLtbbABF>;<01+ru2DJ_V07q3`XaFM4pke?KEmQ`z4gdg0 zXI^LkBF>;<01+}&2DJ_V07rRVXaFM4pke?KKU9APwGIFPM~hx)03yzyVgM0DR0g#U z002HB>w7-{5lB=9wGIG2BF>;<01-%32DJ_V0001=0qo)201*UKIsgCw0mNQt0E+<{ z`pp0l6jT7B0}Av501^CCIsgCw0ipxGp5Oox^iw(j0004^12TpI0TJv|IsgCw0iOXR zv8I0j5!+Kb000013SVddivb$?%>WVLQvja_5wB7@00001CSPa(ivb$?%>WVB zQvjaWUrQUIR;x;&r&5tUIo00001GGJ%`BW(Z? zl~D$@4gl5yVqs(e5wlTDX#f$HQ91ws08D>!Wpn@$mr*(Z002yL01=o`WdQ&HB4z!c z01=r{2DJ_VB73Ki01=u|2DJ_VA|Q6z01=!~2DJ_VA|-a&01=*12DJ_VBD>bl01=;2 z2DJ_VN7Y|w03yzyVgM1VQ3kaR002kzUuXa#>w7-{5wuYTwGIG2BF>;<01>oN2DN_< z0000-6<}xpBI|oU01>rO2DJ_VJ|fPbVgM1fQ3kaR0000!BI|oU01>xQ2DJ_VJ|fPb zVgM1hQ3kaR00000p8=UGJ^&F_Q91ws009$WXaFB&{h$C5RZ#}D4ge!|01;JD2DJ_V zOkr$n01;PF2DJ_VBHo^J01;SG2DN_<03s!J*#Hq(Q3kaR03vN9hyW2-Q3kaR03tQo zIsg$_Q91ws08DUia{v)qQ91ws08C|aasUxpQ91ws07t-JXaFM4pke?KY*7Za4gdg0 z(qL!+BF>;<01<;x2DJ_V07v9tXaFM4pke?KjZp@*4gdg01Yu|ZBI|oU01U4R||h?hQHfExjbms(wbBp{Da2DJ_V0+B#d{k!S_ z5sy#?wGIFRkx1bIWprWy5s#OiU4R+^l9#z%fFJ=Mm)c!`r(AhZ2DJ_VAfyKX00000 zMgaf-000000i1zlXaH?=01WT@P$I43 z!2l5pP}qh803xX{!vGNsPzJRQ03r#lp8ydJP}qh803v-z+5iy`PzJRQ03wG-+5iy{ zP`aoN03wk{+5iy|P#v`n03w@6+5iy}PzJRQ03xM-NZJ4q6HtJJ0{}-OW@rE+k-U5W z5j#)@wGIFPM^R>I08DgkZ~zfRPzJRQ06rq?dp`gXL{J8`4gfwP&Y)rd5kyc1wGIFP z002j0W@rE+&Y)rd5m`_MwGIFPM}uZ)03z#qKL8PLPzJRQ06rqlpke?KZ%_uc4gdfE zN26wcXaFMXdp`gXa8L%d4gfwP&Y)rd5pYljwGIFP07t`SXaFMXdp`gXbWjGh4gfwP z&Y)rd5p+-nwGIFP06qlgz-Ise0G|QLFQWhvn@@m*0{{VLXlMW*j^Dum5t~m2wGIG_ z0f)o)01^97ivby#H2@LWPm2LrF;xH&)K80l0UG+v01@?1BK>=R01=!|2DJ_VB4p;{ z01=%}2DJ_VA_=aa01=)~fP@18B7I2O01=>12DJ_VB8N!Y01=^22DJ_VB9Tbi01={3 z2DJ_VBAZCs01=~49kmVsBBe;$01>25LI3~&B5^XW01>56LI3~&N0(=403ulWUIPgAYp!2l5@ zPg&Ok00WV*enP1*!vGN`PX@IP09Gk40740_p8ydjPg&Ok08J_{07898+5izLPX@IP z0I@1B078dI+5izMPr9fM0I4f4078*S+5izNPaU-mQ2?7PF91TDNZJ4qEKdft4gfhV zF91`eNZJ4qEl*8=0ssS%(0*R9YXbnEX=ngKk-U5W5miqHwGIF@E-wHU01#*ZYt;w< z00000;A;Z_5m%QGWq?}&UYBfTfFJ>0myKnBAOT*Nu4RBX0dtq;Wq>sSiI*H^fFJ>h zmpx{HCJu^E2DJ_VJ|fPbVgM0}mvLr*A_0z&kZ9(aIV0VTJ5c!2l;0WG(6dVn|qf96gGwGIFQ=zwSdAFblS01@U+6VEmPivfqj z_W%(VPm2K>`pp0l5lP`l=4geyD zNZJ4q>rO%d001J9NZJ4q>`p=e001JJNZJ4q?M^}f001JTNZJ4q?oI}^4gg1)e}HHJ zBI|oU01^032DJ_VJ|fPbVgM2NP6o9O0000-tAJ<#BF>;<01*OD2DJ_V07uJ!XaFMX zdp`gX5>E!T4gfwP&Y)rd5fV=ZwGIFP06rq?dp`gX6Hf-U4gfwP&Y)rd5fe`awGIFP z005r>w)^`45wK1MwGIFQ+kt2Re;=*l!2l7kPGsv20E+>K!}kCY;7*GH8v4xu5!+58 zK-$3o5wT7}0000Y39g?25wcDOwGIFxeMs5>5wuPQwGIFxhe+B05w%W20000Ykx1GA z5w=c30000Yn@HLK5w}i40000YrAXQU5x7nUwGIGBjDctXBI|oU01?7Ye+IP<06rql zpke?K!cGRY4gdfEN1lOb03yzyVgM1$P6o9O002k6foK3C>w7-{5!_A&wGIG2BF>;< z01@0y2DJ_V002HB>w7-{5#3G(wGIG2BF>;<01@3z2DJ_V0001=0e)x)0TDS)@WKTE z0UCp703VLu!2l6CP6o9Oe*lXChr{;(5u#3u0UG+v01=%|BCX=V01-M)@WKTEBB?OL z01-P*2DJ_VA_=aa01-S+@WKTEB7I2O01-Y;2DJ_VB8N!Y01-b2DJ_VBBe;$01-k?_Dul*M}2~503wmRd;k$@e@+Iq4gdg0tAc0% zOmuB<01WTDP9m-1!2l7< zO->2}03xX{!vGP?O$N0N03r#lp8yffO->2}03v-z+5i#He@zCp4geyDNZJ4q&`r9i z4geyNNZJ4q(M=t-4geyXNZJ4q(oF`n4geyhNZJ4q(@hxr0su$6gJ=LEk-U5W5&KOB zwGIFPN9u!U08DgkZ~zemP6o9O06rq?dp`gX1WpFE4gfwP&Y)rd5d=;KwGIFP002k) zgJ=LE&Y)rde-Rl@2DJ_V07o2zXaFMXdp`gXFHQ!v4gfwP&Y)rd5id>#wGIFP07pE8 zXaFMXdp`gXFir-w4gfwP&Y)rd5im{$wGIFP06rq?dp`gXG)@M!4gfwP&Y)rd5j0K) zwGIFP005r>Ucc!85nD|d`vL#~qlIVyACBL_01;bFe+IP<0E+>K!}kCY#7&C<8v4xu z5x-3$t>VD|5nN3e`vL$WsW8I;5nW9NwGIFx39g?25nfFg`vL$WeMs5>5nxRQwGIFx zhe+B05n)Zbs15)kkx1GA5n@dpwGIFxn@HLK5o1jTwGIFxrAXQU5oAq50000-`-Er! zB9Xj&e*h7TO$N0N002iRg=hdwbZu||5tU5_wGIG2BI|oU01=f<2DJ_VJ|fPbVgM19 zO$N0N00000M>~aR03yzyVgM1UO$N0N002i@g=hdG>w7-{5x`9bwGIG2BF>;<01?1V z2DJ_V002jOg=hdG>w7-{5y4FcwGIG2BF>;K!}kCYO-+jd8v4xu5lBrUK-$3o5gtuK0000Y39g?25g$zkwGIFxeMs5> ze-R-~2DJ_VB8N!Y01+ZhLI3~&B9Tbi01+ciLI3~&BAZCs01+fjLI3~&BBe;$01+ik z2DJ_VM@NQe03z#qKL8OgO$N0N06rqlpke?KFHHuu4gdfEM_Gnw03yzyVgM02O$N0N z002jMhG+mH>w7-{5lKx3wGIG2BF>;w7BI|oU01*>S z2DJ_VJ|fPbVgL~nO$N0N0000!eVD|5wT2vZx8^B0f)o)01@F#ivb$?%>WVHOd>$q!2l7m zOhNzv03r#lp8yfFOa`?M03v-z+5i!?Oa`?M03wG-+5i!@OhNzv03wk{f7$>Mw@g9+ z001JJNZJ4qxJ*I-001JTNZJ4qxl9JN4gg0jh-d&J>w7-{5yMOdwGIG2BF>;<01?AX z2DJ_V002inh-d&J&Y)rd5zR~nwGIFPM_-6&03z#qKL8QkOa`?M06rqlpke?K-Ao3x z4gdfEJ|gRTKL8QlOa`?M82~;a&Y)rd5#CG&wGIFP006@Qzn#wj5qp<4gn%J`drUQ^ zHUP{-F95ayhr{;(5vxr2*#!Uq0001s0UG+v01>84LO|NV01B`Uxk250jQU% zg@7OdsF%xyfH47(m;Hr+E&-I6EQWw40hX6jhJc9yMVH-%fFXZHOvafu0J%vo0JZ^# z!}kCYbxgS11poj5004^t8v4xu5pYaGK-$3o5k^cx0000ON-qF`0tv3401-z_2DJ_V z07898+5izrOa`?M0EtR303wG-+5izsOhNzv078*S+5iztOhNzv01Qhn079Ec+5izu zOhNzv098vb0759GNZJ4qO-u&04gj)CF91jTi)a8M>w7-{5m!tGwGIG2BF>;<01;Q0 zrH6nb0b!TOhkz*-aZCoa4gi5nF90PVG5`QV&Y)rd5pkCXh=58Wa!dxb4ge=jF90hJ z+ywvt0000o000000000&&Y)rd5ptJvh=45tT9=`SfGPoAm&}NOPXS<;9EpH@0nV41 ziGU%0&PxWh4ghUWF95ayhr{;(5jRYb$Oixb0001s0UG+v01+}wQ?25`01?ki_Dul* z1CgMALa8vr01?nj2DJ_V;!iICLJ6*)01?qk_Dul*#!xQ+LVZZu01?wm2DJ_VDp4;0 zLWfA&01?znx~L8S4^l4xLXk+?01?$o9kmWM0I5fHeU#mzIlwAOSO%w~K%#4m3;#wGIG2BF>;<01-5o>x+OQ z0XUZqjDR2kIF~PsfGq*hmtBm2U;)pUzKnom0TY)ajetr4&!=vUfC2%}w{MStsR03y zml=_OA%BodPntFWiCQlJwgHF3_W%*VOIhCq000000E+<{`pp0lyGueq+Q9%3kxN1V z008J(F93l839g?25t2&=wGIFPLVZZu01=c+2DJ_VY+Ek?B8N!Y01=f-LI3~&LXk+? z01=i;LI3~&?^`bbLYqk101=lK!}kCYflG@48v4xu5qwJ`j^Dum5gSVewGIFxmpVZJ5gbc4 znP>na!5eA-5gkj4I0pbC39g?25gtnhwGIFxeMs5>5gK!}kCY6HAK$8v4xu5e`d2 zj^Dum5v@uFwGIF#U@rh7mpVZJ5w1!Po@f95wc1KwGIIMVJ`qehe+B05wl7<0001#VlMzfkx1GA5ww?;m4GAx z?3cQgfH48>m+X~*Avyp{2DJ_VJ|fPbVgL~UO9r(L00019kRSj6v6^TALhE}!01*#M z2DJ_VvSTj*C6FKh07A~7VgL~jmq(U>HUSWqewKhB0T7p;mVh<^6qnYPfFJ=Bm-m){ zF#*b#DVKmD0o0dEmw-C~=a+|_Lmo#fRX{e zm#Ue7BLO>?&Y6HAe>+MBwGIH-W-kD?0f)o)01=!@j+h7l00000ivb$?%>WUWN?4ggJU zF91SuGOqv;M@j~@4gkPyF90GwN!kDrNJ=^Y002`tGp_&;<01=o<2DJ_V002iIp=bai>w7-{5t&K`wGIG2BF>;<01=s&%A9~A z0iBoaoPZnwotFxofHDD|mpz?;AOW72UY&q80iTzZoq!+#pO?0sfGq()m*ky*mjOMO ze4c=p0ZEq>pMb~#N|)WAfXD%6m!_bASpjUep@2*Q0e!bkqJWeG0e!dPrGN(k0e-jY zrhth90e-i1s(=dt0e_c(tAO4Cf0tjZfYkwiw>7PRX9EF$mz}VHN&$bj=&*n{0s()w zAhUoA0RexvEVO_N0RexvIJJNa0RexvM7Dr40s()wc({NI0Rc+4gt>qV0Rc(3kh*{i z0RcUioV$Qs0g9LUyMRmqO1DS6fC~WuNw-tIfMx*!J-52PfOr7`{g*SqfFXbVNyeEr z07aTF0JZ^#!}kCYElPOZ1poj5004^t8v4xu5hzMRK-$3o5&lU+0001_nlAu>0tv34 z01^L52DJ_V07898+5iy&N(QwK02P}r03wG-+5iy(Nw7-{5f4fRwGIG2 zBF>;<01*$D`@n!A0U4Jb!GI|iDM|*l4gd|EF90PFGXMZW&Y)rd5h<5l!GKC4DoO^m z4gj;AF90jf-30&u0000o000000000&&Y)rd5h|C-!GJ9R5|{VEfGPnNmmPZH*4ghqaF90Pl3IG5?&Y)rd5$czi!+=U6>q!Q+4gmC_F90iIuLS@A0000f z000000000&&Y)rd5$l%(#DFFa>`4Z-4gfwP&Y)rd5$u;Z#DEjmxaWD zRsn*S+{Az(e}YK{wGIHOqAvip0f)o)01>lE(BlOF00000wgDRY%>WUwNwnkz00000 z08>V)w*V1?NxG;G00WVre7M#(>iS zq_?ccfQbVEq_;N9fE@w>nwM0~fIWXDNd~nJ00UmqXaFA{;lThAB}p{p4giY*hr{;( z5k^Ui0UG+v01-k-A_=aa01+lh2DJ_VB7I2O01+rj2DJ_VM?unP03z#qKL8OjNd~nJ z06rqlpke?KGD!xt4gdfEJ|gRTKL8O!Nd~nJ06rqlpke?KLrDg;4gdfE0H1#WN(X2F z5hpwbwGIFQS=DF&AN-UK0TCxW2DJ_VA7R&M01+oV2DJ_Vivfqj_W%)?Jc|Ju`pp0l zkvt+UP-*}XC_DzW4gezk+Cl&kDLe+X4gey_9kKusDm(_Y4gewvuAcxAD?A3Z4gey3 zNZJ4qEj$Lb4geyDNZJ4qEkG0000YIWw;S5i~powGIGBO4DcnBI|oU z01;6<2DJ_VJ|fPbVgM0QJO;H60000-c++SAOmuB<01;X|2DJ_VJ|dSq&ww14D$jrl zMO-`vwGIG2BI|oU01;d~2DJ_VJ|fPbVgM0bJO;H600000N7&P708{vh2LTagJjJID z00{$#z&8K@0000}e6RZe5oVWp&wv|$Y&-_F4gfw(bZu||5pO&OwGIG2BF>;<01;<01;<01w7-{ z5raGiwGIG2BF>;<01<;c2DJ_V002jvmv7L39|63VkI;Z0MBLP903z#qKL8PwJO;H6 z06rqlpke?KlspEt4gdfENBq=i03z#qKL8PxJO;H606rqlpke?Kl{^Nu4gdfEM;z5? z0GIC2fE#~DJk@9bBI|oU01=uz2DJ_VJ|fPbVgM1EJO;H60000!BI|oU01=x!2DJ_V zJ|fPbVgM1FJO;H600000paO3MJ^&FMJO;H60FdSe0000009^|J0000000EqF<7fa} z{FDv>5ga@QwGIHdtS01+UUaM6IO0Z*43(twZwB$uqxfKLIMxBSw8xB~%Ix3$)QcmV-x zw=UR#M*;zImv-8KDFK3)pxS`f0fo1C+kmkHe}X#(wGIFQ*yd;eAN-UK0TF^b2DJ_V zACQL601<*a2DJ_Vivfqj_W%(GJc|Ju`pp0l|2rZ+{9^zSgF6Pb4gezk+Cl&kggXYc z4gey_9kKusg*yhd4gewvuAcxAhC2qe4gey3NZJ4qh&u+g4geyDNZJ4qi95Qe4geyN ze@NN@5sEvys15)kn@HLK5sN!I0000YrAXQU5sW(qwGIFxaWby}5sfS_2DJ_VJ|fPb zVgM1XI|j850000-m*i*wOmuB<01>u3msQ|^B7eo?XaG!fZEye)xH|^54gfwP>w7-{ z5x6@BwGIG2BF>;<01>!52DJ_V0000-^Ww7-{5#T!pwGIG2BF>;<01@Cj2DJ_V002jY;<01@Up2DJ_V07tv!XaFM4 zpke?K=sO0r4gdg0+vR8gBI|oU01@#!2DJ_VJ|fPbVgM2GI|j850000-`{kF<;eZ|i z8<+0kfFA)nmk#29A4FT`XaFMXdp`gX13U(`4gfwP&Y)rd5d%C1wGIFP07rY~XaFMX zdp`gX1Uv?{4gfwP&Y)rd5d=I2wGIFP07skVXaJXO;(!}PN4w@|03z#qKL8O4JO;H6 z06rqlpke?K2|Nb14gdfEJ|gRTKL8O5JO;H606rqlpke?K3Ook24gdfE0H6Y1nS1~d zcbAdkfFV71I|j850IAk509=rU&j1m3I|j850OHm!0740_p8yefI|j8505{k#02XoM zXaJGS1^@s6005wn000qtm+#_$w*jk{r{jQ-0VJ0=5#2flwGIFuF}Lji5#2flwGIG_0f)o)01;w4 zivb$?%>WTvJ0d>(V*nA}ItH~403!X`LI4rpItH~403yj9vH%g_ItH~403r#lp8yfz zItH~403v-z+5i#bItH~403wG-+5i#cI=ZM103wlpNZJ4qN*Cs4gexo zN!kDr>pBLt4gg0E^k@Jg>w7-{5ePd5wGIG2BF>;<01*f~2DJ_V002ik^k@J~bZu|| z5fM9=`tN`uQ)={R08DgkZ~ze#I|j8506rq?dp`gX6FUaA4gfwP&Y)rd5feKGwGIFP z002jr^k@Jg3+M;|5hFVWwGIG2OmuB<01+lT2DJ_VJ|fPbVgL~)mqGA=6HO{R2DJ_V zJ|fPbVgL~;I|j850000-%JgUeBF>;<01+)a2DJ_V07v-rXaFJ$=m-H3G&=^h4gfw( zbZu||5jQ&qwGIG2BF>;<01-Erq40nce>*z{wGIG2BF>;<01-Po2DJ_V002iS^=JSh z&Y)rd5k5NxwGIFPM?Cdt03yzyVgM09I|j85002i$^=JSh&Y)rd5kWf!wGIFPM_~16 z03yzyVgM0CI|j85002jT^=JSh>w7-{5llM;<01-?(2DJ_V002jzfAwep zBI|oU01;a|2DJ_VJ|fPbVgM0aI|j850000-!1ZVVBI|oU01;d}2DJ_VJ|fPbVgM0b zI|j850000-;Pq$#BI|oU01;g~2DJ_VJ|fPbVgM0cI|j850000-0QP7ABI|oU01;k0 z2DJ_VJ|fPbVgM0dI|j850000-e<1c~03z#qKL8P5I|j8506rqlpke?KUpof14gdfE zM?m&y03z#qKL8P9I|j8506rqlpke?KV><@54gdfEM_~4703z#qKL8PAI|j8506rql zpke?KWIG164gdfEJ|gRTKL8PBI|j8506rqlpke?KWjhA74gdfE0H6Y11rp!@5z?17 z@_->d(mDpU4gf>=F92LIx9tEC(mDpU4gh@kF91RbuAcxA(>eyV4gk^lF8~%6^JoBJ z)&>9o0000Wl>h({)|Zs>fVTk#mrV13kO3r@-SdD?0h+fh^ni8*0Ufub_<$S%0WP<} z`GB$nR-`%xwGIFQ5CdrdAN-UK0THA+2DJ_VA3Zs001>1*2DJ_VAMtEA01>1*2DJ_V zivfqj_W%*VI*S1s`pp0ly*eTZuAcxAr8)++4gdh40y$Hn01;`I$^L*Le`z`fwGIH? z8884`J{V&F5otOGwGIH08ZZD{1Oy)d5otOGwGIIA8ZZF10mGZ201=!zsmcWa00000 zwgGlZr~na|I$_HN000000JZ^nCrtnmmO22-1poj5002TgIcfkAYB~nB4geV(FaSdF zY&QTAYdQwC4gjGXFaUu91_`d801<4LZ~uT5Ja9Tx2WbEa1HiU70000008_EPIsg%I zI;u)&00WV*emvsYyAb$Wl2DJ_Vogpv)Ts|0M01*H>2DJ_V zQ6ew^Tm%Fk01*H>2DJ_Vup%%3wgJPNp#TvxI;qD6000000JZ^kN~i!4FFIk!1poj5 z006cDc_&Q(5iL3Z$OQlZ0000&JvnLs5dk^|wGIH;BQO9$@oYB$5dt~}wGIGbBrpJh z0vrjhp8yd9ItH~4003Tq761S&3TXgSE9jX35eJtr1c4PM2s)}tXaEC|uzw}c761T3 zBIFAJ5ehoGs15+@BrpI%b7xTi5et`V1c4s`9k+`Ffn)&zG?(xNfm8uUmqiAFTnI-x z1p!e53YeGv0f85nzy^U30WO!(27$o=k(ZMPfh1PaIR>>300C4CX#gMmlnwzA(m4jT z4geoLIcfkA(m4jT4geqVY&QTA(m4jT4giY*hr{;(5$-vQ0UG+v01@jsA_=aa01?wU z2DJ_V0H6YG#u5M#mzNC)fgyjFIR>>309`3C09-y8V*nACIR>>301+xM09*tF9{>@T zIR>>30B|ZW0JZ_co1p*^$~hUl1poj5006cDc1oxK5ym;uyafON0002C0eL4)01?DF zaJ&To00000LOnTZ01=ou2DJ_VnJX{=Lh)=j01=rv2DJ_VAuKQefdYRCuAcxAnmGow z4gdgN;1B=+#SUozQ!D7101=)!R0nAQ2?Id4Hvj+t002|5zB&LApE;^ZXaEC|uzw{m z5dZ)}BIFAJ5urJ{s15+DEHD5>3002HB z>w7-{5ra7fwGIG2BF>;<01<;Z2DJ_V0000J2=os(0K);I8_NI!5nh+k41pm%UO5J} z4gei7FaTV33bOzaUO5J}4gh~KFaSacuAcxAUpWS~4gldXFaQ^r5NQAk>300E5?X#gKRIcfkAGdU6wX#k4>8v4xu5llHE z39g?25i~glwGIFxeMs5>5jHsnwGIGBa1&_&BF>;<01-kt2DJ_V06rq?dp`gXO*sa& z4gfwP&Y)rd5luM;wGIFP006@QG4lce5hytZwGIHF<^=!%0001z0RWd)4}lRqC^-hT z4gec8FaTUG*kJ$>C^-hT4gh^LFaSacuAcxADLDqU4glXYFaQ@H6KMdd<^=!%0000G zQ~&@GESIDYfj z2DJ_VBK57F01*Q?2DJ_VB0$=~01*T@2DJ_VA~uJ101*W^2DJ_VA{~E4&;StzI0m&2 z03x6aXaErhI0m&203xO&3jh%aI4S@D03r#lp8ydFI0m&203v-z+5iy?I0m&203wG- z+5iy@I0m&203wk{+5iy^I0m&203w@6+5iy_IJ&3~03xMG+5iy`I0m&203vZRuK*Dc zI0m&203tp~+5iy|I0k>U4gexKGp_&<5;!^l001IaN!kDr6F5Qu001I$k^}$|6gWZv z001Hr&Y)rd5ji*pwGIFP z07owuX#gV5pke?KJU9lm4gdg0K^JKNBF>;<01-Vn2DJ_V07r8dX#i9Bi3b4@MmWW% z4gd)QxWG3600000Q+%)c01-ww2DJ_V2?MaeHvj+t0000-p%-ZYA`9pU0TE0%2DJ_V zK1_6NZ~zfcI0k>U4gfwP&Y)rd5l=Vw7-{5mPt@wGIG2BF>;< z01;C-2DJ_V002kR7ij<@&Y)rd5mq<`wGIFPM*$dV08DgkZ~zf(I0m&206rq?dp`gX zY&ZtB4gfwP&Y)rd5o|aHwGIFP002iX7-;}ZbZu||5pRDu2DJ_VJ|gRTKL8PLI0m&2 z06rqlpke?KZ#V|E4gdfE07pR>X#gV5pke?KaySOH4gdg0a~Np=Q}~Go0TF*V#itGc z2?MCWHvj+t002{buloQIe>euU4gd)Qpujf(0000007r!wX#gV5pke?KgE$7Y4gdg0 zml$aPBF=xHVgM0^I0m&2002j+7-;|^&Y)rd5r#MhwGIFPN4pql03yzyVgM0{I0m&2 z002kn7-;}ZbZu||5t29twGIG2BI|oU01=Wn2DJ_VJ|fPbVgM16I0m&200000M;jSw z08{vh2LTbDIK`(900{$_z&8K@0000}e6RZe5uTU46oDImqBsV%4gdg0KN)ENBF>;< z01>1(2DJ_V07p?7X#gV5pke?Kr8ow)4gdg0V;N}xBF>;<01>A+2DJ_V07sD-X#h-g zZEye)u{Z{`4gfwP>w7-{5wSQ1wGIG2BF>;<01>e`2DJ_V0000-qZw%cBF>;<01?DE z2DJ_V07tcd8EF6_&Y)rd5zaUUwGIFPN5>gy03yzyVgM1(I0m&2002kz8EF6_3+M;| z5%M?&wGIG2OmuB<01@>#2DJ_VJ|fPbVgM2KI0m&200000M->`r03z#qKL8Q=I0m&2 z06rqlpke?K`8Wo(4gdfEM<*I-03yzyVgM2PI0m&T4gdg0IT~pIBF>;<01^E-2DJ_V z07pw2X#gV5pke?K{x}A;4gdg0YnMJ2fgb^jmtGcu9|5bEeinfr0?QhgpB8~0LF*c6 z03z#qKL8OBIR>>306rqlpke?K5IF|54gdfEM++Ni03z#qKL8OCIR>>306rqlpke?K z5jh664gdfEM=O{97J(lDOP3xOfgb^Dmp&JP9tB5>8)*QST^E5HMMtX}X#gVYdp`gX z894^E4gfwP&Y)rd5g9oKwGIFP06rq?dp`gX8aW2F4gfwP&Y)rd5gIuLwGIFP005u@ z3ajw|5xbXx7l9#vyEg{44gj|{FaTUW7-IktyEg{44ghC2FaTTx1RnqqyEg{44gk_P zFaWjz!<(T15&1XLA_xEg0002C0d`8L01@>!5i1A)00000wgGu3O#l(|H?S%Q00000 z079H)umBOfHwLv101-Mc077R|wEz*lHwLv10IoVP073&UdIJFwzBdN74ggC#FaSac zuAcxAzc&W84glyoFaTZvd;$O&A87znE9jX35yO{H7=aZg#5cZ3X#fL}pnoNRd;$PM zBIFAJ5ym&Vs15)$JTL%4b7xTi5yzK`7=a%F;g_lyfwTeJw_h27eE|Xbx7`|noC5)H zmwFz7oB@xw7axJ90Re}%z950P0Rg7BcOrou0Ra`al_P;h0s$4b+$Dil0|DBXGbw?6 z0SlM0DS>DK4VM}!fn)(rmwzgOo&o2V9xH+40rEJT4^f4VgWwGIFQVo_-TA3Zs001>)15)o+tAO6O501>)12DJ_VAG^;30TH@2 z2DJ_VA0Sd>01>)12DJ_VAK^Y*01>)12DJ_Vivfqj_W%*6H;Vy!7?J=HJ2r~}8v4xu z5t%n45!v7X5xX@8wGIFxg0@ot5xg}9wGIFx39g?2e-XVk2DJ_VB7I2O01>}6IsgCw zB8N!Y01?17IsgCwB9Tbi01?482DJ_VBAZCs01?792DJ_VBBe;$01?AA2DJ_VB5^XW z01?DBIsgCwB0fpl01?GC2DJ_VA~`d!01?JDx~L8SB3DV;01?ME9kmVsB6E@i01?PF z2DJ_Veoo?o4gfw(bZu||5$-hx zwGIG2BF>;<01@sr2DJ_V0000-c}i&jB3V>Qe*h8mHNHq`06rq?dp`gX_B95z4gfwP z&Y)rd5%x6(wGIFP002j)N@)NhSyV~@5&Sj2NNE5*BI|oU01^H*2DJ_VJ|fPbVgM2T zH3qc~00000N4ZLA03yzyVgL~kHU_m0002kJN@)Nh&Y)rd5fU~AwGIFPN9#&y08Dgk ze{cX16E+654gfwP&Y)rd5fe5BwGIFP07n^1X#gS%=m-H3E;a_W4gfw(bZu||5ivFf zwGIG2BF>;<01+`Z2DJ_V0000-IZJ5(BI|oU01-7d2DJ_VJ|fPbVgL~}HU_m00000- zOG{}0BF>;<01-Gg2DJ_V07qR*X#gV5f1qLj5ji#nwGIFPM{i4M03yzyVgM0NHU_m0 z002jUOKAWik-U5W5oI<8wGIFPN3Tn108DgkZ~zf*HU_m006rq?dp`gXZZ-zB4gfwP z&Y)rd5pFgHwGIFP002k9OKAWi&Y)rd5r8%ZwGIFPNAF8%03r+M2muj>HU_m0e*ivA zbZu||5s5YiwGIG2BF>;<01=5c2DJ_V0000-K}=}?B3V>Q01=NiVo_-TM<7gT03z#q zKL8PtHU_m006rqlpke?Kkv0ak4gdfEM>0%l03yzyVgM17HU_m0002HB&Y)rd5tKFt zwGIFP07sKdX#gTwR7wC5nKoike`x?ma!hFeBI|oU01=xu2DJ_VJ|fPbVgM1FHU_m0 z0000-giL7wBF>;<01=%w2DJ_V06rqlpke?Ko;C)x4gdfEN2N?@03yzyVgM1cHU_m0 z002j~Olbfj&Y)rd5wtc2wGIFPN6AcS03yzyVgM1fHU_m0002kZOlbfjf6ky{01>}7 z2DJ_V07vaiX#gV5pke?K(l!RQ4gdg0|4eBBB9Xj&01@dn2DJ_V07orNX#h-gZEye) z@-_yw4gfwP>w7-{5%M+$wGIG2BF>;<01@&w2DJ_V0000-KTT->BF>;<01*N=2DJ_V z07p?xX#gV5pke?K2R8<_e+~cuM}JLe03r+M2muijHwLv106t7~ZEye)7B>d94gfwP z&Y)rd5f(QFwGIFP002kPO=$okSyV~@5ga$ZNNE5^uuW+IBI|oU01+NH2DJ_VJ|fPb zVgL~yHwLv10000-!cA!aBF>;<01+TJ2DJ_V06rqlpke?KAvXrKe+~cu07oNEX#gTw zR7wC5CO5uFX#ht8PH6xl>w7-{5hynXwGIG2BF>;<01+rR2DJ_V002i6PH6xl&Y)rd z5h^zZwGIFPJ|fPbVgL~;<01-Sl2DJ_V07pkoX#gV5pke?K zJ~sxn4gdg0bxvsjehtw4gfwP&Y)rd5l1%$wGIFP z002kXPH6xlSyV~@5luIAQE322rcP-9BI|oU01;0&2DJ_VJ|fPbVgM0OHwLv10000- zxK3#RBF>;<01;6)2DJ_V07uGBX#gV5pke?KQa1**4gdf?eB3V>Q01;R>bWv#lM+#4A03z#qKL8P0HwLv106rqlpke?KS~mu@4gdfEM;uRS z03yzyVgM0bHwLv1002iWPiX)m&Y)rd5nVS1wGIFPJ|fPbVgM0dHwLv10000-Pfuw8 zBF>;<01b0fm=XOo1N(rI&b2 zfgb|JP?woZfgXS5P-y@n>w7-{5u-N-wGIG2BF>;<01=}%2DJ_V002h?QE31o>w7-{ z5u`T;wGIG2BF>;<01>1&2DJ_V002iNQE31o>w7-{5vVr?wGIG2BF>;<01>D+2DJ_V z002itQE31o>w7-{5vex@wGIG2BF>;<01>G-2DJ_V000#}BI|oU01>J;2DJ_VJ|fPb zVgM1UmkUjSGXZ0lKTUxle`7TUwGIHEr!W9qJ{V&F5o0w5wGIHNtS|sv1Oy)d5o0w5 zwGIFit}p<$0mGZ201>h^y)Xs<00000wgGlZr~nbJHB~SM000000JZ^nCrtnmtTo^- z1^@s6002V%#&rM@WHko04ggiJFaSck&jSGwWi zX#fcWptm;w00000Q?b4}01<7MF;0OL5pgxTs15*avM>Nbb7xTi5ptJSPJtu=jhA~) zfjI$_m$goTGy#aW>P~@a0RgR-R8WD;0kgLuQGv(-0sXh?Qi0O~0cV%KRe@*$nztub zfqVi1ez&Apfzkm1>z8+0foK6Ix8PcVgaZLtw`E>|Y6<})m(XZ|Hh(HL2DJ_V0pD$D z03SU$Y5)-`H4+hN0E+>K!}kCYQZ5iK=v zApig(he+B05iT_bwGIGB!fj~)BI|oU01-Gf2DJ_VJ|fPbVgM01H3qc~0000!BI|oU z01;0$2DJ_VJ|fPbViN!nPc;U$4gdfE0K);1>v{kYAD5VEfgvFuH3qc~0ObcU09-EE zVE_>yH3qc~03HZ20740_p8ydcm)dE88v!Gi_Gy7!0WFtPYJtE3I=2*Sfr$eFI=7x~ zfeQfvKbNX+fz<&&mw<4A?*TuzaB+bH0Rb(ybaH_U0Rb(yfOCNh0Rca^jC6sA0e??3 z2DJ_V0dRt803SU$Y5);WGZGPL03W;00|60FGX}K|03TI%vH%fJGX}K|03QZFy#NtU zGX}K|03RtPA^;IjGX}K|0E+>K!}kCY1vQHS=;62k5xF#r0hK#b01>n_ivb$?%>WVn zG$OQd^8gW0GX}K|03zGK;s6m*Gk*rP4gex!Lg)YyQZoj%4gezIexd*oQ!@s&4geze zRu2FXR5J#(4geyGnlS(oRWk;)4gezZB+&p7Rx<{*4gey?l79dZS2G5+4gey4geyNNPpS@5nVF| zwGIFxn@HLK5neO8s15)krAXQU5nnSMwGIFxaWby}5nwY0wGIFxK1tdD5n(e1wGIFx zIWw;S5n?mCs15)kS4r9c5o0qt0000YbCLuA5o9wu0000YCpHQI5oI$5wGIFxGL!@W z5oR+TwGIGB2YhJ&Q}~Go0e=y2GsUM400{%gz&8K@0000}e6RZe5pXjGwGIFY1HiyH z00000002iBd}#n8&Y)rd5p**KwGIFPM@M{V03r+M2muj!GX}K|06t7~ZEye)d@}~M z4gfwP&Y)rd5qvWSwGIFP002j4d}#n8>w7-{5r8uWwGIG2BF>;<0DlpHGX}K|0000- zd3;<01<;T2DJ_V07r{_X#gV5pke?KkuwIh4gdg0xqN8=A`9pU0TG}x2DJ_V zK1_6NZ~zgbGX}K|06rqlpke?KqcaAz4gdfE07uz;X#gVYdp`gXr!xk%4gfwP&Y)rd z5vMZ-wGIFP07vV5X@3AB&Y)rd5vnr=wGIFPM;U!-03r+M2mukhGX}K|06t7~ZEye) zzB2~34gfwP&Y)rd5xz49wGIFP002iheQ5w9>w7-{5yCSDwGIG2BF>;<01?772DJ_V z002izeQ5w9&Y)rd5ydkGwGIFPM|pi|03r+M2muk+GX}K|0DnGAbZu||5!o{awGIG2 zBF>;<01??U2DJ_V0000-nSE&hBI|oU01@3Y2DJ_VJ|fPbVgM1{GX}K|0000-t9@wz zBF>;<01@Cb2DJ_V07t!jX#gV5pke?K?lT6p4gdg0&wXhCBF>;<01*K+2DJ_V07v0{ zX#gV5pke?K3V$>PwGIFPNArDY03wmRd;k$4GzPT}002iJerW(qbZu||5h^qWwGIG2 zBI|oU01+xQ2DJ_VJ|fPbVgL~;GzPT}00000M>BqD03yzyVgM0DGzPT}002iterW(A z&Y)rd5lA!!wGIFPM^}Dn03yzyVgM0LGzPT}002j6et&5IBF>;<01-_z2DJ_V07rX% zX#gV5pke?KPBaF!4gdg0jecnWBF>;<01;0#2DJ_V07svGX#gV5pke?KSu_T<4gdg0 z&3;<01wGIFP zM}U8603yzyVgM1cGzPT}002HB&Y)rd5w$c1wGIFP07t!-aC?C*0_%U5pL>BUe;I&j z08DgkZ~zg%GzPT}06rq?dp`gXzcdE54gfwP&Y)rd5x+DBwGIFP002iTfN20C&Y)rd z5#TfiwGIFPM?HXP03yzyVgM20GzPT}002i%fN20C&Y)rd5#lrkwGIFPM`3_z03yzy zVgM22GzPT}002jGfN20C&Y)rdDiP&02DJ_V07sL6X#gVYdp`gX?lcCq4gfwP&Y)rd z5$-ewwGIFP07tWzhJ1k^0@Hw(r+k4P0`q{E$9#bv0TY+ze1RW9Gl6LUBI|oU01*K- z2DJ_VJ|fPbVgL~VH3qc~0000-Q-Ns!BI|oU01*N;2DJ_VJ|fPbVgL~WH3qc~0000- zbC*Vafgb^rmu7u|9|5zMhJAq_0@Hz)r+tAQ0`q~F$9;hw0TY+zeSscjM>B$H03z#q zKL8O7H3qc~06rqlpke?K3^fL|4gdfEM^l1n03z#qKL8O8H3qc~06rqlpke?K4K)U} z4gdfEJ|gRTKL8O9H3qc~06rqlpke?K4mAd~4gdfE0H6Y1bszu{_LnJsfgykPG6uB{ z0H_!-09-y8V*nBMG6uB{00|s109*tF9{>^dG6uB{0E8Ve0JZ_co1p*^M>FkG1^@s6 z006cDc1oxK5koVdUj_gG0002C0eL4)01-hmAYTRm00000Lc7lc0TK5y2DJ_VbRIDP zLRELN01@~y2DJ_VCm%5YLIx#2y#NvUG6uB{0NNih075AyA^;KkG6uB{0F59q0740_ zp8yg2m+pRn7(D+nJZ)(J2?OA_Hvj+t002|5zB&LA05f7yX#fL}kbfoMdH?`IBIFAJ z5d|~4s15*(Au#|#b7xTi5eAn+e}Ns15)kn@HLK5l%84wGIFx zrAXQU5l=D(wGIFxaWby}5l}J)wGIFxK1tdD5m7P*wGIFxIWw;S5mGW)*8>0|S4r9c z5mPcvfC2zVHKS<&B9Xj&01w6_X01<~W z2DJ_VJ|fPbVgM0`G6uB{00000N0p;#08{vh2LTa@mmr^k6@Q5`2DJ_V2?OxJHvj+t z0000-!=q^cA`9pU0TGWf2DJ_VK1_6NZ~zgKG6uB{06rqlpke?Kk}?Lh4gdfE07v7a zX#gVYdp`gXmNEvl4gfwP&Y)rd5tcFrwGIFP07vzsX#gV5pke?KnKA~o4gdg02c&5L zBF>;<01=xq27k2<002iBq-g*m&Y)rd5uGvywGIFPM>(Wv03z#qKL8P)G6uB{06rql zpke?Ko-zit4gdfEM_Ht403z#qKL8P-G6uB{06rqlpke?Kp)v-w4gdfEM|q@a03z#q zKL8Q0G6uB{06rqlpke?KuQCR;4gdfEN2{c108{vh2MYlaurkG`4gd)Q=$CMyffbii zpn((@vNFY|4gd)Q*uXac00000Q+%)c01>j6exQLHf3-3OwGIFPM;)bU03r+M2muko zG6uB{06t7~ZEye)#WDu94gfwP&Y)rd5ydhFwGIFP002ilrD*^n>w7-{5y>(JwGIG2 zBF>;<01?SD2DJ_V002i%rD*^n&Y)rd5y~01@gj2DJ_Vivfqj_W%(pGK&Ek`pp0lBr+liuAcxA z>oEqk4gey3NZJ4q?J)+m4geyDNZJ4q?lA_n4geyNNZJ4q?=c3o4geyXNZJ4q@G(t* z0stbVNZJ4q@i8g@002jOK(}cCBI|oU01^8!2DJ_VJ|fPbVgM2QF$T2`0000-t+#0a zQ}~Go0TKK$#itGc2?GehHvj+t002{buloQI{FhF%fg5ZBG6uB{06t7~ZEye)1u_P; z4gfwP&Y)rd5d|^^wGIFP002k(w`l+(>w7-{5eYH|wGIG2BF>;<01*i?2DJ_V002h~ zxM=_)&Y)rd5eza0wGIFPM;`zMfck&9X#gV5pke?K4l)L{4gdg0Ke%ZCml3pq8%0N7 zxM=_)>w7-{5hgMQwGIG2BF>;<01+lK2DJ_V002HB>w7-{5hpSRwGIG2BF>;<01+oL z2DJ_V0002P0h$sW01@ApHMD^tJ>M|~wGII8kud;V);+=i5#KQewGIH8k}&{639g?2 z5#TWfwGIGBlQ94m*S2W@^qdF)00000U}7{w}`ocRRMpFF$T2`00GLtX#gKRIcfkAjxiDuX#gMAJ;DGH zjxh$c4giY*hr{;(5zaA-0UG+v01?PBA_=aa01=Nd2DJ_VB7I2O01=Tf2DJ_VB8N!Y z01=Wg2DJ_VB9Tbi01=Zh2DJ_VBAZCs01=ciO@IObBBe;$01=fjDgXcgN6A3HX#gVY zdp`gXpD_lt4gfwP&Y)rd5uY&zwGIFP07v`3X#i9Bi3b4@pfSa#4gd)Q7{NCH00000 zQ+%)c01=>G%2DJ_VJ|fPbVgM1TF$T2`00000M@hhG z03z#qKL8P}F$T2`06rqlpke?KtuY3*4gdfEM_a&Y03yzyVgM1aF$T2`002jAz-a&? z&Y)rd5wbA`wGIFPM~%Q~0GD69fg43ft-xsjBI|oU01?VD2DJ_VJ|fPbVgM1!F$T2` z0000!BI|oU01?YE2DJ_VJ|fPbVgM1#F$T2`00000!vSAtSO5`&mxH{4Aw7dJ2DJ_V zGn_F1T-H6p01<;R2DJ_V-kdQ2LJ6*)01<>S2DJ_VjGZw67A3!F0Q8^;000000I&=L z01=0m;k<#z0hG6?y@5Xg0kOB~zJX2w0kM}jz=4wil()>lfe8Ttl(*KwfmH#29x(>B z4gdkv$!P!|JvnLs5gsuT5orJ)+AGQc5gsuHwGIFurI}&?5gsuHwGIG_0f)o)01WT>F(L`Bp8ydbF$T2`03v-z+5izDF$T2`03wG-+5izEF$T2`03wk{+5izF zF$T2`03w@6+5izGF-?F103xM-NZJ4qB{5Ba0sta$GOqv;CNU}i002iX$Y}r~>w7-{ z5il_ZwGIG2BF>;<01+@T2DJ_V002i}$Y}sm_=yJr5iv2vrw#xK131Aq0000008@Og z`v4I!F$T2`00{#y!8ZT^00000M~}#903r+M2mui{F$T2`06t7~ZEyf*5jrsjwGIG2 zBF>;<01-Md2DJ_V0000-ugGZtBI|oU01-Yh2DJ_VJ|fPbVgM07F$T2`0000-!N_R< zBF>;<01-hk2DJ_V07uivX#gV5pke?KLoo)m4gdg01<7duQ}~Go0TD!(ki>x%e?&0` zwGIFY10caS00000002ib$!P#03+M;|5lS%zwGIG2OmuB<01-_w2DJ_VJ|fPbVgM0M zF$T2`00000M^njZ03z#qKL8O?F$T2`06rqlpke?KQ85O!4gdfEM`g)r03yzyVgM0T zF$T2`002jK$!P#0&Y)rd5mqq<3AGLY07sX}X#kgL#eo||N4Lpo03z#qKL8PKF$T2` z06rqlpke?KZZQV64gdfEJ|gRTKL8PLF$T2`06rqlpke?KZ!re74gdfE0K)-wJ4OHz z^KFb1^_01&7#0JZ_c zo1p*^7BNMo2mk;8006cDc1oxK5fU+BsR#f70002C0eL4)01*%|0I3K700000LfR|J z01@Oc2DJ_V5UDW$LZz8v01@Rd2DJ_Vo2fAXLJ2gkp8yf&Fb1^_04Az20A2tO0{}?O zX#i6z=$QZ!>M&FXX#fcW5V$u000000Q?b4}01@k#Va90U#(^IK05P|x#(`u30T-7H$bpIhB$t=SftLX#w=cK!}kCY z&@hVu8v4xu5y&u$0kkLp0TGihivgO2%>WUQFd_&j000p;Fb1^_03w<%x&RS4Fb1^_ z03r#lp8yd#Fb1^_03v-z+5izdFb1^_03wG-+5izeFn5qB^KwGIG2BF>;<01w7-{5r!}ZwGIG2BF>;<01<{T2DJ_V002h~+GzkH&Y)rd5s5GcwGIFP zM<3d003yzyVgM0~Fb1^_002iZ+GzkH&Y)rd5sfegwGIFPM^V~o03v_udp`gXjxYwb z4gfwP&Y)rd5sokhwGIFP07r4!X#gVYdp`gXkuV0e4gfwP&Y)rd5s@$kwGIFP07sG9 zX#gVYdp`gXpD+fs4gfwP&Y)rd5uY#ywGIFP07t{xX#i9Bi3b4@pfJU!4gd)QNWnJ% z00000Q+%)c01==t2DN_<00{#?!8ZT^00000NAcQe03r+M2mukVFb1^_06t7~ZEye) zvM>g<4gfwP&Y)rd5wb7_wGIFP002i3+i3tI>w7-{5w;<01>t@2DJ_V z002iL+i3tI&Y)rd5w|b~wGIFPM>X4N03yzyVgM1kFb1^_0006P5i6I=*MT7+D=-GN4gf;A zF#ufQexd*oD=-GN4gh+&F#tjduAcxAESC+~fg1rYmnqnR(g8!4{Mdo50dTjf*@2b; z0gAUl+kvJ50YaDP+<~V7qPLLUftLaSq?ah*fpP()x0~RBoB{zumpJ2rT>(P3mg9jk z0s%v}$>o6{0)N^s2DJ_V0oLtl03SU$Y5)=1FA@=H03R~KGyoCWF9x*^0E+>K!}kCY z8Ze6i8v4xu5fm^Y39g?25!){YwGIFxeMs5>5#28awGIFxhe+B05#BEbwGIFxkx1GA z5#KKcwGIFxn@HLK5#TRPfC2y_rAXQU5#cW?0000-)qm`103z#qKL8QyF9x*^06rql zpke?K>n{ei4gdfEM+fa`08{vh2LTc6FU6-000{$V!8ZT^0000}e6RZe5$rDpwGIFY z17N{700000002id?P&la3+M;|5%MnvwGIG2OmuB<01@>s2DJ_VJ|fPbVgM2KF9x*^ z00000M@UueX#gVYdp`gX`7Z{w4gfwP&Y)rd5&16$wGIFP07qx-X#gV5pke?K{4WNz z4gdg0dF^QcBF>;<01^H#2DJ_V07seaX#kgN>46(XN4f2303z#qKL8OHFb1^_06rql zpke?K7BB|24gdfEJ|gRTKL8OIFb1^_06rqlpke?K7cd634gdfE0K)-WENK7{&zFzs zfgvH!F9x*^09Dp809-P{GyoCLF9x*^007r90740_p8yfim(l5g8v)ao?dgHX0pPc_ z>VZE20sXi2>w!)I0sWUm?SYd4;J4WAfe8Tt;J4!LfmH#2elG^K4gdip_GthgJvnLs z5q>Wc5orJ)GQuWQwGIG_0f)o)01>_~ivb$?%>WU&FCq!9p8yemF9x*^03v-z z+5i!OF9x*^03wG-+5i!PF9x*^03wk{+5i!QF9x*^03w@6+5i!RFHL{~03xMG+5i!S zFDd{407oM#^=SYi>w7-{5sxnhwGIG2BF>;<01=Nb2DJ_V002i-^=SZ8_=yJr5s;VQ z@PQS7kS_+c4gd)QaKSeK0000007rxMX#gS%=m-H3mM;di4gfw(bZu||5t%OrwGIG2 zBF>;<01=rl2DJ_V0000-qxES3BI|oU01=%p2DJ_VJ|fPbVgM1HF9x*^0000-we@KL zBF>;<01==s2DJ_V07u95X#gV5pke?KqAvyswGIFPN9Xlv0GGM(fg43f2li(`2DJ_VJ|fPbVgM1kF9x*^0000!BI|oU01>+{2DJ_VJ|fPbVgM1lF9x*^00000 z!vU2V^8gWZm)-G!At7@w2DJ_Vn&2@2Tr$Em01@`1+zgtr6pfj}6ww=nmCRRMnvF9x*^ z00A!lX#gKRIcfkA4lfcBX#gMoYx4jR4lf3^4gep$^8Wx44lf3^4giY*hr{;(5n?Zk z0UG+v01;d-A_=aa01*!_2DJ_VB7I2O01*){2DJ_VB8N!Y01*-|2DJ_VB9Tbi01*=} z2DJ_VBAZCs01*@~O@IObBBfYJ+5iz1FHL{~03vZRuK*DiFDd{407r@aX#gVYdp`gX zATI{B4gfwP&Y)rd5g;!HwGIFP07tw1X#i9Bi3b4@Auq+J4gd)Qn87yy00000Q+%)c z01+XVT={_;enwGIG2OmuB<01+xL2DJ_VJ|fPbVgL~;F9x*^00000M+yFE03z#q zKL8OfF9x*^06rqlpke?KE-wbP4gdfEM;rcW03yzyVgL~_F9x*^002iV{%HUr&Y)rd z5i>6awGIFPM_>MF08{vh2LTZ@FU6-000{$#!8ZT^3IG5AQ+%)c01-5n`hgpNIxhyb z4gfw(bZu||5j`&kwGIG2BF>;<01-Ve2DJ_V0000-t^R2MBI|oU01-hi2DJ_VJ|fPb zVgM0AF9x*^0000-zy4_eBF>;<01-ql2DJ_V07udOX#gV5pke?KMlS}n4gdg0@&0K5 zBI|oU01;g;2DJ_VJ|fPbVgM0MT`vZ;4gdfEM-l&N03z#qKL8P4F9x*^06rqlpke?K zUM~i<4gdfEJ|gRTKL8P5F9x*^06rqlpke?KUoQr=4gdfE0K)-@mNEbl)0gM^fgyj> zE(Wy@0N?5{09-y8V*nA;E(Wy@0I=&Z09*tF9{>^4E(Wy@0C(&$0JZ_co1p*^1}}xS z2mk;8006cDc1oxK5dtrvx(EOO0002C0eL4)01*H$K)MJ300000LjG&>01?zK2DJ_V zckM9%LcQ|;01?$L2DJ_V0`4&YLJ0+~p8yfomyG*?7(Ci8R0nAQ2?H>=Hvj+t002|5 zzB&LA+b*g~XaEC|pnoOM7Xtu7BIFAJ5#27js15+x?lAyDb7xTi5#E>J`+*+;@V5Mc zWdQ*PmuCHeiUAat@%@390Ts82{()`*0W!Dv|A9^c0W!Bo0fJ%y0Y$f}0)kEf0Y#Vj z1A>zQ6_001I~NZJ4qo-PKp4gg0h4r%}*>w7-{5vVQ(wGIG2BF>;<01>Dz2DJ_V z002HB>w7-{5x*`5wGIG2BF>;<695svE(Wy@00000!vP$#ZvYXGmjMcbAw7>S2DJ_V zsr@kkTrSvQ01=Na2DJ_V;{7oILJ6*)01=Qb2DJ_V8~!l>7Pk#*0D)o$00000000pI z01=ayUkZZNe>^S*wGIFQO%ZAUA3Zs001-Sc5)o+tA0r4)01-Sc2DJ_Vivfqj_W%)o zE{g#g`pp0lcP=6cuAcxAJuU{d4gey3NZJ4qKQ0Ef4geyDNZJ4qKrRNg4geyNNZJ4q zK`uf7001JJNZJ4qLM}~!0stbVNZJ4qLoNoj4gex?Ofs(k5kxKqwGIGBED&k{BI|oU z01-|u2DJ_VJ|fPbVgM0NE(Wy@0000-UJz;kQ}~Go0TE9w#itGc2?MCXHvj+t002{b zuloQIPnZ7-f*XHcE(Wy@06t7~ZEye)VJ-%>4gfwP&Y)rd5n(O{wGIFP002j<5NZG- z>w7-{5oIn0wGIG2BF>;<01;&_2DJ_V002k65NZG-&Y)rd5oRt1wGIFPN6-*z03yzy zVgM0oE(Wy@002ku5NZG->w7-{5qK^JwGIG2BF>;<01 zG5{8Q4{8A9%?JPh0001>V*>yYHJ4-!g3tj%mo*N8n*md|(GG%60RdCDAP|B#0Rcjn zSP_Ef0YbMx5`tg>fA}p1wGIFQc^GN{A3Zs001@~t5)o+tivfqj_W%(fE{g#g`pp0l z94;aWuAcxA`7H*u4gey3NZJ4q`z=BM001I~NZJ4q{4EBx4gg177-|3_>w7-{5e6;> zwGIG2BF>;<01*Z*2DJ_V002HB>w7-{5gjfDwGIG2BF>;d!wND0m!1@YQUMK@@f3oZf0``@wGIFQq#J4gA3Zs001=uk5)o+tA0r4)01=uk z2DJ_Vivfqj_W%*xEsFsf`pp0l)h!|kuAcxAn=J;l4gey3NZJ4qoh=5n4geyDNZJ4q zo-GEo4geyNNZJ4qpDjWF001JJNZJ4qpe;>+0stbVNZJ4qp)Cfr4gex?HZrdO5uz;y zwGIGBgBof8BI|oU01>P$2DJ_VJ|fPbVgM1WEe5p?0000-wHj&wQ}~Go0THd2Ko)`( zf2}PBwGIFY1F*q200000002kh8fpL{3+M;|5xgx1wGIG2OmuB<01>|}2DJ_VJ|fPb zVgM1pEe5p?00000M*|yb03z#qKL8QKEe5p?06rqlpke?K!z~824gdfEM->}t03yzy zVgM1uEe5p?002iP8)^U|&Y)rd5yveC2DJ_V07plc8W(~d1xIHaY5`nj?kC$B+f*~P~Ee5p?0BQ>|09+#oPXG~*Ee5p?0Fw+d0740_p8ye% zm!B7c8v&D-yBC7c0ic(R7=oJtv9~B0f=&SevA1^`f;RyHpqH;3g69FCx0f7(U;%$t zEe5p?00Gbhr{;(5q>R;0UG+v01ODzVq4gkUyG5|seuAcxAOqa_Zf*S!(m**aWU;%5FNFRclf3+$G zwGIFQVJ&I^A3Zs001>q+5)o+tAGk+R01>q+2DJ_VAGw`R01>q+2DJ_VA3`ID01>q+ z2DJ_VAG55~01>q+2DJ_V9|z|T01>q+2DJ_V9~5*r01>q+2DJ_Vivfqj_W%($EsFsf z`pp0lE-fNA0Sf^Uwkig-4geyff8pZ*5w|J^wGIFx9NNJE5x6P_wGIFx39g?25xFV` zwGIFxeMs5>5xXh|wGIFxhe+B05xgn}wGIFxkx1GA5xpt~wGIFxn@HLK5xy!q0000Y zrAXQU5x*)r0000YaWby}5x^=2wGIFxK1tdD5y2|Ds15)kIWw;S5yC1Rf3*$(B3DV; z01?9~x~L8SB6E@i01?D09kmVsA}2Nq01?G12DJ_VA~KW&01?J22DJ_VN023I03r+M z2muk+Dh9O<06t7~ZEye)*(wIL4gfwP&Y)rd5!osRwGIFP002j@C29a7>w7-{5#1^V zwGIG2BF>;<01@3P2DJ_Ve*geS!X;_|BF>;<01@CS2DJ_V07uj%Y5*e6pke?K;wlEU z4gdg00w!tzA`9pU0TJ>l2DJ_VK1_6NZ~zhYDh9O<06rqlpke?K^(qFn4gdfE07oJw zY5*eZdp`gX`6>pr4gfwP&Y)rd5&0?xwGIFP07ow7-{5i~0XwGIG2 zBF>;<01-4R2DJ_V0000-^d@QmBF>;<01-wj2DJ_V07nKVY5*e6pke?KNGk@l4gdg0 z7$<4~BF>;<01-(m2DJ_V07phAY5*b&=m-H3SStp#4gfw(e{^kd01;a&2DJ_VJ|fPb zVgM0aD+aX=00000M`kB#03z#qKL8P5D+aX=06rqlpke?KUn>T+4gdfEM|dY{03yzy zVgM0hD+aX=002jdCu#s9&Y)rd5pOF7wGIFPN1P{W03yzyVgM0*D+aX=002j>Cu#s9 z&Y)rd5q~QNf3*$(07t+lY5*e6pke?Kf-45K4gdg0(kE&FBF>;<01<;L2DJ_V07n2Q zY5*b&=m-H3k}C$a4gfw(bZu||5tS;<01=fd2DJ_V0000-ASh}8BI|oU z01=rh2DJ_VJ|fPbVgM1DD+aX=0000-GAL>QBF>;(? z2DJ_VJ|fPbVgM1kD+aX=00000N2Dlf03z#qKL8QFD+aX=06rqlpke?KzAFZ`4gdfE zN46+xSO6l;<01?6~2DJ_V07u#=Y5*e6pke?K%_|1A z4gdg02q|g+A`9pU0TJCR2DJ_VK1_6NZ~zhDD+aX=06rqlpke?K;Fqx^f)jt{E51l+ z06rq?dp`gX=qm=b4gfwP&Y)rd5$G!hwGIFP002j1DQW;BSyV~@5$-F#NNE5*BI|oU z01@yj2DJ_VJ|fPbVgM2FD+aX=00000M|LS{03yzyVgL~WEC#g>002jbDQW;B&Y)rd z5dW03yzyVgN1?1uO=&4gdg0$SG<7A`9pU0TC1|2DJ_VK1_6NZ~ze( zEC#g>06rqlpke?K7ngA*f)jrmEC#g>06rqlpke?K8!QI34gdfENBSvh03yzyVgL~y zEC#g>002h}Drx{C&Y)rd5g#lDwGIFPM;002iYDrx{C&Y)rd z5kD*jwGIFPM?xxU03wmRd;k$vEC#g>002jDDrx{sbZu||5nn6@wGMv(J|gRTKL8P5 zEC#g>06rqlpke?KUn~Z-4gdfE07rr;<01;<01002ksDrx{Ck-U5W5vwc)wGIFPM;t3^08Dgk zZ~zgsEC#g>06rq?dp`gXv@8a-4gfwP&Y)rd5wt7@wGIFP002iyD{25D3+M;|5ydP9 zwGIG2OmuB<01?P62DJ_VJ|fPbVgM1yEC#g>00000M|dl003sk+R7wC5&Mdx2X#hSV z>w7-{5zs6KwGIG2BF>;<01?oaAt!00000N4P6$03yzyVgM29EC#g>002kID{25D&Y)rd5$r4mwGIFPN8BrF03yzy zVgM2CEC#g>002ksD{25D&Y)rd5%(+xwGIFPM*u8p03yzyVgL~VEe5p?002i4L@a6m zBF>;<01*r=2DJ_V07oP&Y5*e6pke?K7cB<04gdg0L@a6mBI|oU01+T92DJ_VJ|fPb zVgL~!Ee5p?0000-WS2K6f*%2dmsco)9|5G7cPN4%0>mtrm?(lCf8;D`03z#qKL8Ok zEe5p?06rqlpke?KGc5+S4gdfEM+7Zu03z#qKL8OlEe5p?06rqlpke?KG%W_T4gdfE zM;(V-0002C0d`8L01>GwQ|tu*00000wgGu3O#l(6D&6Y^0000007AG&Q2-H1 zDh9O<0DK%W07AK)PXG~0Dh9O<06`rx0761WBZvSIODYDn4gdxoG5|uetkeJzOezMo z4gkv@G5|sc=MMl8O)3Vp4gioJG5|spbT|MJPAUeq4gggkG5~=B39g?25l@yXf)zYd zDveHR00{$NxHkX*0000}vA#M05mYLlPHF%Hk$`_Cz-0gcLL%e~0TEa#x~L8S8X+g53cD;kT49f_DM|Gq(&gf@lT-@3(b1g4zNB*SAnSf;RyHt+$9hf`9=5 zShop3f)@(`_Lm__f=GYbCI+<*00B^1Y5*TSIcfkA+9nbaX#gMA0sa6H+9n3I4gepN z_TvB%+9n3I4geoQBZvSI+9n3I4gepstkeJz+9n3I4genq=MMl8+9n3I4gen%bT|MJ z+9n3I4giY*hr{;(5iu%@0UG+v01+rEBD8Vy01?|J2DJ_VA~$~l3jq<_CI+<*03!MT zlmHRkCI+<*03y<1ng9{rCI+<*03xH|;{XxgCI+<*03saP!2l89CI+<*03r#lp8yfz zCI+<*03v-z+5i#bCI+<*03wG-+5i#cCI+<*03wk{+5i#dCI+<*03w@6+5i#eCOQBB z03xMG+5i#fCc1y94gex?GOqv;=q4St4gexPN!kDr=_UrX4gexKGp_&<>Lxk>001Ia zN!kDr>m~-Z4gex^k^}$|>?XRX4gex2HVOa{?Is;<01*l& z2DJ_V07tD*Y5*b&=m-H38Yc#|4gfw(bZu||5gjK6wGIG2BF>;<01+K02DJ_V0000- z%}{CpBI|#9KL8OSCkC|+06rqlpke?KAtwg44gdfEN8eCt03yzyVgL~&CkC|+002kv zP-*}o&Y)rd5hW)EwGIFPM*~r603yzyVgM02CkC|+002i7QEC7pk-U5W5nv|;<01;^?2DJ_V0000-aZzdj zA`9pU0TFs92DJ_VK1_6NZ~zf~CkC|+06rqlpke?KeJ2LB4gdfE07suuY5*cxR7wC5 zgD1X7X#hSV>w7-{5rroPwGIG2BF>;<01<^J2DJ_V0000-%~5IqB3V>Q01=BPzDQ{R zJ|chXdp`gXjVA`R4gfwP&Y)rd5sfDXwGIFP002kdQEC7p&Y)rd5uYapwGIFPNAXc= z03yzyVgM1LCkC|+002h=QfdGq&Y)rd5uzsswGIFPM-@_P03yzyVgM1WCkC|+002ir zQfdGq3+M;|5xXY_wGIG2OmuB<01>_?2DN_<06rqlpke?Kz9$B?4gdfE07qj|Y5*eZ zdp`gX!Y2l`4gfwP&Y)rd5yB@1wGIFP07rFFY5*e6pke?K#U}=}4gdg0hf-<)BF>;< z01?tB2DJ_V07scpY5*e6pke?K-zNsO4gdg0t5RwJBF>;<01@IR2DJ_V07t!2Y5;#C z&Y)rd5#=WawGIFPN6%7f03yzyVgM25CkC|+002k*QfdGq3+M;|5%nhqwGIG2OmuB< z01@~n2DJ_VJ|fPbVgM2NCkC|+00000M;%jY03z#qKL8Q@CkC|+06rqlpke?K{3iyr z4gdfEM=w)q03yzyVgM2UCkC|+004hSK~rh~BF>;<01*Hv2DJ_V07p|(Y5*e6pke?K z3n&J)4gdg0fm3P#A`9pU0TCJ~2DJ_VK1_6NZ~zew7-{5mP7z zwGIG2BF>;<01;Ct2DJ_V0000-b5v>oBF>;<01;&<2DJ_V07r#XY5*e6pke?KXD9}> z4gdg0msDy1BF>;<01;>?2DJ_V07u1CY5*b&=m-H3cPIw64gfw(bZvid01;<01@>l2DJ_V07s)$Y5*e6pke?K_$UUo4gdg0wN+{WBF=xHVgM2OCw7-{5mhM$wGIG2BF>;<01;Iw2DJ_V0000-qgHAFB3V>Q01;a$zDQ{R zJ|gRTKL8P3DF(F;06rqlpke?KT`2~&4gdfE07tb}Y5;#C&Y)rd5pO95wGIFPN5@ub z03yzyVgM0wDF(F;002kXR%!qu&Y)rd5ppR8wGIFPM+aAG03r+M2muj-DF(F;06t7~ zZEye)g((KL4gfwP&Y)rd5rruRwGIFP002idS84zvSyV~@5sN9lNNE5*BI|oU01=HT z2DJ_VJ|ch4pke?KjVT7T4gdfE07qk2Y5*cxR7wC5lPSJPX#hSV>w7-{5tS(hwGIG2 zBF>;<01=fb2DJ_V0000-bysQtBF>;<01>At2DJ_V07r*cY5*e6pke?KsVN4v4gdg0 znOAB6BF>;<01>Sz2DJ_V07t7=Y5*e6pke?Kt|@;8wGIFPN7+|u03r+M2mukkDF(F; z06t7~ZEye)!6^o{4gfwP&Y)rd5y2@2wGIFP002h^SZV+wSyV~@5yvUMNNE5*BI|oU z01?S42DJ_VJ|fPbVgM1zDF(F;00000M>SY#03umbN&pehDZWT)06rq?dp`gX(J2PC z4gh~XBF>;<01?qC2DJ_V0000-M_6hABF>;<01@LU2DJ_V07qF^Y5*e6pke?K;<01@da2DJ_V07rdTY5*e6pke?K>L~`b4gdg0k63B|BF>;<01@;l z2DJ_V07s!%Y5*e6pke?K{wW5v4gdg0vsf}}03yzyVgL~dDh9O<002kRSZV+w>w7-{ z5fUl}wGIG2BF>;<01*-@2DJ_V002kxSeM6Cf*t`Am*!N09|1F$233L|0aKSIRe~Qu zb6IKtBI|oU01+)J2DJ_VJ|fPbVgL~>Dh9O<0000-lUZs2BI|oU01+-K2DJ_VJ|fPb zVgL~?Dh9O<0000-vzLZdf*%6YS(m3(f*u0%S(nFEf*oZ?6IyBjBI|oU01-7R2DJ_V zJ|fPbVgL~}Dh9O<0000-Gg@i@BI|oU01-AS2DJ_VJ|fPbVgL~~Dh9O<0000!BI|oU z01-DT2DJ_VJ|fPbVgM00Dh9O<00000paPQ>WB?IwmkCyaA%AZs2DJ_VzJ4+QTs|0M z01v$017Rs15)vkum^6b7xTi5r3CJSArw~u$N_5 zf;0iEmzr0Cv;n1;PgsJq0iTxyS%S0ynYX!Fg0TSs&6jIig31BYw>DgY_yGY4w=Z6T z(E$NsmjPgcXaS73YG8u#1_4sHTxWvH0s&mNCu)LG0Rb|%d252~0Rfb^W^IBe0s+vs zj&Fju0Ri2&Msb3e4FSHF-+qE5e=sBlwGIFQ7K~~DA3Zs001+@G5)o+t9|$*C01+@G z2DJ_VAMvoV01+@G2DJ_VA3`ID01+@G2DJ_VAG55~01+@G2DJ_V9|z|T01+@G2DJ_V z9~5*r01+@G2DJ_Vivfqj_W%)ECW`?Y`pp0lQzjy#;o|@iF(d}H4gew?f7-zS5i%qO zwGIFx`T&#w5i=wPwGIFx(qWna5i}$QwGIFx39g?25j7+RwGIFxeMs5>5jP|TwGIFx zhe+B05jZ3UwGIFxkx1GA5ji9VwGIFxn@HLK5jrF~0000YrAXQU5j!M00000YaWby} z5j-RYwGIGBb%bgFA`9pUe*qCpBnGt(06t7~ZEye)Pb3Dl4gfwP&Y)rd5lw7-{5mO`vwGIG2BF>;<01;Cp2DJ_V002j)glYgH&Y)rd5mqDywGIFP zN4bP*03yzyVgM0XBnGt(002klglYgH3+M;|5oja^wGIG2OmuB4gdfE07nOfY5*eZdp`gXZzKk_4gfwP&Y)rd5pN_0wGIFP07n^xY5*e6 zpke?KawG<|4gdg0D}`zRBF>;<01;k!2DJ_V07nOg zY5*b&=m-H3#Uuu`4gfw(bZu||5y&J4wGIG2BF>;<01?O}2DJ_V0000-HHK;cB3V>Q z01?h4zDQ{RJ|gRTKL8QXBnGt(06rqlpke?K&?E-64gdfE07qknY5*cxR7wC5)+D}2 zX#hSV>w7-{e-YRu2DJ_VJ|fPbVgM1?BnGt(00000M|Fm303yzyVgM29BnGt(002ja zhH3yJ&Y)rd5$q%ewGIFPN417(03r+M2mulOBnGt(06t7~ZEye)03`;s4gfwP&Y)rd z5db9ywGIFP002kThH3yJ>w7-{5d;;< z01*cz2DJ_V07vbPA`9pU0TCA^2DJ_VK1_6NZ~ze+ zB?h$)06rqlpke?K8YKp`4gdfE07plMY5*eZdp`gX9wi2~4gfwP&Y)rd5gsK5wGIFP z07qGee`)|C&Y)rd5g{c8wGIFPM{9>_03yzyVgL~$B?h$)002jshiU*K3+M;|5i%tP zwGIG2OmuB<01-7M2DJ_VJ|fPbVgL~}B?h$)00000N5_Y103umbN&pc%CB8^$06rq? zdp`gXJtYRU4gfwP&Y)rd5j`aawGIFP002kze}`%SB3V>Q01-nazDQ{RJ|gRTKL8O$ zB?h$)06rqlpke?KMI{Ec4gdfE07nOiY5*e6pke?KS0x6u4gdg08Hj2CBF>;<01;Uw z2DJ_V07ol`Y5*e6pke?KS|tXx4gdg0S%_)?A`9pU0TF2>2DJ_VK1_6NZ~zf(B?h$) ze*iur&Y)rd5o{#}wGIFP002jMh-v^L>w7-{5pX32wGIG2BF>;<01w7-{ z5v3&twGIG2BF>;<01>4n2DJ_V0000-Cy8nRB3V>Q01>MtzDQ{RJ|gRTKL8P}B?h$) z06rqlpke?KttAGv4gdfE07p5AY5*e6pke?Kza<8>4gdg0ONnX#BF>;<01?3@e+IP< z002i_iE02M&Y)rd5yB+~wGIFPM~jJS03r+M2muk&B?h$)06t7~ZEye))g=bC4gfwP z&Y)rd5!EFIwGIFP002k1iE02MSyV~@5!)rcNNE5*BI|oU01@3K2DJ_VJ|fPbVgM1{ zB?h$)00000N9T!Z03umbN&pe#ew7-{5#=QYwGIG2BF>;<01@RS2DJ_V z0000-`H5-(BF>;<01@{k2DJ_V07naoY5*e6pke?K`6ULm4gdg0D~f6WOmuB<01^5n z2DJ_VJ|fPbVgM2PB?h$)0000-S&C`^A`9pU0TBx(2DJ_VK1_6NZ~zewewGIFP002jaifRBNSyV~@5fmoANNE5*BI|oU01*}@2DJ_VJ|fPbVgL~q zCI+<*00000N41J-03umbN&pcYCca2%06rq?dp`gX9wr904gfwP&Y)rd5gsN6wGIFP z002kFifRBN&Y)rd5ilkOShWrS07u!1Y5*e6pke?KGA0JK4gdg0`HE@)OmuB<01-1L z2DJ_VJ|fPbVgL~{CI+<*0000-8H;KFBI|oU01-VV2DJ_VJ|fPbVgM06CI+<*0000- zIhPEFf*%1{mn?^ZA3=GGY5*eZdp`gXRwf3u4gfwP&Y)rd5mqJ!wGIFP07sdNY5*eZ zdp`gXS0)Cv4gfwP&Y)rd5mzP#wGIFP07to(jE90A1xMM7Y5$4gdfE z0H6Y|O8@~8#h1^Af+2s!BL=k&09z6>09-y8V*nAwBL=k&0Jjt~09*tF9{>@>BL=k& z0EZSc0JZ_co1p*^C?v5E1^@s6006cDc1oxK5hNr$5C#AM0002C0eL4)01+Z2$PWep z00000LI^il01?I`2DJ_VL>MywLh-P&01?L{2DJ_VF&Q%eLPCEdhyW4DBL=k&03I4M z07A2@)Bq95BL=k&01F#4073`n4*(I$BL=k&0Qeg-074XWH~ViGnl&0VJ1U ziGs5M`Qt;{XxyAqKS$0Pk=!09*>n9{>^YAqKS$0K{}N09>Z@ z+W-;qAqKS$0Q`0{0JZ^#!}kCYu_I)-1^@s6004^t8v4xu5u+nQRA^WL5%M7hwGIF@ zcQXJ&5!v7X5%VDiwGIIBcryS(g0@ot5%eJjwGMv(&3iKdLJ6*)01@>e2DJ_V!F@9T zLVZZu01@{g2DJ_VM}9K^LWfA&01@~h2DJ_V7lShZLXk+?01^2i2DJ_V(T6htLYqk1 z01^5j2DJ_VN{cf9LZwLB01^8kIsgCwFOV|;LUA&$01^Bl2DJ_VQIazNLOw~_01^Em zx~P8+0Q{IU075x4uK*GLAsw|20C}4;076$u+5i#%AqKS$0Q#LX077$;1OO2LA_lb% z0BN8z0754=3IGuSA_lb%0PdtS075d91OO2NA_lb%0Dq=4075T65C9PaA_lb%01&7% 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�|^Kc2uzX)Ap|l5 zmZ_H*R*)H01M+@? z104uF1Tq7`qJMM)UOWRKf&>u*qul_I1Tq8OqJQ#Qj#&f|1HRn=SOO�|^Kc2uzX) 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 T-~{^tkKhFS0l(k`{Q)p~q9(H6 delta 118732 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 002yh>%OoQ006r4mwoyOATsj-0074Y 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 z0000}4k5q*5u2Cc4^I_YoCppSHvkC(TTc`K00000Q>U-M01=%C4iq;42?JP96aWAK z002{3>Tv)Oo(K*UHvkC(RZkQE00000Q@}Om01=-E4iq;42?J736aWAK002{~VRrx# zpqEb&PZcep2r>mX00{#~PZR(E0000}Zak_05uykc1vdZ*13pg_0000008?lIvj7pJ zmyr-p6HvkC(F;5f#00000Q?_V001>7L zi3K+R2?Hok6aWAK002|`NrM0prwEn@HvkC(98VMg00000Q_kF301>E{{}4|VEvX2W z2R8r-0}@XZ0000008?hA$N&+l2$lyo00{#PPZR(E0000}6LwDk5v!L$5lSSmIpTg2?PF46aWAK002{VoreGst_YR~HvkC(`A!r7 z00000QyZik01>YUi3K+R2?Ov>6aWAK002`EphEx=u$Qk9PZce(2$lyo00{%*P80wD z0000}l=Kb&5wZxD2R8r-1Kv&)0000008?6>X8;kim+=u#6tb&<8gF2?M}R6aWAK002|f+N1yx zw+PS&HvkC(x=s`T00000Q@pnK01>#CUlLChEx8EL2R8r-1FlXK0000008@)M)Bq8> z2+#*N00{%AP80wD0000}!{&Sd5xbY65>FLbya><-HvkC(oK6$~00000Q}0Pv01>?i z&<8gF2?Lf+6aWAK002|9P1gVsz6j6S}&01>|k&<8gF2?L5w z6aWAK002{4_k;iuz?TmbPZce}2+#*N00{$rP80wD0000}c|JS<5yA-a1UCQ)19wgo z0000008>VwCjb${mr)Z>6)nUF@&q>k2?J?P6aWAK002|Y-MIh}#R&2QHvkC(VonqQ z00000Q_U#@0TITRlM_!Y0mqlX6HgU?$OwrAHvkC(Ku#0@00000Q-5ah01?Ru@&q>k z2?H}u6aWAK002{y9De{2$_N7(HvkC(C{7dr00000Q{^#@01?Xwi3K+R2?H2T6aWAK z002{z4p;yY%n0%XHvkC(3r-XO00000Q=~o)0TImz0~j{|2?GF56aWAK002`Q{af4s z5zYuQ1vdZ*1Nco800000086;Bm^*a(RQHvkC(h)om#00000 zQ}&dE01?>;PX#vs2?Kad6aWAK002`F2XX)r+6ajSHvkC(XiXFV00000Q$dGn01?{= zi3K+R2?JP76aWAK002{#?gjx7+z5#UHvkC(NKF&~00000Q`U@501@2?i3K+R2?IDy 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

lfE9nkVFtAh00{%= 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 diff --git a/gklearn/gedlib/gedlibpy.pyx b/gklearn/gedlib/gedlibpy.pyx index 54f24b0..7fb7e84 100644 --- a/gklearn/gedlib/gedlibpy.pyx +++ b/gklearn/gedlib/gedlibpy.pyx @@ -112,6 +112,7 @@ cdef extern from "src/GedLibBind.hpp" namespace "pyged": ##CYTHON WRAPPER INTERFACES## ############################# +# import cython import numpy as np import networkx as nx from gklearn.ged.env import NodeMap @@ -177,14 +178,16 @@ def get_dummy_node() : return getDummyNode() +# @cython.auto_pickle(True) cdef class GEDEnv: """Cython wrapper class for C++ class PyGEDEnv """ - # cdef PyGEDEnv c_env # Hold a C++ instance which we're wrapping +# cdef PyGEDEnv c_env # Hold a C++ instance which we're wrapping cdef PyGEDEnv* c_env # hold a pointer to the C++ instance which we're wrapping def __cinit__(self): +# self.c_env = PyGEDEnv() self.c_env = new PyGEDEnv() @@ -192,6 +195,11 @@ cdef class GEDEnv: del self.c_env +# def __reduce__(self): +# # return GEDEnv, (self.c_env,) +# return GEDEnv, tuple() + + def is_initialized(self) : """ Checks and returns if the computation environment is initialized or not. diff --git a/gklearn/preimage/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index fa1f4db..8753292 100644 --- a/gklearn/preimage/median_preimage_generator.py +++ b/gklearn/preimage/median_preimage_generator.py @@ -669,6 +669,7 @@ class MedianPreimageGenerator(PreimageGenerator): options = self.__mge_options.copy() if not 'seed' in options: options['seed'] = int(round(time.time() * 1000)) # @todo: may not work correctly for possible parallel usage. + options['parallel'] = self.__parallel # Select the GED algorithm. self.__mge.set_options(mge_options_to_string(options)) @@ -676,8 +677,11 @@ class MedianPreimageGenerator(PreimageGenerator): edge_labels=self._dataset.edge_labels, node_attrs=self._dataset.node_attrs, edge_attrs=self._dataset.edge_attrs) - self.__mge.set_init_method(self.__ged_options['method'], ged_options_to_string(self.__ged_options)) - self.__mge.set_descent_method(self.__ged_options['method'], ged_options_to_string(self.__ged_options)) + ged_options = self.__ged_options.copy() + if self.__parallel: + ged_options['threads'] = 1 + self.__mge.set_init_method(self.__ged_options['method'], ged_options_to_string(ged_options)) + self.__mge.set_descent_method(self.__ged_options['method'], ged_options_to_string(ged_options)) # Run the estimator. self.__mge.run(graph_ids, set_median_id, gen_median_id) From 85ad732a887efb1c41053a5882df66cc28bf48dc Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Fri, 8 May 2020 16:43:28 +0200 Subject: [PATCH 08/17] Allow zero costs and no triangle rule when updating edit costs in MPG. --- gklearn/preimage/median_preimage_generator.py | 261 +++++++++++++++++++++++--- 1 file changed, 236 insertions(+), 25 deletions(-) diff --git a/gklearn/preimage/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index 8753292..20fbec6 100644 --- a/gklearn/preimage/median_preimage_generator.py +++ b/gklearn/preimage/median_preimage_generator.py @@ -39,6 +39,8 @@ class MedianPreimageGenerator(PreimageGenerator): self.__max_itrs_without_update = 3 self.__epsilon_residual = 0.01 self.__epsilon_ec = 0.1 + self.__allow_zeros = False + self.__triangle_rule = True # values to compute. self.__runtime_optimize_ec = None self.__runtime_generate_preimage = None @@ -79,6 +81,8 @@ class MedianPreimageGenerator(PreimageGenerator): self.__epsilon_ec = kwargs.get('epsilon_ec', 0.1) self.__gram_matrix_unnorm = kwargs.get('gram_matrix_unnorm', None) self.__runtime_precompute_gm = kwargs.get('runtime_precompute_gm', None) + self.__allow_zeros = kwargs.get('allow_zeros', False) + self.__triangle_rule = kwargs.get('triangle_rule', True) def run(self): @@ -382,7 +386,8 @@ class MedianPreimageGenerator(PreimageGenerator): def __update_ecc(self, nb_cost_mat, dis_k_vec, rw_constraints='inequality'): # if self.__ds_name == 'Letter-high': - if self.__ged_options['edit_cost'] == 'LETTER': + if self.__ged_options['edit_cost'] == 'LETTER': + raise Exception('Cannot compute for cost "LETTER".') pass # # method 1: set alpha automatically, just tune c_vir and c_eir by # # LMS using cvxpy. @@ -461,32 +466,34 @@ class MedianPreimageGenerator(PreimageGenerator): # edit_costs_new = [x.value[0], x.value[0], x.value[1], x.value[2], x.value[2]] # edit_costs_new = np.array(edit_costs_new) # residual = np.sqrt(prob.value) - if rw_constraints == 'inequality': - # c_vs <= c_vi + c_vr. + if not self.__triangle_rule and self.__allow_zeros: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], - np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] + constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 0.0, 1.0]).T@x >= 0.01] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) edit_costs_new = x.value residual = np.sqrt(prob.value) - elif rw_constraints == '2constraints': - # c_vs <= c_vi + c_vr and c_vi == c_vr, c_ei == c_er. + elif self.__triangle_rule and self.__allow_zeros: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], - np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0, - np.array([1.0, -1.0, 0.0, 0.0, 0.0]).T@x == 0.0, - np.array([0.0, 0.0, 0.0, 1.0, -1.0]).T@x == 0.0] + constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 0.0, 1.0]).T@x >= 0.01, + np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() + self.__execute_cvx(prob) edit_costs_new = x.value residual = np.sqrt(prob.value) - elif rw_constraints == 'no-constraint': - # no constraint. + elif not self.__triangle_rule and not self.__allow_zeros: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) @@ -508,11 +515,36 @@ class MedianPreimageGenerator(PreimageGenerator): # edit_costs_new = [x.value[0], x.value[0], x.value[1], x.value[2], x.value[2]] # edit_costs_new = np.array(edit_costs_new) # residual = np.sqrt(prob.value) + elif self.__triangle_rule and not self.__allow_zeros: + # c_vs <= c_vi + c_vr. + nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = x.value + residual = np.sqrt(prob.value) + elif rw_constraints == '2constraints': # @todo: rearrange it later. + # c_vs <= c_vi + c_vr and c_vi == c_vr, c_ei == c_er. + nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0, + np.array([1.0, -1.0, 0.0, 0.0, 0.0]).T@x == 0.0, + np.array([0.0, 0.0, 0.0, 1.0, -1.0]).T@x == 0.0] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + prob.solve() + edit_costs_new = x.value + residual = np.sqrt(prob.value) + elif self.__ged_options['edit_cost'] == 'NON_SYMBOLIC': is_n_attr = np.count_nonzero(nb_cost_mat[:,2]) is_e_attr = np.count_nonzero(nb_cost_mat[:,5]) - if self.__ds_name == 'SYNTHETICnew': + if self.__ds_name == 'SYNTHETICnew': # @todo: rearrenge this later. # nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] nb_cost_mat_new = nb_cost_mat[:,[2,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) @@ -529,7 +561,149 @@ class MedianPreimageGenerator(PreimageGenerator): np.array([0.0]))) residual = np.sqrt(prob.value) - elif rw_constraints == 'inequality': + elif not self.__triangle_rule and self.__allow_zeros: + if is_n_attr and is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = x.value + residual = np.sqrt(prob.value) + elif is_n_attr and not is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 0.0, 1.0]).T@x >= 0.01] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value, np.array([0.0]))) + residual = np.sqrt(prob.value) + elif not is_n_attr and is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), x.value[2:])) + residual = np.sqrt(prob.value) + else: + nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), + x.value[2:], np.array([0.0]))) + residual = np.sqrt(prob.value) + elif self.__triangle_rule and self.__allow_zeros: + if is_n_attr and is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, + np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, + np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = x.value + residual = np.sqrt(prob.value) + elif is_n_attr and not is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 0.0, 1.0]).T@x >= 0.01, + np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value, np.array([0.0]))) + residual = np.sqrt(prob.value) + elif not is_n_attr and is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), x.value[2:])) + residual = np.sqrt(prob.value) + else: + nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), + x.value[2:], np.array([0.0]))) + residual = np.sqrt(prob.value) + elif not self.__triangle_rule and not self.__allow_zeros: + if is_n_attr and is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = x.value + residual = np.sqrt(prob.value) + elif is_n_attr and not is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value, np.array([0.0]))) + residual = np.sqrt(prob.value) + elif not is_n_attr and is_e_attr: + nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), x.value[2:])) + residual = np.sqrt(prob.value) + else: + nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] + x = cp.Variable(nb_cost_mat_new.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), + x.value[2:], np.array([0.0]))) + residual = np.sqrt(prob.value) + elif self.__triangle_rule and not self.__allow_zeros: # c_vs <= c_vi + c_vr. if is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] @@ -572,17 +746,54 @@ class MedianPreimageGenerator(PreimageGenerator): edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), x.value[2:], np.array([0.0]))) residual = np.sqrt(prob.value) + elif self.__ged_options['edit_cost'] == 'CONSTANT': # @todo: node/edge may not labeled. - x = cp.Variable(nb_cost_mat.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) - constraints = [x >= [0.01 for i in range(nb_cost_mat.shape[1])], - np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, - np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - self.__execute_cvx(prob) - edit_costs_new = x.value - residual = np.sqrt(prob.value) + if not self.__triangle_rule and self.__allow_zeros: + x = cp.Variable(nb_cost_mat.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + constraints = [x >= [0.0 for i in range(nb_cost_mat.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = x.value + residual = np.sqrt(prob.value) + elif self.__triangle_rule and self.__allow_zeros: + x = cp.Variable(nb_cost_mat.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + constraints = [x >= [0.0 for i in range(nb_cost_mat.shape[1])], + np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]).T@x >= 0.01, + np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0]).T@x >= 0.01, + np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, + np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = x.value + residual = np.sqrt(prob.value) + elif not self.__triangle_rule and not self.__allow_zeros: + x = cp.Variable(nb_cost_mat.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat.shape[1])]] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = x.value + residual = np.sqrt(prob.value) + elif self.__triangle_rule and not self.__allow_zeros: + x = cp.Variable(nb_cost_mat.shape[1]) + cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + constraints = [x >= [0.01 for i in range(nb_cost_mat.shape[1])], + np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, + np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] + prob = cp.Problem(cp.Minimize(cost_fun), constraints) + self.__execute_cvx(prob) + edit_costs_new = x.value + residual = np.sqrt(prob.value) else: + raise Exception('The edit cost "', self.__ged_options['edit_cost'], '" is not supported for update progress.') # # method 1: simple least square method. # edit_costs_new, residual, _, _ = np.linalg.lstsq(nb_cost_mat, dis_k_vec, # rcond=None) From 7e94ecaf31f35a07fb006c794c147c2a6f044669 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Wed, 13 May 2020 16:31:37 +0200 Subject: [PATCH 09/17] Add k-nn test. --- gklearn/__init__.py | 2 +- gklearn/ged/util/util.py | 13 +- gklearn/kernels/graph_kernel.py | 3 + gklearn/preimage/__init__.py | 1 + gklearn/preimage/experiments/xp_1nn.py | 103 +++++++ gklearn/preimage/kernel_knn_cv.py | 418 ++++++++++++++++++++++++++ gklearn/preimage/median_preimage_generator.py | 4 +- gklearn/preimage/utils.py | 52 ++-- gklearn/utils/__init__.py | 2 + gklearn/utils/dataset.py | 20 +- gklearn/utils/knn.py | 141 +++++++++ gklearn/utils/utils.py | 30 +- 12 files changed, 756 insertions(+), 33 deletions(-) create mode 100644 gklearn/preimage/experiments/xp_1nn.py create mode 100644 gklearn/preimage/kernel_knn_cv.py create mode 100644 gklearn/utils/knn.py diff --git a/gklearn/__init__.py b/gklearn/__init__.py index c607b26..08ca4ed 100644 --- a/gklearn/__init__.py +++ b/gklearn/__init__.py @@ -18,4 +18,4 @@ __date__ = "November 2017" # import sub modules # from gklearn import c_ext # from gklearn import ged -from gklearn import utils +# from gklearn import utils diff --git a/gklearn/ged/util/util.py b/gklearn/ged/util/util.py index d72c2e6..c41ca86 100644 --- a/gklearn/ged/util/util.py +++ b/gklearn/ged/util/util.py @@ -46,7 +46,7 @@ def compute_ged(g1, g2, options): return dis, pi_forward, pi_backward -def compute_geds(graphs, options={}, parallel=False): +def compute_geds(graphs, options={}, parallel=False, verbose=True): # initialize ged env. ged_env = gedlibpy.GEDEnv() ged_env.set_edit_cost(options['edit_cost'], edit_cost_constant=options['edit_cost_constants']) @@ -81,8 +81,11 @@ def compute_geds(graphs, options={}, parallel=False): G_listID = listID_toshare do_partial = partial(_wrapper_compute_ged_parallel, neo_options) pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(graphs, ged_env, listID)) - iterator = tqdm(pool.imap_unordered(do_partial, itr, chunksize), + if verbose: + iterator = tqdm(pool.imap_unordered(do_partial, itr, chunksize), desc='computing GEDs', file=sys.stdout) + else: + iterator = pool.imap_unordered(do_partial, itr, chunksize) # iterator = pool.imap_unordered(do_partial, itr, chunksize) for i, j, dis, n_eo_tmp in iterator: idx_itr = int(len(graphs) * i + j - (i + 1) * (i + 2) / 2) @@ -98,7 +101,11 @@ def compute_geds(graphs, options={}, parallel=False): else: ged_vec = [] n_edit_operations = [] - for i in tqdm(range(len(graphs)), desc='computing GEDs', file=sys.stdout): + if verbose: + iterator = tqdm(range(len(graphs)), desc='computing GEDs', file=sys.stdout) + else: + iterator = range(len(graphs)) + for i in iterator: # for i in range(len(graphs)): for j in range(i + 1, len(graphs)): dis, pi_forward, pi_backward = _compute_ged(ged_env, listID[i], listID[j], graphs[i], graphs[j]) diff --git a/gklearn/kernels/graph_kernel.py b/gklearn/kernels/graph_kernel.py index 6f667e1..db4abf8 100644 --- a/gklearn/kernels/graph_kernel.py +++ b/gklearn/kernels/graph_kernel.py @@ -67,6 +67,9 @@ class GraphKernel(object): def normalize_gm(self, gram_matrix): + import warnings + warnings.warn('gklearn.kernels.graph_kernel.normalize_gm will be deprecated, use gklearn.utils.normalize_gram_matrix instead', DeprecationWarning) + diag = gram_matrix.diagonal().copy() for i in range(len(gram_matrix)): for j in range(i, len(gram_matrix)): diff --git a/gklearn/preimage/__init__.py b/gklearn/preimage/__init__.py index f04b5cc..21e688e 100644 --- a/gklearn/preimage/__init__.py +++ b/gklearn/preimage/__init__.py @@ -12,3 +12,4 @@ __date__ = "March 2020" from gklearn.preimage.preimage_generator import PreimageGenerator from gklearn.preimage.median_preimage_generator import MedianPreimageGenerator +from gklearn.preimage.kernel_knn_cv import kernel_knn_cv diff --git a/gklearn/preimage/experiments/xp_1nn.py b/gklearn/preimage/experiments/xp_1nn.py new file mode 100644 index 0000000..872be03 --- /dev/null +++ b/gklearn/preimage/experiments/xp_1nn.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon May 11 14:15:11 2020 + +@author: ljia +""" +import functools +import multiprocessing +import os +import sys +import logging +from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct +from gklearn.preimage import kernel_knn_cv + +dir_root = '../results/xp_1nn.init1.no_triangle_rule.allow_zeros/' +num_random = 10 +initial_solutions = 1 +triangle_rule = False +allow_zeros = True +update_order = False +test_sizes = [0.9, 0.7] # , 0.5, 0.3, 0.1] + +def xp_knn_1_1(): + for test_size in test_sizes: + ds_name = 'Letter-high' + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') +# sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: +# for train_examples in ['expert']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples +# try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=None, edge_required=False, cut_range=None) +# except Exception as exp: +# print('An exception occured when running this experiment:') +# LOG_FILENAME = dir_save + 'error.txt' +# logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) +# logging.exception('') +# print(repr(exp)) + + +if __name__ == '__main__': + xp_knn_1_1() \ No newline at end of file diff --git a/gklearn/preimage/kernel_knn_cv.py b/gklearn/preimage/kernel_knn_cv.py new file mode 100644 index 0000000..ce822aa --- /dev/null +++ b/gklearn/preimage/kernel_knn_cv.py @@ -0,0 +1,418 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue May 12 12:52:15 2020 + +@author: ljia +""" +import numpy as np +import csv +import os +import os.path +from gklearn.utils import Dataset +from sklearn.model_selection import ShuffleSplit +from gklearn.preimage import MedianPreimageGenerator +from gklearn.utils import normalize_gram_matrix, compute_distance_matrix +from gklearn.preimage.utils import get_same_item_indices +from gklearn.utils.knn import knn_classification +from gklearn.preimage.utils import compute_k_dis + + +def kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=True, load_gm='auto', dir_save='', irrelevant_labels=None, edge_required=False, cut_range=None): + + # 1. get dataset. + print('1. getting dataset...') + dataset_all = Dataset() + dataset_all.load_predefined_dataset(ds_name) + dataset_all.trim_dataset(edge_required=edge_required) + if irrelevant_labels is not None: + dataset_all.remove_labels(**irrelevant_labels) + if cut_range is not None: + dataset_all.cut_graphs(cut_range) +# datasets = split_dataset_by_target(dataset_all) + + if save_results: + # create result files. + print('creating output files...') + fn_output_detail, fn_output_summary = __init_output_file_knn(ds_name, kernel_options['name'], mpg_options['fit_method'], dir_save) + else: + fn_output_detail, fn_output_summary = None, None + + # 2. compute/load Gram matrix a priori. + print('2. computing/loading Gram matrix...') + gram_matrix_unnorm, time_precompute_gm = __get_gram_matrix(load_gm, dir_save, ds_name, kernel_options, dataset_all) + + # 3. perform k-nn CV. + print('3. performing k-nn CV...') + if train_examples == 'k-graphs' or train_examples == 'expert' or train_examples == 'random': + __kernel_knn_cv_median(dataset_all, ds_name, knn_options, mpg_options, kernel_options, mge_options, ged_options, gram_matrix_unnorm, time_precompute_gm, train_examples, save_results, dir_save, fn_output_detail, fn_output_summary) + + elif train_examples == 'best-dataset': + __kernel_knn_cv_best_ds(dataset_all, ds_name, knn_options, kernel_options, gram_matrix_unnorm, time_precompute_gm, train_examples, save_results, dir_save, fn_output_detail, fn_output_summary) + + elif train_examples == 'trainset': + __kernel_knn_cv_trainset(dataset_all, ds_name, knn_options, kernel_options, gram_matrix_unnorm, time_precompute_gm, train_examples, save_results, dir_save, fn_output_detail, fn_output_summary) + + print('\ncomplete.\n') + + +def __kernel_knn_cv_median(dataset_all, ds_name, knn_options, mpg_options, kernel_options, mge_options, ged_options, gram_matrix_unnorm, time_precompute_gm, train_examples, save_results, dir_save, fn_output_detail, fn_output_summary): + Gn = dataset_all.graphs + y_all = dataset_all.targets + n_neighbors, n_splits, test_size = knn_options['n_neighbors'], knn_options['n_splits'], knn_options['test_size'] + + # get shuffles. + train_indices, test_indices, train_nums, y_app = __get_shuffles(y_all, n_splits, test_size) + + accuracies = [[], [], []] + for trial in range(len(train_indices)): + print('\ntrial =', trial) + + train_index = train_indices[trial] + test_index = test_indices[trial] + G_app = [Gn[i] for i in train_index] + G_test = [Gn[i] for i in test_index] + y_test = [y_all[i] for i in test_index] + gm_unnorm_trial = gram_matrix_unnorm[train_index,:][:,train_index].copy() + + # compute pre-images for each class. + medians = [[], [], []] + train_nums_tmp = [0] + train_nums + print('\ncomputing pre-image for each class...\n') + for i_class in range(len(train_nums_tmp) - 1): + print(i_class + 1, 'of', len(train_nums_tmp) - 1, 'classes:') + i_start = int(np.sum(train_nums_tmp[0:i_class + 1])) + i_end = i_start + train_nums_tmp[i_class + 1] + median_set = G_app[i_start:i_end] + + dataset = dataset_all.copy() + dataset.load_graphs(median_set.copy(), targets=None) + mge_options['update_order'] = True + mpg_options['gram_matrix_unnorm'] = gm_unnorm_trial[i_start:i_end,i_start:i_end].copy() + mpg_options['runtime_precompute_gm'] = 0 + set_median, gen_median_uo = __generate_median_preimages(dataset, mpg_options, kernel_options, ged_options, mge_options) + mge_options['update_order'] = False + mpg_options['gram_matrix_unnorm'] = gm_unnorm_trial[i_start:i_end,i_start:i_end].copy() + mpg_options['runtime_precompute_gm'] = 0 + _, gen_median = __generate_median_preimages(dataset, mpg_options, kernel_options, ged_options, mge_options) + medians[0].append(set_median) + medians[1].append(gen_median) + medians[2].append(gen_median_uo) + + # for each set of medians. + print('\nperforming k-nn...') + for i_app, G_app in enumerate(medians): + # compute dis_mat between medians. + dataset = dataset_all.copy() + dataset.load_graphs(G_app.copy(), targets=None) + gm_app_unnorm, _ = __compute_gram_matrix_unnorm(dataset, kernel_options.copy()) + + # compute the entire Gram matrix. + graph_kernel = __get_graph_kernel(dataset.copy(), kernel_options.copy()) + kernels_to_medians = [] + for g in G_app: + kernels_to_median, _ = graph_kernel.compute(g, G_test, **kernel_options.copy()) + kernels_to_medians.append(kernels_to_median) + kernels_to_medians = np.array(kernels_to_medians) + gm_all = np.concatenate((gm_app_unnorm, kernels_to_medians), axis=1) + gm_all = np.concatenate((gm_all, np.concatenate((kernels_to_medians.T, gram_matrix_unnorm[test_index,:][:,test_index].copy()), axis=1)), axis=0) + + gm_all = normalize_gram_matrix(gm_all.copy()) + dis_mat, _, _, _ = compute_distance_matrix(gm_all) + + N = len(G_app) + + d_app = dis_mat[range(N),:][:,range(N)].copy() + + d_test = np.zeros((N, len(test_index))) + for i in range(N): + for j in range(len(test_index)): + d_test[i, j] = dis_mat[i, j] + + accuracies[i_app].append(knn_classification(d_app, d_test, y_app, y_test, n_neighbors, verbose=True, text=train_examples)) + + # write result detail. + if save_results: + f_detail = open(dir_save + fn_output_detail, 'a') + print('writing results to files...') + for i, median_type in enumerate(['set-median', 'gen median', 'gen median uo']): + csv.writer(f_detail).writerow([ds_name, kernel_options['name'], + train_examples + ': ' + median_type, trial, + knn_options['n_neighbors'], + len(gm_all), knn_options['test_size'], + accuracies[i][-1][0], accuracies[i][-1][1]]) + f_detail.close() + + results = {} + results['ave_perf_train'] = [np.mean([i[0] for i in j], axis=0) for j in accuracies] + results['std_perf_train'] = [np.std([i[0] for i in j], axis=0, ddof=1) for j in accuracies] + results['ave_perf_test'] = [np.mean([i[1] for i in j], axis=0) for j in accuracies] + results['std_perf_test'] = [np.std([i[1] for i in j], axis=0, ddof=1) for j in accuracies] + + # write result summary for each letter. + if save_results: + f_summary = open(dir_save + fn_output_summary, 'a') + for i, median_type in enumerate('set-median', 'gen median', 'gen median uo'): + csv.writer(f_summary).writerow([ds_name, kernel_options['name'], + train_examples + ': ' + median_type, + knn_options['n_neighbors'], + knn_options['test_size'], results['ave_perf_train'][i], + results['ave_perf_test'][i], results['std_perf_train'][i], + results['std_perf_test'][i], time_precompute_gm]) + f_summary.close() + + +def __kernel_knn_cv_best_ds(dataset_all, ds_name, knn_options, kernel_options, gram_matrix_unnorm, time_precompute_gm, train_examples, save_results, dir_save, fn_output_detail, fn_output_summary): + Gn = dataset_all.graphs + y_all = dataset_all.targets + n_neighbors, n_splits, test_size = knn_options['n_neighbors'], knn_options['n_splits'], knn_options['test_size'] + + # get shuffles. + train_indices, test_indices, train_nums, y_app = __get_shuffles(y_all, n_splits, test_size) + + accuracies = [] + for trial in range(len(train_indices)): + print('\ntrial =', trial) + + train_index = train_indices[trial] + test_index = test_indices[trial] + G_app = [Gn[i] for i in train_index] + G_test = [Gn[i] for i in test_index] + y_test = [y_all[i] for i in test_index] + gm_unnorm_trial = gram_matrix_unnorm[train_index,:][:,train_index].copy() + + # get best graph from trainset according to distance in kernel space for each class. + best_graphs = [] + train_nums_tmp = [0] + train_nums + print('\ngetting best graph from trainset for each class...') + for i_class in range(len(train_nums_tmp) - 1): + print(i_class + 1, 'of', len(train_nums_tmp) - 1, 'classes.') + i_start = int(np.sum(train_nums_tmp[0:i_class + 1])) + i_end = i_start + train_nums_tmp[i_class + 1] + G_class = G_app[i_start:i_end] + gm_unnorm_class = gm_unnorm_trial[i_start:i_end,i_start:i_end] + gm_class = normalize_gram_matrix(gm_unnorm_class.copy()) + + k_dis_list = [] + for idx in range(len(G_class)): + k_dis_list.append(compute_k_dis(idx, range(0, len(G_class)), [1 / len(G_class)] * len(G_class), gm_class, withterm3=False)) + idx_k_dis_min = np.argmin(k_dis_list) + best_graphs.append(G_class[idx_k_dis_min].copy()) + + + # perform k-nn. + print('\nperforming k-nn...') + # compute dis_mat between medians. + dataset = dataset_all.copy() + dataset.load_graphs(best_graphs.copy(), targets=None) + gm_app_unnorm, _ = __compute_gram_matrix_unnorm(dataset, kernel_options.copy()) + + # compute the entire Gram matrix. + graph_kernel = __get_graph_kernel(dataset.copy(), kernel_options.copy()) + kernels_to_best_graphs = [] + for g in best_graphs: + kernels_to_best_graph, _ = graph_kernel.compute(g, G_test, **kernel_options.copy()) + kernels_to_best_graphs.append(kernels_to_best_graph) + kernels_to_best_graphs = np.array(kernels_to_best_graphs) + gm_all = np.concatenate((gm_app_unnorm, kernels_to_best_graphs), axis=1) + gm_all = np.concatenate((gm_all, np.concatenate((kernels_to_best_graphs.T, gram_matrix_unnorm[test_index,:][:,test_index].copy()), axis=1)), axis=0) + + gm_all = normalize_gram_matrix(gm_all.copy()) + dis_mat, _, _, _ = compute_distance_matrix(gm_all) + + N = len(best_graphs) + + d_app = dis_mat[range(N),:][:,range(N)].copy() + + d_test = np.zeros((N, len(test_index))) + for i in range(N): + for j in range(len(test_index)): + d_test[i, j] = dis_mat[i, j] + + accuracies.append(knn_classification(d_app, d_test, y_app, y_test, n_neighbors, verbose=True, text=train_examples)) + + # write result detail. + if save_results: + f_detail = open(dir_save + fn_output_detail, 'a') + print('writing results to files...') + csv.writer(f_detail).writerow([ds_name, kernel_options['name'], + train_examples, trial, + knn_options['n_neighbors'], + len(gm_all), knn_options['test_size'], + accuracies[-1][0], accuracies[-1][1]]) + f_detail.close() + + results = {} + results['ave_perf_train'] = np.mean([i[0] for i in accuracies], axis=0) + results['std_perf_train'] = np.std([i[0] for i in accuracies], axis=0, ddof=1) + results['ave_perf_test'] = np.mean([i[1] for i in accuracies], axis=0) + results['std_perf_test'] = np.std([i[1] for i in accuracies], axis=0, ddof=1) + + # write result summary for each letter. + if save_results: + f_summary = open(dir_save + fn_output_summary, 'a') + csv.writer(f_summary).writerow([ds_name, kernel_options['name'], + train_examples, + knn_options['n_neighbors'], + knn_options['test_size'], results['ave_perf_train'], + results['ave_perf_test'], results['std_perf_train'], + results['std_perf_test'], time_precompute_gm]) + f_summary.close() + + +def __kernel_knn_cv_trainset(dataset_all, ds_name, knn_options, kernel_options, gram_matrix_unnorm, time_precompute_gm, train_examples, save_results, dir_save, fn_output_detail, fn_output_summary): + y_all = dataset_all.targets + n_neighbors, n_splits, test_size = knn_options['n_neighbors'], knn_options['n_splits'], knn_options['test_size'] + + # compute distance matrix. + gram_matrix = normalize_gram_matrix(gram_matrix_unnorm.copy()) + dis_mat, _, _, _ = compute_distance_matrix(gram_matrix) + + # get shuffles. + train_indices, test_indices, _, _ = __get_shuffles(y_all, n_splits, test_size) + + accuracies = [] + for trial in range(len(train_indices)): + print('\ntrial =', trial) + + train_index = train_indices[trial] + test_index = test_indices[trial] + y_app = [y_all[i] for i in train_index] + y_test = [y_all[i] for i in test_index] + + N = len(train_index) + + d_app = dis_mat[train_index,:][:,train_index].copy() + + d_test = np.zeros((N, len(test_index))) + for i in range(N): + for j in range(len(test_index)): + d_test[i, j] = dis_mat[train_index[i], test_index[j]] + + accuracies.append(knn_classification(d_app, d_test, y_app, y_test, n_neighbors, verbose=True, text=train_examples)) + + # write result detail. + if save_results: + print('writing results to files...') + f_detail = open(dir_save + fn_output_detail, 'a') + csv.writer(f_detail).writerow([ds_name, kernel_options['name'], + train_examples, trial, knn_options['n_neighbors'], + len(gram_matrix), knn_options['test_size'], + accuracies[-1][0], accuracies[-1][1]]) + f_detail.close() + + results = {} + results['ave_perf_train'] = np.mean([i[0] for i in accuracies], axis=0) + results['std_perf_train'] = np.std([i[0] for i in accuracies], axis=0, ddof=1) + results['ave_perf_test'] = np.mean([i[1] for i in accuracies], axis=0) + results['std_perf_test'] = np.std([i[1] for i in accuracies], axis=0, ddof=1) + + # write result summary for each letter. + if save_results: + f_summary = open(dir_save + fn_output_summary, 'a') + csv.writer(f_summary).writerow([ds_name, kernel_options['name'], + train_examples, knn_options['n_neighbors'], + knn_options['test_size'], results['ave_perf_train'], + results['ave_perf_test'], results['std_perf_train'], + results['std_perf_test'], time_precompute_gm]) + f_summary.close() + + +def __get_shuffles(y_all, n_splits, test_size): + rs = ShuffleSplit(n_splits=n_splits, test_size=test_size, random_state=0) + train_indices = [[] for _ in range(n_splits)] + test_indices = [[] for _ in range(n_splits)] + idx_targets = get_same_item_indices(y_all) + train_nums = [] + keys = [] + for key, item in idx_targets.items(): + i = 0 + for train_i, test_i in rs.split(item): # @todo: careful when parallel. + train_indices[i] += [item[idx] for idx in train_i] + test_indices[i] += [item[idx] for idx in test_i] + i += 1 + train_nums.append(len(train_i)) + keys.append(key) + return train_indices, test_indices, train_nums, keys + + +def __generate_median_preimages(dataset, mpg_options, kernel_options, ged_options, mge_options): + mpg = MedianPreimageGenerator() + mpg.dataset = dataset.copy() + mpg.set_options(**mpg_options.copy()) + mpg.kernel_options = kernel_options.copy() + mpg.ged_options = ged_options.copy() + mpg.mge_options = mge_options.copy() + mpg.run() + return mpg.set_median, mpg.gen_median + + +def __get_gram_matrix(load_gm, dir_save, ds_name, kernel_options, dataset_all): + if load_gm == 'auto': + gm_fname = dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm.npz' + gmfile_exist = os.path.isfile(os.path.abspath(gm_fname)) + if gmfile_exist: + gmfile = np.load(gm_fname, allow_pickle=True) # @todo: may not be safe. + gram_matrix_unnorm = gmfile['gram_matrix_unnorm'] + time_precompute_gm = float(gmfile['run_time']) + else: + gram_matrix_unnorm, time_precompute_gm = __compute_gram_matrix_unnorm(dataset_all, kernel_options) + np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm=gram_matrix_unnorm, run_time=time_precompute_gm) + elif not load_gm: + gram_matrix_unnorm, time_precompute_gm = __compute_gram_matrix_unnorm(dataset_all, kernel_options) + np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm=gram_matrix_unnorm, run_time=time_precompute_gm) + else: + gmfile = np.load() + gram_matrix_unnorm = gmfile['gram_matrix_unnorm'] + time_precompute_gm = float(gmfile['run_time']) + + return gram_matrix_unnorm, time_precompute_gm + + +def __get_graph_kernel(dataset, kernel_options): + from gklearn.utils.utils import get_graph_kernel_by_name + graph_kernel = get_graph_kernel_by_name(kernel_options['name'], + node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, + edge_attrs=dataset.edge_attrs, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + kernel_options=kernel_options) + return graph_kernel + + +def __compute_gram_matrix_unnorm(dataset, kernel_options): + from gklearn.utils.utils import get_graph_kernel_by_name + graph_kernel = get_graph_kernel_by_name(kernel_options['name'], + node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, + edge_attrs=dataset.edge_attrs, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + kernel_options=kernel_options) + + gram_matrix, run_time = graph_kernel.compute(dataset.graphs, **kernel_options) + gram_matrix_unnorm = graph_kernel.gram_matrix_unnorm + + return gram_matrix_unnorm, run_time + + +def __init_output_file_knn(ds_name, gkernel, fit_method, dir_output): + if not os.path.exists(dir_output): + os.makedirs(dir_output) + fn_output_detail = 'results_detail_knn.' + ds_name + '.' + gkernel + '.csv' + f_detail = open(dir_output + fn_output_detail, 'a') + csv.writer(f_detail).writerow(['dataset', 'graph kernel', + 'train examples', 'trial', 'num neighbors', 'num graphs', 'test size', + 'perf train', 'perf test']) + f_detail.close() + + fn_output_summary = 'results_summary_knn.' + ds_name + '.' + gkernel + '.csv' + f_summary = open(dir_output + fn_output_summary, 'a') + csv.writer(f_summary).writerow(['dataset', 'graph kernel', + 'train examples', 'num neighbors', 'test size', + 'ave perf train', 'ave perf test', + 'std perf train', 'std perf test', 'time precompute gm']) + f_summary.close() + + return fn_output_detail, fn_output_summary \ No newline at end of file diff --git a/gklearn/preimage/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index 20fbec6..6c66de0 100644 --- a/gklearn/preimage/median_preimage_generator.py +++ b/gklearn/preimage/median_preimage_generator.py @@ -281,7 +281,7 @@ class MedianPreimageGenerator(PreimageGenerator): options['edge_labels'] = self._dataset.edge_labels options['node_attrs'] = self._dataset.node_attrs options['edge_attrs'] = self._dataset.edge_attrs - ged_vec_init, ged_mat, n_edit_operations = compute_geds(graphs, options=options, parallel=self.__parallel) + ged_vec_init, ged_mat, n_edit_operations = compute_geds(graphs, options=options, parallel=self.__parallel, verbose=(self._verbose > 1)) residual_list = [np.sqrt(np.sum(np.square(np.array(ged_vec_init) - dis_k_vec)))] time_list = [time.time() - time0] edit_cost_list = [self.__init_ecc] @@ -323,7 +323,7 @@ class MedianPreimageGenerator(PreimageGenerator): options['edge_labels'] = self._dataset.edge_labels options['node_attrs'] = self._dataset.node_attrs options['edge_attrs'] = self._dataset.edge_attrs - ged_vec, ged_mat, n_edit_operations = compute_geds(graphs, options=options, parallel=self.__parallel) + ged_vec, ged_mat, n_edit_operations = compute_geds(graphs, options=options, parallel=self.__parallel, verbose=(self._verbose > 1)) residual_list.append(np.sqrt(np.sum(np.square(np.array(ged_vec) - dis_k_vec)))) time_list.append(time.time() - time0) edit_cost_list.append(self.__edit_cost_constants) diff --git a/gklearn/preimage/utils.py b/gklearn/preimage/utils.py index f99ab8a..55e1e9e 100644 --- a/gklearn/preimage/utils.py +++ b/gklearn/preimage/utils.py @@ -45,7 +45,7 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged if save_results: # create result files. print('creating output files...') - fn_output_detail, fn_output_summary = __init_output_file(ds_name, kernel_options['name'], mpg_options['fit_method'], dir_save) + fn_output_detail, fn_output_summary = __init_output_file_preimage(ds_name, kernel_options['name'], mpg_options['fit_method'], dir_save) sod_sm_list = [] sod_gm_list = [] @@ -82,22 +82,22 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged gram_matrix_unnorm_list = [] time_precompute_gm_list = [] else: - gmfile = np.load() - gram_matrix_unnorm_list = gmfile['gram_matrix_unnorm_list'] - time_precompute_gm_list = gmfile['run_time_list'] -# repeats_better_sod_sm2gm = [] -# repeats_better_dis_k_sm2gm = [] -# repeats_better_dis_k_gi2sm = [] -# repeats_better_dis_k_gi2gm = [] + gmfile = np.load(gm_fname, allow_pickle=True) # @todo: may not be safe. + gram_matrix_unnorm_list = [item for item in gmfile['gram_matrix_unnorm_list']] + time_precompute_gm_list = gmfile['run_time_list'].tolist() +# repeats_better_sod_sm2gm = [] +# repeats_better_dis_k_sm2gm = [] +# repeats_better_dis_k_gi2sm = [] +# repeats_better_dis_k_gi2gm = [] - print('start generating preimage for each class of target...') + print('starting generating preimage for each class of target...') idx_offset = 0 for idx, dataset in enumerate(datasets): target = dataset.targets[0] print('\ntarget =', target, '\n') -# if target != 1: -# continue +# if target != 1: +# continue num_graphs = len(dataset.graphs) if num_graphs < 2: @@ -148,7 +148,7 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged results['sod_set_median'], results['sod_gen_median'], results['k_dis_set_median'], results['k_dis_gen_median'], results['k_dis_dataset'], sod_sm2gm, dis_k_sm2gm, - dis_k_gi2sm, dis_k_gi2gm, results['edit_cost_constants'], + dis_k_gi2sm, dis_k_gi2gm, results['edit_cost_constants'], results['runtime_precompute_gm'], results['runtime_optimize_ec'], results['runtime_generate_preimage'], results['runtime_total'], results['itrs'], results['converged'], @@ -177,7 +177,7 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged # # SOD SM -> GM if results['sod_set_median'] > results['sod_gen_median']: nb_sod_sm2gm[0] += 1 - # repeats_better_sod_sm2gm.append(1) + # repeats_better_sod_sm2gm.append(1) elif results['sod_set_median'] == results['sod_gen_median']: nb_sod_sm2gm[1] += 1 elif results['sod_set_median'] < results['sod_gen_median']: @@ -185,7 +185,7 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged # # dis_k SM -> GM if results['k_dis_set_median'] > results['k_dis_gen_median']: nb_dis_k_sm2gm[0] += 1 - # repeats_better_dis_k_sm2gm.append(1) + # repeats_better_dis_k_sm2gm.append(1) elif results['k_dis_set_median'] == results['k_dis_gen_median']: nb_dis_k_sm2gm[1] += 1 elif results['k_dis_set_median'] < results['k_dis_gen_median']: @@ -193,7 +193,7 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged # # dis_k gi -> SM if results['k_dis_dataset'] > results['k_dis_set_median']: nb_dis_k_gi2sm[0] += 1 - # repeats_better_dis_k_gi2sm.append(1) + # repeats_better_dis_k_gi2sm.append(1) elif results['k_dis_dataset'] == results['k_dis_set_median']: nb_dis_k_gi2sm[1] += 1 elif results['k_dis_dataset'] < results['k_dis_set_median']: @@ -201,7 +201,7 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged # # dis_k gi -> GM if results['k_dis_dataset'] > results['k_dis_gen_median']: nb_dis_k_gi2gm[0] += 1 - # repeats_better_dis_k_gi2gm.append(1) + # repeats_better_dis_k_gi2gm.append(1) elif results['k_dis_dataset'] == results['k_dis_gen_median']: nb_dis_k_gi2gm[1] += 1 elif results['k_dis_dataset'] < results['k_dis_gen_median']: @@ -225,7 +225,7 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged results['mge']['num_increase_order'] > 0, results['mge']['num_converged_descents'] > 0, nb_sod_sm2gm, - nb_dis_k_sm2gm, nb_dis_k_gi2sm, nb_dis_k_gi2gm]) + nb_dis_k_sm2gm, nb_dis_k_gi2sm, nb_dis_k_gi2gm]) f_summary.close() # save median graphs. @@ -235,15 +235,15 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged print('Saving median graphs to files...') fn_pre_sm = dir_save + 'medians/set_median.' + mpg_options['fit_method'] + '.nbg' + str(num_graphs) + '.y' + str(target) + '.repeat' + str(1) saveGXL(mpg.set_median, fn_pre_sm + '.gxl', method='default', - node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, + node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, node_attrs=dataset.node_attrs, edge_attrs=dataset.edge_attrs) fn_pre_gm = dir_save + 'medians/gen_median.' + mpg_options['fit_method'] + '.nbg' + str(num_graphs) + '.y' + str(target) + '.repeat' + str(1) saveGXL(mpg.gen_median, fn_pre_gm + '.gxl', method='default', - node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, + node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, node_attrs=dataset.node_attrs, edge_attrs=dataset.edge_attrs) fn_best_dataset = dir_save + 'medians/g_best_dataset.' + mpg_options['fit_method'] + '.nbg' + str(num_graphs) + '.y' + str(target) + '.repeat' + str(1) saveGXL(mpg.best_from_dataset, fn_best_dataset + '.gxl', method='default', - node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, + node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, node_attrs=dataset.node_attrs, edge_attrs=dataset.edge_attrs) # plot median graphs. @@ -304,10 +304,10 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged if (load_gm == 'auto' and not gmfile_exist) or not load_gm: np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm_list=gram_matrix_unnorm_list, run_time_list=time_precompute_gm_list) - print('\ncomplete.') + print('\ncomplete.\n') -def __init_output_file(ds_name, gkernel, fit_method, dir_output): +def __init_output_file_preimage(ds_name, gkernel, fit_method, dir_output): if not os.path.exists(dir_output): os.makedirs(dir_output) # fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' @@ -335,9 +335,9 @@ def __init_output_file(ds_name, gkernel, fit_method, dir_output): 'num updates ecc', 'mge num decrease order', 'mge num increase order', 'mge num converged', '# SOD SM -> GM', '# dis_k SM -> GM', '# dis_k gi -> SM', '# dis_k gi -> GM']) -# 'repeats better SOD SM -> GM', -# 'repeats better dis_k SM -> GM', 'repeats better dis_k gi -> SM', -# 'repeats better dis_k gi -> GM']) +# 'repeats better SOD SM -> GM', +# 'repeats better dis_k SM -> GM', 'repeats better dis_k gi -> SM', +# 'repeats better dis_k gi -> GM']) f_summary.close() return fn_output_detail, fn_output_summary @@ -462,6 +462,8 @@ def gram2distances(Kmatrix): def kernel_distance_matrix(Gn, node_label, edge_label, Kmatrix=None, gkernel=None, verbose=True): + import warnings + warnings.warn('gklearn.preimage.utils.kernel_distance_matrix is deprecated, use gklearn.kernels.graph_kernel.compute_distance_matrix or gklearn.utils.compute_distance_matrix instead', DeprecationWarning) dis_mat = np.empty((len(Gn), len(Gn))) if Kmatrix is None: Kmatrix = compute_kernel(Gn, gkernel, node_label, edge_label, verbose) diff --git a/gklearn/utils/__init__.py b/gklearn/utils/__init__.py index 198bf75..af9c751 100644 --- a/gklearn/utils/__init__.py +++ b/gklearn/utils/__init__.py @@ -21,4 +21,6 @@ from gklearn.utils.timer import Timer from gklearn.utils.utils import get_graph_kernel_by_name from gklearn.utils.utils import compute_gram_matrices_by_class from gklearn.utils.utils import SpecialLabel +from gklearn.utils.utils import normalize_gram_matrix, compute_distance_matrix from gklearn.utils.trie import Trie +from gklearn.utils.knn import knn_cv, knn_classification diff --git a/gklearn/utils/dataset.py b/gklearn/utils/dataset.py index c499ce2..78d8841 100644 --- a/gklearn/utils/dataset.py +++ b/gklearn/utils/dataset.py @@ -522,6 +522,20 @@ class Dataset(object): self.__targets = [self.__targets[i] for i in idx] self.clean_labels() + + def copy(self): + dataset = Dataset() + graphs = self.__graphs.copy() if self.__graphs is not None else None + target = self.__targets.copy() if self.__targets is not None else None + node_labels = self.__node_labels.copy() if self.__node_labels is not None else None + node_attrs = self.__node_attrs.copy() if self.__node_attrs is not None else None + edge_labels = self.__edge_labels.copy() if self.__edge_labels is not None else None + edge_attrs = self.__edge_attrs.copy() if self.__edge_attrs is not None else None + dataset.load_graphs(graphs, target) + dataset.set_labels(node_labels=node_labels, node_attrs=node_attrs, edge_labels=edge_labels, edge_attrs=edge_attrs) + # @todo: clean_labels and add other class members? + return dataset + def __get_dataset_size(self): return len(self.__graphs) @@ -721,7 +735,11 @@ def split_dataset_by_target(dataset): sub_graphs = [graphs[i] for i in val] sub_dataset = Dataset() sub_dataset.load_graphs(sub_graphs, [key] * len(val)) - sub_dataset.set_labels(node_labels=dataset.node_labels, node_attrs=dataset.node_attrs, edge_labels=dataset.edge_labels, edge_attrs=dataset.edge_attrs) + node_labels = dataset.node_labels.copy() if dataset.node_labels is not None else None + node_attrs = dataset.node_attrs.copy() if dataset.node_attrs is not None else None + edge_labels = dataset.edge_labels.copy() if dataset.edge_labels is not None else None + edge_attrs = dataset.edge_attrs.copy() if dataset.edge_attrs is not None else None + sub_dataset.set_labels(node_labels=node_labels, node_attrs=node_attrs, edge_labels=edge_labels, edge_attrs=edge_attrs) datasets.append(sub_dataset) # @todo: clean_labels? return datasets \ No newline at end of file diff --git a/gklearn/utils/knn.py b/gklearn/utils/knn.py new file mode 100644 index 0000000..81419be --- /dev/null +++ b/gklearn/utils/knn.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon May 11 11:03:01 2020 + +@author: ljia +""" +import numpy as np +from sklearn.model_selection import ShuffleSplit +from sklearn.neighbors import KNeighborsClassifier +from sklearn.metrics import accuracy_score +from gklearn.utils.utils import get_graph_kernel_by_name +# from gklearn.preimage.utils import get_same_item_indices + +def sum_squares(a, b): + """ + Return the sum of squares of the difference between a and b, aka MSE + """ + return np.sum([(a[i] - b[i])**2 for i in range(len(a))]) + + +def euclid_d(x, y): + """ + 1D euclidean distance + """ + return np.sqrt((x-y)**2) + + +def man_d(x, y): + """ + 1D manhattan distance + """ + return np.abs((x-y)) + + +def knn_regression(D_app, D_test, y_app, y_test, n_neighbors, verbose=True, text=None): + + from sklearn.neighbors import KNeighborsRegressor + knn = KNeighborsRegressor(n_neighbors=n_neighbors, metric='precomputed') + knn.fit(D_app, y_app) + y_pred = knn.predict(D_app) + y_pred_test = knn.predict(D_test.T) + perf_app = np.sqrt(sum_squares(y_pred, y_app)/len(y_app)) + perf_test = np.sqrt(sum_squares(y_pred_test, y_test)/len(y_test)) + + if (verbose): + print("Learning error with {} train examples : {}".format(text, perf_app)) + print("Test error with {} train examples : {}".format(text, perf_test)) + + return perf_app, perf_test + + +def knn_classification(d_app, d_test, y_app, y_test, n_neighbors, verbose=True, text=None): + knn = KNeighborsClassifier(n_neighbors=n_neighbors, metric='precomputed') + knn.fit(d_app, y_app) + y_pred = knn.predict(d_app) + y_pred_test = knn.predict(d_test.T) + perf_app = accuracy_score(y_app, y_pred) + perf_test = accuracy_score(y_test, y_pred_test) + + if (verbose): + print("Learning accuracy with {} costs : {}".format(text, perf_app)) + print("Test accuracy with {} costs : {}".format(text, perf_test)) + + return perf_app, perf_test + + +def knn_cv(dataset, kernel_options, trainset=None, n_neighbors=1, n_splits=50, test_size=0.9, verbose=True): + ''' + Perform a knn classification cross-validation on given dataset. + ''' +# Gn = dataset.graphs + y_all = dataset.targets + + # compute kernel distances. + dis_mat = __compute_kernel_distances(dataset, kernel_options, trainset=trainset) + + + rs = ShuffleSplit(n_splits=n_splits, test_size=test_size, random_state=0) +# train_indices = [[] for _ in range(n_splits)] +# test_indices = [[] for _ in range(n_splits)] +# idx_targets = get_same_item_indices(y_all) +# for key, item in idx_targets.items(): +# i = 0 +# for train_i, test_i in rs.split(item): # @todo: careful when parallel. +# train_indices[i] += [item[idx] for idx in train_i] +# test_indices[i] += [item[idx] for idx in test_i] +# i += 1 + + accuracies = [] +# for trial in range(len(train_indices)): +# train_index = train_indices[trial] +# test_index = test_indices[trial] + for train_index, test_index in rs.split(y_all): +# print(train_index, test_index) +# G_app = [Gn[i] for i in train_index] +# G_test = [Gn[i] for i in test_index] + y_app = [y_all[i] for i in train_index] + y_test = [y_all[i] for i in test_index] + + N = len(train_index) + + d_app = dis_mat.copy() + d_app = d_app[train_index,:] + d_app = d_app[:,train_index] + + d_test = np.zeros((N, len(test_index))) + + for i in range(N): + for j in range(len(test_index)): + d_test[i, j] = dis_mat[train_index[i], test_index[j]] + + accuracies.append(knn_classification(d_app, d_test, y_app, y_test, n_neighbors, verbose=verbose, text='')) + + results = {} + results['ave_perf_train'] = np.mean([i[0] for i in accuracies], axis=0) + results['std_perf_train'] = np.std([i[0] for i in accuracies], axis=0, ddof=1) + results['ave_perf_test'] = np.mean([i[1] for i in accuracies], axis=0) + results['std_perf_test'] = np.std([i[1] for i in accuracies], axis=0, ddof=1) + + return results + + +def __compute_kernel_distances(dataset, kernel_options, trainset=None): + graph_kernel = get_graph_kernel_by_name(kernel_options['name'], + node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, + edge_attrs=dataset.edge_attrs, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + kernel_options=kernel_options) + + gram_matrix, run_time = graph_kernel.compute(dataset.graphs, **kernel_options) + + dis_mat, _, _, _ = graph_kernel.compute_distance_matrix() + + if trainset is not None: + gram_matrix_unnorm = graph_kernel.gram_matrix_unnorm + + + return dis_mat \ No newline at end of file diff --git a/gklearn/utils/utils.py b/gklearn/utils/utils.py index 14dc7c1..868f0f6 100644 --- a/gklearn/utils/utils.py +++ b/gklearn/utils/utils.py @@ -467,9 +467,37 @@ def get_mlti_dim_edge_attrs(G, attr_names): attributes.append(tuple(attrs[aname] for aname in attr_names)) return attributes + @unique class SpecialLabel(Enum): """can be used to define special labels. """ DUMMY = 1 # The dummy label. - # DUMMY = auto # enum.auto does not exist in Python 3.5. \ No newline at end of file + # DUMMY = auto # enum.auto does not exist in Python 3.5. + + +def normalize_gram_matrix(gram_matrix): + diag = gram_matrix.diagonal().copy() + for i in range(len(gram_matrix)): + for j in range(i, len(gram_matrix)): + gram_matrix[i][j] /= np.sqrt(diag[i] * diag[j]) + gram_matrix[j][i] = gram_matrix[i][j] + return gram_matrix + + +def compute_distance_matrix(gram_matrix): + dis_mat = np.empty((len(gram_matrix), len(gram_matrix))) + for i in range(len(gram_matrix)): + for j in range(i, len(gram_matrix)): + dis = gram_matrix[i, i] + gram_matrix[j, j] - 2 * gram_matrix[i, j] + if dis < 0: + if dis > -1e-10: + dis = 0 + else: + raise ValueError('The distance is negative.') + dis_mat[i, j] = np.sqrt(dis) + dis_mat[j, i] = dis_mat[i, j] + dis_max = np.max(np.max(dis_mat)) + dis_min = np.min(np.min(dis_mat[dis_mat != 0])) + dis_mean = np.mean(np.mean(dis_mat)) + return dis_mat, dis_max, dis_min, dis_mean \ No newline at end of file From 7293234d6c48d24ab0be0ce8d31a496867ab2edb Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Thu, 14 May 2020 18:39:49 +0200 Subject: [PATCH 10/17] Update and fix bugs in MGE: 1. avoid decreasing all median nodes. 2. in __compute_initial_node_labels(), stop appending elements to median_labels when all node_labels are already selected. 3. return False directly in __update_node_label() when node_labels is empty. 4. solve the bug that median is not modified in place in __delete_node_from_median(). --- gklearn/ged/median/median_graph_estimator.py | 104 +++++++++++--------------- gklearn/preimage/experiments/xp_1nn.py | 10 ++- gklearn/preimage/kernel_knn_cv.py | 7 +- gklearn/preimage/median_preimage_generator.py | 4 +- gklearn/utils/dataset.py | 2 +- 5 files changed, 59 insertions(+), 68 deletions(-) diff --git a/gklearn/ged/median/median_graph_estimator.py b/gklearn/ged/median/median_graph_estimator.py index 9e0db71..c4291ce 100644 --- a/gklearn/ged/median/median_graph_estimator.py +++ b/gklearn/ged/median/median_graph_estimator.py @@ -370,7 +370,9 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no self.__ged_env.init(self.__ged_env.get_init_type()) # Compute node maps and sum of distances for initial median. +# xxx = self.__node_maps_from_median self.__compute_init_node_maps(graph_ids, gen_median_id) +# yyy = self.__node_maps_from_median self.__best_init_sum_of_distances = min(self.__best_init_sum_of_distances, self.__sum_of_distances) self.__ged_env.load_nx_graph(median, set_median_id) @@ -557,7 +559,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def __median_available(self): - return self.__gen_median_id != np.inf + return self.__median_id != np.inf def get_state(self): @@ -827,6 +829,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def __update_node_labels(self, graphs, median): +# print('----------------------------') # Print information about current iteration. if self.__print_to_stdout == 2: @@ -834,14 +837,15 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no # Iterate through all nodes of the median. for i in range(0, nx.number_of_nodes(median)): -# print('i: ', i) +# print('i: ', i) # Collect the labels of the substituted nodes. node_labels = [] for graph_id, graph in graphs.items(): -# print('graph_id: ', graph_id) -# print(self.__node_maps_from_median[graph_id]) +# print('graph_id: ', graph_id) +# print(self.__node_maps_from_median[graph_id]) +# print(self.__node_maps_from_median[graph_id].get_forward_map(), self.__node_maps_from_median[graph_id].get_backward_map()) k = self.__node_maps_from_median[graph_id].image(i) -# print('k: ', k) +# print('k: ', k) if k != np.inf: node_labels.append(graph.nodes[k]) @@ -961,6 +965,11 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no if self.__print_to_stdout == 2: print('Trying to decrease order: ... ', end='') + if nx.number_of_nodes(median) <= 1: + if self.__print_to_stdout == 2: + print('median graph has only 1 node, skip decrease.') + return False + # Initialize ID of the node that is to be deleted. id_deleted_node = [None] # @todo: or np.inf decreased_order = False @@ -968,7 +977,11 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no # Decrease the order as long as the best deletion delta is negative. while self.__compute_best_deletion_delta(graphs, median, id_deleted_node) < -self.__epsilon: decreased_order = True - median = self.__delete_node_from_median(id_deleted_node[0], median) + self.__delete_node_from_median(id_deleted_node[0], median) + if nx.number_of_nodes(median) <= 1: + if self.__print_to_stdout == 2: + print('decrease stopped because median graph remains only 1 node. ', end='') + break # Print information about current iteration. if self.__print_to_stdout == 2: @@ -1011,16 +1024,22 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def __delete_node_from_median(self, id_deleted_node, median): # Update the median. + mapping = {} + for i in range(0, nx.number_of_nodes(median)): + if i != id_deleted_node: + new_i = (i if i < id_deleted_node else (i - 1)) + mapping[i] = new_i median.remove_node(id_deleted_node) - median = nx.convert_node_labels_to_integers(median, first_label=0, ordering='default', label_attribute=None) # @todo: This doesn't guarantee that the order is the same as in G. + nx.relabel_nodes(median, mapping, copy=False) # Update the node maps. +# xxx = self.__node_maps_from_median for key, node_map in self.__node_maps_from_median.items(): new_node_map = NodeMap(nx.number_of_nodes(median), node_map.num_target_nodes()) is_unassigned_target_node = [True] * node_map.num_target_nodes() for i in range(0, nx.number_of_nodes(median) + 1): if i != id_deleted_node: - new_i = (i if i < id_deleted_node else i - 1) + new_i = (i if i < id_deleted_node else (i - 1)) k = node_map.image(i) new_node_map.add_assignment(new_i, k) if k != np.inf: @@ -1028,13 +1047,12 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no for k in range(0, node_map.num_target_nodes()): if is_unassigned_target_node[k]: new_node_map.add_assignment(np.inf, k) +# print(self.__node_maps_from_median[key].get_forward_map(), self.__node_maps_from_median[key].get_backward_map()) # print(new_node_map.get_forward_map(), new_node_map.get_backward_map()) self.__node_maps_from_median[key] = new_node_map # Increase overall number of decreases. self.__num_decrease_order += 1 - - return median def __increase_order(self, graphs, median): @@ -1230,15 +1248,22 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no continue for label in median_labels: weights[label_id] = min(weights[label_id], self.__ged_env.get_node_rel_cost(dict(label), dict(node_labels[label_id]))) - sum_weight = np.sum(weights) - if sum_weight == 0: - p = np.array([1 / len(weights)] * len(weights)) - else: - p = np.array(weights) / np.sum(weights) - selected_label_id = urng.choice(range(0, len(weights)), size=1, p=p)[0] # for c++ test: xxx[iii] + + # get non-zero weights. + weights_p, idx_p = [], [] + for i, w in enumerate(weights): + if w != 0: + weights_p.append(w) + idx_p.append(i) + if len(weights_p) > 0: + p = np.array(weights_p) / np.sum(weights_p) + selected_label_id = urng.choice(range(0, len(weights_p)), size=1, p=p)[0] # for c++ test: xxx[iii] + selected_label_id = idx_p[selected_label_id] # iii += 1 for c++ test - median_labels.append(node_labels[selected_label_id]) - already_selected[selected_label_id] = True + median_labels.append(node_labels[selected_label_id]) + already_selected[selected_label_id] = True + else: # skip the loop when all node_labels are selected. This happens when len(node_labels) <= self.__num_inits_increase_order. + break else: # Compute the initial node medians as the medians of randomly generated clusters of (roughly) equal size. # @todo: go through and test. @@ -1315,6 +1340,8 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def __update_node_label(self, node_labels, node_label): + if len(node_labels) == 0: # @todo: check if this is the correct solution. Especially after calling __update_config(). + return False new_node_label = self.__get_median_node_label(node_labels) if self.__ged_env.get_node_rel_cost(new_node_label, node_label) > self.__epsilon: node_label.clear() @@ -1360,47 +1387,6 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no # Increase overall number of increases. self.__num_increase_order += 1 - - - def __improve_sum_of_distances(self, timer): - pass - - - def __median_available(self): - return self.__median_id != np.inf - - -# def __get_node_image_from_map(self, node_map, node): -# """ -# Return ID of the node mapping of `node` in `node_map`. - -# Parameters -# ---------- -# node_map : list[tuple(int, int)] -# List of node maps where the mapping node is found. -# -# node : int -# The mapping node of this node is returned - -# Raises -# ------ -# Exception -# If the node with ID `node` is not contained in the source nodes of the node map. - -# Returns -# ------- -# int -# ID of the mapping of `node`. -# -# Notes -# ----- -# This function is not implemented in the `ged::MedianGraphEstimator` class of the `GEDLIB` library. Instead it is a Python implementation of the `ged::NodeMap::image` function. -# """ -# if node < len(node_map): -# return node_map[node][1] if node_map[node][1] < len(node_map) else np.inf -# else: -# raise Exception('The node with ID ', str(node), ' is not contained in the source nodes of the node map.') -# return np.inf def __are_graphs_equal(self, g1, g2): diff --git a/gklearn/preimage/experiments/xp_1nn.py b/gklearn/preimage/experiments/xp_1nn.py index 872be03..a45a9c3 100644 --- a/gklearn/preimage/experiments/xp_1nn.py +++ b/gklearn/preimage/experiments/xp_1nn.py @@ -31,7 +31,7 @@ def xp_knn_1_1(): mpg_options = {'fit_method': 'k-graphs', 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], 'ds_name': ds_name, - 'parallel': True, # False + 'parallel': False, # False 'time_limit_in_sec': 0, 'max_itrs': 100, 'max_itrs_without_update': 3, @@ -100,4 +100,10 @@ def xp_knn_1_1(): if __name__ == '__main__': - xp_knn_1_1() \ No newline at end of file + import pdb, traceback + try: + xp_knn_1_1() + except: + extype, value, tb = sys.exc_info() + traceback.print_exc() + pdb.post_mortem(tb) \ No newline at end of file diff --git a/gklearn/preimage/kernel_knn_cv.py b/gklearn/preimage/kernel_knn_cv.py index ce822aa..2faf4ba 100644 --- a/gklearn/preimage/kernel_knn_cv.py +++ b/gklearn/preimage/kernel_knn_cv.py @@ -29,7 +29,6 @@ def kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_opti dataset_all.remove_labels(**irrelevant_labels) if cut_range is not None: dataset_all.cut_graphs(cut_range) -# datasets = split_dataset_by_target(dataset_all) if save_results: # create result files. @@ -86,7 +85,7 @@ def __kernel_knn_cv_median(dataset_all, ds_name, knn_options, mpg_options, kerne median_set = G_app[i_start:i_end] dataset = dataset_all.copy() - dataset.load_graphs(median_set.copy(), targets=None) + dataset.load_graphs([g.copy() for g in median_set], targets=None) mge_options['update_order'] = True mpg_options['gram_matrix_unnorm'] = gm_unnorm_trial[i_start:i_end,i_start:i_end].copy() mpg_options['runtime_precompute_gm'] = 0 @@ -104,7 +103,7 @@ def __kernel_knn_cv_median(dataset_all, ds_name, knn_options, mpg_options, kerne for i_app, G_app in enumerate(medians): # compute dis_mat between medians. dataset = dataset_all.copy() - dataset.load_graphs(G_app.copy(), targets=None) + dataset.load_graphs([g.copy() for g in G_app], targets=None) gm_app_unnorm, _ = __compute_gram_matrix_unnorm(dataset, kernel_options.copy()) # compute the entire Gram matrix. @@ -204,7 +203,7 @@ def __kernel_knn_cv_best_ds(dataset_all, ds_name, knn_options, kernel_options, g print('\nperforming k-nn...') # compute dis_mat between medians. dataset = dataset_all.copy() - dataset.load_graphs(best_graphs.copy(), targets=None) + dataset.load_graphs([g.copy() for g in best_graphs], targets=None) gm_app_unnorm, _ = __compute_gram_matrix_unnorm(dataset, kernel_options.copy()) # compute the entire Gram matrix. diff --git a/gklearn/preimage/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index 6c66de0..9aaa88a 100644 --- a/gklearn/preimage/median_preimage_generator.py +++ b/gklearn/preimage/median_preimage_generator.py @@ -891,8 +891,8 @@ class MedianPreimageGenerator(PreimageGenerator): ged_options = self.__ged_options.copy() if self.__parallel: ged_options['threads'] = 1 - self.__mge.set_init_method(self.__ged_options['method'], ged_options_to_string(ged_options)) - self.__mge.set_descent_method(self.__ged_options['method'], ged_options_to_string(ged_options)) + self.__mge.set_init_method(ged_options['method'], ged_options_to_string(ged_options)) + self.__mge.set_descent_method(ged_options['method'], ged_options_to_string(ged_options)) # Run the estimator. self.__mge.run(graph_ids, set_median_id, gen_median_id) diff --git a/gklearn/utils/dataset.py b/gklearn/utils/dataset.py index 78d8841..90bb886 100644 --- a/gklearn/utils/dataset.py +++ b/gklearn/utils/dataset.py @@ -525,7 +525,7 @@ class Dataset(object): def copy(self): dataset = Dataset() - graphs = self.__graphs.copy() if self.__graphs is not None else None + graphs = [g.copy() for g in self.__graphs] if self.__graphs is not None else None target = self.__targets.copy() if self.__targets is not None else None node_labels = self.__node_labels.copy() if self.__node_labels is not None else None node_attrs = self.__node_attrs.copy() if self.__node_attrs is not None else None From 34506302ce7365292b9254272ffd87307ab8f66a Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Fri, 15 May 2020 12:18:38 +0200 Subject: [PATCH 11/17] 1. Solve uncolsed file warning in graph_file.py. 2. Solve CXVPY * and @ warning in MPG. --- gklearn/preimage/experiments/xp_1nn.py | 109 - .../experiments/xp_1nn_init10_trianglerule.py | 3022 ++++++++++++++++++++ gklearn/preimage/median_preimage_generator.py | 60 +- gklearn/utils/graph_files.py | 37 +- 4 files changed, 3076 insertions(+), 152 deletions(-) delete mode 100644 gklearn/preimage/experiments/xp_1nn.py create mode 100644 gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py diff --git a/gklearn/preimage/experiments/xp_1nn.py b/gklearn/preimage/experiments/xp_1nn.py deleted file mode 100644 index a45a9c3..0000000 --- a/gklearn/preimage/experiments/xp_1nn.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Mon May 11 14:15:11 2020 - -@author: ljia -""" -import functools -import multiprocessing -import os -import sys -import logging -from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct -from gklearn.preimage import kernel_knn_cv - -dir_root = '../results/xp_1nn.init1.no_triangle_rule.allow_zeros/' -num_random = 10 -initial_solutions = 1 -triangle_rule = False -allow_zeros = True -update_order = False -test_sizes = [0.9, 0.7] # , 0.5, 0.3, 0.1] - -def xp_knn_1_1(): - for test_size in test_sizes: - ds_name = 'Letter-high' - knn_options = {'n_neighbors': 1, - 'n_splits': 30, - 'test_size': test_size, - 'verbose': True} - mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], - 'ds_name': ds_name, - 'parallel': False, # False - 'time_limit_in_sec': 0, - 'max_itrs': 100, - 'max_itrs_without_update': 3, - 'epsilon_residual': 0.01, - 'epsilon_ec': 0.1, - 'allow_zeros': allow_zeros, - 'triangle_rule': triangle_rule, - 'verbose': 1} - mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) - sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'StructuralSP', - 'edge_weight': None, - 'node_kernels': sub_kernels, - 'edge_kernels': sub_kernels, - 'compute_method': 'naive', - 'parallel': 'imap_unordered', -# 'parallel': None, - 'n_jobs': multiprocessing.cpu_count(), - 'normalize': True, - 'verbose': 0} - ged_options = {'method': 'IPFP', - 'initialization_method': 'RANDOM', # 'NODE' - 'initial_solutions': initial_solutions, # 1 - 'edit_cost': 'LETTER2', - 'attr_distance': 'euclidean', - 'ratio_runs_from_initial_solutions': 1, - 'threads': multiprocessing.cpu_count(), - 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} - mge_options = {'init_type': 'MEDOID', - 'random_inits': 10, - 'time_limit': 0, - 'verbose': 1, - 'update_order': update_order, - 'randomness': 'REAL', - 'refine': False} - save_results = True - dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') - - if not os.path.exists(dir_save): - os.makedirs(dir_save) - file_output = open(dir_save + 'output.txt', 'a') -# sys.stdout = file_output - - # print settings. - print('parameters:') - print('dataset name:', ds_name) - print('mpg_options:', mpg_options) - print('kernel_options:', kernel_options) - print('ged_options:', ged_options) - print('mge_options:', mge_options) - print('save_results:', save_results) - - for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: -# for train_examples in ['expert']: - print('\n-------------------------------------') - print('train examples used:', train_examples, '\n') - mpg_options['fit_method'] = train_examples -# try: - kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=None, edge_required=False, cut_range=None) -# except Exception as exp: -# print('An exception occured when running this experiment:') -# LOG_FILENAME = dir_save + 'error.txt' -# logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) -# logging.exception('') -# print(repr(exp)) - - -if __name__ == '__main__': - import pdb, traceback - try: - xp_knn_1_1() - except: - extype, value, tb = sys.exc_info() - traceback.print_exc() - pdb.post_mortem(tb) \ No newline at end of file diff --git a/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py b/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py new file mode 100644 index 0000000..9af5828 --- /dev/null +++ b/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py @@ -0,0 +1,3022 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Fri May 15 10:50:46 2020 + +@author: ljia +""" +import multiprocessing +import functools +import sys +import os +import logging +from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct +from gklearn.preimage import kernel_knn_cv +from gklearn.utils import compute_gram_matrices_by_class + + +dir_root = '../results/xp_1nn.init10.triangle_rule/' +initial_solutions = 10 +triangle_rule = True +allow_zeros = False +update_order = False +test_sizes = [0.9, 0.7] # , 0.5, 0.3, 0.1] + + +def xp_median_preimage_14_1(): + """xp 14_1: DD, PathUpToH, using CONSTANT. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'DD' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'PathUpToH', + 'depth': 2, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # # compute gram matrices for each class a priori. + # print('Compute gram matrices for each class a priori.') + # compute_gram_matrices_by_class(ds_name, kernel_options, save_results=save_results, dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_13_1(): + """xp 13_1: PAH, StructuralSP, using NON_SYMBOLIC. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'PAH' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_13_2(): + """xp 13_2: PAH, ShortestPath, using NON_SYMBOLIC. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'PAH' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') # + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: # + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_1(): + """xp 12_1: PAH, StructuralSP, using NON_SYMBOLIC, unlabeled. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'PAH' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 0, 1, 1, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_2(): + """xp 12_2: PAH, PathUpToH, using CONSTANT, unlabeled. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'PAH' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'PathUpToH', + 'depth': 1, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_3(): + """xp 12_3: PAH, Treelet, using CONSTANT, unlabeled. + """ + from gklearn.utils.kernels import gaussiankernel + for test_size in test_sizes: + # set parameters. + ds_name = 'PAH' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + pkernel = functools.partial(gaussiankernel, gamma=None) # @todo + kernel_options = {'name': 'Treelet', # + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_4(): + """xp 12_4: PAH, WeisfeilerLehman, using CONSTANT, unlabeled. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'PAH' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 14, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # # compute gram matrices for each class a priori. + # print('Compute gram matrices for each class a priori.') + # compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_5(): + """xp 12_5: PAH, ShortestPath, using NON_SYMBOLIC, unlabeled. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'PAH' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 0, 1, 1, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' # + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: # + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_9_1(): + """xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'MAO' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_9_2(): + """xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'MAO' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'PathUpToH', + 'depth': 9, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_9_3(): + """xp 9_3: MAO, Treelet, using CONSTANT, symbolic only. + """ + for test_size in test_sizes: + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'MAO' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + pkernel = functools.partial(polynomialkernel, d=4, c=1e+7) + kernel_options = {'name': 'Treelet', # + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_9_4(): + """xp 9_4: MAO, WeisfeilerLehman, using CONSTANT, symbolic only. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'MAO' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 6, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + +# # compute gram matrices for each class a priori. +# print('Compute gram matrices for each class a priori.') +# compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_8_1(): + """xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Monoterpenoides' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_8_2(): + """xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Monoterpenoides' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'PathUpToH', + 'depth': 7, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_8_3(): + """xp 8_3: Monoterpenoides, Treelet, using CONSTANT. + """ + for test_size in test_sizes: + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'Monoterpenoides' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + pkernel = functools.partial(polynomialkernel, d=2, c=1e+5) + kernel_options = {'name': 'Treelet', + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_8_4(): + """xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Monoterpenoides' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 4, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_7_1(): + """xp 7_1: MUTAG, StructuralSP, using CONSTANT. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'MUTAG' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_7_2(): + """xp 7_2: MUTAG, PathUpToH, using CONSTANT. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'MUTAG' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'PathUpToH', + 'depth': 2, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_7_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_7_3(): + """xp 7_3: MUTAG, Treelet, using CONSTANT. + """ + for test_size in test_sizes: + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'MUTAG' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + pkernel = functools.partial(polynomialkernel, d=3, c=1e+8) + kernel_options = {'name': 'Treelet', + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_7_4(): + """xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'MUTAG' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 1, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_6_1(): + """xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'COIL-RAG' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_6_1:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_6_2(): + """xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'COIL-RAG' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_6_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_5_1(): + """xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'FRANKENSTEIN' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_4_1(): + """xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'COLORS-3' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_3_2(): + """xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Fingerprint' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.01, 0.125, 0.125], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_3_1(): + """xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Fingerprint' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.01, 0.125, 0.125], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_2_1(): + """xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'COIL-DEL' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.node_attrs/' + irrelevant_labels = {'edge_labels': ['valence']} + edge_required = False + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + +# # compute gram matrices for each class a priori. +# print('Compute gram matrices for each class a priori.') +# compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for train_examples in ['k-graphs', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_1_1(): + """xp 1_1: Letter-high, StructuralSP. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Letter-high' + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None + edge_required = False + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_1_1:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_1_2(): + """xp 1_2: Letter-high, ShortestPath. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Letter-high' + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_1_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_10_1(): + """xp 10_1: Letter-med, StructuralSP. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Letter-med' + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None + edge_required = False + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_10_1:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_10_2(): + """xp 10_2: Letter-med, ShortestPath. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Letter-med' + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_10_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_11_1(): + """xp 11_1: Letter-low, StructuralSP. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Letter-low' + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None + edge_required = False + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_11_1:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_11_2(): + """xp 11_2: Letter-low, ShortestPath. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'Letter-low' + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_11_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +if __name__ == "__main__": + +# #### xp 1_1: Letter-high, StructuralSP. + # xp_median_preimage_1_1() + +# #### xp 1_2: Letter-high, ShortestPath. + # xp_median_preimage_1_2() + +# #### xp 10_1: Letter-med, StructuralSP. + # xp_median_preimage_10_1() + +# #### xp 10_2: Letter-med, ShortestPath. + # xp_median_preimage_10_2() + +# #### xp 11_1: Letter-low, StructuralSP. + # xp_median_preimage_11_1() + +# #### xp 11_2: Letter-low, ShortestPath. + # xp_median_preimage_11_2() +# +# #### xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. +# # xp_median_preimage_2_1() +# +# #### xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. +# # xp_median_preimage_3_1() + +# #### xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. + # xp_median_preimage_3_2() + +# #### xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. +# # xp_median_preimage_4_1() +# +# #### xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. +# # xp_median_preimage_5_1() +# +# #### xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. + # xp_median_preimage_6_1() + +# #### xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. + # xp_median_preimage_6_2() + +# #### xp 7_1: MUTAG, StructuralSP, using CONSTANT. + # xp_median_preimage_7_1() + +# #### xp 7_2: MUTAG, PathUpToH, using CONSTANT. + # xp_median_preimage_7_2() + +# #### xp 7_3: MUTAG, Treelet, using CONSTANT. + # xp_median_preimage_7_3() + +# #### xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT. + # xp_median_preimage_7_4() +# +# #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. + # xp_median_preimage_8_1() + +# #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + # xp_median_preimage_8_2() + +# #### xp 8_3: Monoterpenoides, Treelet, using CONSTANT. + # xp_median_preimage_8_3() + +# #### xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. + # xp_median_preimage_8_4() + +# #### xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. + # xp_median_preimage_9_1() + +# #### xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. + # xp_median_preimage_9_2() + +# #### xp 9_3: MAO, Treelet, using CONSTANT, symbolic only. + # xp_median_preimage_9_3() + +# #### xp 9_4: MAO, WeisfeilerLehman, using CONSTANT, symbolic only. + # xp_median_preimage_9_4() + + #### xp 12_1: PAH, StructuralSP, using NON_SYMBOLIC, unlabeled. + # xp_median_preimage_12_1() + + #### xp 12_2: PAH, PathUpToH, using CONSTANT, unlabeled. + # xp_median_preimage_12_2() + + #### xp 12_3: PAH, Treelet, using CONSTANT, unlabeled. + # xp_median_preimage_12_3() + + #### xp 12_4: PAH, WeisfeilerLehman, using CONSTANT, unlabeled. + # xp_median_preimage_12_4() + + #### xp 12_5: PAH, ShortestPath, using NON_SYMBOLIC, unlabeled. + # xp_median_preimage_12_5() + + #### xp 13_1: PAH, StructuralSP, using NON_SYMBOLIC. + # xp_median_preimage_13_1() + + #### xp 13_2: PAH, ShortestPath, using NON_SYMBOLIC. +# xp_median_preimage_13_2() + + #### xp 14_1: DD, PathUpToH, using CONSTANT. +# xp_median_preimage_14_1() + + + + + + + + +# #### xp 1_1: Letter-high, StructuralSP. + xp_median_preimage_1_1() + +# #### xp 1_2: Letter-high, ShortestPath. + xp_median_preimage_1_2() + +# #### xp 10_1: Letter-med, StructuralSP. + xp_median_preimage_10_1() + +# #### xp 10_2: Letter-med, ShortestPath. + xp_median_preimage_10_2() + +# #### xp 11_1: Letter-low, StructuralSP. + xp_median_preimage_11_1() + +# #### xp 11_2: Letter-low, ShortestPath. + xp_median_preimage_11_2() + + #### xp 13_1: PAH, StructuralSP, using NON_SYMBOLIC. + xp_median_preimage_13_1() + + #### xp 13_2: PAH, ShortestPath, using NON_SYMBOLIC. + xp_median_preimage_13_2() + +# #### xp 7_2: MUTAG, PathUpToH, using CONSTANT. + xp_median_preimage_7_2() + +# #### xp 7_3: MUTAG, Treelet, using CONSTANT. + xp_median_preimage_7_3() + +# #### xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT. + xp_median_preimage_7_4() +# +# #### xp 7_1: MUTAG, StructuralSP, using CONSTANT. + xp_median_preimage_7_1() + +# #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + xp_median_preimage_8_2() + +# #### xp 8_3: Monoterpenoides, Treelet, using CONSTANT. + xp_median_preimage_8_3() + +# #### xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. + xp_median_preimage_8_4() + +# #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. + xp_median_preimage_8_1() + +# #### xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. + xp_median_preimage_9_2() + +# #### xp 9_3: MAO, Treelet, using CONSTANT, symbolic only. + xp_median_preimage_9_3() + +# #### xp 9_4: MAO, WeisfeilerLehman, using CONSTANT, symbolic only. + xp_median_preimage_9_4() + +# #### xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. + xp_median_preimage_9_1() + + #### xp 12_1: PAH, StructuralSP, using NON_SYMBOLIC, unlabeled. + xp_median_preimage_12_1() + + #### xp 12_2: PAH, PathUpToH, using CONSTANT, unlabeled. + xp_median_preimage_12_2() + + #### xp 12_3: PAH, Treelet, using CONSTANT, unlabeled. + xp_median_preimage_12_3() + + #### xp 12_4: PAH, WeisfeilerLehman, using CONSTANT, unlabeled. + xp_median_preimage_12_4() + + #### xp 12_5: PAH, ShortestPath, using NON_SYMBOLIC, unlabeled. + xp_median_preimage_12_5() + +# #### xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. + xp_median_preimage_6_1() +# +# #### xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. + xp_median_preimage_2_1() +# +# #### xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. +# # xp_median_preimage_3_1() + +# #### xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. + # xp_median_preimage_3_2() + +# #### xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. +# # xp_median_preimage_4_1() +# +# #### xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. +# # xp_median_preimage_5_1() +# +# #### xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. + # xp_median_preimage_6_2() + + #### xp 14_1: DD, PathUpToH, using CONSTANT. +# xp_median_preimage_14_1() \ No newline at end of file diff --git a/gklearn/preimage/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index 9aaa88a..9deabe0 100644 --- a/gklearn/preimage/median_preimage_generator.py +++ b/gklearn/preimage/median_preimage_generator.py @@ -443,7 +443,7 @@ class MedianPreimageGenerator(PreimageGenerator): # # 1. if c_vi != c_vr, c_ei != c_er. # nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] # x = cp.Variable(nb_cost_mat_new.shape[1]) - # cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + # cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) ## # 1.1 no constraints. ## constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])]] # # 1.2 c_vs <= c_vi + c_vr. @@ -454,7 +454,7 @@ class MedianPreimageGenerator(PreimageGenerator): ## nb_cost_mat_new[:,0] += nb_cost_mat[:,1] ## nb_cost_mat_new[:,2] += nb_cost_mat[:,5] ## x = cp.Variable(nb_cost_mat_new.shape[1]) - ## cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + ## cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) ## # 2.1 no constraints. ## constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])]] ### # 2.2 c_vs <= c_vi + c_vr. @@ -469,7 +469,7 @@ class MedianPreimageGenerator(PreimageGenerator): if not self.__triangle_rule and self.__allow_zeros: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -482,7 +482,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif self.__triangle_rule and self.__allow_zeros: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -496,7 +496,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif not self.__triangle_rule and not self.__allow_zeros: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) prob.solve() @@ -506,7 +506,7 @@ class MedianPreimageGenerator(PreimageGenerator): # # c_vs <= c_vi + c_vr. # nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] # x = cp.Variable(nb_cost_mat_new.shape[1]) - # cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + # cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) # constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], # np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] # prob = cp.Problem(cp.Minimize(cost_fun), constraints) @@ -519,7 +519,7 @@ class MedianPreimageGenerator(PreimageGenerator): # c_vs <= c_vi + c_vr. nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] prob = cp.Problem(cp.Minimize(cost_fun), constraints) @@ -530,7 +530,7 @@ class MedianPreimageGenerator(PreimageGenerator): # c_vs <= c_vi + c_vr and c_vi == c_vr, c_ei == c_er. nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0, np.array([1.0, -1.0, 0.0, 0.0, 0.0]).T@x == 0.0, @@ -548,7 +548,7 @@ class MedianPreimageGenerator(PreimageGenerator): # nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] nb_cost_mat_new = nb_cost_mat[:,[2,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) # constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], # np.array([0.0, 0.0, 0.0, 1.0, -1.0]).T@x == 0.0] # constraints = [x >= [0.0001 for i in range(nb_cost_mat_new.shape[1])]] @@ -565,7 +565,7 @@ class MedianPreimageGenerator(PreimageGenerator): if is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -578,7 +578,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif is_n_attr and not is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -591,7 +591,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif not is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -604,7 +604,7 @@ class MedianPreimageGenerator(PreimageGenerator): else: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) @@ -615,7 +615,7 @@ class MedianPreimageGenerator(PreimageGenerator): if is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -630,7 +630,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif is_n_attr and not is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -644,7 +644,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif not is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -658,7 +658,7 @@ class MedianPreimageGenerator(PreimageGenerator): else: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) @@ -669,7 +669,7 @@ class MedianPreimageGenerator(PreimageGenerator): if is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) @@ -678,7 +678,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif is_n_attr and not is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) @@ -687,7 +687,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif not is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) @@ -696,7 +696,7 @@ class MedianPreimageGenerator(PreimageGenerator): else: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) @@ -708,7 +708,7 @@ class MedianPreimageGenerator(PreimageGenerator): if is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] @@ -719,7 +719,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif is_n_attr and not is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] prob = cp.Problem(cp.Minimize(cost_fun), constraints) @@ -729,7 +729,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif not is_n_attr and is_e_attr: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], np.array([0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] prob = cp.Problem(cp.Minimize(cost_fun), constraints) @@ -739,7 +739,7 @@ class MedianPreimageGenerator(PreimageGenerator): else: nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat_new @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) @@ -750,7 +750,7 @@ class MedianPreimageGenerator(PreimageGenerator): elif self.__ged_options['edit_cost'] == 'CONSTANT': # @todo: node/edge may not labeled. if not self.__triangle_rule and self.__allow_zeros: x = cp.Variable(nb_cost_mat.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -762,7 +762,7 @@ class MedianPreimageGenerator(PreimageGenerator): residual = np.sqrt(prob.value) elif self.__triangle_rule and self.__allow_zeros: x = cp.Variable(nb_cost_mat.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat.shape[1])], np.array([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, np.array([0.0, 1.0, 0.0, 0.0, 0.0, 0.0]).T@x >= 0.01, @@ -776,7 +776,7 @@ class MedianPreimageGenerator(PreimageGenerator): residual = np.sqrt(prob.value) elif not self.__triangle_rule and not self.__allow_zeros: x = cp.Variable(nb_cost_mat.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat.shape[1])]] prob = cp.Problem(cp.Minimize(cost_fun), constraints) self.__execute_cvx(prob) @@ -784,7 +784,7 @@ class MedianPreimageGenerator(PreimageGenerator): residual = np.sqrt(prob.value) elif self.__triangle_rule and not self.__allow_zeros: x = cp.Variable(nb_cost_mat.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat @ x - dis_k_vec) constraints = [x >= [0.01 for i in range(nb_cost_mat.shape[1])], np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] @@ -818,7 +818,7 @@ class MedianPreimageGenerator(PreimageGenerator): # G = -1 * np.identity(nb_cost_mat.shape[1]) # h = np.array([0 for i in range(nb_cost_mat.shape[1])]) x = cp.Variable(nb_cost_mat.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) + cost_fun = cp.sum_squares(nb_cost_mat @ x - dis_k_vec) constraints = [x >= [0.0 for i in range(nb_cost_mat.shape[1])], # np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, diff --git a/gklearn/utils/graph_files.py b/gklearn/utils/graph_files.py index d977b73..7de4ba0 100644 --- a/gklearn/utils/graph_files.py +++ b/gklearn/utils/graph_files.py @@ -494,7 +494,8 @@ def load_tud(filename): 'edge_labels': [], 'edge_attrs': []} class_label_map = None class_label_map_strings = [] - content_rm = open(frm).read().splitlines() + with open(frm) as rm: + content_rm = rm.read().splitlines() i = 0 while i < len(content_rm): line = content_rm[i].strip() @@ -558,16 +559,20 @@ def load_tud(filename): label_names = {'node_labels': [], 'node_attrs': [], 'edge_labels': [], 'edge_attrs': []} class_label_map = None - - content_gi = open(fgi).read().splitlines() # graph indicator - content_am = open(fam).read().splitlines() # adjacency matrix + + with open(fgi) as gi: + content_gi = gi.read().splitlines() # graph indicator + with open(fam) as am: + content_am = am.read().splitlines() # adjacency matrix # load targets. if 'fgl' in locals(): - content_targets = open(fgl).read().splitlines() # targets (classification) + with open(fgl) as gl: + content_targets = gl.read().splitlines() # targets (classification) targets = [float(i) for i in content_targets] elif 'fga' in locals(): - content_targets = open(fga).read().splitlines() # targets (regression) + with open(fga) as ga: + content_targets = ga.read().splitlines() # targets (regression) targets = [int(i) for i in content_targets] else: raise Exception('Can not find targets file. Please make sure there is a "', ds_name, '_graph_labels.txt" or "', ds_name, '_graph_attributes.txt"', 'file in your dataset folder.') @@ -577,7 +582,8 @@ def load_tud(filename): # create graphs and add nodes data = [nx.Graph(name=str(i)) for i in range(0, len(content_targets))] if 'fnl' in locals(): - content_nl = open(fnl).read().splitlines() # node labels + with open(fnl) as nl: + content_nl = nl.read().splitlines() # node labels for idx, line in enumerate(content_gi): # transfer to int first in case of unexpected blanks data[int(line) - 1].add_node(idx) @@ -605,7 +611,8 @@ def load_tud(filename): # add edge labels if 'fel' in locals(): - content_el = open(fel).read().splitlines() + with open(fel) as el: + content_el = el.read().splitlines() for idx, line in enumerate(content_el): labels = [l.strip() for l in line.split(',')] n = [int(i) - 1 for i in content_am[idx].split(',')] @@ -621,7 +628,8 @@ def load_tud(filename): # add node attributes if 'fna' in locals(): - content_na = open(fna).read().splitlines() + with open(fna) as na: + content_na = na.read().splitlines() for idx, line in enumerate(content_na): attrs = [a.strip() for a in line.split(',')] g = int(content_gi[idx]) - 1 @@ -636,7 +644,8 @@ def load_tud(filename): # add edge attributes if 'fea' in locals(): - content_ea = open(fea).read().splitlines() + with open(fea) as ea: + content_ea = ea.read().splitlines() for idx, line in enumerate(content_ea): attrs = [a.strip() for a in line.split(',')] n = [int(i) - 1 for i in content_am[idx].split(',')] @@ -669,7 +678,8 @@ def load_from_ds(filename, filename_targets): data = [] y = [] label_names = {'node_labels': [], 'edge_labels': [], 'node_attrs': [], 'edge_attrs': []} - content = open(filename).read().splitlines() + with open(filename) as fn: + content = fn.read().splitlines() extension = splitext(content[0].split(' ')[0])[1][1:] if extension == 'ct': load_file_fun = load_ct @@ -691,8 +701,9 @@ def load_from_ds(filename, filename_targets): g, l_names = load_file_fun(dirname_dataset + '/' + tmp.replace('#', '', 1)) data.append(g) __append_label_names(label_names, l_names) - - content_y = open(filename_targets).read().splitlines() + + with open(filename_targets) as fnt: + content_y = fnt.read().splitlines() # assume entries in filename and filename_targets have the same order. for item in content_y: tmp = item.split(' ') From cac0cfa114000ba3becb53bcae7715a299dc7acf Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Tue, 19 May 2020 10:00:42 +0200 Subject: [PATCH 12/17] Add tools to analyze preimage results. --- .gitignore | 1 + .../tools/analyze_results_of_random_edit_costs.py | 86 ++++++++ .../tools/preimage_results_to_latex_tables.py | 228 +++++++++++++++++++++ 3 files changed, 315 insertions(+) create mode 100644 gklearn/preimage/experiments/tools/analyze_results_of_random_edit_costs.py create mode 100644 gklearn/preimage/experiments/tools/preimage_results_to_latex_tables.py diff --git a/.gitignore b/.gitignore index 0146aaf..13141a3 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ gklearn/kernels/*_sym.py gklearn/preimage/* !gklearn/preimage/*.py !gklearn/preimage/experiments/*.py +!gklearn/preimage/experiments/tools/*.py __pycache__ ##*# diff --git a/gklearn/preimage/experiments/tools/analyze_results_of_random_edit_costs.py b/gklearn/preimage/experiments/tools/analyze_results_of_random_edit_costs.py new file mode 100644 index 0000000..4dc20d3 --- /dev/null +++ b/gklearn/preimage/experiments/tools/analyze_results_of_random_edit_costs.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Apr 14 16:57:18 2020 + +@author: ljia +""" +import pandas as pd +import numpy as np +import os +import math + +def summarize_results_of_random_edit_costs(data_dir, ds_name, gkernel): + sod_sm_list = [] + sod_gm_list = [] + dis_k_sm_list = [] + dis_k_gm_list = [] + dis_k_min_gi = [] + time_total_list = [] + mge_dec_order_list = [] + mge_inc_order_list = [] + + # get results from .csv. + file_name = data_dir + 'results_summary.' + ds_name + '.' + gkernel + '.csv' + try: + df = pd.read_csv(file_name) + except FileNotFoundError: + return + for index, row in df.iterrows(): + if row['target'] == 'all' and row['fit method'] == 'random': + if not math.isnan(float(row['SOD SM'])): + sod_sm_list.append(float(row['SOD SM'])) + if not math.isnan(float(row['SOD GM'])): + sod_gm_list.append(float(row['SOD GM'])) + if not math.isnan(float(row['dis_k SM'])): + dis_k_sm_list.append(float(row['dis_k SM'])) + if not math.isnan(float(row['dis_k GM'])): + dis_k_gm_list.append(float(row['dis_k GM'])) + if not math.isnan(float(row['min dis_k gi'])): + dis_k_min_gi.append(float(row['min dis_k gi'])) + if not math.isnan(float(row['time total'])): + time_total_list.append(float(row['time total'])) + if 'mge num decrease order' in row: + mge_dec_order_list.append(int(row['mge num decrease order'])) + if 'mge num increase order' in row: + mge_inc_order_list.append(int(row['mge num increase order'])) + # return if no results. + if len(sod_sm_list) == 0: + return + + # construct output results. + op = {} + op['measure'] = ['max', 'min', 'mean'] + op['SOD SM'] = [np.max(sod_sm_list), np.min(sod_sm_list), np.mean(sod_sm_list)] + op['SOD GM'] = [np.max(sod_gm_list), np.min(sod_gm_list), np.mean(sod_gm_list)] + op['dis_k SM'] = [np.max(dis_k_sm_list), np.min(dis_k_sm_list), np.mean(dis_k_sm_list)] + op['dis_k GM'] = [np.max(dis_k_gm_list), np.min(dis_k_gm_list), np.mean(dis_k_gm_list)] + op['min dis_k gi'] = [np.max(dis_k_min_gi), np.min(dis_k_min_gi), np.mean(dis_k_min_gi)] + op['time total'] = [np.max(time_total_list), np.min(time_total_list), np.mean(time_total_list)] + if len(mge_dec_order_list) > 0: + op['mge num decrease order'] = [np.max(mge_dec_order_list), np.min(mge_dec_order_list), np.mean(mge_dec_order_list)] + if len(mge_inc_order_list) > 0: + op['mge num increase order'] = [np.max(mge_inc_order_list), np.min(mge_inc_order_list), np.mean(mge_inc_order_list)] + df = pd.DataFrame(data=op) + + # write results to .csv + df.to_csv(data_dir + 'summary_for_random_edit_costs.csv', index=False, header=True) + + +def compute_for_all_experiments(data_dir): + dir_list = [i for i in os.listdir(data_dir) if os.path.isdir(data_dir + i)] + for dir_name in dir_list: + sp_tmp = dir_name.split('.') + ds_name = sp_tmp[0].strip('[error]') + gkernel = sp_tmp[1] + summarize_results_of_random_edit_costs(data_dir + dir_name + '/', + ds_name, gkernel) + if os.path.exists(data_dir + dir_name + '/update_order/'): + summarize_results_of_random_edit_costs(data_dir + dir_name + '/update_order/', + ds_name, gkernel) + + +if __name__ == '__main__': +# data_dir = '../results/xp_median_preimage.update_order/' + data_dir = '../../results/CRIANN/xp_median_preimage.init10/' + compute_for_all_experiments(data_dir) \ No newline at end of file diff --git a/gklearn/preimage/experiments/tools/preimage_results_to_latex_tables.py b/gklearn/preimage/experiments/tools/preimage_results_to_latex_tables.py new file mode 100644 index 0000000..301f87f --- /dev/null +++ b/gklearn/preimage/experiments/tools/preimage_results_to_latex_tables.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Thu Apr 30 10:16:33 2020 + +@author: ljia +""" +import pandas as pd +import numpy as np +import os + + +DS_SYMB = ['MUTAG', 'Monoterpenoides', 'MAO_symb'] +DS_NON_SYMB = ['Letter-high', 'Letter-med', 'Letter-low', 'COIL-RAG', 'PAH'] +DS_UNLABELED = ['PAH_unlabeled'] + + +def rounder(x, decimals): + x_strs = str(x).split('.') + if len(x_strs) == 2: + before = x_strs[0] + after = x_strs[1] + if len(after) > decimals: + if int(after[decimals]) >= 5: + after0s = '' + for c in after: + if c == '0': + after0s += '0' + elif c != '0': + break + after = after0s + str(int(after[0:decimals]) + 1)[-decimals:] + else: + after = after[0:decimals] + elif len(after) < decimals: + after += '0' * (decimals - len(after)) + return before + '.' + after + + elif len(x_strs) == 1: + return x_strs[0] + + +def replace_nth(string, sub, wanted, n): + import re + where = [m.start() for m in re.finditer(sub, string)][n-1] + before = string[:where] + after = string[where:] + after = after.replace(sub, wanted, 1) + newString = before + after + return newString + + +def df_to_latex_table(df): + ltx = df.to_latex(index=True, escape=False, multirow=True) + + # modify middle lines. + ltx = ltx.replace('\\cline{1-9}\n\\cline{2-9}', '\\toprule') + ltx = ltx.replace('\\cline{2-9}', '\\cmidrule(l){2-9}') + + # modify first row. + i_start = ltx.find('\n\\toprule\n') + i_end = ltx.find('\\\\\n\\midrule\n') + ltx = ltx.replace(ltx[i_start:i_end+12], '\n\\toprule\nDatasets & Graph Kernels & Algorithms & $d_\\mathcal{F}$ SM & $d_\\mathcal{F}$ SM (UO) & $d_\\mathcal{F}$ GM & $d_\\mathcal{F}$ GM (UO) & Runtime & Runtime (UO) \\\\\n\\midrule\n', 1) + + # add row numbers. + ltx = ltx.replace('lllllllll', 'lllllllll|@{\\makebox[2em][r]{\\textit{\\rownumber\\space}}}', 1) + ltx = replace_nth(ltx, '\\\\\n', '\\gdef\\rownumber{\\stepcounter{magicrownumbers}\\arabic{magicrownumbers}} \\\\\n', 1) + + return ltx + + +def beautify_df(df): + df = df.sort_values(by=['Datasets', 'Graph Kernels']) + df = df.set_index(['Datasets', 'Graph Kernels', 'Algorithms']) +# index = pd.MultiIndex.from_frame(df[['Datasets', 'Graph Kernels', 'Algorithms']]) + + # bold the best results. + for ds in df.index.get_level_values('Datasets').unique(): + for gk in df.loc[ds].index.get_level_values('Graph Kernels').unique(): + min_val = np.inf + min_indices = [] + min_labels = [] + for index, row in df.loc[(ds, gk)].iterrows(): + for label in ['$d_\mathcal{F}$ SM', '$d_\mathcal{F}$ GM', '$d_\mathcal{F}$ GM (UO)']: + value = row[label] + if value != '-': + value = float(value.strip('/same')) + if value < min_val: + min_val = value + min_indices = [index] + min_labels = [label] + elif value == min_val: + min_indices.append(index) + min_labels.append(label) + for idx, index in enumerate(min_indices): + df.loc[(ds, gk, index), min_labels[idx]] = '\\textbf{' + df.loc[(ds, gk, index), min_labels[idx]] + '}' + + return df + + +def get_results(data_dir, ds_name, gkernel): + # get results from .csv. + file_name = data_dir + 'results_summary.' + ds_name + '.' + gkernel + '.csv' + try: + df_summary = pd.read_csv(file_name) + except FileNotFoundError: + return None + + df_results = pd.DataFrame(index=None, columns=['d_F SM', 'd_F GM', 'runtime']) + for index, row in df_summary.iterrows(): + if row['target'] == 'all' and row['fit method'] == 'k-graphs': + df_results.loc['From median set'] = ['-', rounder(row['min dis_k gi'], 3), '-'] + if_uo = (int(row['mge num decrease order']) > 0 or int(row['mge num increase order']) > 0) + df_results.loc['Optimized'] = [rounder(row['dis_k SM'], 3), + rounder(row['dis_k GM'], 3) if if_uo else (rounder(row['dis_k GM'], 3) + '/same'), + rounder(row['time total'], 2)] + if row['target'] == 'all' and row['fit method'] == 'expert': + if_uo = (int(row['mge num decrease order']) > 0 or int(row['mge num increase order']) > 0) + df_results.loc['IAM: expert costs'] = [rounder(row['dis_k SM'], 3), + rounder(row['dis_k GM'], 3) if if_uo else (rounder(row['dis_k GM'], 3) + '/same'), + rounder(row['time total'], 2)] + + # get results from random summary .csv. + random_fini = True + file_name = data_dir + 'summary_for_random_edit_costs.csv' + try: + df_random = pd.read_csv(file_name) + except FileNotFoundError: + random_fini = False + + if random_fini: + for index, row in df_random.iterrows(): + if row['measure'] == 'mean': + if_uo = (float(row['mge num decrease order']) > 0 or float(row['mge num increase order']) > 0) + df_results.loc['IAM: random costs'] = [rounder(row['dis_k SM'], 3), + rounder(row['dis_k GM'], 3) if if_uo else (rounder(row['dis_k GM'], 3) + '/same'), + rounder(row['time total'], 2)] + + # sort index. + df_results = df_results.reindex([item for item in ['From median set', 'IAM: random costs', 'IAM: expert costs', 'Optimized'] if item in df_results.index]) + + return df_results + + +def get_results_of_one_xp(data_dir, ds_name, gkernel): + df_results = pd.DataFrame() + + df_tmp_uo = None + if not os.path.isfile(data_dir + 'update_order/error.txt'): + df_tmp_uo = get_results(data_dir + 'update_order/', ds_name, gkernel) + + df_tmp = None + if not os.path.isfile(data_dir + 'error.txt'): + df_tmp = get_results(data_dir, ds_name, gkernel) + + if (df_tmp_uo is not None and not df_tmp_uo.empty) or (df_tmp is not None and not df_tmp.empty): + df_results = pd.DataFrame(index=['From median set', 'IAM: random costs', 'IAM: expert costs', 'Optimized'], columns=['$d_\mathcal{F}$ SM', '$d_\mathcal{F}$ SM (UO)', '$d_\mathcal{F}$ GM', '$d_\mathcal{F}$ GM (UO)', 'Runtime', 'Runtime (UO)']) + if df_tmp_uo is not None and not df_tmp_uo.empty: + for index, row in df_tmp_uo.iterrows(): + for algo in df_results.index: + if index == algo: + df_results.at[algo, '$d_\mathcal{F}$ SM (UO)'] = row['d_F SM'] + df_results.at[algo, '$d_\mathcal{F}$ GM (UO)'] = row['d_F GM'] + df_results.at[algo, 'Runtime (UO)'] = row['runtime'] + if df_tmp is not None and not df_tmp.empty: + for index, row in df_tmp.iterrows(): + for algo in df_results.index: + if index == algo: + df_results.at[algo, '$d_\mathcal{F}$ SM'] = row['d_F SM'] + df_results.at[algo, '$d_\mathcal{F}$ GM'] = row['d_F GM'].strip('/same') + df_results.at[algo, 'Runtime'] = row['runtime'] + + df_results = df_results.dropna(axis=0, how='all') + df_results = df_results.fillna(value='-') + df_results = df_results.reset_index().rename(columns={'index': 'Algorithms'}) + + return df_results + + +def get_results_for_all_experiments(root_dir): + columns=['Datasets', 'Graph Kernels', 'Algorithms', '$d_\mathcal{F}$ SM', '$d_\mathcal{F}$ SM (UO)', '$d_\mathcal{F}$ GM', '$d_\mathcal{F}$ GM (UO)', 'Runtime', 'Runtime (UO)'] + df_symb = pd.DataFrame(columns=columns) + df_nonsymb = pd.DataFrame(columns=columns) + df_unlabeled = pd.DataFrame(columns=columns) + + dir_list = [i for i in os.listdir(root_dir) if os.path.isdir(root_dir + i)] + for dir_name in dir_list: + sp_tmp = dir_name.split('.') + gkernel = sp_tmp[1] + ds_name = sp_tmp[0].strip('[error]') + suffix = '' + if sp_tmp[-1] == 'unlabeled': + suffix = '_unlabeled' + elif sp_tmp[-1] == 'symb': + suffix = '_symb' + + df_results = get_results_of_one_xp(root_dir + dir_name + '/', ds_name, gkernel) + + if not df_results.empty: + ds_name += suffix + if ds_name in DS_SYMB: + for index, row in df_results.iterrows(): + df_symb.loc[len(df_symb)] = [ds_name.replace('_', '\_'), gkernel] + row.tolist() + elif ds_name in DS_NON_SYMB: + for index, row in df_results.iterrows(): + df_nonsymb.loc[len(df_nonsymb)] = [ds_name.replace('_', '\_'), gkernel] + row.tolist() + elif ds_name in DS_UNLABELED: + for index, row in df_results.iterrows(): + df_unlabeled.loc[len(df_unlabeled)] = [ds_name.replace('_', '\_'), gkernel] + row.tolist() + else: + raise Exception('dataset' + ds_name + 'is not pre-defined.') + + # sort. + df_symb = beautify_df(df_symb) + df_nonsymb = beautify_df(df_nonsymb) + df_unlabeled = beautify_df(df_unlabeled) + + # convert dfs to latex strings. + ltx_symb = df_to_latex_table(df_symb) + ltx_nonsymb = df_to_latex_table(df_nonsymb) + ltx_unlabeled = df_to_latex_table(df_unlabeled) + + return ltx_symb, ltx_nonsymb, ltx_unlabeled + + +if __name__ == '__main__': +# root_dir = '../results/xp_median_preimage.init20/' + root_dir = '../../results/CRIANN/xp_median_preimage.init10/' + ltx_symb, ltx_nonsymb, ltx_unlabeled = get_results_for_all_experiments(root_dir) From 06c35201b264218baac2cb05dc058e2314a45858 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Tue, 26 May 2020 15:55:58 +0200 Subject: [PATCH 13/17] Add option to sort graphs by size when computing GEDs for the sake of the stability. --- gklearn/ged/env/node_map.py | 28 ++-- gklearn/ged/median/median_graph_estimator.py | 146 ++++++++++++++++----- gklearn/ged/median/utils.py | 2 + gklearn/ged/util/util.py | 24 ++-- .../tools/analyze_results_of_random_edit_costs.py | 9 +- .../experiments/xp_1nn_init10_trianglerule.py | 24 ++-- gklearn/preimage/kernel_knn_cv.py | 2 +- 7 files changed, 166 insertions(+), 69 deletions(-) diff --git a/gklearn/ged/env/node_map.py b/gklearn/ged/env/node_map.py index 4812486..dc3e3bf 100644 --- a/gklearn/ged/env/node_map.py +++ b/gklearn/ged/env/node_map.py @@ -39,14 +39,6 @@ class NodeMap(object): return np.inf - def get_forward_map(self): - return self.__forward_map - - - def get_backward_map(self): - return self.__backward_map - - def as_relation(self, relation): relation.clear() for i in range(0, len(self.__forward_map)): @@ -77,4 +69,22 @@ class NodeMap(object): def induced_cost(self): - return self.__induced_cost \ No newline at end of file + return self.__induced_cost + + + @property + def forward_map(self): + return self.__forward_map + + @forward_map.setter + def forward_map(self, value): + self.__forward_map = value + + + @property + def backward_map(self): + return self.__backward_map + + @backward_map.setter + def backward_map(self, value): + self.__backward_map = value \ No newline at end of file diff --git a/gklearn/ged/median/median_graph_estimator.py b/gklearn/ged/median/median_graph_estimator.py index c4291ce..03c7892 100644 --- a/gklearn/ged/median/median_graph_estimator.py +++ b/gklearn/ged/median/median_graph_estimator.py @@ -52,6 +52,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no self.__seed = 0 self.__parallel = True self.__update_order = True + self.__sort_graphs = True # sort graphs by size when computing GEDs. self.__refine = True self.__time_limit_in_sec = 0 self.__epsilon = 0.0001 @@ -150,6 +151,16 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no else: raise Exception('Invalid argument "' + opt_val + '" for option update-order. Usage: options = "[--update-order TRUE|FALSE] [...]"') + elif opt_name == 'sort-graphs': + if opt_val == 'TRUE': + self.__sort_graphs = True + + elif opt_val == 'FALSE': + self.__sort_graphs = False + + else: + raise Exception('Invalid argument "' + opt_val + '" for option sort-graphs. Usage: options = "[--sort-graphs TRUE|FALSE] [...]"') + elif opt_name == 'refine': if opt_val == 'TRUE': self.__refine = True @@ -537,18 +548,31 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no progress.update(1) # Improving the node maps. + nb_nodes_median = self.__ged_env.get_graph_num_nodes(self.__gen_median_id) for graph_id, node_map in self.__node_maps_from_median.items(): if time.expired(): if self.__state == AlgorithmState.TERMINATED: self.__state = AlgorithmState.CONVERGED break - self.__ged_env.run_method(self.__gen_median_id, graph_id) - if self.__ged_env.get_upper_bound(self.__gen_median_id, graph_id) < node_map.induced_cost(): - self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(self.__gen_median_id, graph_id) - self.__sum_of_distances += self.__node_maps_from_median[graph_id].induced_cost() + + nb_nodes_g = self.__ged_env.get_graph_num_nodes(graph_id) + if nb_nodes_median <= nb_nodes_g or not self.__sort_graphs: + self.__ged_env.run_method(self.__gen_median_id, graph_id) + if self.__ged_env.get_upper_bound(self.__gen_median_id, graph_id) < node_map.induced_cost(): + self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(self.__gen_median_id, graph_id) + else: + self.__ged_env.run_method(graph_id, self.__gen_median_id) + if self.__ged_env.get_upper_bound(graph_id, self.__gen_median_id) < node_map.induced_cost(): + node_map_tmp = self.__ged_env.get_node_map(graph_id, self.__gen_median_id) + node_map_tmp.forward_map, node_map_tmp.backward_map = node_map_tmp.backward_map, node_map_tmp.forward_map + self.__node_maps_from_median[graph_id] = node_map_tmp + + self.__sum_of_distances += self.__node_maps_from_median[graph_id].induced_cost() + # Print information. if self.__print_to_stdout == 2: progress.update(1) + self.__sum_of_distances = 0.0 for key, val in self.__node_maps_from_median.items(): self.__sum_of_distances += val.induced_cost() @@ -636,6 +660,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no self.__seed = 0 self.__parallel = True self.__update_order = True + self.__sort_graphs = True self.__refine = True self.__time_limit_in_sec = 0 self.__epsilon = 0.0001 @@ -695,7 +720,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def init_worker(ged_env_toshare): global G_ged_env G_ged_env = ged_env_toshare - do_fun = partial(_compute_medoid_parallel, graph_ids) + do_fun = partial(_compute_medoid_parallel, graph_ids, self.__sort_graphs) pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(self.__ged_env,)) if self.__print_to_stdout == 2: iterator = tqdm(pool.imap_unordered(do_fun, itr, chunksize), @@ -723,10 +748,16 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no if timer.expired(): self.__state = AlgorithmState.CALLED break + nb_nodes_g = self.__ged_env.get_graph_num_nodes(g_id) sum_of_distances = 0 - for h_id in graph_ids: - self.__ged_env.run_method(g_id, h_id) - sum_of_distances += self.__ged_env.get_upper_bound(g_id, h_id) + for h_id in graph_ids: + nb_nodes_h = self.__ged_env.get_graph_num_nodes(h_id) + if nb_nodes_g <= nb_nodes_h or not self.__sort_graphs: + self.__ged_env.run_method(g_id, h_id) + sum_of_distances += self.__ged_env.get_upper_bound(g_id, h_id) + else: + self.__ged_env.run_method(h_id, g_id) + sum_of_distances += self.__ged_env.get_upper_bound(h_id, g_id) if sum_of_distances < best_sum_of_distances: best_sum_of_distances = sum_of_distances medoid_id = g_id @@ -760,7 +791,8 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def init_worker(ged_env_toshare): global G_ged_env G_ged_env = ged_env_toshare - do_fun = partial(_compute_init_node_maps_parallel, gen_median_id) + nb_nodes_median = self.__ged_env.get_graph_num_nodes(gen_median_id) + do_fun = partial(_compute_init_node_maps_parallel, gen_median_id, self.__sort_graphs, nb_nodes_median) pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(self.__ged_env,)) if self.__print_to_stdout == 2: iterator = tqdm(pool.imap_unordered(do_fun, itr, chunksize), @@ -783,9 +815,17 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no self.__sum_of_distances = 0 self.__node_maps_from_median.clear() + nb_nodes_median = self.__ged_env.get_graph_num_nodes(gen_median_id) for graph_id in graph_ids: - self.__ged_env.run_method(gen_median_id, graph_id) - self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(gen_median_id, graph_id) + nb_nodes_g = self.__ged_env.get_graph_num_nodes(graph_id) + if nb_nodes_median <= nb_nodes_g or not self.__sort_graphs: + self.__ged_env.run_method(gen_median_id, graph_id) + self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(gen_median_id, graph_id) + else: + self.__ged_env.run_method(graph_id, gen_median_id) + node_map_tmp = self.__ged_env.get_node_map(graph_id, gen_median_id) + node_map_tmp.forward_map, node_map_tmp.backward_map = node_map_tmp.backward_map, node_map_tmp.forward_map + self.__node_maps_from_median[graph_id] = node_map_tmp # print(self.__node_maps_from_median[graph_id]) self.__sum_of_distances += self.__node_maps_from_median[graph_id].induced_cost() # print(self.__sum_of_distances) @@ -843,7 +883,7 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no for graph_id, graph in graphs.items(): # print('graph_id: ', graph_id) # print(self.__node_maps_from_median[graph_id]) -# print(self.__node_maps_from_median[graph_id].get_forward_map(), self.__node_maps_from_median[graph_id].get_backward_map()) +# print(self.__node_maps_from_median[graph_id].forward_map, self.__node_maps_from_median[graph_id].backward_map) k = self.__node_maps_from_median[graph_id].image(i) # print('k: ', k) if k != np.inf: @@ -920,7 +960,8 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no def init_worker(ged_env_toshare): global G_ged_env G_ged_env = ged_env_toshare - do_fun = partial(_update_node_maps_parallel, self.__median_id, self.__epsilon) + nb_nodes_median = self.__ged_env.get_graph_num_nodes(self.__median_id) + do_fun = partial(_update_node_maps_parallel, self.__median_id, self.__epsilon, self.__sort_graphs, nb_nodes_median) pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(self.__ged_env,)) if self.__print_to_stdout == 2: iterator = tqdm(pool.imap_unordered(do_fun, itr, chunksize), @@ -941,13 +982,25 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no progress = tqdm(desc='Updating node maps', total=len(self.__node_maps_from_median), file=sys.stdout) node_maps_were_modified = False + nb_nodes_median = self.__ged_env.get_graph_num_nodes(self.__median_id) for graph_id, node_map in self.__node_maps_from_median.items(): - self.__ged_env.run_method(self.__median_id, graph_id) - if self.__ged_env.get_upper_bound(self.__median_id, graph_id) < node_map.induced_cost() - self.__epsilon: - # xxx = self.__node_maps_from_median[graph_id] - self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(self.__median_id, graph_id) - # yyy = self.__node_maps_from_median[graph_id] - node_maps_were_modified = True + nb_nodes_g = self.__ged_env.get_graph_num_nodes(graph_id) + + if nb_nodes_median <= nb_nodes_g or not self.__sort_graphs: + self.__ged_env.run_method(self.__median_id, graph_id) + if self.__ged_env.get_upper_bound(self.__median_id, graph_id) < node_map.induced_cost() - self.__epsilon: + # xxx = self.__node_maps_from_median[graph_id] + self.__node_maps_from_median[graph_id] = self.__ged_env.get_node_map(self.__median_id, graph_id) + node_maps_were_modified = True + + else: + self.__ged_env.run_method(graph_id, self.__median_id) + if self.__ged_env.get_upper_bound(graph_id, self.__median_id) < node_map.induced_cost() - self.__epsilon: + node_map_tmp = self.__ged_env.get_node_map(graph_id, self.__median_id) + node_map_tmp.forward_map, node_map_tmp.backward_map = node_map_tmp.backward_map, node_map_tmp.forward_map + self.__node_maps_from_median[graph_id] = node_map_tmp + node_maps_were_modified = True + # Print information about current iteration. if self.__print_to_stdout == 2: progress.update(1) @@ -1047,8 +1100,8 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no for k in range(0, node_map.num_target_nodes()): if is_unassigned_target_node[k]: new_node_map.add_assignment(np.inf, k) -# print(self.__node_maps_from_median[key].get_forward_map(), self.__node_maps_from_median[key].get_backward_map()) -# print(new_node_map.get_forward_map(), new_node_map.get_backward_map()) +# print(self.__node_maps_from_median[key].forward_map, self.__node_maps_from_median[key].backward_map) +# print(new_node_map.forward_map, new_node_map.backward_map self.__node_maps_from_median[key] = new_node_map # Increase overall number of decreases. @@ -1599,37 +1652,58 @@ class MedianGraphEstimator(object): # @todo: differ dummy_node from undifined no # return median_label -def _compute_medoid_parallel(graph_ids, itr): +def _compute_medoid_parallel(graph_ids, sort, itr): g_id = itr[0] i = itr[1] # @todo: timer not considered here. # if timer.expired(): # self.__state = AlgorithmState.CALLED # break + nb_nodes_g = G_ged_env.get_graph_num_nodes(g_id) sum_of_distances = 0 for h_id in graph_ids: - G_ged_env.run_method(g_id, h_id) - sum_of_distances += G_ged_env.get_upper_bound(g_id, h_id) + nb_nodes_h = G_ged_env.get_graph_num_nodes(h_id) + if nb_nodes_g <= nb_nodes_h or not sort: + G_ged_env.run_method(g_id, h_id) + sum_of_distances += G_ged_env.get_upper_bound(g_id, h_id) + else: + G_ged_env.run_method(h_id, g_id) + sum_of_distances += G_ged_env.get_upper_bound(h_id, g_id) return i, sum_of_distances + - -def _compute_init_node_maps_parallel(gen_median_id, itr): +def _compute_init_node_maps_parallel(gen_median_id, sort, nb_nodes_median, itr): graph_id = itr - G_ged_env.run_method(gen_median_id, graph_id) - node_maps_from_median = G_ged_env.get_node_map(gen_median_id, graph_id) + nb_nodes_g = G_ged_env.get_graph_num_nodes(graph_id) + if nb_nodes_median <= nb_nodes_g or not sort: + G_ged_env.run_method(gen_median_id, graph_id) + node_map = G_ged_env.get_node_map(gen_median_id, graph_id) # print(self.__node_maps_from_median[graph_id]) - sum_of_distance = node_maps_from_median.induced_cost() + else: + G_ged_env.run_method(graph_id, gen_median_id) + node_map = G_ged_env.get_node_map(graph_id, gen_median_id) + node_map.forward_map, node_map.backward_map = node_map.backward_map, node_map.forward_map + sum_of_distance = node_map.induced_cost() # print(self.__sum_of_distances) - return graph_id, sum_of_distance, node_maps_from_median - + return graph_id, sum_of_distance, node_map + -def _update_node_maps_parallel(median_id, epsilon, itr): +def _update_node_maps_parallel(median_id, epsilon, sort, nb_nodes_median, itr): graph_id = itr[0] node_map = itr[1] node_maps_were_modified = False - G_ged_env.run_method(median_id, graph_id) - if G_ged_env.get_upper_bound(median_id, graph_id) < node_map.induced_cost() - epsilon: - node_map = G_ged_env.get_node_map(median_id, graph_id) - node_maps_were_modified = True + nb_nodes_g = G_ged_env.get_graph_num_nodes(graph_id) + if nb_nodes_median <= nb_nodes_g or not sort: + G_ged_env.run_method(median_id, graph_id) + if G_ged_env.get_upper_bound(median_id, graph_id) < node_map.induced_cost() - epsilon: + node_map = G_ged_env.get_node_map(median_id, graph_id) + node_maps_were_modified = True + else: + G_ged_env.run_method(graph_id, median_id) + if G_ged_env.get_upper_bound(graph_id, median_id) < node_map.induced_cost() - epsilon: + node_map = G_ged_env.get_node_map(graph_id, median_id) + node_map.forward_map, node_map.backward_map = node_map.backward_map, node_map.forward_map + node_maps_were_modified = True + return graph_id, node_map, node_maps_were_modified \ No newline at end of file diff --git a/gklearn/ged/median/utils.py b/gklearn/ged/median/utils.py index 5c4c52f..d27c86d 100644 --- a/gklearn/ged/median/utils.py +++ b/gklearn/ged/median/utils.py @@ -34,6 +34,8 @@ def mge_options_to_string(options): opt_str += '--parallel ' + ('TRUE' if val else 'FALSE') + ' ' elif key == 'update_order': opt_str += '--update-order ' + ('TRUE' if val else 'FALSE') + ' ' + elif key == 'sort_graphs': + opt_str += '--sort-graphs ' + ('TRUE' if val else 'FALSE') + ' ' elif key == 'refine': opt_str += '--refine ' + ('TRUE' if val else 'FALSE') + ' ' elif key == 'time_limit': diff --git a/gklearn/ged/util/util.py b/gklearn/ged/util/util.py index c41ca86..7032345 100644 --- a/gklearn/ged/util/util.py +++ b/gklearn/ged/util/util.py @@ -46,7 +46,7 @@ def compute_ged(g1, g2, options): return dis, pi_forward, pi_backward -def compute_geds(graphs, options={}, parallel=False, verbose=True): +def compute_geds(graphs, options={}, sort=True, parallel=False, verbose=True): # initialize ged env. ged_env = gedlibpy.GEDEnv() ged_env.set_edit_cost(options['edit_cost'], edit_cost_constant=options['edit_cost_constants']) @@ -79,7 +79,7 @@ def compute_geds(graphs, options={}, parallel=False, verbose=True): G_graphs = graphs_toshare G_ged_env = ged_env_toshare G_listID = listID_toshare - do_partial = partial(_wrapper_compute_ged_parallel, neo_options) + do_partial = partial(_wrapper_compute_ged_parallel, neo_options, sort) pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(graphs, ged_env, listID)) if verbose: iterator = tqdm(pool.imap_unordered(do_partial, itr, chunksize), @@ -108,25 +108,31 @@ def compute_geds(graphs, options={}, parallel=False, verbose=True): for i in iterator: # for i in range(len(graphs)): for j in range(i + 1, len(graphs)): - dis, pi_forward, pi_backward = _compute_ged(ged_env, listID[i], listID[j], graphs[i], graphs[j]) + if nx.number_of_nodes(graphs[i]) <= nx.number_of_nodes(graphs[j]) or not sort: + dis, pi_forward, pi_backward = _compute_ged(ged_env, listID[i], listID[j], graphs[i], graphs[j]) + else: + dis, pi_backward, pi_forward = _compute_ged(ged_env, listID[j], listID[i], graphs[j], graphs[i]) ged_vec.append(dis) ged_mat[i][j] = dis ged_mat[j][i] = dis - n_eo_tmp = get_nb_edit_operations(graphs[i], graphs[j], pi_forward, pi_backward, **neo_options) + n_eo_tmp = get_nb_edit_operations(graphs[i], graphs[j], pi_forward, pi_backward, **neo_options) n_edit_operations.append(n_eo_tmp) - + return ged_vec, ged_mat, n_edit_operations -def _wrapper_compute_ged_parallel(options, itr): +def _wrapper_compute_ged_parallel(options, sort, itr): i = itr[0] j = itr[1] - dis, n_eo_tmp = _compute_ged_parallel(G_ged_env, G_listID[i], G_listID[j], G_graphs[i], G_graphs[j], options) + dis, n_eo_tmp = _compute_ged_parallel(G_ged_env, G_listID[i], G_listID[j], G_graphs[i], G_graphs[j], options, sort) return i, j, dis, n_eo_tmp -def _compute_ged_parallel(env, gid1, gid2, g1, g2, options): - dis, pi_forward, pi_backward = _compute_ged(env, gid1, gid2, g1, g2) +def _compute_ged_parallel(env, gid1, gid2, g1, g2, options, sort): + if nx.number_of_nodes(g1) <= nx.number_of_nodes(g2) or not sort: + dis, pi_forward, pi_backward = _compute_ged(env, gid1, gid2, g1, g2) + else: + dis, pi_backward, pi_forward = _compute_ged(env, gid2, gid1, g2, g1) n_eo_tmp = get_nb_edit_operations(g1, g2, pi_forward, pi_backward, **options) # [0,0,0,0,0,0] return dis, n_eo_tmp diff --git a/gklearn/preimage/experiments/tools/analyze_results_of_random_edit_costs.py b/gklearn/preimage/experiments/tools/analyze_results_of_random_edit_costs.py index 4dc20d3..bbde39e 100644 --- a/gklearn/preimage/experiments/tools/analyze_results_of_random_edit_costs.py +++ b/gklearn/preimage/experiments/tools/analyze_results_of_random_edit_costs.py @@ -82,5 +82,10 @@ def compute_for_all_experiments(data_dir): if __name__ == '__main__': # data_dir = '../results/xp_median_preimage.update_order/' - data_dir = '../../results/CRIANN/xp_median_preimage.init10/' - compute_for_all_experiments(data_dir) \ No newline at end of file + root_dir_tnz = '../../results/CRIANN/xp_median_preimage.init10/' + root_dir_ntnz = '../../results/CRIANN/xp_median_preimage.init10.no_triangle_rule/' + root_dir_tz = '../../results/CRIANN/xp_median_preimage.init10.triangle_rule.allow_zeros/' + root_dir_ntz = '../../results/CRIANN/xp_median_preimage.init10.no_triangle_rule.allow_zeros/' + data_dirs = [root_dir_tnz, root_dir_ntnz, root_dir_tz, root_dir_ntz] + for data_dir in data_dirs: + compute_for_all_experiments(data_dir) \ No newline at end of file diff --git a/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py b/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py index 9af5828..9d7809d 100644 --- a/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py +++ b/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py @@ -2958,18 +2958,6 @@ if __name__ == "__main__": # #### xp 7_1: MUTAG, StructuralSP, using CONSTANT. xp_median_preimage_7_1() -# #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. - xp_median_preimage_8_2() - -# #### xp 8_3: Monoterpenoides, Treelet, using CONSTANT. - xp_median_preimage_8_3() - -# #### xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. - xp_median_preimage_8_4() - -# #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. - xp_median_preimage_8_1() - # #### xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. xp_median_preimage_9_2() @@ -2999,6 +2987,18 @@ if __name__ == "__main__": # #### xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. xp_median_preimage_6_1() + +# #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + xp_median_preimage_8_2() + +# #### xp 8_3: Monoterpenoides, Treelet, using CONSTANT. + xp_median_preimage_8_3() + +# #### xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. + xp_median_preimage_8_4() + +# #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. + xp_median_preimage_8_1() # # #### xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. xp_median_preimage_2_1() diff --git a/gklearn/preimage/kernel_knn_cv.py b/gklearn/preimage/kernel_knn_cv.py index 2faf4ba..3e5e88b 100644 --- a/gklearn/preimage/kernel_knn_cv.py +++ b/gklearn/preimage/kernel_knn_cv.py @@ -151,7 +151,7 @@ def __kernel_knn_cv_median(dataset_all, ds_name, knn_options, mpg_options, kerne # write result summary for each letter. if save_results: f_summary = open(dir_save + fn_output_summary, 'a') - for i, median_type in enumerate('set-median', 'gen median', 'gen median uo'): + for i, median_type in enumerate(['set-median', 'gen median', 'gen median uo']): csv.writer(f_summary).writerow([ds_name, kernel_options['name'], train_examples + ': ' + median_type, knn_options['n_neighbors'], From dff2c8449e805117c4038f0721edb0a31dcbcfd2 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Tue, 26 May 2020 15:57:28 +0200 Subject: [PATCH 14/17] Update setup.py. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0d7fbba..932002c 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ setuptools.setup( version="0.2b1", author="Linlin Jia", author_email="linlin.jia@insa-rouen.fr", - description="A Python library for graph kernels based on linear patterns", + description="A Python library for graph kernels, graph edit distances, and graph pre-images", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/jajupmochi/graphkit-learn", From 3bbab5506986cafb16770a2357d199a44306e93d Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Wed, 27 May 2020 17:13:03 +0200 Subject: [PATCH 15/17] Package cvxpy cannot be installed from wheel, remove it from PyPI setup temporally. --- requirements.txt | 3 ++- requirements_pypi.txt | 11 +++++++++++ setup.py | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 requirements_pypi.txt diff --git a/requirements.txt b/requirements.txt index 47a91a1..24d6efe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ networkx>=2.2 scikit-learn>=0.20.0 tabulate>=0.8.2 tqdm>=4.26.0 -cvxpy>=1.0.31 # for preimage. +cvxpy>=1.0.31 # for preimage. Does not work for "pip install graphkit-learn". +# -e https://files.pythonhosted.org/packages/11/d0/d900870dc2d02ea74961b90c353666c6528a33ea61a10aa59a0d5574ae59/cvxpy-1.0.31.tar.gz # for preimage. cvxopt>=1.2.5 # for preimage. mosek>=9.2.5; python_version >= '3.6' # for preimage. diff --git a/requirements_pypi.txt b/requirements_pypi.txt new file mode 100644 index 0000000..f4854fc --- /dev/null +++ b/requirements_pypi.txt @@ -0,0 +1,11 @@ +numpy>=1.16.2 +scipy>=1.1.0 +matplotlib>=3.0.0 +networkx>=2.2 +scikit-learn>=0.20.0 +tabulate>=0.8.2 +tqdm>=4.26.0 +# cvxpy>=1.0.31 # for preimage. Does not work for "pip install graphkit-learn". +# -e https://files.pythonhosted.org/packages/11/d0/d900870dc2d02ea74961b90c353666c6528a33ea61a10aa59a0d5574ae59/cvxpy-1.0.31.tar.gz # for preimage. +cvxopt>=1.2.5 # for preimage. +mosek>=9.2.5; python_version >= '3.6' # for preimage. diff --git a/setup.py b/setup.py index 932002c..a84679e 100644 --- a/setup.py +++ b/setup.py @@ -3,12 +3,12 @@ import setuptools with open("README.md", "r") as fh: long_description = fh.read() -with open('requirements.txt') as fp: +with open('requirements_pypi.txt') as fp: install_requires = fp.read() setuptools.setup( name="graphkit-learn", - version="0.2b1", + version="0.2b2", author="Linlin Jia", author_email="linlin.jia@insa-rouen.fr", description="A Python library for graph kernels, graph edit distances, and graph pre-images", From 9adaebb680837c2e2f4cd746886db93a47a650ae Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Wed, 27 May 2020 17:14:33 +0200 Subject: [PATCH 16/17] Add xp: remove the best graph from median set. --- .../experiments/xp_1nn_init10_trianglerule.py | 360 ++++++++++++++++++ gklearn/preimage/kernel_knn_cv.py | 3 +- gklearn/preimage/remove_best_graph.py | 423 +++++++++++++++++++++ gklearn/preimage/utils.py | 4 +- 4 files changed, 787 insertions(+), 3 deletions(-) create mode 100644 gklearn/preimage/remove_best_graph.py diff --git a/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py b/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py index 9d7809d..d23e119 100644 --- a/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py +++ b/gklearn/preimage/experiments/xp_1nn_init10_trianglerule.py @@ -23,6 +23,344 @@ update_order = False test_sizes = [0.9, 0.7] # , 0.5, 0.3, 0.1] +def xp_median_preimage_15_1(): + """xp 15_1: AIDS, StructuralSP, using CONSTANT, symbolic only. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'AIDS' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + irrelevant_labels = {'node_attrs': ['chem', 'charge', 'x', 'y']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_15_2(): + """xp 15_2: AIDS, PathUpToH, using CONSTANT, symbolic only. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'AIDS' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'PathUpToH', + 'depth': 1, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + irrelevant_labels = {'node_attrs': ['chem', 'charge', 'x', 'y']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_15_3(): + """xp 15_3: AIDS, Treelet, using CONSTANT, symbolic only. + """ + for test_size in test_sizes: + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'AIDS' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + pkernel = functools.partial(polynomialkernel, d=1, c=1e+2) + kernel_options = {'name': 'Treelet', # + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + irrelevant_labels = {'node_attrs': ['chem', 'charge', 'x', 'y']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_15_4(): + """xp 15_4: AIDS, WeisfeilerLehman, using CONSTANT, symbolic only. + """ + for test_size in test_sizes: + # set parameters. + ds_name = 'AIDS' # + knn_options = {'n_neighbors': 1, + 'n_splits': 30, + 'test_size': test_size, + 'verbose': True} + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'allow_zeros': allow_zeros, + 'triangle_rule': triangle_rule, + 'verbose': 1} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 10, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 0} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 1, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + irrelevant_labels = {'node_attrs': ['chem', 'charge', 'x', 'y']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('knn_options:', knn_options) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + +# # compute gram matrices for each class a priori. +# print('Compute gram matrices for each class a priori.') +# compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for train_examples in ['k-graphs', 'expert', 'random', 'best-dataset', 'trainset']: + print('\n-------------------------------------') + print('train examples used:', train_examples, '\n') + mpg_options['fit_method'] = train_examples + try: + kernel_knn_cv(ds_name, train_examples, knn_options, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + def xp_median_preimage_14_1(): """xp 14_1: DD, PathUpToH, using CONSTANT. """ @@ -2915,7 +3253,17 @@ if __name__ == "__main__": #### xp 14_1: DD, PathUpToH, using CONSTANT. # xp_median_preimage_14_1() +# #### xp 15_1: AIDS, StructuralSP, using CONSTANT, symbolic only. + # xp_median_preimage_15_1() + +# #### xp 15_2: AIDS, PathUpToH, using CONSTANT, symbolic only. + # xp_median_preimage_15_2() +# #### xp 15_3: AIDS, Treelet, using CONSTANT, symbolic only. + # xp_median_preimage_15_3() + +# #### xp 15_4: AIDS, WeisfeilerLehman, using CONSTANT, symbolic only. + # xp_median_preimage_15_4() @@ -2999,6 +3347,18 @@ if __name__ == "__main__": # #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. xp_median_preimage_8_1() + + # #### xp 15_1: AIDS, StructuralSP, using CONSTANT, symbolic only. + xp_median_preimage_15_1() + +# #### xp 15_2: AIDS, PathUpToH, using CONSTANT, symbolic only. + xp_median_preimage_15_2() + +# #### xp 15_3: AIDS, Treelet, using CONSTANT, symbolic only. + xp_median_preimage_15_3() + +# #### xp 15_4: AIDS, WeisfeilerLehman, using CONSTANT, symbolic only. + xp_median_preimage_15_4() # # #### xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. xp_median_preimage_2_1() diff --git a/gklearn/preimage/kernel_knn_cv.py b/gklearn/preimage/kernel_knn_cv.py index 3e5e88b..073fa31 100644 --- a/gklearn/preimage/kernel_knn_cv.py +++ b/gklearn/preimage/kernel_knn_cv.py @@ -361,7 +361,8 @@ def __get_gram_matrix(load_gm, dir_save, ds_name, kernel_options, dataset_all): gram_matrix_unnorm, time_precompute_gm = __compute_gram_matrix_unnorm(dataset_all, kernel_options) np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm=gram_matrix_unnorm, run_time=time_precompute_gm) else: - gmfile = np.load() + gm_fname = dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm.npz' + gmfile = np.load(gm_fname, allow_pickle=True) gram_matrix_unnorm = gmfile['gram_matrix_unnorm'] time_precompute_gm = float(gmfile['run_time']) diff --git a/gklearn/preimage/remove_best_graph.py b/gklearn/preimage/remove_best_graph.py new file mode 100644 index 0000000..d6be2a6 --- /dev/null +++ b/gklearn/preimage/remove_best_graph.py @@ -0,0 +1,423 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Wen May 27 14:27:15 2020 + +@author: ljia +""" +import numpy as np +import csv +import os +import os.path +from gklearn.utils import Dataset +from gklearn.preimage import MedianPreimageGenerator +from gklearn.utils import normalize_gram_matrix +from gklearn.utils import split_dataset_by_target +from gklearn.preimage.utils import compute_k_dis +from gklearn.utils.graphfiles import saveGXL +import networkx as nx + + +def remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=True, save_medians=True, plot_medians=True, load_gm='auto', dir_save='', irrelevant_labels=None, edge_required=False, cut_range=None): + """Remove the best graph from the median set w.r.t. distance in kernel space, and to see if it is possible to generate the removed graph using the graphs left in the median set. + """ + # 1. get dataset. + print('1. getting dataset...') + dataset_all = Dataset() + dataset_all.load_predefined_dataset(ds_name) + dataset_all.trim_dataset(edge_required=edge_required) + if irrelevant_labels is not None: + dataset_all.remove_labels(**irrelevant_labels) + if cut_range is not None: + dataset_all.cut_graphs(cut_range) + datasets = split_dataset_by_target(dataset_all) + + if save_results: + # create result files. + print('creating output files...') + fn_output_detail, fn_output_summary = __init_output_file(ds_name, kernel_options['name'], mpg_options['fit_method'], dir_save) + else: + fn_output_detail, fn_output_summary = None, None + + # 2. compute/load Gram matrix a priori. + print('2. computing/loading Gram matrix...') + gram_matrix_unnorm_list, time_precompute_gm_list = __get_gram_matrix(load_gm, dir_save, ds_name, kernel_options, datasets) + + sod_sm_list = [] + sod_gm_list = [] + dis_k_sm_list = [] + dis_k_gm_list = [] + dis_k_gi_min_list = [] + time_optimize_ec_list = [] + time_generate_list = [] + time_total_list = [] + itrs_list = [] + converged_list = [] + num_updates_ecc_list = [] + mge_decrease_order_list = [] + mge_increase_order_list = [] + mge_converged_order_list = [] + nb_sod_sm2gm = [0, 0, 0] + nb_dis_k_sm2gm = [0, 0, 0] + nb_dis_k_gi2sm = [0, 0, 0] + nb_dis_k_gi2gm = [0, 0, 0] + dis_k_max_list = [] + dis_k_min_list = [] + dis_k_mean_list = [] + best_dis_list = [] + print('starting experiment for each class of target...') + idx_offset = 0 + for idx, dataset in enumerate(datasets): + target = dataset.targets[0] + print('\ntarget =', target, '\n') +# if target != 1: +# continue + + num_graphs = len(dataset.graphs) + if num_graphs < 2: + print('\nnumber of graphs = ', num_graphs, ', skip.\n') + idx_offset += 1 + continue + + # 3. get the best graph and remove it from median set. + print('3. getting and removing the best graph...') + gram_matrix_unnorm = gram_matrix_unnorm_list[idx - idx_offset] + best_index, best_dis, best_graph = __get_best_graph([g.copy() for g in dataset.graphs], normalize_gram_matrix(gram_matrix_unnorm.copy())) + median_set_new = [dataset.graphs[i] for i in range(len(dataset.graphs)) if i != best_index] + num_graphs -= 1 + if num_graphs == 1: + continue + best_dis_list.append(best_dis) + + dataset.load_graphs(median_set_new, targets=None) + gram_matrix_unnorm_new = np.delete(gram_matrix_unnorm, best_index, axis=0) + gram_matrix_unnorm_new = np.delete(gram_matrix_unnorm_new, best_index, axis=1) + + # 4. set parameters. + print('4. initializing mpg and setting parameters...') + mpg_options['gram_matrix_unnorm'] = gram_matrix_unnorm_new + mpg_options['runtime_precompute_gm'] = time_precompute_gm_list[idx - idx_offset] + mpg = MedianPreimageGenerator() + mpg.dataset = dataset + mpg.set_options(**mpg_options.copy()) + mpg.kernel_options = kernel_options.copy() + mpg.ged_options = ged_options.copy() + mpg.mge_options = mge_options.copy() + + # 5. compute median preimage. + print('5. computing median preimage...') + mpg.run() + results = mpg.get_results() + + # 6. compute pairwise kernel distances. + print('6. computing pairwise kernel distances...') + _, dis_k_max, dis_k_min, dis_k_mean = mpg.graph_kernel.compute_distance_matrix() + dis_k_max_list.append(dis_k_max) + dis_k_min_list.append(dis_k_min) + dis_k_mean_list.append(dis_k_mean) + + # 7. save results (and median graphs). + print('7. saving results (and median graphs)...') + # write result detail. + if save_results: + print('writing results to files...') + sod_sm2gm = get_relations(np.sign(results['sod_gen_median'] - results['sod_set_median'])) + dis_k_sm2gm = get_relations(np.sign(results['k_dis_gen_median'] - results['k_dis_set_median'])) + dis_k_gi2sm = get_relations(np.sign(results['k_dis_set_median'] - results['k_dis_dataset'])) + dis_k_gi2gm = get_relations(np.sign(results['k_dis_gen_median'] - results['k_dis_dataset'])) + + f_detail = open(dir_save + fn_output_detail, 'a') + csv.writer(f_detail).writerow([ds_name, kernel_options['name'], + ged_options['edit_cost'], ged_options['method'], + ged_options['attr_distance'], mpg_options['fit_method'], + num_graphs, target, 1, + results['sod_set_median'], results['sod_gen_median'], + results['k_dis_set_median'], results['k_dis_gen_median'], + results['k_dis_dataset'], best_dis, best_index, + sod_sm2gm, dis_k_sm2gm, + dis_k_gi2sm, dis_k_gi2gm, results['edit_cost_constants'], + results['runtime_precompute_gm'], results['runtime_optimize_ec'], + results['runtime_generate_preimage'], results['runtime_total'], + results['itrs'], results['converged'], + results['num_updates_ecc'], + results['mge']['num_decrease_order'] > 0, # @todo: not suitable for multi-start mge + results['mge']['num_increase_order'] > 0, + results['mge']['num_converged_descents'] > 0]) + f_detail.close() + + # compute result summary. + sod_sm_list.append(results['sod_set_median']) + sod_gm_list.append(results['sod_gen_median']) + dis_k_sm_list.append(results['k_dis_set_median']) + dis_k_gm_list.append(results['k_dis_gen_median']) + dis_k_gi_min_list.append(results['k_dis_dataset']) + time_precompute_gm_list.append(results['runtime_precompute_gm']) + time_optimize_ec_list.append(results['runtime_optimize_ec']) + time_generate_list.append(results['runtime_generate_preimage']) + time_total_list.append(results['runtime_total']) + itrs_list.append(results['itrs']) + converged_list.append(results['converged']) + num_updates_ecc_list.append(results['num_updates_ecc']) + mge_decrease_order_list.append(results['mge']['num_decrease_order'] > 0) + mge_increase_order_list.append(results['mge']['num_increase_order'] > 0) + mge_converged_order_list.append(results['mge']['num_converged_descents'] > 0) + # # SOD SM -> GM + if results['sod_set_median'] > results['sod_gen_median']: + nb_sod_sm2gm[0] += 1 + # repeats_better_sod_sm2gm.append(1) + elif results['sod_set_median'] == results['sod_gen_median']: + nb_sod_sm2gm[1] += 1 + elif results['sod_set_median'] < results['sod_gen_median']: + nb_sod_sm2gm[2] += 1 + # # dis_k SM -> GM + if results['k_dis_set_median'] > results['k_dis_gen_median']: + nb_dis_k_sm2gm[0] += 1 + # repeats_better_dis_k_sm2gm.append(1) + elif results['k_dis_set_median'] == results['k_dis_gen_median']: + nb_dis_k_sm2gm[1] += 1 + elif results['k_dis_set_median'] < results['k_dis_gen_median']: + nb_dis_k_sm2gm[2] += 1 + # # dis_k gi -> SM + if results['k_dis_dataset'] > results['k_dis_set_median']: + nb_dis_k_gi2sm[0] += 1 + # repeats_better_dis_k_gi2sm.append(1) + elif results['k_dis_dataset'] == results['k_dis_set_median']: + nb_dis_k_gi2sm[1] += 1 + elif results['k_dis_dataset'] < results['k_dis_set_median']: + nb_dis_k_gi2sm[2] += 1 + # # dis_k gi -> GM + if results['k_dis_dataset'] > results['k_dis_gen_median']: + nb_dis_k_gi2gm[0] += 1 + # repeats_better_dis_k_gi2gm.append(1) + elif results['k_dis_dataset'] == results['k_dis_gen_median']: + nb_dis_k_gi2gm[1] += 1 + elif results['k_dis_dataset'] < results['k_dis_gen_median']: + nb_dis_k_gi2gm[2] += 1 + + # write result summary for each letter. + f_summary = open(dir_save + fn_output_summary, 'a') + csv.writer(f_summary).writerow([ds_name, kernel_options['name'], + ged_options['edit_cost'], ged_options['method'], + ged_options['attr_distance'], mpg_options['fit_method'], + num_graphs, target, + results['sod_set_median'], results['sod_gen_median'], + results['k_dis_set_median'], results['k_dis_gen_median'], + results['k_dis_dataset'], best_dis, best_index, + sod_sm2gm, dis_k_sm2gm, + dis_k_gi2sm, dis_k_gi2gm, + results['runtime_precompute_gm'], results['runtime_optimize_ec'], + results['runtime_generate_preimage'], results['runtime_total'], + results['itrs'], results['converged'], + results['num_updates_ecc'], + results['mge']['num_decrease_order'] > 0, # @todo: not suitable for multi-start mge + results['mge']['num_increase_order'] > 0, + results['mge']['num_converged_descents'] > 0, + nb_sod_sm2gm, + nb_dis_k_sm2gm, nb_dis_k_gi2sm, nb_dis_k_gi2gm]) + f_summary.close() + + # save median graphs. + if save_medians: + if not os.path.exists(dir_save + 'medians/'): + os.makedirs(dir_save + 'medians/') + print('Saving median graphs to files...') + fn_pre_sm = dir_save + 'medians/set_median.' + mpg_options['fit_method'] + '.nbg' + str(num_graphs) + '.y' + str(target) + '.repeat' + str(1) + saveGXL(mpg.set_median, fn_pre_sm + '.gxl', method='default', + node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, edge_attrs=dataset.edge_attrs) + fn_pre_gm = dir_save + 'medians/gen_median.' + mpg_options['fit_method'] + '.nbg' + str(num_graphs) + '.y' + str(target) + '.repeat' + str(1) + saveGXL(mpg.gen_median, fn_pre_gm + '.gxl', method='default', + node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, edge_attrs=dataset.edge_attrs) + fn_best_dataset = dir_save + 'medians/g_best_dataset.' + mpg_options['fit_method'] + '.nbg' + str(num_graphs) + '.y' + str(target) + '.repeat' + str(1) + saveGXL(best_graph, fn_best_dataset + '.gxl', method='default', + node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, edge_attrs=dataset.edge_attrs) + fn_best_median_set = dir_save + 'medians/g_best_median_set.' + mpg_options['fit_method'] + '.nbg' + str(num_graphs) + '.y' + str(target) + '.repeat' + str(1) + saveGXL(mpg.best_from_dataset, fn_best_median_set + '.gxl', method='default', + node_labels=dataset.node_labels, edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, edge_attrs=dataset.edge_attrs) + + # plot median graphs. + if plot_medians and save_medians: + if ged_options['edit_cost'] == 'LETTER2' or ged_options['edit_cost'] == 'LETTER' or ds_name == 'Letter-high' or ds_name == 'Letter-med' or ds_name == 'Letter-low': + draw_Letter_graph(mpg.set_median, fn_pre_sm) + draw_Letter_graph(mpg.gen_median, fn_pre_gm) + draw_Letter_graph(mpg.best_from_dataset, fn_best_dataset) + + # write result summary for each letter. + if save_results: + sod_sm_mean = np.mean(sod_sm_list) + sod_gm_mean = np.mean(sod_gm_list) + dis_k_sm_mean = np.mean(dis_k_sm_list) + dis_k_gm_mean = np.mean(dis_k_gm_list) + dis_k_gi_min_mean = np.mean(dis_k_gi_min_list) + best_dis_mean = np.mean(best_dis_list) + time_precompute_gm_mean = np.mean(time_precompute_gm_list) + time_optimize_ec_mean = np.mean(time_optimize_ec_list) + time_generate_mean = np.mean(time_generate_list) + time_total_mean = np.mean(time_total_list) + itrs_mean = np.mean(itrs_list) + num_converged = np.sum(converged_list) + num_updates_ecc_mean = np.mean(num_updates_ecc_list) + num_mge_decrease_order = np.sum(mge_decrease_order_list) + num_mge_increase_order = np.sum(mge_increase_order_list) + num_mge_converged = np.sum(mge_converged_order_list) + sod_sm2gm_mean = get_relations(np.sign(sod_gm_mean - sod_sm_mean)) + dis_k_sm2gm_mean = get_relations(np.sign(dis_k_gm_mean - dis_k_sm_mean)) + dis_k_gi2sm_mean = get_relations(np.sign(dis_k_sm_mean - dis_k_gi_min_mean)) + dis_k_gi2gm_mean = get_relations(np.sign(dis_k_gm_mean - dis_k_gi_min_mean)) + f_summary = open(dir_save + fn_output_summary, 'a') + csv.writer(f_summary).writerow([ds_name, kernel_options['name'], + ged_options['edit_cost'], ged_options['method'], + ged_options['attr_distance'], mpg_options['fit_method'], + num_graphs, 'all', + sod_sm_mean, sod_gm_mean, dis_k_sm_mean, dis_k_gm_mean, + dis_k_gi_min_mean, best_dis_mean, '-', + sod_sm2gm_mean, dis_k_sm2gm_mean, + dis_k_gi2sm_mean, dis_k_gi2gm_mean, + time_precompute_gm_mean, time_optimize_ec_mean, + time_generate_mean, time_total_mean, itrs_mean, + num_converged, num_updates_ecc_mean, + num_mge_decrease_order, num_mge_increase_order, + num_mge_converged]) + f_summary.close() + + # save total pairwise kernel distances. + dis_k_max = np.max(dis_k_max_list) + dis_k_min = np.min(dis_k_min_list) + dis_k_mean = np.mean(dis_k_mean_list) + print('The maximum pairwise distance in kernel space:', dis_k_max) + print('The minimum pairwise distance in kernel space:', dis_k_min) + print('The average pairwise distance in kernel space:', dis_k_mean) + + print('\ncomplete.\n') + + +def __get_best_graph(Gn, gram_matrix): + k_dis_list = [] + for idx in range(len(Gn)): + k_dis_list.append(compute_k_dis(idx, range(0, len(Gn)), [1 / len(Gn)] * len(Gn), gram_matrix, withterm3=False)) + best_index = np.argmin(k_dis_list) + best_dis = k_dis_list[best_index] + best_graph = Gn[best_index].copy() + return best_index, best_dis, best_graph + + +def get_relations(sign): + if sign == -1: + return 'better' + elif sign == 0: + return 'same' + elif sign == 1: + return 'worse' + + +def __get_gram_matrix(load_gm, dir_save, ds_name, kernel_options, datasets): + if load_gm == 'auto': + gm_fname = dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm.npz' + gmfile_exist = os.path.isfile(os.path.abspath(gm_fname)) + if gmfile_exist: + gmfile = np.load(gm_fname, allow_pickle=True) # @todo: may not be safe. + gram_matrix_unnorm_list = [item for item in gmfile['gram_matrix_unnorm_list']] + time_precompute_gm_list = gmfile['run_time_list'].tolist() + else: + gram_matrix_unnorm_list = [] + time_precompute_gm_list = [] + for dataset in datasets: + gram_matrix_unnorm, time_precompute_gm = __compute_gram_matrix_unnorm(dataset, kernel_options) + gram_matrix_unnorm_list.append(gram_matrix_unnorm) + time_precompute_gm_list.append(time_precompute_gm) + np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm_list=gram_matrix_unnorm_list, run_time_list=time_precompute_gm_list) + elif not load_gm: + gram_matrix_unnorm_list = [] + time_precompute_gm_list = [] + for dataset in datasets: + gram_matrix_unnorm, time_precompute_gm = __compute_gram_matrix_unnorm(dataset, kernel_options) + gram_matrix_unnorm_list.append(gram_matrix_unnorm) + time_precompute_gm_list.append(time_precompute_gm) + np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm_list=gram_matrix_unnorm_list, run_time_list=time_precompute_gm_list) + else: + gm_fname = dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm.npz' + gmfile = np.load(gm_fname, allow_pickle=True) # @todo: may not be safe. + gram_matrix_unnorm_list = [item for item in gmfile['gram_matrix_unnorm_list']] + time_precompute_gm_list = gmfile['run_time_list'].tolist() + + return gram_matrix_unnorm_list, time_precompute_gm_list + + +def __get_graph_kernel(dataset, kernel_options): + from gklearn.utils.utils import get_graph_kernel_by_name + graph_kernel = get_graph_kernel_by_name(kernel_options['name'], + node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, + edge_attrs=dataset.edge_attrs, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + kernel_options=kernel_options) + return graph_kernel + + +def __compute_gram_matrix_unnorm(dataset, kernel_options): + from gklearn.utils.utils import get_graph_kernel_by_name + graph_kernel = get_graph_kernel_by_name(kernel_options['name'], + node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, + edge_attrs=dataset.edge_attrs, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + kernel_options=kernel_options) + + gram_matrix, run_time = graph_kernel.compute(dataset.graphs, **kernel_options) + gram_matrix_unnorm = graph_kernel.gram_matrix_unnorm + + return gram_matrix_unnorm, run_time + + +def __init_output_file(ds_name, gkernel, fit_method, dir_output): + if not os.path.exists(dir_output): + os.makedirs(dir_output) + fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.csv' + f_detail = open(dir_output + fn_output_detail, 'a') + csv.writer(f_detail).writerow(['dataset', 'graph kernel', 'edit cost', + 'GED method', 'attr distance', 'fit method', 'num graphs', + 'target', 'repeat', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', + 'min dis_k gi', 'best kernel dis', 'best graph index', + 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', + 'dis_k gi -> GM', 'edit cost constants', 'time precompute gm', + 'time optimize ec', 'time generate preimage', 'time total', + 'itrs', 'converged', 'num updates ecc', 'mge decrease order', + 'mge increase order', 'mge converged']) + f_detail.close() + + fn_output_summary = 'results_summary.' + ds_name + '.' + gkernel + '.csv' + f_summary = open(dir_output + fn_output_summary, 'a') + csv.writer(f_summary).writerow(['dataset', 'graph kernel', 'edit cost', + 'GED method', 'attr distance', 'fit method', 'num graphs', + 'target', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', + 'min dis_k gi', 'best kernel dis', 'best graph index', + 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', + 'dis_k gi -> GM', 'time precompute gm', 'time optimize ec', + 'time generate preimage', 'time total', 'itrs', 'num converged', + 'num updates ecc', 'mge num decrease order', 'mge num increase order', + 'mge num converged', '# SOD SM -> GM', '# dis_k SM -> GM', + '# dis_k gi -> SM', '# dis_k gi -> GM']) + f_summary.close() + + return fn_output_detail, fn_output_summary + + +#Dessin median courrant +def draw_Letter_graph(graph, file_prefix): + import matplotlib + matplotlib.use('agg') + import matplotlib.pyplot as plt + plt.figure() + pos = {} + for n in graph.nodes: + pos[n] = np.array([float(graph.nodes[n]['x']),float(graph.nodes[n]['y'])]) + nx.draw_networkx(graph, pos) + plt.savefig(file_prefix + '.eps', format='eps', dpi=300) +# plt.show() + plt.clf() + plt.close() \ No newline at end of file diff --git a/gklearn/preimage/utils.py b/gklearn/preimage/utils.py index 55e1e9e..5ca0c1e 100644 --- a/gklearn/preimage/utils.py +++ b/gklearn/preimage/utils.py @@ -82,14 +82,14 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged gram_matrix_unnorm_list = [] time_precompute_gm_list = [] else: + gm_fname = dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm.npz' gmfile = np.load(gm_fname, allow_pickle=True) # @todo: may not be safe. gram_matrix_unnorm_list = [item for item in gmfile['gram_matrix_unnorm_list']] time_precompute_gm_list = gmfile['run_time_list'].tolist() # repeats_better_sod_sm2gm = [] # repeats_better_dis_k_sm2gm = [] # repeats_better_dis_k_gi2sm = [] -# repeats_better_dis_k_gi2gm = [] - +# repeats_better_dis_k_gi2gm = [] print('starting generating preimage for each class of target...') idx_offset = 0 From 7e3da6b0bc97a800f20c587748d689c5836e32b4 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Wed, 27 May 2020 17:19:11 +0200 Subject: [PATCH 17/17] Add xp script: remove the best graph from median set. --- .../experiments/xp_remove_best_graph_init10.py | 3085 ++++++++++++++++++++ 1 file changed, 3085 insertions(+) create mode 100644 gklearn/preimage/experiments/xp_remove_best_graph_init10.py diff --git a/gklearn/preimage/experiments/xp_remove_best_graph_init10.py b/gklearn/preimage/experiments/xp_remove_best_graph_init10.py new file mode 100644 index 0000000..8b722ae --- /dev/null +++ b/gklearn/preimage/experiments/xp_remove_best_graph_init10.py @@ -0,0 +1,3085 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Jan 14 15:39:29 2020 + +@author: ljia +""" +import multiprocessing +import functools +import sys +import os +import logging +from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct +from gklearn.preimage.remove_best_graph import remove_best_graph +from gklearn.utils import compute_gram_matrices_by_class + + +dir_root = '../results/xp_remove_best_graph.init10/' +num_random = 10 +initial_solutions = 10 + + +def xp_median_preimage_15_1(): + """xp 15_1: AIDS, StructuralSP, using CONSTANT, symbolic only. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'AIDS' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['chem', 'charge', 'x', 'y']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_15_2(): + """xp 15_2: AIDS, PathUpToH, using CONSTANT, symbolic only. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'AIDS' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 1, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['chem', 'charge', 'x', 'y']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_15_3(): + """xp 15_3: AIDS, Treelet, using CONSTANT, symbolic only. + """ + for update_order in [True, False]: + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'AIDS' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(polynomialkernel, d=1, c=1e+2) + kernel_options = {'name': 'Treelet', # + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['chem', 'charge', 'x', 'y']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_15_4(): + """xp 15_4: AIDS, WeisfeilerLehman, using CONSTANT, symbolic only. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'AIDS' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 10, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['chem', 'charge', 'x', 'y']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + +# # compute gram matrices for each class a priori. +# print('Compute gram matrices for each class a priori.') +# compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_14_1(): + """xp 14_1: DD, PathUpToH, using CONSTANT. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'DD' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 2, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # # compute gram matrices for each class a priori. + # print('Compute gram matrices for each class a priori.') + # compute_gram_matrices_by_class(ds_name, kernel_options, save_results=save_results, dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_13_1(): + """xp 13_1: PAH, StructuralSP, using NON_SYMBOLIC. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'PAH' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_13_2(): + """xp 13_2: PAH, ShortestPath, using NON_SYMBOLIC. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'PAH' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') # + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: # + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_1(): + """xp 12_1: PAH, StructuralSP, using NON_SYMBOLIC, unlabeled. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'PAH' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 0, 1, 1, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_2(): + """xp 12_2: PAH, PathUpToH, using CONSTANT, unlabeled. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'PAH' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 1, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_3(): + """xp 12_3: PAH, Treelet, using CONSTANT, unlabeled. + """ + from gklearn.utils.kernels import gaussiankernel + for update_order in [True, False]: + # set parameters. + ds_name = 'PAH' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(gaussiankernel, gamma=None) # @todo + kernel_options = {'name': 'Treelet', # + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_4(): + """xp 12_4: PAH, WeisfeilerLehman, using CONSTANT, unlabeled. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'PAH' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 14, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # # compute gram matrices for each class a priori. + # print('Compute gram matrices for each class a priori.') + # compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_12_5(): + """xp 12_5: PAH, ShortestPath, using NON_SYMBOLIC, unlabeled. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'PAH' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 0, 1, 1, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.unlabeled/' + ('update_order/' if update_order else '') # + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: # + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_9_1(): + """xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'MAO' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_9_2(): + """xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'MAO' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 9, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_9_3(): + """xp 9_3: MAO, Treelet, using CONSTANT, symbolic only. + """ + for update_order in [True, False]: + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'MAO' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(polynomialkernel, d=4, c=1e+7) + kernel_options = {'name': 'Treelet', # + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_9_4(): + """xp 9_4: MAO, WeisfeilerLehman, using CONSTANT, symbolic only. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'MAO' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 6, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.symb/' + ('update_order/' if update_order else '') + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + +# # compute gram matrices for each class a priori. +# print('Compute gram matrices for each class a priori.') +# compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_8_1(): + """xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Monoterpenoides' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_8_2(): + """xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Monoterpenoides' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 7, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_8_3(): + """xp 8_3: Monoterpenoides, Treelet, using CONSTANT. + """ + for update_order in [True, False]: + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'Monoterpenoides' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(polynomialkernel, d=2, c=1e+5) + kernel_options = {'name': 'Treelet', + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_8_4(): + """xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Monoterpenoides' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 4, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_7_1(): + """xp 7_1: MUTAG, StructuralSP, using CONSTANT. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'MUTAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_7_2(): + """xp 7_2: MUTAG, PathUpToH, using CONSTANT. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'MUTAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 2, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required, cut_range=None) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_7_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_7_3(): + """xp 7_3: MUTAG, Treelet, using CONSTANT. + """ + for update_order in [True, False]: + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'MUTAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(polynomialkernel, d=3, c=1e+8) + kernel_options = {'name': 'Treelet', + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_7_4(): + """xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'MUTAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 1, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_6_1(): + """xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'COIL-RAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_6_1:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_6_2(): + """xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'COIL-RAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_6_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_5_1(): + """xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'FRANKENSTEIN' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_4_1(): + """xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'COLORS-3' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'NON_SYMBOLIC', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_3_2(): + """xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Fingerprint' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.01, 0.125, 0.125], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_3_1(): + """xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Fingerprint' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.01, 0.125, 0.125], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # + edge_required = False # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_2_1(): + """xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'COIL-DEL' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '.node_attrs/' + ('update_order/' if update_order else '') + irrelevant_labels = {'edge_labels': ['valence']} + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + +# # compute gram matrices for each class a priori. +# print('Compute gram matrices for each class a priori.') +# compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels) + except Exception as exp: + print('An exception occured when running this experiment:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_1_1(): + """xp 1_1: Letter-high, StructuralSP. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Letter-high' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_1_1:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_1_2(): + """xp 1_2: Letter-high, ShortestPath. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Letter-high' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_1_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_10_1(): + """xp 10_1: Letter-med, StructuralSP. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Letter-med' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_10_1:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_10_2(): + """xp 10_2: Letter-med, ShortestPath. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Letter-med' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_10_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_11_1(): + """xp 11_1: Letter-low, StructuralSP. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Letter-low' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_11_1:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +def xp_median_preimage_11_2(): + """xp 11_2: Letter-low, ShortestPath. + """ + for update_order in [True, False]: + # set parameters. + ds_name = 'Letter-low' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': initial_solutions, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 0, + 'verbose': 2, + 'update_order': update_order, + 'randomness': 'REAL', + 'refine': False} + save_results = True + dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/' + ('update_order/' if update_order else '') + irrelevant_labels = None # + edge_required = True # + + if not os.path.exists(dir_save): + os.makedirs(dir_save) + file_output = open(dir_save + 'output.txt', 'a') + sys.stdout = file_output + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * num_random: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + try: + remove_best_graph(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + except Exception as exp: + print('An exception occured when running experiment on xp_median_preimage_11_2:') + LOG_FILENAME = dir_save + 'error.txt' + logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) + logging.exception('') + print(repr(exp)) + + +if __name__ == "__main__": + +# #### xp 1_1: Letter-high, StructuralSP. + # xp_median_preimage_1_1() + +# #### xp 1_2: Letter-high, ShortestPath. + # xp_median_preimage_1_2() + +# #### xp 10_1: Letter-med, StructuralSP. + # xp_median_preimage_10_1() + +# #### xp 10_2: Letter-med, ShortestPath. + # xp_median_preimage_10_2() + +# #### xp 11_1: Letter-low, StructuralSP. + # xp_median_preimage_11_1() + +# #### xp 11_2: Letter-low, ShortestPath. + # xp_median_preimage_11_2() +# +# #### xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. +# # xp_median_preimage_2_1() +# +# #### xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. +# # xp_median_preimage_3_1() + +# #### xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. + # xp_median_preimage_3_2() + +# #### xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. +# # xp_median_preimage_4_1() +# +# #### xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. +# # xp_median_preimage_5_1() +# +# #### xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. + # xp_median_preimage_6_1() + +# #### xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. + # xp_median_preimage_6_2() + +# #### xp 7_1: MUTAG, StructuralSP, using CONSTANT. + # xp_median_preimage_7_1() + +# #### xp 7_2: MUTAG, PathUpToH, using CONSTANT. + # xp_median_preimage_7_2() + +# #### xp 7_3: MUTAG, Treelet, using CONSTANT. + # xp_median_preimage_7_3() + +# #### xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT. + # xp_median_preimage_7_4() +# +# #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. + # xp_median_preimage_8_1() + +# #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + # xp_median_preimage_8_2() + +# #### xp 8_3: Monoterpenoides, Treelet, using CONSTANT. + # xp_median_preimage_8_3() + +# #### xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. + # xp_median_preimage_8_4() + +# #### xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. + # xp_median_preimage_9_1() + +# #### xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. + # xp_median_preimage_9_2() + +# #### xp 9_3: MAO, Treelet, using CONSTANT, symbolic only. + # xp_median_preimage_9_3() + +# #### xp 9_4: MAO, WeisfeilerLehman, using CONSTANT, symbolic only. + # xp_median_preimage_9_4() + + #### xp 12_1: PAH, StructuralSP, using NON_SYMBOLIC, unlabeled. + # xp_median_preimage_12_1() + + #### xp 12_2: PAH, PathUpToH, using CONSTANT, unlabeled. + # xp_median_preimage_12_2() + + #### xp 12_3: PAH, Treelet, using CONSTANT, unlabeled. + # xp_median_preimage_12_3() + + #### xp 12_4: PAH, WeisfeilerLehman, using CONSTANT, unlabeled. + # xp_median_preimage_12_4() + + #### xp 12_5: PAH, ShortestPath, using NON_SYMBOLIC, unlabeled. + # xp_median_preimage_12_5() + + #### xp 13_1: PAH, StructuralSP, using NON_SYMBOLIC. + # xp_median_preimage_13_1() + + #### xp 13_2: PAH, ShortestPath, using NON_SYMBOLIC. +# xp_median_preimage_13_2() + + #### xp 14_1: DD, PathUpToH, using CONSTANT. +# xp_median_preimage_14_1() + +# #### xp 15_1: AIDS, StructuralSP, using CONSTANT, symbolic only. + # xp_median_preimage_15_1() + +# #### xp 15_2: AIDS, PathUpToH, using CONSTANT, symbolic only. + # xp_median_preimage_15_2() + +# #### xp 15_3: AIDS, Treelet, using CONSTANT, symbolic only. + # xp_median_preimage_15_3() + +# #### xp 15_4: AIDS, WeisfeilerLehman, using CONSTANT, symbolic only. + # xp_median_preimage_15_4() + + + + + + + +# #### xp 7_2: MUTAG, PathUpToH, using CONSTANT. + xp_median_preimage_7_2() + +# #### xp 7_3: MUTAG, Treelet, using CONSTANT. + xp_median_preimage_7_3() + +# #### xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT. + xp_median_preimage_7_4() +# +# #### xp 7_1: MUTAG, StructuralSP, using CONSTANT. + xp_median_preimage_7_1() + +# #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + xp_median_preimage_8_2() + +# #### xp 8_3: Monoterpenoides, Treelet, using CONSTANT. + xp_median_preimage_8_3() + +# #### xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. + xp_median_preimage_8_4() + +# #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. + xp_median_preimage_8_1() + +# #### xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. + xp_median_preimage_9_2() + +# #### xp 9_3: MAO, Treelet, using CONSTANT, symbolic only. + xp_median_preimage_9_3() + +# #### xp 9_4: MAO, WeisfeilerLehman, using CONSTANT, symbolic only. + xp_median_preimage_9_4() + +# #### xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. + xp_median_preimage_9_1() + + #### xp 12_1: PAH, StructuralSP, using NON_SYMBOLIC, unlabeled. + xp_median_preimage_12_1() + + #### xp 12_2: PAH, PathUpToH, using CONSTANT, unlabeled. + xp_median_preimage_12_2() + + #### xp 12_3: PAH, Treelet, using CONSTANT, unlabeled. + xp_median_preimage_12_3() + + #### xp 12_4: PAH, WeisfeilerLehman, using CONSTANT, unlabeled. + xp_median_preimage_12_4() + + #### xp 12_5: PAH, ShortestPath, using NON_SYMBOLIC, unlabeled. + xp_median_preimage_12_5() + +# #### xp 1_1: Letter-high, StructuralSP. + xp_median_preimage_1_1() + +# #### xp 1_2: Letter-high, ShortestPath. + xp_median_preimage_1_2() + +# #### xp 10_1: Letter-med, StructuralSP. + xp_median_preimage_10_1() + +# #### xp 10_2: Letter-med, ShortestPath. + xp_median_preimage_10_2() + +# #### xp 11_1: Letter-low, StructuralSP. + xp_median_preimage_11_1() + +# #### xp 11_2: Letter-low, ShortestPath. + xp_median_preimage_11_2() + + #### xp 13_1: PAH, StructuralSP, using NON_SYMBOLIC. + xp_median_preimage_13_1() + + #### xp 13_2: PAH, ShortestPath, using NON_SYMBOLIC. + xp_median_preimage_13_2() + +# #### xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. + xp_median_preimage_6_1() + + # #### xp 15_1: AIDS, StructuralSP, using CONSTANT, symbolic only. + xp_median_preimage_15_1() + +# #### xp 15_2: AIDS, PathUpToH, using CONSTANT, symbolic only. + xp_median_preimage_15_2() + +# #### xp 15_3: AIDS, Treelet, using CONSTANT, symbolic only. + xp_median_preimage_15_3() + +# #### xp 15_4: AIDS, WeisfeilerLehman, using CONSTANT, symbolic only. + xp_median_preimage_15_4() +# +# #### xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. + xp_median_preimage_2_1() +# +# #### xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. +# # xp_median_preimage_3_1() + +# #### xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. + # xp_median_preimage_3_2() + +# #### xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. +# # xp_median_preimage_4_1() +# +# #### xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. +# # xp_median_preimage_5_1() +# +# #### xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. + # xp_median_preimage_6_2() + + #### xp 14_1: DD, PathUpToH, using CONSTANT. +# xp_median_preimage_14_1()