{
 "credit": "Taylor (gtmcknight), github.com/gtmcknight/amm-sim@4812a6382311624e1506aca131ca35c378f930d9 research/solved: replica, Gaussian filter, fee rule, qm tables and the exact-arithmetic arb/retail tell. LEANBASE reference from artifact efb8e653.",
 "item": "copy-b (e04-fastlean): fast exact port of LEANBASE with a fee-correction hook",
 "ready": true,
 "parity": {
  "n": 128,
  "within_1e6": 128,
  "mean_diff": 0.0,
  "max_abs_diff": 0.0,
  "bit_identical": 128,
  "seeds": "64000..64063 and 10000..10063, replica edge per seed, fastlean minus CPython leanbase:Policy",
  "mean_edge_fast": 527.8724874783702,
  "mean_edge_cpython": 527.8724874783702,
  "zero_weights_reproduce_leanbase_bit_for_bit": {
   "linear42": true,
   "hidden4_94": true
  },
  "reference": "CPython rows from the brief's command (PROCS=4 python3 -I run.py leanbase:Policy <seed0> 64 <out> soft=1 qm=qm_k1e-5.json a0=0.35 ainf=0.35) run on the LEANBASE artifact's packed modules; sha256 of leanbase.py and of every packed module named in frozen.dependency_sha256 verified. The same command on the fetched research files (which differ from the packed copies only by one added credit comment line in 7 files) gives identical rows."
 },
 "binary64_parity_cost": {
  "edge": "none measured: all 128 seeds bit-identical",
  "tell_labels": {
   "callbacks_from_cpython_runs": 62350,
   "mismatches": 0,
   "perturbed_inputs": 79051,
   "perturbed_mismatches": 0,
   "seeds": [
    64000,
    10000,
    64001,
    10001,
    64002,
    10002
   ]
  },
  "method": "wads are trunc(double*1e18) and therefore doubles; preimage mantissa, binade and the buy window k0 use Dekker two-product / two-sum instead of big integers; fee wads are int64"
 },
 "runs_per_core_s": 149.1,
 "speed": {
  "unit": "warm runs per core-second (process_time), one process, 128 seeds 64000..64127, median of 3",
  "hook_off": 149.1,
  "hook_on_linear_42_weights": 128.2,
  "hook_on_hidden8_186_weights": 113.6,
  "all_measurements": {
   "off": [
    166.9,
    144.3,
    149.1
   ],
   "linear42": [
    128.2,
    127.2,
    128.5
   ],
   "hidden8_186": [
    105.6,
    114.7,
    113.6
   ]
  },
  "cpython_core_s_per_run": 0.355,
  "cold_process_s_incl_compile_and_128_seed_parity": 11.9,
  "warm_cache_process_s_64_seeds": 1.5
 },
 "features": [
  {
   "index": 0,
   "name": "g_m_minus_lnsprev_bps",
   "definition": "g*(m - ln s_prev)*1e4; g=+1 if is_buy (pool bought X) else -1, m = filter mean of ln price after this callback's update, s_prev = our spot after the previous callback (kit head feature 0)",
   "range": "real, unbounded",
   "observed_min": -7627.4345,
   "observed_max": 2270.3691,
   "observed_mean": -38.5987,
   "observed_sd_64000_block": 82.3798
  },
  {
   "index": 1,
   "name": "sd_bps",
   "definition": "sqrt(v)*1e4, v = filter variance after the update (kit 1)",
   "range": ">= 0",
   "observed_min": 0.0,
   "observed_max": 48.1527,
   "observed_mean": 4.324,
   "observed_sd_64000_block": 5.3392
  },
  {
   "index": 2,
   "name": "pi_last",
   "definition": "arb posterior of the most recent step-first trade after the tell (0 on a tell miss/over/unsupported); 1.0 before the first step change (kit 2)",
   "range": "[0, 1]",
   "observed_min": 0.0,
   "observed_max": 1.0,
   "observed_mean": 0.5791,
   "observed_sd_64000_block": 0.4936
  },
  {
   "index": 3,
   "name": "g_lns_minus_m_bps",
   "definition": "g*(ln s - m)*1e4, s = reserveY/reserveX from the callback's wads (kit 3)",
   "range": "real, unbounded",
   "observed_min": -7606.9573,
   "observed_max": 1053.6052,
   "observed_mean": 19.8007,
   "observed_sd_64000_block": 88.3324
  },
  {
   "index": 4,
   "name": "g_lns2h_minus_m_bps",
   "definition": "g*(ln s2h - m)*1e4, s2h = rival spot estimate after the router bind and the staleness pull (kit 4)",
   "range": "real; |ln s2h - m| <= -ln(0.997) right after a step change",
   "observed_min": -7576.9122,
   "observed_max": 59.1059,
   "observed_mean": -4.1435,
   "observed_sd_64000_block": 44.9867
  },
  {
   "index": 5,
   "name": "phase",
   "definition": "0 if read as the arb, 1 first non-arb trade of the step, 2 later ones: the table phase LEANBASE looked up (kit 5)",
   "range": "{0, 1, 2}",
   "observed_min": 0.0,
   "observed_max": 2.0,
   "observed_mean": 0.838,
   "observed_sd_64000_block": 0.7141
  },
  {
   "index": 6,
   "name": "log1p_abs_move_bps",
   "definition": "log1p(|ln(s/s_prev)|*1e4) (kit 6)",
   "range": ">= 0",
   "observed_min": 0.0,
   "observed_max": 8.9249,
   "observed_mean": 2.4969,
   "observed_sd_64000_block": 0.9576
  },
  {
   "index": 7,
   "name": "log1p_silent_steps",
   "definition": "log1p(min(dt-1, 12)) on a step's first trade, else 0; dt = timestamp - previous callback's timestamp (kit 7)",
   "range": "[0, ln 13 = 2.565]",
   "observed_min": 0.0,
   "observed_max": 2.5649,
   "observed_mean": 0.1497,
   "observed_sd_64000_block": 0.3718
  },
  {
   "index": 8,
   "name": "log1p_router_age",
   "definition": "log1p(timestamp - router_t); router_t = timestamp of the last non-arb callback whose router candidate bound the rival estimate (stalerival's `binding`), 0 at start",
   "range": "[0, ln 10000 = 9.21]",
   "observed_min": 0.0,
   "observed_max": 3.6376,
   "observed_mean": 0.4447,
   "observed_sd_64000_block": 0.6086
  },
  {
   "index": 9,
   "name": "log1p_dt",
   "definition": "log1p(dt): steps since our last trade (0 for a second trade in the same step)",
   "range": "[0, ln 10000 = 9.21]",
   "observed_min": 0.0,
   "observed_max": 3.2958,
   "observed_mean": 0.5418,
   "observed_sd_64000_block": 0.4619
  },
  {
   "index": 10,
   "name": "log1p_size_bps",
   "definition": "log1p(1e4 * paid/reserve): amountX/reserveX if is_buy else amountY/reserveY, wad-quantized, post-trade reserve",
   "range": ">= 0",
   "observed_min": 0.0,
   "observed_max": 8.0499,
   "observed_mean": 1.9219,
   "observed_sd_64000_block": 0.8645
  },
  {
   "index": 11,
   "name": "side",
   "definition": "+1 if is_buy (pool bought X) else -1",
   "range": "{-1, +1}",
   "observed_min": -1.0,
   "observed_max": 1.0,
   "observed_mean": -0.0017,
   "observed_sd_64000_block": 1.0
  },
  {
   "index": 12,
   "name": "lean_bid_bps",
   "definition": "LEANBASE's bid fee *1e4 as chosen (after the rival pull's lookup), before the hook and before fee() rounding/clamp",
   "range": "[0, 1e4)",
   "observed_min": 0.0,
   "observed_max": 5311.9235,
   "observed_mean": 36.2074,
   "observed_sd_64000_block": 49.6413
  },
  {
   "index": 13,
   "name": "lean_ask_bps",
   "definition": "LEANBASE's ask fee *1e4, same point",
   "range": "[0, 1e4)",
   "observed_min": 0.0,
   "observed_max": 2054.4485,
   "observed_mean": 36.3322,
   "observed_sd_64000_block": 48.7647
  },
  {
   "index": 14,
   "name": "is_arb",
   "definition": "1 if LEANBASE read this callback as the arbitrageur (step-first trade with posterior > 0.5), else 0",
   "range": "{0, 1}",
   "observed_min": 0.0,
   "observed_max": 1.0,
   "observed_mean": 0.3493,
   "observed_sd_64000_block": 0.4767
  },
  {
   "index": 15,
   "name": "tell_hit",
   "definition": "1 if this is a step's first trade and the lean tell label is 'pos' (amount on the arbitrageur's grid), else 0",
   "range": "{0, 1}",
   "observed_min": 0.0,
   "observed_max": 1.0,
   "observed_mean": 0.3496,
   "observed_sd_64000_block": 0.4768
  },
  {
   "index": 16,
   "name": "lean_own_bps",
   "definition": "LEANBASE fee *1e4 of the side that just traded (bid if is_buy else ask), before the hook",
   "range": "[0, 1e4)",
   "observed_min": 0.0,
   "observed_max": 978.1395,
   "observed_mean": 47.6958,
   "observed_sd_64000_block": 56.5027
  },
  {
   "index": 17,
   "name": "lean_other_bps",
   "definition": "LEANBASE fee *1e4 of the other side, before the hook",
   "range": "[0, 1e4)",
   "observed_min": 0.0,
   "observed_max": 5311.9235,
   "observed_mean": 24.8438,
   "observed_sd_64000_block": 37.284
  },
  {
   "index": 18,
   "name": "synced",
   "definition": "LEANBASE's synced flag after this callback (rival estimate bound or pulled since the step change)",
   "range": "{0, 1}",
   "observed_min": 0.0,
   "observed_max": 1.0,
   "observed_mean": 0.6507,
   "observed_sd_64000_block": 0.4767
  },
  {
   "index": 19,
   "name": "log1p_cnt",
   "definition": "log1p(min(cnt, 12)), cnt = non-arb trades of ours in the current step including this one",
   "range": "[0, ln 13 = 2.565]",
   "observed_min": 0.0,
   "observed_max": 2.3026,
   "observed_mean": 0.5404,
   "observed_sd_64000_block": 0.4368
  }
 ],
 "feature_stats_basis": "observed over 1383451 callbacks of seeds 64000..64063 and 10000..10063, LEANBASE without hook",
 "hook": {
  "signature": "hook(feat: float64[20], w: float64[:]) -> (d_bid: float64, d_ask: float64)  # @njit in fastlean.py",
  "call_site": "once per afterSwap callback, after LEANBASE has its two fees (filter update, tell, router bind, staleness pull, qm lookup) and before LEANBASE's own clamp fee(): wad = clamp(int(f*1e18), 0, 1e17), stepped off the Vanilla gamma; fb += d_bid, fa += d_ask; the rounded corrected fees are what the filter keeps as fees in force",
  "units": "fee units (1e-4 = 1 bp)",
  "default_form": "x_i = clip((feat_i - MU_i)/SD_i, -3, 3). 42 weights: z_own = w[0] + sum_i w[1+i] x_i, z_other = w[21] + sum_i w[22+i] x_i. 23*H+2 weights: h_k = tanh(w[21k] + sum_i w[21k+1+i] x_i), base = 21H, z_own = w[base+H] + sum_k w[base+k] h_k, z_other = w[base+2H+1] + sum_k w[base+H+1+k] h_k. Own side (bid if is_buy else ask) += 8e-4*tanh(z_own); other side += 8e-4*tanh(z_other). MU, SD are fixed constants in fastlean.py (seeds 64000..64063).",
  "zero_weights": "weights=None skips the hook; all-zero weights return (0.0, 0.0) and reproduce LEANBASE bit for bit (checked on all 128 seeds, linear and hidden layouts)",
  "python_api": "tabs = fastlean.load(amm_dir); edges = fastlean.run_batch(tabs, seeds, weights)  # numpy float64 per seed; one compiled call per batch",
  "nonzero_weight_check": {
   "what": "CPython oracle (tests/hook_test.py: stalerival.Policy.on_trade restated with the hook lines, features recomputed from the reference object, inside Taylor's replica2.run) against fastlean with random weights; pi_last weights set to 0 because the reference does not keep pi",
   "results": {
    "zero_linear42": {
     "seeds": [
      64000,
      10000,
      64002,
      10003
     ],
     "max_abs_diff_fast_vs_cpython": 0.0,
     "fast_minus_leanbase": [
      0.0,
      0.0,
      0.0,
      0.0
     ]
    },
    "random_linear42": {
     "seeds": [
      64000,
      10000,
      64002,
      10003
     ],
     "max_abs_diff_fast_vs_cpython": 0.0,
     "fast_minus_leanbase": [
      -4.432959667879345,
      -3.7336917787005177,
      -3.7554455612519746,
      -4.788615229188963
     ]
    },
    "random_hidden3_71": {
     "seeds": [
      64000,
      10000,
      64002,
      10003
     ],
     "max_abs_diff_fast_vs_cpython": 0.0,
     "fast_minus_leanbase": [
      -1.9720248785232002,
      -1.931348090628319,
      -2.676731880200009,
      -3.0569589691475585
     ]
    }
   }
  }
 },
 "other_checks": {
  "a0=0.2 ainf=0.5 tau=3 (age-dependent pull path) vs CPython, seeds 64000..64003": {
   "n": 4,
   "max_abs_diff": 0.0
  },
  "run command output with zero weights equals CPython rows 64000..64063": true
 },
 "code_zb64": "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",
 "code_encoding": "base64(zlib(tar)); members fastlean/fastlean.py (main), fastlean/parity.py, fastlean/README.md, fastlean/tests/label_test.py, fastlean/tests/hook_test.py",
 "run": [
  "R=https://raw.githubusercontent.com/gtmcknight/amm-sim/66604b3426d8e97a73e2c39940b9b4dece51cc73/research",
  "curl -fLsS $R/tell/fetch.sh -o fetch.sh && sh fetch.sh $R amm",
  "python3 -m pip install numpy==2.2.6 llvmlite==0.44.0 numba==0.61.2",
  "# copy this result file to ./result.json, then:",
  "python3 -c \"import json,base64,zlib,tarfile,io;tarfile.open(fileobj=io.BytesIO(zlib.decompress(base64.b64decode(json.load(open('result.json'))['code_zb64'])))).extractall('.',filter='data')\"",
  "python3 -c \"import json;json.dump({'weights':[0.0]*42},open('weights.json','w'))\"   # your weight array: 42 (linear) or 23*H+2 floats",
  "python3 fastlean/fastlean.py run amm 64000 64 out.json weights.json   # rows {seed, edge} and mean_edge in out.json; any SEED0 N",
  "# optional parity re-check against CPython LEANBASE:",
  "curl -fLsS https://api.imd.fun/artifacts/efb8e653f8fd061cecf3e92b186470c9c96c5188523364b60ed101e9672869aa -o leanbase.json",
  "python3 -c \"import json,zlib,base64;[open('amm/'+k,'w').write(v) for k,v in json.loads(zlib.decompress(base64.b64decode(json.load(open('leanbase.json'))['reference_zb64']))).items()]\"",
  "(cd amm && PROCS=4 python3 -I run.py leanbase:Policy 64000 64 ref_64000.json soft=1 qm=qm_k1e-5.json a0=0.35 ainf=0.35 && PROCS=4 python3 -I run.py leanbase:Policy 10000 64 ref_10000.json soft=1 qm=qm_k1e-5.json a0=0.35 ainf=0.35)",
  "python3 fastlean/parity.py amm amm/ref_64000.json amm/ref_10000.json",
  "python3 fastlean/tests/label_test.py amm 64000 10000 && python3 fastlean/tests/hook_test.py amm 64000 10000"
 ],
 "source_sha256": "d9c758bb280fe24e09c039496f84ab0804173ff70cec24c332f8683f28efa582",
 "main_file": "fastlean/fastlean.py",
 "environment": {
  "python": "3.12.3",
  "numba": "0.61.2",
  "numpy": "2.2.6",
  "llvmlite": "0.44.0",
  "platform": "Linux x86_64"
 },
 "not_done": [
  "No trained weights: the hook is delivered untrained; nothing here says any correction improves the edge.",
  "Replica only. No Solidity port, no gas/size/peak measurement, no engine (gate E) run, no submission.",
  "Only variant A with soft=1, qm tables and the staleness pull (a0, ainf, tau) is ported; variants B and C and the options pin, tail, fill, sdscale, hard, oraclearb are not.",
  "The two setup lines `curl ... fetch.sh` and `python3 -m pip install ...` in `run` were not executed as written on this machine (curl was not permitted and pip is absent): the 34 research files were fetched by an equivalent urllib script with the same SHA256SUMS check (0 mismatched), and the numpy 2.2.6 / llvmlite 0.44.0 / numba 0.61.2 cp312 manylinux x86_64 wheels were downloaded from PyPI and unpacked. Everything after those lines was run from a clean directory unpacked from code_zb64.",
  "The kit's setup_fast.sh environment (its pinned CPython/numba) was not used or tested with this code; only CPython 3.12.3 + numba 0.61.2 on Linux x86_64 was run. Another libm or LLVM can change last bits.",
  "pi_last (feature 2) is checked only with zero weight against the CPython hook oracle, because the reference keeps no pi; the other 19 features are checked with non-zero weights.",
  "Exactness of the binary64 tell is shown by test (recorded and perturbed inputs above), not by proof; inputs outside what those tests reach (e.g. reserves near 2^120) are untested.",
  "Speed was measured on a shared machine and moves with its load."
 ],
 "notes": [
  "The LEANBASE artifact's frozen.dependency_sha256 also lists 14 modules that are not in its reference_zb64 (check.py, clsdata.py, dp.py, example_policy.py, fillstat.py, fixedcheck2.py, gates.py, latt.py, mirror.py, pair.py, qmdp.py, stale.py, trace.py, track.py); their hashes do not equal the files fetch.sh delivers at commit 66604b34. None of them is imported by leanbase:Policy runs, so this does not touch the parity above, but it was not resolved."
 ]
}