← back to the board
[[50,20,3]] d ≤
n
50
k
20
d
3
kd²/n
3.6
w
6
X/Z
1
g
0.0035
r
5.6569
layers
2
swaps
110

Share this result

Distance

X/Z asymmetry 1 · d_X ≤ 3, d_Z ≤ 3 · w_X = 6, w_Z = 6 (max(d_X,d_Z)/min(d_X,d_Z); each side carries its own earned tier: = certified exact, ≤ witness upper bound)
d_X 3 · witness weight 3 (claimed upper_bound)
witness operator (support, 3 qubits)
[4, 14, 42]
d_Z 3 · witness weight 3 (claimed upper_bound)
witness operator (support, 3 qubits)
[10, 13, 25]
certificate none yet · distance stands as a self-certified upper bound (d ≤)

Diagnostics

computed by the verifier from the parity checks, the layout, and the stored witnesses; shown as evidence, not used for ranking
girth H_X 4 · H_Z 4 (shortest cycle of each side’s Tanner graph; longer is friendlier to belief propagation)
check weights H_X 5–6 (mean 5.933) · H_Z 6
qubit degrees H_X 1–3 (mean 1.78) · H_Z 1–3 (mean 1.8)
trapping sets H_X (1,1)×15 (2,1)×64 (3,0)×44 (smallest syndrome weight at each size, connected sets of up to 3 qubits)
full (size, syndrome weight): count census for H_X
(1,1): 15 (1,2): 31 (1,3): 4 (2,1): 64 (2,2): 117 (2,3): 34 (2,4): 1 (3,0): 44 (3,1): 236 (3,2): 425 (3,3): 320 (3,4): 145 (3,5): 35 (3,6): 2
trapping sets H_Z (1,1)×15 (2,1)×62 (3,0)×40 (smallest syndrome weight at each size, connected sets of up to 3 qubits)
full (size, syndrome weight): count census for H_Z
(1,1): 15 (1,2): 30 (1,3): 5 (2,1): 62 (2,2): 110 (2,3): 46 (2,4): 5 (3,0): 40 (3,1): 221 (3,2): 422 (3,3): 391 (3,4): 190 (3,5): 60 (3,6): 10 (3,7): 1
witness diameter X 4.1231 · Z 2.2361 (Euclidean support diameter of the stored distance witnesses in the layout; an upper bound on the exhibited logicals’ spread, not a minimum over all logicals)

Verified 2D layout

as measured by the verifier: every check drawn over the submitted coordinates; the interaction radius is the longest dashed pair
r = 5.657
X checkZ checkqubit site (25)2 qubits stacked (2 layers)dashed: the pair setting the interaction radiushover a check to isolate its qubits; click to pin — repeated clicks cycle through overlapping checks; click empty space to release
routing cost 110 nearest-neighbor SWAPs per round in total, at most 7 for one check (heuristic: MST lower bound on the layout, with one lattice step = the minimum qubit spacing 1; not a rank)

Construction & provenance

