コード例 #1
0
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
コード例 #2
0
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,
        )
コード例 #3
0
    # 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()