Beispiel #1
0
    def test_get_all_v(self):
        graph = DiGraph()
        tuple0 = (0, 30, 2)
        tuple1 = (50, 50, 50)
        node0 = NodeData(0, tuple0)  # node: key=0 tuple=(0, 30, 2)
        node1 = NodeData(2, tuple0)  # node: key=2 tuple=(0, 30, 2)
        node2 = NodeData(10, tuple1)  # node: key=10 tuple=(50, 50, 50)

        graph.add_node(node0.get_key(), tuple0)
        graph.add_node(node1.get_key(), tuple0)
        graph.add_node(node2.get_key(), tuple1)

        nodes = [node0, node1, node2]

        for node in nodes:
            self.assertIn(node, graph.get_all_v().values())
Beispiel #2
0
    def __dijkstra(self, start_node: NodeData, dest_node: NodeData):
        """
        This method marks on each vertex the distance to the source vertex and
        @return path - Dict[int, NodeData] that the shortest path from start_node
        """
        nodes = self.__graph.get_all_v()
        q = PriorityQueue()
        path: Dict[int, NodeData] = dict()
        q.put(start_node)
        for n in nodes.values():
            node: NodeData = n
            node.set_weight(math.inf)
            node.set_info("WHITE")
            path[n.get_key()] = None
        start_node.set_weight(0)
        while not q.empty():
            v: NodeData = q.get()
            if v.get_info() == "WHITE":
                v.set_info("GRAY")
            else:
                continue
            if v.get_key() == dest_node.get_key():
                return path

            for k, w in self.__graph.all_out_edges_of_node(
                    v.get_key()).items():
                n: NodeData = nodes[k]
                if n.get_info() == "WHITE":
                    weight = v.get_weight() + w
                    if weight < n.get_weight():
                        q.put(n)
                        n.set_weight(weight)
                        path[n.get_key()] = v
            v.set_info("BLACK")
        return path
Beispiel #3
0
 def test_new_node(self):
     pos = (1, 2, 3)
     node1 = NodeData(1, pos, 3.4)
     self.assertEqual(node1.get_key(), 1)
     self.assertEqual(node1.get_pos(), (1, 2, 3))
     self.assertEqual(node1.get_weight(), 3.4)
     self.assertEqual(node1.get_info(), "f")
     self.assertEqual(node1.get_tag(), 0)
     self.assertEqual(node1.get_dest(), {})
     self.assertEqual(node1.get_src(), {})
     node2 = NodeData(2)
     self.assertEqual(node2.get_key(), 2)
     self.assertEqual(node2.get_pos(), None)
     self.assertEqual(node2.get_weight(), 0.0)
     self.assertEqual(node2.get_info(), "f")
     self.assertEqual(node2.get_tag(), 0)
     self.assertEqual(node2.get_dest(), {})
     self.assertEqual(node2.get_src(), {})
Beispiel #4
0
def dijkstra(start: NodeData, key_to_find: int, graph: GraphInterface):
    start.set_dist(0)
    # counter for how many visited
    visited = set()

    # using tuple here so the values won't change
    unvisited_queue = [(start.get_dist(), start.get_key())]
    heapq.heapify(unvisited_queue)

    while len(unvisited_queue) and len(visited) != graph.v_size():
        current_node: int = heapq.heappop(unvisited_queue)[1]
        if current_node not in visited:
            visited.add(current_node)
            if key_to_find == current_node:
                return
            for dest, w in graph.all_out_edges_of_node(current_node).items():
                if (w + graph.get_all_v().get(current_node).get_dist()) < graph.get_all_v().get(dest).get_dist():
                    graph.get_all_v().get(dest).set_dist(w + graph.get_all_v().get(current_node).get_dist())
                    graph.get_all_v().get(dest).set_parent(current_node)
                    unvisited_queue.append(
                        (graph.get_all_v().get(dest).get_dist(), dest))
            heapq.heapify(unvisited_queue)
Beispiel #5
0
    def test_equal(self):
        node11 = NodeData(1)
        node12 = NodeData(2)
        node13 = NodeData(3)
        graph_one_test = DiGraph()
        graph_one_test.add_node(node11.get_key(), (10, 20, 30))
        graph_one_test.add_node(node12.get_key(), (10, 20, 30))
        graph_one_test.add_node(node13.get_key(), (10, 20, 30))

        node110 = NodeData(1)
        node120 = NodeData(2)
        node130 = NodeData(3)
        graph_two_test = DiGraph()
        graph_two_test.add_node(node110.get_key(), (10, 20, 30))
        graph_two_test.add_node(node120.get_key(), (10, 20, 30))
        graph_two_test.add_node(node130.get_key(), (10, 20, 30))
        self.assertFalse(graph_one_test is graph_two_test)
        self.assertTrue(graph_one_test == graph_two_test)
Beispiel #6
0
def _dfs(curr: NodeData, stack, graph: GraphInterface):
    global index
    curr.set_low_link(index)
    curr.set_index(index)
    curr.set_visited_in(True)
    stack.append(curr)
    index += 1
    for n in list([graph.get_all_v().get(dest)]
                  for dest in graph.all_out_edges_of_node(curr.get_key())):
        node: NodeData = n.pop()
        if node.get_index() is None:
            _dfs(node, stack, graph)
            curr.set_low_link(min(curr.get_low_link(), node.get_low_link()))
        elif node.get_visited_in():
            curr.set_low_link(min(curr.get_low_link(), node.get_index()))
    if curr.get_low_link() == curr.get_index():
        scc = []
        while len(stack):
            popped_node: NodeData = stack.pop()
            popped_node.set_visited_in(False)
            scc.append(popped_node)
            if popped_node == curr:
                break
        sccList.append(scc)
Beispiel #7
0
    def test_all_out_edges_of_node(self):
        graph = DiGraph()

        tuple0 = (0, 30, 2)
        tuple1 = (50, 50, 50)
        node0 = NodeData(0, tuple0)  # node: key=0 tuple=(0, 30, 2)
        node1 = NodeData(1, tuple0)  # node: key=1 tuple=(0, 30, 2)
        node2 = NodeData(2, tuple1)  # node: key=2 tuple=(50, 50, 50)
        node3 = NodeData(3, tuple1)  # node: key=3 tuple=(50, 50, 50)

        graph.add_node(node0.get_key(), tuple0)  # add node0
        self.assertEqual({}, graph.all_out_edges_of_node(
            node0.get_key()))  # check the list In empty
        graph.add_node(node1.get_key(), tuple0)  # add node1
        graph.add_node(node2.get_key(), tuple1)  # add node2
        graph.add_node(node3.get_key(), tuple1)  # add node3

        graph.add_edge(node1.get_key(), node0.get_key(), 10)  # connect 1->0
        graph.add_edge(node1.get_key(), node2.get_key(), 15)  # connect 1->2
        graph.add_edge(node1.get_key(), node3.get_key(), 20)  # connect 1->2

        ans_list_keys = [node0.get_key(), node2.get_key(), node3.get_key()]
        for i in graph.all_out_edges_of_node(node1.get_key()).keys():
            self.assertIn(i, ans_list_keys)
        graph.remove_node(node2.get_key())  # remove node2
        graph.remove_node(node3.get_key())  # remove node3

        ans_list_keys = [node0.get_key()]
        for i in ans_list_keys:
            self.assertIn(i,
                          graph.all_out_edges_of_node(node1.get_key()).keys())