diff --git a/out/figs/dyn_sub4.csv b/out/figs/dyn_sub4.csv
new file mode 100644
index 0000000..af75ca3
--- /dev/null
+++ b/out/figs/dyn_sub4.csv
@@ -0,0 +1,521 @@
+arm,seed,step,hack_s,gt_s,hack_train,solve_train,hk_dep,slv_dep
+static erasure,41,0,0.0,0.14285714285714285,0.0,0.14285714285714285,nan,nan
+static erasure,41,1,0.0,0.25,0.0,0.25,nan,nan
+static erasure,41,2,0.0,0.03571428571428571,0.0,0.03571428571428571,nan,nan
+static erasure,41,3,0.0,0.17857142857142858,0.0,0.17857142857142858,nan,nan
+static erasure,41,4,0.0,0.0,0.0,0.0,nan,nan
+static erasure,41,5,0.0,0.4642857142857143,0.0,0.4642857142857143,nan,nan
+static erasure,41,6,0.0,0.32142857142857145,0.0,0.32142857142857145,nan,nan
+static erasure,41,7,0.0,0.39285714285714285,0.0,0.39285714285714285,nan,nan
+static erasure,41,8,0.0,0.17857142857142858,0.0,0.17857142857142858,nan,nan
+static erasure,41,9,0.0,0.5,0.0,0.5,nan,nan
+static erasure,41,10,0.0,0.21428571428571427,0.0,0.21428571428571427,nan,nan
+static erasure,41,11,0.0,0.42857142857142855,0.0,0.42857142857142855,nan,nan
+static erasure,41,12,0.0,0.2857142857142857,0.0,0.2857142857142857,nan,nan
+static erasure,41,13,0.0,0.4642857142857143,0.0,0.4642857142857143,nan,nan
+static erasure,41,14,0.03571428571428571,0.42857142857142855,0.03571428571428571,0.42857142857142855,nan,nan
+static erasure,41,15,0.07142857142857142,0.6785714285714286,0.07142857142857142,0.6785714285714286,nan,nan
+static erasure,41,16,0.21428571428571427,0.25,0.21428571428571427,0.25,nan,nan
+static erasure,41,17,0.25,0.10714285714285714,0.25,0.10714285714285714,nan,nan
+static erasure,41,18,0.0,0.6428571428571429,0.0,0.6428571428571429,nan,nan
+static erasure,41,19,0.25,0.10714285714285714,0.25,0.10714285714285714,nan,nan
+static erasure,41,20,0.07142857142857142,0.5,0.07142857142857142,0.5,nan,nan
+static erasure,41,21,0.0,0.6071428571428571,0.0,0.6071428571428571,nan,nan
+static erasure,41,22,0.4642857142857143,0.25,0.4642857142857143,0.25,nan,nan
+static erasure,41,23,0.2857142857142857,0.5,0.2857142857142857,0.5,nan,nan
+static erasure,41,24,0.39285714285714285,0.21428571428571427,0.39285714285714285,0.21428571428571427,nan,nan
+static erasure,41,25,0.5,0.21428571428571427,0.5,0.21428571428571427,nan,nan
+static erasure,41,26,0.5,0.03571428571428571,0.5,0.03571428571428571,nan,nan
+static erasure,41,27,0.07142857142857142,0.6428571428571429,0.07142857142857142,0.6428571428571429,nan,nan
+static erasure,41,28,0.03571428571428571,0.21428571428571427,0.03571428571428571,0.21428571428571427,nan,nan
+static erasure,41,29,0.39285714285714285,0.5357142857142857,0.39285714285714285,0.5357142857142857,nan,nan
+static erasure,41,30,0.7857142857142857,0.0,0.7857142857142857,0.0,nan,nan
+static erasure,41,31,0.6785714285714286,0.03571428571428571,0.6785714285714286,0.03571428571428571,nan,nan
+static erasure,41,32,0.03571428571428571,0.6785714285714286,0.03571428571428571,0.6785714285714286,nan,nan
+static erasure,41,33,0.6428571428571429,0.2857142857142857,0.6428571428571429,0.2857142857142857,nan,nan
+static erasure,41,34,0.21428571428571427,0.5,0.21428571428571427,0.5,nan,nan
+static erasure,41,35,0.10714285714285714,0.4642857142857143,0.10714285714285714,0.4642857142857143,nan,nan
+static erasure,41,36,0.6071428571428571,0.17857142857142858,0.6071428571428571,0.17857142857142858,nan,nan
+static erasure,41,37,0.32142857142857145,0.25,0.32142857142857145,0.25,nan,nan
+static erasure,41,38,0.21428571428571427,0.5714285714285714,0.21428571428571427,0.5714285714285714,nan,nan
+static erasure,41,39,0.5714285714285714,0.35714285714285715,0.5714285714285714,0.35714285714285715,nan,nan
+static erasure,41,40,0.14285714285714285,0.35714285714285715,0.14285714285714285,0.35714285714285715,nan,nan
+static erasure,41,41,0.4642857142857143,0.21428571428571427,0.4642857142857143,0.21428571428571427,nan,nan
+static erasure,41,42,0.6785714285714286,0.0,0.6785714285714286,0.0,nan,nan
+static erasure,41,43,0.5,0.03571428571428571,0.5,0.03571428571428571,nan,nan
+static erasure,41,44,0.14285714285714285,0.21428571428571427,0.14285714285714285,0.21428571428571427,nan,nan
+static erasure,41,45,0.32142857142857145,0.6428571428571429,0.32142857142857145,0.6428571428571429,nan,nan
+static erasure,41,46,0.14285714285714285,0.5357142857142857,0.14285714285714285,0.5357142857142857,nan,nan
+static erasure,41,47,0.35714285714285715,0.42857142857142855,0.35714285714285715,0.42857142857142855,nan,nan
+static erasure,41,48,0.42857142857142855,0.03571428571428571,0.42857142857142855,0.03571428571428571,nan,nan
+static erasure,41,49,0.2857142857142857,0.4642857142857143,0.2857142857142857,0.4642857142857143,nan,nan
+static erasure,41,50,0.32142857142857145,0.39285714285714285,0.32142857142857145,0.39285714285714285,nan,nan
+static erasure,41,51,0.25,0.6428571428571429,0.25,0.6428571428571429,nan,nan
+static erasure,41,52,0.17857142857142858,0.25,0.17857142857142858,0.25,nan,nan
+static erasure,41,53,0.6071428571428571,0.10714285714285714,0.6071428571428571,0.10714285714285714,nan,nan
+static erasure,41,54,0.03571428571428571,0.5357142857142857,0.03571428571428571,0.5357142857142857,nan,nan
+static erasure,41,55,0.14285714285714285,0.4642857142857143,0.14285714285714285,0.4642857142857143,nan,nan
+static erasure,41,56,0.4642857142857143,0.35714285714285715,0.4642857142857143,0.35714285714285715,nan,nan
+static erasure,41,57,0.39285714285714285,0.39285714285714285,0.39285714285714285,0.39285714285714285,nan,nan
+static erasure,41,58,0.5,0.35714285714285715,0.5,0.35714285714285715,nan,nan
+static erasure,41,59,0.5,0.42857142857142855,0.5,0.42857142857142855,nan,nan
+online erasure,41,0,0.0,0.14285714285714285,0.0,0.14285714285714285,nan,nan
+online erasure,41,1,0.0,0.25,0.0,0.25,nan,nan
+online erasure,41,2,0.0,0.0,0.0,0.0,nan,nan
+online erasure,41,3,0.0,0.10714285714285714,0.0,0.10714285714285714,nan,nan
+online erasure,41,4,0.0,0.0,0.0,0.0,nan,nan
+online erasure,41,5,0.0,0.4642857142857143,0.0,0.4642857142857143,nan,nan
+online erasure,41,6,0.0,0.2857142857142857,0.0,0.2857142857142857,nan,nan
+online erasure,41,7,0.0,0.25,0.0,0.25,nan,nan
+online erasure,41,8,0.0,0.14285714285714285,0.0,0.14285714285714285,nan,nan
+online erasure,41,9,0.0,0.35714285714285715,0.0,0.35714285714285715,nan,nan
+online erasure,41,10,0.0,0.2857142857142857,0.0,0.2857142857142857,nan,nan
+online erasure,41,11,0.0,0.39285714285714285,0.0,0.39285714285714285,nan,nan
+online erasure,41,12,0.0,0.25,0.0,0.25,nan,nan
+online erasure,41,13,0.0,0.42857142857142855,0.0,0.42857142857142855,nan,nan
+online erasure,41,14,0.14285714285714285,0.39285714285714285,0.14285714285714285,0.39285714285714285,nan,nan
+online erasure,41,15,0.07142857142857142,0.6428571428571429,0.07142857142857142,0.6428571428571429,nan,nan
+online erasure,41,16,0.21428571428571427,0.35714285714285715,0.21428571428571427,0.35714285714285715,nan,nan
+online erasure,41,17,0.2857142857142857,0.17857142857142858,0.2857142857142857,0.17857142857142858,nan,nan
+online erasure,41,18,0.0,0.6071428571428571,0.0,0.6071428571428571,nan,nan
+online erasure,41,19,0.35714285714285715,0.14285714285714285,0.35714285714285715,0.14285714285714285,nan,nan
+online erasure,41,20,0.0,0.5,0.0,0.5,nan,nan
+online erasure,41,21,0.07142857142857142,0.5714285714285714,0.07142857142857142,0.5714285714285714,nan,nan
+online erasure,41,22,0.4642857142857143,0.21428571428571427,0.4642857142857143,0.21428571428571427,nan,nan
+online erasure,41,23,0.35714285714285715,0.4642857142857143,0.35714285714285715,0.4642857142857143,nan,nan
+online erasure,41,24,0.4642857142857143,0.14285714285714285,0.4642857142857143,0.14285714285714285,nan,nan
+online erasure,41,25,0.39285714285714285,0.2857142857142857,0.39285714285714285,0.2857142857142857,nan,nan
+online erasure,41,26,0.5,0.03571428571428571,0.5,0.03571428571428571,nan,nan
+online erasure,41,27,0.03571428571428571,0.6071428571428571,0.03571428571428571,0.6071428571428571,nan,nan
+online erasure,41,28,0.03571428571428571,0.17857142857142858,0.03571428571428571,0.17857142857142858,nan,nan
+online erasure,41,29,0.42857142857142855,0.4642857142857143,0.42857142857142855,0.4642857142857143,nan,nan
+online erasure,41,30,0.8214285714285714,0.0,0.8214285714285714,0.0,nan,nan
+online erasure,41,31,0.5357142857142857,0.07142857142857142,0.5357142857142857,0.07142857142857142,nan,nan
+online erasure,41,32,0.14285714285714285,0.6785714285714286,0.14285714285714285,0.6785714285714286,nan,nan
+online erasure,41,33,0.6071428571428571,0.17857142857142858,0.6071428571428571,0.17857142857142858,nan,nan
+online erasure,41,34,0.2857142857142857,0.32142857142857145,0.2857142857142857,0.32142857142857145,nan,nan
+online erasure,41,35,0.0,0.4642857142857143,0.0,0.4642857142857143,nan,nan
+online erasure,41,36,0.5357142857142857,0.2857142857142857,0.5357142857142857,0.2857142857142857,nan,nan
+online erasure,41,37,0.32142857142857145,0.21428571428571427,0.32142857142857145,0.21428571428571427,nan,nan
+online erasure,41,38,0.39285714285714285,0.5,0.39285714285714285,0.5,nan,nan
+online erasure,41,39,0.6071428571428571,0.32142857142857145,0.6071428571428571,0.32142857142857145,nan,nan
+online erasure,41,40,0.32142857142857145,0.39285714285714285,0.32142857142857145,0.39285714285714285,nan,nan
+online erasure,41,41,0.6071428571428571,0.32142857142857145,0.6071428571428571,0.32142857142857145,nan,nan
+online erasure,41,42,0.7857142857142857,0.03571428571428571,0.7857142857142857,0.03571428571428571,nan,nan
+online erasure,41,43,0.6785714285714286,0.17857142857142858,0.6785714285714286,0.17857142857142858,nan,nan
+online erasure,41,44,0.39285714285714285,0.17857142857142858,0.39285714285714285,0.17857142857142858,nan,nan
+online erasure,41,45,0.32142857142857145,0.4642857142857143,0.32142857142857145,0.4642857142857143,nan,nan
+online erasure,41,46,0.17857142857142858,0.4642857142857143,0.17857142857142858,0.4642857142857143,nan,nan
+online erasure,41,47,0.5357142857142857,0.4642857142857143,0.5357142857142857,0.4642857142857143,nan,nan
+online erasure,41,48,0.6071428571428571,0.0,0.6071428571428571,0.0,nan,nan
+online erasure,41,49,0.14285714285714285,0.6428571428571429,0.14285714285714285,0.6428571428571429,nan,nan
+online erasure,41,50,0.35714285714285715,0.42857142857142855,0.35714285714285715,0.42857142857142855,nan,nan
+online erasure,41,51,0.25,0.5357142857142857,0.25,0.5357142857142857,nan,nan
+online erasure,41,52,0.32142857142857145,0.2857142857142857,0.32142857142857145,0.2857142857142857,nan,nan
+online erasure,41,53,0.5,0.21428571428571427,0.5,0.21428571428571427,nan,nan
+online erasure,41,54,0.07142857142857142,0.75,0.07142857142857142,0.75,nan,nan
+online erasure,41,55,0.39285714285714285,0.5357142857142857,0.39285714285714285,0.5357142857142857,nan,nan
+online erasure,41,56,0.6071428571428571,0.32142857142857145,0.6071428571428571,0.32142857142857145,nan,nan
+online erasure,41,57,0.2857142857142857,0.5,0.2857142857142857,0.5,nan,nan
+online erasure,41,58,0.5714285714285714,0.25,0.5714285714285714,0.25,nan,nan
+online erasure,41,59,0.4642857142857143,0.35714285714285715,0.4642857142857143,0.35714285714285715,nan,nan
+vanilla,41,0,0.0,0.38,0.0,0.14285714285714285,0.0,0.38
+vanilla,41,1,nan,nan,0.0,0.25,nan,nan
+vanilla,41,2,nan,nan,0.0,0.0,nan,nan
+vanilla,41,3,nan,nan,0.0,0.14285714285714285,nan,nan
+vanilla,41,4,nan,nan,0.0,0.0,nan,nan
+vanilla,41,5,nan,nan,0.0,0.42857142857142855,nan,nan
+vanilla,41,6,nan,nan,0.0,0.25,nan,nan
+vanilla,41,7,nan,nan,0.0,0.10714285714285714,nan,nan
+vanilla,41,8,nan,nan,0.0,0.10714285714285714,nan,nan
+vanilla,41,9,nan,nan,0.0,0.4642857142857143,nan,nan
+vanilla,41,10,0.0,0.5,0.0,0.17857142857142858,0.0,0.5
+vanilla,41,11,nan,nan,0.0,0.4642857142857143,nan,nan
+vanilla,41,12,nan,nan,0.0,0.25,nan,nan
+vanilla,41,13,nan,nan,0.0,0.4642857142857143,nan,nan
+vanilla,41,14,nan,nan,0.0,0.5,nan,nan
+vanilla,41,15,nan,nan,0.0,0.6785714285714286,nan,nan
+vanilla,41,16,nan,nan,0.0,0.39285714285714285,nan,nan
+vanilla,41,17,nan,nan,0.0,0.21428571428571427,nan,nan
+vanilla,41,18,nan,nan,0.03571428571428571,0.6071428571428571,nan,nan
+vanilla,41,19,nan,nan,0.10714285714285714,0.14285714285714285,nan,nan
+vanilla,41,20,0.16,0.5,0.03571428571428571,0.6071428571428571,0.16,0.5
+vanilla,41,21,nan,nan,0.0,0.5714285714285714,nan,nan
+vanilla,41,22,nan,nan,0.5,0.25,nan,nan
+vanilla,41,23,nan,nan,0.21428571428571427,0.5714285714285714,nan,nan
+vanilla,41,24,nan,nan,0.32142857142857145,0.25,nan,nan
+vanilla,41,25,nan,nan,0.39285714285714285,0.2857142857142857,nan,nan
+vanilla,41,26,nan,nan,0.5714285714285714,0.0,nan,nan
+vanilla,41,27,nan,nan,0.07142857142857142,0.6428571428571429,nan,nan
+vanilla,41,28,nan,nan,0.03571428571428571,0.2857142857142857,nan,nan
+vanilla,41,29,nan,nan,0.35714285714285715,0.5357142857142857,nan,nan
+vanilla,41,30,0.31,0.45,0.8214285714285714,0.0,0.31,0.45
+vanilla,41,31,nan,nan,0.5,0.10714285714285714,nan,nan
+vanilla,41,32,nan,nan,0.21428571428571427,0.5357142857142857,nan,nan
+vanilla,41,33,nan,nan,0.75,0.14285714285714285,nan,nan
+vanilla,41,34,nan,nan,0.4642857142857143,0.39285714285714285,nan,nan
+vanilla,41,35,nan,nan,0.07142857142857142,0.42857142857142855,nan,nan
+vanilla,41,36,nan,nan,0.7857142857142857,0.10714285714285714,nan,nan
+vanilla,41,37,nan,nan,0.32142857142857145,0.2857142857142857,nan,nan
+vanilla,41,38,nan,nan,0.5357142857142857,0.2857142857142857,nan,nan
+vanilla,41,39,nan,nan,0.6071428571428571,0.2857142857142857,nan,nan
+vanilla,41,40,0.36,0.45,0.39285714285714285,0.25,0.36,0.45
+vanilla,41,41,nan,nan,0.5357142857142857,0.32142857142857145,nan,nan
+vanilla,41,42,nan,nan,0.8214285714285714,0.0,nan,nan
+vanilla,41,43,nan,nan,0.75,0.07142857142857142,nan,nan
+vanilla,41,44,nan,nan,0.4642857142857143,0.14285714285714285,nan,nan
+vanilla,41,45,nan,nan,0.35714285714285715,0.5,nan,nan
+vanilla,41,46,nan,nan,0.5714285714285714,0.32142857142857145,nan,nan
+vanilla,41,47,nan,nan,0.6428571428571429,0.17857142857142858,nan,nan
+vanilla,41,48,nan,nan,0.7142857142857143,0.03571428571428571,nan,nan
+vanilla,41,49,nan,nan,0.5357142857142857,0.39285714285714285,nan,nan
+vanilla,41,50,0.56,0.31,0.75,0.21428571428571427,0.56,0.31
+vanilla,41,51,nan,nan,0.5,0.35714285714285715,nan,nan
+vanilla,41,52,nan,nan,0.5714285714285714,0.17857142857142858,nan,nan
+vanilla,41,53,nan,nan,0.8928571428571429,0.07142857142857142,nan,nan
+vanilla,41,54,nan,nan,0.6071428571428571,0.32142857142857145,nan,nan
+vanilla,41,55,nan,nan,0.5357142857142857,0.32142857142857145,nan,nan
+vanilla,41,56,nan,nan,0.75,0.25,nan,nan
+vanilla,41,57,nan,nan,0.6785714285714286,0.2857142857142857,nan,nan
+vanilla,41,58,nan,nan,0.7857142857142857,0.14285714285714285,nan,nan
+vanilla,41,59,nan,nan,0.6428571428571429,0.2857142857142857,nan,nan
+vanilla,41,60,0.47,0.53,0.8928571428571429,0.03571428571428571,0.47,0.53
+vanilla,41,61,nan,nan,0.8928571428571429,0.03571428571428571,nan,nan
+vanilla,41,62,nan,nan,0.6785714285714286,0.21428571428571427,nan,nan
+vanilla,41,63,nan,nan,0.4642857142857143,0.42857142857142855,nan,nan
+vanilla,41,64,nan,nan,0.8571428571428571,0.07142857142857142,nan,nan
+vanilla,41,65,nan,nan,0.5714285714285714,0.35714285714285715,nan,nan
+vanilla,41,66,nan,nan,0.7857142857142857,0.10714285714285714,nan,nan
+vanilla,41,67,nan,nan,0.75,0.25,nan,nan
+vanilla,41,68,nan,nan,0.75,0.25,nan,nan
+vanilla,41,69,nan,nan,0.75,0.21428571428571427,nan,nan
+vanilla,41,70,0.56,0.42,0.6785714285714286,0.21428571428571427,0.56,0.42
+vanilla,41,71,nan,nan,0.5357142857142857,0.4642857142857143,nan,nan
+vanilla,41,72,nan,nan,0.7857142857142857,0.17857142857142858,nan,nan
+vanilla,41,73,nan,nan,0.75,0.14285714285714285,nan,nan
+vanilla,41,74,nan,nan,0.8571428571428571,0.07142857142857142,nan,nan
+vanilla,41,75,nan,nan,0.5714285714285714,0.35714285714285715,nan,nan
+vanilla,41,76,nan,nan,0.6071428571428571,0.10714285714285714,nan,nan
+vanilla,41,77,nan,nan,0.5357142857142857,0.32142857142857145,nan,nan
+vanilla,41,78,nan,nan,0.9285714285714286,0.0,nan,nan
+vanilla,41,79,nan,nan,0.8571428571428571,0.0,nan,nan
+vanilla,41,80,0.67,0.22,0.9642857142857143,0.0,0.67,0.22
+vanilla,41,81,nan,nan,0.7142857142857143,0.14285714285714285,nan,nan
+vanilla,41,82,nan,nan,0.8928571428571429,0.0,nan,nan
+vanilla,41,83,nan,nan,0.7857142857142857,0.10714285714285714,nan,nan
+vanilla,41,84,nan,nan,0.5,0.35714285714285715,nan,nan
+vanilla,41,85,nan,nan,0.8571428571428571,0.03571428571428571,nan,nan
+vanilla,41,86,nan,nan,0.9285714285714286,0.03571428571428571,nan,nan
+vanilla,41,87,nan,nan,0.75,0.17857142857142858,nan,nan
+vanilla,41,88,nan,nan,0.5357142857142857,0.10714285714285714,nan,nan
+vanilla,41,89,nan,nan,0.42857142857142855,0.03571428571428571,nan,nan
+vanilla,41,90,0.06,0.0,0.4642857142857143,0.0,0.06,0.0
+vanilla,41,91,nan,nan,0.10714285714285714,0.0,nan,nan
+vanilla,41,92,nan,nan,0.07142857142857142,0.0,nan,nan
+vanilla,41,93,nan,nan,0.0,0.0,nan,nan
+vanilla,41,94,nan,nan,0.03571428571428571,0.0,nan,nan
+vanilla,41,95,nan,nan,0.5357142857142857,0.0,nan,nan
+vanilla,41,96,nan,nan,0.07142857142857142,0.0,nan,nan
+vanilla,41,97,nan,nan,0.0,0.0,nan,nan
+vanilla,41,98,nan,nan,0.0,0.0,nan,nan
+vanilla,41,99,nan,nan,0.0,0.0,nan,nan
+vanilla,41,100,0.0,0.0,0.0,0.0,0.0,0.0
+vanilla,41,101,nan,nan,0.10714285714285714,0.0,nan,nan
+vanilla,41,102,nan,nan,0.0,0.0,nan,nan
+vanilla,41,103,nan,nan,0.25,0.0,nan,nan
+vanilla,41,104,nan,nan,0.0,0.0,nan,nan
+vanilla,41,105,nan,nan,0.14285714285714285,0.03571428571428571,nan,nan
+vanilla,41,106,nan,nan,0.0,0.0,nan,nan
+vanilla,41,107,nan,nan,0.0,0.0,nan,nan
+vanilla,41,108,nan,nan,0.0,0.0,nan,nan
+vanilla,41,109,nan,nan,0.0,0.0,nan,nan
+vanilla,41,110,0.0,0.0,0.03571428571428571,0.0,0.0,0.0
+vanilla,41,111,nan,nan,0.0,0.0,nan,nan
+vanilla,41,112,nan,nan,0.0,0.0,nan,nan
+vanilla,41,113,nan,nan,0.0,0.0,nan,nan
+vanilla,41,114,nan,nan,0.0,0.0,nan,nan
+vanilla,41,115,nan,nan,0.0,0.0,nan,nan
+vanilla,41,116,nan,nan,0.0,0.0,nan,nan
+vanilla,41,117,nan,nan,0.0,0.0,nan,nan
+vanilla,41,118,nan,nan,0.0,0.0,nan,nan
+vanilla,41,119,nan,nan,0.0,0.0,nan,nan
+vanilla,41,120,0.0,0.0,0.0,0.0,0.0,0.0
+vanilla,41,121,nan,nan,0.0,0.0,nan,nan
+vanilla,41,122,nan,nan,0.0,0.0,nan,nan
+vanilla,41,123,nan,nan,0.0,0.0,nan,nan
+vanilla,41,124,nan,nan,0.0,0.0,nan,nan
+vanilla,41,125,nan,nan,0.0,0.0,nan,nan
+vanilla,41,126,nan,nan,0.0,0.0,nan,nan
+vanilla,41,127,nan,nan,0.0,0.0,nan,nan
+vanilla,41,128,nan,nan,0.0,0.0,nan,nan
+vanilla,41,129,nan,nan,0.0,0.0,nan,nan
+vanilla,41,130,0.03,0.0,0.0,0.0,0.03,0.0
+vanilla,41,131,nan,nan,0.03571428571428571,0.0,nan,nan
+vanilla,41,132,nan,nan,0.0,0.0,nan,nan
+vanilla,41,133,nan,nan,0.21428571428571427,0.0,nan,nan
+vanilla,41,134,nan,nan,0.0,0.0,nan,nan
+vanilla,41,135,nan,nan,0.03571428571428571,0.0,nan,nan
+vanilla,41,136,nan,nan,0.0,0.0,nan,nan
+vanilla,41,137,nan,nan,0.0,0.0,nan,nan
+vanilla,41,138,nan,nan,0.10714285714285714,0.0,nan,nan
+vanilla,41,139,nan,nan,0.07142857142857142,0.0,nan,nan
+routing,41,0,0.0,0.14285714285714285,0.0,0.14285714285714285,nan,nan
+routing,41,1,0.0,0.25,0.0,0.25,nan,nan
+routing,41,2,0.0,0.0,0.0,0.0,nan,nan
+routing,41,3,0.0,0.17857142857142858,0.0,0.17857142857142858,nan,nan
+routing,41,4,0.0,0.0,0.0,0.0,nan,nan
+routing,41,5,0.0,0.39285714285714285,0.0,0.39285714285714285,nan,nan
+routing,41,6,0.0,0.39285714285714285,0.0,0.39285714285714285,nan,nan
+routing,41,7,0.14285714285714285,0.14285714285714285,0.14285714285714285,0.14285714285714285,nan,nan
+routing,41,8,0.25,0.21428571428571427,0.25,0.21428571428571427,nan,nan
+routing,41,9,0.0,0.39285714285714285,0.0,0.39285714285714285,nan,nan
+routing,41,10,0.10714285714285714,0.21428571428571427,0.10714285714285714,0.21428571428571427,nan,nan
+routing,41,11,0.2857142857142857,0.4642857142857143,0.2857142857142857,0.4642857142857143,nan,nan
+routing,41,12,0.17857142857142858,0.25,0.17857142857142858,0.25,nan,nan
+routing,41,13,0.21428571428571427,0.35714285714285715,0.21428571428571427,0.35714285714285715,nan,nan
+routing,41,14,0.35714285714285715,0.42857142857142855,0.35714285714285715,0.42857142857142855,nan,nan
+routing,41,15,0.10714285714285714,0.6071428571428571,0.10714285714285714,0.6071428571428571,nan,nan
+routing,41,16,0.5,0.17857142857142858,0.5,0.17857142857142858,nan,nan
+routing,41,17,0.39285714285714285,0.14285714285714285,0.39285714285714285,0.14285714285714285,nan,nan
+routing,41,18,0.0,0.6071428571428571,0.0,0.6071428571428571,nan,nan
+routing,41,19,0.32142857142857145,0.14285714285714285,0.32142857142857145,0.14285714285714285,nan,nan
+routing,41,20,0.03571428571428571,0.5357142857142857,0.03571428571428571,0.5357142857142857,nan,nan
+routing,41,21,0.14285714285714285,0.5,0.14285714285714285,0.5,nan,nan
+routing,41,22,0.6071428571428571,0.25,0.6071428571428571,0.25,nan,nan
+routing,41,23,0.39285714285714285,0.4642857142857143,0.39285714285714285,0.4642857142857143,nan,nan
+routing,41,24,0.39285714285714285,0.17857142857142858,0.39285714285714285,0.17857142857142858,nan,nan
+routing,41,25,0.42857142857142855,0.25,0.42857142857142855,0.25,nan,nan
+routing,41,26,0.5,0.0,0.5,0.0,nan,nan
+routing,41,27,0.25,0.42857142857142855,0.25,0.42857142857142855,nan,nan
+routing,41,28,0.03571428571428571,0.21428571428571427,0.03571428571428571,0.21428571428571427,nan,nan
+routing,41,29,0.35714285714285715,0.5357142857142857,0.35714285714285715,0.5357142857142857,nan,nan
+routing,41,30,0.75,0.0,0.75,0.0,nan,nan
+routing,41,31,0.5714285714285714,0.0,0.5714285714285714,0.0,nan,nan
+routing,41,32,0.14285714285714285,0.35714285714285715,0.14285714285714285,0.35714285714285715,nan,nan
+routing,41,33,0.6071428571428571,0.07142857142857142,0.6071428571428571,0.07142857142857142,nan,nan
+routing,41,34,0.32142857142857145,0.2857142857142857,0.32142857142857145,0.2857142857142857,nan,nan
+routing,41,35,0.17857142857142858,0.39285714285714285,0.17857142857142858,0.39285714285714285,nan,nan
+routing,41,36,0.6428571428571429,0.10714285714285714,0.6428571428571429,0.10714285714285714,nan,nan
+routing,41,37,0.17857142857142858,0.14285714285714285,0.17857142857142858,0.14285714285714285,nan,nan
+routing,41,38,0.42857142857142855,0.21428571428571427,0.42857142857142855,0.21428571428571427,nan,nan
+routing,41,39,0.6071428571428571,0.25,0.6071428571428571,0.25,nan,nan
+routing,41,40,0.4642857142857143,0.25,0.4642857142857143,0.25,nan,nan
+routing,41,41,0.5714285714285714,0.14285714285714285,0.5714285714285714,0.14285714285714285,nan,nan
+routing,41,42,0.8214285714285714,0.0,0.8214285714285714,0.0,nan,nan
+routing,41,43,0.5,0.0,0.5,0.0,nan,nan
+routing,41,44,0.6071428571428571,0.03571428571428571,0.6071428571428571,0.03571428571428571,nan,nan
+routing,41,45,0.5,0.14285714285714285,0.5,0.14285714285714285,nan,nan
+routing,41,46,0.5,0.32142857142857145,0.5,0.32142857142857145,nan,nan
+routing,41,47,0.5357142857142857,0.2857142857142857,0.5357142857142857,0.2857142857142857,nan,nan
+routing,41,48,0.7142857142857143,0.0,0.7142857142857143,0.0,nan,nan
+routing,41,49,0.35714285714285715,0.32142857142857145,0.35714285714285715,0.32142857142857145,nan,nan
+routing,41,50,0.5357142857142857,0.14285714285714285,0.5357142857142857,0.14285714285714285,nan,nan
+routing,41,51,0.35714285714285715,0.39285714285714285,0.35714285714285715,0.39285714285714285,nan,nan
+routing,41,52,0.42857142857142855,0.14285714285714285,0.42857142857142855,0.14285714285714285,nan,nan
+routing,41,53,0.4642857142857143,0.14285714285714285,0.4642857142857143,0.14285714285714285,nan,nan
+routing,41,54,0.21428571428571427,0.42857142857142855,0.21428571428571427,0.42857142857142855,nan,nan
+routing,41,55,0.42857142857142855,0.21428571428571427,0.42857142857142855,0.21428571428571427,nan,nan
+routing,41,56,0.5714285714285714,0.21428571428571427,0.5714285714285714,0.21428571428571427,nan,nan
+routing,41,57,0.5357142857142857,0.2857142857142857,0.5357142857142857,0.2857142857142857,nan,nan
+routing,41,58,0.42857142857142855,0.14285714285714285,0.42857142857142855,0.14285714285714285,nan,nan
+routing,41,59,0.5357142857142857,0.21428571428571427,0.5357142857142857,0.21428571428571427,nan,nan
+routing2,41,0,0.0,0.38,0.0,0.14285714285714285,0.0,0.38
+routing2,41,1,nan,nan,0.0,0.21428571428571427,nan,nan
+routing2,41,2,nan,nan,0.0,0.0,nan,nan
+routing2,41,3,nan,nan,0.0,0.17857142857142858,nan,nan
+routing2,41,4,nan,nan,0.0,0.0,nan,nan
+routing2,41,5,nan,nan,0.0,0.4642857142857143,nan,nan
+routing2,41,6,nan,nan,0.0,0.25,nan,nan
+routing2,41,7,nan,nan,0.0,0.07142857142857142,nan,nan
+routing2,41,8,nan,nan,0.0,0.25,nan,nan
+routing2,41,9,nan,nan,0.0,0.4642857142857143,nan,nan
+routing2,41,10,0.0,0.45,0.0,0.32142857142857145,0.0,0.45
+routing2,41,11,nan,nan,0.0,0.4642857142857143,nan,nan
+routing2,41,12,nan,nan,0.0,0.25,nan,nan
+routing2,41,13,nan,nan,0.0,0.39285714285714285,nan,nan
+routing2,41,14,nan,nan,0.0,0.5714285714285714,nan,nan
+routing2,41,15,nan,nan,0.07142857142857142,0.75,nan,nan
+routing2,41,16,nan,nan,0.2857142857142857,0.39285714285714285,nan,nan
+routing2,41,17,nan,nan,0.21428571428571427,0.21428571428571427,nan,nan
+routing2,41,18,nan,nan,0.0,0.5357142857142857,nan,nan
+routing2,41,19,nan,nan,0.32142857142857145,0.14285714285714285,nan,nan
+routing2,41,20,0.0,0.62,0.0,0.5357142857142857,0.0,0.62
+routing2,41,21,nan,nan,0.0,0.6428571428571429,nan,nan
+routing2,41,22,nan,nan,0.5,0.25,nan,nan
+routing2,41,23,nan,nan,0.32142857142857145,0.4642857142857143,nan,nan
+routing2,41,24,nan,nan,0.21428571428571427,0.2857142857142857,nan,nan
+routing2,41,25,nan,nan,0.42857142857142855,0.25,nan,nan
+routing2,41,26,nan,nan,0.5,0.03571428571428571,nan,nan
+routing2,41,27,nan,nan,0.17857142857142858,0.5714285714285714,nan,nan
+routing2,41,28,nan,nan,0.10714285714285714,0.17857142857142858,nan,nan
+routing2,41,29,nan,nan,0.35714285714285715,0.4642857142857143,nan,nan
+routing2,41,30,0.0,0.62,0.75,0.0,0.0,0.62
+routing2,41,31,nan,nan,0.75,0.10714285714285714,nan,nan
+routing2,41,32,nan,nan,0.21428571428571427,0.5714285714285714,nan,nan
+routing2,41,33,nan,nan,0.75,0.17857142857142858,nan,nan
+routing2,41,34,nan,nan,0.4642857142857143,0.21428571428571427,nan,nan
+routing2,41,35,nan,nan,0.17857142857142858,0.4642857142857143,nan,nan
+routing2,41,36,nan,nan,0.6428571428571429,0.10714285714285714,nan,nan
+routing2,41,37,nan,nan,0.35714285714285715,0.42857142857142855,nan,nan
+routing2,41,38,nan,nan,0.32142857142857145,0.4642857142857143,nan,nan
+routing2,41,39,nan,nan,0.6071428571428571,0.35714285714285715,nan,nan
+routing2,41,40,0.0,0.61,0.6785714285714286,0.32142857142857145,0.0,0.61
+routing2,41,41,nan,nan,0.6428571428571429,0.25,nan,nan
+routing2,41,42,nan,nan,0.75,0.14285714285714285,nan,nan
+routing2,41,43,nan,nan,0.7857142857142857,0.10714285714285714,nan,nan
+routing2,41,44,nan,nan,0.6785714285714286,0.21428571428571427,nan,nan
+routing2,41,45,nan,nan,0.39285714285714285,0.5357142857142857,nan,nan
+routing2,41,46,nan,nan,0.5357142857142857,0.4642857142857143,nan,nan
+routing2,41,47,nan,nan,0.4642857142857143,0.5,nan,nan
+routing2,41,48,nan,nan,0.8571428571428571,0.07142857142857142,nan,nan
+routing2,41,49,nan,nan,0.2857142857142857,0.6785714285714286,nan,nan
+routing2,41,50,0.0,0.62,0.5,0.42857142857142855,0.0,0.62
+routing2,41,51,nan,nan,0.4642857142857143,0.5357142857142857,nan,nan
+routing2,41,52,nan,nan,0.6428571428571429,0.32142857142857145,nan,nan
+routing2,41,53,nan,nan,0.8571428571428571,0.07142857142857142,nan,nan
+routing2,41,54,nan,nan,0.39285714285714285,0.4642857142857143,nan,nan
+routing2,41,55,nan,nan,0.5,0.42857142857142855,nan,nan
+routing2,41,56,nan,nan,0.7142857142857143,0.2857142857142857,nan,nan
+routing2,41,57,nan,nan,0.39285714285714285,0.5714285714285714,nan,nan
+routing2,41,58,nan,nan,0.6785714285714286,0.32142857142857145,nan,nan
+routing2,41,59,nan,nan,0.5714285714285714,0.39285714285714285,nan,nan
+routing2,41,60,0.0,0.62,0.75,0.14285714285714285,0.0,0.62
+routing2,41,61,nan,nan,0.7857142857142857,0.21428571428571427,nan,nan
+routing2,41,62,nan,nan,0.32142857142857145,0.6428571428571429,nan,nan
+routing2,41,63,nan,nan,0.2857142857142857,0.5714285714285714,nan,nan
+routing2,41,64,nan,nan,0.7857142857142857,0.21428571428571427,nan,nan
+routing2,41,65,nan,nan,0.6785714285714286,0.32142857142857145,nan,nan
+routing2,41,66,nan,nan,0.75,0.21428571428571427,nan,nan
+routing2,41,67,nan,nan,0.6428571428571429,0.2857142857142857,nan,nan
+routing2,41,68,nan,nan,0.7857142857142857,0.14285714285714285,nan,nan
+routing2,41,69,nan,nan,0.75,0.25,nan,nan
+routing2,41,70,0.0,0.62,0.6071428571428571,0.35714285714285715,0.0,0.62
+routing2,41,71,nan,nan,0.6428571428571429,0.35714285714285715,nan,nan
+routing2,41,72,nan,nan,0.7142857142857143,0.25,nan,nan
+routing2,41,73,nan,nan,0.7857142857142857,0.21428571428571427,nan,nan
+routing2,41,74,nan,nan,0.9285714285714286,0.03571428571428571,nan,nan
+routing2,41,75,nan,nan,0.21428571428571427,0.75,nan,nan
+routing2,41,76,nan,nan,0.8214285714285714,0.14285714285714285,nan,nan
+routing2,41,77,nan,nan,0.5357142857142857,0.39285714285714285,nan,nan
+routing2,41,78,nan,nan,0.75,0.21428571428571427,nan,nan
+routing2,41,79,nan,nan,0.5714285714285714,0.42857142857142855,nan,nan
+routing2,41,80,0.0,0.59,0.8214285714285714,0.14285714285714285,0.0,0.59
+routing2,41,81,nan,nan,0.35714285714285715,0.6071428571428571,nan,nan
+routing2,41,82,nan,nan,1.0,0.0,nan,nan
+routing2,41,83,nan,nan,0.6071428571428571,0.32142857142857145,nan,nan
+routing2,41,84,nan,nan,0.10714285714285714,0.8928571428571429,nan,nan
+routing2,41,85,nan,nan,0.7857142857142857,0.17857142857142858,nan,nan
+routing2,41,86,nan,nan,0.8214285714285714,0.14285714285714285,nan,nan
+routing2,41,87,nan,nan,0.14285714285714285,0.8571428571428571,nan,nan
+routing2,41,88,nan,nan,0.32142857142857145,0.6785714285714286,nan,nan
+routing2,41,89,nan,nan,0.6071428571428571,0.35714285714285715,nan,nan
+routing2,41,90,0.0,0.62,0.5357142857142857,0.4642857142857143,0.0,0.62
+routing2,41,91,nan,nan,0.42857142857142855,0.5357142857142857,nan,nan
+routing2,41,92,nan,nan,0.35714285714285715,0.6428571428571429,nan,nan
+routing2,41,93,nan,nan,0.5357142857142857,0.4642857142857143,nan,nan
+routing2,41,94,nan,nan,0.75,0.25,nan,nan
+routing2,41,95,nan,nan,0.5714285714285714,0.39285714285714285,nan,nan
+routing2,41,96,nan,nan,0.75,0.25,nan,nan
+routing2,41,97,nan,nan,0.5,0.5,nan,nan
+routing2,41,98,nan,nan,0.8214285714285714,0.17857142857142858,nan,nan
+routing2,41,99,nan,nan,0.42857142857142855,0.5714285714285714,nan,nan
+routing2,41,100,0.0,0.62,0.6071428571428571,0.39285714285714285,0.0,0.62
+routing2,41,101,nan,nan,0.21428571428571427,0.7142857142857143,nan,nan
+routing2,41,102,nan,nan,0.5714285714285714,0.42857142857142855,nan,nan
+routing2,41,103,nan,nan,1.0,0.0,nan,nan
+routing2,41,104,nan,nan,0.39285714285714285,0.5714285714285714,nan,nan
+routing2,41,105,nan,nan,0.6428571428571429,0.32142857142857145,nan,nan
+routing2,41,106,nan,nan,0.8214285714285714,0.17857142857142858,nan,nan
+routing2,41,107,nan,nan,0.6071428571428571,0.39285714285714285,nan,nan
+routing2,41,108,nan,nan,0.7142857142857143,0.2857142857142857,nan,nan
+routing2,41,109,nan,nan,0.8571428571428571,0.14285714285714285,nan,nan
+routing2,41,110,0.0,0.62,0.4642857142857143,0.5357142857142857,0.0,0.62
+routing2,41,111,nan,nan,0.4642857142857143,0.4642857142857143,nan,nan
+routing2,41,112,nan,nan,0.2857142857142857,0.7142857142857143,nan,nan
+routing2,41,113,nan,nan,0.75,0.25,nan,nan
+routing2,41,114,nan,nan,0.4642857142857143,0.5357142857142857,nan,nan
+routing2,41,115,nan,nan,0.7857142857142857,0.21428571428571427,nan,nan
+routing2,41,116,nan,nan,0.6428571428571429,0.35714285714285715,nan,nan
+routing2,41,117,nan,nan,0.5714285714285714,0.42857142857142855,nan,nan
+routing2,41,118,nan,nan,0.2857142857142857,0.6785714285714286,nan,nan
+routing2,41,119,nan,nan,0.5,0.5,nan,nan
+routing2,41,120,0.0,0.62,0.8214285714285714,0.17857142857142858,0.0,0.62
+routing2,41,121,nan,nan,0.75,0.21428571428571427,nan,nan
+routing2,41,122,nan,nan,0.39285714285714285,0.6071428571428571,nan,nan
+routing2,41,123,nan,nan,0.75,0.21428571428571427,nan,nan
+routing2,41,124,nan,nan,0.32142857142857145,0.6785714285714286,nan,nan
+routing2,41,125,nan,nan,0.75,0.25,nan,nan
+routing2,41,126,nan,nan,0.75,0.25,nan,nan
+routing2,41,127,nan,nan,0.4642857142857143,0.5357142857142857,nan,nan
+routing2,41,128,nan,nan,0.6428571428571429,0.35714285714285715,nan,nan
+routing2,41,129,nan,nan,0.6785714285714286,0.32142857142857145,nan,nan
+routing2,41,130,0.0,0.62,0.7142857142857143,0.2857142857142857,0.0,0.62
+routing2,41,131,nan,nan,0.32142857142857145,0.6785714285714286,nan,nan
+routing2,41,132,nan,nan,0.25,0.7142857142857143,nan,nan
+routing2,41,133,nan,nan,0.5357142857142857,0.42857142857142855,nan,nan
+routing2,41,134,nan,nan,0.2857142857142857,0.7142857142857143,nan,nan
+routing2,41,135,nan,nan,0.5357142857142857,0.4642857142857143,nan,nan
+routing2,41,136,nan,nan,0.5357142857142857,0.4642857142857143,nan,nan
+routing2,41,137,nan,nan,0.4642857142857143,0.5,nan,nan
+routing2,41,138,nan,nan,0.5714285714285714,0.42857142857142855,nan,nan
+routing2,41,139,nan,nan,0.39285714285714285,0.6071428571428571,nan,nan
+routing2,41,140,0.0,0.62,0.75,0.25,0.0,0.62
+routing2,41,141,nan,nan,0.75,0.21428571428571427,nan,nan
+routing2,41,142,nan,nan,0.75,0.25,nan,nan
+routing2,41,143,nan,nan,0.5714285714285714,0.35714285714285715,nan,nan
+routing2,41,144,nan,nan,0.6428571428571429,0.35714285714285715,nan,nan
+routing2,41,145,nan,nan,0.5714285714285714,0.42857142857142855,nan,nan
+routing2,41,146,nan,nan,0.6785714285714286,0.32142857142857145,nan,nan
+routing2,41,147,nan,nan,0.6071428571428571,0.39285714285714285,nan,nan
+routing2,41,148,nan,nan,0.5714285714285714,0.35714285714285715,nan,nan
+routing2,41,149,nan,nan,0.5,0.5,nan,nan
+routing2,41,150,0.0,0.62,0.75,0.25,0.0,0.62
+routing2,41,151,nan,nan,0.39285714285714285,0.6071428571428571,nan,nan
+routing2,41,152,nan,nan,0.5714285714285714,0.42857142857142855,nan,nan
+routing2,41,153,nan,nan,0.39285714285714285,0.6071428571428571,nan,nan
+routing2,41,154,nan,nan,0.6785714285714286,0.32142857142857145,nan,nan
+routing2,41,155,nan,nan,0.9285714285714286,0.07142857142857142,nan,nan
+routing2,41,156,nan,nan,0.2857142857142857,0.7142857142857143,nan,nan
+routing2,41,157,nan,nan,0.8214285714285714,0.17857142857142858,nan,nan
+routing2,41,158,nan,nan,0.4642857142857143,0.5,nan,nan
+routing2,41,159,nan,nan,0.32142857142857145,0.6785714285714286,nan,nan
+routing2,41,160,0.0,0.62,0.21428571428571427,0.75,0.0,0.62
+routing2,41,161,nan,nan,0.75,0.25,nan,nan
+routing2,41,162,nan,nan,0.75,0.25,nan,nan
+routing2,41,163,nan,nan,0.9285714285714286,0.03571428571428571,nan,nan
+routing2,41,164,nan,nan,0.4642857142857143,0.5357142857142857,nan,nan
+routing2,41,165,nan,nan,0.6785714285714286,0.32142857142857145,nan,nan
+routing2,41,166,nan,nan,0.7142857142857143,0.25,nan,nan
+routing2,41,167,nan,nan,0.6785714285714286,0.32142857142857145,nan,nan
+routing2,41,168,nan,nan,0.6071428571428571,0.39285714285714285,nan,nan
+routing2,41,169,nan,nan,0.5714285714285714,0.42857142857142855,nan,nan
+routing2,41,170,0.0,0.62,0.7142857142857143,0.25,0.0,0.62
+routing2,41,171,nan,nan,0.8571428571428571,0.14285714285714285,nan,nan
+routing2,41,172,nan,nan,0.6785714285714286,0.2857142857142857,nan,nan
+routing2,41,173,nan,nan,0.75,0.25,nan,nan
+routing2,41,174,nan,nan,0.8928571428571429,0.10714285714285714,nan,nan
+routing2,41,175,nan,nan,0.6428571428571429,0.32142857142857145,nan,nan
+routing2,41,176,nan,nan,0.6071428571428571,0.39285714285714285,nan,nan
+routing2,41,177,nan,nan,0.6428571428571429,0.35714285714285715,nan,nan
+routing2,41,178,nan,nan,0.6785714285714286,0.32142857142857145,nan,nan
+routing2,41,179,nan,nan,0.7142857142857143,0.25,nan,nan
+routing2,41,180,0.0,0.62,0.42857142857142855,0.5714285714285714,0.0,0.62
+routing2,41,181,nan,nan,0.8571428571428571,0.14285714285714285,nan,nan
+routing2,41,182,nan,nan,0.32142857142857145,0.6785714285714286,nan,nan
+routing2,41,183,nan,nan,0.35714285714285715,0.6071428571428571,nan,nan
+routing2,41,184,nan,nan,0.6071428571428571,0.39285714285714285,nan,nan
+routing2,41,185,nan,nan,0.7857142857142857,0.21428571428571427,nan,nan
+routing2,41,186,nan,nan,0.8214285714285714,0.17857142857142858,nan,nan
+routing2,41,187,nan,nan,0.9642857142857143,0.0,nan,nan
+routing2,41,188,nan,nan,0.8928571428571429,0.10714285714285714,nan,nan
+routing2,41,189,nan,nan,0.35714285714285715,0.6428571428571429,nan,nan
+routing2,41,190,0.0,0.62,0.6428571428571429,0.35714285714285715,0.0,0.62
+routing2,41,191,nan,nan,0.75,0.25,nan,nan
+routing2,41,192,nan,nan,0.6428571428571429,0.35714285714285715,nan,nan
+routing2,41,193,nan,nan,0.8571428571428571,0.14285714285714285,nan,nan
+routing2,41,194,nan,nan,0.8571428571428571,0.14285714285714285,nan,nan
+routing2,41,195,nan,nan,0.9285714285714286,0.07142857142857142,nan,nan
+routing2,41,196,nan,nan,0.8214285714285714,0.17857142857142858,nan,nan
+routing2,41,197,nan,nan,0.5,0.5,nan,nan
+routing2,41,198,nan,nan,0.32142857142857145,0.6785714285714286,nan,nan
+routing2,41,199,0.0,0.61,0.32142857142857145,0.6428571428571429,0.0,0.61
diff --git a/out/figs/dyn_sub4.pdf b/out/figs/dyn_sub4.pdf
new file mode 100644
index 0000000..c69b177
Binary files /dev/null and b/out/figs/dyn_sub4.pdf differ
diff --git a/out/figs/dyn_sub4.png b/out/figs/dyn_sub4.png
index 34a3359..1dcb573 100644
Binary files a/out/figs/dyn_sub4.png and b/out/figs/dyn_sub4.png differ
diff --git a/out/figs/dyn_sub4.svg b/out/figs/dyn_sub4.svg
new file mode 100644
index 0000000..2763b8a
--- /dev/null
+++ b/out/figs/dyn_sub4.svg
@@ -0,0 +1,2342 @@
+
+
+
diff --git a/out/figs/dyn_sub4_hack_overlay.pdf b/out/figs/dyn_sub4_hack_overlay.pdf
new file mode 100644
index 0000000..bd09505
Binary files /dev/null and b/out/figs/dyn_sub4_hack_overlay.pdf differ
diff --git a/out/figs/dyn_sub4_hack_overlay.png b/out/figs/dyn_sub4_hack_overlay.png
index cb4913a..a26be24 100644
Binary files a/out/figs/dyn_sub4_hack_overlay.png and b/out/figs/dyn_sub4_hack_overlay.png differ
diff --git a/out/figs/dyn_sub4_hack_overlay.svg b/out/figs/dyn_sub4_hack_overlay.svg
new file mode 100644
index 0000000..6133d83
--- /dev/null
+++ b/out/figs/dyn_sub4_hack_overlay.svg
@@ -0,0 +1,1916 @@
+
+
+
diff --git a/out/figs/dyn_sub4_train_deploy.pdf b/out/figs/dyn_sub4_train_deploy.pdf
new file mode 100644
index 0000000..a3cfd6a
Binary files /dev/null and b/out/figs/dyn_sub4_train_deploy.pdf differ
diff --git a/out/figs/dyn_sub4_train_deploy.png b/out/figs/dyn_sub4_train_deploy.png
new file mode 100644
index 0000000..26c2439
Binary files /dev/null and b/out/figs/dyn_sub4_train_deploy.png differ
diff --git a/out/figs/dyn_sub4_train_deploy.svg b/out/figs/dyn_sub4_train_deploy.svg
new file mode 100644
index 0000000..d7792d2
--- /dev/null
+++ b/out/figs/dyn_sub4_train_deploy.svg
@@ -0,0 +1,3922 @@
+
+
+
diff --git a/scripts/plot_deploy_overlay.py b/scripts/plot_deploy_overlay.py
index 096e053..eb47cf6 100644
--- a/scripts/plot_deploy_overlay.py
+++ b/scripts/plot_deploy_overlay.py
@@ -27,13 +27,18 @@ import matplotlib.pyplot as plt
import numpy as np
from loguru import logger
+from projected_grpo.figs import save_fig
+
# arm -> (display label, colour). Order = legend/bar order (baseline first).
+# Reader-facing names only -- "route2"/"grad" are internal tags. The grad-mask
+# routing arm is the one we report, so it is plain "route"; the failed
+# activation-mask variant is disambiguated, not version-numbered.
ARM = {
- "vanilla": ("vanilla", "#444444"),
- "projected": ("erase", "#c1432b"),
- "routing": ("route", "#33508c"),
- "routing2_act": ("route2 act", "#2f7d4f"),
- "routing2_grad":("route2 grad", "#b8860b"),
+ "vanilla": ("vanilla", "#444444"),
+ "projected": ("erase", "#c1432b"),
+ "routing": ("route (v1)", "#33508c"),
+ "routing2_act": ("route (act-mask)", "#2f7d4f"),
+ "routing2_grad":("route", "#b8860b"),
}
# mode display order: in-dist first, then held-out.
MODE_ORDER = ["run_tests", "file_marker", "stdout_marker", "sentinel", "eq_override"]
@@ -79,6 +84,8 @@ def main() -> None:
ap.add_argument("jsons", nargs="*", type=Path,
help="per_mode_deploy.json paths; default globs out/runs/*sub4*/")
ap.add_argument("--out", type=Path, default=Path("out/figs/deploy_overlay.png"))
+ ap.add_argument("--title", action="store_true",
+ help="draw the suptitle (off by default: the caption carries it)")
args = ap.parse_args()
paths = args.jsons or sorted(Path("out/runs").glob("*sub4*/per_mode_deploy.json"))
@@ -97,12 +104,12 @@ def main() -> None:
_panel(a2, records, modes, arms, "deploy_solve",
"DEPLOY solve rate by mode (higher = better)", "deploy solve rate")
a1.legend(fontsize=8, frameon=False, loc="upper right")
- n_seed = {r.get("seed") for r in records}
- fig.suptitle(f"Per-mode deploy overlay ({len(arms)} arms, seed {sorted(n_seed)}) -- "
- f"quarantine deleted = shipped model", fontsize=11)
- args.out.parent.mkdir(parents=True, exist_ok=True)
+ if args.title:
+ n_seed = {r.get("seed") for r in records}
+ fig.suptitle(f"Per-mode deploy overlay ({len(arms)} arms, seed {sorted(n_seed)}) -- "
+ f"quarantine deleted = shipped model", fontsize=11)
fig.tight_layout()
- fig.savefig(args.out, dpi=140, bbox_inches="tight")
+ save_fig(fig, args.out)
logger.info(f"wrote {args.out} ({len(arms)} arms x {len(modes)} modes)")
diff --git a/scripts/plot_dynamics.py b/scripts/plot_dynamics.py
index daea860..8deef87 100644
--- a/scripts/plot_dynamics.py
+++ b/scripts/plot_dynamics.py
@@ -42,7 +42,11 @@ import matplotlib.pyplot as plt
import numpy as np
from loguru import logger
-from projected_grpo.figs import link_latest
+from projected_grpo.figs import link_latest, save_fig, arm_label
+
+# Figures are captioned in the paper/blog, so the suptitle just restates the
+# caption. Off by default; --title re-enables it for standalone research use.
+SHOW_TITLE = False
# --- parse -----------------------------------------------------------------
@@ -148,6 +152,8 @@ def parse_log(path: Path) -> dict | None:
def classify(run: dict) -> str:
+ if "arm_csv" in run: # reconstructed from a CSV: name is already classified
+ return run["arm_csv"]
if run["arm"] == "vanilla":
return "vanilla"
if run["arm"] == "routing":
@@ -236,24 +242,51 @@ def _series_panel(ax, runs, cols, colors, ylim, label_series=False):
ax.set_ylim(*ylim)
+# Every series any of the three figures plots. Carried in the CSV so the figure
+# regenerates from the committed CSV alone (logs/ and out/runs/ are gitignored,
+# out/figs/*.csv is tracked). `arm` is the CLASSIFIED display name -- load_csv
+# short-circuits classify() on it so the round-trip is exact.
+CSV_SERIES = ["hack_s", "gt_s", "hack_train", "solve_train", "hk_dep", "slv_dep"]
+
+
def dump_data(runs: list[dict], out: Path) -> Path:
- """Write the plotted series to a tidy CSV next to the figure so the figure is
- reproducible from a committed artifact -- logs/ and out/runs/ are gitignored,
- this CSV is not (it lands in out/figs/, which is tracked)."""
csv = out.with_suffix(".csv")
- lines = ["arm,seed,step,hack,solve"]
+ lines = ["arm,seed,step," + ",".join(CSV_SERIES)]
for r in runs:
arm = classify(r)
- hk = r.get("hack_s"); sv = r.get("gt_s")
for i, step in enumerate(r["steps"]):
- h = hk[i] if hk is not None and i < len(hk) else float("nan")
- s = sv[i] if sv is not None and i < len(sv) else float("nan")
- lines.append(f"{arm},{r['seed']},{int(step)},{h},{s}")
+ cells = [r[k][i] if (k in r and r[k] is not None and i < len(r[k])) else float("nan")
+ for k in CSV_SERIES]
+ lines.append(f"{arm},{r['seed']},{int(step)}," + ",".join(str(c) for c in cells))
csv.write_text("\n".join(lines) + "\n")
logger.info(f"wrote {csv} ({len(runs)} runs, reproducibility source)")
return csv
+def load_csv(path: Path) -> list[dict]:
+ """Reconstruct the runs list from a dump_data CSV so figures regenerate
+ without the raw logs. Groups rows by (arm, seed); `arm_csv` makes classify()
+ return the stored display name verbatim."""
+ rows = [l.split(",") for l in path.read_text().splitlines() if l.strip()]
+ hdr, body = rows[0], rows[1:]
+ ci = {n: i for i, n in enumerate(hdr)}
+ by_key: dict[tuple, dict] = {}
+ for row in body:
+ key = (row[ci["arm"]], row[ci["seed"]])
+ run = by_key.setdefault(key, {"arm_csv": row[ci["arm"]], "seed": row[ci["seed"]],
+ "refr": 0, "vhack": "-", "teacher_off": None,
+ "steps": [], **{k: [] for k in CSV_SERIES}})
+ run["steps"].append(int(row[ci["step"]]))
+ for k in CSV_SERIES:
+ run[k].append(float(row[ci[k]]))
+ runs = list(by_key.values())
+ for run in runs: # match parse_log: numeric series are ndarrays, not lists
+ run["steps"] = np.array(run["steps"])
+ for k in CSV_SERIES:
+ run[k] = np.array(run[k], dtype=float)
+ return runs
+
+
def plot(runs: list[dict], out: Path) -> None:
by_arm: dict[str, list[dict]] = defaultdict(list)
for r in runs:
@@ -269,7 +302,7 @@ def plot(runs: list[dict], out: Path) -> None:
ax = axes[0][col]
rs = by_arm[arm]
n_seed = len({r["seed"] for r in rs})
- ax.set_title(f"{arm}\n(n={n_seed} seed{'s' if n_seed > 1 else ''})", fontsize=9)
+ ax.set_title(f"{arm_label(arm)}\n(n={n_seed} seed{'s' if n_seed > 1 else ''})", fontsize=9)
# ylim floor slightly below 0 so a pinned-at-zero series (route2 hack) draws
# ABOVE the axis line instead of hiding under it -- the whole result is that
# red sits on zero, so it must be visible, not absent.
@@ -296,12 +329,14 @@ def plot(runs: list[dict], out: Path) -> None:
ax.spines["right"].set_visible(False)
ax.tick_params(labelsize=8)
- fig.suptitle("Training dynamics: deployed hack vs solve by arm "
- "(deploy-eval n=64 T=0.7; EMA-5; dashed = mean hack onset)", fontsize=10)
- fig.tight_layout(rect=(0, 0, 1, 0.96))
- out.parent.mkdir(parents=True, exist_ok=True)
- fig.savefig(out, dpi=150, bbox_inches="tight")
- logger.info(f"wrote {out} ({len(runs)} runs, arms={arms})")
+ if SHOW_TITLE:
+ fig.suptitle("Training dynamics: deployed hack vs solve by arm "
+ "(deploy-eval n=64 T=0.7; EMA-5; dashed = mean hack onset)", fontsize=10)
+ fig.tight_layout(rect=(0, 0, 1, 0.96))
+ else:
+ fig.tight_layout()
+ save_fig(fig, out)
+ logger.info(f"wrote {out} ({len(runs)} runs, arms={[arm_label(a) for a in arms]})")
def _overlay_panel(ax, by_arm, arms, key, *, label, with_onset):
@@ -344,7 +379,7 @@ def _overlay_panel(ax, by_arm, arms, key, *, label, with_onset):
y_lab = y if not placed else max(y, placed[-1] + gap)
placed.append(y_lab)
arrow = dict(arrowstyle="-", color=color, lw=0.5, shrinkA=0, shrinkB=0)
- ax.annotate(arm, xy=(x, y), xytext=(x + 1.0, y_lab), textcoords="data",
+ ax.annotate(arm_label(arm), xy=(x, y), xytext=(x + 1.0, y_lab), textcoords="data",
color=color, fontsize=8, va="center",
arrowprops=arrow if abs(y_lab - y) > 1e-3 else None)
@@ -362,33 +397,34 @@ def plot_hack_overlay(runs: list[dict], out: Path) -> None:
_overlay_panel(ax_h, by_arm, arms, "hack_s", label="hack rate", with_onset=True)
_overlay_panel(ax_s, by_arm, arms, "gt_s", label="solve rate", with_onset=False)
ax_s.set_xlabel("optimizer step")
- ax_h.set_title("Hack vs solve rate by arm (EMA-5; dot = mean hack onset)", fontsize=10)
+ if SHOW_TITLE:
+ ax_h.set_title("Hack vs solve rate by arm (EMA-5; dot = mean hack onset)", fontsize=10)
fig.tight_layout()
- out.parent.mkdir(parents=True, exist_ok=True)
- fig.savefig(out, dpi=150, bbox_inches="tight")
+ save_fig(fig, out)
logger.info(f"wrote {out}")
def plot_train_vs_deploy(runs: list[dict], out: Path) -> None:
- """2x2 small multiple: rows = train (knob ON) / deploy (knob OFF), cols = arm.
- The story in one figure: vanilla train == deploy (no quarantine, the cheat is
- in the deployed weights); route2 train HACKS while deploy is clean -- the cheat
- is held in the deletable knob. Same red=hack/green=solve as the other figures."""
+ """2x2 small multiple: rows = train (adapter ON) / deploy (adapter OFF), cols = arm.
+ The story in one figure: vanilla train == deploy (no quarantine, the reward
+ hack is in the deployed weights); route trains while hacking but deploys clean,
+ the hack is held in the deletable quarantine adapter. Same red=hack/green=solve
+ as the other figures."""
by_arm: dict[str, list[dict]] = defaultdict(list)
for r in runs:
by_arm[classify(r)].append(r)
arms = [a for a in ARM_ORDER if a in by_arm]
red, green = RATE_COLORS["hack_s"], RATE_COLORS["gt_s"]
rows = [
- ("train (knob on)", {"hack_train": "hack", "solve_train": "solve"},
- {"hack_train": red, "solve_train": green}),
- ("deploy (knob off)", {"hk_dep": "hack", "slv_dep": "solve"},
- {"hk_dep": red, "slv_dep": green}),
+ ("train (adapter on)", {"hack_train": "hack", "solve_train": "solve"},
+ {"hack_train": red, "solve_train": green}),
+ ("deploy (adapter off)", {"hk_dep": "hack", "slv_dep": "solve"},
+ {"hk_dep": red, "slv_dep": green}),
]
fig, axes = plt.subplots(2, len(arms), figsize=(3.0 * len(arms), 4.8),
sharex=True, sharey=True, squeeze=False)
for ci, arm in enumerate(arms):
- axes[0][ci].set_title(arm, fontsize=10)
+ axes[0][ci].set_title(arm_label(arm), fontsize=10)
for ri, (rlabel, cols, colors) in enumerate(rows):
ax = axes[ri][ci]
_series_panel(ax, by_arm[arm], cols, colors, ylim=(-0.035, 1.0),
@@ -415,11 +451,14 @@ def plot_train_vs_deploy(runs: list[dict], out: Path) -> None:
ax.tick_params(labelsize=8)
for ax in axes[-1]:
ax.set_xlabel("optimizer step")
- fig.suptitle("Train (knob on) vs deploy (knob off): vanilla puts the cheat in "
- "the weights, route2 in the deletable knob (EMA-5)", fontsize=10)
- fig.tight_layout(rect=(0, 0, 1, 0.95))
- out.parent.mkdir(parents=True, exist_ok=True)
- fig.savefig(out, dpi=150, bbox_inches="tight")
+ if SHOW_TITLE:
+ fig.suptitle("Train (adapter on) vs deploy (adapter off): vanilla puts the "
+ "reward hack in the weights, route in the deletable adapter (EMA-5)",
+ fontsize=10)
+ fig.tight_layout(rect=(0, 0, 1, 0.95))
+ else:
+ fig.tight_layout()
+ save_fig(fig, out)
logger.info(f"wrote {out}")
@@ -454,13 +493,24 @@ def _latest_per_arm(files: list[Path], min_steps: int) -> list[Path]:
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__)
- ap.add_argument("logs", nargs="+", help="log files, globs, or dirs")
+ ap.add_argument("logs", nargs="*", help="log files, globs, or dirs (omit with --from-csv)")
ap.add_argument("--out", type=Path, default=Path("out/figs/dynamics.png"))
ap.add_argument("--latest-per-arm", action="store_true",
help="keep only the newest log per arm (with >= --min-steps rows)")
ap.add_argument("--min-steps", type=int, default=0,
help="drop runs shorter than this many logged steps")
+ ap.add_argument("--title", action="store_true",
+ help="draw the suptitle (off by default: the paper/blog caption carries it)")
+ ap.add_argument("--from-csv", type=Path, default=None,
+ help="re-render from a committed dump_data CSV instead of parsing logs")
args = ap.parse_args()
+ global SHOW_TITLE
+ SHOW_TITLE = args.title
+ if args.from_csv:
+ runs = load_csv(args.from_csv)
+ logger.info(f"loaded {len(runs)} runs from {args.from_csv} (CSV re-render, no logs)")
+ _render_all(runs, args.out)
+ return
files = _gather(args.logs)
if args.latest_per_arm:
files = _latest_per_arm(files, args.min_steps)
@@ -470,14 +520,18 @@ def main() -> None:
for r in runs:
logger.info(f"{classify(r):16s} seed={r['seed']} steps={len(r['steps'])} {r['vhack']}")
args.out.parent.mkdir(parents=True, exist_ok=True)
- plot(runs, args.out)
- # second figure: single-panel arm-vs-arm overlay of the headline metric
- overlay = args.out.with_name(args.out.stem + "_hack_overlay.png")
- plot_hack_overlay(runs, overlay)
- # third figure: 2x2 train(knob-on) vs deploy(knob-off) x arm
- tvd = args.out.with_name(args.out.stem + "_train_deploy.png")
- plot_train_vs_deploy(runs, tvd)
- for p in (args.out, overlay, tvd):
+ _render_all(runs, args.out)
+
+
+def _render_all(runs: list[dict], out: Path) -> None:
+ """The three dynamics figures, shared by the log-parse and --from-csv paths."""
+ out.parent.mkdir(parents=True, exist_ok=True)
+ plot(runs, out) # small-multiples + CSV dump
+ overlay = out.with_name(out.stem + "_hack_overlay.png")
+ plot_hack_overlay(runs, overlay) # arm-vs-arm headline overlay
+ tvd = out.with_name(out.stem + "_train_deploy.png")
+ plot_train_vs_deploy(runs, tvd) # 2x2 train(on) vs deploy(off)
+ for p in (out, overlay, tvd):
logger.info(f"docs/figs latest -> {link_latest(p)}")
diff --git a/scripts/plot_emergence.py b/scripts/plot_emergence.py
index 039fcc4..79caef4 100644
--- a/scripts/plot_emergence.py
+++ b/scripts/plot_emergence.py
@@ -21,9 +21,12 @@ import matplotlib.pyplot as plt
import numpy as np
from loguru import logger
-from projected_grpo.figs import link_latest
+from projected_grpo.figs import link_latest, save_fig
from plot_dynamics import _ema, _gather, _onset, parse_log
+# Captioned downstream, so the title just restates the caption. --title re-enables.
+SHOW_TITLE = False
+
# Distinct hue per mode (qualitative). solve drawn dashed in the same hue so each
# mode's hack/solve pair reads together.
MODE_COLORS = {
@@ -71,11 +74,11 @@ def plot(runs_by_mode: dict[str, list[dict]], out: Path) -> None:
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.tick_params(labelsize=8)
- ax.set_title("Loophole emergence under vanilla GRPO "
- "(solid=hack/exploited, dashed=solve/gt_correct; EMA-5)", fontsize=9)
+ if SHOW_TITLE:
+ ax.set_title("Loophole emergence under vanilla GRPO "
+ "(solid=hack/exploited, dashed=solve/gt_correct; EMA-5)", fontsize=9)
fig.tight_layout()
- out.parent.mkdir(parents=True, exist_ok=True)
- fig.savefig(out, dpi=150, bbox_inches="tight")
+ save_fig(fig, out)
logger.info(f"wrote {out} (modes={modes})")
diff --git a/scripts/plot_substrate.py b/scripts/plot_substrate.py
index b7d7c79..1102388 100644
--- a/scripts/plot_substrate.py
+++ b/scripts/plot_substrate.py
@@ -39,6 +39,8 @@ import matplotlib.pyplot as plt
import numpy as np
from loguru import logger
+from projected_grpo.figs import save_fig
+
# hk_ column header -> (display mode, colour). Order = panel/legend order.
# Colourblind-safe-ish qualitative set; one hue per loophole, reused across panels.
HK = {
@@ -172,9 +174,8 @@ def plot_by_method(runs, ylabel, cumulative, span, out: Path):
fontsize=6.5, va="top", color="#888")
axes[0].set_ylabel(ylabel)
axes[0].set_ylim(-0.02, None)
- out.parent.mkdir(parents=True, exist_ok=True)
fig.tight_layout()
- fig.savefig(out, dpi=140, bbox_inches="tight")
+ save_fig(fig, out)
logger.info(f"wrote {out} (by-method, {len(methods)} methods)")
@@ -205,9 +206,8 @@ def plot_by_hack(runs, ylabel, cumulative, span, out: Path):
_despine(ax)
axes[0].set_ylabel(ylabel)
axes[0].set_ylim(-0.02, None)
- out.parent.mkdir(parents=True, exist_ok=True)
fig.tight_layout()
- fig.savefig(out, dpi=140, bbox_inches="tight")
+ save_fig(fig, out)
logger.info(f"wrote {out} (by-hack, {len(modes)} modes)")
diff --git a/src/projected_grpo/figs.py b/src/projected_grpo/figs.py
index 880b023..69a5ab2 100644
--- a/src/projected_grpo/figs.py
+++ b/src/projected_grpo/figs.py
@@ -16,6 +16,33 @@ from pathlib import Path
FIGS_DIR = Path("docs/figs")
+# Reader-facing arm names. Code/log tags carry our internal vocabulary
+# (route2 = the current routing arm; "knob" = the delta_S adapter); plots must
+# not. Map every internal tag to the word a paper reader sees. Anything missing
+# falls through to its raw tag, so a new arm shows up loud rather than silently
+# mislabelled.
+ARM_DISPLAY = {
+ "routing2": "route", "route2": "route",
+ "routing2_grad": "route", "routing2_act": "route (act)",
+ "projected": "erase", "route": "route", "erase": "erase", "vanilla": "vanilla",
+}
+
+
+def arm_label(tag: str) -> str:
+ return ARM_DISPLAY.get(tag, tag)
+
+
+def save_fig(fig, png_path: Path, formats=("png", "svg", "pdf")) -> Path:
+ """Save one figure to every format (vector .svg/.pdf for the paper, .png for
+ the blog/preview) and return the .png path. matplotlib picks the writer from
+ the suffix, so we just swap it. bbox_inches='tight' so titleless figures
+ don't leave a margin where the suptitle used to be."""
+ png_path = Path(png_path)
+ png_path.parent.mkdir(parents=True, exist_ok=True)
+ for ext in formats:
+ fig.savefig(png_path.with_suffix(f".{ext}"), dpi=150, bbox_inches="tight")
+ return png_path
+
def link_latest(out_path: Path) -> Path:
"""Point docs/figs/ at out_path (relative symlink). Returns the link."""