python3 - <<'PY' import math,random ln2=math.log(2) def f(x): return 0.0 if x<=0 else -x*math.log(x)/ln2 def H(x): return f(x)+f(1-x) Q=[[0,0,.45],[0,.15,.15],[.15,.05,.05]] def soft(z): m=max(z); e=[2**(x-m) for x in z]; s=sum(e); return [x/s for x in e] def best(W,starts): bb=(-1e99,None) for l,m in starts: for it in range(80): wm=[sum(W[j][k]*m[k] for k in range(3)) for j in range(3)] l2=soft([-wm[j] for j in range(3)]) wtl=[sum(W[j][k]*l2[j] for j in range(3)) for k in range(3)] m2=soft([-wtl[k] for k in range(3)]) if max(abs(l2[i]-l[i])+abs(m2[i]-m[i]) for i in range(3))<1e-11: l,m=l2,m2;break l,m=l2,m2 v=H(l[1])+H(m[1])-sum(W[j][k]*l[j]*m[k] for j in range(3) for k in range(3)) if v>bb[0]: bb=(v,(l,m)) return bb def D(W,st): b=best(W,st); wq=sum(W[j][k]*Q[j][k] for j in range(3) for k in range(3)) return wq+b[0],b[1] W=[[0.0]*3 for _ in range(3)] st=] print('D0',D(W,st)[0]) random.seed(4) bestD=1e9 for it in range(80): dv,lm=D(W,st); l,m=lm if dv