%22%22%22A%2FB%20comparison%20tool.%0A%0ASide-by-side%20panels%20comparing%20two%20states%20of%20the%20same%20factory%3A%0A-%20LEFT%3A%20current%20production%20batch%20(from%20experiments.tsv)%0A-%20RIGHT%3A%20a%20freshly-regenerated%20test%20batch%0A%0AShows%20score%20deltas%2C%20metric%20distributions%2C%20and%20sample%20thumbnails.%0AUse%20this%20BEFORE%20committing%20a%20tuning%20change%20to%20validate%20it%20actually%20improves%20things.%0A%22%22%22%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.22.5%22%0Aapp%20%3D%20marimo.App(width%3D%22full%22%2C%20app_title%3D%22A%2FB%20Comparison%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20sys%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20sys.path.insert(0%2C%20str(Path(__file__).parent))%0A%20%20%20%20import%20_lib%20as%20lib%0A%0A%20%20%20%20return%20lib%2C%20mo%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%20A%2FB%20Comparison%0A%0A%20%20%20%20Compare%20a%20factory's%20**current%20production%20batch**%20(from%20experiments.tsv)%20against%20a%20**freshly-generated%20test%20batch**%20to%20validate%20tuning%20before%20committing.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(lib%2C%20mo)%3A%0A%20%20%20%20factory%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3Dlib.FACTORIES%2C%0A%20%20%20%20%20%20%20%20value%3D%22hatching%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Factory%22%2C%0A%20%20%20%20)%0A%20%20%20%20n_test%20%3D%20mo.ui.slider(5%2C%2050%2C%20value%3D10%2C%20label%3D%22Test%20batch%20size%22%2C%20show_value%3DTrue)%0A%20%20%20%20regen_btn%20%3D%20mo.ui.run_button(label%3D%22Generate%20test%20batch%22)%0A%20%20%20%20mo.hstack(%5Bfactory%2C%20n_test%2C%20regen_btn%5D%2C%20gap%3D2%2C%20justify%3D%22start%22)%0A%20%20%20%20return%20factory%2C%20n_test%2C%20regen_btn%0A%0A%0A%40app.cell%0Adef%20_(factory%2C%20lib)%3A%0A%20%20%20%20%23%20Current%20baseline%20from%20experiments.tsv%0A%20%20%20%20baseline_summary%20%3D%20lib.factory_summary(factory.value)%0A%20%20%20%20return%20(baseline_summary%2C)%0A%0A%0A%40app.cell%0Adef%20_(factory%2C%20lib%2C%20n_test%2C%20regen_btn)%3A%0A%20%20%20%20%23%20Generate%20test%20variants%20on%20button%20click%0A%20%20%20%20test_results%20%3D%20%5B%5D%0A%20%20%20%20if%20regen_btn.value%3A%0A%20%20%20%20%20%20%20%20for%20v%20in%20range(n_test.value)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20ok%20%3D%20lib.generate_variant(factory.value%2C%20v)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20ok%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pid%20%3D%20f%22%7Bfactory.value%7D-%7Bv%3A04d%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scores%20%3D%20lib.score_piece(pid%2C%20no_llm%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20scores%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20test_results.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%20pid%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22composite%22%3A%20scores.get(%22composite%22%2C%200)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ink%22%3A%20scores.get(%22ink_coverage%22%2C%200)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ent%22%3A%20scores.get(%22entropy%22%2C%200)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22uniq%22%3A%20scores.get(%22uniqueness%22%2C%200)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20return%20(test_results%2C)%0A%0A%0A%40app.cell%0Adef%20_(baseline_summary%2C%20mo%2C%20test_results)%3A%0A%20%20%20%20if%20not%20test_results%3A%0A%20%20%20%20%20%20%20%20diff_md%20%3D%20mo.md(%22_Click%20'Generate%20test%20batch'%20to%20compare%20against%20baseline._%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20test_avg%20%3D%20sum(r%5B%22composite%22%5D%20for%20r%20in%20test_results)%20%2F%20len(test_results)%0A%20%20%20%20%20%20%20%20test_best%20%3D%20max(r%5B%22composite%22%5D%20for%20r%20in%20test_results)%0A%20%20%20%20%20%20%20%20test_ent%20%3D%20sum(r%5B%22ent%22%5D%20for%20r%20in%20test_results)%20%2F%20len(test_results)%0A%20%20%20%20%20%20%20%20test_ink%20%3D%20sum(r%5B%22ink%22%5D%20for%20r%20in%20test_results)%20%2F%20len(test_results)%0A%0A%20%20%20%20%20%20%20%20bm%20%3D%20baseline_summary%0A%20%20%20%20%20%20%20%20delta_avg%20%3D%20test_avg%20-%20bm%5B%22avg%22%5D%0A%20%20%20%20%20%20%20%20delta_ent%20%3D%20test_ent%20-%20bm%5B%22metrics%22%5D%5B%22entropy%22%5D%0A%20%20%20%20%20%20%20%20delta_ink%20%3D%20test_ink%20-%20bm%5B%22metrics%22%5D%5B%22ink_coverage%22%5D%0A%0A%20%20%20%20%20%20%20%20def%20fmt_delta(d)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20sign%20%3D%20%22%2B%22%20if%20d%20%3E%200%20else%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20color%20%3D%20%22%234ade80%22%20if%20d%20%3E%200%20else%20(%22%23f87171%22%20if%20d%20%3C%200%20else%20%22%23999%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20f'%3Cspan%20style%3D%22color%3A%7Bcolor%7D%22%3E%7Bsign%7D%7Bd%3A.2f%7D%3C%2Fspan%3E'%0A%0A%20%20%20%20%20%20%20%20diff_md%20%3D%20mo.Html(%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22font-family%3Amonospace%3B%20font-size%3A14px%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctable%20style%3D%22width%3A100%25%3B%20border-collapse%3Acollapse%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctr%20style%3D%22background%3A%23222%3B%22%3E%3Cth%20style%3D%22padding%3A8px%3B%20text-align%3Aleft%3B%22%3EMetric%3C%2Fth%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cth%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3EBaseline%3C%2Fth%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cth%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3ETest%3C%2Fth%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cth%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3EDelta%3C%2Fth%3E%3C%2Ftr%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctr%3E%3Ctd%20style%3D%22padding%3A8px%3B%22%3EAvg%20composite%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Bbm%5B%22avg%22%5D%3A.1f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Btest_avg%3A.1f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Bfmt_delta(delta_avg)%7D%3C%2Ftd%3E%3C%2Ftr%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctr%3E%3Ctd%20style%3D%22padding%3A8px%3B%22%3EBest%20composite%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Bbm%5B%22best%22%5D%3A.1f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Btest_best%3A.1f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Bfmt_delta(test_best%20-%20bm%5B%22best%22%5D)%7D%3C%2Ftd%3E%3C%2Ftr%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctr%3E%3Ctd%20style%3D%22padding%3A8px%3B%22%3EAvg%20entropy%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Bbm%5B%22metrics%22%5D%5B%22entropy%22%5D%3A.3f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Btest_ent%3A.3f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Bfmt_delta(delta_ent)%7D%3C%2Ftd%3E%3C%2Ftr%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctr%3E%3Ctd%20style%3D%22padding%3A8px%3B%22%3EAvg%20ink%20coverage%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Bbm%5B%22metrics%22%5D%5B%22ink_coverage%22%5D%3A.3f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Btest_ink%3A.3f%7D%3C%2Ftd%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3Ctd%20style%3D%22padding%3A8px%3B%20text-align%3Aright%3B%22%3E%7Bfmt_delta(delta_ink)%7D%3C%2Ftd%3E%3C%2Ftr%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Ftable%3E%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20diff_md%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(factory%2C%20lib%2C%20mo%2C%20test_results)%3A%0A%20%20%20%20if%20not%20test_results%3A%0A%20%20%20%20%20%20%20%20thumbs%20%3D%20mo.md(%22%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20test_cards%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20r%20in%20test_results%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20png%20%3D%20lib.piece_path(r%5B%22id%22%5D%2C%20%22png%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20png.exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20test_cards.append(mo.Html(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22text-align%3Acenter%3B%20padding%3A4px%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cimg%20src%3D%22%7Blib.png_data_uri(png)%7D%22%20'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'style%3D%22width%3A120px%3B%20border%3A1px%20solid%20%23444%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22font-size%3A10px%3B%20font-family%3Amonospace%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%7Br%5B%22id%22%5D.split(%22-%22)%5B1%5D%7D%3Cbr%3E%7Br%5B%22composite%22%5D%3A.1f%7D'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Fdiv%3E%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20))%0A%0A%20%20%20%20%20%20%20%20%23%20Baseline%20samples%20(top%2010%20from%20current%20batch)%0A%20%20%20%20%20%20%20%20baseline_top%20%3D%20lib.get_top_pieces(factory.value%2C%2010)%0A%20%20%20%20%20%20%20%20baseline_cards%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20r%20in%20baseline_top%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20png%20%3D%20lib.piece_path(r%5B%22id%22%5D%2C%20%22png%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20png.exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20baseline_cards.append(mo.Html(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22text-align%3Acenter%3B%20padding%3A4px%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cimg%20src%3D%22%7Blib.png_data_uri(png)%7D%22%20'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'style%3D%22width%3A120px%3B%20border%3A1px%20solid%20%23444%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3Cdiv%20style%3D%22font-size%3A10px%3B%20font-family%3Amonospace%3B%22%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%7Br%5B%22id%22%5D.split(%22-%22)%5B1%5D%7D%3Cbr%3E%7Bfloat(r%5B%22composite_score%22%5D)%3A.1f%7D'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'%3C%2Fdiv%3E%3C%2Fdiv%3E'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20))%0A%0A%20%20%20%20%20%20%20%20thumbs%20%3D%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Baseline%20(top%2010%20from%20current%20batch)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(baseline_cards%2C%20wrap%3DTrue%2C%20gap%3D1%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Test%20(newly%20generated)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(test_cards%2C%20wrap%3DTrue%2C%20gap%3D1%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%20%20%20%20%5D)%0A%20%20%20%20thumbs%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
d3ddd314e08b58689d23e78fb374db27