Instructions
Requirements and Specifications
- Keeps track of the current number of edges in the graph.
- Keeps a 10x10 adjacency matrix using a 2-D NumPy array initially containing all zeros. The entries in the ith row and jth column and the jth row and ith column are set to 1 if an edge exists between node i and node j.
- Has a method add_edge() that takes two vertices (integers from 0-9) and sets the (i, j) and (j, i) entries of the adjacency matrix to 1 and updates the edge count.
- Has a method degree() that takes a vertex (an integer from 0-9) and returns its degree (the number of edges incident to that vertex) Your main() method should use a while loop to prompt a user to input an edge (a pair of integers from 0-9 separated by a space, ex: "3 8") until a user enters a "q" to quit the program. Each time a valid pair of vertices is entered by the user you should add the edge to the graph by updating the adjacency matrix and update its edge count. Once the user requests to exit the program, your code should output the degree of all vertices (including zeros for nodes that technically weren't inserted). Your code should also handle (raise and except) input errors in two ways using custom exception classes:
- If the user provides an integer that is not between 0 and 9, raise a "VertexOutOfBoundsException" and handle it by printing "Vertex out of bounds." and a 'pass' statement and prompt the user again.
- If the user provides a single integer, rather than a pair, raise a "SelfLoopException" and handle it by printing "Self-loops are not permitted." and a 'pass' statement and prompt the user again.
Source Code
import networkx as nx
import numpy as np
class VertexOutOfBoundsException(Exception):
pass
class SelfLoopException(Exception):
pass
class Graph(object):
def __init__(self):
self.size = 10
self.adj = np.zeros((self.size, self.size))
self.edge_count = np.zeros(self.size)
def add_edge(self, i, j):
if i < 0 or i >= self.size:
raise VertexOutOfBoundsException
if j < 0 or j >= self.size:
raise VertexOutOfBoundsException
if i == j:
raise SelfLoopException
if self.adj[i,j] == 0:
self.adj[i,j] = 1
self.adj[j,i] = 1
self.edge_count[i] += 1
self.edge_count[j] += 1
def degree(self, i):
if i < 0 or i >= self.size:
raise VertexOutOfBoundsException
return self.edge_count[i]
def __str__(self):
output = ''
for i in range(self.size):
output += 'Degree of vertex ' + str(i) + ': ' + str(self.degree(i)) + '\n'
return output
def main():
g = Graph()
while True:
s = input('Please, enter edge to add to graph: ')
parts = s.split(" ")
if parts[0].lower() == 'q':
break
try:
g.add_edge(int(parts[0]), int(parts[1]))
except VertexOutOfBoundsException:
print("Vertex out of bounds.")
pass
except SelfLoopException:
print("Self-loops are not permitted.")
pass
print(g)
if __name__ == "__main__":
main()