{"validation":{"standard_library_replay":{"has_numba":false,"callbacks":2000,"checksum":147.48839424566665,"elapsed_seconds":0.2224357328377664,"checksum_difference_vs_compiled":2.638671503518708e-10},"reproduction_script_smoke":{"sequences":1,"callbacks":35,"initializations":1,"minimum_callbacks_per_sequence":20,"minimum_market_steps_per_sequence":20,"max_abs_fee_difference_bps":4.989064716909297e-11,"mean_abs_fee_difference_bps":8.585022573789506e-12,"share_above_0_01_bps":0.0,"callbacks_above_0_01_bps":0,"first_divergence":null,"elapsed_seconds":0.07158398907631636,"evm_seconds":0.039682434406131506,"port_python_dispatch_seconds":0.00364630576223135,"arbitrage_callbacks":10,"retail_callbacks":25,"zero_trade_steps":8,"multi_step_gaps":11,"njit_compiles":true}},"blocked":null,"port_source":"\"\"\"RS2 scalar float64 port. Fees and WAD values are normalized by 1e18.\nS is float64[40]; TH is float64[len(TH_NAMES)]. Pass a zeroed S to init.\nOriginal slots 0..14 retain their indices; slot 2 is timestamp only.\nS[15:18] unpack slot 15 as rate, count and meanSize; S[18] is slot 2's spot.\nS[19:40] are reserved. The port does not emulate uint overflow or packing.\nFloat multiply/divide omit Solidity floors; sqrt is real sqrt rather than\nfloor(sqrt(v*1e36))/1e18. Variance subtraction can amplify those differences.\nTH follows source order: declared constants and inline semantic aliases\ninterleaved with ALL literal occurrences in Strategy (including\nstructural indices, shifts and integer-sqrt internals). Inherited clamp\nconstants and dimensionless identities follow the Strategy source.\nSOURCE_LITERAL entries are a lossless numeric inventory, not tuning knobs;\nstructural indices remain fixed. Inline semantic parameters are normalized.\nAcceleration uses numpy and numba. Without them, the same scalar functions\nrun with the standard library using mutable float sequences for S.\nNo simulator or EVM is needed by this file.\n\"\"\"\nimport math\ntry:\n    import numpy as np\n    from numba import njit\n    HAS_NUMBA = True\nexcept ImportError:\n    np = None\n    HAS_NUMBA = False\n    def njit(fn):\n        return fn\nTH_NAMES = ('ELAPSED_CAP', 'SOURCE_LITERAL_000', 'SIGNAL_THRESHOLD', 'SOURCE_LITERAL_001', 'DIR_DECAY', 'SOURCE_LITERAL_002', 'ACT_DECAY', 'SOURCE_LITERAL_003', 'SIZE_DECAY', 'SOURCE_LITERAL_004', 'TOX_DECAY', 'SOURCE_LITERAL_005', 'SIGMA_DECAY', 'SOURCE_LITERAL_006', 'LAMBDA_DECAY', 'SOURCE_LITERAL_007', 'SIZE_BLEND_DECAY', 'SOURCE_LITERAL_008', 'TOX_BLEND_DECAY', 'SOURCE_LITERAL_009', 'ACT_BLEND_DECAY', 'SOURCE_LITERAL_010', 'PHAT_ALPHA', 'SOURCE_LITERAL_011', 'PHAT_ALPHA_RETAIL', 'SOURCE_LITERAL_012', 'PHAT_ALPHA_SAME', 'SOURCE_LITERAL_013', 'REVERT_U', 'SOURCE_LITERAL_014', 'DIR_IMPACT_MULT', 'SOURCE_LITERAL_015', 'GATE_SIGMA_MULT', 'SOURCE_LITERAL_016', 'MIN_GATE', 'SOURCE_LITERAL_017', 'TRADE_TOX_BOOST', 'SOURCE_LITERAL_018', 'STALE_ATTRACT_FRAC', 'SOURCE_LITERAL_019', 'RET_CAP', 'SOURCE_LITERAL_020', 'TOX_CAP', 'SOURCE_LITERAL_021', 'TRADE_RATIO_CAP', 'SOURCE_LITERAL_022', 'LAMBDA_CAP', 'SOURCE_LITERAL_023', 'STEP_COUNT_CAP', 'SOURCE_LITERAL_024', 'BASE_FEE', 'SOURCE_LITERAL_025', 'SIGMA_COEF', 'SOURCE_LITERAL_026', 'LAMBDA_COEF', 'SOURCE_LITERAL_027', 'FLOW_SIZE_COEF', 'SOURCE_LITERAL_028', 'TOX_COEF', 'SOURCE_LITERAL_029', 'TOX_QUAD_COEF', 'SOURCE_LITERAL_030', 'ACT_COEF', 'SOURCE_LITERAL_031', 'DIR_COEF', 'SOURCE_LITERAL_032', 'DIR_TOX_COEF', 'SOURCE_LITERAL_033', 'STALE_DIR_COEF', 'SOURCE_LITERAL_034', 'SIGMA_TOX_COEF', 'SOURCE_LITERAL_035', 'TAIL_KNEE', 'SOURCE_LITERAL_036', 'TAIL_SLOPE_PROTECT', 'SOURCE_LITERAL_037', 'TAIL_SLOPE_ATTRACT', 'SOURCE_LITERAL_038', 'SOURCE_LITERAL_039', 'SOURCE_LITERAL_040', 'SOURCE_LITERAL_041', 'SOURCE_LITERAL_042', 'SOURCE_LITERAL_043', 'INIT_FALLBACK', 'SOURCE_LITERAL_044', 'SOURCE_LITERAL_045', 'INIT_SIGMA', 'SOURCE_LITERAL_046', 'SOURCE_LITERAL_047', 'INIT_LAMBDA', 'SOURCE_LITERAL_048', 'SOURCE_LITERAL_049', 'INIT_SIZE', 'SOURCE_LITERAL_050', 'SOURCE_LITERAL_051', 'INIT_FLOW_RATE', 'SOURCE_LITERAL_052', 'SOURCE_LITERAL_053', 'SOURCE_LITERAL_054', 'SOURCE_LITERAL_055', 'PROCESS_VAR', 'SOURCE_LITERAL_056', 'SOURCE_LITERAL_057', 'SOURCE_LITERAL_058', 'SOURCE_LITERAL_059', 'SOURCE_LITERAL_060', 'SOURCE_LITERAL_061', 'SOURCE_LITERAL_062', 'SOURCE_LITERAL_063', 'SOURCE_LITERAL_064', 'SOURCE_LITERAL_065', 'SOURCE_LITERAL_066', 'SOURCE_LITERAL_067', 'SOURCE_LITERAL_068', 'SOURCE_LITERAL_069', 'SOURCE_LITERAL_070', 'SOURCE_LITERAL_071', 'SOURCE_LITERAL_072', 'SOURCE_LITERAL_073', 'SOURCE_LITERAL_074', 'VAR_CAP', 'SOURCE_LITERAL_075', 'SOURCE_LITERAL_076', 'SOURCE_LITERAL_077', 'SOURCE_LITERAL_078', 'SOURCE_LITERAL_079', 'SOURCE_LITERAL_080', 'SOURCE_LITERAL_081', 'SOURCE_LITERAL_082', 'SOURCE_LITERAL_083', 'SOURCE_LITERAL_084', 'SILENCE_MAX', 'SOURCE_LITERAL_085', 'SOURCE_LITERAL_086', 'SILENCE_DECAY', 'SOURCE_LITERAL_087', 'SOURCE_LITERAL_088', 'SOURCE_LITERAL_089', 'SOURCE_LITERAL_090', 'SOURCE_LITERAL_091', 'SILENCE_DAMP', 'SOURCE_LITERAL_092', 'SOURCE_LITERAL_093', 'SOURCE_LITERAL_094', 'SOURCE_LITERAL_095', 'SOURCE_LITERAL_096', 'SOURCE_LITERAL_097', 'SOURCE_LITERAL_098', 'SOURCE_LITERAL_099', 'SOURCE_LITERAL_100', 'SOURCE_LITERAL_101', 'SOURCE_LITERAL_102', 'SOURCE_LITERAL_103', 'RETAIL_FEE', 'SOURCE_LITERAL_104', 'SOURCE_LITERAL_105', 'SOURCE_LITERAL_106', 'SOURCE_LITERAL_107', 'RETAIL_PHAT_KEEP', 'SOURCE_LITERAL_108', 'SOURCE_LITERAL_109', 'RETAIL_PHAT_OBS', 'SOURCE_LITERAL_110', 'SOURCE_LITERAL_111', 'SOURCE_LITERAL_112', 'SOURCE_LITERAL_113', 'SOURCE_LITERAL_114', 'SOURCE_LITERAL_115', 'SOURCE_LITERAL_116', 'SOURCE_LITERAL_117', 'SOURCE_LITERAL_118', 'SOURCE_LITERAL_119', 'DIR_PUSH_CAP', 'SOURCE_LITERAL_120', 'SOURCE_LITERAL_121', 'DIR_MAX', 'SOURCE_LITERAL_122', 'SOURCE_LITERAL_123', 'SOURCE_LITERAL_124', 'SOURCE_LITERAL_125', 'SOURCE_LITERAL_126', 'SOURCE_LITERAL_127', 'FLOW_BLEND', 'SOURCE_LITERAL_128', 'SOURCE_LITERAL_129', 'SOURCE_LITERAL_130', 'SOURCE_LITERAL_131', 'SOURCE_LITERAL_132', 'SOURCE_LITERAL_133', 'FLOW_RATE_DEFAULT', 'SOURCE_LITERAL_134', 'SOURCE_LITERAL_135', 'FLOW_SIZE_DEFAULT', 'SOURCE_LITERAL_136', 'FLOW_INST_CAP', 'SOURCE_LITERAL_137', 'SOURCE_LITERAL_138', 'FLOW_DECAY', 'SOURCE_LITERAL_139', 'FLOW_GAP_CAP', 'SOURCE_LITERAL_140', 'SOURCE_LITERAL_141', 'SOURCE_LITERAL_142', 'FLOW_MODE', 'SOURCE_LITERAL_143', 'SOURCE_LITERAL_144', 'FLOW_MISSING_COEF', 'SOURCE_LITERAL_145', 'FLOW_MISSING_CAP', 'SOURCE_LITERAL_146', 'SOURCE_LITERAL_147', 'SOURCE_LITERAL_148', 'SOURCE_LITERAL_149', 'SOURCE_LITERAL_150', 'SOURCE_LITERAL_151', 'FLOW_RATE_SCALE', 'SOURCE_LITERAL_152', 'SOURCE_LITERAL_153', 'SOURCE_LITERAL_154', 'FLOW_SIZE_SCALE', 'SOURCE_LITERAL_155', 'SOURCE_LITERAL_156', 'SOURCE_LITERAL_157', 'SOURCE_LITERAL_158', 'SOURCE_LITERAL_159', 'STALE_SLOW', 'SOURCE_LITERAL_160', 'STALE_FAST', 'SOURCE_LITERAL_161', 'SOURCE_LITERAL_162', 'SOURCE_LITERAL_163', 'LATER_BOOST_CAP', 'SOURCE_LITERAL_164', 'SOURCE_LITERAL_165', 'SOURCE_LITERAL_166', 'SOURCE_LITERAL_167', 'SOURCE_LITERAL_168', 'SOURCE_LITERAL_169', 'ATTRACT_CAP', 'SOURCE_LITERAL_170', 'SOURCE_LITERAL_171', 'SOURCE_LITERAL_172', 'SOURCE_LITERAL_173', 'SOURCE_LITERAL_174', 'SOURCE_LITERAL_175', 'SOURCE_LITERAL_176', 'SOURCE_LITERAL_177', 'SOURCE_LITERAL_178', 'SOURCE_LITERAL_179', 'SOURCE_LITERAL_180', 'SOURCE_LITERAL_181', 'SOURCE_LITERAL_182', 'SOURCE_LITERAL_183', 'SOURCE_LITERAL_184', 'SOURCE_LITERAL_185', 'SOURCE_LITERAL_186', 'VAR_MIN', 'SOURCE_LITERAL_187', 'SOURCE_LITERAL_188', 'SOURCE_LITERAL_189', 'SOURCE_LITERAL_190', 'POST_GAP_CAP', 'SOURCE_LITERAL_191', 'SOURCE_LITERAL_192', 'SOURCE_LITERAL_193', 'SOURCE_LITERAL_194', 'SOURCE_LITERAL_195', 'SOURCE_LITERAL_196', 'SOURCE_LITERAL_197', 'SOURCE_LITERAL_198', 'SOURCE_LITERAL_199', 'RETAIL_NOISE', 'SOURCE_LITERAL_200', 'SOURCE_LITERAL_201', 'SOURCE_LITERAL_202', 'ARB_NOISE', 'SOURCE_LITERAL_203', 'DENSITY_SCALE', 'SOURCE_LITERAL_204', 'DENSITY_POWER', 'SOURCE_LITERAL_205', 'ODDS_SCALE', 'SOURCE_LITERAL_206', 'SIZE_ODDS_THRESHOLD', 'SOURCE_LITERAL_207', 'SIZE_ODDS_MULT', 'SOURCE_LITERAL_208', 'SOURCE_LITERAL_209', 'SOURCE_LITERAL_210', 'SILENT_ODDS_MULT', 'SOURCE_LITERAL_211', 'SOURCE_LITERAL_212', 'SOURCE_LITERAL_213', 'BAND_SD_MULT', 'SOURCE_LITERAL_214', 'MASS_MIN', 'SOURCE_LITERAL_215', 'SOURCE_LITERAL_216', 'SOURCE_LITERAL_217', 'SOURCE_LITERAL_218', 'SOURCE_LITERAL_219', 'SOURCE_LITERAL_220', 'BAND_NODES', 'SOURCE_LITERAL_221', 'BAND_CENTER', 'SOURCE_LITERAL_222', 'SOURCE_LITERAL_223', 'SOURCE_LITERAL_224', 'PRICE_FLOOR', 'SOURCE_LITERAL_225', 'SOURCE_LITERAL_226', 'SOURCE_LITERAL_227', 'BAND_WEIGHT_CENTER', 'SOURCE_LITERAL_228', 'SOURCE_LITERAL_229', 'SOURCE_LITERAL_230', 'BAND_WEIGHT_NEAR', 'SOURCE_LITERAL_231', 'SOURCE_LITERAL_232', 'SOURCE_LITERAL_233', 'BAND_WEIGHT_MID', 'SOURCE_LITERAL_234', 'BAND_WEIGHT_EDGE', 'SOURCE_LITERAL_235', 'SOURCE_LITERAL_236', 'SOURCE_LITERAL_237', 'SOURCE_LITERAL_238', 'BAND_LIKELIHOOD', 'SOURCE_LITERAL_239', 'SOURCE_LITERAL_240', 'SOURCE_LITERAL_241', 'SOURCE_LITERAL_242', 'SOURCE_LITERAL_243', 'SOURCE_LITERAL_244', 'SOURCE_LITERAL_245', 'SOURCE_LITERAL_246', 'SOURCE_LITERAL_247', 'SOURCE_LITERAL_248', 'SOURCE_LITERAL_249', 'SOURCE_LITERAL_250', 'SOURCE_LITERAL_251', 'SOURCE_LITERAL_252', 'SOURCE_LITERAL_253', 'SOURCE_LITERAL_254', 'SOURCE_LITERAL_255', 'SOURCE_LITERAL_256', 'SOURCE_LITERAL_257', 'SOURCE_LITERAL_258', 'SOURCE_LITERAL_259', 'SOURCE_LITERAL_260', 'SOURCE_LITERAL_261', 'SOURCE_LITERAL_262', 'SOURCE_LITERAL_263', 'SOURCE_LITERAL_264', 'SOURCE_LITERAL_265', 'SOURCE_LITERAL_266', 'SOURCE_LITERAL_267', 'SOURCE_LITERAL_268', 'SOURCE_LITERAL_269', 'SOURCE_LITERAL_270', 'SOURCE_LITERAL_271', 'SOURCE_LITERAL_272', 'SOURCE_LITERAL_273', 'SOURCE_LITERAL_274', 'SOURCE_LITERAL_275', 'SOURCE_LITERAL_276', 'SOURCE_LITERAL_277', 'SOURCE_LITERAL_278', 'SOURCE_LITERAL_279', 'SOURCE_LITERAL_280', 'SOURCE_LITERAL_281', 'SOURCE_LITERAL_282', 'SOURCE_LITERAL_283', 'SOURCE_LITERAL_284', 'SOURCE_LITERAL_285', 'SOURCE_LITERAL_286', 'SOURCE_LITERAL_287', 'SOURCE_LITERAL_288', 'SOURCE_LITERAL_289', 'MAX_FEE', 'MIN_FEE', 'ONE', 'ZERO', 'TWO')\nTH_VALUES = (8.0, 8.0, 0.001538461538461538, 650.0, 0.75, 7.5e+17, 0.53, 5.3e+17, 0.53, 5.3e+17, 0.91, 9.1e+17, 0.69, 6.9e+17, 0.99, 9.9e+17, 0.828, 8.28e+17, 0.051, 5.1e+16, 0.985, 9.85e+17, 0.27, 2.7e+17, 0.06, 6e+16, 0.12, 1.2e+17, 0.0, 0.0, 4.0, 4.0, 7.2, 7.2e+18, 0.03, 3e+16, 0.35, 3500.0, 1.05, 1.05e+18, 0.02857142857142857, 35.0, 0.2, 5.0, 0.2, 5.0, 1.82, 1.82e+18, 64.0, 64.0, 0.0004, 4.0, 0.2, 2e+17, 0.0012, 12.0, 0.4842, 4842.0, 0.03, 300.0, 1.5, 15000.0, 9.1843, 91843.0, 0.002, 20.0, 0.01, 100.0, 0.685, 6850.0, 0.05, 500.0, 0.06, 600.0, 0.93, 9.3e+17, 0.85, 8.5e+17, 0.0, 1.0, 3.0, 5.0, 0.0, 100.0, 100.0, 6.0, 0.00095, 950000000000000.0, 7.0, 0.8, 8e+17, 8.0, 0.002, 2000000000000000.0, 15.0, 0.4, 4e+17, 2000000000000000.0, 160.0, 13.0, 9.025e-07, 902500000000.0, 14.0, 5.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 14.0, 13.0, 0.0, 0.0, 0.0, 0.0001, 100000000000000.0, 100000000000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.8, 8e+17, 2.0, 64.0, 0.0, 2.0, 0.3, 3e+17, 0.0, 0.0, 1.0, 12.0, 0.0, 1.0, 12.0, 1.0, 2.0, 0.0, 11.0, 0.003, 30.0, 0.0, 30.0, 30.0, 0.9, 90.0, 100.0, 0.1, 10.0, 100.0, 2.0, 64.0, 0.0, 0.0, 13.0, 14.0, 0.0, 0.0, 0.25, 4.0, 4.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 1.0, 0.3424067991934183, 3.424067991934183e+17, 0.0, 15.0, 80.0, 160.0, 0.0, 0.4, 4e+17, 0.0, 0.002, 2000000000000000.0, 3.0, 3.0, 3.0, 0.999, 9.99e+17, 64.0, 64.0, 64.0, 0.0, 2.0, 2.0, 2.0, 196.03088039613942, 1.9603088039613943e+20, 0.33333333333333337, 3.333333333333334e+17, 3.333333333333334e+17, 9.99e+17, 15.0, 80.0, 160.0, 0.36638342491340714, 3.6638342491340717e+17, 2.0, 0.0, 1.8832961581192984, 1.8832961581192983e+18, 3.424067991934183e+17, 3.424067991934183e+17, 0.0, 0.0, 0.7, 7e+17, 0.3, 3e+17, 0.0, 0.0, 0.0016, 16.0, 16.0, 30.0, 30.0, 30.0, 30.0, 0.0036, 36.0, 36.0, 36.0, 36.0, 0.0, 1.0, 2.0, 64.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 0.0, 1e-08, 10000000000.0, 10000000000.0, 1.0, 0.0, 8.0, 8.0, 8.0, 902500000000.0, 1.0, 902500000000.0, 0.0, 30.0, 30.0, 30.0, 9e-06, 9000000000000.0, 0.0, 0.0, 2.25e-08, 22500000000.0, 8.0, 8.0, 4.0, 4.0, 0.004, 4000000000000000.0, 0.003, 3000000000000000.0, 0.4, 4.0, 10.0, 1.0, 0.8, 8.0, 10.0, 0.0, 2.0, 2.0, 0.01, 100.0, 100.0, 100000000000000.0, 100000000000000.0, 3.0, 0.0, 7.0, 7.0, 3.0, 3.0, 3.0, 3.0, 1e-18, 1.0, 3.0, 3.0, 72.0, 72.0, 2.0, 4.0, 45.0, 45.0, 1.0, 5.0, 10.0, 10.0, 1.0, 1.0, 0.0, 0.0, 0.0, 4.0, 4.0, 0.0, 1.0, 2.0, 1.0, 0.0, 2.0, 0.0, 10000000000.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 128.0, 0.0, 128.0, 64.0, 64.0, 0.0, 64.0, 32.0, 32.0, 0.0, 32.0, 16.0, 16.0, 0.0, 16.0, 8.0, 8.0, 0.0, 8.0, 4.0, 4.0, 0.0, 4.0, 2.0, 2.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.1, 0.0, 1.0, 0.0, 2.0)\n\ndef default_th():\n    if np is None:\n        from array import array\n        return array(\"d\", TH_VALUES)\n    return np.array(TH_VALUES, dtype=np.float64)\n\n@njit\ndef _pow(factor, exp):\n    result = 1.0\n    while exp > 0:\n        if exp % 2 == 1:\n            result *= factor\n        factor *= factor\n        exp = math.floor(exp / 2)\n    return result\n\n@njit\ndef _blend(a,b,w):\n    return a+(b-a)*w if b>=a else a-(a-b)*w\n\n@njit\ndef _band(mu,v,lo,hi,TH):\n    sd = mu*math.sqrt(v)\n    a0=0.0; a1=0.0; a2=0.0\n    for j in range(int(TH[302])):\n        if j<TH[304]:\n            p=mu-(TH[304]-j)*sd if mu>(TH[304]-j)*sd else TH[308]\n        else:\n            p=mu+(j-TH[304])*sd\n        w=TH[312] if j==3 else (TH[316] if j==2 or j==4 else (TH[320] if j==1 or j==5 else TH[322]))\n        distance=lo-p if p<lo else (p-hi if p>hi else 0.0)\n        z=distance/sd if sd>0 else 0.0\n        likelihood=TH[381]/(TH[381]+TH[327]*z*z)\n        w*=likelihood\n        a0+=w; a1+=w*p\n        d=abs(p-mu)/mu\n        a2+=w*d*d\n    m=a1/a0\n    d=abs(m-mu)/mu\n    second=a2/a0\n    return m, second-d*d if second>d*d else TH[256]\n\n@njit\ndef _posterior(mu,v,obs,spot,preSpot,bid,ask,first,silent,buy,size,TH):\n    if mu==0: mu=spot\n    if v<TH[256]: v=TH[256]\n    lo=preSpot*(TH[381]-bid)\n    hi=preSpot/(TH[381]-ask)\n    if first:\n        if silent>1 and preSpot>0:\n            elapsed=min(silent,TH[261])\n            v+=TH[100]*(elapsed-TH[381])\n            mu,v=_band(mu,v,lo,hi,TH)\n        v+=TH[100]\n    mRetail=mu; vRetail=v\n    if first and preSpot>0:\n        mRetail,vRetail=_band(mu,v,lo,hi,TH)\n    if not first:\n        fee=bid if buy else ask\n        if fee>TH[153]:\n            normal=spot*(TH[381]-fee)/(TH[381]-TH[153]) if buy else spot*(TH[381]-TH[153])/(TH[381]-fee)\n            residual=abs(normal-mu)/mu\n            noise=TH[271]+residual*residual\n            k=v/(v+noise)\n            return _blend(mu,normal,k),v*(TH[381]-k),0.0\n        return mu,v,0.0\n    e=abs(obs-mu)/mu\n    totalV=v+TH[275]\n    z=e*e/totalV\n    density=_pow(TH[381]/(TH[381]+z/TH[277]),TH[279])\n    odds=density*TH[281]/math.sqrt(totalV)\n    if size>TH[283]: odds*=TH[285]\n    if silent>1: odds*=TH[289]\n    sd=math.sqrt(v)\n    width=(hi-lo)/mu\n    distance=lo-mu if mu<lo else (mu-hi if mu>hi else 0.0)\n    zBand=(distance/mu)/sd\n    mass=width/(width+TH[293]*sd)*TH[381]/(TH[381]+zBand*zBand)\n    if mass<TH[295]: mass=TH[295]\n    odds/=mass\n    prob=odds/(TH[381]+odds)\n    kArb=v/totalV\n    mArb=_blend(mu,obs,kArb)\n    mean=_blend(mRetail,mArb,prob)\n    between=abs(mArb-mRetail)/mu\n    variance=prob*v*(TH[381]-kArb)+(TH[381]-prob)*vRetail+prob*(TH[381]-prob)*between*between\n    if variance>TH[120]: variance=TH[120]\n    return mean,variance,prob\n\n@njit\ndef strat_init(S,TH,x0,y0):\n    S[0]=TH[50]; S[1]=TH[50]; S[3]=TH[381]\n    S[5]=y0/x0 if x0>0 else TH[83]\n    S[6]=TH[86]; S[7]=TH[89]; S[8]=TH[92]\n    S[15]=TH[95]; S[16]=0.0; S[17]=TH[92]\n    S[13]=TH[100]; S[14]=S[5]\n    return TH[50],TH[50]\n\n@njit\ndef strat_after(S,TH,is_buy,amount_x,amount_y,timestamp,reserve_x,reserve_y):\n    prevBidFee=S[0]; prevAskFee=S[1]; lastTs=S[2]\n    dirState=S[3]; actEma=S[4]; pHat=S[5]\n    sigmaHat=S[6]; lambdaHat=S[7]; sizeHat=S[8]\n    toxEma=S[9]; stepTradeCount=S[10]\n    fastHat=S[14]; uncertainty=S[13]\n    silent=timestamp-lastTs if timestamp>lastTs else 0.0\n    isNewStep=timestamp>lastTs\n    if isNewStep:\n        elapsedRaw=timestamp-lastTs\n        elapsed=min(elapsedRaw,TH[0])\n        mul=_pow(TH[4],elapsed)\n        if dirState>=TH[381]: dirState=TH[381]+(dirState-TH[381])*mul\n        else:\n            below=(TH[381]-dirState)*mul\n            dirState=TH[381]-below if below<TH[381] else 0.0\n        actEma*=_pow(TH[6],elapsed)\n        sizeHat*=_pow(TH[8],elapsed)\n        toxEma*=_pow(TH[10],elapsed)\n        if stepTradeCount>0 and elapsedRaw>0:\n            lambdaInst=stepTradeCount/elapsedRaw\n            if lambdaInst>TH[46]: lambdaInst=TH[46]\n            lambdaHat=lambdaHat*TH[14]+lambdaInst*(TH[381]-TH[14])\n        if uncertainty>TH[120]: uncertainty=TH[120]\n        stepTradeCount=0.0\n    firstInStep=stepTradeCount==0\n    spot=reserve_y/reserve_x if reserve_x>0 else pHat\n    if pHat==0: pHat=spot\n    feeUsed=prevBidFee if is_buy else prevAskFee\n    gamma=TH[381]-feeUsed if feeUsed<TH[381] else 0.0\n    if gamma==0: pImplied=spot\n    else: pImplied=spot*gamma if is_buy else spot/gamma\n    silenceScale=TH[381]\n    if firstInStep and silent>1:\n        g=silent-TH[381]\n        if g>TH[131]: g=TH[131]\n        w=TH[381]-_pow(TH[134],g)\n        s=S[18]\n        if s==0: s=pHat\n        c=(s*(TH[381]-prevBidFee)+s/(TH[381]-prevAskFee))/TH[383]\n        if c>=pHat: pHat+=w*(c-pHat)\n        else: pHat-=w*(pHat-c)\n        silenceScale=TH[381]-TH[140]*w\n    ret=abs(pImplied-pHat)/pHat if pHat>0 else 0.0\n    alpha=TH[22] if firstInStep else TH[24]\n    secondPrint=not firstInStep and stepTradeCount==1\n    sameDir=False; oppDir=False\n    if secondPrint:\n        up2=pImplied>=pHat\n        d1=S[12]\n        if d1!=0:\n            sameDir=(d1==1)==up2\n            oppDir=not sameDir\n        if sameDir: alpha=TH[26]\n    if firstInStep: S[12]=1.0 if pImplied>=pHat else 2.0\n    adaptiveGate=sigmaHat*TH[32]\n    if adaptiveGate<TH[34]: adaptiveGate=TH[34]\n    alpha*=silenceScale; adaptiveGate*=silenceScale\n    if ret<=adaptiveGate: pHat=pHat*(TH[381]-alpha)+pImplied*alpha\n    if oppDir and TH[28]>0:\n        pre=S[11]\n        if pre>pHat: pHat+=(pre-pHat)*TH[28]\n        else: pHat-=(pHat-pre)*TH[28]\n    if firstInStep:\n        if ret>TH[40]: ret=TH[40]\n        sigmaHat=sigmaHat*TH[12]+ret*(TH[381]-TH[12])\n    if not firstInStep and feeUsed>TH[153] and gamma>0:\n        normalSpot=spot*gamma/(TH[381]-TH[153]) if is_buy else spot*(TH[381]-TH[153])/gamma\n        pHat=pHat*TH[158]+normalSpot*TH[161]\n    ratio=amount_y/reserve_y if reserve_y>0 else 0.0\n    fastHat,uncertainty,arbProbability=_posterior(fastHat,uncertainty,pImplied,spot,S[18],prevBidFee,prevAskFee,firstInStep,silent,is_buy,ratio,TH)\n    S[13]=uncertainty; S[14]=fastHat\n    tradeRatio=ratio\n    if tradeRatio>TH[44]: tradeRatio=TH[44]\n    if tradeRatio>TH[2]:\n        push=tradeRatio*TH[30]\n        if push>TH[172]: push=TH[172]\n        if is_buy:\n            dirState+=push\n            if dirState>TH[175]: dirState=TH[175]\n        else: dirState=dirState-push if dirState>push else 0.0\n        actEma=actEma*TH[20]+tradeRatio*(TH[381]-TH[20])\n        sizeHat=sizeHat*TH[16]+tradeRatio*(TH[381]-TH[16])\n        if sizeHat>TH[381]: sizeHat=TH[381]\n    tox=abs(spot-pHat)/pHat if pHat>0 else 0.0\n    if tox>TH[42]: tox=TH[42]\n    toxEma=toxEma*TH[18]+tox*(TH[381]-TH[18])\n    toxSignal=toxEma\n    stepTradeCount+=TH[381]\n    if stepTradeCount>TH[48]: stepTradeCount=TH[48]\n    originalLambda=lambdaHat; originalSize=sizeHat\n    if TH[182]>0:\n        rate=S[15]; count=S[16]; meanSize=S[17]\n        if rate==0: rate=TH[189]\n        if meanSize==0: meanSize=TH[192]\n        if isNewStep:\n            inst=count/silent\n            if inst>TH[194]: inst=TH[194]\n            retention=_pow(TH[197],min(silent,TH[199]))\n            rate=rate*retention+inst*(TH[381]-retention)\n            count=0.0\n        weight=TH[381]-arbProbability if firstInStep else TH[381]\n        correctedWeight=weight\n        if TH[203]==2:\n            missing=feeUsed*TH[206]\n            if missing>TH[208]: missing=TH[208]\n            correctedWeight=weight/(TH[381]-missing)\n        count+=correctedWeight\n        learning=(TH[381]-TH[197])*weight\n        meanSize=_blend(meanSize,tradeRatio,learning)\n        S[15]=rate; S[16]=count; S[17]=meanSize\n        retailRate=rate*TH[215]\n        retailSize=sizeHat if TH[203]==0 else meanSize*TH[219]\n        lambdaHat=_blend(lambdaHat,retailRate,TH[182])\n        sizeHat=_blend(sizeHat,retailSize,TH[182])\n    flowSize=lambdaHat*sizeHat\n    fBase=TH[50]+TH[52]*sigmaHat+TH[54]*lambdaHat+TH[56]*flowSize\n    fMid=fBase+TH[58]*toxSignal+TH[60]*toxSignal*toxSignal+TH[62]*actEma\n    fMid+=TH[70]*sigmaHat*toxSignal\n    lambdaHat=originalLambda; sizeHat=originalSize\n    if dirState>=TH[381]: dirDev=dirState-TH[381]; sellPressure=True\n    else: dirDev=TH[381]-dirState; sellPressure=False\n    skew=TH[64]*dirDev+TH[66]*dirDev*toxSignal\n    if sellPressure:\n        bidFee=fMid+skew; askFee=fMid-skew if fMid>skew else 0.0\n    else:\n        askFee=fMid+skew; bidFee=fMid-skew if fMid>skew else 0.0\n    staleHat=pHat*TH[225]+fastHat*TH[227]\n    staleTox=abs(spot-staleHat)/staleHat\n    if staleTox>TH[42]: staleTox=TH[42]\n    staleShift=TH[68]*staleTox\n    attractShift=staleShift*TH[38]\n    if spot>=staleHat:\n        bidFee+=staleShift\n        askFee=askFee-attractShift if askFee>attractShift else 0.0\n    else:\n        askFee+=staleShift\n        bidFee=bidFee-attractShift if bidFee>attractShift else 0.0\n    tradeAligned=(is_buy and spot>=pHat) or (not is_buy and spot<pHat)\n    if tradeAligned:\n        tradeBoost=TH[36]*tradeRatio\n        if not firstInStep and tradeBoost>TH[231]: tradeBoost=TH[231]\n        if is_buy: bidFee+=tradeBoost\n        else: askFee+=tradeBoost\n    if sellPressure:\n        if bidFee>TH[72]: bidFee=TH[72]+(bidFee-TH[72])*TH[74]\n        if askFee>TH[72]: askFee=TH[72]+(askFee-TH[72])*TH[76]\n    else:\n        if askFee>TH[72]: askFee=TH[72]+(askFee-TH[72])*TH[74]\n        if bidFee>TH[72]: bidFee=TH[72]+(bidFee-TH[72])*TH[76]\n    bidFee=min(TH[379],max(TH[380],bidFee)); askFee=min(TH[379],max(TH[380],askFee))\n    if firstInStep:\n        if askFee>bidFee and bidFee>TH[153]: bidFee=TH[153]\n        elif bidFee>askFee and askFee>TH[153]: askFee=TH[153]\n    if bidFee>askFee and askFee>TH[238]: askFee=TH[238]\n    elif askFee>bidFee and bidFee>TH[238]: bidFee=TH[238]\n    S[0]=bidFee; S[1]=askFee; S[2]=timestamp; S[18]=spot\n    S[3]=dirState; S[4]=actEma; S[5]=pHat\n    S[6]=sigmaHat; S[7]=lambdaHat; S[8]=sizeHat\n    S[9]=toxEma; S[10]=stepTradeCount\n    return bidFee,askFee\n","th_names":["ELAPSED_CAP","SOURCE_LITERAL_000","SIGNAL_THRESHOLD","SOURCE_LITERAL_001","DIR_DECAY","SOURCE_LITERAL_002","ACT_DECAY","SOURCE_LITERAL_003","SIZE_DECAY","SOURCE_LITERAL_004","TOX_DECAY","SOURCE_LITERAL_005","SIGMA_DECAY","SOURCE_LITERAL_006","LAMBDA_DECAY","SOURCE_LITERAL_007","SIZE_BLEND_DECAY","SOURCE_LITERAL_008","TOX_BLEND_DECAY","SOURCE_LITERAL_009","ACT_BLEND_DECAY","SOURCE_LITERAL_010","PHAT_ALPHA","SOURCE_LITERAL_011","PHAT_ALPHA_RETAIL","SOURCE_LITERAL_012","PHAT_ALPHA_SAME","SOURCE_LITERAL_013","REVERT_U","SOURCE_LITERAL_014","DIR_IMPACT_MULT","SOURCE_LITERAL_015","GATE_SIGMA_MULT","SOURCE_LITERAL_016","MIN_GATE","SOURCE_LITERAL_017","TRADE_TOX_BOOST","SOURCE_LITERAL_018","STALE_ATTRACT_FRAC","SOURCE_LITERAL_019","RET_CAP","SOURCE_LITERAL_020","TOX_CAP","SOURCE_LITERAL_021","TRADE_RATIO_CAP","SOURCE_LITERAL_022","LAMBDA_CAP","SOURCE_LITERAL_023","STEP_COUNT_CAP","SOURCE_LITERAL_024","BASE_FEE","SOURCE_LITERAL_025","SIGMA_COEF","SOURCE_LITERAL_026","LAMBDA_COEF","SOURCE_LITERAL_027","FLOW_SIZE_COEF","SOURCE_LITERAL_028","TOX_COEF","SOURCE_LITERAL_029","TOX_QUAD_COEF","SOURCE_LITERAL_030","ACT_COEF","SOURCE_LITERAL_031","DIR_COEF","SOURCE_LITERAL_032","DIR_TOX_COEF","SOURCE_LITERAL_033","STALE_DIR_COEF","SOURCE_LITERAL_034","SIGMA_TOX_COEF","SOURCE_LITERAL_035","TAIL_KNEE","SOURCE_LITERAL_036","TAIL_SLOPE_PROTECT","SOURCE_LITERAL_037","TAIL_SLOPE_ATTRACT","SOURCE_LITERAL_038","SOURCE_LITERAL_039","SOURCE_LITERAL_040","SOURCE_LITERAL_041","SOURCE_LITERAL_042","SOURCE_LITERAL_043","INIT_FALLBACK","SOURCE_LITERAL_044","SOURCE_LITERAL_045","INIT_SIGMA","SOURCE_LITERAL_046","SOURCE_LITERAL_047","INIT_LAMBDA","SOURCE_LITERAL_048","SOURCE_LITERAL_049","INIT_SIZE","SOURCE_LITERAL_050","SOURCE_LITERAL_051","INIT_FLOW_RATE","SOURCE_LITERAL_052","SOURCE_LITERAL_053","SOURCE_LITERAL_054","SOURCE_LITERAL_055","PROCESS_VAR","SOURCE_LITERAL_056","SOURCE_LITERAL_057","SOURCE_LITERAL_058","SOURCE_LITERAL_059","SOURCE_LITERAL_060","SOURCE_LITERAL_061","SOURCE_LITERAL_062","SOURCE_LITERAL_063","SOURCE_LITERAL_064","SOURCE_LITERAL_065","SOURCE_LITERAL_066","SOURCE_LITERAL_067","SOURCE_LITERAL_068","SOURCE_LITERAL_069","SOURCE_LITERAL_070","SOURCE_LITERAL_071","SOURCE_LITERAL_072","SOURCE_LITERAL_073","SOURCE_LITERAL_074","VAR_CAP","SOURCE_LITERAL_075","SOURCE_LITERAL_076","SOURCE_LITERAL_077","SOURCE_LITERAL_078","SOURCE_LITERAL_079","SOURCE_LITERAL_080","SOURCE_LITERAL_081","SOURCE_LITERAL_082","SOURCE_LITERAL_083","SOURCE_LITERAL_084","SILENCE_MAX","SOURCE_LITERAL_085","SOURCE_LITERAL_086","SILENCE_DECAY","SOURCE_LITERAL_087","SOURCE_LITERAL_088","SOURCE_LITERAL_089","SOURCE_LITERAL_090","SOURCE_LITERAL_091","SILENCE_DAMP","SOURCE_LITERAL_092","SOURCE_LITERAL_093","SOURCE_LITERAL_094","SOURCE_LITERAL_095","SOURCE_LITERAL_096","SOURCE_LITERAL_097","SOURCE_LITERAL_098","SOURCE_LITERAL_099","SOURCE_LITERAL_100","SOURCE_LITERAL_101","SOURCE_LITERAL_102","SOURCE_LITERAL_103","RETAIL_FEE","SOURCE_LITERAL_104","SOURCE_LITERAL_105","SOURCE_LITERAL_106","SOURCE_LITERAL_107","RETAIL_PHAT_KEEP","SOURCE_LITERAL_108","SOURCE_LITERAL_109","RETAIL_PHAT_OBS","SOURCE_LITERAL_110","SOURCE_LITERAL_111","SOURCE_LITERAL_112","SOURCE_LITERAL_113","SOURCE_LITERAL_114","SOURCE_LITERAL_115","SOURCE_LITERAL_116","SOURCE_LITERAL_117","SOURCE_LITERAL_118","SOURCE_LITERAL_119","DIR_PUSH_CAP","SOURCE_LITERAL_120","SOURCE_LITERAL_121","DIR_MAX","SOURCE_LITERAL_122","SOURCE_LITERAL_123","SOURCE_LITERAL_124","SOURCE_LITERAL_125","SOURCE_LITERAL_126","SOURCE_LITERAL_127","FLOW_BLEND","SOURCE_LITERAL_128","SOURCE_LITERAL_129","SOURCE_LITERAL_130","SOURCE_LITERAL_131","SOURCE_LITERAL_132","SOURCE_LITERAL_133","FLOW_RATE_DEFAULT","SOURCE_LITERAL_134","SOURCE_LITERAL_135","FLOW_SIZE_DEFAULT","SOURCE_LITERAL_136","FLOW_INST_CAP","SOURCE_LITERAL_137","SOURCE_LITERAL_138","FLOW_DECAY","SOURCE_LITERAL_139","FLOW_GAP_CAP","SOURCE_LITERAL_140","SOURCE_LITERAL_141","SOURCE_LITERAL_142","FLOW_MODE","SOURCE_LITERAL_143","SOURCE_LITERAL_144","FLOW_MISSING_COEF","SOURCE_LITERAL_145","FLOW_MISSING_CAP","SOURCE_LITERAL_146","SOURCE_LITERAL_147","SOURCE_LITERAL_148","SOURCE_LITERAL_149","SOURCE_LITERAL_150","SOURCE_LITERAL_151","FLOW_RATE_SCALE","SOURCE_LITERAL_152","SOURCE_LITERAL_153","SOURCE_LITERAL_154","FLOW_SIZE_SCALE","SOURCE_LITERAL_155","SOURCE_LITERAL_156","SOURCE_LITERAL_157","SOURCE_LITERAL_158","SOURCE_LITERAL_159","STALE_SLOW","SOURCE_LITERAL_160","STALE_FAST","SOURCE_LITERAL_161","SOURCE_LITERAL_162","SOURCE_LITERAL_163","LATER_BOOST_CAP","SOURCE_LITERAL_164","SOURCE_LITERAL_165","SOURCE_LITERAL_166","SOURCE_LITERAL_167","SOURCE_LITERAL_168","SOURCE_LITERAL_169","ATTRACT_CAP","SOURCE_LITERAL_170","SOURCE_LITERAL_171","SOURCE_LITERAL_172","SOURCE_LITERAL_173","SOURCE_LITERAL_174","SOURCE_LITERAL_175","SOURCE_LITERAL_176","SOURCE_LITERAL_177","SOURCE_LITERAL_178","SOURCE_LITERAL_179","SOURCE_LITERAL_180","SOURCE_LITERAL_181","SOURCE_LITERAL_182","SOURCE_LITERAL_183","SOURCE_LITERAL_184","SOURCE_LITERAL_185","SOURCE_LITERAL_186","VAR_MIN","SOURCE_LITERAL_187","SOURCE_LITERAL_188","SOURCE_LITERAL_189","SOURCE_LITERAL_190","POST_GAP_CAP","SOURCE_LITERAL_191","SOURCE_LITERAL_192","SOURCE_LITERAL_193","SOURCE_LITERAL_194","SOURCE_LITERAL_195","SOURCE_LITERAL_196","SOURCE_LITERAL_197","SOURCE_LITERAL_198","SOURCE_LITERAL_199","RETAIL_NOISE","SOURCE_LITERAL_200","SOURCE_LITERAL_201","SOURCE_LITERAL_202","ARB_NOISE","SOURCE_LITERAL_203","DENSITY_SCALE","SOURCE_LITERAL_204","DENSITY_POWER","SOURCE_LITERAL_205","ODDS_SCALE","SOURCE_LITERAL_206","SIZE_ODDS_THRESHOLD","SOURCE_LITERAL_207","SIZE_ODDS_MULT","SOURCE_LITERAL_208","SOURCE_LITERAL_209","SOURCE_LITERAL_210","SILENT_ODDS_MULT","SOURCE_LITERAL_211","SOURCE_LITERAL_212","SOURCE_LITERAL_213","BAND_SD_MULT","SOURCE_LITERAL_214","MASS_MIN","SOURCE_LITERAL_215","SOURCE_LITERAL_216","SOURCE_LITERAL_217","SOURCE_LITERAL_218","SOURCE_LITERAL_219","SOURCE_LITERAL_220","BAND_NODES","SOURCE_LITERAL_221","BAND_CENTER","SOURCE_LITERAL_222","SOURCE_LITERAL_223","SOURCE_LITERAL_224","PRICE_FLOOR","SOURCE_LITERAL_225","SOURCE_LITERAL_226","SOURCE_LITERAL_227","BAND_WEIGHT_CENTER","SOURCE_LITERAL_228","SOURCE_LITERAL_229","SOURCE_LITERAL_230","BAND_WEIGHT_NEAR","SOURCE_LITERAL_231","SOURCE_LITERAL_232","SOURCE_LITERAL_233","BAND_WEIGHT_MID","SOURCE_LITERAL_234","BAND_WEIGHT_EDGE","SOURCE_LITERAL_235","SOURCE_LITERAL_236","SOURCE_LITERAL_237","SOURCE_LITERAL_238","BAND_LIKELIHOOD","SOURCE_LITERAL_239","SOURCE_LITERAL_240","SOURCE_LITERAL_241","SOURCE_LITERAL_242","SOURCE_LITERAL_243","SOURCE_LITERAL_244","SOURCE_LITERAL_245","SOURCE_LITERAL_246","SOURCE_LITERAL_247","SOURCE_LITERAL_248","SOURCE_LITERAL_249","SOURCE_LITERAL_250","SOURCE_LITERAL_251","SOURCE_LITERAL_252","SOURCE_LITERAL_253","SOURCE_LITERAL_254","SOURCE_LITERAL_255","SOURCE_LITERAL_256","SOURCE_LITERAL_257","SOURCE_LITERAL_258","SOURCE_LITERAL_259","SOURCE_LITERAL_260","SOURCE_LITERAL_261","SOURCE_LITERAL_262","SOURCE_LITERAL_263","SOURCE_LITERAL_264","SOURCE_LITERAL_265","SOURCE_LITERAL_266","SOURCE_LITERAL_267","SOURCE_LITERAL_268","SOURCE_LITERAL_269","SOURCE_LITERAL_270","SOURCE_LITERAL_271","SOURCE_LITERAL_272","SOURCE_LITERAL_273","SOURCE_LITERAL_274","SOURCE_LITERAL_275","SOURCE_LITERAL_276","SOURCE_LITERAL_277","SOURCE_LITERAL_278","SOURCE_LITERAL_279","SOURCE_LITERAL_280","SOURCE_LITERAL_281","SOURCE_LITERAL_282","SOURCE_LITERAL_283","SOURCE_LITERAL_284","SOURCE_LITERAL_285","SOURCE_LITERAL_286","SOURCE_LITERAL_287","SOURCE_LITERAL_288","SOURCE_LITERAL_289","MAX_FEE","MIN_FEE","ONE","ZERO","TWO"],"th_values":[8.0,8.0,0.001538461538461538,650.0,0.75,7.5e+17,0.53,5.3e+17,0.53,5.3e+17,0.91,9.1e+17,0.69,6.9e+17,0.99,9.9e+17,0.828,8.28e+17,0.051,5.1e+16,0.985,9.85e+17,0.27,2.7e+17,0.06,6e+16,0.12,1.2e+17,0.0,0.0,4.0,4.0,7.2,7.2e+18,0.03,3e+16,0.35,3500.0,1.05,1.05e+18,0.02857142857142857,35.0,0.2,5.0,0.2,5.0,1.82,1.82e+18,64.0,64.0,0.0004,4.0,0.2,2e+17,0.0012,12.0,0.4842,4842.0,0.03,300.0,1.5,15000.0,9.1843,91843.0,0.002,20.0,0.01,100.0,0.685,6850.0,0.05,500.0,0.06,600.0,0.93,9.3e+17,0.85,8.5e+17,0.0,1.0,3.0,5.0,0.0,100.0,100.0,6.0,0.00095,950000000000000.0,7.0,0.8,8e+17,8.0,0.002,2000000000000000.0,15.0,0.4,4e+17,2000000000000000.0,160.0,13.0,9.025e-07,902500000000.0,14.0,5.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,14.0,13.0,0.0,0.0,0.0,0.0001,100000000000000.0,100000000000000.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.8,8e+17,2.0,64.0,0.0,2.0,0.3,3e+17,0.0,0.0,1.0,12.0,0.0,1.0,12.0,1.0,2.0,0.0,11.0,0.003,30.0,0.0,30.0,30.0,0.9,90.0,100.0,0.1,10.0,100.0,2.0,64.0,0.0,0.0,13.0,14.0,0.0,0.0,0.25,4.0,4.0,2.0,2.0,2.0,0.0,0.0,0.0,1.0,0.3424067991934183,3.424067991934183e+17,0.0,15.0,80.0,160.0,0.0,0.4,4e+17,0.0,0.002,2000000000000000.0,3.0,3.0,3.0,0.999,9.99e+17,64.0,64.0,64.0,0.0,2.0,2.0,2.0,196.03088039613942,1.9603088039613943e+20,0.33333333333333337,3.333333333333334e+17,3.333333333333334e+17,9.99e+17,15.0,80.0,160.0,0.36638342491340714,3.6638342491340717e+17,2.0,0.0,1.8832961581192984,1.8832961581192983e+18,3.424067991934183e+17,3.424067991934183e+17,0.0,0.0,0.7,7e+17,0.3,3e+17,0.0,0.0,0.0016,16.0,16.0,30.0,30.0,30.0,30.0,0.0036,36.0,36.0,36.0,36.0,0.0,1.0,2.0,64.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,0.0,1e-08,10000000000.0,10000000000.0,1.0,0.0,8.0,8.0,8.0,902500000000.0,1.0,902500000000.0,0.0,30.0,30.0,30.0,9e-06,9000000000000.0,0.0,0.0,2.25e-08,22500000000.0,8.0,8.0,4.0,4.0,0.004,4000000000000000.0,0.003,3000000000000000.0,0.4,4.0,10.0,1.0,0.8,8.0,10.0,0.0,2.0,2.0,0.01,100.0,100.0,100000000000000.0,100000000000000.0,3.0,0.0,7.0,7.0,3.0,3.0,3.0,3.0,1e-18,1.0,3.0,3.0,72.0,72.0,2.0,4.0,45.0,45.0,1.0,5.0,10.0,10.0,1.0,1.0,0.0,0.0,0.0,4.0,4.0,0.0,1.0,2.0,1.0,0.0,2.0,0.0,10000000000.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,128.0,0.0,128.0,64.0,64.0,0.0,64.0,32.0,32.0,0.0,32.0,16.0,16.0,0.0,16.0,8.0,8.0,0.0,8.0,4.0,4.0,0.0,4.0,2.0,2.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.1,0.0,1.0,0.0,2.0],"slots":[{"index":0,"meaning":"last bid fee, fraction"},{"index":1,"meaning":"last ask fee, fraction"},{"index":2,"meaning":"last timestamp, integral float; low 64 bits of Solidity slot 2"},{"index":3,"meaning":"direction state centered at 1"},{"index":4,"meaning":"activity EMA"},{"index":5,"meaning":"slow fair-price estimate pHat, Y/X"},{"index":6,"meaning":"sigmaHat, relative absolute return EMA"},{"index":7,"meaning":"lambdaHat, trades per step EMA"},{"index":8,"meaning":"sizeHat, relative Y trade size EMA"},{"index":9,"meaning":"toxicity EMA"},{"index":10,"meaning":"stepTradeCount, unscaled integer float"},{"index":11,"meaning":"slot 11: pre-price used only by disabled REVERT_U branch; never written in RS2"},{"index":12,"meaning":"first-print direction: 0 unset, 1 up, 2 down; unscaled"},{"index":13,"meaning":"posterior relative variance uncertainty"},{"index":14,"meaning":"posterior fastHat price, Y/X"},{"index":15,"meaning":"retail flow rate; Solidity slot 15 low uint80, normalized"},{"index":16,"meaning":"weighted retail count; Solidity slot 15 middle uint80, normalized"},{"index":17,"meaning":"retail mean relative size; Solidity slot 15 high uint80, normalized"},{"index":18,"meaning":"previous post-trade spot; Solidity slot 2 high bits, normalized"},{"index":19,"meaning":"reserved, unused; initialize to 0"},{"index":20,"meaning":"reserved, unused; initialize to 0"},{"index":21,"meaning":"reserved, unused; initialize to 0"},{"index":22,"meaning":"reserved, unused; initialize to 0"},{"index":23,"meaning":"reserved, unused; initialize to 0"},{"index":24,"meaning":"reserved, unused; initialize to 0"},{"index":25,"meaning":"reserved, unused; initialize to 0"},{"index":26,"meaning":"reserved, unused; initialize to 0"},{"index":27,"meaning":"reserved, unused; initialize to 0"},{"index":28,"meaning":"reserved, unused; initialize to 0"},{"index":29,"meaning":"reserved, unused; initialize to 0"},{"index":30,"meaning":"reserved, unused; initialize to 0"},{"index":31,"meaning":"reserved, unused; initialize to 0"},{"index":32,"meaning":"reserved, unused; initialize to 0"},{"index":33,"meaning":"reserved, unused; initialize to 0"},{"index":34,"meaning":"reserved, unused; initialize to 0"},{"index":35,"meaning":"reserved, unused; initialize to 0"},{"index":36,"meaning":"reserved, unused; initialize to 0"},{"index":37,"meaning":"reserved, unused; initialize to 0"},{"index":38,"meaning":"reserved, unused; initialize to 0"},{"index":39,"meaning":"reserved, unused; initialize to 0"}],"diff_test":{"sequences":200,"callbacks":800534,"initializations":200,"minimum_callbacks_per_sequence":2000,"minimum_market_steps_per_sequence":2000,"max_abs_fee_difference_bps":0.0003545963610240843,"mean_abs_fee_difference_bps":9.038573310404743e-09,"share_above_0_01_bps":0.0,"callbacks_above_0_01_bps":0,"first_divergence":null,"elapsed_seconds":262.295538301114,"evm_seconds":180.43837590608746,"port_python_dispatch_seconds":7.426196972839534,"arbitrage_callbacks":189922,"retail_callbacks":610612,"zero_trade_steps":79616,"multi_step_gaps":239028,"njit_compiles":true,"tolerance_bps":0.01,"error_definition":"abs(EVM_WAD/1e18 - port_fee)*10000. Max over both sides; mean over all 2*callbacks fees; share counts callbacks with either side above threshold.","first_divergence_cause":null,"first_divergence_definition":"First callback with either fee difference >0.01 bps; null means none.","evm_errors":0,"seeds":"10000..10199, numpy default_rng independently reset for each sequence","market":"Each sequence has >=2000 steps and >=2000 callbacks. At each step advance timestamp by a random choice from [1,1,1,1,2,3,5,9,16,80], evolve log fair price with volatility times sqrt(gap), then generate uniform 0..4 trades. First trade arbitrages to the current fee band if profitable; otherwise retail. Later trades are retail. Fees are removed from input; only net input enters constant-product reserves.","parameter_ranges":{"initial_x":[50,5000],"initial_price_log_uniform":[10,1000],"sigma":[0.0003,0.012],"retail_size_scale":[5e-05,0.012],"retail_lognormal_log_sd":1,"retail_relative_size_cap":0.15},"feedback":"Even-numbered sequences use EVM fees for all next trades; odd-numbered sequences use port fees. Both implementations get identical callbacks. Inputs cross the adapter Decimal->WAD boundary; port sees original floats.","initialization_check":"Initial fees compared for every new deployment with tolerance 1e-10 bps.","reproduction_source":"import sys,os,json,time,math\nfrom pathlib import Path\nfrom decimal import Decimal\nimport numpy as np\nimport argparse\nparser=argparse.ArgumentParser()\nparser.add_argument('--checkout',required=True,help='amm-challenge checkout at pinned commit')\nparser.add_argument('--rs2-source',required=True,help='RS2 Solidity file with the specified SHA256')\nparser.add_argument('--sequences',type=int,default=200)\nparser.add_argument('--callbacks',type=int,default=2000)\nparser.add_argument('--steps',type=int,default=2000)\nparser.add_argument('--report')\nparser.add_argument('--replay-output')\nargs=parser.parse_args()\nsys.path.insert(0,str(Path(args.checkout).resolve()))\nimport rs2_port as p\nfrom amm_competition.evm.adapter import EVMStrategyAdapter\nfrom amm_competition.core.trade import TradeInfo\nsource=Path(args.rs2_source).read_text()\nimport hashlib\nassert hashlib.sha256(source.encode()).hexdigest()=='f24b6ca198b744c380842c3a17964a6dc21f311bb04984b26733afa3fee8eaf2'\nt0=time.perf_counter(); evm=EVMStrategyAdapter.from_source(source);print('compiled',time.perf_counter()-t0,flush=True)\nth=p.default_th();s=np.zeros(40)\np.strat_init(s,th,100.,10000.);p.strat_after(s,th,True,.1,10.,1.,100.1,9990.)\nprint('njit',p.strat_init.nopython_signatures,p.strat_after.nopython_signatures,flush=True)\nnseq=args.sequences\nncb=args.callbacks\nmaxd=0.;total=0.;above=0;count=0;first=None;evmtime=0.;porttime=0.;dataset=[];zeros=0;gaps=0;arbcount=0;retcount=0\nstart=time.perf_counter()\nfor seq in range(nseq):\n rng=np.random.default_rng(10000+seq)\n x=float(rng.uniform(50,5000));price=float(np.exp(rng.uniform(np.log(10),np.log(1000))));y=x*price\n sigma=float(rng.uniform(.0003,.012));scale=float(rng.uniform(.00005,.012))\n evm.reset();ef=evm.after_initialize(Decimal(str(x)),Decimal(str(y)));s=np.zeros(40)\n pf=p.strat_init(s,th,x,y);ef=(float(ef.bid_fee),float(ef.ask_fee))\n d=max(abs(pf[0]-ef[0]),abs(pf[1]-ef[1]))*1e4\n assert d<1e-10\n ts=0;cb=0;steps=0\n while cb<ncb or steps<args.steps:\n  steps+=1\n  gap=int(rng.choice([1,1,1,1,2,3,5,9,16,80]));ts+=gap\n  gaps+=gap>1\n  price*=math.exp(float(rng.normal(-.5*sigma*sigma*gap,sigma*math.sqrt(gap))))\n  nt=int(rng.integers(0,5));zeros+=nt==0\n  for j in range(nt):\n   fees=ef if seq%2==0 else pf\n   spot=y/x; k=x*y\n   if j==0 and spot*(1-fees[0])>price:\n    buy=True;newx=math.sqrt(k*(1-fees[0])/price);ax=(newx-x)/(1-fees[0]);newy=k/newx;ay=y-newy;arbcount+=1\n   elif j==0 and spot/(1-fees[1])<price:\n    buy=False;newy=math.sqrt(k*price*(1-fees[1]));ay=(newy-y)/(1-fees[1]);newx=k/newy;ax=x-newx;arbcount+=1\n   else:\n    buy=bool(rng.integers(0,2));size=min(float(rng.lognormal(math.log(scale),1.0)),.15)\n    if buy:\n     ax=x*size;newx=x+ax*(1-fees[0]);newy=k/newx;ay=y-newy\n    else:\n     ay=y*size;newy=y+ay*(1-fees[1]);newx=k/newy;ax=x-newx\n    retcount+=1\n   x=newx;y=newy\n   tr=TradeInfo(side='buy' if buy else 'sell',amount_x=Decimal(str(ax)),amount_y=Decimal(str(ay)),timestamp=ts,reserve_x=Decimal(str(x)),reserve_y=Decimal(str(y)))\n   t=time.perf_counter(); ew=evm.after_swap_wad(tr);evmtime+=time.perf_counter()-t\n   ef=(ew[0]/1e18,ew[1]/1e18)\n   t=time.perf_counter();pf=p.strat_after(s,th,buy,ax,ay,float(ts),x,y);porttime+=time.perf_counter()-t\n   diffs=(abs(ef[0]-pf[0])*1e4,abs(ef[1]-pf[1])*1e4);d=max(diffs)\n   total+=sum(diffs);maxd=max(maxd,d);above+=d>.01;count+=1;cb+=1\n   if d>.01 and first is None:\n    first=dict(sequence=seq,callback=cb,timestamp=ts,is_buy=buy,evm=ef,port=pf,difference_bps=diffs,state=s.tolist())\n    print('DIVERGENCE',json.dumps(first),flush=True)\n   if seq==0: dataset.append([float(buy),ax,ay,float(ts),x,y])\n if seq%10==0:print('seq',seq,'max_bps',maxd,'above',above,'elapsed',time.perf_counter()-start,flush=True)\nif args.replay_output: np.save(args.replay_output,np.array(dataset))\nreport=dict(sequences=nseq,callbacks=count,initializations=nseq,minimum_callbacks_per_sequence=ncb,minimum_market_steps_per_sequence=args.steps,max_abs_fee_difference_bps=maxd,mean_abs_fee_difference_bps=total/(count*2),share_above_0_01_bps=above/count,callbacks_above_0_01_bps=above,first_divergence=first,elapsed_seconds=time.perf_counter()-start,evm_seconds=evmtime,port_python_dispatch_seconds=porttime,arbitrage_callbacks=arbcount,retail_callbacks=retcount,zero_trade_steps=zeros,multi_step_gaps=gaps,njit_compiles=bool(p.strat_init.nopython_signatures and p.strat_after.nopython_signatures))\nif args.report: Path(args.report).write_text(json.dumps(report,indent=2))\nprint(json.dumps(report),flush=True)\n","reproduction":"Extract port_source as rs2_port.py and this reproduction_source as differential_test.py into one directory. With the pinned checkout and its setup completed, run python differential_test.py --checkout CHECKOUT --rs2-source RS2.sol --sequences 200 --callbacks 2000 --steps 2000 --report diff.json. RS2.sol must have the specified SHA256. No leaderboard simulation or board submission is claimed."},"njit_compiles":true,"speed":{"callbacks_per_trial":1000000,"trials_seconds":[0.7133150929585099,0.6602523480542004,0.6799452272243798,0.694851032923907,0.7154229390434921],"median_seconds":0.694851032923907,"callbacks_per_second":1439157.391465675,"nanoseconds_per_callback":694.851032923907,"checksum":73744.1971227014,"includes":"state resets and strat_init once per 2000 callbacks; excludes JIT compilation, market generation and EVM","njit_compiles":true,"has_numba":true,"scope":"Local single-process throughput, not an end-to-end market simulation speedup.","dataset":"First 2000 callbacks of sequence 10000, repeated 500 times per trial. Initial reserves regenerated with the same default_rng seed. TH is passed as a float64 array, not closed over.","python_dispatch_callbacks_per_second":107798.64888150174,"evm_adapter_callbacks_per_second":4436.6061043281225,"benchmark_kernel":"@njit\ndef bench(rows,TH,x,y,reps):\n    S=np.zeros(40); checksum=0.0\n    for rep in range(reps):\n        S[:]=0.0\n        strat_init(S,TH,x,y)\n        for i in range(len(rows)):\n            r=rows[i]\n            b,a=strat_after(S,TH,r[0]!=0,r[1],r[2],r[3],r[4],r[5])\n            checksum+=b+a\n    return checksum\n"},"deviations":["WAD quantities use normalized float64 fractions or prices; integer multiply/divide floors are omitted. Counts, timestamps and loop limits remain unscaled floats or integer loop variables.","_isqrt(v*WAD) is replaced with math.sqrt(normalized_v). Solidity floors the root at 1e-18 relative precision. Small moment-subtraction errors in _band can be amplified by subsequent posterior updates. This is an approximation, not bit-exact integer emulation.","Packed slots are unpacked into S[2], S[15:19]. No uint64/uint80 casts, uint256 overflow, bit-packing truncation, or Solidity reverts are emulated. Inputs must be valid, nonnegative market callbacks with positive reserves/prices and integral timestamps in representable range.","Unused local copies sigmaForFast and prePhat are omitted; the disabled REVERT_U branch and its slot 11 read remain.","NumPy/Numba are optional acceleration dependencies, not bundled. With neither installed the source runs using only the Python standard library on mutable float sequences. The measured fast path requires NumPy/Numba and float64 arrays."],"notes":["RS2 source SHA256 verified before porting: f24b6ca198b744c380842c3a17964a6dc21f311bb04984b26733afa3fee8eaf2. Source URL: https://api.imd.fun/artifacts/19f2ec857df536e8ab62ab1da89ec6623332521ce46849f15bccff402c63e1e5.","Pinned repository 6b6921f8d463314aa7c96234e1be25a25245f704; the supplied setup completed, wheel hash passed, StarterStrategy validation passed. EVM differential testing used the repository EVMStrategyAdapter, SolidityCompiler and pyrevm with the original, unchanged RS2 source.","Tested accelerator versions: Python 3.12, NumPy 2.5.4, Numba 0.68.1, llvmlite 0.50.0; EVM: pyrevm 0.3.7, py-solc-x 2.1.0 and solc 0.8.24. No fastmath flag is used.","Usage with accelerator: S=np.zeros(40,dtype=np.float64); TH=default_th(); bid,ask=strat_init(S,TH,x0,y0); then strat_after(S,TH,is_buy,amount_x,amount_y,float(timestamp),reserve_x,reserve_y). Amounts/reserves are human units, fees fractions; is_buy means AMM buys X. amount_x is unused by RS2 but retained in the API.","Use a fresh zeroed S for each new market. strat_init writes precisely the initialized contract fields; it does not clear unspecified slots. TH length is 384.","TH follows Strategy source order. Named declared constants and normalized inline parameter aliases precede their source occurrence; SOURCE_LITERAL entries enumerate all numeric tokens, including structural slot indices and sqrt implementation literals. Raw literal entries are provenance metadata and are not tuning knobs. MAX_FEE/MIN_FEE are inherited clamp constants; ONE/ZERO/TWO are arithmetic identities appended after Strategy. Equal repeated model literals share semantic aliases.","The scalar port runs without installed dependencies; standard-library-only import plus a 2000-callback replay passed; the fee checksum differed from the compiled replay by less than 1e-7. This aggregate smoke check is supplementary to the per-callback EVM test. EVM test dependencies are temporary test tooling, not dependencies of the delivered port.","No fee discrepancy above 0.01 bps was observed in the reported finite test. This does not prove equivalence for every possible uint256 input, overflow, adversarial state, or arbitrary retuning of TH."],"provenance":{"rs2_url":"https://api.imd.fun/artifacts/19f2ec857df536e8ab62ab1da89ec6623332521ce46849f15bccff402c63e1e5","rs2_sha256":"f24b6ca198b744c380842c3a17964a6dc21f311bb04984b26733afa3fee8eaf2","repository":"https://github.com/benedictbrady/amm-challenge","commit":"6b6921f8d463314aa7c96234e1be25a25245f704","port_sha256":"ae9a5d4802a1d5981c175d43ad4196ceec2a41d63e83461f36c7247384f0d3b2","measurements":"Locally executed differential and throughput tests, not externally sourced results. Source quotations and pinned upstream URLs are in sources.json."}}
