You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

xp_random_preimage_generation.py 4.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Mon Jun 1 11:37:57 2020
  5. @author: ljia
  6. """
  7. import multiprocessing
  8. import numpy as np
  9. import networkx as nx
  10. import os
  11. from gklearn.preimage import RandomPreimageGenerator
  12. from gklearn.utils import Dataset
  13. dir_root = '../results/xp_random_preimage_generation/'
  14. def xp_random_preimage_generation():
  15. """
  16. Experiment similar to the one in Bakir's paper. A test to check if RandomPreimageGenerator class works correctly.
  17. Returns
  18. -------
  19. None.
  20. """
  21. alpha1_list = np.linspace(0, 1, 11)
  22. k_dis_datasets = []
  23. k_dis_preimages = []
  24. preimages = []
  25. bests_from_dataset = []
  26. for alpha1 in alpha1_list:
  27. print('alpha1 =', alpha1, ':\n')
  28. # set parameters.
  29. ds_name = 'MUTAG'
  30. rpg_options = {'k': 5,
  31. 'r_max': 10, #
  32. 'l': 500,
  33. 'alphas': None,
  34. 'parallel': True,
  35. 'verbose': 2}
  36. kernel_options = {'name': 'PathUpToH',
  37. 'depth': 2, #
  38. 'k_func': 'MinMax', #
  39. 'compute_method': 'trie',
  40. 'parallel': 'imap_unordered',
  41. # 'parallel': None,
  42. 'n_jobs': multiprocessing.cpu_count(),
  43. 'normalize': True,
  44. 'verbose': 0}
  45. edge_required = True
  46. irrelevant_labels = {'edge_labels': ['label_0']}
  47. cut_range = None
  48. # create/get Gram matrix.
  49. dir_save = dir_root + ds_name + '.' + kernel_options['name'] + '/'
  50. if not os.path.exists(dir_save):
  51. os.makedirs(dir_save)
  52. gm_fname = dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm.npz'
  53. gmfile_exist = os.path.isfile(os.path.abspath(gm_fname))
  54. if gmfile_exist:
  55. gmfile = np.load(gm_fname, allow_pickle=True) # @todo: may not be safe.
  56. gram_matrix_unnorm = gmfile['gram_matrix_unnorm']
  57. time_precompute_gm = gmfile['run_time']
  58. # 1. get dataset.
  59. print('1. getting dataset...')
  60. dataset_all = Dataset()
  61. dataset_all.load_predefined_dataset(ds_name)
  62. dataset_all.trim_dataset(edge_required=edge_required)
  63. if irrelevant_labels is not None:
  64. dataset_all.remove_labels(**irrelevant_labels)
  65. if cut_range is not None:
  66. dataset_all.cut_graphs(cut_range)
  67. # add two "random" graphs.
  68. g1 = nx.Graph()
  69. g1.add_nodes_from(range(0, 16), label_0='0')
  70. g1.add_nodes_from(range(16, 25), label_0='1')
  71. g1.add_node(25, label_0='2')
  72. g1.add_nodes_from([26, 27], label_0='3')
  73. 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)])
  74. g2 = nx.Graph()
  75. g2.add_nodes_from(range(0, 12), label_0='0')
  76. g2.add_nodes_from(range(12, 19), label_0='1')
  77. g2.add_nodes_from([19, 20, 21], label_0='2')
  78. g2.add_nodes_from([22, 23], label_0='3')
  79. 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)])
  80. dataset_all.load_graphs([g1, g2] + dataset_all.graphs, targets=None)
  81. # 2. initialize rpg and setting parameters.
  82. print('2. initializing rpg and setting parameters...')
  83. nb_graphs = len(dataset_all.graphs) - 2
  84. rpg_options['alphas'] = [alpha1, 1 - alpha1] + [0] * nb_graphs
  85. if gmfile_exist:
  86. rpg_options['gram_matrix_unnorm'] = gram_matrix_unnorm
  87. rpg_options['runtime_precompute_gm'] = time_precompute_gm
  88. rpg = RandomPreimageGenerator()
  89. rpg.dataset = dataset_all
  90. rpg.set_options(**rpg_options.copy())
  91. rpg.kernel_options = kernel_options.copy()
  92. # 3. compute preimage.
  93. print('3. computing preimage...')
  94. rpg.run()
  95. results = rpg.get_results()
  96. k_dis_datasets.append(results['k_dis_dataset'])
  97. k_dis_preimages.append(results['k_dis_preimage'])
  98. bests_from_dataset.append(rpg.best_from_dataset)
  99. preimages.append(rpg.preimage)
  100. # 4. save results.
  101. # write Gram matrices to file.
  102. if not gmfile_exist:
  103. 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'])
  104. print('\ncomplete.\n')
  105. return k_dis_datasets, k_dis_preimages, bests_from_dataset, preimages
  106. if __name__ == '__main__':
  107. k_dis_datasets, k_dis_preimages, bests_from_dataset, preimages = xp_random_preimage_generation()

A Python package for graph kernels, graph edit distances and graph pre-image problem.