Поскольку вы хотите получить 29 281 результирующих графиков, маркировка должна быть для вас важна (IOW, вы не моддируете изоморфизмом.) Использование подхода грубой силы в networkx:
from itertools import combinations, product
import networkx as nx
def gen_dag(num_nodes):
all_edges = list(combinations(range(num_nodes), 2))
for p in product([None, 1, -1], repeat=len(all_edges)):
G = nx.DiGraph()
G.add_nodes_from(range(num_nodes))
edges = [edge[::edge_dir] for edge, edge_dir in zip(all_edges, p) if edge_dir]
G.add_edges_from(edges)
if nx.is_directed_acyclic_graph(G):
yield G
, что дает
In [75]: graphs = list(gen_dag(5))
In [76]: len(graphs)
Out[76]: 29281
и (например)
In [79]: graphs[1234].edges()
Out[79]: OutEdgeView([(3, 1), (3, 4), (4, 0), (4, 2)])
In [80]: nx.adjacency_matrix(graphs[1234]).todense()
Out[80]:
matrix([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 1],
[1, 0, 1, 0, 0]], dtype=int64)