コード例 #1
0
ファイル: solver.py プロジェクト: dseeto/mlst
class NbitConstructor:
    def __init__(self, max_nodes, degree):
        self.degree = degree
        self.max_nodes = max_nodes

        self.edges = set(self.get_star(0, range(1,degree+1)))
        self.base_edges = self.edges.copy()

        self.num_vertices = self.degree + 1 

        self.graph = graph.make_graph(self.edges)
        self.graph.search()

        self.nbg = NbitGenerator(max_nodes, degree)

    def get_star(self, vertex, neighbors):
        """
        returns all edges involved with <vertex> and its <neighbors>
        """

        return [graph.Edge(vertex, n) for n in neighbors]

    def update_graph(self):
        self.graph = graph.make_graph(self.edges)
        self.graph.search()

    def get_leaves(self):
        leaves = set()
        for v in range(self.num_vertices):
            n = len(self.graph.neighbors[v])
            if n == 1: leaves.add(v)

        return leaves

    def generate_graph(self):

        self.update_graph() 

        leaves = self.get_leaves()

        while self.num_vertices < self.max_nodes - (self.degree - 1):
            leaf = leaves.pop()

            self.nbg.expand(leaf)

            vertices_to_add = [self.num_vertices + i for i in range(0, self.degree-1)]
            new_edges = self.get_star(leaf, vertices_to_add)

            # update state
            self.num_vertices += self.degree - 1
            for e in new_edges: self.edges.add(e)
            for v in vertices_to_add: leaves.add(v)

        return self.nbg.edges, self.edges
コード例 #2
0
ファイル: solver.py プロジェクト: dseeto/mlst
    def __init__(self, max_nodes, degree):
        self.degree = degree
        self.max_nodes = max_nodes

        self.edges = set(self.get_star(0, range(1,degree+1)))
        self.base_edges = self.edges.copy()

        self.num_vertices = self.degree + 1 

        self.graph = graph.make_graph(self.edges)
        self.graph.search()

        self.nbg = NbitGenerator(max_nodes, degree)