Esempio n. 1
0
 def test_is_complete(self):
     graph = Graph(input_graph=json.dumps(self.complete_graph))
     self.assertTrue(is_complete(graph))
     graph = Graph(input_graph=json.dumps(self.isolated_graph))
     self.assertFalse(is_complete(graph))
     json_graph = {"name": "", "graph": {"A": ["B"], "B": []}}
     graph = Graph(input_graph=json.dumps(json_graph))
     self.assertFalse(is_complete(graph))
Esempio n. 2
0
    def test_density(self):
        graph = Graph(input_graph=json.dumps(self.connected_graph))
        self.assertAlmostEqual(0.4666666666666667, density(graph))

        graph = Graph(input_graph=json.dumps(self.complete_graph))
        self.assertEqual(1.0, density(graph))

        graph = Graph(input_graph=json.dumps(self.isolated_graph))
        self.assertEqual(0.0, density(graph))
Esempio n. 3
0
 def test_complete_digraph(self):
     graph = Graph(input_graph=json.dumps(self.complete_digraph))
     self.assertTrue(is_complete(graph))
     json_graph = {
         "name": "",
         "directed": True,
         "graph": {
             "A": ["B"],
             "B": []
         }
     }
     graph = Graph(input_graph=json.dumps(json_graph))
     self.assertFalse(is_complete(graph))
Esempio n. 4
0
    def test_str(self):
        answer = """my graph
A -> B
B -> 0"""
        json_graph = {"label": "my graph", "graph": {"A": ["B"], "B": []}}
        graph = Graph(input_graph=json.dumps(json_graph))
        self.assertEqual(answer, str(graph))
Esempio n. 5
0
 def test_edges(self):
     json_graph = {"label": "my graph", "graph": {"A": ["B"], "B": []}}
     graph = Graph(input_graph=json.dumps(json_graph))
     self.assertEqual(json_graph['label'], graph.get_label())
     self.assertEqual(False, graph.is_directed())
     self.assertEqual(json_graph['graph'], graph.get_graph())
     self.assertEqual([Edge('A', 'B')], graph.edges())
Esempio n. 6
0
 def test_get_adjacency_matrix(self):
     json_graph = {"graph": {"A": ["B"], "B": []}}
     graph = Graph(input_graph=json.dumps(json_graph))
     matrix = graph.get_adjacency_matrix()
     answer = np.array([[0, 1], [0, 0]])
     np.testing.assert_equal(matrix, answer)
     self.assertEqual(answer.size, matrix.size)
Esempio n. 7
0
    def test_arrival_departure_dfs(self):
        disjoint_graph = {
            "graph": {
                "a": ["b", "c"],
                "b": [],
                "c": ["d", "e"],
                "d": ["b", "f"],
                "e": ["f"],
                "f": [],
                "g": ["h"],
                "h": []
            },
            "directed": True
        }

        graph = Graph(input_graph=json.dumps(disjoint_graph))

        # list to store the arrival time of vertex
        arrival = {v: 0 for v in graph.vertices()}
        # list to store the departure time of vertex
        departure = {v: 0 for v in graph.vertices()}
        # mark all the vertices as not discovered
        discovered = {v: False for v in graph.vertices()}
        time = -1

        for v in graph.vertices():
            if not discovered[v]:
                time = arrival_departure_dfs(graph, v, discovered, arrival,
                                             departure, time)

        # pair up the arrival and departure times and ensure correct ordering
        result = list(zip(arrival.values(), departure.values()))
        expected_times = [(0, 11), (1, 2), (3, 10), (4, 7), (8, 9), (5, 6),
                          (12, 15), (13, 14)]
        self.assertListEqual(expected_times, result)
Esempio n. 8
0
 def test_read_graph_from_file(self):
     json_graph = {"label": "my graph", "graph": {"A": ["B"], "B": []}}
     with open(path.join(self.test_dir, 'test.txt'), 'w') as out_file:
         out_file.write(json.dumps(json_graph))
     graph = Graph(input_file=str(path.join(self.test_dir, 'test.txt')))
     self.assertEqual(json_graph["label"], graph.get_label())
     self.assertEqual(False, graph.is_directed())
     self.assertEqual(json_graph["graph"], graph.get_graph())
