|
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- Created on Mon Jun 1 11:37:57 2020
-
- @author: ljia
- """
- import multiprocessing
- import numpy as np
- import networkx as nx
- import os
- from gklearn.preimage import RandomPreimageGenerator
- from gklearn.utils import Dataset
-
-
- dir_root = '../results/xp_random_preimage_generation/'
-
-
- def xp_random_preimage_generation():
- """
- Experiment similar to the one in Bakir's paper. A test to check if RandomPreimageGenerator class works correctly.
-
- Returns
- -------
- None.
-
- """
- alpha1_list = np.linspace(0, 1, 11)
- k_dis_datasets = []
- k_dis_preimages = []
- preimages = []
- bests_from_dataset = []
- for alpha1 in alpha1_list:
- print('alpha1 =', alpha1, ':\n')
- # set parameters.
- ds_name = 'MUTAG'
- rpg_options = {'k': 5,
- 'r_max': 10, #
- 'l': 500,
- 'alphas': None,
- 'parallel': True,
- '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': 0}
- edge_required = True
- irrelevant_labels = {'edge_labels': ['label_0']}
- cut_range = None
-
- # create/get Gram matrix.
- dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/'
- if not os.path.exists(dir_save):
- os.makedirs(dir_save)
- 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 = gmfile['run_time']
-
- # 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)
-
- # add two "random" graphs.
- g1 = nx.Graph()
- g1.add_nodes_from(range(0, 16), label_0='0')
- g1.add_nodes_from(range(16, 25), label_0='1')
- g1.add_node(25, label_0='2')
- g1.add_nodes_from([26, 27], label_0='3')
- g1.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (5, 0), (4, 9), (12, 3), (10, 13), (13, 14), (14, 15), (15, 8), (0, 16), (1, 17), (2, 18), (12, 19), (11, 20), (13, 21), (15, 22), (7, 23), (6, 24), (14, 25), (25, 26), (25, 27)])
- g2 = nx.Graph()
- g2.add_nodes_from(range(0, 12), label_0='0')
- g2.add_nodes_from(range(12, 19), label_0='1')
- g2.add_nodes_from([19, 20, 21], label_0='2')
- g2.add_nodes_from([22, 23], label_0='3')
- g2.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 19), (19, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 20), (20, 7), (5, 0), (4, 8), (0, 12), (1, 13), (2, 14), (9, 15), (10, 16), (11, 17), (6, 18), (3, 21), (21, 22), (21, 23)])
- dataset_all.load_graphs([g1, g2] + dataset_all.graphs, targets=None)
-
- # 2. initialize rpg and setting parameters.
- print('2. initializing rpg and setting parameters...')
- nb_graphs = len(dataset_all.graphs) - 2
- rpg_options['alphas'] = [alpha1, 1 - alpha1] + [0] * nb_graphs
- if gmfile_exist:
- rpg_options['gram_matrix_unnorm'] = gram_matrix_unnorm
- rpg_options['runtime_precompute_gm'] = time_precompute_gm
- rpg = RandomPreimageGenerator()
- rpg.dataset = dataset_all
- rpg.set_options(**rpg_options.copy())
- rpg.kernel_options = kernel_options.copy()
-
- # 3. compute preimage.
- print('3. computing preimage...')
- rpg.run()
- results = rpg.get_results()
- k_dis_datasets.append(results['k_dis_dataset'])
- k_dis_preimages.append(results['k_dis_preimage'])
- bests_from_dataset.append(rpg.best_from_dataset)
- preimages.append(rpg.preimage)
-
- # 4. save results.
- # write Gram matrices to file.
- if not gmfile_exist:
- np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm=rpg.gram_matrix_unnorm, run_time=results['runtime_precompute_gm'])
-
- print('\ncomplete.\n')
-
- return k_dis_datasets, k_dis_preimages, bests_from_dataset, preimages
-
-
- if __name__ == '__main__':
- k_dis_datasets, k_dis_preimages, bests_from_dataset, preimages = xp_random_preimage_generation()
|