def METHOD_NAME(self):
    # randomly add some links for each node (symmetric)
    k = self.undirected_neighbor_num
    # print("neighbors = " + str(k))
    topology_random_link = np.array(
        nx.to_numpy_matrix(nx.watts_strogatz_graph(self.n, k, 0)), dtype=np.float32
    )
    # print("randomly add some links for each node (symmetric): ")
    # print(topology_random_link)
    # first generate a ring topology
    topology_ring = np.array(
        nx.to_numpy_matrix(nx.watts_strogatz_graph(self.n, 2, 0)), dtype=np.float32
    )
    for i in range(self.n):
        for j in range(self.n):
            if topology_ring[i][j] == 0 and topology_random_link[i][j] == 1:
                topology_ring[i][j] = topology_random_link[i][j]
    np.fill_diagonal(topology_ring, 1)
    # k_d = self.out_directed_neighbor
    # Directed graph
    # Undirected graph
    # randomly delete some links
    out_link_set = set()
    for i in range(self.n):
        len_row_zero = 0
        for j in range(self.n):
            if topology_ring[i][j] == 0:
                len_row_zero += 1
        random_selection = np.random.randint(2, size=len_row_zero)
        # print(random_selection)
        index_of_zero = 0
        for j in range(self.n):
            out_link = j * self.n + i
            if topology_ring[i][j] == 0:
                if (
                    random_selection[index_of_zero] == 1
                    and out_link not in out_link_set
                ):
                    topology_ring[i][j] = 1
                    out_link_set.add(i * self.n + j)
                index_of_zero += 1
    # print("asymmetric topology:")
    # print(topology_ring)
    for i in range(self.n):
        row_len_i = 0
        for j in range(self.n):
            if topology_ring[i][j] == 1:
                row_len_i += 1
        topology_ring[i] = topology_ring[i] / row_len_i
    # print("weighted asymmetric confusion matrix:")
    # print(topology_ring)
    self.topology = topology_ring