Esempio n. 9
0
 def test_add_edge(self):
     graph = Graph("my graph")
     graph.add_vertex("A")
     graph.add_vertex("B")
     graph.add_edge("A", "B")
     self.assertEqual(1, len(graph.edges()))
     graph.add_edge("X", "Y")
     self.assertEqual(2, len(graph.edges()))
     self.assertEqual(4, len(graph.vertices()))
Esempio n. 10
0
 def test_is_dag(self):
     cycle_graph = {
         "directed": True,
         "graph": {
             "A": ["B"],
             "B": ["C", "D"],
             "C": [],
             "D": ["E", "A"],  # cycle A -> B -> D -> A
             "E": []
         }
     }
     graph = Graph(input_graph=json.dumps(cycle_graph))
     self.assertFalse(is_dag(graph))
     dag = cycle_graph
     # remove the cycle
     dag["graph"]["D"] = ["E"]
     graph2 = Graph(input_graph=json.dumps(dag))
     self.assertTrue(is_dag(graph2))
Esempio n. 11
0
def get_complement(graph: Graph) -> Graph:
    """
    If graph is represented as a matrix, invert that matrix
    :param graph:
    :return: inversion of graph
    """
    adj = graph.get_adjacency_matrix()
    complement = invert(adj)
    return Graph(label=f"{graph.get_label()} complement",
                 input_array=complement)
Esempio n. 12
0
    def test_save_to_json(self):
        answer = "{\"label\": \"my graph\", \"directed\": false," \
                 " \"graph\": {\"A\": [\"B\"], \"B\": []}}"
        json_graph = {"label": "my graph", "graph": {"A": ["B"], "B": []}}
        graph = Graph(input_graph=json.dumps(json_graph))
        save_to_json(graph, self.test_dir)

        outfile = path.join(self.test_dir, graph.get_label() + ".json")
        with open(outfile) as dot_file:
            dot_lines = "".join(dot_file.readlines())
        self.assertEqual(dot_lines, answer)
Esempio n. 13
0
 def test_find_circuit(self):
     circuit_graph = {
         "directed": True,
         "graph": {
             "A": ["B"],
             "B": ["C"],
             "C": ["A"]  # circuit A -> C -> B -> A
         }
     }
     graph = Graph(input_graph=json.dumps(circuit_graph))
     circuit = find_circuit(graph)
     expected_circuit = ["A", "C", "B", "A"]
     self.assertListEqual(circuit, expected_circuit)
Esempio n. 14
0
    def test_save_to_graphviz(self):
        answer = """// my graph
graph {
	A [label=A]
	A -- B
	B [label=B]
}
"""
        json_graph = {"label": "my graph", "graph": {"A": ["B"], "B": []}}
        graph = Graph(input_graph=json.dumps(json_graph))
        save_to_dot(graph, self.test_dir)

        outfile = path.join(self.test_dir, graph.get_label() + ".gv")
        with open(outfile) as dot_file:
            dot_lines = "".join(dot_file.readlines())
        self.assertEqual(dot_lines, answer)
Esempio n. 15
0
    def test_topological_sort(self):
        t_sort_graph = {
            "directed": True,
            "graph": {
                "A": [],
                "B": [],
                "C": ["D"],
                "D": ["B"],
                "E": ["A", "B"],
                "F": ["A", "C"]
            }
        }
        graph = Graph(input_graph=json.dumps(t_sort_graph))

        expected_results = ["F", "E", "C", "D", "B", "A"]
        results = topological(graph)
        self.assertListEqual(expected_results, results)
Esempio n. 16
0
 def test_find_all_paths(self):
     json_graph = {
         "label": "test2",
         "directed": False,
         "graph": {
             "a": ["d", "f"],
             "b": ["c"],
             "c": ["b", "c", "d", "e"],
             "d": ["a", "c"],
             "e": ["c"],
             "f": ["d"]
         }
     }
     graph = Graph(input_graph=json.dumps(json_graph))
     paths = find_all_paths(graph, "a", "b")
     self.assertListEqual([['a', 'd', 'c', 'b'], ['a', 'f', 'd', 'c', 'b']],
                          paths)
     paths = find_all_paths(graph, "z", "b")
     self.assertListEqual([], paths)
    def test_iterator(self):
        json_graph = {
            "name": "my graph",
            "graph": {
                "A": ["B", "C", "D"],
                "B": [],
                "C": [],
                "D": []
            }
        }
        graph = Graph(input_graph=json.dumps(json_graph))

        iterations = 0
        for key in graph:
            iterations += 1
            if key == "A":
                self.assertEqual(len(graph[key]), 3)
            else:
                self.assertEqual(len(graph[key]), 0)
        self.assertEqual(iterations, 4)
