import%20marimo%0A%0A__generated_with%20%3D%20%220.23.16%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20width%3D%22medium%22%2C%0A%20%20%20%20app_title%3D%22D2.1%3A%20figures%20for%20the%20anchoring%20post%22%2C%0A%20%20%20%20css_file%3D%22..%2F..%2Freport.css%22%2C%0A%20%20%20%20auto_download%3D%5B%22html%22%5D%2C%0A)%0A%0Awith%20app.setup(hide_code%3DTrue)%3A%0A%20%20%20%20import%20tempfile%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20from%20typing%20import%20cast%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20matplotlib.transforms%20import%20Affine2D%0A%0A%20%20%20%20%23%20Marimo%20puts%20the%20notebook%20directory%20on%20sys.path%2C%20so%20the%20condition%20list%20and%20the%20ref%20come%20from%20the%20prep%20module%20beside%20this%20one%20rather%20than%20a%20copy%20of%20them%20here.%0A%20%20%20%20import%20experiment%20as%20ex%0A%20%20%20%20from%20mini.reports%20import%20report_bundle%2C%20use_publisher%0A%20%20%20%20from%20mini.store%20import%20project_store%0A%20%20%20%20from%20mini.vis%20import%20AxesRow%2C%20light_dark%2C%20smooth_step_area%2C%20smooth_step_marks%2C%20themed%0A%20%20%20%20from%20sca.colorcube%20import%20sim_to_red%0A%20%20%20%20from%20sca.vis_grading%20import%20GRID_RGB%2C%20I_RED%2C%20REDNESS%2C%20GradingCloud%0A%0A%20%20%20%20use_publisher(report_bundle(__file__))%0A%0A%20%20%20%20SIM_TARGET%20%3D%20sim_to_red(GRID_RGB%2C%20power%3D1.5)%0A%20%20%20%20%22%22%22The%20grading%20statistic's%20target%20shape%2C%20as%20in%20ex-2.1.6%20%E2%80%93%20ex-2.1.10.%22%22%22%0A%20%20%20%20SLICE_NAMES%20%3D%20%5B%22emb%22%2C%20%221%22%2C%20%222%22%2C%20%223%22%2C%20%224%22%5D%0A%20%20%20%20POS_NAMES%20%3D%20%5B%22op1%22%2C%20%22%2B%22%2C%20%22op2%22%2C%20%22%3D%22%2C%20%22ans%22%2C%20r%22%5Cn%22%5D%0A%20%20%20%20KEYINGS%20%3D%20%7B%22op1%22%3A%20%22first%22%2C%20%22op2%22%3A%20%22second%22%7D%0A%20%20%20%20%22%22%22Each%20keying%2C%20and%20which%20operand's%20color%20it%20puts%20on%20the%20color%20axis.%22%22%22%0A%0A%0A%40app.function(hide_code%3DTrue)%0Adef%20load_margins()%20-%3E%20tuple%5Bdict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D%2C%20dict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D%2C%20np.ndarray%5D%20%7C%20None%3A%0A%20%20%20%20%22%22%22%CE%B1%20per%20condition%20and%20keying%2C%20plus%20the%20probe%20set's%20operand%20index.%0A%0A%20%20%20%20%60experiment.py%60%20publishes%20both%20operand%20margins%20of%20every%20condition%2C%20per%20run.%20%60out%5Bkey%5D%5B%22op1%22%5D%60%20is%20seed-mean%20(slice%2C%20color%2C%20position)%20%CE%B1%20against%20the%20first%20operand's%20color%20and%20%60%5B%22op2%22%5D%60%20the%20same%20measurement%20keyed%20by%20the%20second%2C%20so%20a%20figure%20picks%20its%20color%20axis%20by%20choosing%20between%20them.%20%60stacks%60%20is%20the%20same%20measurement%20with%20the%20seed%20axis%20kept%2C%20(seed%2C%20slice%2C%20color%2C%20position)%20%E2%80%94%20the%20progression%20figure's%20spread%20envelope%20dithers%20over%20it.%20The%20pair%20index%20rides%20along%3A%20it%20says%20which%20color%20sits%20at%20each%20operand%20slot%20on%20each%20probe%20line%2C%20which%20is%20what%20the%20partner-composition%20note%20reads.%0A%20%20%20%20%22%22%22%0A%20%20%20%20store%20%3D%20project_store()%0A%20%20%20%20art%20%3D%20store.get_refs(%5Bex.ARRAYS_REF%5D)%5Bex.ARRAYS_REF%5D%0A%20%20%20%20if%20art%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20with%20tempfile.TemporaryDirectory()%20as%20d%3A%0A%20%20%20%20%20%20%20%20(path%2C)%20%3D%20store.get_many(%5B(art%2C%20Path(d)%20%2F%20%22margins.npz%22)%5D)%0A%20%20%20%20%20%20%20%20with%20np.load(path)%20as%20z%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20stacks%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20c.key%3A%20%7Bk%3A%20np.stack(%5Bz%5Bf%22%7Bc.key%7D%2Fs%7Bi%7D%2F%7Bk%7D%22%5D%20for%20i%20in%20range(c.seeds)%5D)%20for%20k%20in%20KEYINGS%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20c%20in%20ex.CONDITIONS%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20%7Bkey%3A%20%7Bk%3A%20v.mean(axis%3D0)%20for%20k%2C%20v%20in%20d.items()%7D%20for%20key%2C%20d%20in%20stacks.items()%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20out%2C%20stacks%2C%20z%5B%22probe%2Fpairs%22%5D%0A%0A%0A%40app.function(hide_code%3DTrue)%0Adef%20r2_sim(y%3A%20np.ndarray)%20-%3E%20float%3A%0A%20%20%20%20%22%22%22Shape%20r%C2%B2%20against%20sim%C2%B9%C2%B7%E2%81%B5%2C%20the%20grading%20statistic%3B%20NaN%20where%20the%20response%20is%20constant.%22%22%22%0A%20%20%20%20if%20np.std(y)%20%3C%201e-6%3A%0A%20%20%20%20%20%20%20%20return%20float(%22nan%22)%0A%20%20%20%20return%20float(np.corrcoef(y%2C%20SIM_TARGET)%5B0%2C%201%5D%20**%202)%0A%0A%0A%40app.function(hide_code%3DTrue)%0Adef%20draw_grading_grid(%0A%20%20%20%20ax%3A%20plt.Axes%2C%20a%3A%20np.ndarray%2C%20*%2C%20keyed%3A%20int%20%7C%20None%20%3D%20None%2C%20row_names%3A%20bool%20%3D%20True%2C%20scale%3A%20bool%20%3D%20True%0A)%20-%3E%20None%3A%0A%20%20%20%20%22%22%22One%20row%20per%20residual%20slice%2C%20one%20grading-cloud%20slot%20per%20token%20position%2C%20drawn%20into%20*ax*.%0A%0A%20%20%20%20*a*%20is%20(slice%2C%20color%2C%20position)%20%CE%B1%2C%20keyed%20by%20whichever%20operand's%20color%20the%20caller%20wants%20on%20the%20color%20axis%3B%20the%20overlay%20is%20that%20keying's%20pure-red%20row.%20Every%20figure%20below%20shares%20this%2C%20so%20the%20two%20views%20of%20a%20condition%20differ%20only%20in%20the%20array%20they%20are%20handed%20%E2%80%94%20and%20so%20do%20the%20four%20conditions.%0A%0A%20%20%20%20*keyed*%20is%20the%20slot%20the%20panel%20is%20keyed%20by%3B%20its%20x%20label%20draws%20in%20the%20overlay%20red%2C%20so%20the%20ink%20itself%20says%20which%20slot%20the%20red%20line%20answers%20to.%20The%20off-key%20clouds%20stay%20at%20full%20strength%20%E2%80%94%20they%20are%20data%20the%20prose%20reads%20(the%20shared-span%20pull%2C%20the%20partner-composition%20tilt)%2C%20and%20fading%20them%20would%20presuppose%20the%20finding.%0A%0A%20%20%20%20The%20rows%20share%20one%20Axes%2C%20each%20offset%20by%20a%20translate%20transform%2C%20so%20a%20row%20spans%20y%20%E2%88%88%20%5Bsi%2C%20si%2B1%5D%20and%20its%20slots%20keep%20a%20fixed%200%E2%80%931%20scale%3A%20a%20slot%20that%20holds%20nothing%20looks%20like%20it%20holds%20nothing%2C%20here%20and%20in%20the%20panel%20below.%20Stacking%20them%20this%20way%20costs%20nothing%20in%20code%20and%20buys%20the%20overhang%20%E2%80%94%20a%20cloud's%20extent%20runs%20past%20the%20row%20it%20belongs%20to%2C%20and%20within%20one%20Axes%20those%20tails%20draw%20over%20the%20row%20beneath%20rather%20than%20being%20covered%20by%20its%20background.%20Each%20row's%20zero%20line%20is%20also%20the%20rule%20between%20it%20and%20the%20row%20below%2C%20so%20the%20overlay%20marks%20the%20boundaries%20and%20no%20separators%20are%20needed.%0A%0A%20%20%20%20*row_names*%20draws%20the%20slice%20names%20on%20the%20left%20and%20*scale*%20the%200%E2%80%931%20%CE%B1%20scale%20on%20the%20right%3B%20a%20panel%20in%20a%20row%20of%20them%20wants%20each%20only%20on%20its%20own%20side%20of%20the%20figure%2C%20since%20the%20rows%20and%20the%20scale%20are%20the%20same%20for%20all%20of%20them%20(see%20%3Afunc%3A%60grading_grids%60).%0A%20%20%20%20%22%22%22%0A%20%20%20%20sw%20%3D%200.7%20%20%23%20smooth-step%20plateau%20width%0A%20%20%20%20n_slices%2C%20_%2C%20n_pos%20%3D%20a.shape%0A%20%20%20%20red_c%20%3D%20light_dark(%22%23d40000%22%2C%20%22%23f44%22)%0A%20%20%20%20grey_c%20%3D%20light_dark(%22%23eee%22%2C%20%22%23111%22)%0A%20%20%20%20for%20si%20in%20range(n_slices)%3A%0A%20%20%20%20%20%20%20%20shift%20%3D%20Affine2D().translate(0%2C%20si)%20%2B%20ax.transData%20%20%23%20embedding%20at%20the%20bottom%2C%20as%20the%20profile%20figures%20do%0A%20%20%20%20%20%20%20%20reds%20%3D%20a%5Bsi%2C%20I_RED%2C%20%3A%5D%0A%20%20%20%20%20%20%20%20xs%20%3D%20np.arange(len(reds))%0A%20%20%20%20%20%20%20%20smooth_step_area(ax%2C%20xs%2C%20reds%2C%20ramp%3D1%20-%20sw%2C%20color%3Dgrey_c%2C%20transform%3Dshift%2C%20zorder%3D0)%0A%20%20%20%20%20%20%20%20for%20pi%20in%20range(n_pos)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20GradingCloud(ax%2C%20a%5Bsi%2C%20%3A%2C%20pi%5D%2C%20span%3D(pi%20-%20sw%20%2F%202%2C%20pi%20%2B%20sw%20%2F%202)%2C%20transform%3Dshift%2C%20clip_on%3DFalse)%0A%20%20%20%20%20%20%20%20smooth_step_marks(ax%2C%20xs%2C%20reds%2C%20ramp%3D1%20-%20sw%2C%20color%3Dred_c%2C%20lw%3D1.3%2C%20transform%3Dshift%2C%20clip_on%3DFalse)%0A%20%20%20%20%20%20%20%20ax.axhline(si%2C%20color%3Dlight_dark(%22%23aaaa%22%2C%20%22%23333a%22)%2C%20lw%3D0.5)%0A%20%20%20%20ax.set_xlim(-0.5%2C%20n_pos%20-%200.5)%0A%20%20%20%20ax.set_ylim(0%2C%20n_slices)%0A%20%20%20%20ax.set_xticks(range(n_pos)%2C%20POS_NAMES)%0A%20%20%20%20ax.set_yticks(np.arange(n_slices)%20%2B%200.5%2C%20SLICE_NAMES%20if%20row_names%20else%20%5B%22%22%5D%20*%20n_slices)%0A%20%20%20%20ax.tick_params(axis%3D%22x%22%2C%20labelsize%3D6%2C%20bottom%3DFalse)%0A%20%20%20%20ax.tick_params(axis%3D%22y%22%2C%20labelsize%3D7%2C%20left%3DFalse)%0A%20%20%20%20if%20keyed%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20ax.get_xticklabels()%5Bkeyed%5D.set(color%3Dred_c%2C%20fontweight%3D%22bold%22)%0A%20%20%20%20if%20scale%3A%0A%20%20%20%20%20%20%20%20%23%20One%20y%20scale%20for%20the%20whole%20figure%2C%20against%20the%20bottom%20row%2C%20whose%20offset%20is%20zero.%0A%20%20%20%20%20%20%20%20sec%20%3D%20ax.secondary_yaxis(%22right%22)%0A%20%20%20%20%20%20%20%20sec.set_yticks(np.arange(n_slices%20%2B%201)%2C%20%5B%220%22%2C%20%221%22%5D%20%2B%20%5B%22%22%5D%20*%20(n_slices%20-%201))%0A%20%20%20%20%20%20%20%20sec.tick_params(labelsize%3D6%2C%20direction%3D%22out%22)%0A%20%20%20%20%20%20%20%20sec.set_ylabel(%22%CE%B1%2C%200%E2%80%931%20per%20row%22%2C%20fontsize%3D7)%0A%0A%0A%40app.function(hide_code%3DTrue)%0Adef%20grading_grids(%0A%20%20%20%20panels%3A%20dict%5Bstr%2C%20tuple%5Bnp.ndarray%2C%20int%20%7C%20None%5D%5D%2C%20figsize%3A%20tuple%5Bfloat%2C%20float%5D%20%3D%20(7.4%2C%202.2)%0A)%20-%3E%20plt.Figure%3A%0A%20%20%20%20%22%22%22A%20row%20of%20grading%20grids%20sharing%20one%20set%20of%20rows%20and%20one%20%CE%B1%20scale%2C%20titled%20by%20*panels*'%20keys%3B%20each%20value%20pairs%20the%20%CE%B1%20array%20with%20its%20keyed%20slot%20(see%20%3Afunc%3A%60draw_grading_grid%60).%0A%0A%20%20%20%20The%20panels%20measure%20the%20same%20quantity%20on%20the%20same%20scale%20and%20the%20reader%20compares%20across%20them%2C%20so%20they%20belong%20in%20one%20figure%20%E2%80%94%20which%20is%20also%20what%20the%20post%20wants%20to%20upload%2C%20one%20image%20per%20condition.%20The%20row%20names%20sit%20on%20the%20left%20of%20the%20first%20panel%20and%20the%20%CE%B1%20scale%20on%20the%20right%20of%20the%20last%2C%20since%20both%20are%20shared%3B%20a%20lone%20panel%20gets%20each%20on%20its%20own%20side.%0A%0A%20%20%20%20The%20default%20size%20fits%20a%20pair%20into%20the%20content%20column.%20A%20single%20grid%20wants%20a%20taller%20figure%20%E2%80%94%20closer%20to%20square%20per%20panel%2C%20as%20the%20pair%20is%20%E2%80%94%20rather%20than%20this%20one%20stretched%20over%20one%20panel.%0A%20%20%20%20%22%22%22%0A%20%20%20%20fig%2C%20axes%20%3D%20plt.subplots(1%2C%20len(panels)%2C%20figsize%3Dfigsize%2C%20squeeze%3DFalse)%0A%20%20%20%20row%20%3D%20cast(AxesRow%2C%20axes%5B0%5D)%0A%20%20%20%20for%20i%2C%20(ax%2C%20(title%2C%20(a%2C%20keyed)))%20in%20enumerate(zip(row%2C%20panels.items()%2C%20strict%3DTrue))%3A%0A%20%20%20%20%20%20%20%20draw_grading_grid(ax%2C%20a%2C%20keyed%3Dkeyed%2C%20row_names%3Di%20%3D%3D%200%2C%20scale%3Di%20%3D%3D%20len(row)%20-%201)%0A%20%20%20%20%20%20%20%20ax.set_title(title%2C%20fontsize%3D8%2C%20pad%3D6)%20%20%23%20pad%20clears%20the%20top%20row's%20unclipped%20cloud%0A%20%20%20%20return%20fig%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20D2.1%3A%20figures%20for%20the%20anchoring%20post%0A%0A%20%20%20%20Grading-cloud%20figures%20for%20the%20LessWrong%20post%20on%20D2.1%2C%20*Anchoring%20concepts%20in%20transformers*.%20This%20page%20is%20not%20an%20experiment.%20Every%20panel%20is%20drawn%20from%20the%20published%20results%20of%20%5Bex-2.1.6%5D(..%2Fex-2.1.6%2Freport.py)%2C%20%5Bex-2.1.8%5D(..%2Fex-2.1.8%2Freport.py)%2C%20and%20%5Bex-2.1.10%5D(..%2Fex-2.1.10%2Freport.py)%2C%20which%20hold%20the%20preregistered%20claims%20and%20their%20evidence.%20The%20post%20uploads%20the%20light%20%60_assets%2F*.png%60%20files%20from%20the%20bundle%20of%20this%20page.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20_loaded%20%3D%20load_margins()%0A%20%20%20%20mo.stop(_loaded%20is%20None%2C%20mo.md(%22_Results%20are%20not%20published%20yet%3B%20the%20figures%20render%20once%20they%20are._%22))%0A%20%20%20%20assert%20_loaded%20is%20not%20None%0A%20%20%20%20alphas%3A%20dict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D%20%3D%20_loaded%5B0%5D%0A%20%20%20%20alpha_stacks%3A%20dict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D%20%3D%20_loaded%5B1%5D%0A%20%20%20%20probe_pairs%3A%20np.ndarray%20%3D%20_loaded%5B2%5D%0A%20%20%20%20return%20alpha_stacks%2C%20alphas%2C%20probe_pairs%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20The%20recipe%2C%20one%20piece%20at%20a%20time%0A%0A%20%20%20%20Each%20panel%20below%20adds%20one%20piece%20of%20the%20anchoring%20recipe.%20The%20quantity%20plotted%20is%20the%20%CE%B1%20response%20at%20the%20op1%20token%2C%20drawn%20against%20the%20redness%20of%20the%20first%20operand.%5B%5Ealpha%5D%20Each%20chart%20is%20a%20*grading%20cloud*%3A%20the%20response%20is%20measured%20at%20the%20216%20vocabulary%20colors%2C%20interpolated%20across%20the%20whole%20RGB%20cube%2C%20and%20drawn%20as%20a%20dither%20of%20the%20colors%20themselves%2C%20so%20the%20vertical%20spread%20at%20each%20redness%20is%20the%20range%20of%20responses%20among%20equally%20red%20colors.%20The%20grey%20band%20behind%20each%20cloud%20drops%20the%20averaging%3A%20it%20redraws%20the%20response%20separately%20for%20every%20residual%20slice%20and%20every%20seed%2C%20flattened%20to%20grey%20so%20it%20reads%20as%20an%20envelope%20rather%20than%20data.%0A%0A%20%20%20%20%5B%5Ealpha%5D%3A%20%CE%B1%20is%20the%20cosine%20between%20the%20residual%20stream%20(the%20running%20vector%20that%20each%20layer%20reads%20from%20and%20writes%20back%20to)%20and%20the%20anchor%20axis%2C%20the%20direction%20we%20train%20the%20concept%20toward.%20The%20model%20keeps%20every%20residual%20state%20unit-norm%20(it%20is%20an%20nGPT%20variant)%2C%20which%20is%20why%20the%20axis%20label%20can%20write%20that%20cosine%20as%20a%20plain%20dot%20product.%20Here%20it%20is%20averaged%20over%20the%20five%20residual%20slices%2C%20the%20five%20points%20in%20the%20network%20where%20we%20read%20that%20vector.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(%0A%20%20%20%20alpha_stacks%3A%20dict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D%2C%0A%20%20%20%20alphas%3A%20dict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D%2C%0A)%3A%0A%20%20%20%20_ys%20%3D%20%7Bc.key%3A%20alphas%5Bc.key%5D%5B%22op1%22%5D%5B%3A%2C%20%3A%2C%200%5D.mean(axis%3D0)%20for%20c%20in%20ex.CONDITIONS%7D%0A%20%20%20%20_envs%20%3D%20%7Bc.key%3A%20alpha_stacks%5Bc.key%5D%5B%22op1%22%5D%5B%3A%2C%20%3A%2C%20%3A%2C%200%5D.reshape(-1%2C%20len(GRID_RGB))%20for%20c%20in%20ex.CONDITIONS%7D%0A%20%20%20%20%23%20Wide%20enough%20for%20the%20envelope's%20full%20range%2C%20since%20the%20clouds%20draw%20unclipped.%0A%20%20%20%20_ylim%20%3D%20(-0.4%2C%201.05)%0A%0A%20%20%20%20%40themed(%0A%20%20%20%20%20%20%20%20name%3D%22grading-progression%22%2C%0A%20%20%20%20%20%20%20%20alt_text%3D%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20Four%20grading%20clouds%20against%20redness%2C%20each%20over%20a%20grey%20per-slice%2C%20per-seed%20envelope.%20The%20un-anchored%20cloud%20is%20flat%20near%20zero%3B%20adding%20the%20anchor%20lifts%20every%20color%20to%20at%20least%200.4%2C%20with%20the%20envelope%20fanning%20wide%20across%20slices%3B%20the%20anti-subspace%20term%20restores%20a%20graded%20ramp%20from%20near%20zero%3B%20pooled%20labels%20leave%20the%20same%20clean%20rise%20to%20about%200.9%20at%20pure%20red%2C%20the%20envelope%20hugging%20the%20ramp.%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20caption%3Dr%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20**The%20anchoring%20recipe%2C%20one%20piece%20at%20a%20time.**%20Each%20panel%20is%20a%20grading%20cloud%20of%20the%20%CE%B1%20response%20at%20op1%20(mean%20over%20the%20five%20residual%20slices)%20against%20the%20redness%20of%20the%20first%20operand%2C%20drawn%20over%20the%20whole%20RGB%20cube%3B%20the%20grey%20envelope%20behind%20it%20redraws%20the%20response%20separately%20for%20every%20residual%20slice%20and%20seed%2C%20so%20the%20cloud%20reads%20against%20the%20spread%20it%20summarizes.%20Left%20to%20right%3A%20the%20un-anchored%20control%20and%20the%20bare%20anchor%20at%20%CE%BB%20%3D%200.1%20(ex-2.1.6)%3B%20the%20anchor%20plus%20the%20anti-subspace%20term%20at%20its%20tuned%20operating%20point%2C%20with%20labels%20still%20keyed%20to%20op1%20(ex-2.1.8%2C%20%60end90-hold30%60)%3B%20and%20the%20full%20recipe%2C%20where%20sequence-level%20labels%20name%20*either*%20operand%20and%20mellowmax%20pooling%20finds%20the%20red%20token%20on%20its%20own%20(the%20primary%20condition%20of%20ex-2.1.10%2C%20%60either-t100%60).%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20)%0A%20%20%20%20def%20_plot()%20-%3E%20plt.Figure%3A%0A%20%20%20%20%20%20%20%20fig%2C%20axes%20%3D%20plt.subplots(%0A%20%20%20%20%20%20%20%20%20%20%20%201%2C%20len(ex.CONDITIONS)%2C%20figsize%3D(7.4%2C%202.2)%2C%20sharex%3DTrue%2C%20sharey%3DTrue%2C%20layout%3D%22constrained%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20axes%20%3D%20cast(AxesRow%2C%20axes)%0A%20%20%20%20%20%20%20%20for%20ax%2C%20cond%20in%20zip(axes%2C%20ex.CONDITIONS%2C%20strict%3DTrue)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20GradingCloud(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax%2C%20_envs%5Bcond.key%5D%2C%20_ylim%2C%20k%3D20%2C%20color%3Dlight_dark(%22%230003%22%2C%20%22%23fff2%22)%2C%20clip_on%3DFalse%2C%20zorder%3D-1%2C%20dpr%3D1%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20GradingCloud(ax%2C%20_ys%5Bcond.key%5D%2C%20_ylim%2C%20k%3D35%2C%20dpr%3D2%2C%20clip_on%3DFalse)%0A%20%20%20%20%20%20%20%20%20%20%20%20ax.set_title(cond.title%2C%20fontsize%3D9)%0A%20%20%20%20%20%20%20%20%20%20%20%20ax.set_xlabel(%22redness%20of%20op1%22%2C%20fontsize%3D8)%0A%20%20%20%20%20%20%20%20%20%20%20%20ax.tick_params(labelsize%3D7)%0A%20%20%20%20%20%20%20%20%20%20%20%20ax.set_aspect(%22equal%22)%0A%20%20%20%20%20%20%20%20axes%5B0%5D.set_xticks(%5B0%2C%200.5%2C%201%5D)%0A%20%20%20%20%20%20%20%20axes%5B0%5D.set_yticks(%5B0%2C%200.5%2C%201%5D)%0A%20%20%20%20%20%20%20%20axes%5B0%5D.set_ylim(0%2C%201)%0A%20%20%20%20%20%20%20%20axes%5B0%5D.set_ylabel(%22%CE%B1%20at%20op1%5Cnact%20%C2%B7%20(1%2C%200%2C%20%E2%80%A6)%22%2C%20fontsize%3D8)%0A%20%20%20%20%20%20%20%20return%20fig%0A%0A%20%20%20%20mo.Html(_plot())%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(alphas%3A%20dict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D)%3A%0A%20%20%20%20_bare%20%3D%20alphas%5B%22ex-2.1.6%2Flam0.1%22%5D%5B%22op1%22%5D%5B%3A%2C%20%3A%2C%200%5D.mean(axis%3D0)%0A%20%20%20%20_primary%20%3D%20alphas%5Bex.PRIMARY%5D%5B%22op1%22%5D%5B%3A%2C%20%3A%2C%200%5D.mean(axis%3D0)%0A%20%20%20%20mo.md(rf%22%22%22%0A%20%20%20%20The%20bare%20anchor%20aligns%20everything%20at%20once%3A%20the%20response%20rises%20for%20every%20color%2C%20and%20even%20the%20least%20red%20colors%20sit%20at%20%CE%B1%20%E2%89%88%20%7B_bare.min()%3A.2f%7D.%20Adding%20the%20anti-subspace%20term%20is%20what%20makes%20the%20alignment%20graded%2C%20pulling%20non-red%20colors%20back%20to%20zero%20while%20pure%20red%20stays%20anchored.%20That%20grading%20survives%20the%20move%20to%20labels%20that%20no%20longer%20point%20at%20a%20particular%20token%3A%20in%20the%20primary%20condition%2C%20the%20slice-mean%20response%20at%20op1%20tracks%20the%20sim%C2%B9%C2%B7%E2%81%B5%20affinity%20shape%20with%20r%C2%B2%20%E2%89%88%20%7Br2_sim(_primary)%3A.2f%7D.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Where%20the%20response%20sits%2C%20per%20(slice%2C%20position)%0A%0A%20%20%20%20The%20clouds%20above%20average%20over%20the%20residual%20slices%20and%20look%20only%20at%20op1.%20Splitting%20each%20condition%20by%20slice%20and%20by%20token%20position%20shows%20where%20in%20the%20network%2C%20and%20where%20in%20the%20sequence%2C%20its%20response%20sits.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(probe_pairs%3A%20np.ndarray)%3A%0A%20%20%20%20%23%20What%20each%20color's%20partners%20look%20like%3A%20mean%20redness%20over%20the%2027%20lines%20it%20leads.%0A%20%20%20%20_partner_red%20%3D%20np.bincount(probe_pairs%5B%3A%2C%200%5D%2C%20REDNESS%5Bprobe_pairs%5B%3A%2C%201%5D%5D)%20%2F%20np.bincount(probe_pairs%5B%3A%2C%200%5D)%0A%20%20%20%20mo.md(rf%22%22%22%0A%20%20%20%20Each%20condition%20gets%20a%20pair%20of%20these%2C%20side%20by%20side%2C%20because%20the%20measurement%20affords%20two%20views.%20The%20probe%20set%20runs%20every%20color%20as%20op1%20against%20each%20of%20the%2027%20partners%20it%20mixes%20cleanly%20with%2C%20and%20mixing%20is%20symmetric%2C%20so%20every%20color%20also%20sits%20at%20op2%20on%2027%20lines.%20Averaging%20each%20line%20over%20op2%20keys%20the%20%CE%B1%20map%20onto%20the%20first%20operand's%20color%3B%20averaging%20over%20op1%20keys%20it%20onto%20the%20second.%20Both%20are%20margins%20of%20one%20per-line%20array%2C%20in%20the%20statistical%20sense%20%E2%80%94%20each%20drops%20an%20operand%20by%20averaging%20over%20it%20%E2%80%94%20so%20the%20colors%20are%20re-sorted%20rather%20than%20re-measured%2C%20and%20either%20way%20a%20slot's%20response%20is%20a%20mean%20over%2027%20lines.%5B%5Erecompute%5D%0A%0A%20%20%20%20**Read%20the%20off-key%20slot%20with%20care.**%20Wherever%20a%20condition%20responds%20at%20all%2C%20the%20slot%20that%20is%20*not*%20the%20key%20tilts%20upward%20too%2C%20and%20part%20of%20that%20tilt%20is%20the%20shape%20of%20the%20probe%20set%20rather%20than%20anything%20the%20model%20does.%20A%20pair%20is%20on%20the%20probe%20set%20only%20if%20the%20mix%20lands%20back%20on%20the%20color%20grid%2C%20and%20that%20closure%20rule%20correlates%20a%20color's%20redness%20with%20its%20partners'%3A%20pure%20red's%20partners%20average%20%7B_partner_red%5BI_RED%5D%3A.2f%7D%20redness%20against%20%7BREDNESS.mean()%3A.2f%7D%20for%20the%20palette%20as%20a%20whole.%20So%20an%20off-key%20slot%20shows%20what%20a%20color's%20*partners*%20do%2C%20and%20only%20the%20on-key%20slot%20is%20a%20response%20to%20the%20key.%20The%20embedding%20row%20is%20the%20clean%20demonstration%20%E2%80%94%20there%20every%20state%20is%20a%20function%20of%20its%20own%20token%2C%20so%20whatever%20tilt%20survives%20in%20the%20off-key%20slot%20at%20%60emb%60%20is%20all%20bookkeeping.%20The%20op1%20slot%20repeats%20that%20at%20every%20slice%2C%20because%20attention%20is%20causal%3A%20the%20state%20above%20the%20first%20token%20never%20sees%20the%20second%20operand%2C%20so%20its%20tilt%20in%20the%20op2-keyed%20view%20is%20partner%20composition%20all%20the%20way%20up%20the%20stack.%20The%20tilt%20scales%20with%20how%20much%20response%20there%20is%20to%20compose%20from%2C%20which%20is%20why%20the%20un-anchored%20panels%20show%20none%20of%20it.%20Fitted%20channel%20probes%20make%20the%20same%20point%20without%20the%20anchor%20axis%3A%20%5Bex-2.1.12%5D(..%2Fex-2.1.12%2Freport.py)%20probes%20each%20condition's%20own%20color%20readout%20and%20finds%20no%20usable%20op2%20information%20before%20op2%20in%20any%20of%20them%2C%20anchored%20or%20not.%0A%0A%20%20%20%20%5B%5Erecompute%5D%3A%20Ex-2.1.10%20published%20its%20per-line%20array%2C%20so%20both%20of%20its%20margins%20are%20contractions%20of%20what%20it%20stored.%20Ex-2.1.6%20and%20ex-2.1.8%20averaged%20theirs%20over%20partners%20before%20storing%2C%20which%20is%20the%20step%20that%20drops%20op2's%20identity%2C%20so%20their%20second%20margin%20is%20recomputed%20from%20their%20published%20checkpoints%20by%20%60experiment.py%60%20beside%20this%20notebook.%20It%20checks%20the%20op1%20margin%20it%20recovers%20against%20the%20one%20they%20published%20before%20publishing%20anything.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(alphas%3A%20dict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D)%3A%0A%20%20%20%20%23%20Takeaway%20first%3A%20what%20the%20figure%20shows%2C%20not%20an%20inventory%20of%20what%20is%20drawn.%0A%20%20%20%20_ALT%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22ex-2.1.6%2Flam0%22%3A%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20Nothing%20anywhere%2C%20in%20either%20keying%3A%20every%20slice%20and%20every%20token%20position%20holds%20a%20flat%20band%20of%20color%20at%20zero.%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20%22ex-2.1.6%2Flam0.1%22%3A%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20The%20bare%20anchor%20lifts%20the%20whole%20sequence%3A%20every%20slot%20in%20both%20panels%20sits%20high%2C%20with%20only%20a%20mild%20tilt%2C%20so%20almost%20nothing%20is%20graded%20by%20redness.%20The%20steepest%20climb%20in%20each%20panel%20is%20at%20the%20keyed%20operand's%20own%20slot%20%E2%80%94%20op1%20on%20the%20left%2C%20op2%20on%20the%20right.%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20%22ex-2.1.8%2Fend90-hold30%22%3A%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20Grading%20returns%2C%20but%20it%20fills%20the%20whole%20anchored%20span%3A%20op1%2C%20plus%2C%20op2%20and%20equals%20all%20carry%20tall%20red-rising%20clouds%2C%20while%20the%20answer%20and%20newline%20slots%20stay%20low.%20The%20tallest%20cloud%20sits%20at%20the%20keyed%20operand's%20slot%20in%20each%20panel%2C%20with%20equals%20close%20behind%2C%20so%20the%20pull%20is%20shared%20across%20the%20span%20either%20way%20round.%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20%22ex-2.1.10%2Feither-t100%22%3A%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20The%20pull%20has%20narrowed%20to%20one%20token%2C%20and%20it%20follows%20the%20keying%3A%20a%20sigmoid%20cloud%20rises%20to%20about%200.97%20at%20the%20op1%20slot%20in%20every%20slice%20on%20the%20left%2C%20at%20the%20op2%20slot%20on%20the%20right%2C%20while%20every%20other%20slot%20stays%20low%20in%20both.%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20def%20_grids(cond%3A%20ex.Condition)%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20%40themed(%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3Df%22grading-grid-%7Bcond.exp%7D-%7Bcond.name%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt_text%3D_ALT%5Bcond.key%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20caption%3Drf%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20**%7Bcond.title%7D**%20(%7Bcond.exp%7D%2C%20%60%7Bcond.name%7D%60).%20One%20row%20per%20residual%20slice%2C%20with%20the%20embedding%20at%20the%20bottom%3B%20each%20slot%20holds%20the%20grading%20cloud%20of%20the%20%CE%B1%20response%20at%20that%20token%20position.%20The%20two%20panels%20key%20the%20same%20measurement%20by%20a%20different%20operand%20%E2%80%94%20its%20redness%20runs%20left%20to%20right%20within%20every%20slot%20%E2%80%94%20and%20in%20red%2C%20%CE%B1%20on%20the%20probe%20lines%20whose%20keyed%20operand%20is%20pure%20red%3B%20the%20red%20slot%20name%20on%20the%20x%20axis%20marks%20that%20operand.%20Each%20row%20spans%20the%20same%200%E2%80%931%20%CE%B1%20scale%2C%20ticked%20once%20at%20the%20bottom%20right.%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20def%20_plot()%20-%3E%20plt.Figure%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20grading_grids(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7Bf%22Keyed%20by%20the%20%7Bop%7D%20operand%22%3A%20(alphas%5Bcond.key%5D%5Bk%5D%2C%20POS_NAMES.index(k))%20for%20k%2C%20op%20in%20KEYINGS.items()%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20return%20_plot()%0A%0A%20%20%20%20for%20c%20in%20mo.status.progress_bar(ex.CONDITIONS%2C%20title%3D%22Rendering%20charts%22%2C%20remove_on_exit%3DTrue%2C%20show_eta%3DTrue)%3A%0A%20%20%20%20%20%20%20%20mo.output.append(mo.md(f%22%23%23%23%20%7Bc.title%7D%5Cn%5Cn%7B_grids(c)%7D%22))%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(alphas%3A%20dict%5Bstr%2C%20dict%5Bstr%2C%20np.ndarray%5D%5D)%3A%0A%20%20%20%20%23%20Position%20slots%2C%20as%20POS_NAMES%20orders%20them%3A%20op1%20%2B%20op2%20%3D%20ans%20%5Cn.%0A%20%20%20%20_OP1%2C%20_PLUS%2C%20_OP2%2C%20_EQ%2C%20_ANS%2C%20_NL%20%3D%20range(6)%0A%20%20%20%20%23%20Mid-stack%20(slices%201%E2%80%933)%20%CE%B1%20on%20the%20lines%20whose%20keyed%20operand%20is%20pure%20red.%0A%20%20%20%20_red%20%3D%20lambda%20key%2C%20k%2C%20t%3A%20float(alphas%5Bkey%5D%5Bk%5D%5B1%3A4%2C%20I_RED%2C%20t%5D.mean())%20%20%23%20noqa%3A%20E731%0A%20%20%20%20_r2%20%3D%20lambda%20key%2C%20k%2C%20t%3A%20r2_sim(alphas%5Bkey%5D%5Bk%5D%5B%3A%2C%20%3A%2C%20t%5D.mean(axis%3D0))%20%20%23%20noqa%3A%20E731%0A%20%20%20%20%23%20Drift%3A%20the%20mean%20over%20*all*%20colors%20at%20the%20last%20slice%2C%20not%20the%20pure-red%20row.%0A%20%20%20%20_bulk%20%3D%20lambda%20key%2C%20k%2C%20t%3A%20float(alphas%5Bkey%5D%5Bk%5D%5B4%2C%20%3A%2C%20t%5D.mean())%20%20%23%20noqa%3A%20E731%0A%20%20%20%20_flat%2C%20_bare%2C%20_anti%20%3D%20%22ex-2.1.6%2Flam0%22%2C%20%22ex-2.1.6%2Flam0.1%22%2C%20%22ex-2.1.8%2Fend90-hold30%22%0A%20%20%20%20mo.md(rf%22%22%22%0A%20%20%20%20Read%20across%20the%20eight%20panels%20and%20the%20recipe%20narrows%20*where*%20the%20pull%20lands%2C%20in%20three%20steps.%0A%0A%20%20%20%20Un-anchored%20there%20is%20nothing%20to%20place.%20No%20slot%20in%20either%20keying%20leaves%20the%20noise%2C%20and%20the%20slice-mean%20response%20at%20op1%20scores%20r%C2%B2%20%3D%20%7B_r2(_flat%2C%20%22op1%22%2C%20_OP1)%3A.2f%7D%20against%20the%20sim%C2%B9%C2%B7%E2%81%B5%20shape.%0A%0A%20%20%20%20**The%20bare%20anchor%20lifts%20the%20whole%20sequence.**%20With%20a%20pure-red%20first%20operand%2C%20mid-stack%20%CE%B1%20runs%20%7B_red(_bare%2C%20%22op1%22%2C%20_OP1)%3A.2f%7D%20at%20op1%2C%20%7B_red(_bare%2C%20%22op1%22%2C%20_PLUS)%3A.2f%7D%20at%20the%20%60%2B%60%20slot%2C%20%7B_red(_bare%2C%20%22op1%22%2C%20_OP2)%3A.2f%7D%20at%20op2%20and%20%7B_red(_bare%2C%20%22op1%22%2C%20_EQ)%3A.2f%7D%20at%20the%20%60%3D%60%20slot%20%E2%80%94%20and%20it%20does%20not%20stop%20at%20the%20anchored%20span%2C%20reaching%20%7B_red(_bare%2C%20%22op1%22%2C%20_ANS)%3A.2f%7D%20at%20the%20answer%20and%20%7B_red(_bare%2C%20%22op1%22%2C%20_NL)%3A.2f%7D%20at%20the%20newline.%20Both%20keyings%20show%20the%20same%20indiscriminate%20lift.%0A%0A%20%20%20%20**The%20anti-subspace%20term%20confines%20it%20to%20the%20span.**%20Outside%20the%20span%20the%20response%20falls%20away%20(%7B_red(_anti%2C%20%22op1%22%2C%20_ANS)%3A.2f%7D%20at%20the%20answer%2C%20%7B_red(_anti%2C%20%22op1%22%2C%20_NL)%3A.2f%7D%20at%20the%20newline)%2C%20and%20the%20drift%20over%20all%20colors%20at%20the%20last%20slice%20drops%20from%20%7B_bulk(_bare%2C%20%22op1%22%2C%20_OP1)%3A.2f%7D%20to%20%7B_bulk(_anti%2C%20%22op1%22%2C%20_OP1)%3A.2f%7D%20%E2%80%94%20the%20containment%20ex-2.1.8%20was%20tuned%20for.%20Inside%20the%20span%20the%20pull%20is%20still%20shared%3A%20a%20pure-red%20op1%20brings%20the%20op2%20slot%20to%20%7B_red(_anti%2C%20%22op1%22%2C%20_OP2)%3A.2f%7D%20and%20the%20%60%3D%60%20slot%20to%20%7B_red(_anti%2C%20%22op1%22%2C%20_EQ)%3A.2f%7D%2C%20and%20the%20op2%20slot%20grades%20against%20*op1's*%20redness%20at%20r%C2%B2%20%3D%20%7B_r2(_anti%2C%20%22op1%22%2C%20_OP2)%3A.2f%7D.%20That%20is%20what%20op1-keyed%20labels%20buy%3A%20a%20red%20token%20pulls%20the%20span%20it%20sits%20in%2C%20without%20the%20span%20having%20to%20say%20which%20token%20it%20was.%0A%0A%20%20%20%20**Pooled%20labels%20narrow%20it%20to%20the%20token.**%20On%20the%20primary%20a%20pure-red%20op1%20leaves%20the%20rest%20of%20the%20span%20between%20%7Bmin(_red(ex.PRIMARY%2C%20%22op1%22%2C%20t)%20for%20t%20in%20(_PLUS%2C%20_OP2%2C%20_EQ))%3A.2f%7D%20and%20%7Bmax(_red(ex.PRIMARY%2C%20%22op1%22%2C%20t)%20for%20t%20in%20(_PLUS%2C%20_OP2%2C%20_EQ))%3A.2f%7D%2C%20and%20a%20pure-red%20op2%20leaves%20the%20op1%20slot%20at%20%7B_red(ex.PRIMARY%2C%20%22op2%22%2C%20_OP1)%3A.2f%7D.%20Each%20operand%20slot%20answers%20to%20its%20own%20color%20%E2%80%94%20r%C2%B2%20%3D%20%7B_r2(ex.PRIMARY%2C%20%22op1%22%2C%20_OP1)%3A.2f%7D%20at%20op1%20and%20%7B_r2(ex.PRIMARY%2C%20%22op2%22%2C%20_OP2)%3A.2f%7D%20at%20op2%2C%20reaching%20%CE%B1%20%E2%89%88%20%7B_red(ex.PRIMARY%2C%20%22op1%22%2C%20_OP1)%3A.2f%7D%20and%20%7B_red(ex.PRIMARY%2C%20%22op2%22%2C%20_OP2)%3A.2f%7D%20at%20pure%20red.%20So%20the%20pull%20finds%20the%20red%20token%20in%20either%20slot%2C%20grades%20it%20the%20same%20way%20there%2C%20and%20leaves%20its%20neighbours%20alone%2C%20which%20is%20the%20claim%20the%20pooled%20labels%20were%20meant%20to%20buy.%0A%0A%20%20%20%20Two%20asymmetries%20survive%20on%20the%20primary.%20Op2%20carries%20a%20little%20more%20of%20the%20drift%20at%20the%20last%20slice%20(%7B_bulk(ex.PRIMARY%2C%20%22op2%22%2C%20_OP2)%3A.2f%7D%20against%20%7B_bulk(ex.PRIMARY%2C%20%22op1%22%2C%20_OP1)%3A.2f%7D%20at%20op1)%2C%20matching%20ex-2.1.10's%20reading%20that%20op1%20hosts%20less%20of%20it%20once%20half%20the%20pull%20budget%20goes%20to%20op2.%20The%20answer%20slot%20barely%20moves%20between%20the%20two%20keyings%20(r%C2%B2%20%7B_r2(ex.PRIMARY%2C%20%22op2%22%2C%20_ANS)%3A.2f%7D%20against%20%7B_r2(ex.PRIMARY%2C%20%22op1%22%2C%20_ANS)%3A.2f%7D)%3A%20the%20answer%20is%20the%20mix%2C%20so%20its%20redness%20is%20a%20function%20of%20both%20operands%20and%20neither%20keying%20has%20much%20claim%20on%20it.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
6887a3282f1e0b355f6b4e52c4a6afb9