コード例 #1
0
 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)
コード例 #2
0
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
コード例 #3
0
ファイル: test_treemate.py プロジェクト: yjfiejd/graphs-dict
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
コード例 #4
0
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
コード例 #5
0
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)
コード例 #6
0
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)
コード例 #7
0
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
コード例 #8
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 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)
コード例 #9
0
ファイル: test_treemate.py プロジェクト: ufkapano/graphs-dict
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
コード例 #10
0
 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)
コード例 #11
0
 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)
コード例 #12
0
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
コード例 #13
0
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
コード例 #14
0
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
コード例 #15
0
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
コード例 #16
0
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
コード例 #17
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 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)
コード例 #18
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 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)
コード例 #19
0
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
コード例 #20
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 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)
コード例 #21
0
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)
コード例 #22
0
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
コード例 #23
0
 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)
コード例 #24
0
 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)
コード例 #25
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 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)
コード例 #26
0
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
コード例 #27
0
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
コード例 #28
0
ファイル: test_hamilton.py プロジェクト: yjfiejd/graphs-dict
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
コード例 #29
0
ファイル: test_treeplot.py プロジェクト: kgashok/graphs-dict
 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)
コード例 #30
0
ファイル: test_treecover.py プロジェクト: yjfiejd/graphs-dict
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
コード例 #31
0
ファイル: test_treeplot.py プロジェクト: ufkapano/graphs-dict
 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)
コード例 #32
0
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
コード例 #33
0
ファイル: test_treeiset.py プロジェクト: ufkapano/graphs-dict
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
コード例 #34
0
ファイル: test_treeiset.py プロジェクト: yjfiejd/graphs-dict
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
コード例 #35
0
ファイル: test_treedset.py プロジェクト: yjfiejd/graphs-dict
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
コード例 #36
0
ファイル: test_fleury.py プロジェクト: kgashok/graphs-dict
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
コード例 #37
0
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
コード例 #38
0
 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)
コード例 #39
0
ファイル: test_graphs.py プロジェクト: ufkapano/graphs-dict
 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)
コード例 #40
0
ファイル: test_isetus.py プロジェクト: ufkapano/graphs-dict
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
コード例 #41
0
ファイル: halintools.py プロジェクト: ufkapano/graphs-dict
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)
コード例 #42
0
ファイル: halintools.py プロジェクト: kgashok/graphs-dict
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)
コード例 #43
0
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
コード例 #44
0
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
コード例 #45
0
ファイル: test_wheels.py プロジェクト: ufkapano/graphs-dict
 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)
コード例 #46
0
ファイル: test_halin.py プロジェクト: ufkapano/graphs-dict
 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)
コード例 #47
0
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
コード例 #48
0
ファイル: test_halin.py プロジェクト: ufkapano/graphs-dict
 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())
コード例 #49
0
ファイル: test_tspbf.py プロジェクト: ufkapano/graphs-dict
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
コード例 #50
0
ファイル: test_treeplot.py プロジェクト: ufkapano/graphs-dict
 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))})
コード例 #51
0
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)
コード例 #52
0
ファイル: test_spcover.py プロジェクト: ufkapano/graphs-dict
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