From 5f7a9ed0196865f07a00eaa50d04bbadd73b74fb Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Wed, 22 Apr 2020 18:04:53 +0200 Subject: [PATCH] Update MedianGraphEstimator: add __decrease_order() method. --- gklearn/ged/median/median_graph_estimator.py | 26 +++++++++++------------ gklearn/ged/median/test_median_graph_estimator.py | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/gklearn/ged/median/median_graph_estimator.py b/gklearn/ged/median/median_graph_estimator.py index 3a09d06..8d70f79 100644 --- a/gklearn/ged/median/median_graph_estimator.py +++ b/gklearn/ged/median/median_graph_estimator.py @@ -6,7 +6,7 @@ Created on Mon Mar 16 18:04:55 2020 @author: ljia """ import numpy as np -from gklearn.ged.env import AlgorithmState +from gklearn.ged.env import AlgorithmState, NodeMap from gklearn.ged.util import misc from gklearn.utils import Timer import time @@ -770,7 +770,7 @@ class MedianGraphEstimator(object): decreased_order = False # 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: # @todo + while self.__compute_best_deletion_delta(graphs, median, id_deleted_node) > -self.__epsilon: # @todo decreased_order = True self.__delete_node_from_median(id_deleted_node[0], median) @@ -790,13 +790,13 @@ class MedianGraphEstimator(object): # Compute cost delta. delta = 0.0 for graph_id, graph in graphs.items(): - k = self.__get_node_image_from_map(self.__node_maps_from_median[graph_id], i) + k = self.__node_maps_from_median[graph_id].image(i) if k == np.inf: delta -= self.__node_del_cost else: delta += self.__node_ins_cost - self.__ged_env.get_node_rel_cost(median.nodes[i], graph.nodes[k]) for j, j_label in median[i].items(): - l = self.__get_node_image_from_map(self.__node_maps_from_median[graph_id], j) + l = self.__node_maps_from_median[graph_id].image(j) if k == np.inf or l == np.inf: delta -= self.__edge_del_cost elif not graph.has_edge(k, l): @@ -813,25 +813,25 @@ class MedianGraphEstimator(object): return best_delta - def __delete_node_from_median(self, id_deleted_node, median): # @todo: update env.node_map? + def __delete_node_from_median(self, id_deleted_node, median): # Update the median. median.remove_node(id_deleted_node) # Update the node maps. - for _, node_map in self.__node_maps_from_median.items(): - new_node_map = [] # @todo - is_unassigned_target_node = [True] * len(node_map) + 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)): if i != id_deleted_node: new_i = (i if i < id_deleted_node else i - 1) - k = self.__get_node_image_from_map(node_map, i) - new_node_map.append((new_i, k)) # @todo + k = node_map.image(i) + new_node_map.add_assignment(new_i, k) if k != np.inf: is_unassigned_target_node[k] = False - for k in range(0, len(node_map)): + for k in range(0, node_map.num_target_nodes()): if is_unassigned_target_node[k]: - new_node_map.append(np.inf, k) - node_map = new_node_map # @todo + new_node_map.add_assignment(np.inf, k) + self.__node_maps_from_median[key] = new_node_map # Increase overall number of decreases. self.__num_decrease_order += 1 diff --git a/gklearn/ged/median/test_median_graph_estimator.py b/gklearn/ged/median/test_median_graph_estimator.py index b251f3b..f92d854 100644 --- a/gklearn/ged/median/test_median_graph_estimator.py +++ b/gklearn/ged/median/test_median_graph_estimator.py @@ -56,7 +56,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 FALSE --refine FALSE'# @todo: std::to_string(rng()) + mge_options += ' --random-inits ' + str(num_inits) + ' --seed ' + '1' + ' --update-order TRUE --refine FALSE'# @todo: std::to_string(rng()) # Select the GED algorithm. algo_options = '--threads ' + str(threads) + algo_options_suffix