Esempio n. 18
0
 def test_find_path(self):
     json_graph = {
         "label": "test",
         "directed": False,
         "graph": {
             "a": ["d"],
             "b": ["c"],
             "c": ["b", "c", "d", "e"],
             "d": ["a", "c"],
             "e": ["c"],
             "f": []
         }
     }
     graph = Graph(input_graph=json.dumps(json_graph))
     path = find_path(graph, "a", "b")
     self.assertListEqual(['a', 'd', 'c', 'b'], path)
     path = find_path(graph, "a", "f")
     self.assertListEqual([], path)
     path = find_path(graph, "c", "c")
     self.assertListEqual(['c'], path)
     path = find_path(graph, "z", "a")
     self.assertListEqual([], path)
Esempio n. 19
0
    def test_get_neighbors(self):
        json_graph = {"label": "my graph", "graph": {"A": ["B"], "B": []}}
        graph = Graph(input_graph=json.dumps(json_graph))

        self.assertEqual(graph.get_neighbors("A"), ["B"])
        self.assertEqual(graph.get_neighbors("B"), [])
Esempio n. 20
0
 def test_set_from_adjacency_matrix(self):
     array_graph = np.array([[0, 1], [1, 0]], dtype=object)
     graph = Graph(input_array=array_graph)
     self.assertEqual(2, len(graph.vertices()))
     self.assertEqual(1, len(graph.edges()))
Esempio n. 21
0
 def test_order_and_size(self):
     json_graph = {"graph": {"A": ["B"], "B": []}}
     graph = Graph(input_graph=json.dumps(json_graph))
     self.assertEqual(2, graph.order())
     self.assertEqual(1, graph.size())
Esempio n. 22
0
 def test_is_regular_graph(self):
     graph = Graph(input_graph=json.dumps(self.big_graph))
     self.assertFalse(is_regular(graph))
     one_reg_graph = Graph(input_graph=json.dumps(self.one_regular_graph))
     self.assertTrue(is_regular(one_reg_graph))
Esempio n. 23
0
 def test_generate_edges(self):
     json_graph = {"name": "", "graph": {"A": ["B"], "B": []}}
     graph = Graph(input_graph=json.dumps(json_graph))
     edges = generate_edges(graph)
     self.assertEqual(len(edges), 1)
Esempio n. 24
0
 def test_is_simple(self):
     graph = Graph(input_graph=json.dumps(self.straight_line))
     self.assertTrue(is_simple(graph))
     lolli = Graph(input_graph=json.dumps(self.lollipop_graph))
     self.assertFalse(is_simple(lolli))
Esempio n. 25
0
 def test_is_sparse(self):
     graph = Graph(input_graph=json.dumps(self.isolated_graph))
     self.assertTrue(is_sparse(graph))
Esempio n. 26
0
 def test_repr(self):
     graph = Graph("graph")
     self.assertEqual('graph', repr(graph))
Esempio n. 27
0
 def test_name(self):
     graph = Graph("graph")
     self.assertEqual('graph', graph.get_label())
Esempio n. 28
0
 def test_add_vertex(self):
     graph = Graph("my graph")
     graph.add_vertex("A")
     self.assertEqual(['A'], graph.vertices())
Esempio n. 29
0
 def test_find_isolated_nodes(self):
     json_graph = {"name": "", "graph": {"A": ["B"], "B": ["A"], "C": []}}
     graph = Graph(input_graph=json.dumps(json_graph))
     isolated = find_isolated_vertices(graph)
     self.assertEqual(len(isolated), 1)
     self.assertEqual(isolated[0], 'C')
Esempio n. 30
0
 def test_complement(self):
     graph = Graph(input_graph=json.dumps(self.isolated_graph))
     complement = get_complement(graph)
     self.assertTrue(is_complete(complement))