|
59 | 59 | "\n", |
60 | 60 | "from egglog.exp.param_eq.paths import ARTIFACT_DIR, PARAM_EQ_DIR\n", |
61 | 61 | "\n", |
62 | | - "\n", |
63 | 62 | "alt.data_transformers.disable_max_rows()\n", |
64 | 63 | "alt.renderers.enable(\"default\")\n", |
65 | 64 | "\n", |
|
273 | 272 | " percent = float(\"nan\")\n", |
274 | 273 | " if not eligible.empty:\n", |
275 | 274 | " percent = 100.0 * (eligible[\"simpl_rank\"] <= delta).sum() / len(eligible)\n", |
276 | | - " rows.append(\n", |
277 | | - " {\n", |
278 | | - " \"implementation\": implementation,\n", |
279 | | - " \"dataset\": dataset,\n", |
280 | | - " \"dataset_label\": DATASET_LABELS[dataset],\n", |
281 | | - " \"algorithm\": algorithm,\n", |
282 | | - " \"delta\": f\"Δ {'==' if delta == 0 else '<='} {delta}\",\n", |
283 | | - " \"percent\": percent,\n", |
284 | | - " }\n", |
285 | | - " )\n", |
| 275 | + " rows.append({\n", |
| 276 | + " \"implementation\": implementation,\n", |
| 277 | + " \"dataset\": dataset,\n", |
| 278 | + " \"dataset_label\": DATASET_LABELS[dataset],\n", |
| 279 | + " \"algorithm\": algorithm,\n", |
| 280 | + " \"delta\": f\"Δ {'==' if delta == 0 else '<='} {delta}\",\n", |
| 281 | + " \"percent\": percent,\n", |
| 282 | + " })\n", |
286 | 283 | " result = pd.DataFrame(rows)\n", |
287 | 284 | " result[\"percent_label\"] = result[\"percent\"].map(lambda value: \"n/a\" if pd.isna(value) else f\"{value:.2f}%\")\n", |
288 | 285 | " return result\n", |
|
309 | 306 | " display(SVG(buffer.getvalue()))\n", |
310 | 307 | "\n", |
311 | 308 | "\n", |
312 | | - "archived_haskell = with_implementation(add_paper_metrics(_paper_haskell_frame(ARCHIVED_HASKELL_PATH)), \"Archived Haskell\")\n", |
| 309 | + "archived_haskell = with_implementation(\n", |
| 310 | + " add_paper_metrics(_paper_haskell_frame(ARCHIVED_HASKELL_PATH)), \"Archived Haskell\"\n", |
| 311 | + ")\n", |
313 | 312 | "live_haskell = with_implementation(add_paper_metrics(_paper_haskell_frame(LIVE_HASKELL_PATH)), \"Live Haskell\")\n", |
314 | 313 | "egglog = with_implementation(add_paper_metrics(_paper_egglog_frame(EGGLOG_PATH)), \"Egglog\")\n", |
315 | 314 | "runtime_rows = _paper_runtime_frame()\n", |
|
375 | 374 | " comparison_table(egglog, implementation=\"Egglog\"),\n", |
376 | 375 | " ],\n", |
377 | 376 | " ignore_index=True,\n", |
378 | | - ")\n" |
| 377 | + ")" |
379 | 378 | ] |
380 | 379 | }, |
381 | 380 | { |
|
535 | 534 | } |
536 | 535 | ], |
537 | 536 | "source": [ |
538 | | - "artifact_summary = pd.DataFrame(\n", |
539 | | - " [\n", |
| 537 | + "artifact_summary = pd.DataFrame([\n", |
| 538 | + " {\n", |
| 539 | + " \"implementation\": \"Archived Haskell\",\n", |
| 540 | + " \"rows\": len(archived_haskell),\n", |
| 541 | + " \"original_median_simpl_rank\": float(archived_haskell[\"simpl_rank\"].median()),\n", |
| 542 | + " \"sympy_median_simpl_rank\": float(archived_haskell[\"sympy_rank\"].median()),\n", |
| 543 | + " },\n", |
| 544 | + " {\n", |
| 545 | + " \"implementation\": \"Live Haskell\",\n", |
| 546 | + " \"rows\": len(live_haskell),\n", |
| 547 | + " \"original_median_simpl_rank\": float(live_haskell[\"simpl_rank\"].median()),\n", |
| 548 | + " \"sympy_median_simpl_rank\": float(live_haskell[\"sympy_rank\"].median()),\n", |
| 549 | + " },\n", |
| 550 | + " {\n", |
| 551 | + " \"implementation\": \"Egglog\",\n", |
| 552 | + " \"rows\": len(egglog),\n", |
| 553 | + " \"original_median_simpl_rank\": float(egglog[\"simpl_rank\"].median()),\n", |
| 554 | + " \"sympy_median_simpl_rank\": float(egglog[\"sympy_rank\"].median()),\n", |
| 555 | + " },\n", |
| 556 | + "])\n", |
| 557 | + "display(artifact_summary)\n", |
| 558 | + "display(\n", |
| 559 | + " pd.DataFrame([\n", |
540 | 560 | " {\n", |
541 | | - " \"implementation\": \"Archived Haskell\",\n", |
542 | | - " \"rows\": len(archived_haskell),\n", |
543 | | - " \"original_median_simpl_rank\": float(archived_haskell[\"simpl_rank\"].median()),\n", |
544 | | - " \"sympy_median_simpl_rank\": float(archived_haskell[\"sympy_rank\"].median()),\n", |
| 561 | + " \"comparison\": \"Egglog vs live Haskell (original)\",\n", |
| 562 | + " \"exact_matches\": int(egglog_vs_live[\"orig_exact\"].sum()),\n", |
| 563 | + " \"total_rows\": len(egglog_vs_live),\n", |
| 564 | + " \"max_gap\": int(egglog_vs_live[\"orig_gap\"].max()),\n", |
545 | 565 | " },\n", |
546 | 566 | " {\n", |
547 | | - " \"implementation\": \"Live Haskell\",\n", |
548 | | - " \"rows\": len(live_haskell),\n", |
549 | | - " \"original_median_simpl_rank\": float(live_haskell[\"simpl_rank\"].median()),\n", |
550 | | - " \"sympy_median_simpl_rank\": float(live_haskell[\"sympy_rank\"].median()),\n", |
| 567 | + " \"comparison\": \"Egglog vs live Haskell (sympy)\",\n", |
| 568 | + " \"exact_matches\": int(egglog_vs_live[\"sympy_exact\"].sum()),\n", |
| 569 | + " \"total_rows\": len(egglog_vs_live),\n", |
| 570 | + " \"max_gap\": int(egglog_vs_live[\"sympy_gap\"].max()),\n", |
551 | 571 | " },\n", |
552 | 572 | " {\n", |
553 | | - " \"implementation\": \"Egglog\",\n", |
554 | | - " \"rows\": len(egglog),\n", |
555 | | - " \"original_median_simpl_rank\": float(egglog[\"simpl_rank\"].median()),\n", |
556 | | - " \"sympy_median_simpl_rank\": float(egglog[\"sympy_rank\"].median()),\n", |
| 573 | + " \"comparison\": \"Live vs archived Haskell (original)\",\n", |
| 574 | + " \"exact_matches\": int((archive_drift[\"orig_drift\"] == 0).sum()),\n", |
| 575 | + " \"total_rows\": len(archive_drift),\n", |
| 576 | + " \"max_gap\": int(archive_drift[\"orig_drift\"].abs().max()),\n", |
557 | 577 | " },\n", |
558 | | - " ]\n", |
559 | | - ")\n", |
560 | | - "display(artifact_summary)\n", |
561 | | - "display(\n", |
562 | | - " pd.DataFrame(\n", |
563 | | - " [\n", |
564 | | - " {\n", |
565 | | - " \"comparison\": \"Egglog vs live Haskell (original)\",\n", |
566 | | - " \"exact_matches\": int(egglog_vs_live[\"orig_exact\"].sum()),\n", |
567 | | - " \"total_rows\": len(egglog_vs_live),\n", |
568 | | - " \"max_gap\": int(egglog_vs_live[\"orig_gap\"].max()),\n", |
569 | | - " },\n", |
570 | | - " {\n", |
571 | | - " \"comparison\": \"Egglog vs live Haskell (sympy)\",\n", |
572 | | - " \"exact_matches\": int(egglog_vs_live[\"sympy_exact\"].sum()),\n", |
573 | | - " \"total_rows\": len(egglog_vs_live),\n", |
574 | | - " \"max_gap\": int(egglog_vs_live[\"sympy_gap\"].max()),\n", |
575 | | - " },\n", |
576 | | - " {\n", |
577 | | - " \"comparison\": \"Live vs archived Haskell (original)\",\n", |
578 | | - " \"exact_matches\": int((archive_drift[\"orig_drift\"] == 0).sum()),\n", |
579 | | - " \"total_rows\": len(archive_drift),\n", |
580 | | - " \"max_gap\": int(archive_drift[\"orig_drift\"].abs().max()),\n", |
581 | | - " },\n", |
582 | | - " {\n", |
583 | | - " \"comparison\": \"Live vs archived Haskell (sympy)\",\n", |
584 | | - " \"exact_matches\": int((archive_drift[\"sympy_drift\"] == 0).sum()),\n", |
585 | | - " \"total_rows\": len(archive_drift),\n", |
586 | | - " \"max_gap\": int(archive_drift[\"sympy_drift\"].abs().max()),\n", |
587 | | - " },\n", |
588 | | - " ]\n", |
589 | | - " )\n", |
| 578 | + " {\n", |
| 579 | + " \"comparison\": \"Live vs archived Haskell (sympy)\",\n", |
| 580 | + " \"exact_matches\": int((archive_drift[\"sympy_drift\"] == 0).sum()),\n", |
| 581 | + " \"total_rows\": len(archive_drift),\n", |
| 582 | + " \"max_gap\": int(archive_drift[\"sympy_drift\"].abs().max()),\n", |
| 583 | + " },\n", |
| 584 | + " ])\n", |
590 | 585 | ")\n", |
591 | 586 | "# -" |
592 | 587 | ] |
|
896 | 891 | } |
897 | 892 | ], |
898 | 893 | "source": [ |
899 | | - "show_chart(runtime_chart(runtime_compare, title=\"Pagie runtime versus expression size (Figure 9 analog) across archived Haskell, live Haskell, and Egglog\"))" |
| 894 | + "show_chart(\n", |
| 895 | + " runtime_chart(\n", |
| 896 | + " runtime_compare,\n", |
| 897 | + " title=\"Pagie runtime versus expression size (Figure 9 analog) across archived Haskell, live Haskell, and Egglog\",\n", |
| 898 | + " )\n", |
| 899 | + ")" |
900 | 900 | ] |
901 | 901 | }, |
902 | 902 | { |
|
0 commit comments