# m=3: N(lambda, b') = #{Lambda'' containing O^6, Lambda''/O^6 of type lambda, x_{b'} unimodular on Lambda''}
# for every b' >= 0 with |b'| = d, every lambda.  Direct HNF enumeration inside Lambda_0^#.
import sys, time, json
exec(open('/private/tmp/claude-501/-Users-miltonlin-Projects-Trees/f0f18b89-aa0d-4ce6-93d2-78c269eb7d7d/scratchpad/salvage/S1/engine.py').read())
p = int(sys.argv[1]); dmax = int(sys.argv[2]); dmin = int(sys.argv[3]) if len(sys.argv) > 3 else 1
def parts(d, k, mx=None):
    if mx is None: mx = d
    if k == 0:
        if d == 0: yield ()
        return
    for f in range(min(d, mx), -1, -1):
        for rest in parts(d - f, k - 1, f):
            yield (f,) + rest
out = {}
for d in range(dmin, dmax + 1):
    cols = list(parts(d, 3))
    for bp in cols:
        a = tuple(sorted(bp))            # blocks in increasing order (K-equivalent)
        lo = []
        for ap in a:
            lo += [-ap, -ap]
        t0 = time.time()
        cnt = count_types(a, p, lo=lo, hi=[0]*6, total_d=-d, shift=max(bp), prec=3*max(bp)+8)
        res = {}
        for ty, c in cnt.items():
            if max(ty) <= 0:
                lam = tuple(sorted((-v for v in ty), reverse=True))
                res[lam] = c
        out[str(bp)] = {str(k): v for k, v in res.items()}
        print("q=%d d=%d b'=%s [%.1fs]" % (p, d, bp, time.time()-t0), sorted(res.items(), reverse=True))
        sys.stdout.flush()
json.dump(out, open('/private/tmp/claude-501/-Users-miltonlin-Projects-Trees/f0f18b89-aa0d-4ce6-93d2-78c269eb7d7d/scratchpad/salvage/S1/m3_table_q%d_d%d-%d.json' % (p, dmin, dmax), 'w'), indent=1)
