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.

graphfiles.py 4.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. """ Utilities function to manage graph files
  2. """
  3. def loadCT(filename):
  4. import networkx as nx
  5. """load data from .ct file.
  6. Notes
  7. ------
  8. a typical example of data in .ct is like this:
  9. 3 2 <- number of nodes and edges
  10. 0.0000 0.0000 0.0000 C <- each line describes a node (x,y,z + label)
  11. 0.0000 0.0000 0.0000 C
  12. 0.0000 0.0000 0.0000 O
  13. 1 3 1 1 <- each line describes an edge : to, from,?, label
  14. 2 3 1 1
  15. """
  16. from os.path import basename
  17. content = open(filename).read().splitlines()
  18. g = nx.Graph(name=str(content[0]), filename=basename(filename)) # set name of the graph
  19. tmp = content[1].split(" ")
  20. if tmp[0] == '':
  21. nb_nodes = int(tmp[1]) # number of the nodes
  22. nb_edges = int(tmp[2]) # number of the edges
  23. else:
  24. nb_nodes = int(tmp[0])
  25. nb_edges = int(tmp[1])
  26. for i in range(0, nb_nodes):
  27. tmp = content[i + 2].split(" ")
  28. tmp = [x for x in tmp if x != '']
  29. g.add_node(i, label=tmp[3])
  30. for i in range(0, nb_edges):
  31. tmp = content[i + g.number_of_nodes() + 2]
  32. tmp = [tmp[i:i+3] for i in range(0, len(tmp), 3)]
  33. g.add_edge(int(tmp[0]) - 1, int(tmp[1]) - 1, label=int(tmp[3]))
  34. return g
  35. def loadGXL(filename):
  36. from os.path import basename
  37. import networkx as nx
  38. import xml.etree.ElementTree as ET
  39. tree = ET.parse(filename)
  40. root = tree.getroot()
  41. index = 0
  42. g = nx.Graph(filename=basename(filename), name=root[0].attrib['id'])
  43. dic = {}
  44. for node in root.iter('node'):
  45. label = node.find('attr')[0].text # Take only one attribute
  46. dic[node.attrib['id']] = index
  47. g.add_node(index, id=node.attrib['id'], label=label)
  48. index += 1
  49. for edge in root.iter('edge'):
  50. label = edge.find('attr')[0].text
  51. g.add_edge(dic[edge.attrib['from']], dic[edge.attrib['to']], label=label)
  52. return g
  53. def saveGXL(graph, filename):
  54. import xml.etree.ElementTree as ET
  55. root_node = ET.Element('gxl')
  56. attr = dict()
  57. attr['id'] = graph.graph['name']
  58. attr['edgeids'] = 'true'
  59. attr['edgemode'] = 'undirected'
  60. graph_node = ET.SubElement(root_node, 'graph', attrib=attr)
  61. for v in graph:
  62. current_node = ET.SubElement(graph_node, 'node', attrib={'id' : str(v)})
  63. for attr in graph.nodes[v].keys():
  64. #hard fix : force to chem before taking into account genericity
  65. # must be attr instead of label
  66. label = 'chem'
  67. cur_attr = ET.SubElement(current_node, 'attr', attrib={'name' : label})
  68. cur_value = ET.SubElement(cur_attr,graph.nodes[v][attr].__class__.__name__)
  69. cur_value.text = graph.nodes[v][attr]
  70. for v1 in graph:
  71. for v2 in graph[v1]:
  72. if(v1 < v2): #Non oriented graphs
  73. cur_edge = ET.SubElement(graph_node, 'edge', attrib={'from' : str(v1),
  74. 'to' : str(v2)})
  75. for attr in graph[v1][v2].keys():
  76. #hard fix : force to chem before taking into account genericity
  77. # must be attr instead of label
  78. label = 'valence'
  79. cur_attr = ET.SubElement(cur_edge, 'attr', attrib={'name' : label})
  80. cur_value = ET.SubElement(cur_attr, graph[v1][v2][attr].__class__.__name__)
  81. cur_value.text = str(graph[v1][v2][attr])
  82. tree = ET.ElementTree(root_node)
  83. tree.write(filename)
  84. def loadDataset(filename):
  85. """load file list of the dataset.
  86. """
  87. from os.path import dirname, splitext
  88. dirname_dataset = dirname(filename)
  89. extension = splitext(filename)[1][1:]
  90. data = []
  91. y = []
  92. if extension == "ds":
  93. content = open(filename).read().splitlines()
  94. for i in range(0, len(content)):
  95. tmp = content[i].split(' ')
  96. data.append(loadCT(dirname_dataset + '/' + tmp[0].replace('#', '', 1))) # remove the '#'s in file names
  97. y.append(float(tmp[1]))
  98. elif(extension == "cxl"):
  99. import xml.etree.ElementTree as ET
  100. tree = ET.parse(filename)
  101. root = tree.getroot()
  102. data = []
  103. y = []
  104. for graph in root.iter('print'):
  105. mol_filename = graph.attrib['file']
  106. mol_class = graph.attrib['class']
  107. data.append(loadGXL(dirname_dataset + '/' + mol_filename))
  108. y.append(mol_class)
  109. return data, y

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