myGraph.py 2.16 KB
class Graph:
	"""
	docstring for graph
	"""
	def __init__(self):
		"""
		use 0,1, 2, 3 as vertices
		and label the vertices using their variable name
		"""
		self.vertices = []
		self.edges = {}  #from key to value (parent -> child)
		self.parents = {} #the parents of the key, no label
		self.edge_labelling = {}
		self.vertice_labelling = {}


	def add_edge(self, start, end, label = None):
		if label == None:
			for s, e in zip(start, end):
				self.edges[s].append(e)
				self.parents[e].append(s)
		else:
			for s, e, l in zip(start, end, label):
				self.edges[s].append(e)
				self.parents[e].append(s)
				self.edge_labelling[(s, e)] = l




	def add_vertice(self, vertice, label = None):
		if label == None:
			for v in vertice:
				self.vertices.append(v)
				self.edges[v] = []
				self.parents[v] = []
		else:
			for v, l in zip(vertice, label):
				self.vertices.append(v)
				self.vertice_labelling[v] = l
				self.edges[v] = []
				self.parents[v] = []




	def delete_verrtice(self, vertice):
		pass

	def delete_edge(self, start, end):
		pass

	def ford_bellman(self, s):
		"""
		input s is a vertice
		output is a dict
		Bellman Ford algorithm to calculate the shortest distance
		"""
		D = {}
		inf = len(self.vertices)

		for x in self.vertices:
			if x in self.edges[s]:
				D[x] = 1
			else:
				D[x] = inf

		D[s] = 0

		for i in xrange(len(self.vertices) - 2):
			for v in self.vertices:
				if v != s:
					for u in self.vertices:
						if v in self.edges[u]:
							D[v] = min(D[v], D[u] + 1)

		return D


	def avg_dist(self):
		s = 0
		for v in self.vertices:
			s += sum(self.ford_bellman(v).values())
		return s * 1.0 / (len(self.vertices) ** 2 - len(self.vertices))

	def make_undirected(self):
		for v in self.vertices:
			for w in self.vertices:
				if (w in self.edges[v]) and (not v in self.edges[w]):
					self.edges[w].append(v)




	def fromParents(self, verts, pars):
		"""
		add edges whose parents have been given
		"""

		self.vertices = []
		for v in verts:
			self.add_vertice(v)
			self.edges[v] = []

		for v, par in zip(verts, pars):
			for p in par:
				self.add_edge(p, v)


	def num_edges(self):
		return sum(map(len, self.edges.values()))