Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.87 KB | None | 0 0
  1. import csv
  2. import json
  3.  
  4. class Vertex(object):
  5. def __init__(self, value=None,lat=None,long=None):
  6. self.__value = value
  7. self.__edges = [] #List of edge keys connected to vertex
  8. self.__lat = lat
  9. self.__long = long
  10.  
  11. def getValue(self):
  12. return self.__value
  13.  
  14. def setValue(self,value):
  15. self.__value = value
  16.  
  17. def getEdges(self):
  18. return self.__edges
  19.  
  20. def addEdge(self,name):
  21. self.__edges.append(name)
  22.  
  23. def removeEdge(self,name):
  24. self.__edges.remove(name)
  25.  
  26. def getLat(self):
  27. return self.__lat
  28.  
  29. def setLat(self,lat):
  30. self.__lat = lat
  31.  
  32. def getLong(self):
  33. return self.__long
  34.  
  35. def setLong(self,long):
  36. self.__long = long
  37.  
  38. class Edge(object):
  39. def __init__(self,sA,sB,value=None,weight=None):
  40. self.__vertices=[sA,sB] #keys of two vertices
  41. self.__value=value
  42. self.__weight=weight
  43.  
  44. def getVertices(self):
  45. #Returns keys of vertices
  46. return self.__vertices
  47.  
  48. def getValue(self):
  49. return self.__value
  50.  
  51. def setValue(self):
  52. self.__value = value
  53.  
  54. def getWeight(self):
  55. return self.__weight
  56.  
  57. def setWeight(self):
  58. self.__weight = weight
  59.  
  60. class Graph(object):
  61. def __init__(self):
  62. #Creates empty graph
  63. self.__graphDict = {} #Dict of all vertices
  64. self.__graphEdges = {} # empty dict of all edges
  65.  
  66. def getVertices(self):
  67. #returns dict of all vertices
  68. return self.__graphDict
  69.  
  70. def getVerticesList(self):
  71. #returns list of the keys of the vertices
  72. return list(self.__graphDict.keys())
  73.  
  74. def getVertex(self,key):
  75. #returns object of vertex at given key
  76. if key in self.__graphDict:
  77. return self.__graphDict[key]
  78. else: #If vertex does not exist
  79. raise KeyError('Vertex "'+key+'" does not exist')
  80.  
  81. def getEdges(self,vertex=None):
  82. #retruns dict of edges of a vertex, if no vertex given returns all
  83. if vertex == None:
  84. return self.__graphEdges
  85. else:
  86. if vertex in self.__graphDict:
  87. keys = self.__graphDict[vertex].getEdges() #Gets list of keys from vertex object
  88. out = {}
  89. for key in keys: #Adds object of edges for each key to output dict
  90. out[key] = self.__graphEdges[key]
  91. return out
  92. else: #If vertex does not exist
  93. raise KeyError('Vertex "'+vertex+'" does not exist')
  94.  
  95. def getEdgesList(self,vertex=None):
  96. #returns list of keys of edges of vertex, if no vertex given returns all
  97. if vertex==None:
  98. return list(self.__graphEdges.keys())
  99. else:
  100. if vertex in self.__graphDict:
  101. return self.__graphDict[vertex].getEdges() #Gets list of keys from vertex object
  102. else: #If vertex does not exist
  103. raise KeyError('Vertex "'+vertex+'" does not exist')
  104.  
  105. def getNeighbours(self,vertex):
  106. #returns list of neighbours of vertex
  107. edges = self.__graphDict[vertex].getEdges()
  108. output = [] #Empty list of neighbours
  109. for key in edges:
  110. edge = self.__graphEdges[key]
  111. vertices = edge.getVertices() #Get keys of edge
  112. if vertices[0] != vertex: #Checks which is not source
  113. output.append(vertices[0])
  114. else:
  115. output.append(vertices[1])
  116. return output
  117.  
  118. def isAdjacent(self,one,two):
  119. #Returns True if adjacent
  120. neigh = self.getNeighbours(one)
  121. if two in neigh:
  122. return True
  123. else:
  124. return False
  125.  
  126. def addVertex(self,name,value=None,lat=None,long=None):
  127. #Adds an empty vertex to the graph
  128. if name in self.__graphDict: #If vertex already exists
  129. raise NameError('Vertex already exists')
  130. else:
  131. self.__graphDict[name] = Vertex(value,lat,long)
  132.  
  133. def removeVertex(self,vertex):
  134. #Removes vertex and connected edges
  135. # Removes edges
  136. edges = self.getNeighbours(vertex)
  137. for key in edges:
  138. removeEdge(vertex,key)
  139. self.__graphDict.pop(vertex) #Removes vertex
  140.  
  141. def addEdge(self, sa, sb,value=None,weight=None):
  142. if sa in self.__graphDict and sb in self.__graphDict: #Check if vertices exist
  143. name = (str(sa)+'-'+str(sb)) #Creates key in format vertex1-vertex2
  144. edge = Edge(sa, sb,value,weight) #Creates edge
  145. self.__graphEdges[name]=edge #Adds edge to general dictionary
  146. self.__graphDict[sa].addEdge(name) #Adds edge key to vertex1
  147. self.__graphDict[sb].addEdge(name) #Adds edge key to vertex2
  148. elif sa in self.__graphDict:
  149. raise KeyError('Vertex '+sb+' does not exist')
  150. elif sb in self.__graphDict:
  151. raise KeyError('Vertex '+sa+' does not exist')
  152. else:
  153. raise KeyError('Vertices '+sa+' and '+sb+' do not exist')
  154.  
  155. def removeEdge(self, sa, sb):
  156. if sa in self.__graphDict and sb in self.__graphDict: #Check if vertices exist
  157. name = (str(sa)+'-'+str(sb)) #Creates key in format vertex1-vertex2
  158. self.__graphEdges.pop(name) #Remove edge from general dictionary
  159. self.__graphDict[sa].removeEdge(name) #Removes edge key to vertex1
  160. self.__graphDict[sb].removeEdge(name) #Removes edge key to vertex2
  161. elif sa in self.__graphDict:
  162. raise KeyError('Vertex '+sb+' does not exist')
  163. elif sb in self.__graphDict:
  164. raise KeyError('Vertex '+sa+' does not exist')
  165. else:
  166. raise KeyError('Vertices '+sa+' and '+sb+' do not exist')
  167.  
  168.  
  169.  
  170. def readStations(graph,file):
  171. csvfile = open(file)
  172. reader = csv.DictReader(csvfile)
  173. for row in reader:
  174. name = row['station'].lower()
  175. name = name.replace(" ", "_")
  176. graph.addVertex(name,row['station'],row['latitude'],row['longitude'])
  177. return graph
  178.  
  179. def readConnections(graph,file):
  180. csvfile = open(file)
  181. reader = csv.DictReader(csvfile)
  182. for row in reader:
  183. sa = row['Station 1'].lower()
  184. sa = sa.replace(" ", "_")
  185. sb = row['Station 2'].lower()
  186. sb = sb.replace(" ", "_")
  187. value = row['Line']
  188. weight = row['time']
  189. graph.addEdge(sa,sb,value,weight)
  190. return graph
  191.  
  192. underground=Graph() #Creates empty graph
  193.  
  194. #Adds stations and connections
  195. underground=readStations(underground,'London_Underground_Stations.csv')
  196. underground=readConnections(underground,'London_Underground_Connections.csv')
  197.  
  198. #print(underground.isAdjacent('paddington','royal_oak'))
  199.  
  200. '''
  201. underground.addVertex('baker_street','Baker Street',51.5226,-0.1571)
  202. underground.addVertex('marylebone','Marylebone',51.5225,-0.1631)
  203. print(underground.getVertices())
  204. underground.addEdge('baker_street','marylebone','Bakerloo Line',1)
  205. print(underground.getEdges('marylebone')['baker_street-marylebone'].getVertices())
  206. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement