diff --git a/.gitignore b/.gitignore
index da05fd2..ba3b13f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,8 @@
*.gif
*.mp4
!reference/*.csv
+!analysis/*.csv
+
# Benchmark outputs (keep .gitkeep, ignore results)
benchmarks/*
@@ -21,3 +23,4 @@ sizes
.vscode
.DS_Store
+**__pycache__**
diff --git a/analysis/fig_exp.png b/analysis/fig_exp.png
deleted file mode 100644
index fb9c537..0000000
Binary files a/analysis/fig_exp.png and /dev/null differ
diff --git a/analysis/fig_exp.svg b/analysis/fig_exp.svg
new file mode 100644
index 0000000..2e551ba
--- /dev/null
+++ b/analysis/fig_exp.svg
@@ -0,0 +1,1000 @@
+
+
+
diff --git a/analysis/fig_ladder.png b/analysis/fig_ladder.png
deleted file mode 100644
index 49d9d19..0000000
Binary files a/analysis/fig_ladder.png and /dev/null differ
diff --git a/analysis/fig_ladder.svg b/analysis/fig_ladder.svg
new file mode 100644
index 0000000..341f161
--- /dev/null
+++ b/analysis/fig_ladder.svg
@@ -0,0 +1,1440 @@
+
+
+
diff --git a/analysis/fig_milestones.png b/analysis/fig_milestones.png
deleted file mode 100644
index 6fdff91..0000000
Binary files a/analysis/fig_milestones.png and /dev/null differ
diff --git a/analysis/fig_milestones.svg b/analysis/fig_milestones.svg
new file mode 100644
index 0000000..12e234c
--- /dev/null
+++ b/analysis/fig_milestones.svg
@@ -0,0 +1,2369 @@
+
+
+
diff --git a/analysis/fig_roofline.svg b/analysis/fig_roofline.svg
index f74690e..fe47367 100644
--- a/analysis/fig_roofline.svg
+++ b/analysis/fig_roofline.svg
@@ -6,7 +6,7 @@
- 2026-06-05T06:08:49.278850
+ 2026-06-17T10:45:24.667709
image/svg+xml
@@ -42,16 +42,16 @@ z
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
-
+
@@ -109,11 +109,11 @@ z
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -127,11 +127,11 @@ L 151.373736 50.483625
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -145,11 +145,11 @@ L 225.582514 50.483625
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -196,11 +196,11 @@ z
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -215,11 +215,11 @@ L 374.000069 50.483625
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -284,11 +284,11 @@ z
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -328,11 +328,11 @@ z
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -755,16 +755,16 @@ z
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
-
+
@@ -778,11 +778,11 @@ L -3.5 0
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -796,11 +796,11 @@ L 669.565625 246.474008
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -814,11 +814,11 @@ L 669.565625 208.263914
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -873,11 +873,11 @@ z
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -892,11 +892,11 @@ L 669.565625 131.843728
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -945,11 +945,11 @@ z
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #ededed; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -967,22 +967,22 @@ L 195.598003 73.850165
L 198.818818 71.282163
L 669.057804 71.282163
L 669.057804 71.282163
-" clip-path="url(#pa8b7964e4d)" style="fill: none; stroke: #bbbbbb; stroke-width: 1.4; stroke-linecap: square"/>
+" clip-path="url(#pf201e75209)" style="fill: none; stroke: #bbbbbb; stroke-width: 1.4; stroke-linecap: square"/>
+" clip-path="url(#pf201e75209)" style="fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #aaaaaa"/>
+" clip-path="url(#pf201e75209)" style="fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #aaaaaa"/>
+" clip-path="url(#pf201e75209)" style="fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #aaaaaa"/>
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -2279,7 +2264,7 @@ z
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/analysis/fig_speedup.svg b/analysis/fig_speedup.svg
index 7292749..7194cdc 100644
--- a/analysis/fig_speedup.svg
+++ b/analysis/fig_speedup.svg
@@ -6,7 +6,7 @@
- 2026-06-05T10:51:02.035313
+ 2026-06-17T10:45:25.506374
image/svg+xml
@@ -42,16 +42,16 @@ z
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
-
+
@@ -114,11 +114,11 @@ z
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -150,11 +150,11 @@ z
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -194,11 +194,11 @@ z
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -214,11 +214,11 @@ L 319.229339 50.413312
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -249,11 +249,11 @@ z
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -268,11 +268,11 @@ L 484.334139 50.413312
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -705,16 +705,16 @@ z
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
-
+
@@ -746,11 +746,11 @@ z
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -765,11 +765,11 @@ L 633.535625 228.753071
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -784,11 +784,11 @@ L 633.535625 166.832829
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -804,11 +804,11 @@ L 633.535625 119.991975
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke: #e9e9e9; stroke-width: 0.8; stroke-linecap: square"/>
-
+
@@ -846,16 +846,16 @@ L 633.535625 73.15112
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+" clip-path="url(#p83f650a52f)" style="fill: none; stroke-dasharray: 1.3,2.145; stroke-dashoffset: 0; stroke: #999999; stroke-width: 1.3"/>
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -2133,4851 +2026,4851 @@ z
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/analysis/fig_speedup_all.png b/analysis/fig_speedup_all.png
deleted file mode 100644
index 0c656b6..0000000
Binary files a/analysis/fig_speedup_all.png and /dev/null differ
diff --git a/analysis/fig_tracks.svg b/analysis/fig_tracks.svg
index fcf59f2..078a79e 100644
--- a/analysis/fig_tracks.svg
+++ b/analysis/fig_tracks.svg
@@ -1,12 +1,12 @@
-