def test_connected_components_and_component(self): graph = Graph() for number in range(10): graph.add_node(number) for number in range(5): if number != 0: graph.add_edge(0, number, number) graph.add_edge(number, 0, number) for number in range(6, 10): if number != 6: graph.add_edge(6, number, number) graph.add_edge(number, 6, number) algo = Algo(graph) components = algo.connected_components() self.assertTrue(components.__contains__([0, 1, 2, 3, 4])) self.assertTrue(components.__contains__([6, 7, 8, 9])) self.assertTrue(components.__contains__([5])) component1 = algo.connected_component(0) component2 = algo.connected_component(6) component3 = algo.connected_component(5) self.assertEqual(component1, [0, 1, 2, 3, 4]) self.assertEqual(component2, [6, 7, 8, 9]) self.assertEqual(component3, [5]) graph2 = Graph() algo.graph = graph2 self.assertEqual([], algo.connected_components())
def load_from_json(self, file_name: str) -> bool: """ loads the graph in JSON format to a file @param file_name: The path to the load file @return: True if the load was successful, False o.w. """ try: with open(file_name, "r") as file: graph_dict = json.load(file) nodes = graph_dict.get("Nodes") edges = graph_dict.get("Edges") graph = Graph() tup = None for node_dict in nodes: pos_string = node_dict.get("pos") if pos_string is not None: x = float(pos_string.split(",")[0]) y = float(pos_string.split(",")[1]) z = float(pos_string.split(",")[2]) tup = (x, y, z) graph.add_node(node_dict.get("id"), tup) for edge_dict in edges: src = edge_dict.get('src') weight = edge_dict.get('w') dest = edge_dict.get('dest') graph.add_edge(src, dest, weight) self.graph = graph return True except IOError as e: return False
def test_plot(self): graph = Graph() graph2 = Graph() for number in range(3): graph.add_node(number, (number, number, number)) graph2.add_node(number, (number, number, number)) graph.add_edge(0, 1, 1) graph2.add_edge(0, 1, 1) graph.add_edge(1, 2, 1) graph2.add_edge(1, 2, 1) graph.add_edge(2, 0, 1) graph2.add_edge(2, 0, 1) self.assertEqual(graph, graph2) algo = Algo(graph) algo.plot_graph() x = 5 self.assertEqual(graph, graph2)
def test_get_graph(self): graph = Graph() for number in range(10): graph.add_node(number) for number in range(10): graph.add_edge(0, number, 1) algo = Algo(graph) self.assertTrue(id(graph), id(algo.get_graph()))
def test_save_load(self): graph = Graph() for number in range(4): graph.add_node(number) for number in range(4): graph.add_edge(0, number, 1) algo = Algo(graph) self.assertTrue(algo.save_to_json("saved_graph")) self.assertFalse(algo.save_to_json("")) self.assertFalse(algo.load_from_json("python")) self.assertTrue(algo.load_from_json("saved_graph")) self.assertEqual(graph, algo.get_graph())
def test_shortes_path(self): graph = Graph() for number in range(10): graph.add_node(number) for number in range(10): graph.add_edge(0, number, 5) for number in range(10): graph.add_edge(number, 0, 5) algo = Algo(graph) for number in range(9): self.assertNotEqual(float('inf'), algo.shortest_path(number, number + 1)[0]) self.assertEqual(10, algo.shortest_path(1, 3)[0]) graph.remove_edge(0, 3) self.assertEqual(float('inf'), algo.shortest_path(1, 3)[0]) path = [4, 0, 2] path2 = algo.shortest_path(4, 2)[1] self.assertTrue(path.__eq__(algo.shortest_path(4, 2)[1]))
def reversed_graph(self): """ :return: transposed version of the graph """ graph = self.get_graph() reveresed = Graph() for node_id in graph.get_all_v(): node = self.get_graph().get_all_v().get(node_id) if node.pos is not None: reveresed.add_node(node.get_key(), node.pos) else: reveresed.add_node(node.get_key()) for node_id in graph.get_all_v(): node = self.get_graph().get_all_v().get(node_id) for key in node.out_edges.keys(): reveresed.add_edge(key, node.get_key(), 0) return reveresed