def test_3prism(self): N = 6 G = Graph(N, False) edges = [ Edge(0, 1), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 5), Edge(0, 5), Edge(1, 4), Edge(2, 0), Edge(3, 5) ] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #print "3prism" algorithm = HalinNodeColoring(G, outer=set([0, 2, 3, 5])) #algorithm = HalinNodeColoring(G, outer=set([0, 1, 4, 5])) #algorithm = HalinNodeColoring(G, outer=set([1, 2, 3, 4])) algorithm.run() #print "3prism outer", algorithm.outer parent = {0: 1, 1: None, 2: 1, 3: 4, 4: 1, 5: 4} self.assertEqual(algorithm.parent, parent) for node in G.iternodes(): self.assertNotEqual(algorithm.color[node], None) for edge in G.iteredges(): self.assertNotEqual(algorithm.color[edge.source], algorithm.color[edge.target]) all_colors = set(algorithm.color[node] for node in G.iternodes()) self.assertEqual(len(all_colors), 3)
class TestStronglyConnectedComponents(unittest.TestCase): def setUp(self): self.N = 8 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(1, 4), Edge(4, 0), Edge(4, 5), Edge(1, 5), Edge(1, 2), Edge(5, 6), Edge(6, 5), Edge(2, 6), Edge(2, 3), Edge(3, 2), Edge(6, 7), Edge(3, 7)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() self.expected_scc = {0: 0, 1: 0, 2: 1, 3: 1, 4: 0, 5: 2, 6: 2, 7: 3} self.expected_n_scc = 4 def test_scc(self): algorithm = StronglyConnectedComponents(self.G) algorithm.run() self.assertEqual(algorithm.n_scc, self.expected_n_scc) self.assertEqual(algorithm.scc, self.expected_scc) self.assertRaises( ValueError, StronglyConnectedComponents, Graph(1, False)) def tearDown(self): pass
class TestMatching3(unittest.TestCase): def setUp(self): self.N = 6 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 5) ] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_matching(self): algorithm = BorieMatching(self.G) algorithm.run() expected1 = set([Edge(0, 1), Edge(2, 3), Edge(4, 5)]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.mate_set, expected1) # Testing matching. S = set() for edge in algorithm.mate_set: S.add(edge.source) S.add(edge.target) self.assertEqual(len(S), 2 * len(algorithm.mate_set)) def tearDown(self): pass
class TestMatchingWithWeights(unittest.TestCase): def setUp(self): # Graf pelny z kolejnymi wagami. self.N = 4 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [Edge(0, 1, 5), Edge(0, 2, 7), Edge(0, 3, 2), Edge(1, 2, 3), Edge(1, 3, 6), Edge(2, 3, 4)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_min_weight_matching(self): algorithm = MinimumWeightMatchingWithEdges(self.G) algorithm.run() expected_cardinality = 2 expected_weight = 5 expected_mate = {0: Edge(0, 3, 2), 1: Edge(1, 2, 3), 2: Edge(2, 1, 3), 3: Edge(3, 0, 2)} self.assertEqual(algorithm.cardinality, expected_cardinality) # Krawedzie sa po dwa razy w slowniku. weight = sum(algorithm.mate[node].weight for node in algorithm.mate if algorithm.mate[node]) / 2 self.assertEqual(weight, expected_weight) self.assertEqual(algorithm.mate, expected_mate) # Is it matching? for source in algorithm.mate: if algorithm.mate[source] is not None: edge = algorithm.mate[source] self.assertEqual(algorithm.mate[edge.target], ~edge) def tearDown(self): pass
class TestFloydWarshallAllGraphs(unittest.TestCase): def setUp(self): self.N = 5 # number of nodes self.G = Graph(self.N, directed=False) self.nodes = range(self.N) self.edges = [ Edge(0, 2, 6), Edge(0, 3, 3), Edge(1, 0, 3), Edge(2, 3, 2), Edge(3, 1, 1), Edge(4, 1, 4), Edge(4, 3, 2)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_floydwarshall(self): algorithm = FloydWarshallAllGraphs(self.G) algorithm.run() expected_distance = { 0: {0: 0, 1: 3, 2: 5, 3: 3, 4: 5}, 1: {0: 3, 1: 0, 2: 3, 3: 1, 4: 3}, 2: {0: 5, 1: 3, 2: 0, 3: 2, 4: 4}, 3: {0: 3, 1: 1, 2: 2, 3: 0, 4: 2}, 4: {0: 5, 1: 3, 2: 4, 3: 2, 4: 0}} self.assertEqual(algorithm.distance, expected_distance) def test_negative_edge(self): # An edge with the negative weight gives a negative cycle. self.G.add_edge(Edge(2, 4, -1)) algorithm = FloydWarshallAllGraphs(self.G) self.assertRaises(ValueError, algorithm.run)
class TestFordFulkerson(unittest.TestCase): def setUp(self): self.N = 4 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [Edge(0, 1, 10), Edge(0, 2, 10), Edge(1, 2, 1), Edge(1, 3, 10), Edge(2, 3, 10)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) # self.G.show() def test_fordfulkerson(self): algorithm = FordFulkerson(self.G) algorithm.run(0, 3) expected_max_flow = 20 expected_flow = { 0: {0: 0, 2: 10, 1: 10, 3: 0}, 1: {0: -10, 2: 0, 1: 0, 3: 10}, 2: {0: -10, 2: 0, 1: 0, 3: 10}, 3: {0: 0, 2: -10, 1: -10, 3: 0}, } self.assertEqual(algorithm.max_flow, expected_max_flow) self.assertEqual(algorithm.flow, expected_flow) def test_fordfulkerson_sparse(self): algorithm = FordFulkersonSparse(self.G) algorithm.run(0, 3) expected_max_flow = 20 expected_flow = {0: {2: 10, 1: 10}, 1: {0: -10, 3: 10}, 2: {0: -10, 3: 10}, 3: {2: -10, 1: -10}} self.assertEqual(algorithm.max_flow, expected_max_flow) self.assertEqual(algorithm.flow, expected_flow)
class TestNodeColoring(unittest.TestCase): def setUp(self): self.N = 6 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(0, 3), Edge(1, 3), Edge(1, 4), Edge(1, 2), Edge(2, 4), Edge(2, 5), Edge(3, 4), Edge(4, 5)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_us_node_coloring(self): algorithm = UnorderedSequentialNodeColoring(self.G) algorithm.run() for node in self.G.iternodes(): self.assertNotEqual(algorithm.color[node], None) for edge in self.G.iteredges(): self.assertNotEqual(algorithm.color[edge.source], algorithm.color[edge.target]) #print algorithm.color all_colors = set(algorithm.color[node] for node in self.G.iternodes()) self.assertEqual(len(all_colors), 4) def test_exceptions(self): self.assertRaises(ValueError, UnorderedSequentialNodeColoring, Graph(5, directed=True)) def tearDown(self): pass
def test_3prism(self): N = 6 G = Graph(N, False) edges = [ Edge(0, 1), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 5), Edge(0, 5), Edge(1, 4), Edge(2, 0), Edge(3, 5) ] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #print "3prism ..." algorithm = HalinGraphTreeDecomposition(G, outer=set([0, 2, 3, 5])) #algorithm = HalinGraphTreeDecomposition(G, outer=set([0, 1, 4, 5])) #algorithm = HalinGraphTreeDecomposition(G, outer=set([1, 2, 3, 4])) algorithm.run() #print "3prism outer", algorithm.outer parent = {0: 1, 1: None, 2: 1, 3: 4, 4: 1, 5: 4} self.assertEqual(algorithm.parent, parent) #order = [1, 0, 2, 3, 5, 4] order = [4, 0, 2, 3, 5, 1] self.assertEqual(algorithm.order, order) self.assertEqual(len(algorithm.cliques), G.v() - 3)
class TestMatching3(unittest.TestCase): def setUp(self): self.N = 6 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [Edge(0, 1), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 5)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_matching(self): algorithm = BorieMatching(self.G) algorithm.run() expected1 = set([Edge(0, 1), Edge(2, 3), Edge(4, 5)]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.mate_set, expected1) # Testing matching. S = set() for edge in algorithm.mate_set: S.add(edge.source) S.add(edge.target) self.assertEqual(len(S), 2 * len(algorithm.mate_set)) def tearDown(self): pass
def test_halin8c(self): N = 8 G = Graph(N, False) edges = [ Edge(0, 1), Edge(0, 5), Edge(0, 7), Edge(1, 2), Edge(1, 7), Edge(2, 3), Edge(2, 6), Edge(3, 4), Edge(3, 6), Edge(4, 5), Edge(4, 6), Edge(5, 6), Edge(6, 7) ] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) algorithm = HalinNodeColoring(G, outer=set([0, 1, 2, 3, 4, 5])) algorithm.run() #print "halin8c outer", algorithm.outer parent = {0: 7, 1: 7, 2: 6, 3: 6, 4: 6, 5: 6, 6: None, 7: 6} self.assertEqual(algorithm.parent, parent) for node in G.iternodes(): self.assertNotEqual(algorithm.color[node], None) for edge in G.iteredges(): self.assertNotEqual(algorithm.color[edge.source], algorithm.color[edge.target]) all_colors = set(algorithm.color[node] for node in G.iternodes()) self.assertEqual(len(all_colors), 3)
def test_frucht12(self): N = 10 G = Graph(N, False) edges = [Edge(0, 1), Edge(0, 4), Edge(0, 11), Edge(1, 2), Edge(1, 10), Edge(2, 3), Edge(2, 7), Edge(3, 4), Edge(3, 5), Edge(4, 5), Edge(5, 6), Edge(6, 7), Edge(6, 8), Edge(7, 8), Edge(8, 9), Edge(9, 10), Edge(9, 11), Edge(10, 11)] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #print "frucht12" algorithm = HalinNodeColoring(G, outer=set([0, 4, 5, 6, 8, 9, 11])) algorithm.run() #print "frucht12 outer", algorithm.outer parent = {0: 1, 1: None, 2: 1, 3: 2, 4: 3, 5: 3, 6: 7, 7: 2, 8: 7, 9: 10, 10: 1, 11: 10} self.assertEqual(algorithm.parent, parent) for node in G.iternodes(): self.assertNotEqual(algorithm.color[node], None) for edge in G.iteredges(): self.assertNotEqual(algorithm.color[edge.source], algorithm.color[edge.target]) all_colors = set(algorithm.color[node] for node in G.iternodes()) self.assertEqual(len(all_colors), 3)
class TestBoruvkaDisconnectedGraph(unittest.TestCase): def setUp(self): # The modified graph (unique weights) from Cormen. self.N = 9 # number of nodes self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1, 4), Edge(0, 7, 8), Edge(1, 7, 11), Edge(1, 2, 12), Edge(7, 8, 7), Edge(8, 2, 2), Edge(8, 6, 6), Edge(7, 6, 1), Edge(3, 5, 14), Edge(3, 4, 9), Edge(5, 4, 10)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #print self.G def test_boruvka(self): self.assertEqual(self.G.v(), self.N) algorithm = BoruvkaMST(self.G) algorithm.run() self.assertEqual(algorithm.mst.v(), self.N) self.assertEqual(algorithm.mst.e(), self.N-2) # 2 components mst_weight_expected = 40 mst_weight = sum(edge.weight for edge in algorithm.mst.iteredges()) self.assertEqual(mst_weight, mst_weight_expected) mst_edges_expected = [ Edge(0, 1, 4), Edge(0, 7, 8), Edge(8, 2, 2), Edge(7, 6, 1), Edge(6, 8, 6), Edge(3, 4, 9), Edge(5, 4, 10)] for edge in mst_edges_expected: self.assertTrue(algorithm.mst.has_edge(edge)) def tearDown(self): pass
class TestBellmanFord(unittest.TestCase): def setUp(self): self.N = 4 # number of nodes self.G = Graph(self.N, directed=True) # directed graph self.nodes = range(self.N) self.edges = [ Edge(0, 1, 1), Edge(0, 2, 5), Edge(1, 2, 1), Edge(1, 3, 3), Edge(2, 3, 1)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_shortest_path(self): source = 0 target = 3 algorithm = BellmanFord(self.G) algorithm.run(source) distance_expected = {0: 0, 2: 2, 1: 1, 3: 3} self.assertEqual(algorithm.distance, distance_expected) parent_expected = {0: None, 2: 1, 1: 0, 3: 2} self.assertEqual(algorithm.parent, parent_expected) path_expected = [0, 1, 2, 3] self.assertEqual(algorithm.path(target), path_expected) def tearDown(self): pass
class TestEdmondsKarpWiki(unittest.TestCase): def setUp(self): self.N = 7 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [ Edge(0, 1, 3), Edge(0, 3, 3), Edge(1, 2, 4), Edge(2, 0, 3), Edge(2, 3, 1), Edge(2, 4, 2), Edge(3, 4, 2), Edge(3, 5, 6), Edge(4, 1, 1), Edge(4, 6, 1), Edge(5, 6, 9)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_wiki_sparse(self): algorithm = EdmondsKarpSparse(self.G) algorithm.run(0, 6) expected_max_flow = 5 expected_flow = { 0: {1: 2, 3: 3}, 1: {0: -2, 2: 2}, 2: {1: -2, 4: 1, 3: 1}, 3: {0: -3, 2: -1, 4: 0, 5: 4}, 4: {2: -1, 3: 0, 6: 1}, 5: {3: -4, 6: 4}, 6: {4: -1, 5: -4}} self.assertEqual(algorithm.max_flow, expected_max_flow) self.assertEqual(algorithm.flow, expected_flow) def tearDown(self): pass
def make_random_spgraph(n): """Make a series-parallel graph with n vertices.""" if n < 2: raise ValueError("bad n") graph = Graph(n) for node in xrange(n): graph.add_node(node) source = 0 sink = n - 1 edge_list = [Edge(source, sink)] node = n - 2 while node > 0: # Losowanie krawedzi na ktorej bedzie operacja. i = random.randrange(0, len(edge_list)) swap(edge_list, i, -1) edge = edge_list[-1] # Losowanie operacji. if edge.target == sink: action = random.choice(["series", "parallel", "jackknife"]) else: action = random.choice(["series", "parallel"]) if action == "series": edge_list.pop() edge_list.append(Edge(edge.source, node)) edge_list.append(Edge(node, edge.target)) elif action == "parallel": edge_list.append(Edge(edge.source, node)) edge_list.append(Edge(node, edge.target)) elif action == "jackknife": edge_list.append(Edge(edge.target, node)) node -= 1 for edge in edge_list: graph.add_edge(edge) return graph
class TestTransitiveClosure(unittest.TestCase): def setUp(self): self.N = 4 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [Edge(0, 1), Edge(1, 2), Edge(2, 3)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() self.expected_T = { 0: { 0: True, 1: True, 2: True, 3: True }, 1: { 0: False, 1: True, 2: True, 3: True }, 2: { 0: False, 1: False, 2: True, 3: True }, 3: { 0: False, 1: False, 2: False, 3: True } } def test_closure(self): algorithm = TransitiveClosure(self.G) algorithm.run() self.assertEqual(algorithm.T, self.expected_T) def test_closure_simple(self): algorithm = TransitiveClosureSimple(self.G) algorithm.run() self.assertEqual(algorithm.T, self.expected_T) def test_closure_bfs(self): algorithm = TransitiveClosureBFS(self.G) algorithm.run() self.assertEqual(algorithm.T, self.expected_T) def test_closure_dfs(self): algorithm = TransitiveClosureDFS(self.G) algorithm.run() self.assertEqual(algorithm.T, self.expected_T) def tearDown(self): pass
def test_halin8c(self): N = 8 G = Graph(N, False) edges = [ Edge(0, 1), Edge(0, 5), Edge(0, 7), Edge(1, 2), Edge(1, 7), Edge(2, 3), Edge(2, 6), Edge(3, 4), Edge(3, 6), Edge(4, 5), Edge(4, 6), Edge(5, 6), Edge(6, 7) ] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #print "halin8c ..." algorithm = HalinGraphTreeDecomposition(G, outer=set([0, 1, 2, 3, 4, 5])) algorithm.run() #print "halin8c outer", algorithm.outer parent = {0: 7, 1: 7, 2: 6, 3: 6, 4: 6, 5: 6, 6: None, 7: 6} self.assertEqual(algorithm.parent, parent) #order = [7, 0, 1, 2, 3, 4, 5, 6] # wersja z indeksami order = [3, 4, 6, 0, 1, 2, 5, 7] # wersja z linkami self.assertEqual(algorithm.order, order) self.assertEqual(len(algorithm.cliques), G.v() - 3)
def test_wheel5(self): N = 5 G = Graph(N, False) edges = [ Edge(0, 1), Edge(0, 2), Edge(0, 3), Edge(0, 4), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 1) ] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #print "wheel5 ..." algorithm = HalinGraphTreeDecomposition(G, outer=set([1, 2, 3, 4])) algorithm.run() #print "wheel5 outer", algorithm.outer #print "wheel5 cycle", algorithm.cycle parent = {0: None, 1: 0, 2: 0, 3: 0, 4: 0} self.assertEqual(algorithm.parent, parent) order = [1, 2, 3, 4, 0] self.assertEqual(algorithm.order, order) self.assertEqual(len(algorithm.cliques), G.v() - 3)
class TestBellmanFordCormen(unittest.TestCase): def setUp(self): # The graph from Cormen p.666, negative weights. self.N = 5 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [ Edge(0, 1, 6), Edge(0, 3, 7), Edge(1, 3, 8), Edge(1, 2, 5), Edge(1, 4, -4), Edge(2, 1, -2), Edge(3, 2, -3), Edge(3, 4, 9), Edge(4, 0, 2), Edge(4, 2, 7)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_shortest_path_cormen(self): source = 0 target = 4 algorithm = BellmanFord(self.G) algorithm.run(source) distance_expected = {3: 7, 2: 4, 0: 0, 4: -2, 1: 2} self.assertEqual(algorithm.distance, distance_expected) parent_expected = {3: 0, 2: 3, 0: None, 4: 1, 1: 2} self.assertEqual(algorithm.parent, parent_expected) path_expected = [0, 3, 2, 1, 4] self.assertEqual(algorithm.path(target), path_expected) def tearDown(self): pass
def test_halin8a(self): N = 8 G = Graph(N, False) edges = [ Edge(0, 1), Edge(0, 2), Edge(0, 7), Edge(1, 2), Edge(1, 5), Edge(2, 3), Edge(3, 4), Edge(3, 7), Edge(4, 5), Edge(4, 6), Edge(5, 6), Edge(6, 7) ] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #print "halin8a ..." algorithm = HalinGraphTreeDecomposition(G, outer=set([0, 7, 6, 5, 1])) algorithm.run() #print "halin8a outer", algorithm.outer parent = {0: 2, 1: 2, 2: None, 3: 2, 4: 3, 5: 4, 6: 4, 7: 3} self.assertEqual(algorithm.parent, parent) #order = [2, 4, 0, 1, 5, 6, 7, 3] order = [4, 2, 0, 1, 5, 6, 7, 3] self.assertEqual(algorithm.order, order) self.assertEqual(len(algorithm.cliques), G.v() - 3)
class TestJohnsonWiki(unittest.TestCase): def setUp(self): self.N = 4 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [ Edge(0, 1, 3), Edge(0, 3, 6), Edge(1, 3, 4), Edge(1, 2, 5), Edge(3, 2, 2), Edge(2, 0, -7), Edge(2, 1, -3)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) def test_johnson(self): algorithm = Johnson(self.G) algorithm.run() expected_distance = { 0: {1: 3, 0: 0, 2: 8, 3: 6}, 1: {1: 0, 0: -2, 2: 5, 3: 4}, 2: {1: -4, 0: -7, 2: 0, 3: -1}, 3: {1: -2, 0: -5, 2: 2, 3: 0}} self.assertEqual(algorithm.distance, expected_distance) def test_johnson_faster(self): algorithm = JohnsonFaster(self.G) algorithm.run() expected_distance = { 0: {1: 3, 0: 0, 2: 8, 3: 6}, 1: {1: 0, 0: -2, 2: 5, 3: 4}, 2: {1: -4, 0: -7, 2: 0, 3: -1}, 3: {1: -2, 0: -5, 2: 2, 3: 0}} self.assertEqual(algorithm.distance, expected_distance)
class TestDAGShortestPath(unittest.TestCase): def setUp(self): self.N = 6 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) for node in self.nodes: self.G.add_node(node) self.G.add_edge(Edge(0, 1, 5)) self.G.add_edge(Edge(0, 2, 3)) self.G.add_edge(Edge(1, 3, 6)) self.G.add_edge(Edge(1, 2, 2)) self.G.add_edge(Edge(2, 4, 4)) self.G.add_edge(Edge(2, 3, 7)) self.G.add_edge(Edge(2, 5, 2)) self.G.add_edge(Edge(3, 4, -1)) self.G.add_edge(Edge(3, 5, 1)) self.G.add_edge(Edge(4, 5, -2)) def test_shortest_path(self): source = 0 target = 5 algorithm = DAGShortestPath(self.G) algorithm.run(source) distance_expected = {0: 0, 1: 5, 2: 3, 3: 10, 4: 7, 5: 5} self.assertEqual(algorithm.distance, distance_expected) parent_expected = {1: 0, 0: None, 2: 0, 4: 2, 3: 2, 5: 2} self.assertEqual(algorithm.parent, parent_expected) path_expected = [0, 2, 5] self.assertEqual(algorithm.path(target), path_expected) def tearDown(self): pass
def test_halin16(self): N = 16 G = Graph(N, False) edges = [Edge(0, 1), Edge(0, 2), Edge(0, 15), Edge(1, 2), Edge(1, 6), Edge(2, 3), Edge(3, 4), Edge(3, 5), Edge(4, 5), Edge(4, 10), Edge(5, 6), Edge(6, 7), Edge(7, 8), Edge(7, 15), Edge(8, 9), Edge(8, 13), Edge(9, 10), Edge(9, 11), Edge(10, 11), Edge(11, 12), Edge(12, 13), Edge(12, 14), Edge(13, 14), Edge(14, 15)] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #print "halin16" algorithm = HalinNodeColoring(G, outer=set([0, 2, 3, 4, 10, 11, 12, 14, 15])) algorithm.run() #print "halin16 outer", algorithm.outer parent = {0: 1, 1: None, 2: 1, 3: 5, 4: 5, 5: 6, 6: 1, 7: 6, 8: 7, 9: 8, 10: 9, 11: 9, 12: 13, 13: 8, 14: 13, 15: 7} self.assertEqual(algorithm.parent, parent) for node in G.iternodes(): self.assertNotEqual(algorithm.color[node], None) for edge in G.iteredges(): self.assertNotEqual(algorithm.color[edge.source], algorithm.color[edge.target]) all_colors = set(algorithm.color[node] for node in G.iternodes()) self.assertEqual(len(all_colors), 3)
def test_wheel5(self): N = 5 G = Graph(N, False) edges = [ Edge(0, 1), Edge(0, 2), Edge(0, 3), Edge(0, 4), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 1) ] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) algorithm = HalinNodeColoring(G, outer=set([1, 2, 3, 4])) algorithm.run() #print "wheel5 outer", algorithm.outer #print "wheel5 cycle", algorithm.cycle parent = {0: None, 1: 0, 2: 0, 3: 0, 4: 0} self.assertEqual(algorithm.parent, parent) for node in G.iternodes(): self.assertNotEqual(algorithm.color[node], None) for edge in G.iteredges(): self.assertNotEqual(algorithm.color[edge.source], algorithm.color[edge.target]) all_colors = set(algorithm.color[node] for node in G.iternodes()) self.assertEqual(len(all_colors), 3)
def test_halin16(self): N = 16 G = Graph(N, False) edges = [ Edge(0, 1), Edge(0, 2), Edge(0, 15), Edge(1, 2), Edge(1, 6), Edge(2, 3), Edge(3, 4), Edge(3, 5), Edge(4, 5), Edge(4, 10), Edge(5, 6), Edge(6, 7), Edge(7, 8), Edge(7, 15), Edge(8, 9), Edge(8, 13), Edge(9, 10), Edge(9, 11), Edge(10, 11), Edge(11, 12), Edge(12, 13), Edge(12, 14), Edge(13, 14), Edge(14, 15) ] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #print "halin16 ..." algorithm = HalinGraphTreeDecomposition( G, outer=set([0, 2, 3, 4, 10, 11, 12, 14, 15])) algorithm.run() #print "halin16 outer", algorithm.outer parent = { 0: 1, 1: None, 2: 1, 3: 5, 4: 5, 5: 6, 6: 1, 7: 6, 8: 7, 9: 8, 10: 9, 11: 9, 12: 13, 13: 8, 14: 13, 15: 7 } self.assertEqual(algorithm.parent, parent) order = [5, 9, 13, 1, 11, 12, 8, 2, 3, 6, 0, 4, 10, 14, 15, 7] self.assertEqual(algorithm.order, order) self.assertEqual(len(algorithm.cliques), G.v() - 3)
class TestBoruvkaWiki(unittest.TestCase): def setUp(self): # The graph (unique weights) from # http://en.wikipedia.org/wiki/Boruvka's_algorithm self.N = 7 # number of nodes self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1, 7), Edge(1, 2, 11), Edge(0, 3, 4), Edge(3, 1, 9), Edge(4, 1, 10), Edge(2, 4, 5), Edge(3, 4, 15), Edge(3, 5, 6), Edge(5, 4, 12), Edge(5, 6, 13), Edge(4, 6, 8)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #print self.G def test_boruvka(self): self.assertEqual(self.G.v(), self.N) algorithm = BoruvkaMST(self.G) algorithm.run() self.assertEqual(algorithm.mst.v(), self.N) self.assertEqual(algorithm.mst.e(), self.N-1) mst_weight_expected = 40 mst_weight = sum(edge.weight for edge in algorithm.mst.iteredges()) self.assertEqual(mst_weight, mst_weight_expected) mst_edges_expected = [ Edge(0, 1, 7), Edge(0, 3, 4), Edge(2, 4, 5), Edge(1, 4, 10), Edge(4, 6, 8), Edge(3, 5, 6)] for edge in mst_edges_expected: self.assertTrue(algorithm.mst.has_edge(edge)) def tearDown(self): pass
class TestHamiltonianCycleDirected(unittest.TestCase): def setUp(self): # 3-prism graph, Halin graph self.N = 6 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(2, 0), Edge(0, 5), Edge(2, 1), Edge(1, 4), Edge(3, 2), Edge(3, 4), Edge(5, 3), Edge(4, 5) ] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) def test_hamilton(self): algorithm = HamiltonianCycleDFS(self.G) algorithm.run(0) expected_cycle = [0, 1, 4, 5, 3, 2, 0] self.assertEqual(algorithm.hamiltonian_cycle, expected_cycle) def test_hamilton_with_edges(self): algorithm = HamiltonianCycleDFSWithEdges(self.G) algorithm.run(0) expected_cycle = [ Edge(0, 1), Edge(1, 4), Edge(4, 5), Edge(5, 3), Edge(3, 2), Edge(2, 0) ] self.assertEqual(algorithm.hamiltonian_cycle, expected_cycle) def test_hamilton_with_cycle_graph(self): algorithm = HamiltonianCycleDFSWithGraph(self.G) algorithm.run(0) # 5 solutions expected_cycle = [ Edge(0, 1), Edge(1, 4), Edge(4, 5), Edge(5, 3), Edge(3, 2), Edge(2, 0) ] #print "directed", list(algorithm.hamiltonian_cycle.iteredges()) for edge in expected_cycle: self.assertTrue(algorithm.hamiltonian_cycle.has_edge(edge)) def tearDown(self): pass
def test_tree_three_nodes(self): T = Graph(3) for node in (0, 1, 2): T.add_node(node) for edge in (Edge(0, 1), Edge(1, 2)): T.add_edge(edge) algorithm = TreePlot(T) algorithm.run() self.assertEqual(len(algorithm.point_dict), 3)
class TestNodeCover3(unittest.TestCase): def setUp(self): self.N = 6 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [Edge(0, 1), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 5)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_borie_node_cover(self): algorithm = BorieNodeCover(self.G) algorithm.run() expected1 = set([1, 2, 4]) expected2 = set([1, 3, 4]) expected3 = set([0, 2, 4]) expected4 = set([1, 3, 5]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.node_cover, expected3) # Testing cover. for edge in self.G.iteredges(): self.assertTrue(edge.source in algorithm.node_cover or edge.target in algorithm.node_cover) def test_tree_node_cover1(self): algorithm = TreeNodeCover1(self.G) algorithm.run() expected1 = set([1, 2, 4]) expected2 = set([1, 3, 4]) expected3 = set([0, 2, 4]) expected4 = set([1, 3, 5]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.node_cover, expected2) # Testing cover. for edge in self.G.iteredges(): self.assertTrue(edge.source in algorithm.node_cover or edge.target in algorithm.node_cover) def test_tree_node_cover2(self): algorithm = TreeNodeCover2(self.G) algorithm.run() expected1 = set([1, 2, 4]) expected2 = set([1, 3, 4]) expected3 = set([0, 2, 4]) expected4 = set([1, 3, 5]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.node_cover, expected2) # Testing cover. for edge in self.G.iteredges(): self.assertTrue(edge.source in algorithm.node_cover or edge.target in algorithm.node_cover) def tearDown(self): pass
class TestNodeColoring(unittest.TestCase): def setUp(self): self.N = 6 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(0, 3), Edge(1, 3), Edge(1, 4), Edge(1, 2), Edge(2, 4), Edge(2, 5), Edge(3, 4), Edge(4, 5) ] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_brooks_node_coloring(self): algorithm = BrooksNodeColoring(self.G) algorithm.run() for node in self.G.iternodes(): self.assertNotEqual(algorithm.color[node], None) for edge in self.G.iteredges(): self.assertNotEqual(algorithm.color[edge.source], algorithm.color[edge.target]) #print algorithm.color all_colors = set(algorithm.color[node] for node in self.G.iternodes()) self.assertEqual(len(all_colors), 4) def test_brooks_node_coloring_regular(self): # Buduje graf 4-regularny planarny z Delta=4. # Graf jest 3-connected, dlatego algorytm dziala. self.G.add_edge(Edge(0, 2)) self.G.add_edge(Edge(3, 5)) self.G.add_edge(Edge(0, 5)) algorithm = BrooksNodeColoring(self.G) algorithm.run() for node in self.G.iternodes(): self.assertNotEqual(algorithm.color[node], None) for edge in self.G.iteredges(): self.assertNotEqual(algorithm.color[edge.source], algorithm.color[edge.target]) #print algorithm.color all_colors = set(algorithm.color[node] for node in self.G.iternodes()) self.assertEqual(len(all_colors), 3) # best def test_exceptions(self): self.assertRaises(ValueError, BrooksNodeColoring, Graph(5, directed=True)) def tearDown(self): pass
class TestIndependentSet3(unittest.TestCase): def setUp(self): self.N = 6 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [Edge(0, 1), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 5)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_borie_iset(self): algorithm = BorieIndependentSet(self.G) algorithm.run() expected1 = set([0, 2, 5]) expected2 = set([0, 3, 5]) expected3 = set([0, 2, 4]) expected4 = set([1, 3, 5]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.independent_set, expected3) # Testing iset. for edge in self.G.iteredges(): self.assertFalse(edge.source in algorithm.independent_set and edge.target in algorithm.independent_set) def test_tree_iset1(self): algorithm = TreeIndependentSet1(self.G) algorithm.run() expected1 = set([0, 2, 5]) expected2 = set([0, 3, 5]) expected3 = set([0, 2, 4]) expected4 = set([1, 3, 5]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.independent_set, expected1) # Testing iset. for edge in self.G.iteredges(): self.assertFalse(edge.source in algorithm.independent_set and edge.target in algorithm.independent_set) def test_tree_iset2(self): algorithm = TreeIndependentSet2(self.G) algorithm.run() expected1 = set([0, 2, 5]) expected2 = set([0, 3, 5]) expected3 = set([0, 2, 4]) expected4 = set([1, 3, 5]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.independent_set, expected1) # Testing iset. for edge in self.G.iteredges(): self.assertFalse(edge.source in algorithm.independent_set and edge.target in algorithm.independent_set) def tearDown(self): pass
class TestIndependentSet1(unittest.TestCase): def setUp(self): self.N = 7 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(0, 3), Edge(1, 2), Edge(1, 4), Edge(2, 5), Edge(2, 6) ] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_borie_iset(self): algorithm = BorieIndependentSet(self.G) algorithm.run() expected1 = set([3, 4, 5, 6]) expected2 = set([0, 4, 5, 6]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.independent_set, expected2) # Testing iset. for edge in self.G.iteredges(): self.assertFalse(edge.source in algorithm.independent_set and edge.target in algorithm.independent_set) def test_tree_iset1(self): algorithm = TreeIndependentSet1(self.G) algorithm.run() expected1 = set([3, 4, 5, 6]) expected2 = set([0, 4, 5, 6]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.independent_set, expected1) # Testing iset. for edge in self.G.iteredges(): self.assertFalse(edge.source in algorithm.independent_set and edge.target in algorithm.independent_set) def test_tree_iset2(self): algorithm = TreeIndependentSet2(self.G) algorithm.run() expected1 = set([3, 4, 5, 6]) expected2 = set([0, 4, 5, 6]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.independent_set, expected1) # Testing iset. for edge in self.G.iteredges(): self.assertFalse(edge.source in algorithm.independent_set and edge.target in algorithm.independent_set) def tearDown(self): pass
class TestDominatingSet2(unittest.TestCase): def setUp(self): self.N = 7 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(1, 3), Edge(1, 2), Edge(1, 4), Edge(2, 5), Edge(2, 6) ] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_borie_dset(self): algorithm = BorieDominatingSet(self.G) algorithm.run() expected1 = set([1, 2]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.dominating_set, expected1) # Testing dset. neighbors = set(algorithm.dominating_set) for node in algorithm.dominating_set: neighbors.update(self.G.iteradjacent(node)) self.assertEqual(len(neighbors), self.G.v()) def test_tree_dset1(self): algorithm = TreeDominatingSet1(self.G) algorithm.run() expected1 = set([1, 2]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.dominating_set, expected1) # Testing dset. neighbors = set(algorithm.dominating_set) for node in algorithm.dominating_set: neighbors.update(self.G.iteradjacent(node)) self.assertEqual(len(neighbors), self.G.v()) def test_tree_dset2(self): algorithm = TreeDominatingSet2(self.G) algorithm.run() expected1 = set([1, 2]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.dominating_set, expected1) # Testing dset. neighbors = set(algorithm.dominating_set) for node in algorithm.dominating_set: neighbors.update(self.G.iteradjacent(node)) self.assertEqual(len(neighbors), self.G.v()) def tearDown(self): pass
class TestFleuryDirectedGraph(unittest.TestCase): def setUp(self): self.N = 6 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(3, 0), Edge(1, 4), Edge(4, 3), Edge(2, 4), Edge(4, 5), Edge(5, 2)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) def test_fleury_dfs(self): algorithm = FleuryDFS(self.G) algorithm.run(0) expected_cycle = [0, 1, 4, 5, 2, 4, 3, 0] self.assertEqual(len(algorithm.eulerian_cycle), len(self.edges) + 1) self.assertEqual(algorithm.eulerian_cycle, expected_cycle) def test_fleury_bfs(self): algorithm = FleuryBFS(self.G) algorithm.run(0) expected_cycle = [0, 1, 4, 5, 2, 4, 3, 0] self.assertEqual(len(algorithm.eulerian_cycle), len(self.edges) + 1) self.assertEqual(algorithm.eulerian_cycle, expected_cycle) def test_fleury_dfs_with_edges(self): algorithm = FleuryDFSWithEdges(self.G) algorithm.run(0) #expected_cycle = [0, 1, 4, 5, 2, 4, 3, 0] expected_cycle = [ Edge(0, 1), Edge(1, 4), Edge(4, 5), Edge(5, 2), Edge(2, 4), Edge(4, 3), Edge(3, 0)] self.assertEqual(len(algorithm.eulerian_cycle), len(self.edges)) self.assertEqual(algorithm.eulerian_cycle, expected_cycle) def test_fleury_bfs_with_edges(self): algorithm = FleuryBFSWithEdges(self.G) algorithm.run(0) #expected_cycle = [0, 1, 4, 5, 2, 4, 3, 0] expected_cycle = [ Edge(0, 1), Edge(1, 4), Edge(4, 5), Edge(5, 2), Edge(2, 4), Edge(4, 3), Edge(3, 0)] self.assertEqual(len(algorithm.eulerian_cycle), len(self.edges)) self.assertEqual(algorithm.eulerian_cycle, expected_cycle) def test_eulerian(self): self.G.add_edge(Edge(1, 2)) self.assertRaises(ValueError, FleuryDFS, self.G) self.assertRaises(ValueError, FleuryBFS, self.G) self.assertRaises(ValueError, FleuryDFSWithEdges, self.G) self.assertRaises(ValueError, FleuryBFSWithEdges, self.G) def tearDown(self): pass
def test_add_graph_undirected(self): T = Graph(self.N) for node in self.nodes: T.add_node(node) T.add_edge(Edge("A", "D", 9)) self.assertEqual(T.v(), self.N) self.assertEqual(T.e(), 1) self.G.add_graph(T) self.assertEqual(self.G.v(), self.N) self.assertEqual(self.G.e(), 6)
class TestIndependentSet(unittest.TestCase): def setUp(self): self.N = 6 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1), Edge(0, 3), Edge(1, 3), Edge(1, 4), Edge(1, 2), Edge(2, 5), Edge(3, 4), Edge(4, 5)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_us_independent_set1(self): algorithm = UnorderedSequentialIndependentSet1(self.G) #algorithm.run() # przypadkiem znajduje najlepsze rozwiazanie algorithm.run(3) # znajduje set([2, 3]) for edge in self.G.iteredges(): self.assertFalse(edge.source in algorithm.independent_set and edge.target in algorithm.independent_set) self.assertEqual(algorithm.cardinality, len(algorithm.independent_set)) #print algorithm.independent_set def test_us_independent_set2(self): algorithm = UnorderedSequentialIndependentSet2(self.G) #algorithm.run() # przypadkiem znajduje najlepsze rozwiazanie algorithm.run(3) # znajduje set([2, 3]) for edge in self.G.iteredges(): self.assertFalse(edge.source in algorithm.independent_set and edge.target in algorithm.independent_set) self.assertEqual(algorithm.cardinality, len(algorithm.independent_set)) #print algorithm.independent_set def test_us_independent_set3(self): algorithm = UnorderedSequentialIndependentSet3(self.G) #algorithm.run() # przypadkiem znajduje najlepsze rozwiazanie algorithm.run(3) # znajduje set([2, 3]) for edge in self.G.iteredges(): self.assertFalse(algorithm.independent_set[edge.source] and algorithm.independent_set[edge.target]) cardinality = sum(1 for node in self.G if algorithm.independent_set[node]) self.assertEqual(algorithm.cardinality, cardinality) #print algorithm.independent_set def test_exceptions(self): self.assertRaises(ValueError, UnorderedSequentialIndependentSet1, Graph(5, directed=True)) self.assertRaises(ValueError, UnorderedSequentialIndependentSet2, Graph(5, directed=True)) self.assertRaises(ValueError, UnorderedSequentialIndependentSet3, Graph(5, directed=True)) def tearDown(self): pass
def make_halin_outer(n=4): """Create a random weighted Halin graph with the set of outer nodes.""" if n < 4: raise ValueError("number of nodes must be greater than 3") graph = Graph(n) weights = list(range(1, 1 + 2 * n - 2)) random.shuffle(weights) for node in xrange(n): graph.add_node(node) # Teraz trzeba dodawac krawedzie, ale nie moze zostac wierzcholek # stopnia 2. Startuje od gwiazdy. graph.add_edge(Edge(1, 0, weights.pop())) graph.add_edge(Edge(2, 0, weights.pop())) graph.add_edge(Edge(3, 0, weights.pop())) nodes = set([0, 1, 2, 3]) node = 4 while node < n: parent = random.sample(nodes, 1)[0] if graph.degree(parent) == 1: # leaf, we must add two edges if node + 1 == n: continue nodes.add(node) graph.add_edge(Edge(parent, node, weights.pop())) node += 1 nodes.add(node) graph.add_edge(Edge(parent, node, weights.pop())) node += 1 else: # degree > 2 nodes.add(node) graph.add_edge(Edge(parent, node, weights.pop())) node += 1 # Method 1. Finding root without TreeCenter. for node in graph.iternodes(): if graph.degree(node) > 1: # always present root = node break # Method 2. Finding root with TreeCenter. # TreeCenter reduces floating point errors for points. #algorithm = TreeCenter(graph) #algorithm.run() #root = algorithm.tree_center[0] # Wyznaczam slownik z punktami. algorithm = TreePlotRadiusAngle(graph) algorithm.run(root) L = list() # for leafs for node in algorithm.point_dict: if graph.degree(node) == 1: # leafs L.append(node) # Sortowanie lisci ze wzgledu na kat. L.sort(key=lambda node: algorithm.point_dict[node][1]) n_leafs = len(L) for i in range(n_leafs): graph.add_edge(Edge(L[i], L[(i + 1) % n_leafs], weights.pop())) return graph, set(L)
class TestTSP(unittest.TestCase): def setUp(self): self.N = 4 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1, 20), Edge(0, 3, 35), Edge(0, 2, 42), Edge(1, 2, 30), Edge(1, 3, 34), Edge(2, 3, 12) ] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) self.best_weight = 97 #self.G.show() def test_nearest_neighbor_with_edges(self): algorithm = NearestNeighborTSPWithEdges(self.G) algorithm.run(0) expected_hamiltonian_cycle = [ Edge(0, 1, 20), Edge(1, 2, 30), Edge(2, 3, 12), Edge(3, 0, 35) ] self.assertEqual(algorithm.hamiltonian_cycle, expected_hamiltonian_cycle) weight = sum(edge.weight for edge in algorithm.hamiltonian_cycle) self.assertEqual(weight, self.best_weight) def test_nearest_neighbor_with_cycle_graph(self): algorithm = NearestNeighborTSPWithGraph(self.G) algorithm.run(0) weight = sum(edge.weight for edge in algorithm.hamiltonian_cycle.iteredges()) self.assertEqual(weight, self.best_weight) #algorithm.hamiltonian_cycle.show() self.assertEqual(algorithm.hamiltonian_cycle.e(), algorithm.hamiltonian_cycle.v()) for node in algorithm.hamiltonian_cycle.iternodes(): self.assertEqual(algorithm.hamiltonian_cycle.degree(node), 2) def test_exceptions(self): self.assertRaises(ValueError, NearestNeighborTSPWithEdges, Graph(5, True)) self.assertRaises(ValueError, NearestNeighborTSPWithGraph, Graph(5, True)) def tearDown(self): pass
class TestAcyclicUdirectedGraph(unittest.TestCase): def setUp(self): # The graph from Cormen p.607 changed. self.N = 8 # number of nodes self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 4), Edge(0, 1), Edge(1, 5), Edge(5, 2), Edge(2, 6), Edge(6, 3), Edge(6, 7) ] self.cycle_edges = [Edge(5, 6), Edge(2, 3), Edge(3, 7)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #print self.G #self.G.show() def test_detect_no_cycles(self): self.assertEqual(self.G.v(), self.N) algorithm = AcyclicGraphDFS(self.G) algorithm.run(1) # it is safe, because G is connected parent_expected = {1: None, 0: 1, 3: 6, 2: 5, 5: 1, 4: 0, 7: 6, 6: 2} self.assertEqual(algorithm.parent, parent_expected) self.assertTrue(is_acyclic(self.G)) def test_detect_cycle1(self): self.assertEqual(self.G.v(), self.N) self.G.add_edge(self.cycle_edges[0]) algorithm = AcyclicGraphDFS(self.G) self.assertRaises(ValueError, algorithm.run) self.assertFalse(is_acyclic(self.G)) def test_detect_cycle2(self): self.assertEqual(self.G.v(), self.N) self.G.add_edge(self.cycle_edges[1]) algorithm = AcyclicGraphDFS(self.G) self.assertRaises(ValueError, algorithm.run) self.assertFalse(is_acyclic(self.G)) def test_detect_cycle3(self): self.assertEqual(self.G.v(), self.N) self.G.add_edge(self.cycle_edges[2]) algorithm = AcyclicGraphDFS(self.G) self.assertRaises(ValueError, algorithm.run) self.assertFalse(is_acyclic(self.G)) def tearDown(self): pass
def test_wheel_true(self): v = 10 G = Graph(v, False) for node in range(v): G.add_node(node) hub = 0 for node in range(1, v): G.add_edge(Edge(hub, node)) G.add_edge(Edge(node, node+1 if node < v-1 else 1)) self.assertTrue(is_wheel(G)) algorithm = WheelGraph(G) algorithm.run() self.assertEqual(algorithm.hub, hub)
def test_4prism(self): N = 8 G = Graph(N, False) edges = [Edge(0, 1), Edge(1, 2), Edge(2, 3), Edge(3, 0), Edge(4, 5), Edge(5, 6), Edge(6, 7), Edge(7, 4), Edge(0, 4), Edge(1, 5), Edge(2, 6), Edge(3, 7)] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) #G.show() algorithm = HalinGraph(G) self.assertRaises(ValueError, algorithm.run)
class TestMatching(unittest.TestCase): def setUp(self): # Wilson, ex. 25.1, bipartite graph # 0 : 4 5 6 # 1 : 3 5 # 2 : 3 4 # ... self.N = 7 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 4), Edge(0, 5), Edge(0, 6), Edge(1, 3), Edge(1, 5), Edge(2, 3), Edge(2, 4)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_maximal_matching(self): algorithm = MaximalMatching(self.G) algorithm.run() # 5 solutions expected_cardinality = 2 # max 3 expected_mate = {0: 4, 4: 0, 1: 3, 3: 1, 2: None, 5: None, 6: None} self.assertEqual(algorithm.cardinality, expected_cardinality) self.assertEqual(algorithm.mate, expected_mate) # Is it matching? for source in algorithm.mate: if algorithm.mate[source] is not None: target = algorithm.mate[source] self.assertEqual(algorithm.mate[target], source) def test_maximal_matching_with_edges(self): algorithm = MaximalMatchingWithEdges(self.G) algorithm.run() # 5 solutions expected_cardinality = 2 # max 3 expected_mate = {0: Edge(0, 4), 1: Edge(1, 3), 2: None, 3: Edge(3, 1), 4: Edge(4, 0), 5: None, 6: None} self.assertEqual(algorithm.cardinality, expected_cardinality) self.assertEqual(algorithm.mate, expected_mate) # Is it matching? for source in algorithm.mate: if algorithm.mate[source] is not None: edge = algorithm.mate[source] self.assertEqual(algorithm.mate[edge.target], ~edge) def tearDown(self): pass
def test_wheel5(self): N = 5 G = Graph(N, False) edges = [Edge(0, 1), Edge(0, 2), Edge(0, 3), Edge(0, 4), Edge(1, 2), Edge(2, 3), Edge(3, 4), Edge(4, 1)] for node in range(N): G.add_node(node) for edge in edges: G.add_edge(edge) algorithm = HalinGraph(G) algorithm.run() #print "wheel5 outer", algorithm.outer self.assertEqual(algorithm.outer, set([1, 2, 3, 4])) self.assertTrue(algorithm.is_outer_k4())
class TestTSP(unittest.TestCase): def setUp(self): self.N = 4 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [ Edge(0, 1, 20), Edge(0, 3, 35), Edge(0, 2, 42), Edge(1, 2, 30), Edge(1, 3, 34), Edge(2, 3, 12)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) self.best_weight = 97 #self.G.show() def test_brute_force_with_edges(self): algorithm = BruteForceTSPWithEdges(self.G) algorithm.run(2) # Cycles for different starting nodes. expected_hamiltonian_cycle0 = [ Edge(0, 1, 20), Edge(1, 2, 30), Edge(2, 3, 12), Edge(3, 0, 35)] expected_hamiltonian_cycle1 = [ Edge(1, 0, 20), Edge(0, 3, 35), Edge(3, 2, 12), Edge(2, 1, 30)] expected_hamiltonian_cycle2 = [ Edge(2, 1, 30), Edge(1, 0, 20), Edge(0, 3, 35), Edge(3, 2, 12)] expected_hamiltonian_cycle3 = [ Edge(3, 0, 35), Edge(0, 1, 20), Edge(1, 2, 30), Edge(2, 3, 12)] expected_hamiltonian_cycle = expected_hamiltonian_cycle2 self.assertEqual(algorithm.hamiltonian_cycle, expected_hamiltonian_cycle) weight = sum(edge.weight for edge in algorithm.hamiltonian_cycle) self.assertEqual(weight, self.best_weight) def test_brute_force_with_cycle_graph(self): algorithm = BruteForceTSPWithGraph(self.G) algorithm.run(2) # Hamiltonian cycle as a graph. weight = sum(edge.weight for edge in algorithm.hamiltonian_cycle.iteredges()) self.assertEqual(weight, self.best_weight) #algorithm.hamiltonian_cycle.show() self.assertEqual(algorithm.hamiltonian_cycle.e(), algorithm.hamiltonian_cycle.v()) for node in algorithm.hamiltonian_cycle.iternodes(): self.assertEqual(algorithm.hamiltonian_cycle.degree(node), 2) def test_exceptions(self): self.assertRaises(ValueError, BruteForceTSPWithEdges, Graph(5, True)) self.assertRaises(ValueError, BruteForceTSPWithGraph, Graph(5, True)) def tearDown(self): pass
def test_tree_three_nodes_radius_angle(self): T = Graph(3) for node in (0, 1, 2): T.add_node(node) for edge in (Edge(0, 1), Edge(1, 2)): T.add_edge(edge) algorithm = TreePlotRadiusAngle(T) algorithm.run() self.assertEqual(len(algorithm.point_dict), 3) #print algorithm.point_dict self.assertEqual(algorithm.point_dict, {0: (1, Fraction(3, 2)), 1: (0, Fraction(3, 1)), 2: (1, Fraction(9, 2))})
class TestFloydWarshall(unittest.TestCase): def setUp(self): self.N = 5 # number of nodes self.G = Graph(self.N, directed=True) self.nodes = range(self.N) self.edges = [ Edge(0, 2, 6), Edge(0, 3, 3), Edge(1, 0, 3), Edge(2, 3, 2), Edge(3, 1, 1), Edge(3, 2, 1), Edge(4, 1, 4), Edge(4, 3, 2)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() def test_floydwarshall(self): algorithm = FloydWarshall(self.G) algorithm.run() expected_distance = { 0: {0: 0, 1: 4, 2: 4, 3: 3, 4: float("inf")}, 1: {0: 3, 1: 0, 2: 7, 3: 6, 4: float("inf")}, 2: {0: 6, 1: 3, 2: 0, 3: 2, 4: float("inf")}, 3: {0: 4, 1: 1, 2: 1, 3: 0, 4: float("inf")}, 4: {0: 6, 1: 3, 2: 3, 3: 2, 4: 0}} self.assertEqual(algorithm.distance, expected_distance) def test_floydwarshall_paths(self): algorithm = FloydWarshallPaths(self.G) algorithm.run() expected_distance = { 0: {0: 0, 1: 4, 2: 4, 3: 3, 4: float("inf")}, 1: {0: 3, 1: 0, 2: 7, 3: 6, 4: float("inf")}, 2: {0: 6, 1: 3, 2: 0, 3: 2, 4: float("inf")}, 3: {0: 4, 1: 1, 2: 1, 3: 0, 4: float("inf")}, 4: {0: 6, 1: 3, 2: 3, 3: 2, 4: 0}} expected_parent = { 0: {0: None, 2: 3, 1: 3, 4: None, 3: 0}, 1: {0: 1, 2: 3, 1: None, 4: None, 3: 0}, 2: {0: 1, 2: None, 1: 3, 4: None, 3: 2}, 3: {0: 1, 2: 3, 1: 3, 4: None, 3: None}, 4: {0: 1, 2: 3, 1: 3, 4: None, 3: 4}} self.assertEqual(algorithm.distance, expected_distance) self.assertEqual(algorithm.parent, expected_parent) self.assertEqual(algorithm.path(0, 1), [0, 3, 1]) def test_floydwarshall_negative_cycle(self): self.G.add_edge(Edge(1, 3, -2)) algorithm = FloydWarshall(self.G) self.assertRaises(ValueError, algorithm.run)
class TestNodeCover(unittest.TestCase): def setUp(self): self.N = 5 self.G = Graph(self.N) self.nodes = range(self.N) self.edges = [Edge(0, 1), Edge(0, 2), Edge(1, 2), Edge(1, 3), Edge(1, 4)] for node in self.nodes: self.G.add_node(node) for edge in self.edges: self.G.add_edge(edge) #self.G.show() node1 = Node(0, 1, "edge") node2 = Node(0, 2, "edge") node3 = Node(2, 1, "edge") node4 = Node(1, 3, "edge") node5 = Node(1, 4, "edge") node6 = Node(0, 1, "series", node2, node3) node7 = Node(0, 1, "parallel", node1, node6) node8 = Node(0, 1, "jackknife", node7, node4) node9 = Node(0, 1, "jackknife", node8, node5) self.root = node9 def test_spgraph_node_cover(self): algorithm = SPGraphNodeCover(self.G, self.root) algorithm.run() expected1 = set([0, 1]) expected2 = set([1, 2]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.node_cover, expected2) # Testing cover. for edge in self.G.iteredges(): self.assertTrue(edge.source in algorithm.node_cover or edge.target in algorithm.node_cover) def test_sptree_node_cover(self): algorithm = SPTreeNodeCover(self.root) algorithm.run() expected1 = set([0, 1]) expected2 = set([1, 2]) self.assertEqual(algorithm.cardinality, len(expected1)) self.assertEqual(algorithm.node_cover, expected2) # Testing cover. for edge in self.G.iteredges(): self.assertTrue(edge.source in algorithm.node_cover or edge.target in algorithm.node_cover) def tearDown(self): pass