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
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)