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 @@ + + + + + + + + 2026-06-03T02:42:47.371327 + image/svg+xml + + + Matplotlib v3.10.9, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + 2026-06-03T02:42:47.874492 + image/svg+xml + + + Matplotlib v3.10.9, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + 2026-06-03T02:42:48.626781 + image/svg+xml + + + Matplotlib v3.10.9, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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."""