def construct(n, k): assert n % 2 == 0 g = Graph(n + 4) # make complete graph on n vertices for i in range(n): for j in range(i + 1, n): g[i, j] = 0 edges = [] # add the 1 vertex g[0, n] = 0 edges.append((0, n)) # add the n+1 and n+2 vertices for i in range(n): g[i, n + 1] = 0 g[i, n + 2] = 0 edges.extend([ (i, n+1), (i, n+2), ]) # add the n+3 vertex g[n + 1, n + 3] = 0 g[n + 2, n + 3] = 0 edges.extend([ (n+1, n+3), (n+2, n+3), ]) for i in range(1, n): g[i, n + 3] = 0 edges.append((i, n+3)) for to_delete in chain.from_iterable(combinations(edges, i) for i in range(1, k+1)): for u, v in to_delete: del g[u, v] deg = g.degrees() delta = max(deg.values()) valid = True for node, d in deg.items(): valid = (d == delta if 0 <= node < n else d < delta) if not valid: break if valid: yield g for u, v in to_delete: g[u, v] = 0 return g
def main(): parser = argparse.ArgumentParser() parser.add_argument('file', type=str) parser.add_argument('-d', '--dir', type=str, default='.', required=False) parser.add_argument('-p', '--prefix', type=str, default=None, required=False) parser.add_argument('--node-label', dest='node_label', type=str, default="node_num", required=False) parser.add_argument('--no-core-same-rank', dest='core_same_rank', action='store_false') parser.add_argument('--nice-core', dest='nice_core', action='store_true') parser.set_defaults(core_same_rank=True) args = parser.parse_args() args.prefix = args.file if args.prefix is None else args.prefix for i, line in enumerate(open(args.file)): z = json.loads(line) g = Graph(len(z["edge_data"])) # if g.n != 8: # continue g.edge_data = [[(x if x != -1 else False) for x in row] for row in z["edge_data"]] seq = list(g.degrees().values()) seq.sort() # if seq != [g.n - 1] * g.n: # continue plot_graph( g, with_labels=False, node_label=args.node_label, core_same_rank=args.core_same_rank, nice_core=args.nice_core, ).render( filename=f"{args.dir}/{args.prefix}.{g.n}.{i}", cleanup=True, )
# Check that core is a disjoint union of cycles return all(len(neighbours[u] & core) <= 2 for u in core) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--relax-core', dest='relax_core', default=False, action='store_true') args = parser.parse_args() for line in sys.stdin: u = json.loads(line) edge_data = u["edge_data"] g = Graph(len(edge_data)) g.edge_data = [[(False if x == -1 else 0) for x in row] for row in edge_data] deg = g.degrees() delta = max(deg.values()) neighbours = {u: set(g.neighbours(u)) for u in g.nodes()} core = {u for u in g.nodes() if deg[u] == delta} if core \ and min(deg.values()) == delta - 1 \ and is_valid_semicore(g, neighbours, core) \ and (args.relax_core or is_valid_core(g, neighbours, core)): sys.stdout.write(line) sys.stdout.flush()