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.

graph_synthesizer.py 2.0 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Fri Sep 11 18:10:06 2020
  5. @author: ljia
  6. """
  7. import numpy as np
  8. import networkx as nx
  9. import random
  10. class GraphSynthesizer(object):
  11. def __init__(self, g_type=None, *args, **kwargs):
  12. if g_type == 'unified':
  13. self._graphs = self.unified_graphs(*args, *kwargs)
  14. else:
  15. self._graphs = None
  16. def random_graph(self, num_nodes, num_edges, num_node_labels=0, num_edge_labels=0, seed=None, directed=False, max_num_edges=None, all_edges=None):
  17. g = nx.Graph()
  18. if num_node_labels > 0:
  19. node_labels = np.random.randint(0, high=num_node_labels, size=num_nodes)
  20. for i in range(0, num_nodes):
  21. g.add_node(str(i), atom=node_labels[i]) # @todo: update "atom".
  22. else:
  23. for i in range(0, num_nodes):
  24. g.add_node(str(i))
  25. if num_edge_labels > 0:
  26. edge_labels = np.random.randint(0, high=num_edge_labels, size=num_edges)
  27. for idx, i in enumerate(random.sample(range(0, max_num_edges), num_edges)):
  28. node1, node2 = all_edges[i]
  29. g.add_edge(str(node1), str(node2), bond_type=edge_labels[idx]) # @todo: update "bond_type".
  30. else:
  31. for i in random.sample(range(0, max_num_edges), num_edges):
  32. node1, node2 = all_edges[i]
  33. g.add_edge(str(node1), str(node2))
  34. return g
  35. def unified_graphs(self, num_graphs=1000, num_nodes=20, num_edges=40, num_node_labels=0, num_edge_labels=0, seed=None, directed=False):
  36. max_num_edges = int((num_nodes - 1) * num_nodes / 2)
  37. if num_edges > max_num_edges:
  38. raise Exception('Too many edges.')
  39. all_edges = [(i, j) for i in range(0, num_nodes) for j in range(i + 1, num_nodes)] # @todo: optimize. No directed graphs.
  40. graphs = []
  41. for idx in range(0, num_graphs):
  42. graphs.append(self.random_graph(num_nodes, num_edges, num_node_labels=num_node_labels, num_edge_labels=num_edge_labels, seed=seed, directed=directed, max_num_edges=max_num_edges, all_edges=all_edges))
  43. return graphs
  44. @property
  45. def graphs(self):
  46. return self._graphs

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