Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """A very basic general graph library."""
  3.  
  4. from __future__ import print_function
  5.  
  6. __all__ = ('Edge', 'Graph', 'Node')
  7.  
  8. import uuid
  9.  
  10.  
  11. class Edge:
  12. def __init__(self, v, w, value):
  13. self.v = v
  14. self.w = w
  15. self.value = value
  16.  
  17. def __repr__(self):
  18. return "Edge" + repr((self.v.label, self.w.label, self.value))
  19.  
  20.  
  21. class Node(dict):
  22. def __init__(self, label, *args, **kwargs):
  23. self.label = label
  24. self.id = uuid.uuid4()
  25. super().__init__(*args, **kwargs)
  26.  
  27. def __repr__(self):
  28. return 'Node(label={}, id={})'.format(self.label, self.id.hex)
  29.  
  30. def __eq__(self, other):
  31. return self.id == other.id
  32.  
  33. def __ne__(self, other):
  34. return self.id != other.id
  35.  
  36. def __hash__(self):
  37. return self.id.int
  38.  
  39.  
  40. class Graph(dict):
  41. def __init__(self, *args, **kwargs):
  42. self._edges = {}
  43. super().__init__(*args, **kwargs)
  44.  
  45. def add_node(self, node):
  46. label = (node.label if isinstance(node, Node) else node)
  47. if label in self:
  48. return self[label]
  49.  
  50. if not isinstance(node, Node):
  51. node = Node(node)
  52.  
  53. self[node.label] = node
  54. return node
  55.  
  56. def remove_node(self, node):
  57. if not isinstance(node, Node):
  58. node = self[node]
  59.  
  60. for edge in list(self.get_edges(node)):
  61. self.remove_edge(edge)
  62.  
  63. del self[node.label]
  64.  
  65. def add_edge(self, v, w=None, value=None):
  66. if isinstance(v, Edge):
  67. edge = v
  68. v = edge.v
  69. w = edge.w
  70. else:
  71. assert isinstance(v, Node)
  72. assert isinstance(w, Node)
  73. edge = Edge(v, w, value)
  74.  
  75. self._edges[(v.label, w.label)] = edge
  76. return edge
  77.  
  78. def remove_edge(self, edge, w=None):
  79. if not isinstance(edge, Edge):
  80. assert w is not None
  81. edge = self.get_edge(edge, w)
  82.  
  83. del self._edges[(edge.v.label, edge.w.label)]
  84.  
  85. def nodes(self):
  86. return self.values()
  87.  
  88. def edges(self):
  89. return self._edges.values()
  90.  
  91. def get_edge(self, v, w):
  92. try:
  93. return self._edges[(v.label if isinstance(v, Node) else v,
  94. w.label if isinstance(w, Node) else w)]
  95. except KeyError:
  96. return None
  97.  
  98. def get_edges(self, node, value=None):
  99. label = node.label if isinstance(node, Node) else node
  100. return (edge for key, edge in self._edges.items()
  101. if label in key and (value is None or edge.value == value))
  102.  
  103.  
  104. def main(args):
  105. from pprint import pformat
  106.  
  107. v = Node('Berlin')
  108. print("New node:", v)
  109. w = Node('Muenchen')
  110. print("New node:", w)
  111. x = Node('Hamburg')
  112. print("New node:", x)
  113. e = Edge(v, w, 2)
  114. print("New edge:", e)
  115. g = Graph()
  116. g.add_node(v)
  117. g.add_node(w)
  118. g.add_node(x)
  119. g.add_edge(e)
  120. g.add_edge(w, x, 3)
  121. g.add_edge(v, x, 1)
  122. print("Graph:", pformat(g))
  123. print("Get edge Berlin-Muenchen:", g.get_edge(v, w))
  124. print("Remove edge Berlin-Muenchen.")
  125. g.remove_edge(e)
  126. print("Graph nodes:", pformat(g.nodes()))
  127. print("Graph edges:", pformat(g.edges()))
  128. print("Nodes connected to 'Hamburg':", pformat([e.v for e in g.get_edges('Hamburg')]))
  129. print("Remove node Muenchen.")
  130. g.remove_node('Muenchen')
  131. print("Graph:", pformat(g))
  132.  
  133.  
  134. if __name__ == '__main__':
  135. import sys
  136. main(sys.argv[1:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement