# Method **Outcome: byte target met; loss target missed.** The selected fewer-rival-columns representation occupies **11,572 bytes** including its header. Its paired report loss is **0.747741346**, SE **0.014924282**, n=2048. None of the tested settings simultaneously reached at most 12 KB and loss below 0.2. This is a measured negative result for these settings, not a proof that every possible column selection fails. Credit: Taylor (gtmcknight), `amm-sim` commit `4812a6382311624e1506aca131ca35c378f930d9`. This item implements and tests table compression for the Gaussian/plain policy; it does not deliver a Solidity strategy. Reference policy and seed conventions: [README.md](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/README.md) and [real.py](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/real.py). All scores below are locally measured replica `edge`, not Rust engine scores, and not differences against t03. Loss is full minus decoded, paired by replica seed. Each replica run uses the default 10,000 steps; full and decoded use independent policy instances with the same seed and default run parameters. See [replica2.py](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/replica2.py) and the reproduction scripts below. No dependencies were installed for this item. Before creating any compressed tables, unmodified `python3 -I gates.py` reproduced all four columns exactly to six decimal places ([gates.py](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/gates.py), expected rows in [reference gates](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/README.md)): | Seed | Perfect information | Gaussian/plain | Gaussian/qm | Lattice/qm | |---|---:|---:|---:|---:| | 10000 | 448.261189 | 443.455598 | 443.522608 | 443.663520 | | 10001 | 576.779199 | 571.463409 | 571.623551 | 571.977293 | | 10002 | 531.886497 | 525.168028 | 525.865859 | 526.411631 | ## Input inventory Directly loaded from pinned [pol_mid.json](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/pol_mid.json); the six plain policy arrays contain 71,262 offsets. Axes are `(own displacement w, rival displacement R)`, both in bps. Own rows are `w=(i-160)*5`, i=0..320, hence -800..800 in steps of 5. A means ask offset, B means bid offset, and the digit is phase. | Table | Shape | R grid | Minimum offset (bps) | Maximum offset (bps) | |---|---|---|---:|---:| | A0 | 321 × 13 | -30..30, step 5 | -24.262 | 800 | | B0 | 321 × 13 | -30..30, step 5 | -24.262 | 800 | | A1 | 321 × 49 | 5 × W2L | -31.323 | 800 | | B1 | 321 × 49 | 5 × W2L | -31.323 | 800 | | A2 | 321 × 49 | 5 × W2L | -31.333 | 800 | | B2 | 321 × 49 | 5 × W2L | -31.333 | 800 | `W2L` is the complete 49-element list in the decoder below. Its coordinates are lattice units, so multiplying by 5 gives bps, spanning -800..800. Adjacent steps are exactly `5*(W2L[j+1]-W2L[j])`; this grid is nonuniform. All original own rows are retained. No row thinning, symmetry folding, low-rank factorization, or entropy coding is used. The input also includes `VD0` (321×13, range -1.075879..0.007284) and `VD1` (321×49, range -1.045346..0.091621). They are solver value functions, exported by [dp.py](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/dp.py); [evalpol.py](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/evalpol.py) and `real.py` use only the six A/B arrays. The decoded JSON includes all six complete policy arrays and all scalar/grid metadata, and deliberately omits those two unused solver arrays. It can be loaded directly by `real.py`; it is not a replacement for solver value-function input. ## Usage measurement and parameter selection Only seeds **60000..61023** were used for measuring usage, fitting merged columns, and choosing settings. At every full-policy lookup, including initialization, one unit of mass was split between the original two R columns by their interpolation weights. Totals by phase were 3,668,359; 5,095,019; and 2,261,541 lookup-equivalents. Phase 0's two edge columns carried 73.208573% of its mass. In phases 1 and 2, columns 18..30 (R=-30..30 bps) carried 77.266840% and 66.511103%. These are fractional interpolation-touch counts, not a claim that all queries lay in those intervals. `q05/q10/q20` retain the indicated weighted marginal quantiles for retail phases and the phase-0 edges plus center. Other settings refine spacing and allocate more of the nine retained phase/column positions to the more frequently used phase 1. Wider controls measure the byte/loss tradeoff; `quantall` keeps every column and isolates integer rounding. Every setting uses the same int16 payload and linear decoding. Merged settings (names starting `m`) use the same column indices as the named base setting. They merge dropped R columns into the retained values using weighted least squares per own row and side. Joint `(row,column)` weights come from the full policy on the choose seeds, distributing lookup mass by both original bilinear weights. For each row, let B be the clamped linear basis on retained R knots, h the joint usage histogram, y the original offsets, and yK the original values at those knots. Solve `(Bᵀ diag(h^p) B + 0.001 I) v = Bᵀ diag(h^p) y + 0.001 yK`, clip v to [-800,800], then round to integer bps using Python's nearest/ties-to-even `round`. Suffix `0.5` or `1.0` is p. Unmerged settings simply round the original values at retained columns. This changes only how columns are dropped/merged within the one representation. Selection rule: minimum choose-set mean loss among measured settings with total blob size <=12,000 bytes. Selection was frozen before evaluating the chosen setting on **10000..12047**. The report set was run once for the full policy and once for the frozen decoded policy; no report-set tuning followed. # Encoding Binary format `RC01`, no padding. Every integer offset is signed two's-complement **little-endian int16**, scale **1 bps per integer**. There is no floating-point payload. 1. Bytes 0..3: ASCII `RC01` (`52 43 30 31` hexadecimal). 2. For phases 0,1,2 in order: one uint8 kept-column count k, followed by k uint8 original column indices in strictly increasing order. Phase 0 indices address its 13-element grid; phases 1/2 address `W2L`. 3. Payload tables in order **A0, B0, A1, B1, A2, B2**. Each is 321 rows × k retained columns in row-major order. Within one table, cell `(i,j)` starts at `tableStart+2*(i*k+j)`. For the chosen setting all phases keep exactly **R=-30, 0, +30 bps**. Phase-0 indices are `[0,6,12]`; phase-1/2 indices are `[18,24,30]`. The complete 16-byte header is: ```text 52 43 30 31 03 00 06 0c 03 12 18 1e 03 12 18 1e ``` | Table | Start byte | Bytes | |---|---:|---:| | A0 | 16 | 1926 | | B0 | 1942 | 1926 | | A1 | 3868 | 1926 | | B1 | 5794 | 1926 | | A2 | 7720 | 1926 | | B2 | 9646 | 1926 | End offset is 11,572. Payload alone is `6*321*3*2 = 11,556` bytes. The byte accounting includes the header, counts, indices, all own rows, and both sides. The decoder hardcodes the original grid/scalar metadata; contract lookup logic and metadata constants would occupy additional bytecode and are not included in this table-data count. Stored offset ranges are A0/B0 -24..800, A1/B1 -30..800, and A2/B2 -35..800 bps. For decoding, linearly interpolate the retained integers in physical R coordinates at every original R knot; clamp outside the first/last kept knot. Do not round interpolated values again. The original full own-row grid is unchanged. Running `real.py` on those expanded arrays gives, in real arithmetic, the same offsets as direct bilinear lookup using the retained R knots. This follows because interpolation is linear on each original interval, and every retained knot is also an original knot. It was also checked numerically below. Fee conversion remains Taylor's exponential conversion in [the reference lookup](https://raw.githubusercontent.com/gtmcknight/amm-sim/4812a6382311624e1506aca131ca35c378f930d9/research/solved/evalpol.py). # Tradeoff Every row uses n=1024 paired choose seeds. `SE = sqrt(sum((loss_i-mean)^2)/(n*(n-1)))`. `Cols` lists original indices for phases 0 / 1 / 2; `=` repeats phase 1 for phase 2. All entries, including the wider controls, were measured before the frozen holdout run. Units are replica edge. | Setting | Cols (phase 0 / 1 / 2) | Bytes | Choose loss | SE | |---|---|---:|---:|---:| | alloca | [0,12] / [18,22,26,30] / [18,24,30] | 11572 | 0.983444637 | 0.023336074 | | allocb | [0,12] / [18,24,30] / [17,22,26,31] | 11572 | 1.111001752 | 0.025468762 | | allocc | [0,12] / [18,21,24,27,30] / [18,30] | 11572 | 1.647015026 | 0.027641001 | | allocd | [0,12] / [18,30] / [18,21,24,27,30] | 11572 | 3.456053459 | 0.032339807 | | alloce | [0,12] / [18,22,26,30] / [16,24,32] | 11572 | 1.102384774 | 0.023929140 | | allocf | [0,12] / [16,22,26,32] / [18,24,30] | 11572 | 1.063649179 | 0.023689498 | | central13 | [0,6,12] / [8,12,16,18,20,22,24,26,28,30,32,36,40] / = | 37272 | 0.446164205 | 0.016206938 | | central5 | [0,6,12] / [12,18,24,30,36] / = | 16712 | 0.729181154 | 0.020116534 | | central7 | [0,6,12] / [12,18,21,24,27,30,36] / = | 21852 | 0.396806283 | 0.017619461 | | central9 | [0,6,12] / [8,12,18,21,24,27,30,36,40] / = | 26992 | 0.525851553 | 0.016681546 | | d10 | [0,6,12] / [14,24,34] / = | 11572 | 2.155177298 | 0.031026489 | | d12 | [0,6,12] / [12,24,36] / = | 11572 | 3.014817972 | 0.035773113 | | d2 | [0,6,12] / [22,24,26] / = | 11572 | 4.557504254 | 0.047237780 | | d3 | [0,6,12] / [21,24,27] / = | 11572 | 2.180578964 | 0.034630744 | | d4 | [0,6,12] / [20,24,28] / = | 11572 | 1.173825281 | 0.028115312 | | d5 | [0,6,12] / [19,24,29] / = | 11572 | 0.949462914 | 0.025620292 | | d6 | [0,6,12] / [18,24,30] / = | 11572 | 0.978907182 | 0.023225898 | | d8 | [0,6,12] / [16,24,32] / = | 11572 | 1.368311948 | 0.026052619 | | k13 | [0,1,2,3,4,5,6,7,8,9,10,11,12] / [8,16,19,21,22,23,24,25,26,27,29,32,40] / [7,14,18,20,21,23,24,25,27,28,30,34,41] | 50122 | 0.830544558 | 0.015969491 | | k5 | [0,3,6,9,12] / [8,21,24,27,40] / [7,20,24,28,41] | 19282 | 3.205925028 | 0.034127319 | | k7 | [0,2,4,6,8,10,12] / [8,19,22,24,26,29,40] / [7,18,21,24,27,30,41] | 26992 | 1.744760748 | 0.022854633 | | k9 | [0,2,3,4,6,8,9,10,12] / [8,18,21,22,24,26,27,30,40] / [7,16,20,22,24,26,28,32,41] | 34702 | 1.300247179 | 0.019656578 | | malloca0.5 | [0,12] / [18,22,26,30] / [18,24,30] | 11572 | 1.789592695 | 0.023337329 | | malloca1.0 | [0,12] / [18,22,26,30] / [18,24,30] | 11572 | 0.772461201 | 0.019402465 | | md40.5 | [0,6,12] / [20,24,28] / = | 11572 | 2.160351970 | 0.025106535 | | md41.0 | [0,6,12] / [20,24,28] / = | 11572 | 0.919994371 | 0.021186051 | | md50.5 | [0,6,12] / [19,24,29] / = | 11572 | 1.900374014 | 0.023964846 | | md51.0 | [0,6,12] / [19,24,29] / = | 11572 | 0.774686536 | 0.019856688 | | md60.5 | [0,6,12] / [18,24,30] / = | 11572 | 1.866917383 | 0.022452058 | | md61.0 | [0,6,12] / [18,24,30] / = | 11572 | 0.743289135 | 0.020053542 | | mr10.5 | [0,12] / [19,23,25,29] / [19,24,29] | 11572 | 1.858637807 | 0.025367219 | | mr11.0 | [0,12] / [19,23,25,29] / [19,24,29] | 11572 | 0.802556668 | 0.020422064 | | mr20.5 | [0,12] / [18,23,25,30] / [19,24,29] | 11572 | 1.766029962 | 0.024363314 | | mr21.0 | [0,12] / [18,23,25,30] / [19,24,29] | 11572 | 0.760440067 | 0.019791461 | | q05 | [0,6,12] / [13,24,35] / [11,24,37] | 11572 | 2.954963352 | 0.037038175 | | q10 | [0,6,12] / [17,24,31] / [14,24,34] | 11572 | 1.344916197 | 0.027490182 | | q20 | [0,6,12] / [19,24,29] / [18,24,30] | 11572 | 0.982004345 | 0.023760793 | | quantall | all 13 / all 49 / = | 142642 | 0.010781585 | 0.010452205 | | r1 | [0,12] / [19,23,25,29] / [19,24,29] | 11572 | 0.986813183 | 0.026532624 | | r2 | [0,12] / [18,23,25,30] / [19,24,29] | 11572 | 0.976335176 | 0.025201628 | | r3 | [0,12] / [19,22,26,29] / [19,24,29] | 11572 | 1.019429773 | 0.025601529 | | r4 | [0,12] / [20,23,25,28] / [19,24,29] | 11572 | 1.253385428 | 0.028949908 | | r5 | [0,12] / [19,24,29] / [19,23,25,29] | 11572 | 1.097635502 | 0.027040405 | | r6 | [0,12] / [19,22,26,29] / [18,24,30] | 11572 | 1.059304737 | 0.025552858 | | r7 | [0,12] / [19,23,25,29] / [18,24,30] | 11572 | 1.012775993 | 0.025702096 | | r8 | [0,12] / [19,21,24,27,29] / [19,29] | 11572 | 1.545718878 | 0.028831725 | Merged-name parsing examples: `md61.0` = merge `d6` with p=1.0; `malloca0.5` = merge `alloca` with p=0.5. `quantall` is a control, not a candidate satisfying the byte limit. Its small loss shows that integer rounding alone does not explain the losses of sparse R grids. The tested denser settings are not monotonic in performance; the policy is stateful, so pointwise table error alone is not the selection criterion. The five largest choose-set losses for every setting are recorded as `seed:full-minus-decoded`: | Setting | Worst five choose seeds and losses | |---|---| | alloca | 60145:4.179343; 60084:3.597122; 60327:3.532537; 60035:3.248114; 60121:3.166388 | | allocb | 60145:4.568302; 60084:3.729562; 60188:3.666327; 60773:3.582238; 60028:3.297834 | | allocc | 60145:5.252592; 60225:4.625974; 60084:4.512702; 60035:4.255659; 60821:4.143225 | | allocd | 60000:7.226794; 60832:6.393508; 60084:6.247330; 60887:6.190501; 60831:6.143668 | | alloce | 60145:4.726038; 60327:3.636359; 61023:3.412101; 60957:3.375798; 60121:3.321190 | | allocf | 60210:3.806493; 60084:3.574804; 60028:3.414302; 60458:3.375163; 60145:3.348567 | | central13 | 60304:2.200138; 60793:2.073355; 60503:2.038615; 60681:1.755656; 60841:1.754171 | | central5 | 60210:3.301698; 60723:2.595765; 60365:2.486880; 60831:2.413539; 60285:2.370948 | | central7 | 60003:4.334343; 60831:2.557331; 60787:2.363434; 60304:2.273473; 61007:2.114541 | | central9 | 60003:3.774529; 60831:2.549984; 60188:2.283121; 60787:2.019759; 60046:1.747391 | | d10 | 60146:5.180654; 60137:5.180120; 60238:4.877265; 60065:4.841630; 60843:4.837891 | | d12 | 60843:7.732827; 60121:6.835826; 60298:6.424634; 60629:6.302192; 60252:6.157625 | | d2 | 60210:10.455307; 60984:9.696431; 60403:9.608237; 60304:9.251077; 60814:8.766493 | | d3 | 60210:8.651867; 60145:6.642569; 60839:5.625729; 60121:5.432667; 60035:5.380328 | | d4 | 60210:6.849379; 60145:5.182060; 60304:3.975981; 60559:3.840342; 60103:3.760856 | | d5 | 60188:4.707221; 60210:4.569319; 60145:4.324802; 60511:3.668258; 60084:3.666569 | | d6 | 60145:3.900370; 60304:3.297653; 60802:3.028740; 60028:2.961351; 60568:2.945009 | | d8 | 60210:4.476703; 60957:3.994106; 60511:3.894838; 60145:3.751552; 60304:3.724457 | | k13 | 60873:2.849238; 60790:2.465980; 60563:2.372401; 60692:2.296567; 60204:2.291763 | | k5 | 60819:6.114195; 60246:6.114107; 60965:6.020194; 60843:5.986346; 60972:5.943082 | | k7 | 60442:4.082971; 60204:3.952906; 60073:3.919120; 60205:3.699549; 60304:3.690902 | | k9 | 60385:3.408694; 60204:3.209868; 60122:3.001699; 60562:2.925479; 60802:2.905659 | | malloca0.5 | 60972:5.602906; 60387:4.622262; 60440:4.181785; 60375:3.910132; 60145:3.799296 | | malloca1.0 | 60773:3.046860; 61007:2.762586; 60387:2.713271; 60504:2.687058; 60440:2.622403 | | md40.5 | 60411:4.667387; 60218:4.561347; 60916:4.526272; 60404:4.376231; 60696:4.278086 | | md41.0 | 60210:4.654887; 60188:3.858375; 60145:3.564562; 60742:2.979769; 60103:2.904016 | | md50.5 | 60225:4.312231; 60583:4.142287; 60702:4.138913; 60916:4.069043; 60504:3.977949 | | md51.0 | 60145:3.222061; 60802:2.886465; 60627:2.659180; 60210:2.600811; 60365:2.541612 | | md60.5 | 60188:4.195720; 60504:4.021181; 60957:3.844371; 60145:3.753461; 60440:3.740177 | | md61.0 | 60188:3.384723; 60773:3.239911; 60010:2.743943; 60145:2.700715; 60724:2.681379 | | mr10.5 | 60238:4.351617; 60440:4.154782; 60218:4.152188; 61007:4.090777; 60887:3.905774 | | mr11.0 | 60145:3.297778; 60210:2.881416; 60916:2.818021; 60677:2.740191; 60773:2.691187 | | mr20.5 | 60972:5.812042; 60229:4.157483; 60819:4.101817; 60440:4.038629; 60387:3.765821 | | mr21.0 | 61007:2.822774; 60819:2.682631; 60916:2.554044; 60365:2.529345; 60204:2.526280 | | q05 | 60121:7.247089; 60137:6.543185; 60843:6.490136; 60766:6.169323; 60304:5.985884 | | q10 | 60084:4.052112; 60145:3.880501; 60568:3.851898; 60511:3.670666; 60826:3.483588 | | q20 | 60145:3.909540; 60304:3.446451; 60121:3.404494; 60559:3.396730; 60084:3.229629 | | quantall | 60092:1.411659; 60369:1.285347; 60542:1.074912; 60038:0.945870; 60124:0.886517 | | r1 | 60145:4.235048; 60559:3.937467; 60035:3.698955; 60839:3.561839; 60210:3.475529 | | r2 | 60145:4.312804; 60559:3.851595; 60084:3.811221; 60210:3.516366; 60304:3.349984 | | r3 | 60145:4.287889; 60210:3.816030; 60084:3.737407; 60121:3.728444; 60559:3.701599 | | r4 | 60773:4.858419; 60145:4.845721; 60210:4.805787; 60035:4.308853; 60559:4.189544 | | r5 | 60145:4.691909; 60121:4.517987; 60559:4.250245; 60238:3.946582; 60210:3.911060 | | r6 | 60773:4.680151; 60145:4.649735; 60559:4.326893; 61023:3.504228; 60412:3.340621 | | r7 | 60773:4.327233; 60145:4.223229; 60973:3.748276; 61023:3.503544; 60559:3.400489 | | r8 | 60984:4.615420; 60145:4.466396; 60858:4.455792; 60084:4.404670; 60953:4.362740 | # Chosen **`md61.0`: three merged R columns per phase, p=1.0, linear lookup, integer bps; 11,572 bytes.** Choose loss **0.743289135**, SE **0.020053542**, n=1024. This was the lowest measured choose loss among byte-compliant settings. Report seeds **10000..12047**, n=**2048**: - Full-table mean edge: **532.385688969**. - Decoded-table mean edge: **531.637947623**. - Paired loss: **0.747741346**. - Paired SE: **0.014924282**. | Worst report seed | Full edge | Decoded edge | Full minus decoded | |---|---:|---:|---:| | 10633 | 577.250315465 | 574.101980746 | 3.148334719 | | 11701 | 659.900967937 | 656.873414742 | 3.027553196 | | 10942 | 1045.928355489 | 1042.993472745 | 2.934882744 | | 11558 | 673.105591670 | 670.200918843 | 2.904672827 | | 10103 | 741.530652250 | 738.758867192 | 2.771785058 | “Worst” means the largest positive paired loss, not the lowest absolute edge. The original `real.py` reporter additionally printed full `edge 532.386, vs HA +2.828 se 0.041`, and decoded `edge 531.638, vs HA +2.081 se 0.038`; those HA SEs are different statistics from the paired full-versus-decoded SE above. # Lookup cost For the fixed chosen layout, phase determines two table base offsets. Clamp w to [-800,800] and R to [-30,30]. Choose the lower own row and either retained R interval [-30,0] or [0,30]. Read four int16 corners for ask and four for bid: **8 int16 reads = 16 payload byte reads** for both offsets, with 8 sign extensions. The fixed header/indices can be compile-time constants; a generic reader additionally parses the 16-byte header once. Using `lerp(a,b,t)=a+(b-a)*t`, the two bilinear offsets require **6 multiplications and 12 additions/subtractions** after weights/addressing. Weight computation uses two divisions (w/5 and the R fraction with denominator 30), plus additions/subtractions, floor/index selection and clamps. For an explicit address calculation per side, form `base+6*i+2*j`, then obtain the other corners by offsets +2, +6, +8; thus two such base calculations suffice. Boundary comparisons and integer address operations are additional. These are algorithmic counts, not EVM opcode or gas estimates. Taylor's ln/exp/filter and offset-to-fee exponentials are outside this lookup count. The binary decoder's expanded tables exactly matched the tables passed to the report run. A direct byte lookup and the expanded-table reference were compared on the first 2,000 callbacks of each of 50 replica runs (choose seeds 60000..60049): **100,000 callbacks**, maximum absolute fee difference **1.1102230246251565e-12 bps**. Malformed magic/header/length inputs were also rejected. This validates Python lookup equivalence, not the Solidity F gate. # Decoder Save as `decoder.py`. This is one standalone standard-library function, below 150 lines, with no original JSON dependency. It returns all six full-shape policy arrays and their grid/scalar metadata. ```python def decode_rival_columns(data): """RC01 bytes -> all six plain policy tables plus their grid metadata. int16 offsets have units of one basis point. No original JSON is needed. Solver-only value functions VD0/VD1 are not policy tables and are omitted. """ import bisect import struct if data[:4] != b'RC01': raise ValueError('bad magic') W = [-160., -130., -100., -80., -60., -50., -40., -30., -25., -20., -17., -14., -12., -11., -10., -9., -8., -7., -6., -5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 14., 17., 20., 25., 30., 40., 50., 60., 80., 100., 130., 160.] axes = [list(range(-6, 7)), W, W] cols = [] pos = 4 for axis in axes: if pos >= len(data): raise ValueError('truncated header') n = data[pos] pos += 1 c = list(data[pos:pos+n]) pos += n if (len(c) != n or n < 2 or c != sorted(set(c)) or c[-1] >= len(axis)): raise ValueError('bad columns') cols.append(c) if len(data) != pos + 1284 * sum(map(len, cols)): raise ValueError('wrong payload length') out = dict(g=0.05368206098114493, lam=0.8, sigma=9.45, size=20.0, H_bps=5.0, NW=321, W0=160, N2=49, C2=24, FB=6, W2L=W) for phase, (axis, c) in enumerate(zip(axes, cols)): x = [axis[j] for j in c] n = len(c) weights = [] for xx in axis: k = max(0, min(n-2, bisect.bisect_right(x, xx)-1)) f = max(0., min(1., (xx-x[k])/(x[k+1]-x[k]))) weights.append((k, f)) for side in 'AB': rows = [] for i in range(321): v = struct.unpack_from('<' + 'h'*n, data, pos) pos += 2*n rows.append([v[k]*(1-f)+v[k+1]*f for k, f in weights]) out[side+str(phase)] = rows return out ``` To produce the actual new JSON that `real.py` can load, save the Data block as `data.b64`, then run: ```sh base64 -d data.b64 > fewer-cols.bin python3 -I -c 'import sys,json;sys.path.insert(0,".");from decoder import decode_rival_columns;json.dump(decode_rival_columns(open("fewer-cols.bin","rb").read()),open("decoded.json","w"))' ``` # Data The entire compressed blob follows, not a hash-only substitute. Base64 whitespace is insignificant. Bytes: **11572**. SHA-256: **`abe2b32b5249eeec0cd619fa8499c01f7638b952828d9be10939f52245960dd8`**. Base64 characters excluding whitespace: **15432**. ```base64 UkMwMQMABgwDEhgeAxIYHuj/6//s/+j/6//s/+j/6//s/+j/6//s/+j/6//s/+j/6//s/+j/6//s /+j/6//s/+j/6//s/+j/6//s/+j/6//s/+j/6//s/+j/6//s/+j/6//s/+j/6//s/+j/6//s/+j/ 6//s/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t /+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/ 6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+j/6//t/+n/6//t/+n/6//t/+n/6//t /+n/6//t/+n/6//t/+n/6//t/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/ 7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u/+n/7P/u /+n/7P/u/+n/7P/u/+n/7P/v/+n/7P/v/+n/7P/v/+n/7P/v/+n/7P/v/+n/7P/v/+n/7f/v/+r/ 7f/v/+r/7f/v/+r/7f/v/+r/7f/v/+r/7f/v/+r/7f/v/+r/7f/w/+r/7f/w/+r/7f/w/+r/7f/w /+r/7f/w/+r/7f/w/+r/7f/w/+r/7v/w/+r/7v/w/+r/7v/w/+r/7v/x/+r/7v/x/+r/7v/x/+v/ 7v/x/+v/7v/x/+v/7v/x/+v/7v/x/+v/7//y/+v/7//y/+v/7//y/+v/7//y/+v/7//y/+v/7//z /+v/7//z/+z/8P/z/+z/8P/z/+z/8P/z/+z/8P/0/+z/8P/0/+z/8P/0/+z/8f/1/+z/8f/1/+3/ 8f/1/+3/8f/1/+3/7/8GAO3/8P8FAO3/8P8FAO7/8P8MAO7/8P8MAO7/8f8NAO7/8f8MAO7/8f8U AO7/8v8VAO//8v8VAO//8/8bAO//9P8cAO//9P8cAO//9f8dAPD/9/8iAPD/9/8jAPD/+P8iAPD/ +v8lAPH/+/8nAPH//P8nAPH///8nAPH/AAApAPL/AQArAPL/AwAsAPL/BQAsAPP/BgAsAPP/BwAt APT/CQAwAPX/CwAyAPX/DAAxAPb/DgA0APf/EAA0APj/EQAyAPr/EgAvAPv/EgAzAP7/EwAtAAEA EAAwAAMAFAAwAAgADQBIAAwACwAzAA8AEgAsABEAEwAsABIAFAAsABMAFQAtABkAEwAuABsAFQAu ABwAGAAuABwAHAAuAB4AHAAuAB8AHgAvACEAHwAvACMAHwAwACQAIQAwACYAIAAxACgAIgAyACwA IgAzADgAIwA0ADkAKAA1ADcANwA3ADwAPAA8AEEAQQBBAEYARgBGAEsASwBLAFAAUABQAFUAVQBV AFoAWgBaAF8AXwBfAGQAZABkAGkAaQBpAG4AbgBuAHMAcwBzAHgAeAB4AH0AfQB9AIIAggCCAIcA hwCHAIwAjACMAJEAkQCRAJYAlgCWAJsAmwCbAKAAoACgAKUApQClAKoAqgCqAK8ArwCvALQAtAC0 ALkAuQC5AL4AvgC+AMMAwwDDAMgAyADIAM0AzQDNANIA0gDSANcA1wDXANwA3ADcAOEA4QDhAOYA 5gDmAOsA6wDrAPAA8ADwAPUA9QD1APoA+gD6AP8A/wD/AAQBBAEEAQkBCQEJAQ4BDgEOARMBEwET ARgBGAEYAR0BHQEdASIBIgEiAScBJwEnASwBLAEsATEBMQExATYBNgE2ATsBOwE7AUABQAFAAUUB RQFFAUoBSgFKAU8BTwFPAVQBVAFUAVkBWQFZAV4BXgFeAWMBYwFjAWgBaAFoAW0BbQFtAXIBcgFy AXcBdwF3AXwBfAF8AYEBgQGBAYYBhgGGAYsBiwGLAZABkAGQAZUBlQGVAZoBmgGaAZ8BnwGfAaQB pAGkAakBqQGpAa4BrgGuAbMBswGzAbgBuAG4Ab0BvQG9AcIBwgHCAccBxwHHAcwBzAHMAdEB0QHR AdYB1gHWAdsB2wHbAeAB4AHgAeUB5QHlAeoB6gHqAe8B7wHvAfQB9AH0AfkB+QH5Af4B/gH+AQMC AwIDAggCCAIIAg0CDQINAhICEgISAhcCFwIXAhwCHAIcAiECIQIhAiYCJgImAisCKwIrAjACMAIw AjUCNQI1AjoCOgI6Aj8CPwI/AkQCRAJEAkkCSQJJAk4CTgJOAlMCUwJTAlgCWAJYAl0CXQJdAmIC YgJiAmcCZwJnAmwCbAJsAnECcQJxAnYCdgJ2AnsCewJ7AoACgAKAAoUChQKFAooCigKKAo8CjwKP ApQClAKUApkCmQKZAp4CngKeAqMCowKjAqgCqAKoAq0CrQKtArICsgKyArcCtwK3ArwCvAK8AsEC wQLBAsYCxgLGAssCywLLAtAC0ALQAtUC1QLVAtoC2gLaAt8C3wLfAuQC5ALkAukC6QLpAu4C7gLu AvMC8wLzAvgC+AL4Av0C/QL9AgIDAgMCAwcDBwMHAwwDDAMMAxEDEQMRAxYDFgMWAxsDGwMbAyAD IAMgAyADIAMgAxsDGwMbAxYDFgMWAxEDEQMRAwwDDAMMAwcDBwMHAwIDAgMCA/0C/QL9AvgC+AL4 AvMC8wLzAu4C7gLuAukC6QLpAuQC5ALkAt8C3wLfAtoC2gLaAtUC1QLVAtAC0ALQAssCywLLAsYC xgLGAsECwQLBArwCvAK8ArcCtwK3ArICsgKyAq0CrQKtAqgCqAKoAqMCowKjAp4CngKeApkCmQKZ ApQClAKUAo8CjwKPAooCigKKAoUChQKFAoACgAKAAnsCewJ7AnYCdgJ2AnECcQJxAmwCbAJsAmcC ZwJnAmICYgJiAl0CXQJdAlgCWAJYAlMCUwJTAk4CTgJOAkkCSQJJAkQCRAJEAj8CPwI/AjoCOgI6 AjUCNQI1AjACMAIwAisCKwIrAiYCJgImAiECIQIhAhwCHAIcAhcCFwIXAhICEgISAg0CDQINAggC CAIIAgMCAwIDAv4B/gH+AfkB+QH5AfQB9AH0Ae8B7wHvAeoB6gHqAeUB5QHlAeAB4AHgAdsB2wHb AdYB1gHWAdEB0QHRAcwBzAHMAccBxwHHAcIBwgHCAb0BvQG9AbgBuAG4AbMBswGzAa4BrgGuAakB qQGpAaQBpAGkAZ8BnwGfAZoBmgGaAZUBlQGVAZABkAGQAYsBiwGLAYYBhgGGAYEBgQGBAXwBfAF8 AXcBdwF3AXIBcgFyAW0BbQFtAWgBaAFoAWMBYwFjAV4BXgFeAVkBWQFZAVQBVAFUAU8BTwFPAUoB SgFKAUUBRQFFAUABQAFAATsBOwE7ATYBNgE2ATEBMQExASwBLAEsAScBJwEnASIBIgEiAR0BHQEd ARgBGAEYARMBEwETAQ4BDgEOAQkBCQEJAQQBBAEEAf8A/wD/APoA+gD6APUA9QD1APAA8ADwAOsA 6wDrAOYA5gDmAOEA4QDhANwA3ADcANcA1wDXANIA0gDSAM0AzQDNAMgAyADIAMMAwwDDAL4AvgC+ ALkAuQC5ALQAtAC0AK8ArwCvAKoAqgCqAKUApQClAKAAoACgAJsAmwCbAJYAlgCWAJEAkQCRAIwA jACMAIcAhwCHAIIAggCCAH0AfQB9AHgAeAB4AHMAcwBzAG4AbgBuAGkAaQBpAGQAZABkAF8AXwBf AFoAWgBaAFUAVQBVAFAAUABQAEsASwBLAEYARgBGAEEAQQBBADwAPAA8ADcANwA3ADUAKAA9ADQA IwBEADMAIgAsADIAIgAoADEAIAAmADAAIQAkADAAHwAjAC8AHwAhAC8AHgAfAC4AHAAeAC4AHAAc AC4AGAAcAC4AFQAbAC4AEwAZAC0AFQATACwAFAASACwAEwARACwAEgAPADQACwAMADgADQAIAC4A FAADAEoAEAABAC8AEwD+/y8AEgD7/zQAEgD6/zQAEQD4/zMAEAD3/zIADgD2/zIADAD1/zEACwD1 /zAACQD0/y4ABwDz/y0ABgDz/ywABQDy/ysAAwDy/yoAAQDy/ykAAADx/ycA///x/ycA/P/x/ycA +//x/ycA+//w/yQA+P/w/yMA9//w/yIA9//w/x0A9f/v/xwA9P/v/xwA9P/v/xsA8//v/xQA8v/v /xQA8v/u/xMA8f/u/wsA8f/u/wsA8f/u/wsA8P/u/wwA8P/t/wYA8P/t/wYA8P/t/wcA7//t//X/ 8f/t//X/8f/t//X/8f/s//X/8f/s//T/8P/s//T/8P/s//T/8P/s//P/8P/s//P/8P/s//P/8P/s //P/7//r//P/7//r//L/7//r//L/7//r//L/7//r//L/7//r//L/7//r//H/7v/r//H/7v/r//H/ 7v/r//H/7v/r//H/7v/q//H/7v/q//H/7v/q//D/7v/q//D/7v/q//D/7v/q//D/7f/q//D/7f/q //D/7f/q//D/7f/q//D/7f/q//D/7f/q//D/7f/q/+//7f/q/+//7f/q/+//7f/q/+//7f/q/+// 7f/q/+//7f/q/+//7f/p/+//7P/p/+//7P/p/+//7P/p/+//7P/p/+//7P/p/+//7P/p/+7/7P/p /+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/ 7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+7/7P/p/+3/6//p/+3/6//p /+3/6//p/+3/6//p/+3/6//p/+3/6//p/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/ 6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o /+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/6//o/+3/ 6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o /+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+z/6//o/+P/5//n/+L/ 5//n/+L/5//n/+P/5//n/+P/5//n/+P/5//n/+P/5//n/+P/5//n/+P/6P/n/+P/5//n/+P/5//n /+P/5//n/+P/5//o/+P/6P/n/+P/5//n/+P/5//n/+P/5//o/+P/5//o/+P/5//n/+P/5//n/+P/ 5//n/+P/5//n/+T/5//o/+P/5//o/+P/6P/n/+P/6P/o/+P/5//o/+P/5//o/+P/5//o/+P/5//o /+P/5//o/+P/5//o/+P/5//o/+P/6P/o/+P/6P/o/+P/6P/o/+P/6P/o/+P/6P/o/+P/6P/o/+P/ 6P/o/+P/6P/o/+P/6P/o/+T/6P/o/+P/6P/o/+T/6P/o/+T/6P/o/+T/6P/o/+P/6P/o/+P/6P/o /+P/6f/o/+P/6P/o/+T/6P/o/+T/6P/p/+T/6f/p/+T/6P/o/+T/6P/p/+T/6P/p/+T/6f/p/+P/ 6f/p/+P/6f/p/+T/6f/p/+T/6f/p/+T/6f/p/+T/6f/p/+T/6f/p/+T/6f/p/+T/6f/p/+T/6f/p /+T/6f/p/+T/6f/p/+T/6f/p/+T/6f/q/+T/6f/p/+T/6v/q/+T/6f/q/+T/6f/q/+T/6v/q/+T/ 6v/q/+X/6v/q/+T/6v/q/+X/6v/q/+X/6v/q/+X/6v/q/+X/6v/q/+X/6v/r/+X/6v/q/+X/6v/q /+X/6v/r/+X/6//r/+X/6//r/+X/6//r/+X/6//r/+X/6//r/+X/6//r/+b/6//r/+b/6//r/+b/ 6//s/+b/6//s/+b/7P/s/+b/7P/s/+b/7P/s/+b/7P/s/+b/7P/s/+f/7P/s/+f/7P/t/+f/7f/t /+f/7f/t/+f/7f/u/+f/7f/u/+f/7f/v/+f/7f/w/+f/7f/v/+j/7v/u/+j/7v/w/+j/7v/v/+j/ 7v/u/+j/7//u/+j/7//u/+j/7//v/+n/7//x/+n/7//v/+n/7//w/+n/8P/y/+n/8P/z/+r/8P/z /+r/8P/0/+r/8P/2/+r/8P/1/+v/8P/5/+v/8P/8/+v/8P/8/+z/7v8QAOz/7/8XAOz/7/8eAO3/ 8P8fAO3/8v8jAO3/8v8kAO3/9v8oAO7/9v8pAO7/+/8rAO///P8rAO//AwAqAPD/BAArAPD/CwAq APH/CwAqAPP/EAAqAPX/EQAqAPf/EwAqAPr/FAArAP3/FAArAP7/FwArAAAAGQArAAIAGgAsAAQA GgAsAAcAGgAtAAkAGgAuAAsAGgAuABAAGgAwABMAGgAwABUAGgAwABYAGwAwABcAHAAwABoAHAAx ABwAHQAyAB8AHQAzACMAHgA0ACYAHgA1ACoAHgA2AC0AHgA2ADAAIwA2ADQAKwA3ADgANAA5ADwA OwA+AEEAQABCAEYARQBIAEsASgBNAFAATwBSAFUAVABXAFoAWQBcAF8AXgBhAGQAYwBmAGkAaABr AG4AbQBwAHMAcgB1AHgAdwB6AH0AfAB+AIIAgQCDAIcAhgCIAIwAjACNAJEAkQCRAJYAlgCWAJsA mwCbAKAAoACgAKUApQClAKoAqgCqAK8ArwCvALQAtAC0ALkAuQC5AL4AvgC+AMMAwwDDAMgAyADI AM0AzQDNANIA0gDSANcA1wDXANwA3ADcAOEA4QDhAOYA5gDmAOsA6wDrAPAA8ADwAPUA9QD1APoA +gD6AP8A/wD/AAQBBAEEAQkBCQEJAQ4BDgEOARMBEwETARgBGAEYAR0BHQEdASIBIgEiAScBJwEn ASwBLAEsATEBMQExATYBNgE2ATsBOwE7AUABQAFAAUUBRQFFAUoBSgFKAU8BTwFPAVQBVAFUAVkB WQFZAV4BXgFeAWMBYwFjAWgBaAFoAW0BbQFtAXIBcgFyAXcBdwF3AXwBfAF8AYEBgQGBAYYBhgGG AYsBiwGLAZABkAGQAZUBlQGVAZoBmgGaAZ8BnwGfAaQBpAGkAakBqQGpAa4BrgGuAbMBswGzAbgB uAG4Ab0BvQG9AcIBwgHCAccBxwHHAcwBzAHMAdEB0QHRAdYB1gHWAdsB2wHbAeAB4AHgAeUB5QHl AeoB6gHqAe8B7wHvAfQB9AH0AfkB+QH5Af4B/gH+AQMCAwIDAggCCAIIAg0CDQINAhICEgISAhcC FwIXAhwCHAIcAiECIQIhAiYCJgImAisCKwIrAjACMAIwAjUCNQI1AjoCOgI6Aj8CPwI/AkQCRAJE AkkCSQJJAk4CTgJOAlMCUwJTAlgCWAJYAl0CXQJdAmICYgJiAmcCZwJnAmwCbAJsAnECcQJxAnYC dgJ2AnsCewJ7AoACgAKAAoUChQKFAooCigKKAo8CjwKPApQClAKUApkCmQKZAp4CngKeAqMCowKj AqgCqAKoAq0CrQKtArICsgKyArcCtwK3ArwCvAK8AsECwQLBAsYCxgLGAssCywLLAtAC0ALQAtUC 1QLVAtoC2gLaAt8C3wLfAuQC5ALkAukC6QLpAu4C7gLuAvMC8wLzAvgC+AL4Av0C/QL9AgIDAgMC AwcDBwMHAwwDDAMMAxEDEQMRAxYDFgMWAxsDGwMbAyADIAMgAyADIAMgAxsDGwMbAxYDFgMWAxED EQMRAwwDDAMMAwcDBwMHAwIDAgMCA/0C/QL9AvgC+AL4AvMC8wLzAu4C7gLuAukC6QLpAuQC5ALk At8C3wLfAtoC2gLaAtUC1QLVAtAC0ALQAssCywLLAsYCxgLGAsECwQLBArwCvAK8ArcCtwK3ArIC sgKyAq0CrQKtAqgCqAKoAqMCowKjAp4CngKeApkCmQKZApQClAKUAo8CjwKPAooCigKKAoUChQKF AoACgAKAAnsCewJ7AnYCdgJ2AnECcQJxAmwCbAJsAmcCZwJnAmICYgJiAl0CXQJdAlgCWAJYAlMC UwJTAk4CTgJOAkkCSQJJAkQCRAJEAj8CPwI/AjoCOgI6AjUCNQI1AjACMAIwAisCKwIrAiYCJgIm AiECIQIhAhwCHAIcAhcCFwIXAhICEgISAg0CDQINAggCCAIIAgMCAwIDAv4B/gH+AfkB+QH5AfQB 9AH0Ae8B7wHvAeoB6gHqAeUB5QHlAeAB4AHgAdsB2wHbAdYB1gHWAdEB0QHRAcwBzAHMAccBxwHH AcIBwgHCAb0BvQG9AbgBuAG4AbMBswGzAa4BrgGuAakBqQGpAaQBpAGkAZ8BnwGfAZoBmgGaAZUB lQGVAZABkAGQAYsBiwGLAYYBhgGGAYEBgQGBAXwBfAF8AXcBdwF3AXIBcgFyAW0BbQFtAWgBaAFo AWMBYwFjAV4BXgFeAVkBWQFZAVQBVAFUAU8BTwFPAUoBSgFKAUUBRQFFAUABQAFAATsBOwE7ATYB NgE2ATEBMQExASwBLAEsAScBJwEnASIBIgEiAR0BHQEdARgBGAEYARMBEwETAQ4BDgEOAQkBCQEJ AQQBBAEEAf8A/wD/APoA+gD6APUA9QD1APAA8ADwAOsA6wDrAOYA5gDmAOEA4QDhANwA3ADcANcA 1wDXANIA0gDSAM0AzQDNAMgAyADIAMMAwwDDAL4AvgC+ALkAuQC5ALQAtAC0AK8ArwCvAKoAqgCq AKUApQClAKAAoACgAJsAmwCbAJYAlgCWAJEAkQCRAI0AjACMAIgAhgCHAIMAgQCCAH4AfAB9AHoA dwB4AHUAcgBzAHAAbQBuAGsAaABpAGYAYwBkAGEAXgBfAFwAWQBaAFcAVABVAFIATwBQAE0ASgBL AEgARQBGAEIAQABBAD4AOwA8ADkANAA4ADcAKwA0ADYAIwAwADYAHgAtADYAHgAqADUAHgAmADQA HgAjADMAHQAfADIAHQAcADEAHAAaADAAHAAXADAAGwAWADAAGgAVADAAGgATADAAGgAQAC4AGgAL AC4AGgAJAC0AGgAHACwAGgAEACwAGgACACsAGQAAACsAFwD+/ysAFAD9/ysAFAD6/yoAEwD3/yoA EQD1/yoAEADz/yoACwDx/yoACwDw/ysABADw/yoAAwDv/ysA/P/v/ysA/P/u/ykA9v/u/ygA9v/t /yQA8v/t/yMA8v/t/x8A8P/s/x0A7//s/xYA7//s/w4A7//s//v/8f/r//r/8P/r//j/8P/r//b/ 8P/q//X/8P/q//X/8P/q//H/8P/q//L/8P/p//P/7//p//H/7//p//D/7//p//H/7//p/+//7//o //H/7v/o//H/7v/o/+7/7v/o/+7/7v/o/+7/7v/o/+//7v/o/+7/7v/n/+3/7v/n/+3/7f/n/+3/ 7f/n/+7/7f/n/+3/7f/n/+3/7f/n/+7/7P/n/+z/7P/n/+z/7P/m/+z/7P/m/+z/7P/m/+z/7P/m /+z/7P/m/+z/7P/m/+z/6//m/+v/6//m/+v/6//m/+v/6//m/+v/6//l/+v/6//m/+v/6//l/+v/ 6//l/+v/6v/l/+v/6//l/+v/6v/l/+r/6//l/+r/6v/l/+r/6v/l/+r/6v/l/+r/6v/l/+r/6v/l /+r/6v/l/+r/6v/l/+r/6v/l/+r/6v/l/+r/6v/k/+r/6f/k/+r/6f/k/+n/6f/k/+r/6f/k/+n/ 6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k /+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+j/6f/k/+n/6P/k/+n/6P/k/+j/6f/k/+j/ 6P/k/+j/6P/k/+j/6P/k/+j/6P/k/+j/6P/k/+j/6P/j/+j/6P/k/+j/6P/j/+j/6P/j/+j/6P/j /+j/6P/k/+n/6P/j/+j/6P/j/+j/6P/j/+j/6P/j/+j/6P/j/+j/6P/j/+j/6P/j/+j/6P/j/+j/ 5//j/+j/6P/j/+j/6P/j/+j/5//j/+j/5//j/+j/6P/j/+j/6P/j/+j/6P/j/+f/6P/j/+f/5//j /+j/5//j/+j/5//k/+f/6P/j/+f/5//j/+f/5//j/+f/5//i/+j/5//j/+f/5//j/+f/6P/i/+f/ 5//j/+f/6P/i/+b/6P/j/+f/5//i/+f/5//j/+f/5//j/+f/5//j/+f/5//j/+f/5v/k/+f/5//j /+b/5//j/+f/5//j/+f/5//i/+f/5//j/+H/5f/l/+H/5v/l/+H/5f/l/+H/5f/l/+H/5f/l/+H/ 5v/l/+H/5v/l/+H/5f/l/+H/5//l/+H/5f/k/+L/5f/l/+L/5f/k/+H/5v/d/+H/5v/g/+H/5f/l /+H/5f/l/+H/5f/l/+L/5f/m/+H/5v/l/+H/5f/l/+H/6P/l/+L/5v/m/+L/5f/m/+L/5v/l/+L/ 5//l/+H/5f/l/+H/5v/l/+H/5v/l/+L/5f/l/+H/5v/l/+H/5//m/+H/5v/m/+H/5//l/+L/5v/l /+L/5v/l/+L/5v/m/+L/5v/m/+H/5v/l/+L/5v/m/+L/5v/m/+L/5v/l/+L/5v/m/+L/5v/l/+L/ 5v/m/+L/5v/m/+L/5v/m/+L/5v/m/+L/5v/m/+L/5v/m/+L/5v/m/+L/5//m/+L/5//m/+L/5v/n /+L/5v/n/+L/5v/n/+L/5v/m/+L/5v/m/+L/5v/m/+L/5v/m/+L/5//m/+L/5//n/+L/5//l/+L/ 5//n/+P/5//n/+P/5//n/+P/5//n/+P/5//n/+P/5//n/+P/5//n/+P/5//n/+P/5//n/+P/5//n /+P/5//n/+P/6P/n/+P/6P/n/+P/6P/n/+P/5//n/+P/6P/n/+P/6P/o/+P/6P/o/+P/6P/o/+P/ 6P/o/+P/6P/o/+T/6P/o/+T/6P/o/+T/6f/o/+T/6P/o/+T/6P/o/+T/6P/p/+T/6f/p/+T/6f/p /+T/6f/p/+T/6f/p/+T/6f/p/+T/6f/p/+T/6f/p/+X/6f/p/+X/6v/p/+X/6v/p/+X/6v/p/+X/ 6v/q/+X/6v/q/+X/6v/q/+X/6v/q/+X/6v/q/+b/6//q/+b/6//q/+b/6//q/+b/6//q/+b/6//q /+b/6//q/+b/7P/q/+b/7P/q/+f/7P/r/+f/7P/r/+f/7f/q/+f/7f/q/+f/7f/r/+f/7f/r/+f/ 7f/r/+j/7f/r/+j/7v/r/+j/7v/r/+j/7v/s/+n/7v/s/+n/7//s/+n/7//s/+n/7//s/+r/7//v /+r/7//t/+r/7//v/+r/7//x/+v/7//x/+v/7//0/+v/7//2/+z/7//7/+z/8P/7/+z/7f8SAO3/ 7f8aAO3/7/8gAO7/8f8nAO7/9f8rAO//9v8sAPD/+/8uAPH/AwArAPL/AwAsAPT/CgArAPf/CwAs APn/EAAsAPv/EQAsAP3/FQArAP7/GQArAAAAGwArAAIAGwArAAMAGwAsAAcAGgAtAAkAGgAuAA8A GgAwABEAGgAwABQAGwAwABUAGwAwABYAHAAwABkAHAAwABsAHQAxAB8AHQAzACMAHgAzACcAHgA1 ACoAHgA2AC0AHQA3ADEAIAA4ADUAJwA5ADkAMQA6AD0AOgA+AEEAQABDAEYARQBIAEsASgBNAFAA TwBSAFUAVABXAFoAWQBcAF8AXgBhAGQAYwBmAGkAaABqAG4AbQBwAHMAcgB1AHgAdwB5AH0AfQB+ AIIAggCDAIcAhwCIAIwAjACNAJEAkQCRAJYAlgCWAJsAmwCbAKAAoACgAKUApQClAKoAqgCqAK8A rwCvALQAtAC0ALkAuQC5AL4AvgC+AMMAwwDDAMgAyADIAM0AzQDNANIA0gDSANcA1wDXANwA3ADc AOEA4QDhAOYA5gDmAOsA6wDrAPAA8ADwAPUA9QD1APoA+gD6AP8A/wD/AAQBBAEEAQkBCQEJAQ4B DgEOARMBEwETARgBGAEYAR0BHQEdASIBIgEiAScBJwEnASwBLAEsATEBMQExATYBNgE2ATsBOwE7 AUABQAFAAUUBRQFFAUoBSgFKAU8BTwFPAVQBVAFUAVkBWQFZAV4BXgFeAWMBYwFjAWgBaAFoAW0B bQFtAXIBcgFyAXcBdwF3AXwBfAF8AYEBgQGBAYYBhgGGAYsBiwGLAZABkAGQAZUBlQGVAZoBmgGa AZ8BnwGfAaQBpAGkAakBqQGpAa4BrgGuAbMBswGzAbgBuAG4Ab0BvQG9AcIBwgHCAccBxwHHAcwB zAHMAdEB0QHRAdYB1gHWAdsB2wHbAeAB4AHgAeUB5QHlAeoB6gHqAe8B7wHvAfQB9AH0AfkB+QH5 Af4B/gH+AQMCAwIDAggCCAIIAg0CDQINAhICEgISAhcCFwIXAhwCHAIcAiECIQIhAiYCJgImAisC KwIrAjACMAIwAjUCNQI1AjoCOgI6Aj8CPwI/AkQCRAJEAkkCSQJJAk4CTgJOAlMCUwJTAlgCWAJY Al0CXQJdAmICYgJiAmcCZwJnAmwCbAJsAnECcQJxAnYCdgJ2AnsCewJ7AoACgAKAAoUChQKFAooC igKKAo8CjwKPApQClAKUApkCmQKZAp4CngKeAqMCowKjAqgCqAKoAq0CrQKtArICsgKyArcCtwK3 ArwCvAK8AsECwQLBAsYCxgLGAssCywLLAtAC0ALQAtUC1QLVAtoC2gLaAt8C3wLfAuQC5ALkAukC 6QLpAu4C7gLuAvMC8wLzAvgC+AL4Av0C/QL9AgIDAgMCAwcDBwMHAwwDDAMMAxEDEQMRAxYDFgMW AxsDGwMbAyADIAMgAyADIAMgAxsDGwMbAxYDFgMWAxEDEQMRAwwDDAMMAwcDBwMHAwIDAgMCA/0C /QL9AvgC+AL4AvMC8wLzAu4C7gLuAukC6QLpAuQC5ALkAt8C3wLfAtoC2gLaAtUC1QLVAtAC0ALQ AssCywLLAsYCxgLGAsECwQLBArwCvAK8ArcCtwK3ArICsgKyAq0CrQKtAqgCqAKoAqMCowKjAp4C ngKeApkCmQKZApQClAKUAo8CjwKPAooCigKKAoUChQKFAoACgAKAAnsCewJ7AnYCdgJ2AnECcQJx AmwCbAJsAmcCZwJnAmICYgJiAl0CXQJdAlgCWAJYAlMCUwJTAk4CTgJOAkkCSQJJAkQCRAJEAj8C PwI/AjoCOgI6AjUCNQI1AjACMAIwAisCKwIrAiYCJgImAiECIQIhAhwCHAIcAhcCFwIXAhICEgIS Ag0CDQINAggCCAIIAgMCAwIDAv4B/gH+AfkB+QH5AfQB9AH0Ae8B7wHvAeoB6gHqAeUB5QHlAeAB 4AHgAdsB2wHbAdYB1gHWAdEB0QHRAcwBzAHMAccBxwHHAcIBwgHCAb0BvQG9AbgBuAG4AbMBswGz Aa4BrgGuAakBqQGpAaQBpAGkAZ8BnwGfAZoBmgGaAZUBlQGVAZABkAGQAYsBiwGLAYYBhgGGAYEB gQGBAXwBfAF8AXcBdwF3AXIBcgFyAW0BbQFtAWgBaAFoAWMBYwFjAV4BXgFeAVkBWQFZAVQBVAFU AU8BTwFPAUoBSgFKAUUBRQFFAUABQAFAATsBOwE7ATYBNgE2ATEBMQExASwBLAEsAScBJwEnASIB IgEiAR0BHQEdARgBGAEYARMBEwETAQ4BDgEOAQkBCQEJAQQBBAEEAf8A/wD/APoA+gD6APUA9QD1 APAA8ADwAOsA6wDrAOYA5gDmAOEA4QDhANwA3ADcANcA1wDXANIA0gDSAM0AzQDNAMgAyADIAMMA wwDDAL4AvgC+ALkAuQC5ALQAtAC0AK8ArwCvAKoAqgCqAKUApQClAKAAoACgAJsAmwCbAJYAlgCW AJEAkQCRAI0AjACMAIgAhwCHAIMAggCCAH4AfAB9AHkAdwB4AHUAcgBzAHAAbQBuAGoAaABpAGYA YwBkAGEAXgBfAFwAWQBaAFcAVABVAFEATwBQAE0ASgBLAEgARQBGAEMAQABBAD4AOgA9ADoAMQA5 ADkAJwA2ADgAIAAyADcAHQAtADYAHgAqADUAHgAnADMAHgAjADMAHQAfADEAHQAbADEAHAAZADAA HAAWADAAGwAVADAAGwAUADAAGgARADAAGgAPAC4AGgAJAC0AGgAHACwAGwADACsAGwACACsAGwAA ACsAGQD+/ysAFQD9/ywAEQD7/ywAEAD5/ywACgD3/ysACgD0/ywAAwDy/ywAAwDx/y4A+//w/ysA 9v/v/yoA9f/u/ycA8v/u/yAA7//t/xgA7v/t/w4A7v/s//z/8P/s//r/7//s//b/7//r//X/7//r //T/7//r//H/7//q//H/7//q/+7/7//q/+7/7//q/+z/7//p/+z/7//p/+z/7v/p/+z/7v/p/+z/ 7v/o/+v/7v/o/+v/7v/o/+v/7f/o/+v/7f/n/+v/7f/n/+v/7f/n/+r/7f/n/+v/7P/n/+r/7P/n /+r/7P/n/+r/7P/n/+r/6//m/+r/7P/m/+r/6//m/+r/6//m/+r/6//m/+r/6//m/+v/6v/l/+r/ 6v/l/+r/6v/l/+r/6v/l/+r/6v/l/+r/6v/l/+r/6v/l/+n/6v/l/+n/6f/l/+n/6f/l/+n/6f/l /+n/6f/k/+n/6f/k/+n/6f/k/+n/6f/k/+n/6P/k/+n/6P/k/+j/6P/k/+j/6f/k/+n/6P/k/+j/ 6P/k/+j/6P/k/+j/6P/k/+j/6P/j/+j/6P/j/+j/6P/j/+j/6P/j/+j/6P/j/+j/5//j/+j/6P/j /+j/5//j/+j/5//j/+j/6P/j/+f/6P/j/+f/5//j/+f/5//j/+f/5//j/+f/5//j/+f/5//j/+f/ 5//j/+f/5//j/+f/5//j/+f/5//i/+f/5//i/+b/5//i/+b/5//i/+f/5//i/+f/5//i/+f/5//i /+b/5//i/+f/5v/i/+b/5//i/+b/5v/i/+b/5//i/+X/5//i/+b/5v/i/+b/5v/i/+b/5v/i/+b/ 5v/i/+b/5//i/+X/5//i/+b/5v/i/+b/5v/i/+b/5//i/+b/5v/i/+b/5v/i/+b/5v/i/+b/5v/i /+b/5v/i/93/5//i/+b/5f/h/+X/5v/h/+b/5v/h/+X/5v/i/+b/6P/i/+P/5v/i/+T/5v/i/+X/ 5v/h/+X/5f/h/+b/5v/h/+b/5v/h/+T/5v/h/+X/5v/h/+X/5v/h/+X/5//h/+T/5f/h/+X/5f/i /+T/5f/i/+P/5v/h/+X/5//h/+X/5//h/+X/5f/h/+P/5f/i/+H/5f/i/+L/5v/i/+T/5f/h/+X/ 5f/h/+X/5f/h/+X/5P/h/+X/5f/h/+T/5v/i/+X/5v/h/+X/5v/h/+T/5f/h/+T/5//h/+X/5f/h /w== ``` ## Reproduction Check out Taylor's repository at the pinned commit into a permitted scratch directory and work with its `research/solved` files. No package installation or environment setup is needed. The brief and README agree on `python3 -I real.py plain:soft=1`; there was no command-name discrepancy. That CLI hardcodes report seeds 10000..12047 and prints aggregate statistics only. To collect per-seed rows and select choose seeds, the scorer below directly calls the same unmodified `RealPolicy(T, {'soft':1.0})` and `R.run` functions. The original reporter was also executed for both report inputs through the launcher below. This runtime defaults multiprocessing to `forkserver`, which failed while creating its Unix listener (`PermissionError: [Errno 1] Operation not permitted`). The scoring/launcher harness explicitly uses `fork`; no simulation or policy code was changed. Commands were segmented by setting; no single command exceeded eight minutes. All working state stayed under `test/scratch/` (the permitted disposable scratch directory). Save the following as `score.py`. It emits the per-seed rows and the requested paired statistic. To reproduce the frozen report without tuning, run: ```sh python3 -I score.py /path/to/amm-sim/research/solved /path/to/pol_mid.json /path/to/decoded.json 10000 2048 report.json ``` For choose evaluation use `60000 1024`. For machines needing shorter segments, use smaller disjoint seed ranges and pool their per-seed rows before computing the mean/SE; never average segment SEs. ```python # python3 -I score.py SOLVED FULL_JSON DECODED_JSON START COUNT OUTPUT_JSON import sys,os,json,math from multiprocessing import get_context SOL=os.path.abspath(sys.argv[1]);sys.path.insert(0,SOL) import real def pair(seed): full=real.R.run(seed,real.RealPolicy(real.load(sys.argv[2]),{'soft':1.0}))['edge'] decoded=real.R.run(seed,real.RealPolicy(real.load(sys.argv[3]),{'soft':1.0}))['edge'] return [seed,full,decoded,full-decoded] if __name__=='__main__': start,count=map(int,sys.argv[4:6]) with get_context('fork').Pool(8) as p:rows=p.map(pair,range(start,start+count)) json.dump(rows,open(sys.argv[6],'w')) v=[r[3] for r in rows];n=len(v);m=sum(v)/n se=math.sqrt(sum((x-m)**2 for x in v)/(n*(n-1))) print(dict(n=n,loss=m,se=se,worst5=sorted(rows,key=lambda r:-r[3])[:5])) ``` Save this as `runreal.py` to execute the original `real.py` CLI reporter and save its returned per-seed rows. Its arguments are output JSON then table JSON. Put it next to an `amm-sim` checkout, so `amm-sim/research/solved` resolves relative to the launcher, or change the single `SOL` assignment to that checkout's solved directory. `sys.setprofile` observes the reporter return; it does not change the result. It is disabled in workers to avoid profiling the simulations. ```python import sys,os,runpy,json,multiprocessing ROOT=os.path.dirname(os.path.abspath(__file__)) SOL=ROOT+'/amm-sim/research/solved' out=sys.argv[1];table=sys.argv[2] PARENT=os.getpid() def profile(frame,event,arg): if os.getpid()!=PARENT: sys.setprofile(None) return if event=='return' and frame.f_code.co_name=='report' and frame.f_code.co_filename==SOL+'/real.py': json.dump(arg,open(out,'w')) if __name__=='__main__': multiprocessing.set_start_method('fork') sys.setprofile(profile) sys.argv=[SOL+'/real.py',os.path.abspath(table),'plain:soft=1'] runpy.run_path(SOL+'/real.py',run_name='__main__') ``` The following **optional training/regeneration** script reproduces the chosen blob from the pinned `pol_mid.json`, with usage remeasured only on choose seeds. Save as `train.py` and run: ```sh python3 -I train.py /path/to/amm-sim/research/solved regenerated.bin ``` This was rerun with deterministic ordered histogram reduction and reproduced the embedded blob's SHA-256 exactly. It is not needed to decode or score the embedded data. It retains all rows and only merges along R. Taylor's simulator and Gaussian policy remain unmodified. ```python import sys,os,json,time from multiprocessing import get_context SOL=os.path.abspath(sys.argv[1]);sys.path.insert(0,SOL) import real T=real.load(SOL+'/pol_mid.json') class Joint(real.RealPolicy): def __init__(self,T,h): super().__init__(T,{'soft':1.0});self.hists=h def _fees(self,w,r,ph): p=max(0,min(12,r/5+6)) if ph==0 else self._pos2(r/5) j=min(int(p),len(self.hists[ph][0])-2);g=p-j pw=max(0,min(320,w/5+160));i=min(319,int(pw));f=pw-i for ii,ww in [(i,1-f),(i+1,f)]: self.hists[ph][ii][j]+=ww*(1-g) self.hists[ph][ii][j+1]+=ww*g return super()._fees(w,r,ph) def job(seeds): h=[[[0.0]*n for i in range(321)] for n in [13,49,49]] for s in seeds:real.R.run(s,Joint(T,h)) return h def solve(M,y): n=len(y);a=[list(row)+[v] for row,v in zip(M,y)] for i in range(n): j=max(range(i,n),key=lambda j:abs(a[j][i]));a[i],a[j]=a[j],a[i] z=a[i][i] for k in range(i,n+1):a[i][k]/=z for j in range(n): if j==i:continue z=a[j][i] for k in range(i,n+1):a[j][k]-=z*a[i][k] return [row[-1] for row in a] def encode(H): import struct,bisect power=1.0 cols=[[0,6,12],[18,24,30],[18,24,30]];blob=bytearray(b'RC01') for c in cols:blob+=bytes([len(c)])+bytes(c) for ph,c in enumerate(cols): axis=list(range(-6,7)) if ph==0 else T['W2L'];x=[axis[j] for j in c];n=len(c);basis=[] for xx in axis: k=max(0,min(n-2,bisect.bisect_right(x,xx)-1));f=max(0,min(1,(xx-x[k])/(x[k+1]-x[k])));v=[0.]*n;v[k]=1-f;v[k+1]=f;basis.append(v) for side in 'AB': for i,row in enumerate(T[side+str(ph)]): # Tiny ridge anchors entirely unobserved rows/knots to their originals. M=[[0.]*n for _ in range(n)];y=[0.]*n for j in range(n):M[j][j]=.001;y[j]=.001*row[c[j]] for j,b in enumerate(basis): w=H[ph][i][j]**power for u in range(n): y[u]+=w*b[u]*row[j] for v in range(n):M[u][v]+=w*b[u]*b[v] vals=solve(M,y) for v in vals:blob+=struct.pack('