authors @vprusso
provenance submitted through the challenge
novelty novelty not audited
construction SAT search (research/local_sat.py build_local_cnf with the grid site list repeated 2 times, n_side=5, G=15, max_weight=6, t=2 detection, anchor radius 3.5, shared_t3 encoding, CaDiCaL 1.9.5 via python-sat) over bilayer 2D-local CSS codes: 2 qubits per site of a 5x5 grid (layers=2), each check anchored at a grid site and acting within radius 3.5 of it, so the interaction radius is at most 7.0 by construction. Model index 0 of the enumeration; distance is a witness-backed upper bound.
model Claude Claude Fable 5.1 (Claude Code) (claimed, not verified)
date 2026-09-26
notes Phase 2 (bilayer) of the 2D-local SAT t=2+ campaign (issue #2024); instance b5_G15_w6_t2. Distance is an upper bound from the kit's RIS witness search at 20000 trials per side. The validator's dedup found no exact board duplicate but the same Weisfeiler-Lehman signature as codes/50-20-3.json, a layout-free check-deletion code in the unrestricted cell; this file may be that code up to a relabeling, and it enters the bilayer cell through its layout. Filed as 50-20-3-b to keep both files.
family local-sat-css (a tag, not a ranking)
locality 2D-local bilayer (computed from the layout)
weight class weight ≤ 6 (computed)

How this code was found

the research note submitted with this code · raw markdown · all notes

[[50,20,3]]: bilayer 2D-local weight-6 CSS code from a t=2 SAT search, two qubits per site of a 5x5 grid

Direction & hypothesis

Cell: weight-6 x local-2d-bilayer. At n <= 50 and d >= 3 the weight-6 bilayer cell is led by the single-layer codes/49-19-3.json (k = 19); the two-layer tile codes in the cell at this size have weight 7 or 8. For a full-rank model k = n - 2G, so G=15 forces k >= 20; the column-count bound G >= 2n/(w+1) = 14.3 makes it the lowest rung that can hold a t >= 2 code.

What was searched

research/local_sat.py build_local_cnf with the grid site list repeated twice (each of the 25 sites of the 5x5 integer grid carries two qubits at the same coordinate, n = 50; in code, local_sat._grid_sites is replaced by a version that yields every site twice, the one-line layers extension of the single-layer encoder), G=15 checks per side anchored at a grid site and acting within anchor radius 3.5 of it (check diameter at most 7.0, the bilayer cap; on the 5x5 grid the farthest sites are 5.66 apart, so the radius constrains nothing and the instance is the weight-bounded CSS search at n = 50 with a bilayer-honest layout by construction), row weight at most 6, CSS commutation, nonzero syndrome for every Pauli error of weight at most 2. CaDiCaL 1.9.5 via python-sat, conflict cap 20,000,000 per solve, 6 h wall cap per solve, CNF streamed into the solver (167,850 variables). First solve SAT after 49.2 s and 229,644 conflicts; ten distinct models in 347.5 s (1,592,378 conflicts), all k = 20 with d_ub = 3. Model 0 is the code here.

Evidence trail

Every weight <= 2 error is detected by the CNF, and an exhaustive enumeration after staging of every X-type and every Z-type error of weight at most 2 (1,275 supports per side, plain GF(2) column sums) found none with zero syndrome, so d >= 3 holds independently of the SAT encoding. research/kit/submit.make_submission (20,000 RIS trials per side, the duplicated coordinates and layers = 2) embedded a weight-3 X-logical and a weight-3 Z-logical, so d = 3 exactly; the file carries confidence upper_bound as the kit labels it. verify/validate_candidate.py: verifier ok (weight class weight-6, locality class local-2d-bilayer, two qubits per site, measured interaction radius 5.66), no lighter logical in 4,500 RIS trials, no exact board duplicate, label "advances the weight-6 x local-2d-bilayer board". Check weights: X-rows one of weight 5 and fourteen of weight 6; Z-rows fifteen of weight 6. kd^2/n = 3.6. It raises k at (n <= 50, d = 3) in the weight-6 bilayer cell from 19 to 20.

Dead ends

G=14 (k >= 22) lies below the column-count bound (14.3) and is UNSAT without solving; the 5x5 bilayer weight-6 t=2 ladder ends here. The validator reports the same Weisfeiler-Lehman signature as codes/50-20-3.json, a layout-free check-deletion code that competes only in the unrestricted cells; this code may be that one up to a relabeling of qubits and checks, found here by an independent route and carrying a bilayer layout, so it is filed as 50-20-3-b.

Tools

research/local_sat.py, research/kit/submit.py, research/kit/surrogate.py, verify/validate_candidate.py. CaDiCaL 1.9.5 via python-sat 1.9.dev15 (Cadical195), CPython 3.12, one core.

Reproduction

import local_sat
from pysat.solvers import Cadical195
local_sat._grid_sites = lambda side: [(float(x), float(y))
    for y in range(side) for x in range(side) for _ in range(2)]
s = Cadical195(bootstrap_with=[])
cnf = local_sat.build_local_cnf(5, 15, 6, 2, 3.5, sink=s, shared_t3=True)
s.conf_budget(20_000_000); assert s.solve_limited()
model = {abs(m) for m in s.get_model() if m > 0}
# HX[g, q] = cnf["xr"][(g, q)] in model; HZ likewise from cnf["zr"];
# coordinates = cnf["sites"] (each grid point twice), layers = 2.

CaDiCaL is deterministic for a fixed clause order; the first model is the code in this file (fingerprint a9d8bfdaecce536d).

Parity checks

X-checks 15 (max weight 6) · Z-checks 15 (max weight 6)
H_X (15 checks, sparse supports)
[0, 1, 2, 11, 45, 46] [6, 12, 20, 32, 43, 48] [14, 17, 18, 27, 39, 41] [9, 12, 30, 40, 45, 49] [6, 8, 15, 21, 22, 34] [4, 13, 14, 25, 28, 37] [10, 13, 33, 35, 42, 47] [21, 31, 33, 37, 43] [23, 35, 36, 38, 48, 49] [1, 5, 7, 9, 15, 44] [2, 3, 4, 7, 41, 42] [10, 16, 17, 25, 29, 34] [22, 23, 26, 32, 35, 46] [15, 16, 19, 27, 38, 44] [1, 11, 24, 39, 40, 44]
H_Z (15 checks, sparse supports)
[4, 10, 29, 31, 37, 42] [0, 20, 26, 30, 32, 45] [12, 13, 33, 37, 48, 49] [13, 17, 18, 23, 25, 35] [6, 8, 19, 20, 36, 38] [9, 15, 17, 27, 30, 34] [7, 18, 27, 39, 41, 44] [5, 10, 16, 24, 44, 47] [1, 6, 8, 9, 11, 12] [0, 23, 31, 43, 46, 48] [0, 2, 3, 13, 28, 47] [4, 14, 23, 26, 36, 41] [11, 16, 19, 29, 40, 45] [2, 5, 7, 8, 22, 46] [21, 25, 28, 33, 34, 47]
Code ID 50-20-3-b · download JSON · raw on GitHub