diff --git a/Visualization_Module/27709-output.txt b/Visualization_Module/27709-output.txt
new file mode 100644
index 0000000..bd9919f
--- /dev/null
+++ b/Visualization_Module/27709-output.txt
@@ -0,0 +1,1010 @@
+SPLS: itr: 7 diff: 2.77e-06 dim_u: 68 dim_v: 3
+SPLS: itr: 10 diff: 7.94e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 10 diff: 2.88e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 22 diff: 7.15e-06 dim_u: 73 dim_v: 7
+SPLS: itr: 24 diff: 8.78e-06 dim_u: 67 dim_v: 3
+SPLS: itr: 25 diff: 7.11e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 7 diff: 2.63e-06 dim_u: 65 dim_v: 3
+SPLS: itr: 10 diff: 7.23e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 13 diff: 3.83e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 20 diff: 6.30e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 12 diff: 9.26e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 21 diff: 7.63e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 22 diff: 8.21e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 14 diff: 6.52e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 18 diff: 7.36e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 8 diff: 2.43e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 10 diff: 7.46e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 8 diff: 1.09e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 10 diff: 6.21e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 8 diff: 4.54e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 16 diff: 4.77e-06 dim_u: 69 dim_v: 7
+SPLS: itr: 17 diff: 6.91e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 7 diff: 2.77e-06 dim_u: 68 dim_v: 3
+SPLS: itr: 13 diff: 7.48e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 10 diff: 3.37e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 10 diff: 2.77e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 9 diff: 5.12e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 16 diff: 8.47e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 18 diff: 6.00e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 24 diff: 5.59e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 17 diff: 7.62e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 15 diff: 8.66e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 27 diff: 8.88e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 29 diff: 7.11e-06 dim_u: 72 dim_v: 7
+SPLS: itr: 14 diff: 4.98e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 12 diff: 9.56e-06 dim_u: 72 dim_v: 3
+SPLS: itr: 7 diff: 7.08e-06 dim_u: 64 dim_v: 3
+SPLS: itr: 24 diff: 8.78e-06 dim_u: 67 dim_v: 3
+SPLS: itr: 14 diff: 6.70e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 10 diff: 3.02e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 17 diff: 8.73e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 7 diff: 2.63e-06 dim_u: 65 dim_v: 3
+SPLS: itr: 14 diff: 7.20e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 14 diff: 8.99e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 14 diff: 8.90e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 16 diff: 9.28e-06 dim_u: 52 dim_v: 6
+SPLS: itr: 13 diff: 7.03e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 17 diff: 6.24e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 12 diff: 9.26e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 20 diff: 7.08e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 19 diff: 6.07e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 17 diff: 5.66e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 16 diff: 5.84e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 67 diff: 8.23e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 30 diff: 9.74e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 18 diff: 7.36e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 39 diff: 9.61e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 31 diff: 3.90e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 9 diff: 8.42e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 15 diff: 8.63e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 85 diff: 9.79e-06 dim_u: 74 dim_v: 6
+SPLS: itr: 16 diff: 7.02e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 10 diff: 3.37e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 11 diff: 9.26e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 14 diff: 9.34e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 8 diff: 8.67e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 16 diff: 9.65e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 13 diff: 4.63e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 18 diff: 4.79e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 14 diff: 8.04e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 10 diff: 3.10e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 12 diff: 2.99e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 14 diff: 4.00e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 18 diff: 6.00e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 17 diff: 5.90e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 12 diff: 3.08e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 16 diff: 6.28e-06 dim_u: 50 dim_v: 8
+SPLS: itr: 25 diff: 5.74e-06 dim_u: 52 dim_v: 6
+SPLS: itr: 12 diff: 9.56e-06 dim_u: 72 dim_v: 3
+SPLS: itr: 18 diff: 7.78e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 8 diff: 2.06e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 76 diff: 9.55e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 25 diff: 9.60e-06 dim_u: 72 dim_v: 4
+SPLS: itr: 7 diff: 8.86e-07 dim_u: 63 dim_v: 3
+SPLS: itr: 18 diff: 8.18e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 15 diff: 5.22e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 19 diff: 5.73e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 14 diff: 8.99e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 13 diff: 8.36e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 10 diff: 5.62e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 39 diff: 9.79e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 14 diff: 7.22e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 8 diff: 8.94e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 14 diff: 6.92e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 28 diff: 7.44e-06 dim_u: 74 dim_v: 7
+SPLS: itr: 15 diff: 4.63e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 16 diff: 7.34e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 21 diff: 6.38e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 16 diff: 4.38e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 13 diff: 9.83e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 14 diff: 9.56e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 15 diff: 8.31e-06 dim_u: 71 dim_v: 4
+SPLS: itr: 19 diff: 9.18e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 9 diff: 6.73e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 100 diff: 9.72e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 39 diff: 9.61e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 9 diff: 4.52e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 16 diff: 6.27e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 8 diff: 5.51e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 27 diff: 9.45e-06 dim_u: 52 dim_v: 5
+SPLS: itr: 29 diff: 6.99e-06 dim_u: 52 dim_v: 4
+SPLS: itr: 20 diff: 7.81e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 8 diff: 4.68e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 13 diff: 9.96e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 12 diff: 8.96e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 13 diff: 4.63e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 10 diff: 4.44e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 18 diff: 6.60e-06 dim_u: 53 dim_v: 10
+SPLS: itr: 11 diff: 7.21e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 16 diff: 8.03e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 14 diff: 8.30e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 40 diff: 7.55e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 12 diff: 2.99e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 17 diff: 5.14e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 20 diff: 8.32e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 14 diff: 7.50e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 36 diff: 7.37e-06 dim_u: 71 dim_v: 3
+SPLS: itr: 17 diff: 6.35e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 14 diff: 7.16e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 11 diff: 4.08e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 9 diff: 3.23e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 14 diff: 7.17e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 7 diff: 2.22e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 14 diff: 7.04e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 18 diff: 6.89e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 16 diff: 6.08e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 13 diff: 4.30e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 18 diff: 7.78e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 8 diff: 7.48e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 24 diff: 5.74e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 18 diff: 9.64e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 19 diff: 5.62e-06 dim_u: 51 dim_v: 8
+SPLS: itr: 7 diff: 8.86e-07 dim_u: 63 dim_v: 3
+SPLS: itr: 16 diff: 4.94e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 11 diff: 6.15e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 21 diff: 8.20e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 10 diff: 5.62e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 12 diff: 7.10e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 13 diff: 9.11e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 15 diff: 5.00e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 9 diff: 3.40e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 35 diff: 8.53e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 16 diff: 7.34e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 14 diff: 5.83e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 15 diff: 4.21e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 9 diff: 4.51e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 43 diff: 8.51e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 15 diff: 4.38e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 15 diff: 8.31e-06 dim_u: 71 dim_v: 4
+SPLS: itr: 10 diff: 3.02e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 44 diff: 7.10e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 9 diff: 4.52e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 73 diff: 9.88e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 83 diff: 9.75e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 24 diff: 6.08e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 15 diff: 6.40e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 22 diff: 6.66e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 55 diff: 7.82e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 27 diff: 7.77e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 14 diff: 5.72e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 10 diff: 7.03e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 13 diff: 9.45e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 16 diff: 7.94e-06 dim_u: 73 dim_v: 5
+SPLS: itr: 16 diff: 8.55e-06 dim_u: 73 dim_v: 5
+SPLS: itr: 14 diff: 8.74e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 19 diff: 7.07e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 9 diff: 4.30e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 17 diff: 7.84e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 37 diff: 9.47e-06 dim_u: 50 dim_v: 5
+SPLS: itr: 8 diff: 6.32e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 19 diff: 7.93e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 15 diff: 7.83e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 9 diff: 3.28e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 36 diff: 7.37e-06 dim_u: 71 dim_v: 3
+SPLS: itr: 8 diff: 9.32e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 10 diff: 5.14e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 24 diff: 8.48e-06 dim_u: 69 dim_v: 6
+SPLS: itr: 22 diff: 8.20e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 17 diff: 9.07e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 21 diff: 4.58e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 21 diff: 8.96e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 14 diff: 7.04e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 18 diff: 5.44e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 7 diff: 4.53e-06 dim_u: 65 dim_v: 3
+SPLS: itr: 14 diff: 5.61e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 19 diff: 6.77e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 29 diff: 8.22e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 11 diff: 7.54e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 12 diff: 3.36e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 16 diff: 4.94e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 10 diff: 5.67e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 25 diff: 2.91e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 17 diff: 5.96e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 10 diff: 2.90e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 30 diff: 9.94e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 14 diff: 8.27e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 11 diff: 4.19e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 15 diff: 5.00e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 13 diff: 7.86e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 37 diff: 9.02e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 28 diff: 5.92e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 18 diff: 8.22e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 14 diff: 7.40e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 20 diff: 5.15e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 26 diff: 7.50e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 9 diff: 6.53e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 13 diff: 3.54e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 9 diff: 5.82e-06 dim_u: 64 dim_v: 3
+SPLS: itr: 24 diff: 6.42e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 25 diff: 6.49e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 10 diff: 3.63e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 15 diff: 5.73e-06 dim_u: 70 dim_v: 5
+SPLS: itr: 16 diff: 5.89e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 44 diff: 7.10e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 146 diff: 9.81e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 10 diff: 3.85e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 8 diff: 1.33e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 15 diff: 8.22e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 17 diff: 6.22e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 26 diff: 3.30e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 9 diff: 5.63e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 10 diff: 3.56e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 37 diff: 9.85e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 10 diff: 6.59e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 10 diff: 2.76e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 14 diff: 7.87e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 18 diff: 9.26e-06 dim_u: 66 dim_v: 9
+SPLS: itr: 17 diff: 5.22e-06 dim_u: 60 dim_v: 10
+SPLS: itr: 27 diff: 6.84e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 68 diff: 8.47e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 19 diff: 7.78e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 19 diff: 4.45e-06 dim_u: 55 dim_v: 3
+SPLS: itr: 37 diff: 9.47e-06 dim_u: 50 dim_v: 5
+SPLS: itr: 38 diff: 8.64e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 11 diff: 7.46e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 22 diff: 8.14e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 14 diff: 5.16e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 15 diff: 4.68e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 14 diff: 9.03e-06 dim_u: 67 dim_v: 8
+SPLS: itr: 31 diff: 7.37e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 24 diff: 6.06e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 22 diff: 8.20e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 63 diff: 8.41e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 7 diff: 4.53e-06 dim_u: 65 dim_v: 3
+SPLS: itr: 22 diff: 6.15e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 18 diff: 5.22e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 26 diff: 7.70e-06 dim_u: 74 dim_v: 6
+SPLS: itr: 35 diff: 7.00e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 23 diff: 8.81e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 14 diff: 6.98e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 13 diff: 3.83e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 25 diff: 2.91e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 18 diff: 7.55e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 47 diff: 9.92e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 81 diff: 9.12e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 15 diff: 7.35e-06 dim_u: 69 dim_v: 3
+SPLS: itr: 24 diff: 7.13e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 54 diff: 7.30e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 38 diff: 5.36e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 13 diff: 7.86e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 8 diff: 3.72e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 23 diff: 7.19e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 33 diff: 9.66e-06 dim_u: 73 dim_v: 9
+SPLS: itr: 15 diff: 9.10e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 26 diff: 9.77e-06 dim_u: 70 dim_v: 7
+SPLS: itr: 26 diff: 9.67e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 14 diff: 7.40e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 13 diff: 5.79e-06 dim_u: 73 dim_v: 4
+SPLS: itr: 30 diff: 6.13e-06 dim_u: 69 dim_v: 7
+SPLS: itr: 15 diff: 5.88e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 9 diff: 6.36e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 9 diff: 5.82e-06 dim_u: 64 dim_v: 3
+SPLS: itr: 24 diff: 8.30e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 9 diff: 3.59e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 19 diff: 7.15e-06 dim_u: 62 dim_v: 10
+SPLS: itr: 18 diff: 8.73e-06 dim_u: 61 dim_v: 10
+SPLS: itr: 27 diff: 8.02e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 10 diff: 3.63e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 21 diff: 9.71e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 27 diff: 9.54e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 20 diff: 6.52e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 17 diff: 4.86e-06 dim_u: 71 dim_v: 5
+SPLS: itr: 17 diff: 9.98e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 10 diff: 3.85e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 11 diff: 3.59e-06 dim_u: 69 dim_v: 6
+SPLS: itr: 26 diff: 7.69e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 26 diff: 7.96e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 9 diff: 5.63e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 19 diff: 6.93e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 19 diff: 9.05e-06 dim_u: 76 dim_v: 5
+SPLS: itr: 52 diff: 8.58e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 21 diff: 6.24e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 9 diff: 2.58e-06 dim_u: 66 dim_v: 3
+SPLS: itr: 10 diff: 2.76e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 43 diff: 7.86e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 10 diff: 5.18e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 18 diff: 5.15e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 19 diff: 3.01e-06 dim_u: 51 dim_v: 8
+SPLS: itr: 7 diff: 3.92e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 13 diff: 3.81e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 21 diff: 6.83e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 19 diff: 7.81e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 14 diff: 5.85e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 13 diff: 4.88e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 19 diff: 4.45e-06 dim_u: 55 dim_v: 3
+SPLS: itr: 18 diff: 4.66e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 51 diff: 9.85e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 13 diff: 6.75e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 19 diff: 8.03e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 28 diff: 6.72e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 27 diff: 9.88e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 11 diff: 9.59e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 28 diff: 6.83e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 16 diff: 9.49e-06 dim_u: 58 dim_v: 10
+SPLS: itr: 10 diff: 7.27e-06 dim_u: 68 dim_v: 3
+SPLS: itr: 13 diff: 6.58e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 24 diff: 6.06e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 47 diff: 8.46e-06 dim_u: 64 dim_v: 10
+SPLS: itr: 20 diff: 7.12e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 16 diff: 8.32e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 14 diff: 9.65e-06 dim_u: 57 dim_v: 9
+SPLS: itr: 13 diff: 6.86e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 10 diff: 4.44e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 49 diff: 9.48e-06 dim_u: 69 dim_v: 10
+SPLS: itr: 27 diff: 6.92e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 20 diff: 9.91e-06 dim_u: 67 dim_v: 8
+SPLS: itr: 14 diff: 3.75e-06 dim_u: 58 dim_v: 9
+SPLS: itr: 23 diff: 8.81e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 21 diff: 9.27e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 13 diff: 4.63e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 13 diff: 2.95e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 19 diff: 6.96e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 24 diff: 8.22e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 45 diff: 9.66e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 13 diff: 3.83e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 25 diff: 8.00e-06 dim_u: 69 dim_v: 8
+SPLS: itr: 12 diff: 7.73e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 16 diff: 4.75e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 25 diff: 9.99e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 12 diff: 3.08e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 26 diff: 8.52e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 16 diff: 4.09e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 9 diff: 1.69e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 19 diff: 8.28e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 14 diff: 9.45e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 27 diff: 9.10e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 23 diff: 7.19e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 24 diff: 8.05e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 15 diff: 3.79e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 9 diff: 4.93e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 15 diff: 4.75e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 12 diff: 8.25e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 30 diff: 9.50e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 15 diff: 5.88e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 10 diff: 9.42e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 25 diff: 8.35e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 15 diff: 8.11e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 49 diff: 9.49e-06 dim_u: 52 dim_v: 6
+SPLS: itr: 8 diff: 3.49e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 15 diff: 9.68e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 27 diff: 9.22e-06 dim_u: 74 dim_v: 9
+SPLS: itr: 14 diff: 6.52e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 29 diff: 8.96e-06 dim_u: 70 dim_v: 4
+SPLS: itr: 25 diff: 7.65e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 13 diff: 9.26e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 27 diff: 9.54e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 12 diff: 3.13e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 28 diff: 5.49e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 27 diff: 8.80e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 9 diff: 9.13e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 14 diff: 8.04e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 19 diff: 5.39e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 16 diff: 9.28e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 30 diff: 8.92e-06 dim_u: 66 dim_v: 8
+SPLS: itr: 13 diff: 7.43e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 19 diff: 6.93e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 31 diff: 7.75e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 9 diff: 2.58e-06 dim_u: 66 dim_v: 3
+SPLS: itr: 14 diff: 7.72e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 28 diff: 9.28e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 61 diff: 8.52e-06 dim_u: 61 dim_v: 8
+SPLS: itr: 27 diff: 9.68e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 16 diff: 5.80e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 7 diff: 3.92e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 27 diff: 7.76e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 25 diff: 6.67e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 12 diff: 3.32e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 12 diff: 6.71e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 20 diff: 6.84e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 23 diff: 4.45e-06 dim_u: 59 dim_v: 3
+SPLS: itr: 37 diff: 9.27e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 13 diff: 3.81e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 9 diff: 3.70e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 31 diff: 9.12e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 22 diff: 5.62e-06 dim_u: 50 dim_v: 4
+SPLS: itr: 32 diff: 7.70e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 27 diff: 9.88e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 18 diff: 6.50e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 13 diff: 6.61e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 9 diff: 4.23e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 37 diff: 8.90e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 61 diff: 9.72e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 10 diff: 7.27e-06 dim_u: 68 dim_v: 3
+SPLS: itr: 22 diff: 8.56e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 30 diff: 8.19e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 12 diff: 2.39e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 23 diff: 1.39e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 28 diff: 8.09e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 14 diff: 8.26e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 17 diff: 6.16e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 21 diff: 7.65e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 39 diff: 8.10e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 22 diff: 8.93e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 42 diff: 9.56e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 20 diff: 6.80e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 12 diff: 2.77e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 12 diff: 5.21e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 9 diff: 5.76e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 35 diff: 6.88e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 23 diff: 6.84e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 14 diff: 9.36e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 45 diff: 9.66e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 29 diff: 8.84e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 11 diff: 2.79e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 28 diff: 8.48e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 26 diff: 8.69e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 17 diff: 5.51e-06 dim_u: 52 dim_v: 5
+SPLS: itr: 19 diff: 7.89e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 13 diff: 4.57e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 7 diff: 1.34e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 24 diff: 8.82e-06 dim_u: 61 dim_v: 10
+SPLS: itr: 12 diff: 3.08e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 24 diff: 8.88e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 10 diff: 9.09e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 24 diff: 5.83e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 13 diff: 3.83e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 31 diff: 5.71e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 19 diff: 7.50e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 19 diff: 7.12e-06 dim_u: 71 dim_v: 4
+SPLS: itr: 24 diff: 8.24e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 27 diff: 8.99e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 15 diff: 4.19e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 25 diff: 8.06e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 9 diff: 9.53e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 15 diff: 7.36e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 30 diff: 9.50e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 14 diff: 7.05e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 25 diff: 8.55e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 10 diff: 6.63e-06 dim_u: 50 dim_v: 6
+SPLS: itr: 26 diff: 8.29e-06 dim_u: 58 dim_v: 10
+SPLS: itr: 26 diff: 8.26e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 15 diff: 4.16e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 12 diff: 8.98e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 18 diff: 6.60e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 21 diff: 6.48e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 19 diff: 5.65e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 23 diff: 5.93e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 14 diff: 3.96e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 20 diff: 9.67e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 9 diff: 1.65e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 29 diff: 8.96e-06 dim_u: 70 dim_v: 4
+SPLS: itr: 9 diff: 3.78e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 20 diff: 8.05e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 14 diff: 8.04e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 23 diff: 6.59e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 23 diff: 7.73e-06 dim_u: 59 dim_v: 8
+SPLS: itr: 22 diff: 7.29e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 28 diff: 4.46e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 23 diff: 6.45e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 20 diff: 9.21e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 15 diff: 5.48e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 11 diff: 2.76e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 27 diff: 9.68e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 16 diff: 6.73e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 38 diff: 8.13e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 27 diff: 7.59e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 32 diff: 9.91e-06 dim_u: 64 dim_v: 8
+SPLS: itr: 50 diff: 7.74e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 23 diff: 4.45e-06 dim_u: 59 dim_v: 3
+SPLS: itr: 40 diff: 7.61e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 82 diff: 9.59e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 13 diff: 7.40e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 22 diff: 7.66e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 14 diff: 7.99e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 16 diff: 6.66e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 8 diff: 5.09e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 9 diff: 3.70e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 37 diff: 9.31e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 10 diff: 3.55e-06 dim_u: 49 dim_v: 7
+SPLS: itr: 8 diff: 3.82e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 29 diff: 6.42e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 9 diff: 9.64e-06 dim_u: 50 dim_v: 8
+SPLS: itr: 20 diff: 7.87e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 13 diff: 6.61e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 11 diff: 7.82e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 11 diff: 9.07e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 19 diff: 6.56e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 15 diff: 7.43e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 16 diff: 7.06e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 28 diff: 8.26e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 16 diff: 4.87e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 22 diff: 9.45e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 23 diff: 1.39e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 27 diff: 8.57e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 26 diff: 6.37e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 10 diff: 3.92e-06 dim_u: 49 dim_v: 6
+SPLS: itr: 28 diff: 5.72e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 26 diff: 7.20e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 20 diff: 6.80e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 24 diff: 8.96e-06 dim_u: 71 dim_v: 4
+SPLS: itr: 38 diff: 9.59e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 17 diff: 5.99e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 15 diff: 5.76e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 25 diff: 6.59e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 16 diff: 7.35e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 34 diff: 8.97e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 16 diff: 8.98e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 12 diff: 6.80e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 16 diff: 9.84e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 90 diff: 9.82e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 26 diff: 8.69e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 15 diff: 9.27e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 7 diff: 1.34e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 15 diff: 4.51e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 11 diff: 5.40e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 16 diff: 7.12e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 27 diff: 4.84e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 17 diff: 4.69e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 31 diff: 6.72e-06 dim_u: 55 dim_v: 9
+SPLS: itr: 13 diff: 5.90e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 56 diff: 9.04e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 17 diff: 5.70e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 17 diff: 6.40e-06 dim_u: 70 dim_v: 5
+SPLS: itr: 24 diff: 8.24e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 21 diff: 7.77e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 34 diff: 8.05e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 21 diff: 5.53e-06 dim_u: 71 dim_v: 4
+SPLS: itr: 306 diff: 9.96e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 15 diff: 4.21e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 29 diff: 7.00e-06 dim_u: 73 dim_v: 6
+SPLS: itr: 21 diff: 7.47e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 9 diff: 2.89e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 19 diff: 8.80e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 9 diff: 6.38e-06 dim_u: 69 dim_v: 8
+SPLS: itr: 9 diff: 3.74e-06 dim_u: 50 dim_v: 8
+SPLS: itr: 21 diff: 9.43e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 20 diff: 6.71e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 9 diff: 6.25e-06 dim_u: 50 dim_v: 5
+SPLS: itr: 10 diff: 2.64e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 23 diff: 5.07e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 19 diff: 9.37e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 68 diff: 9.77e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 15 diff: 7.39e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 21 diff: 4.82e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 34 diff: 9.69e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 53 diff: 7.23e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 9 diff: 7.78e-06 dim_u: 55 dim_v: 3
+SPLS: itr: 10 diff: 8.57e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 16 diff: 4.38e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 21 diff: 4.94e-06 dim_u: 50 dim_v: 4
+SPLS: itr: 15 diff: 6.28e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 20 diff: 7.94e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 15 diff: 9.61e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 22 diff: 4.04e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 14 diff: 4.89e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 9 diff: 6.12e-06 dim_u: 50 dim_v: 8
+SPLS: itr: 21 diff: 5.14e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 21 diff: 2.84e-06 dim_u: 52 dim_v: 5
+SPLS: itr: 20 diff: 2.21e-06 dim_u: 52 dim_v: 5
+SPLS: itr: 15 diff: 4.13e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 9 diff: 8.27e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 47 diff: 7.19e-06 dim_u: 74 dim_v: 7
+SPLS: itr: 19 diff: 6.87e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 21 diff: 7.53e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 24 diff: 5.40e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 30 diff: 6.96e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 9 diff: 5.95e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 19 diff: 3.55e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 11 diff: 4.66e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 9 diff: 6.73e-06 dim_u: 50 dim_v: 5
+SPLS: itr: 13 diff: 4.56e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 17 diff: 7.07e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 22 diff: 6.81e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 10 diff: 4.23e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 29 diff: 6.93e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 20 diff: 6.89e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 13 diff: 2.62e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 21 diff: 8.53e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 16 diff: 7.38e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 9 diff: 6.57e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 20 diff: 5.90e-06 dim_u: 52 dim_v: 5
+SPLS: itr: 8 diff: 4.06e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 26 diff: 4.45e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 28 diff: 6.48e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 49 diff: 9.55e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 22 diff: 7.21e-06 dim_u: 70 dim_v: 6
+SPLS: itr: 19 diff: 5.58e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 9 diff: 8.77e-06 dim_u: 69 dim_v: 8
+SPLS: itr: 11 diff: 4.07e-06 dim_u: 59 dim_v: 3
+SPLS: itr: 21 diff: 6.17e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 36 diff: 9.85e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 16 diff: 9.03e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 21 diff: 3.41e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 15 diff: 7.11e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 18 diff: 7.50e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 10 diff: 3.64e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 21 diff: 5.75e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 17 diff: 5.52e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 12 diff: 3.69e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 39 diff: 7.75e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 16 diff: 8.08e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 70 diff: 9.52e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 12 diff: 6.42e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 16 diff: 4.59e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 14 diff: 7.80e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 10 diff: 4.26e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 17 diff: 7.21e-06 dim_u: 52 dim_v: 8
+SPLS: itr: 17 diff: 7.65e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 13 diff: 4.99e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 38 diff: 5.79e-06 dim_u: 70 dim_v: 5
+SPLS: itr: 10 diff: 4.38e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 9 diff: 3.48e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 36 diff: 5.97e-06 dim_u: 74 dim_v: 5
+SPLS: itr: 14 diff: 4.57e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 41 diff: 7.17e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 19 diff: 4.42e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 51 diff: 9.65e-06 dim_u: 70 dim_v: 7
+SPLS: itr: 8 diff: 9.64e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 15 diff: 5.67e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 26 diff: 7.71e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 14 diff: 7.10e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 13 diff: 6.81e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 15 diff: 9.34e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 20 diff: 6.75e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 10 diff: 2.74e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 9 diff: 3.73e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 27 diff: 6.64e-06 dim_u: 67 dim_v: 8
+SPLS: itr: 6 diff: 2.91e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 18 diff: 5.34e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 10 diff: 3.61e-06 dim_u: 51 dim_v: 8
+SPLS: itr: 29 diff: 8.66e-06 dim_u: 72 dim_v: 6
+SPLS: itr: 15 diff: 8.89e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 17 diff: 5.84e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 19 diff: 4.51e-06 dim_u: 70 dim_v: 3
+SPLS: itr: 22 diff: 6.67e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 14 diff: 5.54e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 27 diff: 8.75e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 20 diff: 8.50e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 35 diff: 7.01e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 13 diff: 5.15e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 40 diff: 8.07e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 18 diff: 8.74e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 9 diff: 8.67e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 8 diff: 5.82e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 49 diff: 8.87e-06 dim_u: 68 dim_v: 9
+SPLS: itr: 31 diff: 7.70e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 7 diff: 9.59e-07 dim_u: 63 dim_v: 3
+SPLS: itr: 13 diff: 6.37e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 23 diff: 6.11e-06 dim_u: 69 dim_v: 6
+SPLS: itr: 15 diff: 5.71e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 14 diff: 2.32e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 306 diff: 9.96e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 18 diff: 7.47e-06 dim_u: 55 dim_v: 10
+SPLS: itr: 9 diff: 5.03e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 29 diff: 9.73e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 11 diff: 3.43e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 9 diff: 2.59e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 27 diff: 5.91e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 15 diff: 7.48e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 9 diff: 2.89e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 32 diff: 8.45e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 10 diff: 8.57e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 48 diff: 9.75e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 17 diff: 4.54e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 16 diff: 9.71e-06 dim_u: 55 dim_v: 9
+SPLS: itr: 8 diff: 4.54e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 13 diff: 6.72e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 14 diff: 3.77e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 9 diff: 7.46e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 23 diff: 5.07e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 26 diff: 5.72e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 14 diff: 2.94e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 49 diff: 8.14e-06 dim_u: 72 dim_v: 6
+SPLS: itr: 9 diff: 7.78e-06 dim_u: 55 dim_v: 3
+SPLS: itr: 21 diff: 6.22e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 36 diff: 7.85e-06 dim_u: 70 dim_v: 4
+SPLS: itr: 19 diff: 2.62e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 29 diff: 6.97e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 10 diff: 4.09e-06 dim_u: 66 dim_v: 8
+SPLS: itr: 21 diff: 7.83e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 8 diff: 7.75e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 16 diff: 4.83e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 22 diff: 4.04e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 11 diff: 8.16e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 50 diff: 9.30e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 22 diff: 8.00e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 13 diff: 7.09e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 49 diff: 7.45e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 9 diff: 1.80e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 38 diff: 9.08e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 15 diff: 3.97e-06 dim_u: 52 dim_v: 6
+SPLS: itr: 22 diff: 8.54e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 25 diff: 8.79e-06 dim_u: 74 dim_v: 7
+SPLS: itr: 23 diff: 7.48e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 13 diff: 7.64e-06 dim_u: 55 dim_v: 8
+SPLS: itr: 21 diff: 7.53e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 11 diff: 7.53e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 16 diff: 5.14e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 11 diff: 8.38e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 10 diff: 9.62e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 9 diff: 2.84e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 8 diff: 4.21e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 13 diff: 5.95e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 12 diff: 4.91e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 11 diff: 4.66e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 11 diff: 4.89e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 13 diff: 9.25e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 29 diff: 7.07e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 21 diff: 7.89e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 22 diff: 7.64e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 13 diff: 4.23e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 25 diff: 6.37e-06 dim_u: 75 dim_v: 7
+SPLS: itr: 12 diff: 3.32e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 10 diff: 4.23e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 31 diff: 7.16e-06 dim_u: 73 dim_v: 7
+SPLS: itr: 10 diff: 3.37e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 12 diff: 3.32e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 8 diff: 4.71e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 14 diff: 6.22e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 11 diff: 1.87e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 14 diff: 5.53e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 10 diff: 5.43e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 24 diff: 6.04e-06 dim_u: 73 dim_v: 6
+SPLS: itr: 17 diff: 8.83e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 14 diff: 6.53e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 19 diff: 7.14e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 15 diff: 3.86e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 36 diff: 7.93e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 28 diff: 6.48e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 10 diff: 5.54e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 13 diff: 7.75e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 25 diff: 9.93e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 10 diff: 2.33e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 19 diff: 8.51e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 19 diff: 7.31e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 10 diff: 8.01e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 11 diff: 4.07e-06 dim_u: 59 dim_v: 3
+SPLS: itr: 11 diff: 2.92e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 12 diff: 5.92e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 11 diff: 4.00e-06 dim_u: 63 dim_v: 3
+SPLS: itr: 16 diff: 5.68e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 42 diff: 9.39e-06 dim_u: 66 dim_v: 8
+SPLS: itr: 26 diff: 9.91e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 8 diff: 4.83e-06 dim_u: 55 dim_v: 3
+SPLS: itr: 13 diff: 4.77e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 15 diff: 7.11e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 35 diff: 8.71e-06 dim_u: 66 dim_v: 8
+SPLS: itr: 13 diff: 4.57e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 12 diff: 3.69e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 13 diff: 7.43e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 19 diff: 8.06e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 26 diff: 8.91e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 36 diff: 9.23e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 24 diff: 5.51e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 33 diff: 7.30e-06 dim_u: 66 dim_v: 8
+SPLS: itr: 7 diff: 1.06e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 12 diff: 5.09e-06 dim_u: 58 dim_v: 9
+SPLS: itr: 12 diff: 6.42e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 39 diff: 9.51e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 19 diff: 8.75e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 11 diff: 8.10e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 11 diff: 2.38e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 19 diff: 6.33e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 12 diff: 9.19e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 20 diff: 5.73e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 12 diff: 3.51e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 13 diff: 4.99e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 38 diff: 7.82e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 16 diff: 9.83e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 25 diff: 9.44e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 12 diff: 5.53e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 28 diff: 9.32e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 12 diff: 6.40e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 10 diff: 3.56e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 9 diff: 3.48e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 23 diff: 6.84e-06 dim_u: 54 dim_v: 9
+SPLS: itr: 11 diff: 3.43e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 16 diff: 2.71e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 19 diff: 9.21e-06 dim_u: 55 dim_v: 8
+SPLS: itr: 8 diff: 9.64e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 11 diff: 7.27e-06 dim_u: 61 dim_v: 8
+SPLS: itr: 16 diff: 7.63e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 20 diff: 9.47e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 10 diff: 5.65e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 13 diff: 7.79e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 21 diff: 7.80e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 12 diff: 5.16e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 27 diff: 7.03e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 13 diff: 6.81e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 11 diff: 6.10e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 11 diff: 3.22e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 9 diff: 9.63e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 6 diff: 2.91e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 21 diff: 7.80e-06 dim_u: 72 dim_v: 7
+SPLS: itr: 20 diff: 3.18e-06 dim_u: 52 dim_v: 8
+SPLS: itr: 17 diff: 9.79e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 15 diff: 8.54e-06 dim_u: 52 dim_v: 8
+SPLS: itr: 35 diff: 9.70e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 11 diff: 4.75e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 10 diff: 3.76e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 44 diff: 9.48e-06 dim_u: 51 dim_v: 8
+SPLS: itr: 15 diff: 7.87e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 19 diff: 4.51e-06 dim_u: 70 dim_v: 3
+SPLS: itr: 14 diff: 4.76e-06 dim_u: 63 dim_v: 9
+SPLS: itr: 13 diff: 6.96e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 13 diff: 4.58e-06 dim_u: 75 dim_v: 6
+SPLS: itr: 19 diff: 8.96e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 10 diff: 9.64e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 13 diff: 8.83e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 25 diff: 7.62e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 10 diff: 4.74e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 9 diff: 1.73e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 13 diff: 8.06e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 22 diff: 8.75e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 18 diff: 8.74e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 12 diff: 6.95e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 12 diff: 4.26e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 33 diff: 8.31e-06 dim_u: 70 dim_v: 7
+0.38198
+SPLS: itr: 7 diff: 9.59e-07 dim_u: 63 dim_v: 3
+SPLS: itr: 12 diff: 4.17e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 67 diff: 9.99e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 14 diff: 3.86e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 14 diff: 3.85e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 19 diff: 6.85e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 15 diff: 9.67e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 71 diff: 7.70e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 14 diff: 5.89e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 12 diff: 6.00e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 14 diff: 8.01e-06 dim_u: 64 dim_v: 8
+0.35677
+SPLS: itr: 10 diff: 3.83e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 14 diff: 5.63e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 20 diff: 5.73e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 8 diff: 9.22e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 8 diff: 7.56e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 8 diff: 9.05e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 14 diff: 2.96e-06 dim_u: 69 dim_v: 4
+SPLS: itr: 32 diff: 8.45e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 9 diff: 5.14e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 36 diff: 8.12e-06 dim_u: 55 dim_v: 9
+SPLS: itr: 28 diff: 7.91e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 11 diff: 3.33e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 13 diff: 9.68e-07 dim_u: 57 dim_v: 6
+SPLS: itr: 13 diff: 3.21e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 19 diff: 4.16e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 14 diff: 3.77e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 10 diff: 3.28e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 10 diff: 4.15e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 22 diff: 7.60e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 14 diff: 7.57e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 12 diff: 4.69e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 25 diff: 9.95e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 14 diff: 2.94e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 11 diff: 3.41e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 19 diff: 9.33e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 22 diff: 6.08e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 9 diff: 9.47e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 11 diff: 4.71e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 14 diff: 4.02e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 10 diff: 7.35e-06 dim_u: 67 dim_v: 3
+SPLS: itr: 10 diff: 2.03e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 8 diff: 6.40e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 20 diff: 5.99e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 17 diff: 5.21e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 23 diff: 6.63e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 14 diff: 4.45e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 38 diff: 8.23e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 14 diff: 9.71e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 13 diff: 7.03e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 9 diff: 9.42e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 10 diff: 4.64e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 13 diff: 9.54e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 30 diff: 7.60e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 9 diff: 2.24e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 11 diff: 3.35e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 38 diff: 9.08e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 20 diff: 5.67e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 9 diff: 5.18e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 11 diff: 9.19e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 11 diff: 3.83e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 18 diff: 4.60e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 13 diff: 4.16e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 10 diff: 9.62e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 9 diff: 3.15e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 11 diff: 2.64e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 16 diff: 4.64e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 14 diff: 6.75e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 9 diff: 4.44e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 9 diff: 7.26e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 17 diff: 6.49e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 25 diff: 7.23e-06 dim_u: 68 dim_v: 9
+SPLS: itr: 15 diff: 5.21e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 17 diff: 5.70e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 21 diff: 7.89e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 9 diff: 7.70e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 10 diff: 2.92e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 10 diff: 3.37e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 18 diff: 8.78e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 15 diff: 4.26e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 14 diff: 5.07e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 17 diff: 6.33e-06 dim_u: 59 dim_v: 6
+0.36535
+SPLS: itr: 15 diff: 7.39e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 10 diff: 5.71e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 12 diff: 4.77e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 15 diff: 5.55e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 17 diff: 8.83e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 11 diff: 8.73e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 18 diff: 7.86e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 12 diff: 6.20e-06 dim_u: 72 dim_v: 6
+SPLS: itr: 12 diff: 8.51e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 15 diff: 6.09e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 19 diff: 8.51e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 13 diff: 4.66e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 10 diff: 1.72e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 22 diff: 7.02e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 11 diff: 4.00e-06 dim_u: 63 dim_v: 3
+SPLS: itr: 23 diff: 5.63e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 8 diff: 4.83e-06 dim_u: 55 dim_v: 3
+SPLS: itr: 42 diff: 7.93e-06 dim_u: 72 dim_v: 9
+SPLS: itr: 18 diff: 4.46e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 18 diff: 8.38e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 36 diff: 9.74e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 19 diff: 8.01e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 13 diff: 4.57e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 15 diff: 4.93e-06 dim_u: 61 dim_v: 7
+0.36424
+SPLS: itr: 18 diff: 6.65e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 19 diff: 4.74e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 11 diff: 4.29e-06 dim_u: 52 dim_v: 4
+SPLS: itr: 106 diff: 4.19e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 23 diff: 8.10e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 13 diff: 8.65e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 17 diff: 6.69e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 19 diff: 6.65e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 24 diff: 9.10e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 12 diff: 5.51e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 38 diff: 7.82e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 12 diff: 4.41e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 17 diff: 4.88e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 10 diff: 3.56e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 14 diff: 7.82e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 18 diff: 5.31e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 21 diff: 7.47e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 15 diff: 9.42e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 13 diff: 9.81e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 10 diff: 7.82e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 13 diff: 8.99e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 15 diff: 6.99e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 11 diff: 6.07e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 27 diff: 7.03e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 13 diff: 3.07e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 24 diff: 9.16e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 13 diff: 5.07e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 12 diff: 6.09e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 17 diff: 9.79e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 29 diff: 8.60e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 10 diff: 6.58e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 10 diff: 3.76e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 9 diff: 8.62e-06 dim_u: 65 dim_v: 4
+0.38025
+SPLS: itr: 25 diff: 7.01e-06 dim_u: 70 dim_v: 6
+SPLS: itr: 20 diff: 5.57e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 37 diff: 9.11e-06 dim_u: 73 dim_v: 7
+SPLS: itr: 25 diff: 7.62e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 12 diff: 6.00e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 19 diff: 5.73e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 44 diff: 8.66e-06 dim_u: 70 dim_v: 7
+SPLS: itr: 12 diff: 4.26e-06 dim_u: 67 dim_v: 4
+0.38198
+SPLS: itr: 12 diff: 4.16e-06 dim_u: 72 dim_v: 6
+SPLS: itr: 11 diff: 5.41e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 13 diff: 4.24e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 40 diff: 8.81e-06 dim_u: 74 dim_v: 7
+SPLS: itr: 12 diff: 3.32e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 25 diff: 7.47e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 29 diff: 8.73e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 16 diff: 7.96e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 23 diff: 7.61e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 11 diff: 6.67e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 22 diff: 7.83e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 18 diff: 2.75e-06 dim_u: 63 dim_v: 4
+0.35579
+0.37311
+SPLS: itr: 22 diff: 6.07e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 21 diff: 7.25e-06 dim_u: 66 dim_v: 6
+0.36304
+SPLS: itr: 43 diff: 9.10e-06 dim_u: 66 dim_v: 5
+0.36911
diff --git a/Visualization_Module/28163-output.txt b/Visualization_Module/28163-output.txt
new file mode 100644
index 0000000..2738735
--- /dev/null
+++ b/Visualization_Module/28163-output.txt
@@ -0,0 +1,1010 @@
+SPLS: itr: 13 diff: 9.47e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 14 diff: 6.66e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 27 diff: 9.23e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 17 diff: 3.95e-06 dim_u: 74 dim_v: 7
+SPLS: itr: 27 diff: 9.23e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 30 diff: 6.36e-06 dim_u: 75 dim_v: 8
+SPLS: itr: 17 diff: 6.24e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 16 diff: 9.32e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 16 diff: 9.32e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 12 diff: 5.02e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 13 diff: 4.99e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 18 diff: 6.95e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 15 diff: 9.75e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 15 diff: 9.94e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 17 diff: 7.78e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 15 diff: 9.75e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 23 diff: 8.98e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 26 diff: 6.28e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 13 diff: 7.59e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 15 diff: 8.01e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 13 diff: 6.70e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 16 diff: 4.09e-06 dim_u: 65 dim_v: 9
+SPLS: itr: 13 diff: 6.70e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 15 diff: 8.21e-06 dim_u: 71 dim_v: 7
+SPLS: itr: 18 diff: 8.74e-06 dim_u: 73 dim_v: 7
+SPLS: itr: 15 diff: 8.25e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 13 diff: 8.44e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 17 diff: 6.78e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 15 diff: 7.12e-06 dim_u: 60 dim_v: 9
+SPLS: itr: 14 diff: 6.83e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 17 diff: 5.58e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 17 diff: 5.58e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 20 diff: 7.88e-06 dim_u: 73 dim_v: 6
+SPLS: itr: 16 diff: 4.21e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 16 diff: 8.03e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 13 diff: 6.26e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 13 diff: 5.75e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 19 diff: 6.13e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 25 diff: 7.33e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 16 diff: 4.89e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 13 diff: 8.44e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 30 diff: 6.31e-06 dim_u: 63 dim_v: 3
+SPLS: itr: 11 diff: 3.90e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 30 diff: 6.31e-06 dim_u: 63 dim_v: 3
+SPLS: itr: 14 diff: 4.92e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 23 diff: 9.21e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 14 diff: 3.28e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 26 diff: 9.88e-06 dim_u: 71 dim_v: 7
+SPLS: itr: 12 diff: 4.38e-06 dim_u: 72 dim_v: 4
+SPLS: itr: 12 diff: 4.38e-06 dim_u: 72 dim_v: 4
+SPLS: itr: 17 diff: 8.17e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 14 diff: 8.98e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 27 diff: 6.80e-06 dim_u: 62 dim_v: 8
+SPLS: itr: 13 diff: 9.34e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 13 diff: 2.88e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 15 diff: 4.81e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 17 diff: 6.46e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 11 diff: 4.97e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 17 diff: 6.46e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 28 diff: 8.76e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 15 diff: 8.53e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 15 diff: 9.89e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 32 diff: 7.71e-06 dim_u: 67 dim_v: 9
+SPLS: itr: 18 diff: 9.36e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 16 diff: 4.47e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 15 diff: 4.85e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 19 diff: 6.97e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 19 diff: 6.97e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 14 diff: 4.58e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 9 diff: 7.41e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 24 diff: 9.98e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 31 diff: 9.53e-06 dim_u: 69 dim_v: 7
+SPLS: itr: 13 diff: 3.02e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 18 diff: 6.48e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 17 diff: 9.88e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 20 diff: 6.03e-06 dim_u: 54 dim_v: 3
+SPLS: itr: 20 diff: 6.03e-06 dim_u: 54 dim_v: 3
+SPLS: itr: 8 diff: 1.47e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 16 diff: 5.91e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 8 diff: 1.47e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 12 diff: 5.37e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 38 diff: 8.31e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 23 diff: 7.40e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 30 diff: 8.75e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 9 diff: 2.20e-06 dim_u: 64 dim_v: 9
+SPLS: itr: 26 diff: 9.13e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 26 diff: 7.77e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 11 diff: 8.76e-06 dim_u: 70 dim_v: 4
+SPLS: itr: 27 diff: 8.38e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 17 diff: 8.51e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 16 diff: 6.82e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 18 diff: 7.64e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 12 diff: 4.24e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 35 diff: 8.35e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 35 diff: 8.35e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 24 diff: 9.08e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 17 diff: 7.28e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 22 diff: 5.25e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 18 diff: 7.47e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 14 diff: 8.21e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 21 diff: 9.35e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 14 diff: 8.21e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 15 diff: 8.01e-06 dim_u: 62 dim_v: 9
+SPLS: itr: 19 diff: 4.39e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 20 diff: 8.98e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 15 diff: 8.44e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 15 diff: 8.59e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 8 diff: 7.80e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 8 diff: 3.30e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 16 diff: 6.40e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 19 diff: 7.32e-06 dim_u: 68 dim_v: 8
+SPLS: itr: 37 diff: 7.85e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 23 diff: 6.56e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 16 diff: 9.76e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 29 diff: 7.94e-06 dim_u: 66 dim_v: 3
+SPLS: itr: 18 diff: 8.07e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 29 diff: 7.94e-06 dim_u: 66 dim_v: 3
+SPLS: itr: 15 diff: 9.83e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 9 diff: 2.12e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 19 diff: 3.08e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 20 diff: 8.53e-06 dim_u: 52 dim_v: 5
+SPLS: itr: 15 diff: 9.81e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 22 diff: 3.83e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 7 diff: 3.19e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 16 diff: 5.41e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 27 diff: 6.84e-06 dim_u: 66 dim_v: 8
+SPLS: itr: 22 diff: 3.83e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 7 diff: 2.69e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 37 diff: 7.89e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 38 diff: 9.96e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 9 diff: 2.88e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 18 diff: 7.39e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 12 diff: 4.99e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 14 diff: 4.01e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 26 diff: 9.23e-06 dim_u: 68 dim_v: 8
+SPLS: itr: 31 diff: 8.05e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 43 diff: 7.38e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 31 diff: 8.05e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 25 diff: 6.59e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 17 diff: 5.31e-06 dim_u: 67 dim_v: 8
+SPLS: itr: 17 diff: 5.79e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 20 diff: 7.35e-06 dim_u: 68 dim_v: 8
+SPLS: itr: 17 diff: 7.99e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 15 diff: 7.04e-06 dim_u: 62 dim_v: 8
+SPLS: itr: 29 diff: 7.10e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 49 diff: 9.21e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 29 diff: 7.10e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 17 diff: 7.48e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 51 diff: 9.50e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 18 diff: 4.58e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 12 diff: 6.75e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 22 diff: 6.93e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 55 diff: 8.53e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 14 diff: 6.47e-06 dim_u: 68 dim_v: 3
+SPLS: itr: 19 diff: 5.86e-06 dim_u: 58 dim_v: 9
+SPLS: itr: 14 diff: 6.47e-06 dim_u: 68 dim_v: 3
+SPLS: itr: 17 diff: 5.09e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 17 diff: 4.98e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 14 diff: 5.23e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 16 diff: 8.01e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 23 diff: 6.93e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 18 diff: 6.64e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 17 diff: 4.52e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 18 diff: 4.55e-06 dim_u: 62 dim_v: 8
+SPLS: itr: 17 diff: 4.52e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 17 diff: 9.71e-06 dim_u: 57 dim_v: 9
+SPLS: itr: 14 diff: 9.21e-06 dim_u: 73 dim_v: 4
+SPLS: itr: 19 diff: 8.02e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 22 diff: 7.46e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 21 diff: 5.56e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 18 diff: 6.82e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 42 diff: 8.29e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 18 diff: 7.75e-06 dim_u: 60 dim_v: 9
+SPLS: itr: 15 diff: 5.19e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 15 diff: 4.50e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 20 diff: 5.17e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 18 diff: 5.10e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 38 diff: 7.61e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 40 diff: 8.83e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 19 diff: 5.80e-06 dim_u: 71 dim_v: 4
+SPLS: itr: 40 diff: 8.83e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 21 diff: 8.11e-06 dim_u: 57 dim_v: 9
+SPLS: itr: 14 diff: 4.32e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 29 diff: 5.03e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 14 diff: 3.97e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 15 diff: 3.86e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 15 diff: 3.86e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 15 diff: 5.36e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 20 diff: 4.49e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 12 diff: 3.73e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 13 diff: 6.59e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 15 diff: 8.89e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 30 diff: 5.05e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 14 diff: 9.04e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 24 diff: 5.99e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 12 diff: 3.73e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 11 diff: 4.29e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 34 diff: 7.35e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 11 diff: 4.29e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 14 diff: 5.46e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 13 diff: 4.66e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 14 diff: 5.00e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 19 diff: 7.37e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 20 diff: 8.91e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 24 diff: 6.39e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 13 diff: 7.14e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 34 diff: 6.63e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 11 diff: 4.70e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 21 diff: 8.15e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 25 diff: 7.05e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 11 diff: 6.89e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 37 diff: 8.83e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 13 diff: 3.04e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 37 diff: 8.83e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 12 diff: 7.86e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 36 diff: 8.17e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 11 diff: 5.94e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 25 diff: 9.75e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 26 diff: 7.87e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 32 diff: 9.91e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 13 diff: 6.09e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 31 diff: 7.01e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 25 diff: 9.05e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 27 diff: 4.39e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 27 diff: 4.39e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 14 diff: 5.52e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 22 diff: 7.40e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 19 diff: 7.66e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 17 diff: 8.57e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 23 diff: 5.25e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 13 diff: 8.02e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 16 diff: 4.86e-06 dim_u: 54 dim_v: 10
+SPLS: itr: 36 diff: 8.07e-06 dim_u: 63 dim_v: 3
+SPLS: itr: 15 diff: 3.83e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 16 diff: 4.03e-06 dim_u: 53 dim_v: 10
+SPLS: itr: 17 diff: 9.12e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 36 diff: 8.07e-06 dim_u: 63 dim_v: 3
+SPLS: itr: 38 diff: 7.00e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 33 diff: 9.05e-06 dim_u: 80 dim_v: 6
+SPLS: itr: 16 diff: 5.35e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 53 diff: 9.19e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 13 diff: 8.98e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 12 diff: 3.29e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 13 diff: 8.98e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 17 diff: 5.33e-06 dim_u: 55 dim_v: 8
+SPLS: itr: 20 diff: 6.77e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 14 diff: 5.65e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 15 diff: 8.45e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 15 diff: 5.96e-06 dim_u: 60 dim_v: 8
+SPLS: itr: 24 diff: 8.51e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 19 diff: 8.02e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 21 diff: 9.35e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 30 diff: 9.99e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 30 diff: 6.53e-06 dim_u: 60 dim_v: 8
+SPLS: itr: 12 diff: 6.59e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 32 diff: 8.41e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 43 diff: 9.93e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 28 diff: 9.56e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 36 diff: 9.05e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 43 diff: 9.93e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 43 diff: 7.38e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 12 diff: 6.81e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 13 diff: 7.68e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 12 diff: 6.81e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 35 diff: 6.38e-06 dim_u: 61 dim_v: 9
+SPLS: itr: 27 diff: 9.30e-06 dim_u: 48 dim_v: 9
+SPLS: itr: 19 diff: 5.37e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 13 diff: 3.59e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 13 diff: 8.55e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 18 diff: 8.74e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 17 diff: 5.37e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 13 diff: 8.55e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 16 diff: 6.87e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 19 diff: 9.81e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 18 diff: 9.70e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 28 diff: 7.76e-06 dim_u: 48 dim_v: 9
+SPLS: itr: 18 diff: 9.70e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 24 diff: 5.46e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 60 diff: 9.80e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 13 diff: 3.94e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 26 diff: 6.04e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 20 diff: 5.07e-06 dim_u: 50 dim_v: 8
+SPLS: itr: 13 diff: 3.94e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 16 diff: 4.99e-06 dim_u: 54 dim_v: 10
+SPLS: itr: 40 diff: 9.36e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 26 diff: 7.05e-06 dim_u: 75 dim_v: 9
+SPLS: itr: 17 diff: 6.18e-06 dim_u: 78 dim_v: 7
+SPLS: itr: 15 diff: 3.08e-06 dim_u: 48 dim_v: 4
+SPLS: itr: 15 diff: 5.98e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 21 diff: 9.72e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 15 diff: 3.08e-06 dim_u: 48 dim_v: 4
+SPLS: itr: 54 diff: 9.91e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 13 diff: 3.70e-06 dim_u: 57 dim_v: 9
+SPLS: itr: 17 diff: 7.35e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 17 diff: 7.39e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 35 diff: 7.83e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 21 diff: 5.80e-06 dim_u: 51 dim_v: 9
+SPLS: itr: 15 diff: 3.87e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 17 diff: 7.35e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 9 diff: 5.55e-06 dim_u: 60 dim_v: 8
+SPLS: itr: 18 diff: 7.27e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 15 diff: 8.10e-06 dim_u: 80 dim_v: 7
+SPLS: itr: 15 diff: 8.18e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 22 diff: 6.64e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 22 diff: 6.64e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 27 diff: 7.35e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 14 diff: 5.36e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 12 diff: 6.81e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 33 diff: 7.30e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 27 diff: 5.66e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 30 diff: 8.04e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 14 diff: 6.24e-06 dim_u: 60 dim_v: 9
+SPLS: itr: 16 diff: 5.77e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 14 diff: 6.50e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 29 diff: 5.53e-06 dim_u: 59 dim_v: 8
+SPLS: itr: 16 diff: 4.32e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 55 diff: 6.83e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 27 diff: 8.12e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 34 diff: 7.04e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 31 diff: 7.00e-06 dim_u: 62 dim_v: 8
+SPLS: itr: 24 diff: 5.70e-06 dim_u: 50 dim_v: 8
+SPLS: itr: 18 diff: 5.21e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 19 diff: 6.26e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 13 diff: 8.63e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 27 diff: 6.16e-06 dim_u: 49 dim_v: 9
+SPLS: itr: 14 diff: 3.48e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 16 diff: 7.70e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 13 diff: 6.61e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 37 diff: 8.16e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 15 diff: 4.67e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 14 diff: 5.24e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 13 diff: 4.96e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 14 diff: 9.80e-06 dim_u: 70 dim_v: 7
+SPLS: itr: 13 diff: 5.40e-06 dim_u: 55 dim_v: 8
+SPLS: itr: 13 diff: 6.01e-06 dim_u: 66 dim_v: 4
+SPLS: itr: 15 diff: 7.19e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 15 diff: 5.83e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 12 diff: 9.86e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 15 diff: 4.45e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 22 diff: 6.87e-06 dim_u: 50 dim_v: 6
+SPLS: itr: 16 diff: 4.64e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 14 diff: 8.09e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 19 diff: 7.71e-06 dim_u: 50 dim_v: 6
+SPLS: itr: 121 diff: 9.32e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 11 diff: 6.67e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 121 diff: 9.32e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 7 diff: 3.44e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 15 diff: 6.40e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 7 diff: 3.44e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 17 diff: 9.20e-06 dim_u: 82 dim_v: 6
+SPLS: itr: 18 diff: 7.11e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 20 diff: 7.91e-06 dim_u: 83 dim_v: 6
+SPLS: itr: 13 diff: 6.79e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 40 diff: 8.91e-06 dim_u: 52 dim_v: 8
+SPLS: itr: 13 diff: 9.53e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 24 diff: 6.35e-06 dim_u: 49 dim_v: 8
+SPLS: itr: 19 diff: 6.57e-06 dim_u: 63 dim_v: 3
+SPLS: itr: 19 diff: 6.57e-06 dim_u: 63 dim_v: 3
+SPLS: itr: 13 diff: 3.81e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 14 diff: 5.54e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 13 diff: 4.10e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 34 diff: 6.89e-06 dim_u: 52 dim_v: 8
+SPLS: itr: 12 diff: 2.62e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 15 diff: 6.21e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 15 diff: 6.12e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 11 diff: 8.69e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 22 diff: 8.32e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 12 diff: 6.10e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 12 diff: 2.88e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 31 diff: 7.39e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 31 diff: 7.39e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 19 diff: 9.82e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 17 diff: 8.99e-06 dim_u: 48 dim_v: 6
+SPLS: itr: 19 diff: 6.59e-06 dim_u: 49 dim_v: 7
+SPLS: itr: 17 diff: 8.83e-06 dim_u: 51 dim_v: 8
+SPLS: itr: 24 diff: 6.44e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 18 diff: 8.05e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 18 diff: 6.33e-06 dim_u: 48 dim_v: 6
+SPLS: itr: 18 diff: 8.05e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 11 diff: 8.68e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 17 diff: 4.12e-06 dim_u: 52 dim_v: 8
+SPLS: itr: 13 diff: 6.11e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 16 diff: 6.88e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 16 diff: 9.53e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 13 diff: 6.11e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 13 diff: 9.32e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 30 diff: 6.41e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 35 diff: 9.18e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 24 diff: 9.70e-06 dim_u: 79 dim_v: 5
+SPLS: itr: 11 diff: 7.03e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 18 diff: 8.67e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 21 diff: 6.08e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 11 diff: 7.03e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 19 diff: 9.27e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 10 diff: 5.63e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 13 diff: 4.66e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 20 diff: 4.93e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 18 diff: 5.72e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 33 diff: 9.43e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 11 diff: 3.24e-06 dim_u: 60 dim_v: 8
+SPLS: itr: 24 diff: 3.71e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 13 diff: 5.49e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 24 diff: 3.71e-06 dim_u: 62 dim_v: 3
+SPLS: itr: 31 diff: 9.60e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 38 diff: 8.82e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 13 diff: 5.15e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 13 diff: 7.49e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 18 diff: 8.43e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 18 diff: 8.43e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 16 diff: 5.90e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 46 diff: 8.21e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 15 diff: 3.82e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 48 diff: 6.29e-06 dim_u: 72 dim_v: 8
+SPLS: itr: 16 diff: 5.60e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 32 diff: 1.00e-05 dim_u: 61 dim_v: 5
+SPLS: itr: 41 diff: 6.87e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 34 diff: 8.85e-06 dim_u: 49 dim_v: 6
+SPLS: itr: 61 diff: 8.57e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 34 diff: 8.85e-06 dim_u: 49 dim_v: 6
+SPLS: itr: 28 diff: 7.16e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 17 diff: 7.34e-06 dim_u: 56 dim_v: 9
+SPLS: itr: 12 diff: 5.57e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 18 diff: 6.84e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 7 diff: 2.04e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 17 diff: 5.39e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 15 diff: 6.91e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 58 diff: 8.89e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 15 diff: 6.91e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 10 diff: 9.44e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 14 diff: 7.41e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 18 diff: 6.73e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 13 diff: 6.92e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 12 diff: 4.67e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 38 diff: 5.51e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 17 diff: 7.96e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 19 diff: 8.86e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 13 diff: 5.29e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 43 diff: 8.31e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 75 diff: 7.68e-06 dim_u: 51 dim_v: 8
+SPLS: itr: 27 diff: 6.85e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 48 diff: 8.68e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 48 diff: 8.68e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 11 diff: 2.97e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 23 diff: 9.95e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 25 diff: 6.61e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 20 diff: 5.91e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 19 diff: 4.32e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 11 diff: 2.97e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 19 diff: 6.77e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 46 diff: 9.32e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 13 diff: 2.85e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 19 diff: 6.77e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 46 diff: 8.47e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 18 diff: 4.66e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 19 diff: 6.89e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 13 diff: 5.37e-06 dim_u: 55 dim_v: 3
+SPLS: itr: 28 diff: 8.58e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 19 diff: 8.39e-06 dim_u: 70 dim_v: 7
+SPLS: itr: 13 diff: 5.37e-06 dim_u: 55 dim_v: 3
+SPLS: itr: 72 diff: 8.84e-06 dim_u: 58 dim_v: 9
+SPLS: itr: 49 diff: 9.57e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 16 diff: 5.97e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 14 diff: 8.05e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 14 diff: 1.18e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 12 diff: 6.97e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 16 diff: 9.78e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 10 diff: 9.67e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 20 diff: 7.63e-06 dim_u: 70 dim_v: 7
+SPLS: itr: 26 diff: 4.39e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 18 diff: 5.11e-06 dim_u: 50 dim_v: 8
+SPLS: itr: 22 diff: 6.27e-06 dim_u: 52 dim_v: 7
+SPLS: itr: 15 diff: 2.91e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 12 diff: 5.80e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 18 diff: 4.97e-06 dim_u: 55 dim_v: 8
+SPLS: itr: 26 diff: 4.39e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 14 diff: 4.76e-06 dim_u: 51 dim_v: 7
+SPLS: itr: 12 diff: 2.95e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 12 diff: 4.71e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 23 diff: 5.24e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 19 diff: 8.26e-06 dim_u: 69 dim_v: 8
+SPLS: itr: 14 diff: 3.94e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 20 diff: 8.58e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 18 diff: 6.48e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 20 diff: 8.58e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 22 diff: 7.89e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 20 diff: 7.21e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 14 diff: 3.87e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 16 diff: 8.82e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 14 diff: 6.79e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 22 diff: 8.42e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 10 diff: 2.96e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 18 diff: 5.31e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 13 diff: 6.68e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 9 diff: 4.67e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 22 diff: 8.42e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 20 diff: 6.42e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 13 diff: 6.32e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 15 diff: 4.80e-06 dim_u: 53 dim_v: 9
+SPLS: itr: 39 diff: 9.13e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 13 diff: 6.32e-06 dim_u: 61 dim_v: 3
+SPLS: itr: 18 diff: 5.57e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 20 diff: 8.53e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 19 diff: 5.98e-06 dim_u: 49 dim_v: 5
+SPLS: itr: 20 diff: 7.75e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 9 diff: 5.35e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 11 diff: 9.06e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 20 diff: 7.75e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 23 diff: 8.18e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 29 diff: 8.84e-06 dim_u: 67 dim_v: 8
+SPLS: itr: 15 diff: 6.66e-06 dim_u: 52 dim_v: 9
+SPLS: itr: 19 diff: 8.68e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 17 diff: 6.88e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 46 diff: 9.20e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 15 diff: 7.54e-06 dim_u: 59 dim_v: 8
+SPLS: itr: 18 diff: 7.32e-06 dim_u: 69 dim_v: 7
+SPLS: itr: 19 diff: 8.68e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 13 diff: 9.23e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 34 diff: 4.87e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 42 diff: 8.68e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 16 diff: 3.85e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 22 diff: 6.10e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 16 diff: 3.85e-06 dim_u: 58 dim_v: 3
+SPLS: itr: 12 diff: 5.19e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 18 diff: 6.50e-06 dim_u: 49 dim_v: 5
+SPLS: itr: 25 diff: 7.75e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 19 diff: 7.94e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 12 diff: 7.75e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 18 diff: 4.62e-06 dim_u: 51 dim_v: 5
+SPLS: itr: 36 diff: 8.01e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 12 diff: 9.56e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 18 diff: 7.13e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 21 diff: 5.92e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 36 diff: 8.66e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 15 diff: 8.92e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 17 diff: 6.47e-06 dim_u: 70 dim_v: 5
+SPLS: itr: 33 diff: 5.94e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 41 diff: 6.43e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 22 diff: 4.00e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 38 diff: 8.26e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 22 diff: 6.72e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 23 diff: 5.84e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 14 diff: 7.78e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 10 diff: 6.18e-06 dim_u: 53 dim_v: 8
+SPLS: itr: 12 diff: 7.06e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 37 diff: 3.93e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 12 diff: 5.21e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 97 diff: 9.57e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 20 diff: 5.49e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 21 diff: 9.05e-06 dim_u: 67 dim_v: 9
+SPLS: itr: 15 diff: 6.96e-06 dim_u: 71 dim_v: 5
+SPLS: itr: 37 diff: 8.16e-06 dim_u: 61 dim_v: 8
+SPLS: itr: 97 diff: 9.57e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 23 diff: 5.38e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 13 diff: 7.99e-06 dim_u: 68 dim_v: 6
+SPLS: itr: 10 diff: 7.36e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 39 diff: 6.79e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 10 diff: 7.36e-06 dim_u: 60 dim_v: 3
+SPLS: itr: 11 diff: 6.95e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 13 diff: 8.12e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 12 diff: 5.56e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 31 diff: 9.59e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 22 diff: 5.78e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 28 diff: 8.78e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 22 diff: 7.36e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 22 diff: 5.78e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 22 diff: 7.34e-06 dim_u: 66 dim_v: 9
+SPLS: itr: 30 diff: 8.61e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 14 diff: 4.65e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 19 diff: 9.00e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 13 diff: 7.13e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 22 diff: 7.44e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 21 diff: 4.57e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 19 diff: 9.00e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 62 diff: 8.42e-06 dim_u: 61 dim_v: 9
+SPLS: itr: 16 diff: 5.93e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 18 diff: 5.28e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 15 diff: 7.58e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 24 diff: 5.61e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 19 diff: 5.24e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 34 diff: 5.75e-06 dim_u: 61 dim_v: 8
+SPLS: itr: 15 diff: 7.58e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 16 diff: 5.61e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 10 diff: 2.22e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 14 diff: 8.46e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 23 diff: 7.86e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 14 diff: 7.04e-06 dim_u: 59 dim_v: 8
+SPLS: itr: 21 diff: 6.53e-06 dim_u: 64 dim_v: 3
+SPLS: itr: 37 diff: 8.01e-06 dim_u: 76 dim_v: 4
+SPLS: itr: 30 diff: 9.75e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 30 diff: 9.75e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 17 diff: 5.07e-06 dim_u: 61 dim_v: 8
+SPLS: itr: 14 diff: 8.81e-06 dim_u: 69 dim_v: 6
+SPLS: itr: 15 diff: 7.45e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 55 diff: 9.60e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 21 diff: 6.27e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 27 diff: 8.57e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 24 diff: 7.11e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 37 diff: 9.45e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 16 diff: 5.34e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 34 diff: 8.64e-06 dim_u: 67 dim_v: 3
+SPLS: itr: 12 diff: 8.37e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 13 diff: 6.59e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 12 diff: 7.56e-06 dim_u: 50 dim_v: 4
+SPLS: itr: 27 diff: 6.07e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 34 diff: 8.64e-06 dim_u: 67 dim_v: 3
+SPLS: itr: 9 diff: 8.90e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 23 diff: 9.37e-06 dim_u: 52 dim_v: 8
+SPLS: itr: 9 diff: 3.81e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 16 diff: 8.29e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 19 diff: 4.66e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 9 diff: 8.90e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 12 diff: 6.19e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 13 diff: 6.33e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 17 diff: 5.57e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 22 diff: 9.82e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 13 diff: 6.33e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 12 diff: 4.46e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 14 diff: 5.00e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 22 diff: 6.27e-06 dim_u: 60 dim_v: 8
+SPLS: itr: 16 diff: 9.83e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 19 diff: 8.87e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 16 diff: 9.83e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 9 diff: 6.79e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 17 diff: 6.45e-06 dim_u: 55 dim_v: 11
+SPLS: itr: 10 diff: 1.96e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 19 diff: 6.68e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 9 diff: 6.79e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 31 diff: 7.98e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 31 diff: 9.46e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 39 diff: 9.35e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 12 diff: 6.05e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 18 diff: 5.51e-06 dim_u: 52 dim_v: 8
+SPLS: itr: 12 diff: 6.05e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 12 diff: 5.59e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 7 diff: 7.26e-06 dim_u: 59 dim_v: 3
+SPLS: itr: 12 diff: 6.50e-06 dim_u: 51 dim_v: 4
+SPLS: itr: 70 diff: 9.61e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 11 diff: 6.23e-06 dim_u: 65 dim_v: 8
+SPLS: itr: 18 diff: 9.31e-06 dim_u: 55 dim_v: 11
+SPLS: itr: 29 diff: 9.12e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 48 diff: 8.55e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 12 diff: 6.80e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 28 diff: 3.06e-06 dim_u: 56 dim_v: 3
+SPLS: itr: 14 diff: 5.81e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 28 diff: 3.06e-06 dim_u: 56 dim_v: 3
+SPLS: itr: 19 diff: 9.38e-06 dim_u: 50 dim_v: 5
+SPLS: itr: 22 diff: 9.22e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 31 diff: 7.85e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 17 diff: 3.82e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 12 diff: 3.09e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 26 diff: 6.78e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 14 diff: 6.06e-06 dim_u: 71 dim_v: 8
+SPLS: itr: 43 diff: 9.01e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 12 diff: 3.94e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 26 diff: 6.78e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 17 diff: 4.79e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 26 diff: 8.17e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 14 diff: 5.42e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 21 diff: 7.51e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 18 diff: 7.52e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 14 diff: 3.36e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 14 diff: 5.42e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 8 diff: 2.10e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 13 diff: 8.10e-06 dim_u: 62 dim_v: 8
+SPLS: itr: 19 diff: 8.49e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 18 diff: 9.24e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 51 diff: 9.61e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 14 diff: 6.52e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 19 diff: 8.49e-06 dim_u: 68 dim_v: 7
+SPLS: itr: 13 diff: 4.49e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 16 diff: 7.74e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 12 diff: 4.10e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 29 diff: 8.36e-06 dim_u: 55 dim_v: 10
+SPLS: itr: 10 diff: 3.42e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 36 diff: 8.80e-06 dim_u: 62 dim_v: 8
+SPLS: itr: 12 diff: 4.10e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 13 diff: 8.90e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 12 diff: 9.52e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 16 diff: 5.13e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 17 diff: 8.32e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 12 diff: 9.52e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 24 diff: 6.21e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 13 diff: 3.50e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 14 diff: 7.31e-06 dim_u: 66 dim_v: 6
+SPLS: itr: 12 diff: 5.51e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 17 diff: 4.15e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 17 diff: 6.34e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 63 diff: 7.62e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 35 diff: 8.30e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 17 diff: 9.66e-06 dim_u: 65 dim_v: 7
+SPLS: itr: 20 diff: 8.92e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 42 diff: 9.18e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 18 diff: 5.05e-06 dim_u: 66 dim_v: 8
+SPLS: itr: 18 diff: 5.14e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 62 diff: 9.49e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 42 diff: 9.18e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 15 diff: 9.33e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 14 diff: 4.93e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 17 diff: 8.93e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 12 diff: 3.17e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 23 diff: 6.07e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 25 diff: 5.78e-06 dim_u: 60 dim_v: 8
+SPLS: itr: 20 diff: 5.49e-06 dim_u: 63 dim_v: 8
+SPLS: itr: 12 diff: 5.40e-06 dim_u: 56 dim_v: 7
+SPLS: itr: 23 diff: 6.07e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 32 diff: 9.58e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 14 diff: 4.53e-06 dim_u: 59 dim_v: 8
+SPLS: itr: 10 diff: 2.31e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 12 diff: 5.35e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 15 diff: 6.07e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 16 diff: 5.47e-06 dim_u: 53 dim_v: 7
+SPLS: itr: 14 diff: 6.64e-06 dim_u: 55 dim_v: 10
+SPLS: itr: 45 diff: 9.75e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 24 diff: 8.92e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 14 diff: 6.01e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 18 diff: 8.35e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 14 diff: 6.20e-06 dim_u: 58 dim_v: 6
+SPLS: itr: 24 diff: 8.92e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 15 diff: 5.82e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 24 diff: 8.36e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 11 diff: 7.40e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 11 diff: 3.99e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 13 diff: 8.82e-06 dim_u: 55 dim_v: 9
+SPLS: itr: 15 diff: 4.55e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 19 diff: 8.52e-06 dim_u: 72 dim_v: 7
+SPLS: itr: 14 diff: 9.11e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 14 diff: 8.25e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 9 diff: 8.42e-06 dim_u: 54 dim_v: 4
+SPLS: itr: 37 diff: 6.93e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 21 diff: 8.53e-06 dim_u: 71 dim_v: 7
+SPLS: itr: 11 diff: 4.97e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 26 diff: 7.66e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 40 diff: 8.87e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 13 diff: 3.80e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 17 diff: 4.26e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 40 diff: 8.87e-06 dim_u: 57 dim_v: 3
+SPLS: itr: 9 diff: 8.93e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 14 diff: 4.73e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 9 diff: 8.93e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 27 diff: 9.23e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 40 diff: 9.54e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 15 diff: 5.47e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 18 diff: 7.64e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 56 diff: 8.02e-06 dim_u: 64 dim_v: 8
+SPLS: itr: 23 diff: 9.98e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 41 diff: 8.56e-06 dim_u: 61 dim_v: 8
+SPLS: itr: 11 diff: 4.70e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 10 diff: 9.64e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 12 diff: 3.28e-06 dim_u: 68 dim_v: 4
+SPLS: itr: 10 diff: 5.07e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 18 diff: 4.90e-06 dim_u: 73 dim_v: 8
+SPLS: itr: 29 diff: 7.80e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 13 diff: 3.67e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 17 diff: 7.75e-06 dim_u: 73 dim_v: 7
+SPLS: itr: 29 diff: 7.80e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 15 diff: 4.86e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 21 diff: 8.08e-06 dim_u: 56 dim_v: 11
+SPLS: itr: 22 diff: 9.69e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 22 diff: 6.39e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 19 diff: 7.00e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 20 diff: 9.59e-06 dim_u: 56 dim_v: 11
+SPLS: itr: 49 diff: 8.79e-06 dim_u: 57 dim_v: 8
+SPLS: itr: 27 diff: 7.98e-06 dim_u: 70 dim_v: 8
+SPLS: itr: 14 diff: 5.35e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 22 diff: 6.39e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 13 diff: 7.85e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 30 diff: 9.90e-06 dim_u: 69 dim_v: 7
+SPLS: itr: 18 diff: 6.20e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 14 diff: 8.77e-06 dim_u: 59 dim_v: 8
+SPLS: itr: 13 diff: 3.94e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 14 diff: 5.11e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 18 diff: 6.20e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 12 diff: 3.56e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 15 diff: 5.95e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 16 diff: 5.17e-06 dim_u: 59 dim_v: 8
+SPLS: itr: 27 diff: 8.49e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 14 diff: 7.79e-06 dim_u: 66 dim_v: 7
+SPLS: itr: 11 diff: 8.80e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 12 diff: 3.25e-06 dim_u: 60 dim_v: 6
+SPLS: itr: 30 diff: 6.67e-06 dim_u: 72 dim_v: 8
+SPLS: itr: 29 diff: 8.68e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 22 diff: 7.07e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 33 diff: 7.48e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 29 diff: 8.68e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 27 diff: 6.40e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 7 diff: 4.91e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 20 diff: 9.08e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 14 diff: 9.14e-06 dim_u: 75 dim_v: 9
+SPLS: itr: 7 diff: 4.91e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 18 diff: 5.18e-06 dim_u: 53 dim_v: 9
+SPLS: itr: 22 diff: 7.03e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 11 diff: 5.77e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 13 diff: 4.06e-06 dim_u: 74 dim_v: 7
+SPLS: itr: 14 diff: 6.80e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 15 diff: 4.11e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 78 diff: 9.03e-06 dim_u: 61 dim_v: 9
+SPLS: itr: 11 diff: 7.19e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 12 diff: 3.72e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 23 diff: 7.22e-06 dim_u: 61 dim_v: 8
+SPLS: itr: 13 diff: 6.17e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 28 diff: 8.12e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 12 diff: 7.96e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 24 diff: 8.38e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 12 diff: 9.71e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 28 diff: 8.12e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 12 diff: 4.25e-06 dim_u: 61 dim_v: 6
+SPLS: itr: 14 diff: 6.90e-06 dim_u: 52 dim_v: 9
+SPLS: itr: 33 diff: 8.25e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 10 diff: 2.27e-06 dim_u: 55 dim_v: 7
+SPLS: itr: 27 diff: 6.32e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 14 diff: 8.83e-06 dim_u: 51 dim_v: 8
+SPLS: itr: 27 diff: 8.89e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 12 diff: 8.15e-06 dim_u: 62 dim_v: 6
+SPLS: itr: 21 diff: 7.21e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 22 diff: 7.32e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 27 diff: 6.32e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 10 diff: 3.98e-06 dim_u: 54 dim_v: 7
+SPLS: itr: 28 diff: 9.52e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 32 diff: 7.33e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 11 diff: 2.50e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 15 diff: 8.68e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 26 diff: 7.66e-06 dim_u: 65 dim_v: 9
+SPLS: itr: 18 diff: 4.83e-06 dim_u: 55 dim_v: 8
+SPLS: itr: 19 diff: 9.05e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 36 diff: 9.05e-06 dim_u: 64 dim_v: 3
+SPLS: itr: 17 diff: 4.98e-06 dim_u: 66 dim_v: 5
+SPLS: itr: 11 diff: 5.40e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 36 diff: 9.05e-06 dim_u: 64 dim_v: 3
+SPLS: itr: 11 diff: 6.41e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 23 diff: 7.26e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 35 diff: 7.73e-06 dim_u: 69 dim_v: 9
+SPLS: itr: 19 diff: 8.03e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 17 diff: 8.58e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 12 diff: 3.51e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 19 diff: 5.50e-06 dim_u: 62 dim_v: 7
+SPLS: itr: 31 diff: 6.15e-06 dim_u: 60 dim_v: 9
+SPLS: itr: 11 diff: 2.81e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 17 diff: 8.58e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 16 diff: 6.62e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 15 diff: 6.66e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 27 diff: 5.86e-06 dim_u: 58 dim_v: 8
+SPLS: itr: 16 diff: 6.62e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 23 diff: 7.44e-06 dim_u: 64 dim_v: 7
+SPLS: itr: 21 diff: 9.37e-06 dim_u: 64 dim_v: 8
+SPLS: itr: 27 diff: 9.49e-06 dim_u: 58 dim_v: 9
+SPLS: itr: 28 diff: 9.80e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 39 diff: 9.92e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 24 diff: 8.44e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 13 diff: 6.43e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 24 diff: 8.44e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 13 diff: 2.55e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 25 diff: 7.06e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 14 diff: 7.77e-06 dim_u: 58 dim_v: 9
+SPLS: itr: 37 diff: 9.51e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 15 diff: 5.42e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 31 diff: 8.58e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 21 diff: 5.82e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 17 diff: 4.45e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 12 diff: 7.79e-06 dim_u: 56 dim_v: 8
+SPLS: itr: 16 diff: 4.59e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 15 diff: 5.32e-06 dim_u: 55 dim_v: 6
+SPLS: itr: 21 diff: 5.82e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 9 diff: 3.00e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 16 diff: 9.58e-06 dim_u: 55 dim_v: 8
+SPLS: itr: 9 diff: 6.34e-06 dim_u: 56 dim_v: 4
+0.42401
+SPLS: itr: 17 diff: 8.25e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 16 diff: 5.67e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 13 diff: 7.82e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 9 diff: 3.00e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 12 diff: 4.12e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 9 diff: 8.66e-06 dim_u: 51 dim_v: 4
+SPLS: itr: 17 diff: 7.78e-06 dim_u: 55 dim_v: 8
+SPLS: itr: 12 diff: 4.28e-06 dim_u: 53 dim_v: 8
+0.43617
+SPLS: itr: 9 diff: 8.66e-06 dim_u: 51 dim_v: 4
+SPLS: itr: 12 diff: 7.50e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 15 diff: 4.78e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 20 diff: 6.70e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 19 diff: 6.13e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 15 diff: 4.78e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 24 diff: 9.57e-06 dim_u: 59 dim_v: 4
+SPLS: itr: 21 diff: 6.37e-06 dim_u: 69 dim_v: 7
+SPLS: itr: 26 diff: 6.78e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 17 diff: 4.96e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 24 diff: 6.73e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 9 diff: 8.07e-06 dim_u: 57 dim_v: 4
+SPLS: itr: 22 diff: 7.42e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 24 diff: 6.73e-06 dim_u: 65 dim_v: 4
+SPLS: itr: 14 diff: 4.46e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 14 diff: 7.32e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 23 diff: 5.75e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 16 diff: 6.02e-06 dim_u: 53 dim_v: 4
+SPLS: itr: 35 diff: 8.64e-06 dim_u: 65 dim_v: 6
+SPLS: itr: 19 diff: 4.78e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 34 diff: 6.80e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 23 diff: 5.75e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 18 diff: 5.22e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 16 diff: 8.07e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 27 diff: 8.30e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 12 diff: 8.98e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 18 diff: 6.88e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 16 diff: 6.34e-06 dim_u: 67 dim_v: 7
+SPLS: itr: 23 diff: 7.32e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 27 diff: 8.30e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 9 diff: 4.98e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 9 diff: 4.98e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 32 diff: 7.79e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 20 diff: 4.60e-06 dim_u: 69 dim_v: 5
+SPLS: itr: 29 diff: 7.64e-06 dim_u: 63 dim_v: 6
+SPLS: itr: 22 diff: 7.69e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 24 diff: 7.13e-06 dim_u: 67 dim_v: 5
+SPLS: itr: 16 diff: 5.23e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 7 diff: 6.40e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 22 diff: 5.53e-06 dim_u: 58 dim_v: 4
+0.43148
+SPLS: itr: 14 diff: 8.45e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 22 diff: 5.53e-06 dim_u: 58 dim_v: 4
+SPLS: itr: 16 diff: 8.24e-06 dim_u: 63 dim_v: 7
+0.43148
+SPLS: itr: 24 diff: 8.00e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 27 diff: 6.96e-06 dim_u: 71 dim_v: 5
+SPLS: itr: 28 diff: 7.26e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 38 diff: 6.40e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 22 diff: 7.01e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 24 diff: 7.86e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 9 diff: 2.55e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 24 diff: 7.15e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 13 diff: 6.18e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 17 diff: 8.46e-06 dim_u: 65 dim_v: 5
+SPLS: itr: 15 diff: 3.57e-06 dim_u: 75 dim_v: 6
+SPLS: itr: 27 diff: 6.69e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 15 diff: 9.41e-06 dim_u: 78 dim_v: 5
+SPLS: itr: 26 diff: 7.10e-06 dim_u: 71 dim_v: 5
+SPLS: itr: 22 diff: 9.47e-06 dim_u: 70 dim_v: 5
+SPLS: itr: 25 diff: 9.41e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 34 diff: 7.83e-06 dim_u: 68 dim_v: 5
+SPLS: itr: 27 diff: 6.45e-06 dim_u: 60 dim_v: 7
+SPLS: itr: 28 diff: 9.31e-06 dim_u: 65 dim_v: 3
+SPLS: itr: 14 diff: 6.44e-06 dim_u: 50 dim_v: 7
+SPLS: itr: 27 diff: 5.67e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 10 diff: 2.17e-06 dim_u: 51 dim_v: 6
+SPLS: itr: 15 diff: 7.20e-06 dim_u: 67 dim_v: 6
+SPLS: itr: 9 diff: 9.44e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 36 diff: 8.95e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 11 diff: 8.85e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 17 diff: 5.37e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 22 diff: 4.61e-06 dim_u: 59 dim_v: 6
+SPLS: itr: 14 diff: 4.37e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 21 diff: 7.76e-06 dim_u: 67 dim_v: 9
+SPLS: itr: 17 diff: 8.84e-06 dim_u: 63 dim_v: 7
+SPLS: itr: 18 diff: 8.81e-06 dim_u: 75 dim_v: 5
+SPLS: itr: 33 diff: 6.90e-06 dim_u: 62 dim_v: 4
+SPLS: itr: 27 diff: 6.63e-06 dim_u: 54 dim_v: 8
+SPLS: itr: 38 diff: 7.66e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 20 diff: 8.15e-06 dim_u: 60 dim_v: 5
+SPLS: itr: 30 diff: 8.21e-06 dim_u: 54 dim_v: 6
+SPLS: itr: 9 diff: 4.48e-06 dim_u: 49 dim_v: 6
+SPLS: itr: 15 diff: 6.99e-06 dim_u: 64 dim_v: 5
+SPLS: itr: 16 diff: 4.45e-06 dim_u: 64 dim_v: 6
+SPLS: itr: 13 diff: 8.58e-06 dim_u: 53 dim_v: 5
+SPLS: itr: 27 diff: 8.39e-06 dim_u: 59 dim_v: 7
+SPLS: itr: 25 diff: 8.88e-06 dim_u: 58 dim_v: 7
+SPLS: itr: 114 diff: 8.12e-06 dim_u: 64 dim_v: 4
+SPLS: itr: 19 diff: 8.56e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 20 diff: 5.40e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 10 diff: 4.12e-06 dim_u: 57 dim_v: 7
+SPLS: itr: 10 diff: 4.33e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 19 diff: 5.98e-06 dim_u: 61 dim_v: 7
+SPLS: itr: 16 diff: 4.94e-06 dim_u: 63 dim_v: 5
+SPLS: itr: 16 diff: 9.32e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 21 diff: 8.08e-06 dim_u: 76 dim_v: 5
+0.42804
+SPLS: itr: 19 diff: 6.75e-06 dim_u: 55 dim_v: 5
+SPLS: itr: 22 diff: 7.99e-06 dim_u: 73 dim_v: 5
+0.43432
+SPLS: itr: 21 diff: 8.32e-06 dim_u: 58 dim_v: 5
+SPLS: itr: 10 diff: 3.67e-06 dim_u: 55 dim_v: 4
+SPLS: itr: 17 diff: 8.35e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 9 diff: 3.19e-06 dim_u: 50 dim_v: 5
+SPLS: itr: 9 diff: 5.35e-06 dim_u: 50 dim_v: 5
+SPLS: itr: 21 diff: 6.79e-06 dim_u: 71 dim_v: 5
+SPLS: itr: 13 diff: 5.24e-06 dim_u: 52 dim_v: 5
+SPLS: itr: 15 diff: 9.72e-06 dim_u: 54 dim_v: 5
+SPLS: itr: 10 diff: 2.35e-06 dim_u: 56 dim_v: 4
+SPLS: itr: 9 diff: 3.98e-06 dim_u: 50 dim_v: 5
+SPLS: itr: 21 diff: 5.38e-06 dim_u: 62 dim_v: 5
+SPLS: itr: 32 diff: 6.62e-06 dim_u: 61 dim_v: 4
+SPLS: itr: 74 diff: 8.49e-06 dim_u: 53 dim_v: 6
+SPLS: itr: 14 diff: 5.55e-06 dim_u: 52 dim_v: 5
+SPLS: itr: 18 diff: 5.07e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 22 diff: 4.24e-06 dim_u: 60 dim_v: 4
+SPLS: itr: 32 diff: 8.69e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 10 diff: 2.58e-06 dim_u: 57 dim_v: 6
+SPLS: itr: 34 diff: 7.58e-06 dim_u: 67 dim_v: 4
+SPLS: itr: 21 diff: 7.01e-06 dim_u: 63 dim_v: 4
+SPLS: itr: 22 diff: 8.62e-06 dim_u: 61 dim_v: 5
+SPLS: itr: 22 diff: 6.57e-06 dim_u: 54 dim_v: 5
+0.43614
+SPLS: itr: 24 diff: 5.66e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 10 diff: 2.71e-06 dim_u: 56 dim_v: 6
+SPLS: itr: 9 diff: 7.97e-06 dim_u: 56 dim_v: 5
+SPLS: itr: 25 diff: 6.32e-06 dim_u: 57 dim_v: 5
+SPLS: itr: 10 diff: 2.06e-06 dim_u: 59 dim_v: 5
+SPLS: itr: 25 diff: 8.29e-06 dim_u: 56 dim_v: 5
+0.44492
+SPLS: itr: 28 diff: 7.10e-06 dim_u: 58 dim_v: 5
+0.44075
+SPLS: itr: 27 diff: 8.87e-06 dim_u: 56 dim_v: 5
+0.43734
diff --git a/Visualization_Module/30081-output.txt b/Visualization_Module/30081-output.txt
new file mode 100644
index 0000000..5a4cc1b
--- /dev/null
+++ b/Visualization_Module/30081-output.txt
@@ -0,0 +1,16 @@
+Error using load
+Unable to read file 'cucv.mat'. No such file or directory.
+
+Error in dp_RHO_avg_k_AR_DP (line 5)
+
+
+
+MATLAB:load:couldNotReadFile
+Error using load
+Unable to read file 'cucv.mat'. No such file or directory.
+
+Error in dp_RHO_avg_k_AR_DP (line 5)
+
+
+
+MATLAB:load:couldNotReadFile
diff --git a/Visualization_Module/AR_create_standalone.m b/Visualization_Module/AR_create_standalone.m
new file mode 100644
index 0000000..567a3a3
--- /dev/null
+++ b/Visualization_Module/AR_create_standalone.m
@@ -0,0 +1,11 @@
+% script AR_create_standalone
+% Fun = function to create a standalone from
+% Dir = directory of the subfunctions
+
+mkdir('/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox_standalone')
+cd('/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox')
+eval(['mcc -m /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox_standalone/dp_spls_standalone.m '...
+ '-d /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox_standalone/main']);
+
+test = system('qsub /volume/DP_FEF/ScrFun/ScriptsRepository/DP_SPLS_standalone.sh');
+
diff --git a/Visualization_Module/DP_SPLS_para_FEF b/Visualization_Module/DP_SPLS_para_FEF
new file mode 100644
index 0000000..cd2cd8e
Binary files /dev/null and b/Visualization_Module/DP_SPLS_para_FEF differ
diff --git a/Visualization_Module/Monteiro2016_JNsciMeth_SPLS.pdf b/Visualization_Module/Monteiro2016_JNsciMeth_SPLS.pdf
new file mode 100644
index 0000000..5877e16
Binary files /dev/null and b/Visualization_Module/Monteiro2016_JNsciMeth_SPLS.pdf differ
diff --git a/Visualization_Module/ar_write_image.m b/Visualization_Module/ar_write_image.m
new file mode 100644
index 0000000..545d3d3
--- /dev/null
+++ b/Visualization_Module/ar_write_image.m
@@ -0,0 +1,12 @@
+%% test Anne
+
+mask_path = NM.brainmask{1}; %as nii
+
+ImgData = spm_vol(mask_path);
+ImgDataData = spm_read_vols(ImgData);
+
+ImgDataData(ImgDataData >= 0) = final_parameters{1,4}(:,1)';
+
+ImgData.fname = '/volume/DP_FEF/Analysis/17-Apr-2018/LV1BrainWeights.nii';
+
+spm_write_vol(ImgData,ImgDataData);
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg.prj b/Visualization_Module/dp_RHO_avg.prj
new file mode 100644
index 0000000..b3b250f
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg.prj
@@ -0,0 +1,116 @@
+
+
+ dp_RHO_avg
+
+
+ 1.0
+
+
+
+
+
+
+
+
+ /dp_RHO_avg/
+ option.installpath.user
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg/for_testing
+ ${PROJECT_ROOT}/dp_RHO_avg/for_redistribution_files_only
+ ${PROJECT_ROOT}/dp_RHO_avg/for_redistribution
+ false
+
+ true
+ subtarget.standalone
+
+
+ - 35000
+ - 35010
+ - 35001
+
+ true
+ false
+ false
+ MyAppInstaller_web
+ MyAppInstaller_mcr
+ MyAppInstaller_app
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_k_AR.m
+
+
+ /volume/DP_FEF/Doc/SPLS/spls.m
+ ${PROJECT_ROOT}/dp_partition_holdout.m
+
+
+
+ /volume/DP_FEF/ScrFun/ScriptsRepository/dp_RHO_avg/for_testing/splash.png
+ /volume/DP_FEF/ScrFun/ScriptsRepository/dp_RHO_avg/for_testing/readme.txt
+ /volume/DP_FEF/ScrFun/ScriptsRepository/dp_RHO_avg/for_testing/run_dp_RHO_avg.sh
+ /volume/DP_FEF/ScrFun/ScriptsRepository/dp_RHO_avg/for_testing/dp_RHO_avg
+
+
+
+ /opt/matlab/R2015a
+
+
+
+
+
+ true
+
+
+
+
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ 3.10.0-693.17.1.el7.x86_64
+ false
+ true
+ glnxa64
+ true
+
+
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg_1.prj b/Visualization_Module/dp_RHO_avg_1.prj
new file mode 100644
index 0000000..4c82e09
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_1.prj
@@ -0,0 +1,116 @@
+
+
+ dp_RHO_avg_1
+
+
+ 1.0
+
+
+
+
+
+
+
+
+ /dp_RHO_avg_1/
+ option.installpath.user
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_1/for_testing
+ ${PROJECT_ROOT}/dp_RHO_avg_1/for_redistribution_files_only
+ ${PROJECT_ROOT}/dp_RHO_avg_1/for_redistribution
+ false
+
+ true
+ subtarget.standalone
+
+
+ - 35000
+ - 35010
+ - 35001
+
+ true
+ false
+ false
+ MyAppInstaller_web
+ MyAppInstaller_mcr
+ MyAppInstaller_app
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_k_AR.m
+
+
+ /volume/DP_FEF/Doc/SPLS/spls.m
+ ${PROJECT_ROOT}/dp_partition_holdout.m
+
+
+
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_1/for_testing/splash.png
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_1/for_testing/readme.txt
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_1/for_testing/run_dp_RHO_avg_1.sh
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_1/for_testing/dp_RHO_avg_1
+
+
+
+ /opt/matlab/R2015a
+
+
+
+
+
+ true
+
+
+
+
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ 3.10.0-693.17.1.el7.x86_64
+ false
+ true
+ glnxa64
+ true
+
+
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg_100k.m b/Visualization_Module/dp_RHO_avg_100k.m
new file mode 100644
index 0000000..37803b6
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_100k.m
@@ -0,0 +1,13 @@
+%% new function for cu/cv combination and 100 splits
+
+function dp_RHO_avg_100k(i, cu_str, cv_str, tp_str, hyperopt_folder)
+
+cu = str2double(cu_str); cv = str2double(cv_str); tp = str2double(tp_str);
+load([hyperopt_folder '/keep_in_partition.mat']);
+RHO = dp_k_split(tp, keep_in_data_x, keep_in_data_y, cu, cv);
+
+FID_RHO = fopen([hyperopt_folder '/RHO_' i '.txt'],'w');
+fprintf(FID_RHO, '%.4f', RHO);
+fclose(FID_RHO);
+
+end
diff --git a/Visualization_Module/dp_RHO_avg_3.prj b/Visualization_Module/dp_RHO_avg_3.prj
new file mode 100644
index 0000000..cdbca49
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_3.prj
@@ -0,0 +1,116 @@
+
+
+ dp_RHO_avg_3
+
+
+ 1.0
+
+
+
+
+
+
+
+
+ /dp_RHO_avg_3/
+ option.installpath.user
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_3/for_testing
+ ${PROJECT_ROOT}/dp_RHO_avg_3/for_redistribution_files_only
+ ${PROJECT_ROOT}/dp_RHO_avg_3/for_redistribution
+ false
+
+ true
+ subtarget.standalone
+
+
+ - 35000
+ - 35010
+ - 35001
+
+ true
+ false
+ false
+ MyAppInstaller_web
+ MyAppInstaller_mcr
+ MyAppInstaller_app
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_k_AR.m
+
+
+ /volume/DP_FEF/Doc/SPLS/spls.m
+ ${PROJECT_ROOT}/dp_partition_holdout.m
+
+
+
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_3/for_testing/dp_RHO_avg_3
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_3/for_testing/splash.png
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_3/for_testing/readme.txt
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_3/for_testing/run_dp_RHO_avg_3.sh
+
+
+
+ /opt/matlab/R2015a
+
+
+
+
+
+ true
+
+
+
+
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ 3.10.0-693.17.1.el7.x86_64
+ false
+ true
+ glnxa64
+ true
+
+
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg_4.prj b/Visualization_Module/dp_RHO_avg_4.prj
new file mode 100644
index 0000000..12779dd
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_4.prj
@@ -0,0 +1,118 @@
+
+
+ dp_RHO_avg_4
+
+
+ 1.0
+
+
+
+
+
+
+
+
+ /dp_RHO_avg_4/
+ option.installpath.user
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_4/for_testing
+ ${PROJECT_ROOT}/dp_RHO_avg_4/for_redistribution_files_only
+ ${PROJECT_ROOT}/dp_RHO_avg_4/for_redistribution
+ false
+
+ true
+ subtarget.standalone
+
+
+ - 35000
+ - 35010
+ - 35001
+
+ true
+ false
+ false
+ MyAppInstaller_web
+ MyAppInstaller_mcr
+ MyAppInstaller_app
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_k_AR.m
+
+
+ /opt/SPM/spm12/external/fieldtrip/fileio/@uint64/abs.m
+ /volume/DP_FEF/Doc/SPLS/spls.m
+ ${PROJECT_ROOT}/dp_matfile.m
+ ${PROJECT_ROOT}/dp_partition_holdout.m
+
+
+
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_4/for_testing/dp_RHO_avg_4
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_4/for_testing/readme.txt
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_4/for_testing/run_dp_RHO_avg_4.sh
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_4/for_testing/splash.png
+
+
+
+ /opt/matlab/R2015a
+
+
+
+
+
+ true
+
+
+
+
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ 3.10.0-693.17.1.el7.x86_64
+ false
+ true
+ glnxa64
+ true
+
+
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg_5.prj b/Visualization_Module/dp_RHO_avg_5.prj
new file mode 100644
index 0000000..4cb0521
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_5.prj
@@ -0,0 +1,117 @@
+
+
+ dp_RHO_avg_5
+
+
+ 1.0
+
+
+
+
+
+
+
+
+ /dp_RHO_avg_5/
+ option.installpath.user
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_5/for_testing
+ ${PROJECT_ROOT}/dp_RHO_avg_5/for_redistribution_files_only
+ ${PROJECT_ROOT}/dp_RHO_avg_5/for_redistribution
+ false
+
+ true
+ subtarget.standalone
+
+
+ - 35000
+ - 35010
+ - 35001
+
+ true
+ false
+ false
+ MyAppInstaller_web
+ MyAppInstaller_mcr
+ MyAppInstaller_app
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_k_AR.m
+
+
+ /opt/SPM/spm12/external/fieldtrip/fileio/@uint64/abs.m
+ /volume/DP_FEF/Doc/SPLS/spls.m
+ ${PROJECT_ROOT}/dp_partition_holdout.m
+
+
+
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_5/for_testing/splash.png
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_5/for_testing/readme.txt
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_5/for_testing/run_dp_RHO_avg_5.sh
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_5/for_testing/dp_RHO_avg_5
+
+
+
+ /opt/matlab/R2015a
+
+
+
+
+
+ true
+
+
+
+
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ 3.10.0-693.17.1.el7.x86_64
+ false
+ true
+ glnxa64
+ true
+
+
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg_6.prj b/Visualization_Module/dp_RHO_avg_6.prj
new file mode 100644
index 0000000..aa1d8ba
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_6.prj
@@ -0,0 +1,117 @@
+
+
+ dp_RHO_avg_6
+
+
+ 1.0
+
+
+
+
+
+
+
+
+ /dp_RHO_avg_6/
+ option.installpath.user
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_6/for_testing
+ ${PROJECT_ROOT}/dp_RHO_avg_6/for_redistribution_files_only
+ ${PROJECT_ROOT}/dp_RHO_avg_6/for_redistribution
+ false
+
+ true
+ subtarget.standalone
+
+
+ - 35000
+ - 35010
+ - 35001
+
+ true
+ false
+ false
+ MyAppInstaller_web
+ MyAppInstaller_mcr
+ MyAppInstaller_app
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_k_AR_DP.m
+
+
+ /opt/SPM/spm12/external/fieldtrip/fileio/@uint64/abs.m
+ /volume/DP_FEF/Doc/SPLS/spls.m
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_partition_holdout.m
+
+
+
+ /volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO/dp_RHO_avg_6/for_testing/readme.txt
+ /volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO/dp_RHO_avg_6/for_testing/dp_RHO_avg_6
+ /volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO/dp_RHO_avg_6/for_testing/splash.png
+ /volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO/dp_RHO_avg_6/for_testing/run_dp_RHO_avg_6.sh
+
+
+
+ /opt/matlab/R2015a
+
+
+
+
+
+ true
+
+
+
+
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ 3.10.0-693.17.1.el7.x86_64
+ false
+ true
+ glnxa64
+ true
+
+
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg_k.m b/Visualization_Module/dp_RHO_avg_k.m
new file mode 100644
index 0000000..b011af1
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_k.m
@@ -0,0 +1,57 @@
+%% new function for cu/cv combination and 100 splits
+
+function [RHO_avg] = dp_RHO_avg_k(output_folder, input_folder, cu_cv_file, K_file, keepin_X_split, columns_X_file, keepin_Y_split, columns_Y_file)
+
+input_names = {cu_cv_file K_file keepin_X_split keepin_Y_split};
+
+for i=1:numel(input_names)
+ formatSpec = '%f';
+ fileID = fopen([input_folder input_names{i}],'r');
+ switch input_names{i}
+ case keepin_X_split
+ fileID_columns = fopen([input_folder columns_X_file],'r');
+ columns = fscanf(fileID_columns,formatSpec);
+ size=[columns Inf];
+ keep_in_data_x = fscanf(fileID, formatSpec, size)';
+ case keepin_Y_split
+ fileID_columns = fopen([input_folder columns_Y_file],'r');
+ columns = fscanf(fileID_columns,formatSpec);
+ size=[columns Inf];
+ keep_in_data_y = fscanf(fileID, formatSpec, size)';
+ case cu_cv_file
+ cu_cv = fscanf(fileID, formatSpec)';
+ case K_file
+ K = fscanf(fileID, formatSpec);
+ end
+end
+
+RHO_collection = zeros(K,1);
+
+for k=1:K
+
+ % separate the keep_in data into training and test data according to
+ % the chosen test percentage tp
+ [test_data_x, training_data_x, test_data_y, training_data_y] = dp_partition_holdout(tp, keep_in_data_x, keep_in_data_y);
+
+ %perform SPLS on the training data using the current cu/cv combination
+ [u, v, ~] = spls(training_data_x,training_data_y,cu_cv_combination(index_cu,i),cu_cv_combination(index_cv,i));
+
+ %compute the correlation between the projections of the training and
+ %test matrices onto the SPLS latent space spanned by the weight vectors
+ RHO = abs(corr(test_data_x*u,test_data_y*v));
+
+ %store the results
+ RHO_collection(k) = RHO;
+
+end
+
+
+% computing the mean value of all RHO calculated for the k iterations for
+% one specific cu/cv combination
+
+RHO_avg = mean(cell2mat(RHO_collection(:,index_RHO_k)));
+
+M = [cu_cv RHO_avg];
+dlmwrite([output_folder cu_cv_file '_RHO.txt'],M,'delimiter','\t');
+
+end
diff --git a/Visualization_Module/dp_RHO_avg_k_AR.m b/Visualization_Module/dp_RHO_avg_k_AR.m
new file mode 100644
index 0000000..4597746
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_k_AR.m
@@ -0,0 +1,38 @@
+%% new function for cu/cv combination and 100 splits
+
+function [RHO_avg] = dp_RHO_avg_k_AR(i)
+
+load('/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/cvcu.mat')
+%% start of the function
+cu_cv_combination = cu_cv_combination(:,i);
+
+RHO_collection = zeros(K,1);
+
+for k=1:K
+
+ % separate the keep_in data into training and test data according to
+ % the chosen test percentage tp
+ [test_data_x, training_data_x, test_data_y, training_data_y] = dp_partition_holdout(tp, keep_in_data_x, keep_in_data_y);
+
+ %perform SPLS on the training data using the current cu/cv combination
+ [u, v, ~] = spls(training_data_x,training_data_y,cu_cv_combination(1),cu_cv_combination(2));
+
+ %compute the correlation between the projections of the training and
+ %test matrices onto the SPLS latent space spanned by the weight vectors
+ RHO = abs(corr(test_data_x*u,test_data_y*v));
+
+ %store the results
+ RHO_collection(k) = RHO;
+
+end
+
+
+% computing the mean value of all RHO calculated for the k iterations for
+% one specific cu/cv combination
+
+RHO_avg = mean(RHO_collection);
+% M = matfile('/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg.mat');
+disp(num2str(RHO_avg))
+save(['/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg_',num2str(i),'.mat'],'RHO_avg');
+
+end
diff --git a/Visualization_Module/dp_RHO_avg_k_AR_DP.m b/Visualization_Module/dp_RHO_avg_k_AR_DP.m
new file mode 100644
index 0000000..799cefb
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_k_AR_DP.m
@@ -0,0 +1,56 @@
+%% new function for cu/cv combination and 100 splits
+
+function dp_RHO_avg_k_AR_DP(i, hyperopt_folder, utilities_folder)
+
+load([hyperopt_folder '/keep_in_partition.mat']);
+
+%% start of the function
+RHO_avg=[]; cu=[]; cv=[]; tp=[]; K=[];
+
+fileID = fopen([hyperopt_folder '/cu_' num2str(i) '.txt']);
+cu = fscanf(fileID,'%f');
+fclose(fileID);
+
+fileID = fopen([hyperopt_folder '/cv_' num2str(i) '.txt']);
+cv = fscanf(fileID,'%f');
+fclose(fileID);
+
+fileID = fopen([utilities_folder '/tp.txt']);
+tp = fscanf(fileID,'%d');
+fclose(fileID);
+
+fileID = fopen([utilities_folder '/K.txt']);
+K = fscanf(fileID,'%d');
+fclose(fileID);
+
+RHO_collection = nan(K,1);
+
+if cu > sqrt(size(keep_in_data_x,2))
+ cu = sqrt(size(keep_in_data_x,2));
+end
+
+if cv > sqrt(size(keep_in_data_y,2))
+ cv = sqrt(size(keep_in_data_y,2));
+end
+
+for k=1:K
+ RHO_collection(k) = dp_k_split(tp, keep_in_data_x, keep_in_data_y, cu, cv);
+end
+
+nan_log = isnan(RHO_collection);
+while sum(nan_log)>0
+ for ii=1:size(RHO_collection,1)
+ if isnan(RHO_collection(ii))
+ RHO_collection(ii) = dp_k_split(tp, keep_in_data_x, keep_in_data_y, cu, cv);
+ end
+ end
+ nan_log = isnan(RHO_collection);
+end
+
+RHO_avg = mean(RHO_collection);
+
+FID_RHO = fopen(['RHO_avg_' num2str(i) '.txt'],'w');
+fprintf(FID_RHO, '%.4f', RHO_avg);
+fclose(FID_RHO);
+
+end
diff --git a/Visualization_Module/dp_RHO_avg_parallel.m b/Visualization_Module/dp_RHO_avg_parallel.m
new file mode 100644
index 0000000..dc10442
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_parallel.m
@@ -0,0 +1,30 @@
+%% function for RHO_avg BO
+
+function [RHO_avg] = dp_RHO_avg_parallel(spls_standalone_path, analysis_folder, type_analysis, mem_total, max_sim_jobs, queue_name, K, tp, cu, cv)
+
+RHO_avg_bash = dp_bash_parallel(spls_standalone_path, analysis_folder, type_analysis, mem_total, max_sim_jobs, queue_name, K, tp, cu, cv);
+
+cd(analysis_folder);
+system(['qsub ' RHO_avg_bash]);
+
+filecount = size(dir([analysis_folder '/RHO_*']),1);
+RHO_collection = nan(K,1);
+
+% see hyperparameter optimization
+while filecount < K
+ filecount = size(dir([analysis_folder '/RHO_*.txt']),1);
+end
+
+for i=1:size(RHO_collection,1)
+ if exist([analysis_folder '/RHO_',num2str(i),'.txt'],'file')
+ RHO_collection(i,1) = dp_txtscan([permutation_folder '/RHO_' num2str(i) '.txt'], '%f');
+ delete([analysis_folder '/RHO_',num2str(i),'.txt']);
+ else
+ RHO_collection(i,1) = NaN;
+ end
+end
+
+RHO_collection_completed = dp_fill_nan(RHO_collection, spls_standalone_path, analysis_folder, type_analysis, mem_total, max_sim_jobs, queue_name, tp, cu, cv);
+RHO_avg = mean(RHO_collection_completed);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg_serial.m b/Visualization_Module/dp_RHO_avg_serial.m
new file mode 100644
index 0000000..e03f7fe
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_serial.m
@@ -0,0 +1,21 @@
+%% function for RHO_avg BO
+
+function [RHO_avg] = dp_RHO_avg_serial(K, tp, keep_in_data_x, keep_in_data_y, cu, cv)
+
+RHO_collection = nan(K,1);
+
+for i=1:K
+ [test_data_x, training_data_x, test_data_y, training_data_y] = dp_partition_holdout(tp, keep_in_data_x, keep_in_data_y);
+
+ %perform SPLS on the training data using the current cu/cv combination
+ [u,v,~] = spls_suppressed_display(training_data_x,training_data_y,cu,cv);
+
+ %compute the correlation between the projections of the
+ %training and test matrices onto the SPLS latent space
+ %spanned by the weight vectors
+ RHO_collection(i,1) = abs(corr(test_data_x*u,test_data_y*v));
+end
+
+RHO_avg = mean(RHO_collection);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_avg_testing.prj b/Visualization_Module/dp_RHO_avg_testing.prj
new file mode 100644
index 0000000..15367d3
--- /dev/null
+++ b/Visualization_Module/dp_RHO_avg_testing.prj
@@ -0,0 +1,116 @@
+
+
+ dp_RHO_avg_testing
+
+
+ 1.0
+
+
+
+
+
+
+
+
+ /dp_RHO_avg_testing/
+ option.installpath.user
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_testing/for_testing
+ ${PROJECT_ROOT}/dp_RHO_avg_testing/for_redistribution_files_only
+ ${PROJECT_ROOT}/dp_RHO_avg_testing/for_redistribution
+ false
+
+ true
+ subtarget.standalone
+
+
+ - 35000
+ - 35010
+ - 35001
+
+ true
+ false
+ false
+ MyAppInstaller_web
+ MyAppInstaller_mcr
+ MyAppInstaller_app
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PROJECT_ROOT}/dp_RHO_avg_k_AR_DP.m
+
+
+ ${PROJECT_ROOT}/dp_partition_holdout.m
+ ${PROJECT_ROOT}/spls.m
+
+
+
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_testing/for_testing/splash.png
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_testing/for_testing/dp_RHO_avg_testing
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_testing/for_testing/readme.txt
+ /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_testing/for_testing/run_dp_RHO_avg_testing.sh
+
+
+
+ /opt/matlab/R2015a
+
+
+
+
+
+ true
+
+
+
+
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ 3.10.0-693.17.1.el7.x86_64
+ false
+ true
+ glnxa64
+ true
+
+
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_RHO_k.m b/Visualization_Module/dp_RHO_k.m
new file mode 100644
index 0000000..4ab6d68
--- /dev/null
+++ b/Visualization_Module/dp_RHO_k.m
@@ -0,0 +1,56 @@
+%% new function for cu/cv combination and 100 splits
+
+function [RHO_avg] = dp_RHO_avg_k_splits(output_folder, input_folder, cu_cv_file, K_file, keepin_X_split, columns_X_file, keepin_Y_split, columns_Y_file)
+
+input_names = {cu_cv_file keepin_X_split keepin_Y_split};
+
+for i=1:numel(input_names)
+ formatSpec = '%f';
+ fileID = fopen([input_folder input_names{i}],'r');
+ switch input_names{i}
+ case keepin_X_split
+ fileID_columns = fopen([input_folder columns_X_file],'r');
+ columns = fscanf(fileID_columns,formatSpec);
+ size=[columns Inf];
+ keep_in_data_x = [fscanf(fileID, formatSpec, size)]';
+ case keepin_Y_split
+ fileID_columns = fopen([input_folder columns_Y_file],'r');
+ columns = fscanf(fileID_columns,formatSpec);
+ size=[columns Inf];
+ keep_in_data_y = [fscanf(fileID, formatSpec, size)]';
+ case cu_cv_file
+ cu_cv = [fscanf(fileID, formatSpec)]';
+ end
+end
+
+
+for k=1:K
+
+ % separate the keep_in data into training and test data according to
+ % the chosen test percentage tp
+ [test_data_x, training_data_x, test_data_y, training_data_y] = dp_partition_holdout(tp, keep_in_data_x, keep_in_data_y);
+
+ %perform SPLS on the training data using the current cu/cv combination
+ [u, v, success] = spls(training_data_x,training_data_y,cu_cv_combination(index_cu,i),cu_cv_combination(index_cv,i));
+
+
+ %compute the correlation between the projections of the training and
+ %test matrices onto the SPLS latent space spanned by the weight vectors
+ RHO = abs(corr(test_data_x*u,test_data_y*v));
+
+ %store the results
+ spls_output_k_results(k,:) = {u v success RHO};
+
+end
+
+
+% computing the mean value of all RHO calculated for the k iterations for
+% one specific cu/cv combination
+
+RHO_avg(i) = mean(cell2mat(spls_output_k_results(:,index_RHO_k)));
+
+end
+
+dlmwrite([output_folder cu_cv_file '_RHO.txt'],M,'delimiter','\t');
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_bash.m b/Visualization_Module/dp_bash.m
new file mode 100644
index 0000000..c190357
--- /dev/null
+++ b/Visualization_Module/dp_bash.m
@@ -0,0 +1,25 @@
+%% Script to create bash files
+
+function [output_file] = dp_bash(analysis_folder, analysis_name, queue_name, script_path, script_name)
+
+FID_hyper = fopen([analysis_folder '/' analysis_name '.sh'],'w');
+
+fprintf(FID_hyper,['#!/bin/bash \n',...
+ '# \n',...
+ '#$ -S /bin/bash \n',...
+ '#$ -cwd \n',...
+ '#$ -o ' analysis_folder '/$JOB_ID-output-' analysis_name '.txt #output directory \n',...
+ '#$ -j y \n',...
+ '#$ -N ' analysis_name ' # Name of the job \n',...
+ '#$ -m ae # This is if you want emails when jobs abort or exit \n',...
+ '#$ -l mem_free=2G # This is how much memory you are requesting \n',...
+ '#$ -l h_rss=2G # This is the absolute memory limit \n',...
+ '#$ -l h_stack=256M # This is for matlab \n',...
+ '#$ -q ' queue_name ' # This is the computer queue. For high RAM jobs use: psy0cf20. \n',...
+ 'cd ' script_path ' \n',...
+ '/opt/matlab/R2015a/bin/matlab -nodisplay -nojvm -nosplash -r "run(''' script_name ''')"']);
+
+fclose(FID_hyper);
+output_file = [analysis_folder '/' analysis_name '.sh'];
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_bash_100k.m b/Visualization_Module/dp_bash_100k.m
new file mode 100644
index 0000000..a0b2f01
--- /dev/null
+++ b/Visualization_Module/dp_bash_100k.m
@@ -0,0 +1,33 @@
+%% Script to create bash files
+
+function [output_file] = dp_bash_100k(spls_standalone_path, analysis_folder, type_analysis, mem_total, max_sim_jobs, queue_name, K, tp, cu, cv)
+
+switch type_analysis
+ case 'hyperopt'
+ comp_path = [spls_standalone_path '/dp_RHO_avg_100k/for_testing/dp_RHO_avg_100k'];
+ case 'permutation'
+ comp_path = [spls_standalone_path '/dp_perm_testing/for_testing/dp_perm_testing'];
+end
+
+FID = fopen([analysis_folder '/' type_analysis '.sh'],'w');
+
+fprintf(FID,['#!/bin/bash \n',...
+ '# \n',...
+ '#$ -S /bin/bash \n',...
+ '#$ -cwd \n',...
+ '#$ -o ' analysis_folder '/$JOB_ID-output-' type_analysis '.txt #output directory \n',...
+ '#$ -j y \n',...
+ '#$ -N ' type_analysis ' # Name of the job \n',...
+ '#$ -t 1-' num2str(K) ':1 \n',...
+ '#$ -tc ' num2str(max_sim_jobs) ' \n',...
+ '#$ -l mem_total=' num2str(mem_total) 'G \n',...
+ '#$ -q ' queue_name ' # This is the computer queue. For high RAM jobs use: psy0cf20. \n',...
+ 'var_cu=' num2str(cu) '\n',...
+ 'var_cv=' num2str(cv) '\n',...
+ 'var_tp=' num2str(tp) '\n',...
+ comp_path ' $SGE_TASK_ID $var_cu $var_cv $var_tp ' analysis_folder]);
+
+fclose(FID);
+output_file = [analysis_folder '/' type_analysis '.sh'];
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_bash_main_job.m b/Visualization_Module/dp_bash_main_job.m
new file mode 100644
index 0000000..e566e62
--- /dev/null
+++ b/Visualization_Module/dp_bash_main_job.m
@@ -0,0 +1,48 @@
+%% Script to create bash files
+
+function dp_bash_main_job(spls_standalone_path, project_folder, project_name, queue_name, variables_for_analysis, email)
+
+nn=1;
+if ~exist([project_folder '/' project_name],'dir')
+ mkdir([project_folder '/' project_name]);
+ analysis_folder = [project_folder '/' project_name];
+else
+ while nn < 100
+ if exist([project_folder '/' project_name '_' num2str(nn)],'dir')
+ nn=nn+1;
+ else
+ mkdir([project_folder '/' project_name '_' num2str(nn)])
+ analysis_folder = [project_folder '/' project_name '_' num2str(nn)];
+ nn=100;
+ end
+ end
+end
+
+FID = fopen([analysis_folder '/' project_name '.sh'],'w');
+
+fprintf(FID,['#!/bin/bash \n',...
+ '# \n',...
+ '#$ -S /bin/bash \n',...
+ '#$ -cwd \n',...
+ '#$ -o ' analysis_folder '/$JOB_ID-output-main.txt #output directory \n',...
+ '#$ -j y \n',...
+ '#$ -N ' project_name ' # Name of the job \n',...
+ '#$ -M ' email ' # your email address \n',...
+ '#$ -m ae # This is if you want emails when jobs abort or exit \n',...
+ '#$ -l mem_free=2G # This is how much memory you are requesting \n',...
+ '#$ -l h_rss=2G # This is the absolute memory limit \n',...
+ '#$ -l h_stack=256M # This is for matlab \n',...
+ '#$ -q ' queue_name ' # This is the computer queue. Use mitnvp1 or psy0cf20. For high RAM jobs use: psy0cf20. \n',...
+ ' \n',...
+ 'spls_standalone_path=' spls_standalone_path '\n',...
+ 'analysis_folder=' analysis_folder '\n',...
+ 'queue_name=' queue_name '\n',...
+ 'variables_for_analysis=' variables_for_analysis '\n',...
+ '\n',...
+ spls_standalone_path '/dp_spls_standalone/for_testing/dp_spls_standalone $spls_standalone_path $analysis_folder $queue_name $variables_for_analysis']);
+
+fclose(FID);
+
+system(['qsub ' analysis_folder '/' project_name '.sh']);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_bash_para.m b/Visualization_Module/dp_bash_para.m
new file mode 100644
index 0000000..122893d
--- /dev/null
+++ b/Visualization_Module/dp_bash_para.m
@@ -0,0 +1,33 @@
+%% Script to create bash files
+
+function [output_file] = dp_bash_para(spls_toolbox_path, analysis_folder, type_analysis, vmem_req, no_jobs, max_sim_jobs, queue_name)
+
+FID_hyper = fopen([analysis_folder '/' type_analysis '.sh'],'w');
+
+
+
+switch type_analysis
+ case 'hyperopt'
+ comp_path = [spls_toolbox_path '/Hyperparameter_optimization/dp_RHO_avg_k_AR_DP/for_testing/dp_RHO_avg_k_AR_DP'];
+ case 'permutation'
+ comp_path = [spls_toolbox_path '/Permutation/dp_perm_testing/for_testing/dp_perm_testing'];
+end
+
+fprintf(FID_hyper,['#!/bin/bash \n',...
+ '# \n',...
+ '#$ -S /bin/bash \n',...
+ '#$ -cwd \n',...
+ '#$ -o ' analysis_folder '/$JOB_ID-output-' type_analysis '.txt #output directory \n',...
+ '#$ -j y \n',...
+ '#$ -N ' type_analysis ' # Name of the job \n',...
+ '#$ -t 1-' num2str(no_jobs) ':1 \n',...
+ '#$ -tc ' num2str(max_sim_jobs) ' \n',...
+ '#$ -pe smp 5 \n',...
+ '#$ -l h_vmem=' num2str(vmem_req) 'G \n',...
+ '#$ -q ' queue_name ' # This is the computer queue. For high RAM jobs use: psy0cf20. \n',...
+ comp_path ' $SGE_TASK_ID']);
+
+fclose(FID_hyper);
+output_file = [analysis_folder '/' type_analysis '.sh'];
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_bash_para_new.m b/Visualization_Module/dp_bash_para_new.m
new file mode 100644
index 0000000..3bc9a8b
--- /dev/null
+++ b/Visualization_Module/dp_bash_para_new.m
@@ -0,0 +1,32 @@
+%% Script to create bash files
+
+function [output_file] = dp_bash_para_new(spls_standalone_path, analysis_folder, utilities_folder, type_analysis, mem_total, no_jobs, max_sim_jobs, queue_name)
+
+switch type_analysis
+ case 'hyperopt'
+ comp_path = [spls_standalone_path '/dp_RHO_avg_k_AR_DP/for_testing/dp_RHO_avg_k_AR_DP'];
+ add_path = [analysis_folder, ' ', utilities_folder];
+ case 'permutation'
+ comp_path = [spls_standalone_path '/dp_perm_testing/for_testing/dp_perm_testing'];
+ add_path = analysis_folder;
+end
+
+FID_hyper = fopen([analysis_folder '/' type_analysis '.sh'],'w');
+
+fprintf(FID_hyper,['#!/bin/bash \n',...
+ '# \n',...
+ '#$ -S /bin/bash \n',...
+ '#$ -cwd \n',...
+ '#$ -o ' analysis_folder '/$JOB_ID-output-' type_analysis '.txt #output directory \n',...
+ '#$ -j y \n',...
+ '#$ -N ' type_analysis ' # Name of the job \n',...
+ '#$ -t 1-' num2str(no_jobs) ':1 \n',...
+ '#$ -tc ' num2str(max_sim_jobs) ' \n',...
+ '#$ -l mem_total=' num2str(mem_total) 'G \n',...
+ '#$ -q ' queue_name ' # This is the computer queue. For high RAM jobs use: psy0cf20. \n',...
+ comp_path ' $SGE_TASK_ID ' add_path]);
+
+fclose(FID_hyper);
+output_file = [analysis_folder '/' type_analysis '.sh'];
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_bash_script.m b/Visualization_Module/dp_bash_script.m
new file mode 100644
index 0000000..141d03f
--- /dev/null
+++ b/Visualization_Module/dp_bash_script.m
@@ -0,0 +1,9 @@
+
+%% create main bash file to submit to queue
+addpath /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox;
+analysis_folder = '/volume/HCStress/Analysis/20-Apr-2018';
+project_name = 'DP_CISS_parallel';
+queue_name = 'mitnvp1';
+full_path_script = '/volume/DP_FEF/ScrFun/ScriptsRepository';
+script_name = 'DP_SPLS_para_FEF.m';
+main_job_bash = dp_bash(analysis_folder, project_name, queue_name, full_path_script, script_name);
\ No newline at end of file
diff --git a/Visualization_Module/dp_bash_test.m b/Visualization_Module/dp_bash_test.m
new file mode 100644
index 0000000..dcacf82
--- /dev/null
+++ b/Visualization_Module/dp_bash_test.m
@@ -0,0 +1,30 @@
+%% Script to create bash files
+
+function [output_file] = dp_bash_test(spls_toolbox_path, analysis_folder, type_analysis, mem_total, no_jobs, max_sim_jobs, queue_name)
+
+FID_hyper = fopen([analysis_folder '/' type_analysis '.sh'],'w');
+
+switch type_analysis
+ case 'hyperopt'
+ comp_path = [spls_toolbox_path '/Hyperparameter_optimization/dp_RHO_avg_k_AR_DP/for_testing/dp_RHO_avg_k_AR_DP'];
+ case 'permutation'
+ comp_path = [spls_toolbox_path '/Permutation/dp_perm_testing/for_testing/dp_perm_testing'];
+end
+
+fprintf(FID_hyper,['#!/bin/bash \n',...
+ '# \n',...
+ '#$ -S /bin/bash \n',...
+ '#$ -cwd \n',...
+ '#$ -o ' analysis_folder '/$JOB_ID-output-' type_analysis '.txt #output directory \n',...
+ '#$ -j y \n',...
+ '#$ -N ' type_analysis ' # Name of the job \n',...
+ '#$ -t 1-' num2str(no_jobs) ':1 \n',...
+ '#$ -tc ' num2str(max_sim_jobs) ' \n',...
+ '#$ -l mem_total=' num2str(mem_total) 'G \n',...
+ '#$ -q ' queue_name ' # This is the computer queue. For high RAM jobs use: psy0cf20. \n',...
+ comp_path ' $SGE_TASK_ID']);
+
+fclose(FID_hyper);
+output_file = [analysis_folder '/' type_analysis '.sh'];
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_cleanup.m b/Visualization_Module/dp_cleanup.m
new file mode 100644
index 0000000..dec7567
--- /dev/null
+++ b/Visualization_Module/dp_cleanup.m
@@ -0,0 +1,11 @@
+%% Clean up for SPLS parallel script
+
+function dp_cleanup(folder, filecore)
+
+filecount = size(dir([folder '/' filecore '*']),1);
+
+for i=1:filecount
+ delete([folder '/' filecore '*']);
+end
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_create_matrixfiles.m b/Visualization_Module/dp_create_matrixfiles.m
new file mode 100644
index 0000000..7eb3fab
--- /dev/null
+++ b/Visualization_Module/dp_create_matrixfiles.m
@@ -0,0 +1,13 @@
+%% Create X and Y files with dimensions
+
+function dp_create_matrixfiles(output_folder,X,Y)
+
+output_files = {X Y size(X,2) size(Y,2)};
+output_files_names = {'X' 'Y' 'columns_X' 'columns_Y'};
+
+for i =1:size(output_files,2)
+ M = output_files{i};
+ dlmwrite([output_folder output_files_names{i} '_file.txt'],M,'delimiter','\t');
+end
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_fill_nan.m b/Visualization_Module/dp_fill_nan.m
new file mode 100644
index 0000000..fbfd2e3
--- /dev/null
+++ b/Visualization_Module/dp_fill_nan.m
@@ -0,0 +1,53 @@
+%% DP function to compute NaN values for RHO_b
+
+function [RHO_collection_completed] = dp_fill_nan(RHO_collection, spls_standalone_path, analysis_folder, type_analysis, mem_total, max_sim_jobs, queue_name, tp, cu, cv)
+
+nan_log = isnan(RHO_collection);
+
+switch type_analysis
+ case 'hyperopt'
+ search_prefix = 'RHO_';
+ case 'permutation'
+ search_prefix = 'RHO_b_';
+ load([analysis_folder '/opt_param.mat']);
+ for i=1:sum(nan_log)
+ temp = randperm(size(keep_in_data_y,1))';
+ dp_txt_write(permutation_folder, ['perm_' num2str(i)], temp, '%d\n');
+ end
+end
+
+while sum(nan_log)>0
+
+ % write a bash script for hyperparameter optimization, which can later be called
+ bash_file = dp_bash_parallel(spls_standalone_path, analysis_folder, type_analysis, mem_total, max_sim_jobs, queue_name, sum(nan_log), tp, cu, cv);
+
+ % submit the bash script for parallel computing of RHO_b values to the queue
+ cd(analysis_folder);
+ system(['qsub ' bash_file]);
+
+ % collect all files with RHO_b values, open them and store the RHO values in a vector
+ filecount_add = size(dir([addition_folder '/' search_prefix '*.txt']),1);
+ RHO_collection_addition = nan(sum(nan_log),1);
+
+ while filecount_add < sum(nan_log)
+ filecount_add = size(dir([addition_folder '/' search_prefix '*.txt']),1);
+ end
+
+ for i=1:size(RHO_collection_addition,1)
+ if exist([addition_folder '/' search_prefix, num2str(i),'.txt'],'file')
+ RHO_collection_addition(i,1) = dp_txtscan([addition_folder '/' search_prefix, num2str(i),'.txt'], '%f');
+ delete([addition_folder '/' search_prefix, num2str(i),'.txt']);
+ else
+ RHO_collection_addition(i,1) = NaN;
+ end
+ end
+
+ RHO_collection(nan_log) = RHO_collection_addition;
+ nan_log = isnan(RHO_collection);
+
+end
+
+RHO_collection_completed = RHO_collection;
+
+end
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_holdout_splits.m b/Visualization_Module/dp_holdout_splits.m
new file mode 100644
index 0000000..c42abc9
--- /dev/null
+++ b/Visualization_Module/dp_holdout_splits.m
@@ -0,0 +1,52 @@
+ %% DP K-Splits
+function [holdout_keepin_matrix] = dp_holdout_splits(output_folder, X, Y, K)
+
+% addpath /volume/DP_FEF/ScrFun/ScriptsRepository/
+%
+% input_names = {hp_file K_file X_file Y_file};
+%
+% for i=1:numel(input_names)
+% formatSpec = '%f';
+% fileID = fopen([input_folder input_names{i}],'r');
+% switch input_names{i}
+% case hp_file
+% hp = fscanf(fileID,formatSpec);
+% case K_file
+% K = fscanf(fileID,formatSpec);
+% case X_file
+% fileID_columns = fopen([input_folder columns_X_file],'r');
+% columns = fscanf(fileID_columns,formatSpec);
+% size=[columns Inf];
+% X = [fscanf(fileID, formatSpec, size)]';
+% case Y_file
+% fileID_columns = fopen([input_folder columns_Y_file],'r');
+% columns = fscanf(fileID_columns,formatSpec);
+% size=[columns Inf];
+% Y = [fscanf(fileID, formatSpec, size)]';
+% end
+% end
+
+
+temp = num2cell(zeros(K,4));
+temp_columns = zeros(K,4);
+for k=1:K
+ % separate the keep_in data into training and test data according
+ % to the chosen test percentage tp
+ [holdout_X, keepin_X, holdout_Y, keepin_Y] = dp_partition_holdout(hp, X, Y);
+ temp(k,:) = {holdout_X, keepin_X, holdout_Y, keepin_Y};
+ temp_columns(k,:) = [size(holdout_X,2), size(keepin_X,2), size(holdout_Y,2), size(keepin_Y,2)];
+end
+
+holdout_keepin_matrix = temp;
+holdout_keepin_matrix_names = {'holdout_X' 'keepin_X' 'holdout_Y' 'keepin_Y'};
+
+for i=1:size(temp,1)
+ for ii=1:size(temp,2)
+ M = temp{i,ii};
+ dlmwrite([output_folder holdout_keepin_matrix_names{ii} '_split_' num2str(i) '.txt'],M,'delimiter','\t');
+ C = temp_columns(i,ii);
+ dlmwrite([output_folder 'columns_' holdout_keepin_matrix_names{ii} '_split_' num2str(i) '.txt'],C);
+ end
+end
+
+end
diff --git a/Visualization_Module/dp_hyperopt.m b/Visualization_Module/dp_hyperopt.m
new file mode 100644
index 0000000..bfa8e33
--- /dev/null
+++ b/Visualization_Module/dp_hyperopt.m
@@ -0,0 +1,3 @@
+%% Optimization of hyperparameters
+
+function [cu, cv] =
\ No newline at end of file
diff --git a/Visualization_Module/dp_hyperopt_100k.m b/Visualization_Module/dp_hyperopt_100k.m
new file mode 100644
index 0000000..cbac491
--- /dev/null
+++ b/Visualization_Module/dp_hyperopt_100k.m
@@ -0,0 +1,41 @@
+%% function for one hyperoptimization step
+
+function [RHO_avg] = dp_hyperopt_100k(folders, settings, K, tp, cu, cv)
+
+hyperopt_folder = folders.analysis_folder;
+hyperopt_bash = dp_bash_100k(folders, settings, K, tp, cu, cv);
+
+% access the temp_RHO folder and initialize the bash script for
+% parallel computing of the hyperparameter optimization
+cd(hyperopt_folder);
+system(['qsub ' hyperopt_bash]);
+
+% set a variable which counts the files in the RHO folder
+filecount = size(dir([hyperopt_folder '/RHO_*.txt']),1);
+RHO_collection = nan(K,1);
+
+% use a while loop which recounts all the files in the RHO folder
+% until all computations from the parallelized hyperparameter
+% optimization step are completed and all files are saved in that
+% folder, the while loop will be exited as soon as all files are
+% saved in the folder
+
+while filecount < K
+ filecount = size(dir([hyperopt_folder '/RHO_*.txt']),1);
+end
+
+% load all RHO values which were saved in mat files into a
+% RHO_collection vector
+
+for i=1:K
+ if exist([hyperopt_folder '/RHO_' num2str(i) '.txt'],'file')
+ RHO_collection(i,1) = dp_txtscan([hyperopt_folder '/RHO_' num2str(i) '.txt'], '%f');
+ delete([hyperopt_folder '/RHO_' num2str(i) '.txt']);
+ else
+ RHO_collection(i,1) = NaN;
+ end
+end
+
+RHO_avg = mean(RHO_collection);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_hyperopt_k.m b/Visualization_Module/dp_hyperopt_k.m
new file mode 100644
index 0000000..a049269
--- /dev/null
+++ b/Visualization_Module/dp_hyperopt_k.m
@@ -0,0 +1,45 @@
+%% new function for cu/cv combination and 100 splits
+
+function [RHO_avg] = dp_hyperopt_k(output_folder, input_folder, cu_cv_file, keepin_X_split, columns_X_file, keepin_Y_split, columns_Y_file)
+
+input_names = {cu_cv_file keepin_X_split keepin_Y_split};
+
+for i=1:numel(input_names)
+ formatSpec = '%f';
+ fileID = fopen([input_folder input_names{i}],'r');
+ switch input_names{i}
+ case keepin_X_split
+ fileID_columns = fopen([input_folder columns_X_file],'r');
+ columns = fscanf(fileID_columns,formatSpec);
+ size=[columns Inf];
+ keep_in_data_x = [fscanf(fileID, formatSpec, size)]';
+ case keepin_Y_split
+ fileID_columns = fopen([input_folder columns_Y_file],'r');
+ columns = fscanf(fileID_columns,formatSpec);
+ size=[columns Inf];
+ keep_in_data_y = [fscanf(fileID, formatSpec, size)]';
+ case cu_cv_file
+ cu_cv = [fscanf(fileID, formatSpec)]';
+ end
+end
+
+% create an inner loop with k splits and a tp test perecentage set within
+% each split
+
+% RHO_avg is a vector where all average RHO values of the different cu/cv
+% combinations are stored, preallocated for speed
+
+% separate the keep_in data into training and test data according to the
+% chosen test percentage tp
+[test_data_x, training_data_x, test_data_y, training_data_y] = dp_partition_holdout(tp, keep_in_data_x, keep_in_data_y);
+
+%perform SPLS on the training data using the current cu/cv combination
+[u, v, ~] = spls(training_data_x,training_data_y,cu_index,cv_index);
+
+%compute the correlation between the projections of the training and test
+%matrices onto the SPLS latent space spanned by the weight vectors
+RHO = abs(corr(test_data_x*u,test_data_y*v));
+
+dlmwrite([output_folder cu_cv_file '_RHO.txt'],M,'delimiter','\t');
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_hyperopt_single.m b/Visualization_Module/dp_hyperopt_single.m
new file mode 100644
index 0000000..b2ff4e2
--- /dev/null
+++ b/Visualization_Module/dp_hyperopt_single.m
@@ -0,0 +1,58 @@
+%% function for one hyperoptimization step
+
+function [RHO_avg] = dp_hyperopt_single(folders, settings, cu, cv)
+K=100; tp=10;
+no_jobs = K;
+
+hyperopt_bash = dp_bash_para_new(folders.spls_standalone_path, folders.hyperopt_folder, folders.utilities_folder, 'hyperopt', settings.mem_total, settings.no_jobs, settings.max_sim_jobs, settings.queue_name, cu, cv);
+
+% access the temp_RHO folder and initialize the bash script for
+% parallel computing of the hyperparameter optimization
+cd(hyperopt_folder);
+system(['qsub ' hyperopt_bash]);
+
+% set a variable which counts the files in the RHO folder
+filecount = size(dir([hyperopt_folder '/RHO_*.txt']),1);
+RHO_collection = nan(size(cu_cv_combination,2),1);
+
+% use a while loop which recounts all the files in the RHO folder
+% until all computations from the parallelized hyperparameter
+% optimization step are completed and all files are saved in that
+% folder, the while loop will be exited as soon as all files are
+% saved in the folder
+
+while filecount < size(cu_cv_combination,2)
+ filecount = size(dir([hyperopt_folder '/RHO_avg_*.txt']),1);
+end
+
+% load all RHO values which were saved in mat files into a
+% RHO_collection vector
+
+for i=1:size(cu_cv_combination,2)
+ if exist([hyperopt_folder '/RHO_avg_' num2str(i) '.txt'],'file')
+ RHO_avg_collection(i,1) = dp_txtscan([hyperopt_folder '/RHO_avg_' num2str(i) '.txt'], '%f');
+ delete([hyperopt_folder '/RHO_avg_' num2str(i) '.txt']);
+ else
+ RHO_avg_collection(i,1) = NaN;
+ end
+end
+
+
+for k=1:K
+ RHO_collection(k) = dp_k_split(tp, keep_in_data_x, keep_in_data_y, cu, cv);
+end
+
+nan_log = isnan(RHO_collection);
+
+while sum(nan_log)>0
+ for ii=1:size(RHO_collection,1)
+ if isnan(RHO_collection(ii))
+ RHO_collection(ii) = dp_k_split(tp, keep_in_data_x, keep_in_data_y, cu, cv);
+ end
+ end
+ nan_log = isnan(RHO_collection);
+end
+
+RHO_avg = mean(RHO_collection);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_hyperopt_spls.m b/Visualization_Module/dp_hyperopt_spls.m
new file mode 100644
index 0000000..6668200
--- /dev/null
+++ b/Visualization_Module/dp_hyperopt_spls.m
@@ -0,0 +1,4 @@
+%% Optimization of hyperparameters
+
+function [cu_opt, cv_opt] = dp_hyperopt_spls(range_cu, range_cv, K)
+
diff --git a/Visualization_Module/dp_hyperparam_grid.m b/Visualization_Module/dp_hyperparam_grid.m
new file mode 100644
index 0000000..80cb24b
--- /dev/null
+++ b/Visualization_Module/dp_hyperparam_grid.m
@@ -0,0 +1,42 @@
+%% DP cu cv grid
+
+function [cu_cv_combination] = dp_hyperparam_grid(output_folder, X, Y, range_points)
+
+% input_names = {X_file Y_file range_points};
+%
+% for i=1:numel(input_names)
+% formatSpec = '%f';
+% fileID = fopen([input_folder input_names{i}],'r');
+% switch input_names{i}
+% case X_file
+% fileID_columns = fopen([input_folder columns_X_file],'r');
+% columns = fscanf(fileID_columns,formatSpec);
+% size=[columns Inf];
+% X = [fscanf(fileID, formatSpec, size)]';
+% case Y_file
+% fileID_columns = fopen([input_folder columns_Y_file],'r');
+% columns = fscanf(fileID_columns,formatSpec);
+% size=[columns Inf];
+% Y = [fscanf(fileID, formatSpec, size)]';
+% end
+% end
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+cu_range = linspace(1,sqrt(size(X,2)),range_points);
+cv_range = linspace(1,sqrt(size(Y,2)),range_points);
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times
+cu_cv_combination = [repelem(cu_range,numel(cu_range));repmat(cv_range,1,numel(cv_range))]; % this matrix contains all the possible combinations between cu and cv
+
+for i=1:size(cu_cv_combination,2)
+ M = [cu_cv_combination(:,i)]';
+ dlmwrite([output_folder 'cu_cv_' num2str(i) '.txt'],M,'delimiter','\t');
+end
+
+end
+
+
diff --git a/Visualization_Module/dp_k__holdout_splits.m b/Visualization_Module/dp_k__holdout_splits.m
new file mode 100644
index 0000000..597976b
--- /dev/null
+++ b/Visualization_Module/dp_k__holdout_splits.m
@@ -0,0 +1,49 @@
+%% DP K-Splits
+function [holdout_X, keepin_X, holdout_Y, keepin_Y] = dp_k__holdout_splits(output_folder, input_folder, hp_file, K_file, X_file, Y_file)
+
+addpath /volume/DP_FEF/ScrFun/ScriptsRepository/
+
+input_names = {hp_file K_file X_file Y_file};
+
+for i=1:numel(input_names)
+ formatSpec = '%f';
+ fileID = fopen([input_folder input_names{i}],'r');
+ switch input_names{i}
+ case hp_file
+ hp = fscanf(fileID,formatSpec);
+ case K_file
+ K = fscanf(fileID,formatSpec);
+ case X_file
+ fileID_columns = fopen([input_folder columns_X_file],'r');
+ columns = fscanf(fileID_columns,formatSpec);
+ size=[columns Inf];
+ X = [fscanf(fileID, formatSpec, size)]';
+ case Y_file
+ fileID_columns = fopen([input_folder columns_Y_file],'r');
+ columns = fscanf(fileID_columns,formatSpec);
+ size=[columns Inf];
+ Y = [fscanf(fileID, formatSpec, size)]';
+ end
+end
+
+
+temp = num2cell(zeros(K,4));
+temp_columns = zeros(K,4);
+for k=1:K
+ % separate the keep_in data into training and test data according
+ % to the chosen test percentage tp
+ [holdout_X, keepin_X, holdout_Y, keepin_Y] = dp_partition_holdout(hp, X, Y);
+ temp(k,:) = {holdout_X, keepin_X, holdout_Y, keepin_Y};
+ temp_columns(k,:) = [size(holdout_X,2), size(keepin_X,2), size(holdout_Y,2), size(keepin_Y,2)];
+end
+
+output_names = {'holdout_X' 'keepin_X' 'holdout_Y' 'keepin_Y'};
+
+for i=1:size(temp,1)
+ for ii=1:size(temp,2)
+ M = temp{i,ii};
+ dlmwrite([output_folder output_names{ii} '_split_' num2str(i) '.txt'],M,'delimiter','\t');
+ C = temp_columns(i,ii);
+ dlmwrite([output_folder 'columns_' output_names{ii} '_split_' num2str(i) '.txt'],C);
+ end
+end
diff --git a/Visualization_Module/dp_matfile.m b/Visualization_Module/dp_matfile.m
new file mode 100644
index 0000000..115e2d1
--- /dev/null
+++ b/Visualization_Module/dp_matfile.m
@@ -0,0 +1,8 @@
+function dp_matfile(file, RHO_avg, success_cu_cv, i)
+
+FID = file;
+M = matfile(FID,'Writable',true);
+M.RHO_avg(i,1) = RHO_avg;
+M.success_cu_cv(i,1) = success_cu_cv;
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_missing_rho.m b/Visualization_Module/dp_missing_rho.m
new file mode 100644
index 0000000..56f23bf
--- /dev/null
+++ b/Visualization_Module/dp_missing_rho.m
@@ -0,0 +1,26 @@
+%% fill in missing RHO values
+
+
+filecount = size(dir([analysis_folder '/RHO_avg_*']),1);
+RHO_collection = nan(size(cu_cv_combination,2),1);
+dir_RHO = dir([analysis_folder '/RHO_avg_*']);
+
+for i=1:size(RHO_collection,1)
+ if exist(['RHO_avg_' num2str(i) '.mat'],'file')
+ load([analysis_folder '/RHO_avg_',num2str(i),'.mat']);
+ RHO_collection(i,1) = RHO_avg;
+% delete([analysis_folder '/RHO_avg_',num2str(i),'.mat']);
+ else
+ RHO_collection(i,1) = NaN;
+ end
+end
+
+missing_rho = isnan(RHO_collection);
+
+temp = 1:1600;
+ID_missing = temp(missing_rho)';
+dlmwrite('missing_ID.txt',ID_missing)
+
+
+cd(analysis_folder) %'/temp_RHO']);
+system('qsub /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/Hyperparameter_optimization/dp_rho_missing.sh');
\ No newline at end of file
diff --git a/Visualization_Module/dp_perm.m b/Visualization_Module/dp_perm.m
new file mode 100644
index 0000000..735bd9c
--- /dev/null
+++ b/Visualization_Module/dp_perm.m
@@ -0,0 +1,7 @@
+function data_perm = dp_perm(data)
+perm = randperm(size(data,1)); %create a random permutation of the numbers 1 to a
+
+% use the permuted numbers to reshuffle the rows of the data set
+data_perm = data(perm,:);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_perm_nan.m b/Visualization_Module/dp_perm_nan.m
new file mode 100644
index 0000000..089a6df
--- /dev/null
+++ b/Visualization_Module/dp_perm_nan.m
@@ -0,0 +1,65 @@
+%% DP function to compute NaN values for RHO_b
+
+function [RHO_b_collection_completed] = dp_perm_nan(RHO_b_collection, spls_standalone_path, permutation_folder, utilities_folder, mem_total, max_sim_jobs, queue_name)
+
+nan_log = isnan(RHO_b_collection);
+
+if sum(nan_log)>0
+ if ~exist([permutation_folder, '/addition'],'dir')
+ mkdir([permutation_folder, '/addition']);
+ permutation_addition_folder=[permutation_folder, '/addition'];
+ else
+ permutation_addition_folder=[permutation_folder, '/addition'];
+ end
+
+ copyfile([permutation_folder '/opt_param.mat'], [permutation_addition_folder '/opt_param.mat']);
+ load([permutation_addition_folder '/opt_param.mat']);
+
+ while sum(nan_log)>0
+
+ for i=1:sum(nan_log)
+ temp = randperm(size(keep_in_data_y,1))';
+ FID = fopen([permutation_addition_folder '/perm_' num2str(i) '.txt'],'w');
+ fprintf(FID,'%d\n',temp);
+ fclose(FID);
+ end
+
+ % write a bash script for hyperparameter optimization, which can later be called
+ permutation_bash = dp_bash_para_new(spls_standalone_path, permutation_addition_folder, utilities_folder, 'permutation', mem_total, sum(nan_log), max_sim_jobs, queue_name);
+
+ % submit the bash script for parallel computing of RHO_b values to the queue
+ cd(permutation_addition_folder);
+ system(['qsub ' permutation_bash]);
+
+ % collect all files with RHO_b values, open them and store the RHO values in a vector
+ filecount_add = size(dir([permutation_addition_folder '/RHO_b_*.txt']),1);
+ RHO_b_collection_addition = nan(sum(nan_log),1);
+
+ while filecount_add < sum(nan_log)
+ filecount_add = size(dir([permutation_addition_folder '/RHO_b_*.txt']),1);
+ end
+
+ for i=1:size(RHO_b_collection_addition,1)
+ if exist([permutation_addition_folder '/RHO_b_',num2str(i),'.txt'],'file')
+ RHO_b_collection_addition(i,1) = dp_txtscan([permutation_addition_folder '/RHO_b_' num2str(i) '.txt'], '%f');
+ delete([permutation_addition_folder '/RHO_b_',num2str(i),'.txt']);
+ else
+ RHO_b_collection_addition(i,1) = NaN;
+ end
+ end
+
+ RHO_b_collection(nan_log) = RHO_b_collection_addition;
+ nan_log = isnan(RHO_b_collection);
+
+ end
+
+ RHO_b_collection_completed = RHO_b_collection;
+
+else
+
+ RHO_b_collection_completed = RHO_b_collection;
+
+end
+
+end
+
\ No newline at end of file
diff --git a/Visualization_Module/dp_perm_testing.m b/Visualization_Module/dp_perm_testing.m
new file mode 100644
index 0000000..799e9ac
--- /dev/null
+++ b/Visualization_Module/dp_perm_testing.m
@@ -0,0 +1,23 @@
+%% new function for permutation testing
+
+function dp_perm_testing(i, analysis_folder)
+
+load([analysis_folder '/opt_param.mat']);
+
+perm_rows = dp_txtscan([analysis_folder '/perm_' i '.txt'], '%f');
+perm_data_y = keep_in_data_y(perm_rows,:);
+
+[u_b, v_b, ~]=spls_suppressed_display(keep_in_data_x, perm_data_y, cu_opt, cv_opt);
+
+% compute the absolute correlation between the hold_out data
+% and the permuted u_b and v_b
+RHO_b = abs(corr(hold_out_data_x*u_b,hold_out_data_y*v_b));
+
+% save the calculated RHO_b value
+FID_RHO = fopen([analysis_folder '/RHO_b_' i '.txt'],'w');
+fprintf(FID_RHO, '%.4f', RHO_b);
+fclose(FID_RHO);
+
+delete([analysis_folder '/perm_' i '.txt']);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_perm_testing_100.m b/Visualization_Module/dp_perm_testing_100.m
new file mode 100644
index 0000000..5a8d521
--- /dev/null
+++ b/Visualization_Module/dp_perm_testing_100.m
@@ -0,0 +1,27 @@
+%% new function for permutation testing
+
+function dp_perm_testing_100(i, size_sets_str, analysis_folder)
+
+load([analysis_folder '/opt_param.mat']);
+
+size_sets = str2double(size_sets_str);
+
+for ii=1:size_sets
+ perm_rows = dp_txtscan([analysis_folder '/perm_' i '_' num2str(ii) '.txt'], '%f');
+ perm_data_y = keep_in_data_y(perm_rows,:);
+ [u_b, v_b, ~]=spls_suppressed_display(keep_in_data_x, perm_data_y, cu_opt, cv_opt);
+
+ % compute the absolute correlation between the hold_out data
+ % and the permuted u_b and v_b
+ RHO_b = abs(corr(hold_out_data_x*u_b,hold_out_data_y*v_b));
+
+ % save the calculated RHO_b value
+ save_ID = ((str2double(i)-1)*size_sets) + ii;
+ FID_RHO = fopen([analysis_folder '/RHO_b_' num2str(save_ID) '.txt'],'w');
+ fprintf(FID_RHO, '%.4f', RHO_b);
+ fclose(FID_RHO);
+ delete([analysis_folder '/perm_' i '_' num2str(ii) '.txt']);
+end
+
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_perm_testing_100.m~ b/Visualization_Module/dp_perm_testing_100.m~
new file mode 100644
index 0000000..b5a57b5
--- /dev/null
+++ b/Visualization_Module/dp_perm_testing_100.m~
@@ -0,0 +1,27 @@
+%% new function for permutation testing
+
+function dp_perm_testing_100(i, size_sets_str, analysis_folder)
+
+load([analysis_folder '/opt_param.mat']);
+
+size_sets = str2double(size_sets_str);
+
+for ii=1:size_sets
+ perm_rows = dp_txtscan([analysis_folder '/perm_' i '_' num2str(ii) '.txt'], '%f');
+ perm_data_y = keep_in_data_y(perm_rows,:);
+ [u_b, v_b, ~]=spls_suppressed_display(keep_in_data_x, perm_data_y, cu_opt, cv_opt);
+
+ % compute the absolute correlation between the hold_out data
+ % and the permuted u_b and v_b
+ RHO_b = abs(corr(hold_out_data_x*u_b,hold_out_data_y*v_b));
+
+
+ % save the calculated RHO_b value
+ FID_RHO = fopen([analysis_folder '/RHO_b_' i '_' num2str(ii) '.txt'],'w');
+ fprintf(FID_RHO, '%.4f', RHO_b);
+ fclose(FID_RHO);
+ delete([analysis_folder '/perm_' i '_' num2str(ii)]);
+end
+
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_prep.m b/Visualization_Module/dp_prep.m
new file mode 100644
index 0000000..9607d22
--- /dev/null
+++ b/Visualization_Module/dp_prep.m
@@ -0,0 +1,17 @@
+%% prep file for spls parallel environment
+
+function [variable_path] = dp_prep(folder, variable, variable_name)
+
+if ischar(variable)
+ FID = fopen([folder '/' variable_name '.txt'],'w');
+ fprintf(FID,'%s',variable);
+ fclose(FID);
+elseif isnumeric(variable)
+ FID = fopen([folder '/' variable_name '.txt'],'w');
+ fprintf(FID,'%f',variable);
+ fclose(FID);
+end
+
+variable_path = [folder '/' variable_name '.txt'];
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_range_file.m b/Visualization_Module/dp_range_file.m
new file mode 100644
index 0000000..5a29e4c
--- /dev/null
+++ b/Visualization_Module/dp_range_file.m
@@ -0,0 +1,5 @@
+%% DP range file
+
+function dp_range_file(output_folder, R)
+dlmwrite([output_folder 'range_file.txt'],R)
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_rho_avg_1.sh b/Visualization_Module/dp_rho_avg_1.sh
new file mode 100644
index 0000000..de0c59d
--- /dev/null
+++ b/Visualization_Module/dp_rho_avg_1.sh
@@ -0,0 +1,21 @@
+##!/bin/sh
+#$ -S /bin/sh
+#current environment variables are used on you SGE jobs
+#$ -V
+#Use current working directory
+#$ -cwd
+#Merge the standard out and standard error to one file
+#$ -j y
+#$ -o $JOB_ID-output.txt
+#$ -t 1:10
+#$ -l h_vmem=8G
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+cd /volume/DP_FEF/Analysis/28-Mar-2018
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_1/for_testing/dp_RHO_avg_1 ${loopid[0]}
+
diff --git a/Visualization_Module/dp_rho_avg_2.sh b/Visualization_Module/dp_rho_avg_2.sh
new file mode 100644
index 0000000..98d9610
--- /dev/null
+++ b/Visualization_Module/dp_rho_avg_2.sh
@@ -0,0 +1,21 @@
+##!/bin/sh
+#$ -S /bin/sh
+#current environment variables are used on you SGE jobs
+#$ -V
+#Use current working directory
+#$ -cwd
+#Merge the standard out and standard error to one file
+#$ -j y
+#$ -o $JOB_ID-output.txt
+#$ -t 1:10
+#$ -l h_vmem=8G
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+cd /volume/DP_FEF/Analysis/28-Mar-2018
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_2/for_testing/dp_RHO_avg_2 ${loopid[0]}
+
diff --git a/Visualization_Module/dp_rho_avg_3.sh b/Visualization_Module/dp_rho_avg_3.sh
new file mode 100644
index 0000000..6627eed
--- /dev/null
+++ b/Visualization_Module/dp_rho_avg_3.sh
@@ -0,0 +1,21 @@
+##!/bin/sh
+#$ -S /bin/sh
+#current environment variables are used on you SGE jobs
+#$ -V
+#Use current working directory
+#$ -cwd
+#Merge the standard out and standard error to one file
+#$ -j y
+#$ -o $JOB_ID-output.txt
+#$ -t 1:10
+#$ -l h_vmem=8G
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+cd /volume/DP_FEF/Analysis/28-Mar-2018
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_4/for_testing/dp_RHO_avg_4 ${loopid[0]}
+
diff --git a/Visualization_Module/dp_rho_avg_4.sh b/Visualization_Module/dp_rho_avg_4.sh
new file mode 100644
index 0000000..6627eed
--- /dev/null
+++ b/Visualization_Module/dp_rho_avg_4.sh
@@ -0,0 +1,21 @@
+##!/bin/sh
+#$ -S /bin/sh
+#current environment variables are used on you SGE jobs
+#$ -V
+#Use current working directory
+#$ -cwd
+#Merge the standard out and standard error to one file
+#$ -j y
+#$ -o $JOB_ID-output.txt
+#$ -t 1:10
+#$ -l h_vmem=8G
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+cd /volume/DP_FEF/Analysis/28-Mar-2018
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_4/for_testing/dp_RHO_avg_4 ${loopid[0]}
+
diff --git a/Visualization_Module/dp_rho_avg_5.sh b/Visualization_Module/dp_rho_avg_5.sh
new file mode 100644
index 0000000..042fb74
--- /dev/null
+++ b/Visualization_Module/dp_rho_avg_5.sh
@@ -0,0 +1,22 @@
+##!/bin/sh
+#$ -S /bin/sh
+#current environment variables are used on you SGE jobs
+#$ -V
+#Use current working directory
+#$ -cwd
+#Merge the standard out and standard error to one file
+#$ -j y
+#$ -o $JOB_ID-output.txt
+#$ -t 1:10
+#$ -l h_vmem=8G
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+cd /volume/DP_FEF/Analysis/28-Mar-2018
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+cd /volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_5/for_testing/dp_RHO_avg_5 ${loopid[0]}
+
diff --git a/Visualization_Module/dp_rho_avg_5.sh~ b/Visualization_Module/dp_rho_avg_5.sh~
new file mode 100644
index 0000000..042fb74
--- /dev/null
+++ b/Visualization_Module/dp_rho_avg_5.sh~
@@ -0,0 +1,22 @@
+##!/bin/sh
+#$ -S /bin/sh
+#current environment variables are used on you SGE jobs
+#$ -V
+#Use current working directory
+#$ -cwd
+#Merge the standard out and standard error to one file
+#$ -j y
+#$ -o $JOB_ID-output.txt
+#$ -t 1:10
+#$ -l h_vmem=8G
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+cd /volume/DP_FEF/Analysis/28-Mar-2018
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+cd /volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_5/for_testing/dp_RHO_avg_5 ${loopid[0]}
+
diff --git a/Visualization_Module/dp_rho_avg_6.sh b/Visualization_Module/dp_rho_avg_6.sh
new file mode 100644
index 0000000..08c3c17
--- /dev/null
+++ b/Visualization_Module/dp_rho_avg_6.sh
@@ -0,0 +1,21 @@
+##!/bin/sh
+#$ -S /bin/sh
+#current environment variables are used on you SGE jobs
+#$ -V
+#Use current working directory
+#$ -cwd
+#Merge the standard out and standard error to one file
+#$ -j y
+#$ -o $JOB_ID-output.txt
+#$ -t 1:11
+#$ -l h_vmem=8G
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+cd /volume/DP_FEF/Analysis/28-Mar-2018
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+/volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO/dp_RHO_avg_6/for_testing/dp_RHO_avg_6 ${loopid[0]}
+
diff --git a/Visualization_Module/dp_rho_avg_new.sh b/Visualization_Module/dp_rho_avg_new.sh
new file mode 100644
index 0000000..888a423
--- /dev/null
+++ b/Visualization_Module/dp_rho_avg_new.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+#$ -cwd
+#$ -o /volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO/ #output directory
+#$ -j y
+#$ -N RHO_avg_1_10 # Name of the job
+#$ -S /bin/bash
+#$ -M david.popovic@med.uni-muenchen.de
+#$ -m ae # This is if you want emails when jobs abort or exit
+#$ -l mem_free=2G # This is how much memory you're requesting
+#$ -l h_rss=2G # This is the absolute memory limit
+#$ -l h_stack=256M # This is for matlab
+#$ -t 1:11
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+cd /volume/DP_FEF/Analysis/06-Apr-2018/temp_RHO/
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/dp_RHO_avg_6/for_testing/dp_RHO_avg_6 ${loopid[0]}
+
diff --git a/Visualization_Module/dp_spls_para.m b/Visualization_Module/dp_spls_para.m
new file mode 100644
index 0000000..6091841
--- /dev/null
+++ b/Visualization_Module/dp_spls_para.m
@@ -0,0 +1,474 @@
+function [final_parameters, epsilon, omega] = dp_spls_para(folders_for_analysis, variables_for_analysis, parameters_for_analysis)
+%
+% Implementation of SPLS algorithm and framework as described in Monteiro
+% et al. 2016, for details: doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs:
+%
+% X, Y - data matrices for MRI images (X) and behavioral data (Y) in
+% the form: samples x features. Use MRI data directly from
+% Neurominer output, the function will standardize both the
+% MRI data and the behavioral data, so that mean = 0 and std =
+% 1.
+%
+% hp - Ratio (in %) of hold out data, which is projected on both
+% the original data set with optimal cu/cv and on the
+% permuted dataset with optimal cu/cv. Default: 10
+%
+% tp - Ratio (in %) of the test data within the K-fold loops.
+% Default: 20
+%
+% B - Number of Permutations for the statistical evaluation of
+% the discovered cu/cv combination. Default: 10000
+%
+% W - Number of wide loops that define how many times the entire
+% SPLS procedure is repeated and how many final p values are
+% calculated. Default: 10
+%
+% K - Number of K splits for the training and testing of the held
+% in data for each cu/cv combination. Default: 100
+%
+%
+% Outputs:
+%
+% final_parameters - Results matrix with rows = number of significant
+% LVs and columns containing the following variables
+% w, cu_opt, cv_opt, u_opt, v_opt, success_opt,
+% RHO_opt, p. The last row contains the first LV that
+% was not significant, it is for informative purposes
+% only.
+%
+% epsilon - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector u of
+% the LV on X.
+%
+% omega - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector v of
+% the LV on Y.
+%
+%
+% Version: 2018-04-12
+%__________________________________________________________________________
+%
+% Written by David Popovic
+% Email: david.popovic@med.uni-muenchen.de
+%
+
+%% 1. Preparation of SPLS and assignment of matrices
+% Please make sure that you have added the path for the folder containing
+% the following function: spls.m, dp_spls.m, dp_partition_holdout.m,
+% dp_perm.m
+% standardize the data matrices X and Y for usage in SPLS. X_original and
+% Y_original will later be used for projection onto the final SPLS latent
+% space spanned by u and v
+
+load(variables_for_analysis);
+
+for i=1:size(folders_for_analysis,2)
+ switch folders_for_analysis{1,i}
+ case 'analysis_folder'
+ analysis_folder = folders_for_analysis{2,i};
+ case 'prep_folder'
+ prep_folder = folders_for_analysis{2,i};
+ case 'spls_toolbox_path'
+ spls_toolbox_path = folders_for_analysis{2,i};
+ end
+end
+
+for i=1:size(parameters_for_analysis,2)
+ switch parameters_for_analysis{1,i}
+ case 'hp'
+ hp = parameters_for_analysis{2,i};
+ case 'tp'
+ tp = parameters_for_analysis{2,i};
+ case 'B'
+ B = parameters_for_analysis{2,i};
+ case 'W'
+ W = parameters_for_analysis{2,i};
+ case 'K'
+ K = parameters_for_analysis{2,i};
+ case 'RP'
+ RP = parameters_for_analysis{2,i};
+ case 'vmem_req'
+ vmem_req = parameters_for_analysis{2,i};
+ case 'max_sim_jobs'
+ max_sim_jobs = parameters_for_analysis{2,i};
+ case 'queue_name'
+ queue_name = parameters_for_analysis{2,i};
+ case 'vmem_req'
+ vmem_req = parameters_for_analysis{2,i};
+ end
+end
+
+
+X_original = zscore(X);
+Y_original = zscore(Y);
+
+% define the data matrices X and Y for input into the SPLS algorithm
+X = X_original;
+Y = Y_original;
+
+% define the default values for variables tp, hp, B, W, K if no value for
+% them is entered
+
+% hp ratio
+if ~exist('hp', 'var')
+ hp = 10;
+end
+
+% tp ratio
+if ~exist('tp', 'var')
+ tp = 20;
+end
+
+% B
+if ~exist('B', 'var')
+ B = 10000;
+end
+
+% W
+if ~exist('W', 'var')
+ W = 10;
+end
+
+% K
+if ~exist('K', 'var')
+ K = 100;
+end
+
+% RP
+if ~exist('RP', 'var')
+ RP = 40;
+end
+
+%% 2. LV loop
+
+% this loop is repeated for the next vector pair u and v as long as the
+% previous vector pair was significant. If the previous vector was not
+% significant, then the loop will stop
+
+% pLV is a starting p value set to 0, so that the while loop starts. Later
+% on it will be updated at the end of each LV iteration. Then it serves the
+% purpose to stop the while loop as soon as an LV was not significant.
+p_LV = 0;
+
+% FWE_rate corrects for multiple testing for the W amount of p values
+FWE_rate = 0.05 / W;
+
+% ff counts the iteration through the LV loops, so that the results for each
+% LV can be stored in separate rows
+ff = 1;
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+cu_range_points = linspace(1,sqrt(size(X,2)),RP);
+cv_range_points = linspace(1,sqrt(size(Y,2)),RP);
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times
+cu_range = repelem(cu_range_points,numel(cu_range_points));
+cv_range = repmat(cv_range_points,1,numel(cv_range_points));
+cu_cv_combination = [cu_range;cv_range]; % this matrix contains all the possible combinations between cu and cv
+
+% define column names for matrices so that you can access them later by
+% indexing
+final_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'};
+opt_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'}; % names of parameters for optimal cu/cv combination of the w-th loop
+cu_cv_combination_names = {'cu';'cv'};
+
+% preallocate placeholder matrices for higher speed
+final_parameters = num2cell(nan(size(Y,2), numel(final_parameters_names))); % cell array to store final parameters for each LV iteration
+epsilon = nan(size(final_parameters,1),size(X_original,1)); %projection of weight vector u on corresponding matrix X
+omega = nan(size(final_parameters,1),size(Y_original,1)); % projection of weight vector v on corresponding matrix Y
+
+% indices for later use
+index_u = strcmp(opt_parameters_names,'u');
+index_v = strcmp(opt_parameters_names,'v');
+index_cu = strcmp(cu_cv_combination_names,'cu');
+index_cv = strcmp(cu_cv_combination_names,'cv');
+index_RHO = strcmp(opt_parameters_names, 'RHO');
+index_p = strcmp(opt_parameters_names, 'p');
+
+% set up the parallel environment
+if ~exist([analysis_folder '/hyperparameter'],'dir')
+ mkdir([analysis_folder '/hyperparameter'])
+ hyperparameter_folder = [analysis_folder '/hyperparameter'];
+else
+ hyperparameter_folder = [analysis_folder '/hyperparameter'];
+end
+
+if ~exist([analysis_folder '/permutation'],'dir')
+ mkdir([analysis_folder '/permutation'])
+ permutation_folder = [analysis_folder '/permutation'];
+else
+ permutation_folder = [analysis_folder '/permutation'];
+end
+
+for i=1:size(cu_range,2)
+ FID = fopen([hyperparameter_folder '/cu_' num2str(i) '.txt'],'w');
+ fprintf(FID,'%.4f',cu_range(i));
+ fclose(FID);
+end
+
+for i=1:size(cv_range,2)
+ FID = fopen([hyperparameter_folder '/cv_' num2str(i) '.txt'],'w');
+ fprintf(FID,'%.4f',cv_range(i));
+ fclose(FID);
+end
+
+% here starts the outer loop for each single LV, the next LV is only
+% computed if the previous LV was significant (with FWE correction)
+while p_LV <= FWE_rate
+
+%% 3. Wide loop
+% repeats the entire process W times to obtain W different final p values,
+% which go into the omnibus hypothesis
+
+% matrix to store the optimal parameters of the w-th loop
+opt_parameters = num2cell(nan(W,numel(opt_parameters_names)));
+
+ for w=1:W
+
+ %% hyper-parameter optimisation
+ % remove hp% of the data randomly and keep it in a hold-out
+ % dataset, the rest is called the keep_in data for training/testing
+ % the algorithm
+ [hold_out_data_x, keep_in_data_x, hold_out_data_y, keep_in_data_y] = dp_partition_holdout(hp, X, Y);
+
+ % save the hyperparameter information for optimization step
+ save([hyperparameter_folder '/cucv.mat'],...
+ 'keep_in_data_x',...
+ 'keep_in_data_y',...
+ 'tp',...
+ 'K',...,
+ 'hyperparameter_folder');
+
+ % write a bash script for hyperparameter optimization, which can
+ % later be called
+ no_jobs = size(cu_cv_combination,2);
+ hyperopt_bash = dp_bash_para(spls_toolbox_path, hyperparameter_folder, 'hyperopt', vmem_req, no_jobs, max_sim_jobs, queue_name);
+
+ % access the temp_RHO folder and initialize the bash script for
+ % parallel computing of the hyperparameter optimization
+ cd(hyperparameter_folder);
+ system(['qsub ' hyperopt_bash]);
+
+ % set a variable which counts the files in the RHO folder
+ filecount = size(dir([hyperparameter_folder '/RHO_avg_*']),1);
+ RHO_avg_collection = nan(size(cu_cv_combination,2),1);
+
+ % use a while loop which recounts all the files in the RHO folder
+ % until all computations from the parallelized hyperparameter
+ % optimization step are completed and all files are saved in that
+ % folder, the while loop will be exited as soon as all files are
+ % saved in the folder
+ while filecount < size(cu_cv_combination,2)
+ filecount = size(dir([hyperparameter_folder '/RHO_avg_*']),1);
+ end
+
+ % load all RHO values which were saved in mat files into a
+ % RHO_collection vector
+ for i=1:size(cu_cv_combination,2)
+ if exist([hyperparameter_folder '/RHO_avg_' num2str(i) '.mat'])
+ load([hyperparameter_folder '/RHO_avg_',num2str(i),'.mat']);
+ RHO_avg_collection(i,1) = RHO_avg;
+ delete([hyperparameter_folder '/RHO_avg_',num2str(i),'.mat']);
+ else
+ RHO_avg_collection(i,1) = NaN;
+ end
+ end
+
+
+% select the hyperparameter combination with the highest average
+% correlation, ie the one with the highest RHO_avg
+ [~, index_RHO] = max(RHO_avg_collection);
+
+% find the corresponding cu and cv values of the max RHO element, this
+% gives you the cu/cv combination with the highest average correlation
+
+ cu_opt = cu_cv_combination(index_cu,index_RHO);
+ cv_opt = cu_cv_combination(index_cv,index_RHO);
+
+ % save the optimized parameters
+ save([permutation_folder '/opt_param.mat'],...
+ 'keep_in_data_x',...
+ 'keep_in_data_y',...
+ 'hold_out_data_x',...
+ 'hold_out_data_y',...
+ 'cu_opt',...
+ 'cv_opt',...
+ 'RHO_avg_collection',...
+ 'permutation_folder');
+
+ %% Statistical Evaluation
+
+
+ %train the model with the optimal cu/cv combination on the previous
+ %train/test data set to get u and v
+ [u_opt, v_opt, success_opt]=spls(keep_in_data_x, keep_in_data_y,cu_opt, cv_opt);
+
+ %project the hold_out data set on the computed u and v vectors to
+ %get the absolute correlations between these projections
+ RHO_opt = abs(corr(hold_out_data_x*u_opt,hold_out_data_y*v_opt));
+
+ % permute the keep_in data in one dimension so that the
+ % relationship between these two views gets destroyed
+
+% Now comes the permutation step, where the order of the samples in one
+% view (in this case the Y matrix) gets permuted and the algorithm is
+% trained on the permuted data set with a destroyed relationship
+% between X and Y, this process is repeated B times
+
+ % access the temp_B folder to store all RHO_b values which will be
+ % computed in parallel in the next step
+
+ for i=1:B
+ temp = randperm(size(keep_in_data_y,1))';
+ dlmwrite([permutation_folder '/perm_' num2str(i) '.txt'],temp);
+ end
+
+ % write a bash script for hyperparameter optimization, which can
+ % later be called
+ permutation_bash = dp_bash_para(spls_toolbox_path, permutation_folder, 'permutation', vmem_req, B, max_sim_jobs, queue_name);
+
+ % submit the bash script for parallel computing of RHO_b values to the
+ % queue
+ cd(permutation_folder);
+ system(['qsub ' permutation_bash]);
+
+ % collect all files with RHO_b values, open them and store the RHO
+ % values in a vector
+ filecount = size(dir([permutation_folder '/RHO_b_*']),1);
+ RHO_b_collection = nan(B,1);
+
+ % see hyperparameter optimization
+
+ while filecount < B
+ filecount = size(dir([permutation_folder '/RHO_b_*']),1);
+ end
+
+ for i=1:size(RHO_b_collection,1)
+ if exist([permutation_folder '/RHO_b_' num2str(i) '.mat'],'file')==2
+ load([permutation_folder '/RHO_b_',num2str(i),'.mat']);
+ RHO_b_collection(i,1) = RHO_b;
+ delete([permutation_folder '/RHO_b_',num2str(i),'.mat']);
+ else
+ RHO_b_collection(i,1) = NaN;
+ end
+ end
+
+ % test the following null hypothesis H_s: "There is no relationship
+ % between the two views, therefore the correlation obtained with
+ % the original data is not different from the correlation
+ % obtained with the permuted data"
+
+ % calculate how many times RHO_b was bigger than or equal to RHO_opt,
+ % ie how many times the permutated data led to a higher correlation
+ % using spls than the original data
+ RHO_count_b = sum(RHO_b_collection >= RHO_opt);
+
+ % calculate the p value to test whether the null hypothesis is true
+ p = ((1+RHO_count_b)/(B+1));
+
+ % store all parameters of the w-th wide loop into a matrix
+ opt_parameters(w,:) = {w cu_opt cv_opt u_opt v_opt success_opt RHO_opt p};
+
+
+ end
+
+ save([analysis_folder '/opt_parameters_' num2str(ff) '.mat'],'opt_parameters');
+
+ %% test the omnibus hypothesis using the p values
+
+ % Omnibus hypothesis H_omni: "All the null hypotheses H_s are true" if
+ % any of the p values are lower than the FWE-corrected threshold,
+ % then the omnibus hypothesis can be rejected after that.
+
+ % Search for the statistically significant w-th iteration with the
+ % lowest p value, if more than one iteration has the same p value,
+ % select the one that has the highest RHO value => this is the final
+ % w-th iteration with the corresponding cu/cv features and u/v scores
+
+ % remove parameter combinations with nans as RHO_opt
+
+ if exist('opt_parameters_clean','var')
+ clear opt_parameters_clean
+ end
+
+ nn=1;
+ for i=1:size(opt_parameters,1)
+ if ~isnan(cell2mat(opt_parameters(i,index_RHO)))
+ opt_parameters_clean(nn,:) = opt_parameters(i,:);
+ nn=nn+1;
+ end
+ end
+
+ %create a logical indexing the lowest p-value(s)
+ p_min = min(cell2mat(opt_parameters_clean(:,index_p)));
+ logical_p_min = cell2mat(opt_parameters_clean(:,index_p)) == p_min;
+ temp1 = opt_parameters_clean(logical_p_min,:); % placeholder to make syntax easier
+
+ if size(temp1,1) > 1 % if there is more than one p-value that is equal to the lowest p-value, ie there are two absolute minimal p-values, then continue in the loop
+ RHO_max = cell2mat(temp1(:,index_RHO)) == max(cell2mat(temp1(:,index_RHO))); % logical indexing the highest RHO value
+ final_parameters(ff,:) = temp1(RHO_max,:); % take the row with the lowest p-value and the highest RHO value
+ else
+ final_parameters(ff,:) = temp1; % if there is just one absolute minimal p value, then take this row
+ end
+
+ %% Matrix Deflation => Projection Deflation
+
+ % This method removes the covariance explained by u and v from X
+ % and Y by projecting the data matrices onto the space spanned by the
+ % corresponding weight vector, and subtracting this from the data:
+
+ u = final_parameters{ff,index_u}; % weight vector for X
+ v = final_parameters{ff,index_v}; % weight vector for Y
+ X = X - (X*u)*u'; % the effect of u on X is removed by projection deflation
+ Y = Y - (Y*v)*v'; % the effect of v on Y is removed by projection deflation
+
+ % the p value of this LV is updated from the previously set value of
+ % zero to the actual p value of the LV, if this p value is lower than
+ % the FWE_rate then the while loop continues after matrix deflation and
+ % it keeps looking for the next possible significant LV. If the p value
+ % is higher than the FWE_rate, then the while loop is discontinued and
+ % the algorithm stops. Therefore, this function generates all possible
+ % significant LVs and also the first non-significant LV, afterwards the
+ % algorithm stops.
+ p_LV = final_parameters{ff,index_p};
+
+
+ %% Projection of the original data onto the SPLS latent space
+
+ % epsilon and omega are the projections of the original data onto the
+ % SPLS latent space, spanned by the weight vector pair u and v of this
+ % LV. Therefore each LV spans a specific latent space onto wihich the
+ % samples can be projected. These latent spaces can then be used to
+ % stratify patients.
+ epsilon(ff,:) = X_original * final_parameters{ff,index_u};
+ omega(ff,:) = Y_original * final_parameters{ff,index_v};
+
+ % ff counts through the most outside LV while loop = counts the amount
+ % of significant LVs
+ ff = ff+1;
+
+
+end
+
+%% clean up txt files and other files which are not needed anymore
+files_to_clean = {'cu_', 'cv_'};
+folder_to_clean = hyperparameter_folder;
+for i=1:size(files_to_clean,2)
+ dp_cleanup(folder_to_clean, files_to_clean{i})
+end
+
+% after the LVs are computed, clean up the final parameters, epsilon and
+% omega matrix by removing empty rows
+final_parameters(ff:size(final_parameters,1),:) = [];
+epsilon(ff:size(final_parameters,1),:) = [];
+omega(ff:size(final_parameters,1),:) = [];
+
+save([analysis_folder '/result.mat'], 'final_parameters', 'epsilon', 'omega');
+
+end
diff --git a/Visualization_Module/dp_spls_para_txt.m b/Visualization_Module/dp_spls_para_txt.m
new file mode 100644
index 0000000..55cb337
--- /dev/null
+++ b/Visualization_Module/dp_spls_para_txt.m
@@ -0,0 +1,461 @@
+function [final_parameters, epsilon, omega] = dp_spls_para_txt(folders_for_analysis, variables_for_analysis, parameters_for_analysis)
+%
+% Implementation of SPLS algorithm and framework as described in Monteiro
+% et al. 2016, for details: doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs:
+%
+% X, Y - data matrices for MRI images (X) and behavioral data (Y) in
+% the form: samples x features. Use MRI data directly from
+% Neurominer output, the function will standardize both the
+% MRI data and the behavioral data, so that mean = 0 and std =
+% 1.
+%
+% hp - Ratio (in %) of hold out data, which is projected on both
+% the original data set with optimal cu/cv and on the
+% permuted dataset with optimal cu/cv. Default: 10
+%
+% tp - Ratio (in %) of the test data within the K-fold loops.
+% Default: 20
+%
+% B - Number of Permutations for the statistical evaluation of
+% the discovered cu/cv combination. Default: 10000
+%
+% W - Number of wide loops that define how many times the entire
+% SPLS procedure is repeated and how many final p values are
+% calculated. Default: 10
+%
+% K - Number of K splits for the training and testing of the held
+% in data for each cu/cv combination. Default: 100
+%
+%
+% Outputs:
+%
+% final_parameters - Results matrix with rows = number of significant
+% LVs and columns containing the following variables
+% w, cu_opt, cv_opt, u_opt, v_opt, success_opt,
+% RHO_opt, p. The last row contains the first LV that
+% was not significant, it is for informative purposes
+% only.
+%
+% epsilon - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector u of
+% the LV on X.
+%
+% omega - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector v of
+% the LV on Y.
+%
+%
+% Version: 2018-04-12
+%__________________________________________________________________________
+%
+% Written by David Popovic
+% Email: david.popovic@med.uni-muenchen.de
+%
+
+%% 1. Preparation of SPLS and assignment of matrices
+% Please make sure that you have added the path for the folder containing
+% the following function: spls.m, dp_spls.m, dp_partition_holdout.m,
+% dp_perm.m
+% standardize the data matrices X and Y for usage in SPLS. X_original and
+% Y_original will later be used for projection onto the final SPLS latent
+% space spanned by u and v
+
+load(variables_for_analysis);
+
+for i=1:size(folders_for_analysis,2)
+ switch folders_for_analysis{1,i}
+ case 'analysis_folder'
+ analysis_folder = folders_for_analysis{2,i};
+ case 'prep_folder'
+ prep_folder = folders_for_analysis{2,i};
+ case 'spls_toolbox_path'
+ spls_toolbox_path = folders_for_analysis{2,i};
+ end
+end
+
+for i=1:size(parameters_for_analysis,2)
+ switch parameters_for_analysis{1,i}
+ case 'hp'
+ hp = parameters_for_analysis{2,i};
+ case 'tp'
+ tp = parameters_for_analysis{2,i};
+ case 'B'
+ B = parameters_for_analysis{2,i};
+ case 'W'
+ W = parameters_for_analysis{2,i};
+ case 'K'
+ K = parameters_for_analysis{2,i};
+ case 'RP'
+ RP = parameters_for_analysis{2,i};
+ case 'vmem_req'
+ vmem_req = parameters_for_analysis{2,i};
+ case 'max_sim_jobs'
+ max_sim_jobs = parameters_for_analysis{2,i};
+ case 'queue_name'
+ queue_name = parameters_for_analysis{2,i};
+ case 'vmem_req'
+ vmem_req = parameters_for_analysis{2,i};
+ end
+end
+
+
+X_original = zscore(X);
+Y_original = zscore(Y);
+
+% define the data matrices X and Y for input into the SPLS algorithm
+X = X_original;
+Y = Y_original;
+
+% define the default values for variables tp, hp, B, W, K if no value for
+% them is entered
+
+% hp ratio
+if ~exist('hp', 'var')
+ hp = 10;
+end
+
+% tp ratio
+if ~exist('tp', 'var')
+ tp = 20;
+end
+
+% B
+if ~exist('B', 'var')
+ B = 10000;
+end
+
+% W
+if ~exist('W', 'var')
+ W = 10;
+end
+
+% K
+if ~exist('K', 'var')
+ K = 100;
+end
+
+% RP
+if ~exist('RP', 'var')
+ RP = 40;
+end
+
+%% 2. LV loop
+
+% this loop is repeated for the next vector pair u and v as long as the
+% previous vector pair was significant. If the previous vector was not
+% significant, then the loop will stop
+
+% pLV is a starting p value set to 0, so that the while loop starts. Later
+% on it will be updated at the end of each LV iteration. Then it serves the
+% purpose to stop the while loop as soon as an LV was not significant.
+p_LV = 0;
+
+% FWE_rate corrects for multiple testing for the W amount of p values
+FWE_rate = 0.05 / W;
+
+% ff counts the iteration through the LV loops, so that the results for each
+% LV can be stored in separate rows
+ff = 1;
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+cu_range_points = linspace(1,sqrt(size(X,2)),RP);
+cv_range_points = linspace(1,sqrt(size(Y,2)),RP);
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times
+cu_range = repelem(cu_range_points,numel(cu_range_points));
+cv_range = repmat(cv_range_points,1,numel(cv_range_points));
+cu_cv_combination = [cu_range;cv_range]; % this matrix contains all the possible combinations between cu and cv
+
+% define column names for matrices so that you can access them later by
+% indexing
+final_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'};
+opt_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'}; % names of parameters for optimal cu/cv combination of the w-th loop
+cu_cv_combination_names = {'cu';'cv'};
+
+% preallocate placeholder matrices for higher speed
+final_parameters = num2cell(nan(size(Y,2), numel(final_parameters_names))); % cell array to store final parameters for each LV iteration
+epsilon = nan(size(final_parameters,1),size(X_original,1)); %projection of weight vector u on corresponding matrix X
+omega = nan(size(final_parameters,1),size(Y_original,1)); % projection of weight vector v on corresponding matrix Y
+
+% indices for later use
+index_u = strcmp(opt_parameters_names,'u');
+index_v = strcmp(opt_parameters_names,'v');
+index_cu = strcmp(cu_cv_combination_names,'cu');
+index_cv = strcmp(cu_cv_combination_names,'cv');
+index_RHO = strcmp(opt_parameters_names, 'RHO');
+index_p = strcmp(opt_parameters_names, 'p');
+
+% set up the parallel environment
+if ~exist([analysis_folder '/hyperparameter'],'dir')
+ mkdir([analysis_folder '/hyperparameter'])
+ hyperparameter_folder = [analysis_folder '/hyperparameter'];
+else
+ hyperparameter_folder = [analysis_folder '/hyperparameter'];
+end
+
+if ~exist([analysis_folder '/permutation'],'dir')
+ mkdir([analysis_folder '/permutation'])
+ permutation_folder = [analysis_folder '/permutation'];
+else
+ permutation_folder = [analysis_folder '/permutation'];
+end
+
+for i=1:size(cu_range,2)
+ FID = fopen([hyperparameter_folder '/cu_' num2str(i) '.txt'],'w');
+ fprintf(FID,'%.4f',cu_range(i));
+ fclose(FID);
+end
+
+for i=1:size(cv_range,2)
+ FID = fopen([hyperparameter_folder '/cv_' num2str(i) '.txt'],'w');
+ fprintf(FID,'%.4f',cv_range(i));
+ fclose(FID);
+end
+
+% here starts the outer loop for each single LV, the next LV is only
+% computed if the previous LV was significant (with FWE correction)
+while p_LV <= FWE_rate
+
+%% 3. Wide loop
+% repeats the entire process W times to obtain W different final p values,
+% which go into the omnibus hypothesis
+
+% matrix to store the optimal parameters of the w-th loop
+opt_parameters = num2cell(nan(W,numel(opt_parameters_names)));
+
+ for w=1:W
+
+ %% hyper-parameter optimisation
+ % remove hp% of the data randomly and keep it in a hold-out
+ % dataset, the rest is called the keep_in data for training/testing
+ % the algorithm
+ [hold_out_data_x, keep_in_data_x, hold_out_data_y, keep_in_data_y] = dp_partition_holdout(hp, X, Y);
+
+ % save the hyperparameter information for optimization step
+ save([hyperparameter_folder '/cucv.mat'],...
+ 'keep_in_data_x',...
+ 'keep_in_data_y',...
+ 'tp',...
+ 'K',...,
+ 'hyperparameter_folder');
+
+ % write a bash script for hyperparameter optimization, which can
+ % later be called
+ no_jobs = size(cu_cv_combination,2);
+ hyperopt_bash = dp_bash_para(spls_toolbox_path, hyperparameter_folder, 'hyperopt', vmem_req, no_jobs, max_sim_jobs, queue_name);
+
+ % access the temp_RHO folder and initialize the bash script for
+ % parallel computing of the hyperparameter optimization
+ cd(hyperparameter_folder);
+ system(['qsub ' hyperopt_bash]);
+
+ % set a variable which counts the files in the RHO folder
+ filecount = size(dir([hyperparameter_folder '/RHO_avg_*']),1);
+ RHO_avg_collection = nan(size(cu_cv_combination,2),1);
+
+ % use a while loop which recounts all the files in the RHO folder
+ % until all computations from the parallelized hyperparameter
+ % optimization step are completed and all files are saved in that
+ % folder, the while loop will be exited as soon as all files are
+ % saved in the folder
+ while filecount < size(cu_cv_combination,2)
+ filecount = size(dir([hyperparameter_folder '/RHO_avg_*.txt']),1);
+ end
+
+ % load all RHO values which were saved in mat files into a
+ % RHO_collection vector
+ for i=1:size(cu_cv_combination,2)
+ if exist([hyperparameter_folder '/RHO_avg_' num2str(i) '.txt'])
+ RHO_avg_collection(i,1) = dp_txtscan([hyperparameter_folder '/RHO_avg_' num2str(i) '.txt'], '%f');
+ delete([hyperparameter_folder '/RHO_avg_' num2str(i) '.txt']);
+ else
+ RHO_avg_collection(i,1) = NaN;
+ end
+ end
+
+
+% select the hyperparameter combination with the highest average
+% correlation, ie the one with the highest RHO_avg
+ [~, index_RHO] = max(RHO_avg_collection);
+
+% find the corresponding cu and cv values of the max RHO element, this
+% gives you the cu/cv combination with the highest average correlation
+
+ cu_opt = cu_cv_combination(index_cu,index_RHO);
+ cv_opt = cu_cv_combination(index_cv,index_RHO);
+
+ % save the optimized parameters
+ save([permutation_folder '/opt_param.mat'],...
+ 'keep_in_data_x',...
+ 'keep_in_data_y',...
+ 'hold_out_data_x',...
+ 'hold_out_data_y',...
+ 'cu_opt',...
+ 'cv_opt',...
+ 'RHO_avg_collection',...
+ 'permutation_folder');
+
+ %% Statistical Evaluation
+
+
+ %train the model with the optimal cu/cv combination on the previous
+ %train/test data set to get u and v
+ [u_opt, v_opt, success_opt]=spls(keep_in_data_x, keep_in_data_y,cu_opt, cv_opt);
+
+ %project the hold_out data set on the computed u and v vectors to
+ %get the absolute correlations between these projections
+ RHO_opt = abs(corr(hold_out_data_x*u_opt,hold_out_data_y*v_opt));
+
+ % permute the keep_in data in one dimension so that the
+ % relationship between these two views gets destroyed
+
+% Now comes the permutation step, where the order of the samples in one
+% view (in this case the Y matrix) gets permuted and the algorithm is
+% trained on the permuted data set with a destroyed relationship
+% between X and Y, this process is repeated B times
+
+ % access the temp_B folder to store all RHO_b values which will be
+ % computed in parallel in the next step
+
+ for i=1:B
+ temp = randperm(size(keep_in_data_y,1))';
+ dlmwrite([permutation_folder '/perm_' num2str(i) '.txt'],temp);
+ end
+
+ % write a bash script for hyperparameter optimization, which can
+ % later be called
+ permutation_bash = dp_bash_para(spls_toolbox_path, permutation_folder, 'permutation', vmem_req, B, max_sim_jobs, queue_name);
+
+ % submit the bash script for parallel computing of RHO_b values to the
+ % queue
+ cd(permutation_folder);
+ system(['qsub ' permutation_bash]);
+
+ % collect all files with RHO_b values, open them and store the RHO
+ % values in a vector
+ filecount = size(dir([permutation_folder '/RHO_b_*']),1);
+ RHO_b_collection = nan(B,1);
+
+ % see hyperparameter optimization
+
+ while filecount < B
+ filecount = size(dir([permutation_folder '/RHO_b_*.txt']),1);
+ end
+
+ for i=1:size(RHO_b_collection,1)
+ if exist([permutation_folder '/RHO_b_*.txt'],'file')==2
+ load([permutation_folder '/RHO_b_',num2str(i),'.mat']);
+ RHO_b_collection(i,1) = RHO_b;
+ delete([permutation_folder '/RHO_b_',num2str(i),'.mat']);
+ else
+ RHO_b_collection(i,1) = NaN;
+ end
+ end
+
+ % test the following null hypothesis H_s: "There is no relationship
+ % between the two views, therefore the correlation obtained with
+ % the original data is not different from the correlation
+ % obtained with the permuted data"
+
+ % calculate how many times RHO_b was bigger than or equal to RHO_opt,
+ % ie how many times the permutated data led to a higher correlation
+ % using spls than the original data
+ RHO_count_b = sum(RHO_b_collection >= RHO_opt);
+
+ % calculate the p value to test whether the null hypothesis is true
+ p = ((1+RHO_count_b)/(B+1));
+
+ % store all parameters of the w-th wide loop into a matrix
+ opt_parameters(w,:) = {w cu_opt cv_opt u_opt v_opt success_opt RHO_opt p};
+
+
+ end
+
+ save([analysis_folder '/opt_parameters_' num2str(ff) '.mat'],'opt_parameters');
+
+ %% test the omnibus hypothesis using the p values
+
+ % Omnibus hypothesis H_omni: "All the null hypotheses H_s are true" if
+ % any of the p values are lower than the FWE-corrected threshold,
+ % then the omnibus hypothesis can be rejected after that.
+
+ % Search for the statistically significant w-th iteration with the
+ % lowest p value, if more than one iteration has the same p value,
+ % select the one that has the highest RHO value => this is the final
+ % w-th iteration with the corresponding cu/cv features and u/v scores
+
+ % remove parameter combinations with nans as RHO_opt
+
+
+ %create a logical indexing the lowest p-value(s)
+ p_min = min(cell2mat(opt_parameters(:,index_p)));
+ logical_p_min = cell2mat(opt_parameters(:,index_p)) == p_min;
+ temp1 = opt_parameters(logical_p_min,:); % placeholder to make syntax easier
+
+ if size(temp1,1) > 1 % if there is more than one p-value that is equal to the lowest p-value, ie there are two absolute minimal p-values, then continue in the loop
+ RHO_max = cell2mat(temp1(:,index_RHO)) == max(cell2mat(temp1(:,index_RHO))); % logical indexing the highest RHO value
+ final_parameters(ff,:) = temp1(RHO_max,:); % take the row with the lowest p-value and the highest RHO value
+ else
+ final_parameters(ff,:) = temp1; % if there is just one absolute minimal p value, then take this row
+ end
+
+ %% Matrix Deflation => Projection Deflation
+
+ % This method removes the covariance explained by u and v from X
+ % and Y by projecting the data matrices onto the space spanned by the
+ % corresponding weight vector, and subtracting this from the data:
+
+ u = final_parameters{ff,index_u}; % weight vector for X
+ v = final_parameters{ff,index_v}; % weight vector for Y
+ X = X - (X*u)*u'; % the effect of u on X is removed by projection deflation
+ Y = Y - (Y*v)*v'; % the effect of v on Y is removed by projection deflation
+
+ % the p value of this LV is updated from the previously set value of
+ % zero to the actual p value of the LV, if this p value is lower than
+ % the FWE_rate then the while loop continues after matrix deflation and
+ % it keeps looking for the next possible significant LV. If the p value
+ % is higher than the FWE_rate, then the while loop is discontinued and
+ % the algorithm stops. Therefore, this function generates all possible
+ % significant LVs and also the first non-significant LV, afterwards the
+ % algorithm stops.
+ p_LV = final_parameters{ff,index_p};
+
+
+ %% Projection of the original data onto the SPLS latent space
+
+ % epsilon and omega are the projections of the original data onto the
+ % SPLS latent space, spanned by the weight vector pair u and v of this
+ % LV. Therefore each LV spans a specific latent space onto wihich the
+ % samples can be projected. These latent spaces can then be used to
+ % stratify patients.
+ epsilon(ff,:) = X_original * final_parameters{ff,index_u};
+ omega(ff,:) = Y_original * final_parameters{ff,index_v};
+
+ % ff counts through the most outside LV while loop = counts the amount
+ % of significant LVs
+ ff = ff+1;
+
+end
+
+%% clean up txt files and other files which are not needed anymore
+files_to_clean = {'cu_', 'cv_'};
+folder_to_clean = hyperparameter_folder;
+for i=1:size(files_to_clean,2)
+ dp_cleanup(folder_to_clean, files_to_clean{i})
+end
+
+% after the LVs are computed, clean up the final parameters, epsilon and
+% omega matrix by removing empty rows
+final_parameters(ff:size(final_parameters,1),:) = [];
+epsilon(ff:size(final_parameters,1),:) = [];
+omega(ff:size(final_parameters,1),:) = [];
+
+save([analysis_folder '/result.mat'], 'final_parameters', 'epsilon', 'omega');
+
+end
diff --git a/Visualization_Module/dp_spls_parallel.m b/Visualization_Module/dp_spls_parallel.m
new file mode 100644
index 0000000..2b66150
--- /dev/null
+++ b/Visualization_Module/dp_spls_parallel.m
@@ -0,0 +1,314 @@
+function [final_parameters, epsilon, omega] = dp_spls_parallel(input_folder, output_folder, X, Y, hp, tp, B, W, K)
+%
+% Implementation of SPLS algorithm and framework as described in Monteiro
+% et al. 2016, for details: doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs:
+%
+% X, Y - data matrices for MRI images (X) and behavioral data (Y) in
+% the form: samples x features. Use MRI data directly from
+% Neurominer output, the function will standardize both the
+% MRI data and the behavioral data, so that mean = 0 and std =
+% 1.
+%
+% hp - Ratio (in %) of hold out data, which is projected on both
+% the original data set with optimal cu/cv and on the
+% permuted dataset with optimal cu/cv. Default: 10
+%
+% tp - Ratio (in %) of the test data within the K-fold loops.
+% Default: 20
+%
+% B - Number of Permutations for the statistical evaluation of
+% the discovered cu/cv combination. Default: 10000
+%
+% W - Number of wide loops that define how many times the entire
+% SPLS procedure is repeated and how many final p values are
+% calculated. Default: 10
+%
+% K - Number of K splits for the training and testing of the held
+% in data for each cu/cv combination. Default: 100
+%
+%
+% Outputs:
+%
+% final_parameters - Results matrix with rows = number of significant
+% LVs and columns containing the following variables
+% w, cu_opt, cv_opt, u_opt, v_opt, success_opt,
+% RHO_opt, p. The last row contains the first LV that
+% was not significant, it is for informative purposes
+% only.
+%
+% epsilon - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector u of
+% the LV on X.
+%
+% omega - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector v of
+% the LV on Y.
+%
+%
+% Version: 2018-03-05
+%__________________________________________________________________________
+%
+% Written by David Popovic
+% Email: david.popovic@med.uni-muenchen.de
+%
+%% 1. Preparation of SPLS and assignment of matrices
+% Please make sure that you have added the path for the folder containing
+% the following function: spls.m, dp_spls.m, dp_partition_holdout.m,
+% dp_perm.m
+%
+% standardize the data matrices X and Y for usage in SPLS. X_original and
+% Y_original will later be used for projection onto the final SPLS latent
+% space spanned by u and v
+
+X_original = zscore(X);
+Y_original = zscore(Y);
+
+% define the data matrices X and Y for input into the SPLS algorithm
+X = X_original;
+Y = Y_original;
+
+% create txt files for matrices and their columns
+dp_create_matrixfiles(output_folder,X,Y);
+
+% define the default values for variables tp, hp, B, W, K if no value for
+% them is entered
+
+% hp ratio
+if ~exist('hp', 'var')
+ hp = 10;
+end
+
+% tp ratio
+if ~exist('tp', 'var')
+ tp = 20;
+end
+
+% B
+if ~exist('B', 'var')
+ B = 10000;
+end
+
+% W
+if ~exist('W', 'var')
+ W = 10;
+end
+
+% K
+if ~exist('K', 'var')
+ K = 100;
+end
+
+%% 2. LV loop
+
+% this loop is repeated for the next vector pair u and v as long as the
+% previous vector pair was significant. If the previous vector was not
+% significant, then the loop will stop
+
+% pLV is a starting p value set to 0, so that the while loop starts. Later
+% on it will be updated at the end of each LV iteration. Then it serves the
+% purpose to stop the while loop as soon as an LV was not significant.
+p_LV = 0;
+
+% FWE_rate corrects for multiple testing for the W amount of p values
+FWE_rate = 0.05 / W;
+
+% ff counts the iteration through the LV loops, so that the results for each
+% LV can be stored in separate rows
+ff = 1;
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+range_points = 40;
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times, everything is
+% also saved in txt files
+[cu_cv_combination] = dp_hyperparam_grid(output_folder, X, Y, range_points);
+
+% define column names for matrices so that you can access them later by
+% indexing
+spls_output_k_names = {'u','v','success', 'RHO'}; % output of each k iteration
+final_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'};
+opt_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'}; % names of parameters for optimal cu/cv combination of the w-th loop
+cu_cv_combination_names = {'cu';'cv'};
+
+% preallocate placeholder matrices for higher speed
+final_parameters = num2cell(zeros(size(Y,2), numel(final_parameters_names))); % cell array to store final parameters for each LV iteration
+epsilon = zeros(size(final_parameters,1),size(X_original,1)); %projection of weight vector u on corresponding matrix X
+omega = zeros(size(final_parameters,1),size(Y_original,1)); % projection of weight vector v on corresponding matrix Y
+
+% indices for later use
+index_u = strcmp(opt_parameters_names,'u');
+index_v = strcmp(opt_parameters_names,'v');
+index_cu = strcmp(cu_cv_combination_names,'cu');
+index_cv = strcmp(cu_cv_combination_names,'cv');
+index_RHO_k = strcmp(spls_output_k_names,'RHO');
+index_RHO = strcmp(opt_parameters_names, 'RHO');
+index_p = strcmp(opt_parameters_names, 'p');
+
+% here starts the outer loop for each single LV, the next LV is only
+% computed if the previous LV was significant (with FWE correction)
+while p_LV <= FWE_rate
+
+%% 3. Wide loop
+% repeats the entire process W times to obtain W different final p values,
+% which go into the omnibus hypothesis
+
+% matrix to store the optimal parameters of the w-th loop
+opt_parameters = num2cell(zeros(W,numel(opt_parameters_names)));
+
+ for w=1:W
+
+ %% hyper-parameter optimisation
+ % remove hp% of the data randomly and keep it in a hold-out
+ % dataset, the rest is called the keep_in data for training/testing
+ % the algorithm
+
+ [hold_out_data_x, keep_in_data_x, hold_out_data_y, keep_in_data_y] = dp_partition_holdout(hp, X, Y);
+
+ % RHO_avg is a vector where all average RHO values of the different
+ % cu/cv combinations are stored, preallocated for speed
+
+ dp_train_test_splits(output_folder, keep_in_data_x, keep_in_data_y, K);
+
+ dp_RHO_avg_k(output_folder, input_folder, cu_cv_file, K_file, keepin_X_split, columns_X_file, keepin_Y_split, columns_Y_file);
+
+ % collect all RHO values and find the highest one, choose the cu/cv
+ % combination of this highest RHO value
+
+ for i=1:size(cu_cv_combination,2)
+ formatSpec = '%f';
+ fileID = fopen([output_folder cu_cv_file '_RHO.txt'],M,'delimiter','\t');
+
+ end
+
+
+
+ %% Statistical Evaluation
+
+
+ %train the model with the optimal cu/cv combination on the previous
+ %train/test data set to get u and v
+
+ [u_opt, v_opt, success_opt]=spls(keep_in_data_x, keep_in_data_y,cu_opt, cv_opt);
+
+ %project the hold_out data set on the computed u and v vectors to
+ %get the absolute correlations between these projections
+ RHO_opt = abs(corr(hold_out_data_x*u_opt,hold_out_data_y*v_opt));
+
+ % permute the keep_in data in one dimension so that the
+ % relationship between these two views gets destroyed
+
+ % collection of RHO values for the B times permutated dataset,
+ % preallocated for speed
+ RHO_b_collection = zeros(B,1);
+
+% Now comes the permutation step, where the order of the samples in one
+% view (in this case the Y matrix) gets permuted and the algorithm is
+% trained on the permuted data set with a destroyed relationship
+% between X and Y, this process is repeated B times
+
+ for b=1:B
+
+ % use the permuted perm_data_y and the regular keep_in_data_x
+ % and compute u_b and v_b for the permutated data using spls
+ [u_b, v_b, ~]=spls(keep_in_data_x, dp_perm(keep_in_data_y), cu_opt, cv_opt);
+
+ % compute the absolute correlation between the hold_out data
+ % and the permuted u_b and v_b
+ RHO_b = abs(corr(hold_out_data_x*u_b,hold_out_data_y*v_b));
+
+ % store the calculated RHO_b value in a vector
+ RHO_b_collection(b,1) = RHO_b;
+ end
+
+ % test the following null hypothesis H_s: "There is no relationship
+ % between the two views, therefore the correlation obtained with
+ % the original data is not different from the correlation
+ % obtained with the permuted data"
+
+ % calculate how many times RHO_b was bigger than or equal to RHO_opt,
+ % ie how many times the permutated data led to a higher correlation
+ % using spls than the original data
+ RHO_count_b = sum(RHO_b_collection >= RHO_opt);
+
+ % calculate the p value to test whether the null hypothesis is true
+ p = ((1+RHO_count_b)/(B+1));
+
+ % store all parameters of the w-th wide loop into a matrix
+ opt_parameters(w,:) = {w cu_opt cv_opt u_opt v_opt success_opt RHO_opt p};
+
+ end
+
+ %% test the omnibus hypothesis using the p values
+
+ % Omnibus hypothesis H_omni: "All the null hypotheses H_s are true" if
+ % any of the p values are lower than the FWE-corrected threshold,
+ % then the omnibus hypothesis can be rejected after that.
+
+ % Search for the statistically significant w-th iteration with the
+ % lowest p value, if more than one iteration has the same p value,
+ % select the one that has the highest RHO value => this is the final
+ % w-th iteration with the corresponding cu/cv features and u/v scores
+
+ %create a logical indexing the lowest p-value(s)
+ p_min = cell2mat(opt_parameters(:,index_p)) == min(cell2mat(opt_parameters(:,index_p)));
+ temp1 = opt_parameters(p_min,:); % placeholder to make syntax easier
+ if size(temp1,1) > 1 % if there is more than one p-value that is equal to the lowest p-value, ie there are two absolute minimal p-values, then continue in the loop
+ RHO_max = cell2mat(temp1(:,index_RHO)) == max(cell2mat(temp1(:,index_RHO))); % logical indexing the highest RHO value
+ final_parameters(ff,:) = temp1(RHO_max,:); % take the row with the lowest p-value and the highest RHO value
+ else
+ final_parameters(ff,:) = temp1; % if there is just one absolute minimal p value, then take this row
+ end
+
+ %% Matrix Deflation => Projection Deflation
+
+ % This method removes the covariance explained by u and v from X
+ % and Y by projecting the data matrices onto the space spanned by the
+ % corresponding weight vector, and subtracting this from the data:
+
+ u = final_parameters{ff,index_u}; % weight vector for X
+ v = final_parameters{ff,index_v}; % weight vector for Y
+ X = X - (X*u)*u'; % the effect of u on X is removed by projection deflation
+ Y = Y - (Y*v)*v'; % the effect of v on Y is removed by projection deflation
+
+ % the p value of this LV is updated from the previously set value of
+ % zero to the actual p value of the LV, if this p value is lower than
+ % the FWE_rate then the while loop continues after matrix deflation and
+ % it keeps looking for the next possible significant LV. If the p value
+ % is higher than the FWE_rate, then the while loop is discontinued and
+ % the algorithm stops. Therefore, this function generates all possible
+ % significant LVs and also the first non-significant LV, afterwards the
+ % algorithm stops.
+ p_LV = final_parameters{ff,index_p};
+
+
+ %% Projection of the original data onto the SPLS latent space
+
+ % epsilon and omega are the projections of the original data onto the
+ % SPLS latent space, spanned by the weight vector pair u and v of this
+ % LV. Therefore each LV spans a specific latent space onto wihich the
+ % samples can be projected. These latent spaces can then be used to
+ % stratify patients.
+ epsilon(ff,:) = X_original * final_parameters{ff,index_u};
+ omega(ff,:) = Y_original * final_parameters{ff,index_v};
+
+ % ff counts through the most outside LV while loop = counts the amount
+ % of significant LVs
+ ff = ff+1;
+
+
+end
+
+% after the LVs are computed, clean up the final parameters, epsilon and
+% omega matrix by removing empty rows
+final_parameters(ff:size(final_parameters,1),:) = [];
+epsilon(ff:size(final_parameters,1),:) = [];
+omega(ff:size(final_parameters,1),:) = [];
+
+end
+
diff --git a/Visualization_Module/dp_spls_standalone_cleanup_FDR.m b/Visualization_Module/dp_spls_standalone_cleanup_FDR.m
new file mode 100644
index 0000000..7bd9a83
--- /dev/null
+++ b/Visualization_Module/dp_spls_standalone_cleanup_FDR.m
@@ -0,0 +1,341 @@
+%% DP SPLS standalone function
+
+function dp_spls_standalone_cleanup(spls_standalone_path, analysis_folder, queue_name, variables_for_analysis)
+
+%% 1. prepare analysis folders
+mkdir([analysis_folder '/hyperopt']);
+hyperopt_folder = [analysis_folder '/hyperopt']; % folder for hyperparameter optimization
+mkdir([analysis_folder '/permutation']);
+permutation_folder = [analysis_folder '/permutation']; % folder for permutation testing
+mkdir([analysis_folder '/utilities']);
+utilities_folder = [analysis_folder '/utilities']; % folder containing general settings => Section 3 parameter settings
+
+%% 2. set parameters for queue submission
+mem_total = 40; % max: 40
+max_sim_jobs = 60; % max: 60
+
+%% 3. set parameters for SPLS analysis
+hp = 10; % hold-out percentage, Default: 10
+tp = 20; % test percentage, Default: 20
+B = 10000; % number of permutations for statistical evaluation, Default: 10000
+W = 10; % number of iterations for one LV, Default: 10
+K = 100; % number of K-splits during hyperparameter optimization, Default: 100
+RP = 40; % number of points for grid search of cu/cv combinations, Default: 40
+FDRvalue = 0.05; % significance level for FDR testing
+
+utilities_names = {'hyperopt_folder', 'permutation_folder', 'mem_total', 'max_sim_jobs', 'hp', 'tp', 'B', 'W', 'K',...
+ 'RP', 'spls_standalone_path', 'analysis_folder', 'queue_name', 'variables_for_analysis'};
+utilities = {hyperopt_folder, permutation_folder, mem_total, max_sim_jobs, hp, tp, B, W, K, RP, spls_standalone_path,...
+ analysis_folder, queue_name, variables_for_analysis};
+
+for i=1:size(utilities,2)
+ switch class(utilities{i})
+ case 'char'
+ dp_txt_write(utilities_folder, utilities_names{i}, utilities{i}, '%s');
+ case 'double'
+ dp_txt_write(utilities_folder, utilities_names{i}, utilities{i}, '%d');
+ end
+end
+
+%% 4. prepare accessory variables, indices and initialize variables
+load(variables_for_analysis);
+X_original = zscore(X);
+Y_original = zscore(Y);
+
+% define the data matrices X and Y for input into the SPLS algorithm
+X = X_original;
+Y = Y_original;
+
+%% 5. LV loop
+
+% this loop is repeated for the next vector pair u and v as long as the
+% previous vector pair was significant. If the previous vector was not
+% significant, then the loop will stop
+
+% pLV is a starting p value set to 1, so that the while loop starts. Later
+% on it will be updated at the end of each LV iteration. Then it serves the
+% purpose to stop the while loop as soon as an LV was not significant.
+p_LV = 1;
+
+% ff counts the iteration through the LV loops, so that the results for each
+% LV can be stored in separate rows
+ff = 1;
+
+% define column names for matrices so that you can access them later by
+% indexing
+parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'}; % names of parameters for optimal cu/cv combination of the w-th loop
+cu_cv_combination_names = {'cu';'cv'};
+
+% indices for later use
+opt_u = strcmp(parameters_names,'u');
+opt_v = strcmp(parameters_names,'v');
+comb_cu = strcmp(cu_cv_combination_names,'cu');
+comb_cv = strcmp(cu_cv_combination_names,'cv');
+opt_RHO = strcmp(parameters_names,'RHO');
+opt_p = strcmp(parameters_names, 'p');
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+cu_range_points = linspace(1,sqrt(size(X,2)),RP);
+cv_range_points = linspace(1,sqrt(size(Y,2)),RP);
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times
+cu_range = repelem(cu_range_points,numel(cu_range_points));
+cu_range(:,1:RP)=[]; %adapted for better performance
+cv_range = repmat(cv_range_points,1,numel(cv_range_points));
+cv_range(:,1:RP)=[]; %adapted for better performance
+cu_cv_combination = [cu_range;cv_range]; % this matrix contains all the possible combinations between cu and cv
+
+for i=1:size(cu_range,2)
+ dp_txt_write(hyperopt_folder, ['cu_' num2str(i)], cu_range(i), '%.4f')
+end
+
+for i=1:size(cv_range,2)
+ dp_txt_write(hyperopt_folder, ['cv_' num2str(i)], cv_range(i), '%.4f')
+end
+
+% preallocate placeholder matrices for higher speed
+final_parameters = num2cell(nan(size(Y,2), numel(parameters_names))); % cell array to store final parameters for each LV iteration
+epsilon = nan(size(final_parameters,1),size(X_original,1)); %projection of weight vector u on corresponding matrix X
+omega = nan(size(final_parameters,1),size(Y_original,1)); % projection of weight vector v on corresponding matrix Y
+
+% here starts the outer loop for each single LV, the next LV is only
+% computed if the previous LV was significant (with FWE correction)
+while p_LV > 0
+
+%% 3. Wide loop
+% repeats the entire process W times to obtain W different final p values,
+% which go into the omnibus hypothesis
+
+% matrix to store the optimal parameters of the w-th loop
+opt_parameters = num2cell(nan(W,numel(parameters_names)));
+
+ for w=1:W
+
+ %% hyper-parameter optimisation
+ % remove hp% of the data randomly and keep it in a hold-out
+ % dataset, the rest is called the keep_in data for training/testing
+ % the algorithm
+ [hold_out_data_x, keep_in_data_x, hold_out_data_y, keep_in_data_y] = dp_partition_holdout(hp, X, Y);
+
+ % save the hyperparameter information for optimization step
+ save([hyperopt_folder '/keep_in_partition.mat'], 'keep_in_data_x','keep_in_data_y');
+
+ % write a bash script for hyperparameter optimization, which can
+ % later be called
+ no_jobs = size(cu_cv_combination,2);
+ hyperopt_bash = dp_bash_para_new(spls_standalone_path, hyperopt_folder, utilities_folder, 'hyperopt', mem_total, no_jobs, max_sim_jobs, queue_name);
+
+ % access the temp_RHO folder and initialize the bash script for
+ % parallel computing of the hyperparameter optimization
+ cd(hyperopt_folder);
+ system(['qsub ' hyperopt_bash]);
+
+ % set a variable which counts the files in the RHO folder
+ filecount = size(dir([hyperopt_folder '/RHO_avg_*.txt']),1);
+ RHO_avg_collection = nan(size(cu_cv_combination,2),1);
+
+ % use a while loop which recounts all the files in the RHO folder
+ % until all computations from the parallelized hyperparameter
+ % optimization step are completed and all files are saved in that
+ % folder, the while loop will be exited as soon as all files are
+ % saved in the folder
+ while filecount < size(cu_cv_combination,2)
+ filecount = size(dir([hyperopt_folder '/RHO_avg_*.txt']),1);
+ end
+
+ % load all RHO values which were saved in mat files into a
+ % RHO_collection vector
+ for i=1:size(cu_cv_combination,2)
+ if exist([hyperopt_folder '/RHO_avg_' num2str(i) '.txt'],'file')
+ RHO_avg_collection(i,1) = dp_txtscan([hyperopt_folder '/RHO_avg_' num2str(i) '.txt'], '%f');
+ delete([hyperopt_folder '/RHO_avg_' num2str(i) '.txt']);
+ else
+ RHO_avg_collection(i,1) = NaN;
+ end
+ end
+
+% select the hyperparameter combination with the highest average
+% correlation, ie the one with the highest RHO_avg
+ [~, index_RHO] = max(RHO_avg_collection);
+
+% find the corresponding cu and cv values of the max RHO element, this
+% gives you the cu/cv combination with the highest average correlation
+
+ cu_opt = cu_cv_combination(comb_cu,index_RHO);
+ cv_opt = cu_cv_combination(comb_cv,index_RHO);
+
+ % save the optimized parameters
+ save([permutation_folder '/opt_param.mat'],...
+ 'keep_in_data_x',...
+ 'keep_in_data_y',...
+ 'hold_out_data_x',...
+ 'hold_out_data_y',...
+ 'cu_opt',...
+ 'cv_opt',...
+ 'RHO_avg_collection',...
+ 'permutation_folder');
+
+ %% Statistical Evaluation
+
+
+ %train the model with the optimal cu/cv combination on the previous
+ %train/test data set to get u and v
+ [u_opt, v_opt, success_opt]=spls(keep_in_data_x, keep_in_data_y,cu_opt, cv_opt);
+
+ %project the hold_out data set on the computed u and v vectors to
+ %get the absolute correlations between these projections
+ RHO_opt = abs(corr(hold_out_data_x*u_opt,hold_out_data_y*v_opt));
+
+ % permute the keep_in data in one dimension so that the
+ % relationship between these two views gets destroyed
+
+% Now comes the permutation step, where the order of the samples in one
+% view (in this case the Y matrix) gets permuted and the algorithm is
+% trained on the permuted data set with a destroyed relationship
+% between X and Y, this process is repeated B times
+
+ for i=1:B
+ temp = randperm(size(keep_in_data_y,1))';
+ dp_txt_write(permutation_folder, ['perm_' num2str(i)], temp, '%d\n');
+ end
+
+ % write a bash script for hyperparameter optimization, which can
+ % later be called
+ permutation_bash = dp_bash_para_new(spls_standalone_path, permutation_folder, utilities_folder, 'permutation', mem_total, B, max_sim_jobs, queue_name);
+
+ % submit the bash script for parallel computing of RHO_b values to the
+ % queue
+ cd(permutation_folder);
+ system(['qsub ' permutation_bash]);
+
+ % collect all files with RHO_b values, open them and store the RHO
+ % values in a vector
+ filecount = size(dir([permutation_folder '/RHO_b_*']),1);
+ RHO_b_collection = nan(B,1);
+
+ % see hyperparameter optimization
+ while filecount < B
+ filecount = size(dir([permutation_folder '/RHO_b_*.txt']),1);
+ end
+
+ for i=1:size(RHO_b_collection,1)
+ if exist([permutation_folder '/RHO_b_',num2str(i),'.txt'],'file')
+ RHO_b_collection(i,1) = dp_txtscan([permutation_folder '/RHO_b_' num2str(i) '.txt'], '%f');
+ delete([permutation_folder '/RHO_b_',num2str(i),'.txt']);
+ else
+ RHO_b_collection(i,1) = NaN;
+ end
+ end
+
+ RHO_b_collection_completed = [];
+ RHO_b_collection_completed = dp_perm_nan(RHO_b_collection, spls_standalone_path, permutation_folder, utilities_folder, mem_total, max_sim_jobs, queue_name);
+
+ % test the following null hypothesis H_s: "There is no relationship
+ % between the two views, therefore the correlation obtained with
+ % the original data is not different from the correlation
+ % obtained with the permuted data"
+
+ % calculate how many times RHO_b was bigger than or equal to RHO_opt,
+ % ie how many times the permutated data led to a higher correlation
+ % using spls than the original data
+ RHO_count_b = sum(RHO_b_collection_completed >= RHO_opt);
+
+ % calculate the p value to test whether the null hypothesis is true
+ p = ((1+RHO_count_b)/(B+1));
+
+ % store all parameters of the w-th wide loop into a matrix
+ opt_parameters(w,:) = {w cu_opt cv_opt u_opt v_opt success_opt RHO_opt p};
+
+ save([analysis_folder '/opt_parameters_' num2str(ff) '_' num2str(w) '.mat'],'opt_parameters', 'RHO_b_collection_completed');
+
+ end
+
+ %% test the omnibus hypothesis using the p values
+
+ % Omnibus hypothesis H_omni: "All the null hypotheses H_s are true" if
+ % any of the p values are lower than the FWE-corrected threshold,
+ % then the omnibus hypothesis can be rejected after that.
+
+ % Search for the statistically significant w-th iteration with the
+ % lowest p value, if more than one iteration has the same p value,
+ % select the one that has the highest RHO value => this is the final
+ % w-th iteration with the corresponding cu/cv features and u/v scores
+
+ % remove parameter combinations with nans as RHO_opt
+ to_rmv=isnan([opt_parameters{:,opt_RHO}]');
+ opt_parameters(to_rmv,:)=[];
+
+ % check if p values are significant with FDR-correction
+ [pvalues_FDR] = dp_FDR([opt_parameters{:,opt_p}]', FDRvalue);
+
+ if isempty(pvalues_FDR)
+ p_LV = 0;
+ else
+
+ logical_p_min = [opt_parameters{:,opt_p}]' == min([opt_parameters{:,opt_p}]);
+ temp1 = opt_parameters(logical_p_min,:); % placeholder to make syntax easier
+
+ if size(temp1,1) > 1 % if there is more than one p-value that is equal to the lowest p-value, ie there are two absolute minimal p-values, then continue in the loop
+ RHO_max = [temp1{:,opt_RHO}]' == max([temp1{:,opt_RHO}]); % logical indexing the highest RHO value
+ final_parameters(ff,:) = temp1(RHO_max,:); % take the row with the lowest p-value and the highest RHO value
+ else
+ final_parameters(ff,:) = temp1; % if there is just one absolute minimal p value, then take this row
+ end
+
+ %% Matrix Deflation => Projection Deflation
+
+ % This method removes the covariance explained by u and v from X
+ % and Y by projecting the data matrices onto the space spanned by the
+ % corresponding weight vector, and subtracting this from the data:
+ u = final_parameters{ff,opt_u}; % weight vector for X
+ v = final_parameters{ff,opt_v}; % weight vector for Y
+ [X,Y] = proj_def(X, Y, u, v);
+
+ % the p value of this LV is updated from the previously set value of
+ % zero to the actual p value of the LV, if this p value is lower than
+ % the FWE_rate then the while loop continues after matrix deflation and
+ % it keeps looking for the next possible significant LV. If the p value
+ % is higher than the FWE_rate, then the while loop is discontinued and
+ % the algorithm stops. Therefore, this function generates all possible
+ % significant LVs and also the first non-significant LV, afterwards the
+ % algorithm stops.
+ p_LV = final_parameters{ff,opt_p};
+
+
+ %% Projection of the original data onto the SPLS latent space
+
+ % epsilon and omega are the projections of the original data onto the
+ % SPLS latent space, spanned by the weight vector pair u and v of this
+ % LV. Therefore each LV spans a specific latent space onto wihich the
+ % samples can be projected. These latent spaces can then be used to
+ % stratify patients.
+ epsilon(ff,:) = X_original * final_parameters{ff,opt_u};
+ omega(ff,:) = Y_original * final_parameters{ff,opt_v};
+
+ % ff counts through the most outside LV while loop = counts the amount
+ % of significant LVs
+ ff = ff+1;
+
+
+end
+
+%% clean up txt files and other files which are not needed anymore
+files_to_clean = {'cu_', 'cv_'};
+folder_to_clean = hyperopt_folder;
+for i=1:size(files_to_clean,2)
+ dp_cleanup(folder_to_clean, files_to_clean{i})
+end
+
+% after the LVs are computed, clean up the final parameters, epsilon and
+% omega matrix by removing empty rows
+final_parameters(ff:end,:) = [];
+epsilon(ff:end,:) = [];
+omega(ff:end,:) = [];
+
+save([analysis_folder '/result.mat'], 'final_parameters', 'epsilon', 'omega');
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_spls_updated.m b/Visualization_Module/dp_spls_updated.m
new file mode 100644
index 0000000..7ec9349
--- /dev/null
+++ b/Visualization_Module/dp_spls_updated.m
@@ -0,0 +1,358 @@
+function [final_parameters, epsilon, omega] = dp_spls_updated(X, Y, hp, tp, B, W, K)
+%
+% Implementation of SPLS algorithm and framework as described in Monteiro
+% et al. 2016, for details: doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs:
+%
+% X, Y - data matrices for MRI images (X) and behavioral data (Y) in
+% the form: samples x features. Use MRI data directly from
+% Neurominer output, the function will standardize both the
+% MRI data and the behavioral data, so that mean = 0 and std =
+% 1.
+%
+% hp - Ratio (in %) of hold out data, which is projected on both
+% the original data set with optimal cu/cv and on the
+% permuted dataset with optimal cu/cv. Default: 10
+%
+% tp - Ratio (in %) of the test data within the K-fold loops.
+% Default: 20
+%
+% B - Number of Permutations for the statistical evaluation of
+% the discovered cu/cv combination. Default: 10000
+%
+% W - Number of wide loops that define how many times the entire
+% SPLS procedure is repeated and how many final p values are
+% calculated. Default: 10
+%
+% K - Number of K splits for the training and testing of the held
+% in data for each cu/cv combination. Default: 100
+%
+%
+% Outputs:
+%
+% final_parameters - Results matrix with rows = number of significant
+% LVs and columns containing the following variables
+% w, cu_opt, cv_opt, u_opt, v_opt, success_opt,
+% RHO_opt, p. The last row contains the first LV that
+% was not significant, it is for informative purposes
+% only.
+%
+% epsilon - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector u of
+% the LV on X.
+%
+% omega - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector v of
+% the LV on Y.
+%
+%
+% Version: 2018-03-05
+%__________________________________________________________________________
+%
+% Written by David Popovic
+% Email: david.popovic@med.uni-muenchen.de
+%
+%% 1. Preparation of SPLS and assignment of matrices
+% Please make sure that you have added the path for the folder containing
+% the following function: spls.m, dp_spls.m, dp_partition_holdout.m,
+% dp_perm.m
+%
+% standardize the data matrices X and Y for usage in SPLS. X_original and
+% Y_original will later be used for projection onto the final SPLS latent
+% space spanned by u and v
+
+X_original = zscore(X);
+Y_original = zscore(Y);
+
+% define the data matrices X and Y for input into the SPLS algorithm
+X = X_original;
+Y = Y_original;
+
+% define the default values for variables tp, hp, B, W, K if no value for
+% them is entered
+
+% hp ratio
+if ~exist('hp', 'var')
+ hp = 10;
+end
+
+% tp ratio
+if ~exist('tp', 'var')
+ tp = 20;
+end
+
+% B
+if ~exist('B', 'var')
+ B = 10000;
+end
+
+% W
+if ~exist('W', 'var')
+ W = 10;
+end
+
+% K
+if ~exist('K', 'var')
+ K = 100;
+end
+
+%% 2. LV loop
+
+% this loop is repeated for the next vector pair u and v as long as the
+% previous vector pair was significant. If the previous vector was not
+% significant, then the loop will stop
+
+% pLV is a starting p value set to 0, so that the while loop starts. Later
+% on it will be updated at the end of each LV iteration. Then it serves the
+% purpose to stop the while loop as soon as an LV was not significant.
+p_LV = 0;
+
+% FWE_rate corrects for multiple testing for the W amount of p values
+FWE_rate = 0.05 / W;
+
+% ff counts the iteration through the LV loops, so that the results for each
+% LV can be stored in separate rows
+ff = 1;
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+range_points = 40; % defines the number of range points for the grid search. 40 is the proposed amount.
+cu_range = linspace(1,sqrt(size(X,2)),range_points);
+cv_range = linspace(1,sqrt(size(Y,2)),range_points);
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times
+cu_cv_combination = [repelem(cu_range,numel(cu_range));repmat(cv_range,1,numel(cv_range))]; % this matrix contains all the possible combinations between cu and cv
+
+% define column names for matrices so that you can access them later by
+% indexing
+spls_output_k_names = {'u','v','success', 'RHO'}; % output of each k iteration
+final_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'};
+opt_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'}; % names of parameters for optimal cu/cv combination of the w-th loop
+cu_cv_combination_names = {'cu';'cv'};
+
+% preallocate placeholder matrices for higher speed
+final_parameters = num2cell(zeros(size(Y,2), numel(final_parameters_names))); % cell array to store final parameters for each LV iteration
+epsilon = zeros(size(final_parameters,1),size(X_original,1)); %projection of weight vector u on corresponding matrix X
+omega = zeros(size(final_parameters,1),size(Y_original,1)); % projection of weight vector v on corresponding matrix Y
+
+% indices for later use
+index_u = strcmp(opt_parameters_names,'u');
+index_v = strcmp(opt_parameters_names,'v');
+index_cu = strcmp(cu_cv_combination_names,'cu');
+index_cv = strcmp(cu_cv_combination_names,'cv');
+index_RHO_k = strcmp(spls_output_k_names,'RHO');
+index_RHO = strcmp(opt_parameters_names, 'RHO');
+index_p = strcmp(opt_parameters_names, 'p');
+
+% here starts the outer loop for each single LV, the next LV is only
+% computed if the previous LV was significant (with FWE correction)
+while p_LV <= FWE_rate
+
+%% 3. Wide loop
+% repeats the entire process W times to obtain W different final p values,
+% which go into the omnibus hypothesis
+
+% matrix to store the optimal parameters of the w-th loop
+opt_parameters = num2cell(zeros(W,numel(opt_parameters_names)));
+
+ for w=1:W
+
+ %% hyper-parameter optimisation
+ % remove hp% of the data randomly and keep it in a hold-out
+ % dataset, the rest is called the keep_in data for training/testing
+ % the algorithm
+
+ [hold_out_data_x, keep_in_data_x, hold_out_data_y, keep_in_data_y] = dp_partition_holdout(hp, X, Y);
+
+ % create an inner loop with k splits and a tp test perecentage set
+ % within each split
+
+ % RHO_avg is a vector where all average RHO values of the different
+ % cu/cv combinations are stored, preallocated for speed
+ RHO_avg = zeros(1,size(cu_cv_combination,2));
+
+
+ for i=1:size(cu_cv_combination,2)
+ cvcu.output_folder = output_folder;
+ cvcu.input_folder = input_folder;
+ cvcu.cu_cv_file = cu_cv_file;
+ cvcu.K_file = K_file;
+ cvcu.keepin_X_split = keepin_X_split;
+ cvcu.columns_X_file = columns_X_file;
+ cvcu.keepin_Y_split = keepin_Y_split;
+ cvcu.columns_Y_file = columns_Y_file;
+ save(['/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/cvcu_',num2str(i),'.mat'],'cvcu')
+ end
+
+ system('qsub ')
+
+
+ for i=1:size(cu_cv_combination,2)
+
+ % output array for all k splits within one cu/cv combination,
+ % preallocation for speed
+ spls_output_k_results = num2cell(zeros(K, numel(spls_output_k_names)));
+
+ for k=1:K
+
+ % separate the keep_in data into training and test data
+ % according to the chosen test percentage tp
+ [test_data_x, training_data_x, test_data_y, training_data_y] = dp_partition_holdout(tp, keep_in_data_x, keep_in_data_y);
+
+ %perform SPLS on the training data using the current cu/cv combination
+ [u, v, success] = spls(training_data_x,training_data_y,cu_cv_combination(index_cu,i),cu_cv_combination(index_cv,i));
+
+ %compute the correlation between the projections of the
+ %training and test matrices onto the SPLS latent space
+ %spanned by the weight vectors
+ RHO = abs(corr(test_data_x*u,test_data_y*v));
+
+ %store the results
+ spls_output_k_results(k,:) = {u v success RHO};
+
+ end
+
+% computing the mean value of all RHO calculated for the k
+% iterations for one specific cu/cv combination
+ RHO_avg(i) = mean(cell2mat(spls_output_k_results(:,index_RHO_k)));
+ end
+
+% select the hyperparameter combination with the highest average
+% correlation, ie the one with the highest RHO_avg
+ [~, I_RHO] = max(RHO_avg);
+
+% find the corresponding cu and cv values of the max RHO element, this
+% gives you the cu/cv combination with the highest average correlation
+
+ cu_opt = cu_cv_combination(index_cu,I_RHO);
+ cv_opt = cu_cv_combination(index_cv,I_RHO);
+
+
+ %% Statistical Evaluation
+
+
+ %train the model with the optimal cu/cv combination on the previous
+ %train/test data set to get u and v
+
+ [u_opt, v_opt, success_opt]=spls(keep_in_data_x, keep_in_data_y,cu_opt, cv_opt);
+
+ %project the hold_out data set on the computed u and v vectors to
+ %get the absolute correlations between these projections
+ RHO_opt = abs(corr(hold_out_data_x*u_opt,hold_out_data_y*v_opt));
+
+ % permute the keep_in data in one dimension so that the
+ % relationship between these two views gets destroyed
+
+ % collection of RHO values for the B times permutated dataset,
+ % preallocated for speed
+ RHO_b_collection = zeros(B,1);
+
+% Now comes the permutation step, where the order of the samples in one
+% view (in this case the Y matrix) gets permuted and the algorithm is
+% trained on the permuted data set with a destroyed relationship
+% between X and Y, this process is repeated B times
+
+ for b=1:B
+
+ % use the permuted perm_data_y and the regular keep_in_data_x
+ % and compute u_b and v_b for the permutated data using spls
+ [u_b, v_b, ~]=spls(keep_in_data_x, dp_perm(keep_in_data_y), cu_opt, cv_opt);
+
+ % compute the absolute correlation between the hold_out data
+ % and the permuted u_b and v_b
+ RHO_b = abs(corr(hold_out_data_x*u_b,hold_out_data_y*v_b));
+
+ % store the calculated RHO_b value in a vector
+ RHO_b_collection(b,1) = RHO_b;
+ end
+
+ % test the following null hypothesis H_s: "There is no relationship
+ % between the two views, therefore the correlation obtained with
+ % the original data is not different from the correlation
+ % obtained with the permuted data"
+
+ % calculate how many times RHO_b was bigger than or equal to RHO_opt,
+ % ie how many times the permutated data led to a higher correlation
+ % using spls than the original data
+ RHO_count_b = sum(RHO_b_collection >= RHO_opt);
+
+ % calculate the p value to test whether the null hypothesis is true
+ p = ((1+RHO_count_b)/(B+1));
+
+ % store all parameters of the w-th wide loop into a matrix
+ opt_parameters(w,:) = {w cu_opt cv_opt u_opt v_opt success_opt RHO_opt p};
+
+ end
+
+ %% test the omnibus hypothesis using the p values
+
+ % Omnibus hypothesis H_omni: "All the null hypotheses H_s are true" if
+ % any of the p values are lower than the FWE-corrected threshold,
+ % then the omnibus hypothesis can be rejected after that.
+
+ % Search for the statistically significant w-th iteration with the
+ % lowest p value, if more than one iteration has the same p value,
+ % select the one that has the highest RHO value => this is the final
+ % w-th iteration with the corresponding cu/cv features and u/v scores
+
+ %create a logical indexing the lowest p-value(s)
+ p_min = cell2mat(opt_parameters(:,index_p)) == min(cell2mat(opt_parameters(:,index_p)));
+ temp1 = opt_parameters(p_min,:); % placeholder to make syntax easier
+ if size(temp1,1) > 1 % if there is more than one p-value that is equal to the lowest p-value, ie there are two absolute minimal p-values, then continue in the loop
+ RHO_max = cell2mat(temp1(:,index_RHO)) == max(cell2mat(temp1(:,index_RHO))); % logical indexing the highest RHO value
+ final_parameters(ff,:) = temp1(RHO_max,:); % take the row with the lowest p-value and the highest RHO value
+ else
+ final_parameters(ff,:) = temp1; % if there is just one absolute minimal p value, then take this row
+ end
+
+ %% Matrix Deflation => Projection Deflation
+
+ % This method removes the covariance explained by u and v from X
+ % and Y by projecting the data matrices onto the space spanned by the
+ % corresponding weight vector, and subtracting this from the data:
+
+ u = final_parameters{ff,index_u}; % weight vector for X
+ v = final_parameters{ff,index_v}; % weight vector for Y
+ X = X - (X*u)*u'; % the effect of u on X is removed by projection deflation
+ Y = Y - (Y*v)*v'; % the effect of v on Y is removed by projection deflation
+
+ % the p value of this LV is updated from the previously set value of
+ % zero to the actual p value of the LV, if this p value is lower than
+ % the FWE_rate then the while loop continues after matrix deflation and
+ % it keeps looking for the next possible significant LV. If the p value
+ % is higher than the FWE_rate, then the while loop is discontinued and
+ % the algorithm stops. Therefore, this function generates all possible
+ % significant LVs and also the first non-significant LV, afterwards the
+ % algorithm stops.
+ p_LV = final_parameters{ff,index_p};
+
+
+ %% Projection of the original data onto the SPLS latent space
+
+ % epsilon and omega are the projections of the original data onto the
+ % SPLS latent space, spanned by the weight vector pair u and v of this
+ % LV. Therefore each LV spans a specific latent space onto wihich the
+ % samples can be projected. These latent spaces can then be used to
+ % stratify patients.
+ epsilon(ff,:) = X_original * final_parameters{ff,index_u};
+ omega(ff,:) = Y_original * final_parameters{ff,index_v};
+
+ % ff counts through the most outside LV while loop = counts the amount
+ % of significant LVs
+ ff = ff+1;
+
+
+end
+
+% after the LVs are computed, clean up the final parameters, epsilon and
+% omega matrix by removing empty rows
+final_parameters(ff:size(final_parameters,1),:) = [];
+epsilon(ff:size(final_parameters,1),:) = [];
+omega(ff:size(final_parameters,1),:) = [];
+
+end
+
diff --git a/Visualization_Module/dp_spls_updated_AR.m b/Visualization_Module/dp_spls_updated_AR.m
new file mode 100644
index 0000000..3381308
--- /dev/null
+++ b/Visualization_Module/dp_spls_updated_AR.m
@@ -0,0 +1,329 @@
+function [final_parameters, epsilon, omega] = dp_spls_updated(X, Y, hp, tp, B, W, K)
+%
+% Implementation of SPLS algorithm and framework as described in Monteiro
+% et al. 2016, for details: doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs:
+%
+% X, Y - data matrices for MRI images (X) and behavioral data (Y) in
+% the form: samples x features. Use MRI data directly from
+% Neurominer output, the function will standardize both the
+% MRI data and the behavioral data, so that mean = 0 and std =
+% 1.
+%
+% hp - Ratio (in %) of hold out data, which is projected on both
+% the original data set with optimal cu/cv and on the
+% permuted dataset with optimal cu/cv. Default: 10
+%
+% tp - Ratio (in %) of the test data within the K-fold loops.
+% Default: 20
+%
+% B - Number of Permutations for the statistical evaluation of
+% the discovered cu/cv combination. Default: 10000
+%
+% W - Number of wide loops that define how many times the entire
+% SPLS procedure is repeated and how many final p values are
+% calculated. Default: 10
+%
+% K - Number of K splits for the training and testing of the held
+% in data for each cu/cv combination. Default: 100
+%
+%
+% Outputs:
+%
+% final_parameters - Results matrix with rows = number of significant
+% LVs and columns containing the following variables
+% w, cu_opt, cv_opt, u_opt, v_opt, success_opt,
+% RHO_opt, p. The last row contains the first LV that
+% was not significant, it is for informative purposes
+% only.
+%
+% epsilon - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector u of
+% the LV on X.
+%
+% omega - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector v of
+% the LV on Y.
+%
+%
+% Version: 2018-03-05
+%__________________________________________________________________________
+%
+% Written by David Popovic
+% Email: david.popovic@med.uni-muenchen.de
+%
+%% 1. Preparation of SPLS and assignment of matrices
+% Please make sure that you have added the path for the folder containing
+% the following function: spls.m, dp_spls.m, dp_partition_holdout.m,
+% dp_perm.m
+%
+% standardize the data matrices X and Y for usage in SPLS. X_original and
+% Y_original will later be used for projection onto the final SPLS latent
+% space spanned by u and v
+
+X_original = zscore(X);
+Y_original = zscore(Y);
+
+% define the data matrices X and Y for input into the SPLS algorithm
+X = X_original;
+Y = Y_original;
+
+% define the default values for variables tp, hp, B, W, K if no value for
+% them is entered
+
+% hp ratio
+if ~exist('hp', 'var')
+ hp = 10;
+end
+
+% tp ratio
+if ~exist('tp', 'var')
+ tp = 20;
+end
+
+% B
+if ~exist('B', 'var')
+ B = 10000;
+end
+
+% W
+if ~exist('W', 'var')
+ W = 10;
+end
+
+% K
+if ~exist('K', 'var')
+ K = 100;
+end
+
+%% 2. LV loop
+
+% this loop is repeated for the next vector pair u and v as long as the
+% previous vector pair was significant. If the previous vector was not
+% significant, then the loop will stop
+
+% pLV is a starting p value set to 0, so that the while loop starts. Later
+% on it will be updated at the end of each LV iteration. Then it serves the
+% purpose to stop the while loop as soon as an LV was not significant.
+p_LV = 0;
+
+% FWE_rate corrects for multiple testing for the W amount of p values
+FWE_rate = 0.05 / W;
+
+% ff counts the iteration through the LV loops, so that the results for each
+% LV can be stored in separate rows
+ff = 1;
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+range_points = 40; % defines the number of range points for the grid search. 40 is the proposed amount.
+cu_range = linspace(1,sqrt(size(X,2)),range_points);
+cv_range = linspace(1,sqrt(size(Y,2)),range_points);
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times
+cu_cv_combination = [repelem(cu_range,numel(cu_range));repmat(cv_range,1,numel(cv_range))]; % this matrix contains all the possible combinations between cu and cv
+
+% define column names for matrices so that you can access them later by
+% indexing
+spls_output_k_names = {'u','v','success', 'RHO'}; % output of each k iteration
+final_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'};
+opt_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'}; % names of parameters for optimal cu/cv combination of the w-th loop
+cu_cv_combination_names = {'cu';'cv'};
+
+% preallocate placeholder matrices for higher speed
+final_parameters = num2cell(zeros(size(Y,2), numel(final_parameters_names))); % cell array to store final parameters for each LV iteration
+epsilon = zeros(size(final_parameters,1),size(X_original,1)); %projection of weight vector u on corresponding matrix X
+omega = zeros(size(final_parameters,1),size(Y_original,1)); % projection of weight vector v on corresponding matrix Y
+
+% indices for later use
+index_u = strcmp(opt_parameters_names,'u');
+index_v = strcmp(opt_parameters_names,'v');
+index_cu = strcmp(cu_cv_combination_names,'cu');
+index_cv = strcmp(cu_cv_combination_names,'cv');
+index_RHO_k = strcmp(spls_output_k_names,'RHO');
+index_RHO = strcmp(opt_parameters_names, 'RHO');
+index_p = strcmp(opt_parameters_names, 'p');
+
+% here starts the outer loop for each single LV, the next LV is only
+% computed if the previous LV was significant (with FWE correction)
+while p_LV <= FWE_rate
+
+%% 3. Wide loop
+% repeats the entire process W times to obtain W different final p values,
+% which go into the omnibus hypothesis
+
+% matrix to store the optimal parameters of the w-th loop
+opt_parameters = num2cell(zeros(W,numel(opt_parameters_names)));
+
+ for w=1:W
+
+ %% hyper-parameter optimisation
+ % remove hp% of the data randomly and keep it in a hold-out
+ % dataset, the rest is called the keep_in data for training/testing
+ % the algorithm
+
+ [hold_out_data_x, keep_in_data_x, hold_out_data_y, keep_in_data_y] = dp_partition_holdout(hp, X, Y);
+
+ % create an inner loop with k splits and a tp test perecentage set
+ % within each split
+
+ % RHO_avg is a vector where all average RHO values of the different
+ % cu/cv combinations are stored, preallocated for speed
+ save('/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/cvcu.mat',...
+ 'cu_cv_combination',...
+ 'keep_in_data_x',...
+ 'keep_in_data_y',...
+ 'tp',...
+ 'K')
+ RHO_avg = nan(size(cu_cv_combination,2),1);
+ save('/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg.mat','RHO_avg');
+
+ success = system('qsub /volume/DP_FEF/ScrFun/ScriptsRepository/dp_rho_avg.sh');
+
+
+ % file checker
+ for i=1:size(cu_cv_combination,2)
+ load(['/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/cvcu_',num2str(i),'.mat'])
+ Rho_avg(i,1) = cvcu.M(2);
+ end
+
+
+ % select the hyperparameter combination with the highest average
+ % correlation, ie the one with the highest RHO_avg
+ [~, I_RHO] = max(RHO_avg);
+
+% find the corresponding cu and cv values of the max RHO element, this
+% gives you the cu/cv combination with the highest average correlation
+
+ cu_opt = cu_cv_combination(index_cu,I_RHO);
+ cv_opt = cu_cv_combination(index_cv,I_RHO);
+
+
+ %% Statistical Evaluation
+
+
+ %train the model with the optimal cu/cv combination on the previous
+ %train/test data set to get u and v
+
+ [u_opt, v_opt, success_opt]=spls(keep_in_data_x, keep_in_data_y,cu_opt, cv_opt);
+
+ %project the hold_out data set on the computed u and v vectors to
+ %get the absolute correlations between these projections
+ RHO_opt = abs(corr(hold_out_data_x*u_opt,hold_out_data_y*v_opt));
+
+ % permute the keep_in data in one dimension so that the
+ % relationship between these two views gets destroyed
+
+ % collection of RHO values for the B times permutated dataset,
+ % preallocated for speed
+ RHO_b_collection = zeros(B,1);
+
+% Now comes the permutation step, where the order of the samples in one
+% view (in this case the Y matrix) gets permuted and the algorithm is
+% trained on the permuted data set with a destroyed relationship
+% between X and Y, this process is repeated B times
+
+ for b=1:B
+
+ % use the permuted perm_data_y and the regular keep_in_data_x
+ % and compute u_b and v_b for the permutated data using spls
+ [u_b, v_b, ~]=spls(keep_in_data_x, dp_perm(keep_in_data_y), cu_opt, cv_opt);
+
+ % compute the absolute correlation between the hold_out data
+ % and the permuted u_b and v_b
+ RHO_b = abs(corr(hold_out_data_x*u_b,hold_out_data_y*v_b));
+
+ % store the calculated RHO_b value in a vector
+ RHO_b_collection(b,1) = RHO_b;
+ end
+
+ % test the following null hypothesis H_s: "There is no relationship
+ % between the two views, therefore the correlation obtained with
+ % the original data is not different from the correlation
+ % obtained with the permuted data"
+
+ % calculate how many times RHO_b was bigger than or equal to RHO_opt,
+ % ie how many times the permutated data led to a higher correlation
+ % using spls than the original data
+ RHO_count_b = sum(RHO_b_collection >= RHO_opt);
+
+ % calculate the p value to test whether the null hypothesis is true
+ p = ((1+RHO_count_b)/(B+1));
+
+ % store all parameters of the w-th wide loop into a matrix
+ opt_parameters(w,:) = {w cu_opt cv_opt u_opt v_opt success_opt RHO_opt p};
+
+ end
+
+ %% test the omnibus hypothesis using the p values
+
+ % Omnibus hypothesis H_omni: "All the null hypotheses H_s are true" if
+ % any of the p values are lower than the FWE-corrected threshold,
+ % then the omnibus hypothesis can be rejected after that.
+
+ % Search for the statistically significant w-th iteration with the
+ % lowest p value, if more than one iteration has the same p value,
+ % select the one that has the highest RHO value => this is the final
+ % w-th iteration with the corresponding cu/cv features and u/v scores
+
+ %create a logical indexing the lowest p-value(s)
+ p_min = cell2mat(opt_parameters(:,index_p)) == min(cell2mat(opt_parameters(:,index_p)));
+ temp1 = opt_parameters(p_min,:); % placeholder to make syntax easier
+ if size(temp1,1) > 1 % if there is more than one p-value that is equal to the lowest p-value, ie there are two absolute minimal p-values, then continue in the loop
+ RHO_max = cell2mat(temp1(:,index_RHO)) == max(cell2mat(temp1(:,index_RHO))); % logical indexing the highest RHO value
+ final_parameters(ff,:) = temp1(RHO_max,:); % take the row with the lowest p-value and the highest RHO value
+ else
+ final_parameters(ff,:) = temp1; % if there is just one absolute minimal p value, then take this row
+ end
+
+ %% Matrix Deflation => Projection Deflation
+
+ % This method removes the covariance explained by u and v from X
+ % and Y by projecting the data matrices onto the space spanned by the
+ % corresponding weight vector, and subtracting this from the data:
+
+ u = final_parameters{ff,index_u}; % weight vector for X
+ v = final_parameters{ff,index_v}; % weight vector for Y
+ X = X - (X*u)*u'; % the effect of u on X is removed by projection deflation
+ Y = Y - (Y*v)*v'; % the effect of v on Y is removed by projection deflation
+
+ % the p value of this LV is updated from the previously set value of
+ % zero to the actual p value of the LV, if this p value is lower than
+ % the FWE_rate then the while loop continues after matrix deflation and
+ % it keeps looking for the next possible significant LV. If the p value
+ % is higher than the FWE_rate, then the while loop is discontinued and
+ % the algorithm stops. Therefore, this function generates all possible
+ % significant LVs and also the first non-significant LV, afterwards the
+ % algorithm stops.
+ p_LV = final_parameters{ff,index_p};
+
+
+ %% Projection of the original data onto the SPLS latent space
+
+ % epsilon and omega are the projections of the original data onto the
+ % SPLS latent space, spanned by the weight vector pair u and v of this
+ % LV. Therefore each LV spans a specific latent space onto wihich the
+ % samples can be projected. These latent spaces can then be used to
+ % stratify patients.
+ epsilon(ff,:) = X_original * final_parameters{ff,index_u};
+ omega(ff,:) = Y_original * final_parameters{ff,index_v};
+
+ % ff counts through the most outside LV while loop = counts the amount
+ % of significant LVs
+ ff = ff+1;
+
+
+end
+
+% after the LVs are computed, clean up the final parameters, epsilon and
+% omega matrix by removing empty rows
+final_parameters(ff:size(final_parameters,1),:) = [];
+epsilon(ff:size(final_parameters,1),:) = [];
+omega(ff:size(final_parameters,1),:) = [];
+
+end
+
diff --git a/Visualization_Module/dp_spls_updated_AR_DP.m b/Visualization_Module/dp_spls_updated_AR_DP.m
new file mode 100644
index 0000000..0ad02a2
--- /dev/null
+++ b/Visualization_Module/dp_spls_updated_AR_DP.m
@@ -0,0 +1,373 @@
+function [final_parameters, epsilon, omega] = dp_spls_updated_AR_DP(analysis_folder, X, Y, hp, tp, B, W, K)
+%
+% Implementation of SPLS algorithm and framework as described in Monteiro
+% et al. 2016, for details: doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs:
+%
+% X, Y - data matrices for MRI images (X) and behavioral data (Y) in
+% the form: samples x features. Use MRI data directly from
+% Neurominer output, the function will standardize both the
+% MRI data and the behavioral data, so that mean = 0 and std =
+% 1.
+%
+% hp - Ratio (in %) of hold out data, which is projected on both
+% the original data set with optimal cu/cv and on the
+% permuted dataset with optimal cu/cv. Default: 10
+%
+% tp - Ratio (in %) of the test data within the K-fold loops.
+% Default: 20
+%
+% B - Number of Permutations for the statistical evaluation of
+% the discovered cu/cv combination. Default: 10000
+%
+% W - Number of wide loops that define how many times the entire
+% SPLS procedure is repeated and how many final p values are
+% calculated. Default: 10
+%
+% K - Number of K splits for the training and testing of the held
+% in data for each cu/cv combination. Default: 100
+%
+%
+% Outputs:
+%
+% final_parameters - Results matrix with rows = number of significant
+% LVs and columns containing the following variables
+% w, cu_opt, cv_opt, u_opt, v_opt, success_opt,
+% RHO_opt, p. The last row contains the first LV that
+% was not significant, it is for informative purposes
+% only.
+%
+% epsilon - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector u of
+% the LV on X.
+%
+% omega - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector v of
+% the LV on Y.
+%
+%
+% Version: 2018-03-05
+%__________________________________________________________________________
+%
+% Written by David Popovic
+% Email: david.popovic@med.uni-muenchen.de
+%
+
+%% make a new directory for temporary files and folders
+cd(folder)
+mkdir('temp_RHO');
+RHO_path = [folder '/temp_RHO'];
+mkdir('temp_B');
+B_path = [folder '/temp_B'];
+mkdir('common');
+common_path = [folder '/common'];
+
+%% 1. Preparation of SPLS and assignment of matrices
+% Please make sure that you have added the path for the folder containing
+% the following function: spls.m, dp_spls.m, dp_partition_holdout.m,
+% dp_perm.m
+% standardize the data matrices X and Y for usage in SPLS. X_original and
+% Y_original will later be used for projection onto the final SPLS latent
+% space spanned by u and v
+
+X_original = zscore(X);
+Y_original = zscore(Y);
+
+% define the data matrices X and Y for input into the SPLS algorithm
+X = X_original;
+Y = Y_original;
+
+% define the default values for variables tp, hp, B, W, K if no value for
+% them is entered
+
+% hp ratio
+if ~exist('hp', 'var')
+ hp = 10;
+end
+
+% tp ratio
+if ~exist('tp', 'var')
+ tp = 20;
+end
+
+% B
+if ~exist('B', 'var')
+ B = 10000;
+end
+
+% W
+if ~exist('W', 'var')
+ W = 10;
+end
+
+% K
+if ~exist('K', 'var')
+ K = 100;
+end
+
+%% 2. LV loop
+
+% this loop is repeated for the next vector pair u and v as long as the
+% previous vector pair was significant. If the previous vector was not
+% significant, then the loop will stop
+
+% pLV is a starting p value set to 0, so that the while loop starts. Later
+% on it will be updated at the end of each LV iteration. Then it serves the
+% purpose to stop the while loop as soon as an LV was not significant.
+p_LV = 0;
+
+% FWE_rate corrects for multiple testing for the W amount of p values
+FWE_rate = 0.05 / W;
+
+% ff counts the iteration through the LV loops, so that the results for each
+% LV can be stored in separate rows
+ff = 1;
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+range_points = 40; % defines the number of range points for the grid search. 40 is the proposed amount.
+cu_range = linspace(1,sqrt(size(X,2)),range_points);
+cv_range = linspace(1,sqrt(size(Y,2)),range_points);
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times
+cu_cv_combination = [repelem(cu_range,numel(cu_range));repmat(cv_range,1,numel(cv_range))]; % this matrix contains all the possible combinations between cu and cv
+
+% define column names for matrices so that you can access them later by
+% indexing
+spls_output_k_names = {'u','v','success', 'RHO'}; % output of each k iteration
+final_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'};
+opt_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'}; % names of parameters for optimal cu/cv combination of the w-th loop
+cu_cv_combination_names = {'cu';'cv'};
+
+% preallocate placeholder matrices for higher speed
+final_parameters = num2cell(zeros(size(Y,2), numel(final_parameters_names))); % cell array to store final parameters for each LV iteration
+epsilon = zeros(size(final_parameters,1),size(X_original,1)); %projection of weight vector u on corresponding matrix X
+omega = zeros(size(final_parameters,1),size(Y_original,1)); % projection of weight vector v on corresponding matrix Y
+
+% indices for later use
+index_u = strcmp(opt_parameters_names,'u');
+index_v = strcmp(opt_parameters_names,'v');
+index_cu = strcmp(cu_cv_combination_names,'cu');
+index_cv = strcmp(cu_cv_combination_names,'cv');
+index_RHO_k = strcmp(spls_output_k_names,'RHO');
+index_RHO = strcmp(opt_parameters_names, 'RHO');
+index_p = strcmp(opt_parameters_names, 'p');
+
+% here starts the outer loop for each single LV, the next LV is only
+% computed if the previous LV was significant (with FWE correction)
+while p_LV <= FWE_rate
+
+%% 3. Wide loop
+% repeats the entire process W times to obtain W different final p values,
+% which go into the omnibus hypothesis
+
+% matrix to store the optimal parameters of the w-th loop
+opt_parameters = num2cell(zeros(W,numel(opt_parameters_names)));
+
+ for w=1:W
+
+ %% hyper-parameter optimisation
+ % remove hp% of the data randomly and keep it in a hold-out
+ % dataset, the rest is called the keep_in data for training/testing
+ % the algorithm
+
+ [hold_out_data_x, keep_in_data_x, hold_out_data_y, keep_in_data_y] = dp_partition_holdout(hp, X, Y);
+
+ % create a vector which is updated for every i-th hyperparameter
+ % combination
+ RHO_avg = zeros(size(cu_cv_combination,2),1);
+ success_cu_cv = zeros(size(cu_cv_combination,2),1);
+% saveopt = '-v7.3';
+% save('/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg_success.mat','RHO_avg','success_cu_cv', saveopt);
+%
+ % RHO_avg is a vector where all average RHO values of the different
+ % cu/cv combinations are stored, preallocated for speed
+ save([common_path '/cucv.mat'],...
+ 'cu_cv_combination',...
+ 'keep_in_data_x',...
+ 'keep_in_data_y',...
+ 'tp',...
+ 'K',...
+ 'RHO_path');
+% save('/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg.mat','RHO_avg');
+ cd(analysis_folder);
+ if ~exist([analysis_folder '/temp_RHO'])
+ mkdir temp_RHO;
+ end
+
+ if ~exist([analysis_folder '/temp_B'])
+ mkdir temp_B;
+ end
+
+ cd([analysis_folder '/temp_RHO']);
+ success = system('qsub /volume/DP_FEF/Analysis/12-April-2018/dp_rho_avg_testing.sh');
+
+RHO_collection = zeros(10,1);
+
+% for i=1:10
+% load(['RHO_avg_' num2str(i) '.mat'], 'RHO_avg');
+% RHO_collection(i,1) = RHO;
+% end
+%
+% collect all files with RHO values, open them and store the RHO values in
+% a double
+% folder = '/volume/DP_FEF/Analysis/28-Mar-2018/cvcu';
+filecount = size(dir([analysis_folder '/temp_RHO/RHO_avg_*']),1);
+RHO_collection = zeros(size(cu_cv_combination,2),1);
+
+
+
+for i=1:size(cu_cv_combination,2)
+ if exist(['RHO_avg_' num2str(i) '.mat'])
+ load(['/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg_',num2str(i),'.mat']);
+ RHO_collection(i) = RHO_avg;
+ else
+ RHO_collection(i) = NaN;
+ end
+end
+
+
+% select the hyperparameter combination with the highest average
+% correlation, ie the one with the highest RHO_avg
+ [value_RHO, index_RHO] = max(RHO_avg);
+
+% find the corresponding cu and cv values of the max RHO element, this
+% gives you the cu/cv combination with the highest average correlation
+
+ cu_opt = cu_cv_combination(index_cu,index_RHO);
+ cv_opt = cu_cv_combination(index_cv,index_RHO);
+
+ for i=1:size(cu_cv_combination,2)
+ filename = fullfile(['/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg_',num2str(i),'.mat']);
+ delete(filename);
+ end
+
+
+ %% Statistical Evaluation
+
+
+ %train the model with the optimal cu/cv combination on the previous
+ %train/test data set to get u and v
+
+ [u_opt, v_opt, success_opt]=spls(keep_in_data_x, keep_in_data_y,cu_opt, cv_opt);
+
+ %project the hold_out data set on the computed u and v vectors to
+ %get the absolute correlations between these projections
+ RHO_opt = abs(corr(hold_out_data_x*u_opt,hold_out_data_y*v_opt));
+
+ % permute the keep_in data in one dimension so that the
+ % relationship between these two views gets destroyed
+
+ % collection of RHO values for the B times permutated dataset,
+ % preallocated for speed
+ RHO_b_collection = zeros(B,1);
+
+% Now comes the permutation step, where the order of the samples in one
+% view (in this case the Y matrix) gets permuted and the algorithm is
+% trained on the permuted data set with a destroyed relationship
+% between X and Y, this process is repeated B times
+
+ for b=1:B
+
+ % use the permuted perm_data_y and the regular keep_in_data_x
+ % and compute u_b and v_b for the permutated data using spls
+ [u_b, v_b, ~]=spls(keep_in_data_x, dp_perm(keep_in_data_y), cu_opt, cv_opt);
+
+ % compute the absolute correlation between the hold_out data
+ % and the permuted u_b and v_b
+ RHO_b = abs(corr(hold_out_data_x*u_b,hold_out_data_y*v_b));
+
+ % store the calculated RHO_b value in a vector
+ RHO_b_collection(b,1) = RHO_b;
+ end
+
+ % test the following null hypothesis H_s: "There is no relationship
+ % between the two views, therefore the correlation obtained with
+ % the original data is not different from the correlation
+ % obtained with the permuted data"
+
+ % calculate how many times RHO_b was bigger than or equal to RHO_opt,
+ % ie how many times the permutated data led to a higher correlation
+ % using spls than the original data
+ RHO_count_b = sum(RHO_b_collection >= RHO_opt);
+
+ % calculate the p value to test whether the null hypothesis is true
+ p = ((1+RHO_count_b)/(B+1));
+
+ % store all parameters of the w-th wide loop into a matrix
+ opt_parameters(w,:) = {w cu_opt cv_opt u_opt v_opt success_opt RHO_opt p};
+
+ end
+
+ %% test the omnibus hypothesis using the p values
+
+ % Omnibus hypothesis H_omni: "All the null hypotheses H_s are true" if
+ % any of the p values are lower than the FWE-corrected threshold,
+ % then the omnibus hypothesis can be rejected after that.
+
+ % Search for the statistically significant w-th iteration with the
+ % lowest p value, if more than one iteration has the same p value,
+ % select the one that has the highest RHO value => this is the final
+ % w-th iteration with the corresponding cu/cv features and u/v scores
+
+ %create a logical indexing the lowest p-value(s)
+ p_min = cell2mat(opt_parameters(:,index_p)) == min(cell2mat(opt_parameters(:,index_p)));
+ temp1 = opt_parameters(p_min,:); % placeholder to make syntax easier
+ if size(temp1,1) > 1 % if there is more than one p-value that is equal to the lowest p-value, ie there are two absolute minimal p-values, then continue in the loop
+ RHO_max = cell2mat(temp1(:,index_RHO)) == max(cell2mat(temp1(:,index_RHO))); % logical indexing the highest RHO value
+ final_parameters(ff,:) = temp1(RHO_max,:); % take the row with the lowest p-value and the highest RHO value
+ else
+ final_parameters(ff,:) = temp1; % if there is just one absolute minimal p value, then take this row
+ end
+
+ %% Matrix Deflation => Projection Deflation
+
+ % This method removes the covariance explained by u and v from X
+ % and Y by projecting the data matrices onto the space spanned by the
+ % corresponding weight vector, and subtracting this from the data:
+
+ u = final_parameters{ff,index_u}; % weight vector for X
+ v = final_parameters{ff,index_v}; % weight vector for Y
+ X = X - (X*u)*u'; % the effect of u on X is removed by projection deflation
+ Y = Y - (Y*v)*v'; % the effect of v on Y is removed by projection deflation
+
+ % the p value of this LV is updated from the previously set value of
+ % zero to the actual p value of the LV, if this p value is lower than
+ % the FWE_rate then the while loop continues after matrix deflation and
+ % it keeps looking for the next possible significant LV. If the p value
+ % is higher than the FWE_rate, then the while loop is discontinued and
+ % the algorithm stops. Therefore, this function generates all possible
+ % significant LVs and also the first non-significant LV, afterwards the
+ % algorithm stops.
+ p_LV = final_parameters{ff,index_p};
+
+
+ %% Projection of the original data onto the SPLS latent space
+
+ % epsilon and omega are the projections of the original data onto the
+ % SPLS latent space, spanned by the weight vector pair u and v of this
+ % LV. Therefore each LV spans a specific latent space onto wihich the
+ % samples can be projected. These latent spaces can then be used to
+ % stratify patients.
+ epsilon(ff,:) = X_original * final_parameters{ff,index_u};
+ omega(ff,:) = Y_original * final_parameters{ff,index_v};
+
+ % ff counts through the most outside LV while loop = counts the amount
+ % of significant LVs
+ ff = ff+1;
+
+
+end
+
+% after the LVs are computed, clean up the final parameters, epsilon and
+% omega matrix by removing empty rows
+final_parameters(ff:size(final_parameters,1),:) = [];
+epsilon(ff:size(final_parameters,1),:) = [];
+omega(ff:size(final_parameters,1),:) = [];
+
+end
+
diff --git a/Visualization_Module/dp_spls_updated_AR_DP.m~ b/Visualization_Module/dp_spls_updated_AR_DP.m~
new file mode 100644
index 0000000..6971805
--- /dev/null
+++ b/Visualization_Module/dp_spls_updated_AR_DP.m~
@@ -0,0 +1,373 @@
+function [final_parameters, epsilon, omega] = dp_spls_updated_AR_DP(analysis_folder, X, Y, hp, tp, B, W, K)
+%
+% Implementation of SPLS algorithm and framework as described in Monteiro
+% et al. 2016, for details: doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs:
+%
+% X, Y - data matrices for MRI images (X) and behavioral data (Y) in
+% the form: samples x features. Use MRI data directly from
+% Neurominer output, the function will standardize both the
+% MRI data and the behavioral data, so that mean = 0 and std =
+% 1.
+%
+% hp - Ratio (in %) of hold out data, which is projected on both
+% the original data set with optimal cu/cv and on the
+% permuted dataset with optimal cu/cv. Default: 10
+%
+% tp - Ratio (in %) of the test data within the K-fold loops.
+% Default: 20
+%
+% B - Number of Permutations for the statistical evaluation of
+% the discovered cu/cv combination. Default: 10000
+%
+% W - Number of wide loops that define how many times the entire
+% SPLS procedure is repeated and how many final p values are
+% calculated. Default: 10
+%
+% K - Number of K splits for the training and testing of the held
+% in data for each cu/cv combination. Default: 100
+%
+%
+% Outputs:
+%
+% final_parameters - Results matrix with rows = number of significant
+% LVs and columns containing the following variables
+% w, cu_opt, cv_opt, u_opt, v_opt, success_opt,
+% RHO_opt, p. The last row contains the first LV that
+% was not significant, it is for informative purposes
+% only.
+%
+% epsilon - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector u of
+% the LV on X.
+%
+% omega - Matrix with rows = Number of LV and columns
+% containing the projection of the weight vector v of
+% the LV on Y.
+%
+%
+% Version: 2018-03-05
+%__________________________________________________________________________
+%
+% Written by David Popovic
+% Email: david.popovic@med.uni-muenchen.de
+%
+
+%% make a new directory for temporary files and folders
+cd(folder)
+mkdir('temp_RHO');
+RHO_path = [folder '/temp_RHO'];
+mkdir('temp_B');
+B_path = [folder '/temp_B'];
+mkdir('common');
+common_path = [folder '/common'];
+
+%% 1. Preparation of SPLS and assignment of matrices
+% Please make sure that you have added the path for the folder containing
+% the following function: spls.m, dp_spls.m, dp_partition_holdout.m,
+% dp_perm.m
+% standardize the data matrices X and Y for usage in SPLS. X_original and
+% Y_original will later be used for projection onto the final SPLS latent
+% space spanned by u and v
+
+X_original = zscore(X);
+Y_original = zscore(Y);
+
+% define the data matrices X and Y for input into the SPLS algorithm
+X = X_original;
+Y = Y_original;
+
+% define the default values for variables tp, hp, B, W, K if no value for
+% them is entered
+
+% hp ratio
+if ~exist('hp', 'var')
+ hp = 10;
+end
+
+% tp ratio
+if ~exist('tp', 'var')
+ tp = 20;
+end
+
+% B
+if ~exist('B', 'var')
+ B = 10000;
+end
+
+% W
+if ~exist('W', 'var')
+ W = 10;
+end
+
+% K
+if ~exist('K', 'var')
+ K = 100;
+end
+
+%% 2. LV loop
+
+% this loop is repeated for the next vector pair u and v as long as the
+% previous vector pair was significant. If the previous vector was not
+% significant, then the loop will stop
+
+% pLV is a starting p value set to 0, so that the while loop starts. Later
+% on it will be updated at the end of each LV iteration. Then it serves the
+% purpose to stop the while loop as soon as an LV was not significant.
+p_LV = 0;
+
+% FWE_rate corrects for multiple testing for the W amount of p values
+FWE_rate = 0.05 / W;
+
+% ff counts the iteration through the LV loops, so that the results for each
+% LV can be stored in separate rows
+ff = 1;
+
+% cu_range and cv_range define the range for the grid search. The grid
+% search is performed along 40 points from 1 to sqrt(number of variables)
+% as proposed in Monteiro et al. 2016.
+range_points = 40; % defines the number of range points for the grid search. 40 is the proposed amount.
+cu_range = linspace(1,sqrt(size(X,2)),range_points);
+cv_range = linspace(1,sqrt(size(Y,2)),range_points);
+
+% compile a matrix with separate row for all possible cu and cv
+% combinations by taking cu and repeating every single element 40 times and
+% then takin cv and repeating the entire vector 40 times
+cu_cv_combination = [repelem(cu_range,numel(cu_range));repmat(cv_range,1,numel(cv_range))]; % this matrix contains all the possible combinations between cu and cv
+
+% define column names for matrices so that you can access them later by
+% indexing
+spls_output_k_names = {'u','v','success', 'RHO'}; % output of each k iteration
+final_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'};
+opt_parameters_names = {'w', 'cu', 'cv', 'u', 'v', 'success', 'RHO', 'p'}; % names of parameters for optimal cu/cv combination of the w-th loop
+cu_cv_combination_names = {'cu';'cv'};
+
+% preallocate placeholder matrices for higher speed
+final_parameters = num2cell(zeros(size(Y,2), numel(final_parameters_names))); % cell array to store final parameters for each LV iteration
+epsilon = zeros(size(final_parameters,1),size(X_original,1)); %projection of weight vector u on corresponding matrix X
+omega = zeros(size(final_parameters,1),size(Y_original,1)); % projection of weight vector v on corresponding matrix Y
+
+% indices for later use
+index_u = strcmp(opt_parameters_names,'u');
+index_v = strcmp(opt_parameters_names,'v');
+index_cu = strcmp(cu_cv_combination_names,'cu');
+index_cv = strcmp(cu_cv_combination_names,'cv');
+index_RHO_k = strcmp(spls_output_k_names,'RHO');
+index_RHO = strcmp(opt_parameters_names, 'RHO');
+index_p = strcmp(opt_parameters_names, 'p');
+
+% here starts the outer loop for each single LV, the next LV is only
+% computed if the previous LV was significant (with FWE correction)
+while p_LV <= FWE_rate
+
+%% 3. Wide loop
+% repeats the entire process W times to obtain W different final p values,
+% which go into the omnibus hypothesis
+
+% matrix to store the optimal parameters of the w-th loop
+opt_parameters = num2cell(zeros(W,numel(opt_parameters_names)));
+
+ for w=1:W
+
+ %% hyper-parameter optimisation
+ % remove hp% of the data randomly and keep it in a hold-out
+ % dataset, the rest is called the keep_in data for training/testing
+ % the algorithm
+
+ [hold_out_data_x, keep_in_data_x, hold_out_data_y, keep_in_data_y] = dp_partition_holdout(hp, X, Y);
+
+ % create a vector which is updated for every i-th hyperparameter
+ % combination
+ RHO_avg = zeros(size(cu_cv_combination,2),1);
+ success_cu_cv = zeros(size(cu_cv_combination,2),1);
+% saveopt = '-v7.3';
+% save('/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg_success.mat','RHO_avg','success_cu_cv', saveopt);
+%
+ % RHO_avg is a vector where all average RHO values of the different
+ % cu/cv combinations are stored, preallocated for speed
+ save([common_path '/cucv.mat'],...
+ 'cu_cv_combination',...
+ 'keep_in_data_x',...
+ 'keep_in_data_y',...
+ 'tp',...
+ 'K',...
+ 'RHO_path');
+% save('/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg.mat','RHO_avg');
+ cd(analysis_folder);
+ if ~exist([analysis_folder '/temp_RHO'])
+ mkdir temp_RHO;
+ end
+
+ if ~exist([analysis_folder '/temp_B'])
+ mkdir temp_B;
+ end
+
+ cd([analysis_folder '/temp_RHO']);
+ success = system('qsub /volume/DP_FEF/Analysis/12-April-2018/dp_rho_avg_testing.sh');
+
+RHO_collection = zeros(10,1);
+
+% for i=1:10
+% load(['RHO_avg_' num2str(i) '.mat'], 'RHO_avg');
+% RHO_collection(i,1) = RHO;
+% end
+%
+% collect all files with RHO values, open them and store the RHO values in
+% a double
+% folder = '/volume/DP_FEF/Analysis/28-Mar-2018/cvcu';
+filecount = size(dir([analysis_folder '/temp_RHO/RHO_avg_*']),1);
+RHO_collection = zeros(size(cu_cv_combination,2),1);
+
+
+
+for i=1:size(cu_cv_combination,2)
+ if exist(['RHO_avg_' num2str(i) '.mat'])
+ load(['/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg_',num2str(i),'.mat']);
+ RHO_collection(i) = RHO_avg;
+ else
+ RHO_collection(i) = NaN;
+ end
+end
+
+
+% select the hyperparameter combination with the highest average
+% correlation, ie the one with the highest RHO_avg
+ [value_RHO, index_RHO] = max(RHO_collection);
+
+% find the corresponding cu and cv values of the max RHO element, this
+% gives you the cu/cv combination with the highest average correlation
+
+ cu_opt = cu_cv_combination(index_cu,index_RHO);
+ cv_opt = cu_cv_combination(index_cv,index_RHO);
+
+% for i=1:size(cu_cv_combination,2)
+% filename = fullfile(['/volume/DP_FEF/Analysis/28-Mar-2018/cvcu/RHO_avg_',num2str(i),'.mat']);
+% delete(filename);
+% end
+
+
+ %% Statistical Evaluation
+
+
+ %train the model with the optimal cu/cv combination on the previous
+ %train/test data set to get u and v
+
+ [u_opt, v_opt, success_opt]=spls(keep_in_data_x, keep_in_data_y,cu_opt, cv_opt);
+
+ %project the hold_out data set on the computed u and v vectors to
+ %get the absolute correlations between these projections
+ RHO_opt = abs(corr(hold_out_data_x*u_opt,hold_out_data_y*v_opt));
+
+ % permute the keep_in data in one dimension so that the
+ % relationship between these two views gets destroyed
+
+ % collection of RHO values for the B times permutated dataset,
+ % preallocated for speed
+ RHO_b_collection = zeros(B,1);
+
+% Now comes the permutation step, where the order of the samples in one
+% view (in this case the Y matrix) gets permuted and the algorithm is
+% trained on the permuted data set with a destroyed relationship
+% between X and Y, this process is repeated B times
+
+ for b=1:B
+
+ % use the permuted perm_data_y and the regular keep_in_data_x
+ % and compute u_b and v_b for the permutated data using spls
+ [u_b, v_b, ~]=spls(keep_in_data_x, dp_perm(keep_in_data_y), cu_opt, cv_opt);
+
+ % compute the absolute correlation between the hold_out data
+ % and the permuted u_b and v_b
+ RHO_b = abs(corr(hold_out_data_x*u_b,hold_out_data_y*v_b));
+
+ % store the calculated RHO_b value in a vector
+ RHO_b_collection(b,1) = RHO_b;
+ end
+
+ % test the following null hypothesis H_s: "There is no relationship
+ % between the two views, therefore the correlation obtained with
+ % the original data is not different from the correlation
+ % obtained with the permuted data"
+
+ % calculate how many times RHO_b was bigger than or equal to RHO_opt,
+ % ie how many times the permutated data led to a higher correlation
+ % using spls than the original data
+ RHO_count_b = sum(RHO_b_collection >= RHO_opt);
+
+ % calculate the p value to test whether the null hypothesis is true
+ p = ((1+RHO_count_b)/(B+1));
+
+ % store all parameters of the w-th wide loop into a matrix
+ opt_parameters(w,:) = {w cu_opt cv_opt u_opt v_opt success_opt RHO_opt p};
+
+ end
+
+ %% test the omnibus hypothesis using the p values
+
+ % Omnibus hypothesis H_omni: "All the null hypotheses H_s are true" if
+ % any of the p values are lower than the FWE-corrected threshold,
+ % then the omnibus hypothesis can be rejected after that.
+
+ % Search for the statistically significant w-th iteration with the
+ % lowest p value, if more than one iteration has the same p value,
+ % select the one that has the highest RHO value => this is the final
+ % w-th iteration with the corresponding cu/cv features and u/v scores
+
+ %create a logical indexing the lowest p-value(s)
+ p_min = cell2mat(opt_parameters(:,index_p)) == min(cell2mat(opt_parameters(:,index_p)));
+ temp1 = opt_parameters(p_min,:); % placeholder to make syntax easier
+ if size(temp1,1) > 1 % if there is more than one p-value that is equal to the lowest p-value, ie there are two absolute minimal p-values, then continue in the loop
+ RHO_max = cell2mat(temp1(:,index_RHO)) == max(cell2mat(temp1(:,index_RHO))); % logical indexing the highest RHO value
+ final_parameters(ff,:) = temp1(RHO_max,:); % take the row with the lowest p-value and the highest RHO value
+ else
+ final_parameters(ff,:) = temp1; % if there is just one absolute minimal p value, then take this row
+ end
+
+ %% Matrix Deflation => Projection Deflation
+
+ % This method removes the covariance explained by u and v from X
+ % and Y by projecting the data matrices onto the space spanned by the
+ % corresponding weight vector, and subtracting this from the data:
+
+ u = final_parameters{ff,index_u}; % weight vector for X
+ v = final_parameters{ff,index_v}; % weight vector for Y
+ X = X - (X*u)*u'; % the effect of u on X is removed by projection deflation
+ Y = Y - (Y*v)*v'; % the effect of v on Y is removed by projection deflation
+
+ % the p value of this LV is updated from the previously set value of
+ % zero to the actual p value of the LV, if this p value is lower than
+ % the FWE_rate then the while loop continues after matrix deflation and
+ % it keeps looking for the next possible significant LV. If the p value
+ % is higher than the FWE_rate, then the while loop is discontinued and
+ % the algorithm stops. Therefore, this function generates all possible
+ % significant LVs and also the first non-significant LV, afterwards the
+ % algorithm stops.
+ p_LV = final_parameters{ff,index_p};
+
+
+ %% Projection of the original data onto the SPLS latent space
+
+ % epsilon and omega are the projections of the original data onto the
+ % SPLS latent space, spanned by the weight vector pair u and v of this
+ % LV. Therefore each LV spans a specific latent space onto wihich the
+ % samples can be projected. These latent spaces can then be used to
+ % stratify patients.
+ epsilon(ff,:) = X_original * final_parameters{ff,index_u};
+ omega(ff,:) = Y_original * final_parameters{ff,index_v};
+
+ % ff counts through the most outside LV while loop = counts the amount
+ % of significant LVs
+ ff = ff+1;
+
+
+end
+
+% after the LVs are computed, clean up the final parameters, epsilon and
+% omega matrix by removing empty rows
+final_parameters(ff:size(final_parameters,1),:) = [];
+epsilon(ff:size(final_parameters,1),:) = [];
+omega(ff:size(final_parameters,1),:) = [];
+
+end
+
diff --git a/Visualization_Module/dp_train_test_splits.m b/Visualization_Module/dp_train_test_splits.m
new file mode 100644
index 0000000..d82a1c3
--- /dev/null
+++ b/Visualization_Module/dp_train_test_splits.m
@@ -0,0 +1,52 @@
+ %% DP K-Splits
+function [train_test_matrix] = dp_train_test_splits(output_folder, X, Y, K)
+
+% addpath /volume/DP_FEF/ScrFun/ScriptsRepository/
+%
+% input_names = {hp_file K_file X_file Y_file};
+%
+% for i=1:numel(input_names)
+% formatSpec = '%f';
+% fileID = fopen([input_folder input_names{i}],'r');
+% switch input_names{i}
+% case hp_file
+% hp = fscanf(fileID,formatSpec);
+% case K_file
+% K = fscanf(fileID,formatSpec);
+% case X_file
+% fileID_columns = fopen([input_folder columns_X_file],'r');
+% columns = fscanf(fileID_columns,formatSpec);
+% size=[columns Inf];
+% X = [fscanf(fileID, formatSpec, size)]';
+% case Y_file
+% fileID_columns = fopen([input_folder columns_Y_file],'r');
+% columns = fscanf(fileID_columns,formatSpec);
+% size=[columns Inf];
+% Y = [fscanf(fileID, formatSpec, size)]';
+% end
+% end
+
+
+temp = num2cell(zeros(K,4));
+temp_columns = zeros(K,4);
+for k=1:K
+ % separate the keep_in data into training and test data according
+ % to the chosen test percentage tp
+ [test_X, train_X, test_Y, train_Y] = dp_partition_holdout(hp, X, Y);
+ temp(k,:) = {test_X, train_X, test_Y, train_Y};
+ temp_columns(k,:) = [size(test_X,2), size(train_X,2), size(test_Y,2), size(train_Y,2)];
+end
+
+train_test_matrix = temp;
+train_test_matrix_names = {'holdout_X' 'keepin_X' 'holdout_Y' 'keepin_Y'};
+
+for i=1:size(temp,1)
+ for ii=1:size(temp,2)
+ M = temp{i,ii};
+ dlmwrite([output_folder train_test_matrix_names{ii} '_split_' num2str(i) '.txt'],M,'delimiter','\t');
+ C = temp_columns(i,ii);
+ dlmwrite([output_folder 'columns_' train_test_matrix_names{ii} '_split_' num2str(i) '.txt'],C);
+ end
+end
+
+end
diff --git a/Visualization_Module/dp_txt_write.m b/Visualization_Module/dp_txt_write.m
new file mode 100644
index 0000000..036c760
--- /dev/null
+++ b/Visualization_Module/dp_txt_write.m
@@ -0,0 +1,8 @@
+%% DP script for writing data to txt files
+function dp_txt_write(folder, name, data, format)
+
+FID = fopen([folder '/' name '.txt'],'w');
+fprintf(FID, format, data);
+fclose(FID);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_txtscan.m b/Visualization_Module/dp_txtscan.m
new file mode 100644
index 0000000..06d6262
--- /dev/null
+++ b/Visualization_Module/dp_txtscan.m
@@ -0,0 +1,9 @@
+%% script for scanning txt files
+
+function [output_file] = dp_txtscan(filepath, filetype)
+
+fileID_temp = fopen(filepath);
+output_file = fscanf(fileID_temp, filetype);
+fclose(fileID_temp);
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/dp_write_images.m b/Visualization_Module/dp_write_images.m
new file mode 100644
index 0000000..591294e
--- /dev/null
+++ b/Visualization_Module/dp_write_images.m
@@ -0,0 +1,41 @@
+%% script for writing images
+MaskPath = '/volume/HCStress/Data/MRI/HC_215_average_optthr.nii';
+Mask = spm_vol(MaskPath);
+MaskData = spm_read_vols(Mask);
+
+GMaskPath = '/opt/GeneralTools/BrainTemplates/Masks/abs_g_pronia_calib_study_MRI_sMRI_vbm8_mwrp1_2016-10-04_03-23-29.nii';
+GMask = spm_vol(GMaskPath);
+Mask = spm_vol(GMask);
+mask_normal = spm_read_vols(Mask);
+% new_mask_normal = mask_normal.*0;
+Mask75 = MaskData(MaskData >= prctile(MaskData(MaskData ~= 0),75))';
+MaskData_gmask = spm_read_vols(Mask75);
+
+for i=1:size(final_parameters,1)
+NewImg = MaskData_gmask.*0;
+NewImg(MaskData_gmask>0) = final_parameters{i,4};
+Mask.fname = ['/volume/HCStress/Analysis/09-Jun-2018/DP_CISS_HC_BO_5k_sets_FDR_75_gmask_2/LV',num2str(i),'.nii'];
+Mask.dt = [4,0];
+spm_write_vol(Mask,NewImg);
+end
+
+
+for i=1:size(final_parameters,1)
+NewImg = MaskData.*0;
+NewImg(MaskData>=1) = final_parameters{i,4};
+Mask.fname = ['/volume/HCStress/Analysis/09-Jun-2018/DP_CISS_HC_BO_5k_sets_FDR/LV',num2str(i),'.nii'];
+Mask.dt = [4,0];
+spm_write_vol(Mask,NewImg);
+end
+
+info_brains = nan(size(final_parameters,1),8);
+for i=1:size(final_parameters,1)
+ info_brains(i,1) = min(final_parameters{i,4}(final_parameters{i,4}<0));
+ info_brains(i,2) = max(final_parameters{i,4}(final_parameters{i,4}<0));
+ info_brains(i,3) = sum(final_parameters{i,4}<0);
+ info_brains(i,4) = mean(final_parameters{i,4}(final_parameters{i,4}<0));
+ info_brains(i,5) = min(final_parameters{i,4}(final_parameters{i,4}>=0));
+ info_brains(i,6) = max(final_parameters{i,4}(final_parameters{i,4}>=0));
+ info_brains(i,7) = sum(final_parameters{i,4}>=0);
+ info_brains(i,8) = mean(final_parameters{i,4}(final_parameters{i,4}>=0));
+end
\ No newline at end of file
diff --git a/Visualization_Module/jobs_comp.mat b/Visualization_Module/jobs_comp.mat
new file mode 100644
index 0000000..db3f620
Binary files /dev/null and b/Visualization_Module/jobs_comp.mat differ
diff --git a/Visualization_Module/license.txt b/Visualization_Module/license.txt
new file mode 100644
index 0000000..943e14a
--- /dev/null
+++ b/Visualization_Module/license.txt
@@ -0,0 +1,24 @@
+Copyright (c) 2011, Li Cheng
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the distribution
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/Visualization_Module/loop_file.txt b/Visualization_Module/loop_file.txt
new file mode 100644
index 0000000..f876233
--- /dev/null
+++ b/Visualization_Module/loop_file.txt
@@ -0,0 +1,1600 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
diff --git a/Visualization_Module/mccExcludedFiles.log b/Visualization_Module/mccExcludedFiles.log
new file mode 100644
index 0000000..75e4aab
--- /dev/null
+++ b/Visualization_Module/mccExcludedFiles.log
@@ -0,0 +1,6 @@
+The List of Excluded Files
+Excluded files Exclusion Message ID Reason For Exclusion Exclusion Rule
+/opt/matlab/R2015a/toolbox/local/+matlab/+internal/+toolboxes/addInstalledToolboxesToPath.m MATLAB:Completion:ExcludedBy Cannot be packaged for use in the target environment MCR. Removed from the parts list by license Compiler. /opt/matlab/R2015a/toolbox/local/[+]matlab/[+]internal/[+]toolboxes/addInstalledToolboxesToPath[.]m
+/opt/matlab/R2015a/toolbox/local/+matlab/+internal/+zipAddOns/addInstalledZipAddOnsToPath.m MATLAB:Completion:ExcludedBy Cannot be packaged for use in the target environment MCR. Removed from the parts list by license Compiler. /opt/matlab/R2015a/toolbox/local/[+]matlab/[+]internal/[+]zipAddOns/addInstalledZipAddOnsToPath[.]m
+/opt/matlab/R2015a/toolbox/local/pathdef.m MATLAB:Completion:ExcludedBy Cannot be packaged for use in the target environment MCR. Removed from the parts list by license Compiler. /opt/matlab/R2015a/toolbox/local/pathdef[.]m
+/opt/matlab/R2015a/toolbox/matlab/codetools/initdesktoputils.m MATLAB:Completion:ExcludedBy Cannot be packaged for use in the target environment MCR. Removed from the parts list by license Compiler. /opt/matlab/R2015a/toolbox/matlab/codetools
diff --git a/Visualization_Module/new_bash.m b/Visualization_Module/new_bash.m
new file mode 100644
index 0000000..ab7ae7d
--- /dev/null
+++ b/Visualization_Module/new_bash.m
@@ -0,0 +1,7 @@
+#!/bin/sh
+# Tell the SGE that this is an array job, with "tasks" to be numbered 1 to 10000
+#$ -t 1-10000
+# When a single command in the array job is sent to a compute node,
+# its task number is stored in the variable SGE_TASK_ID,
+# so we can use the value of that variable to get the results we want:
+~/programs/program -i ~/data/input.$SGE_TASK_ID -o ~/results/output.$SGE_TASK_ID
\ No newline at end of file
diff --git a/Visualization_Module/new_bash.sh b/Visualization_Module/new_bash.sh
new file mode 100644
index 0000000..1904c9b
--- /dev/null
+++ b/Visualization_Module/new_bash.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+# Tell the SGE that this is an array job, with "tasks" to be numbered 1 to 10000
+#$ -t 1-10
+#$ -tc 40
+# When a single command in the array job is sent to a compute node,
+# its task number is stored in the variable SGE_TASK_ID,
+# so we can use the value of that variable to get the results we want:
+#$ -i /volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/loop_file.$SGE_TASK_ID
+#$ -o /volume/DP_FEF/Analysis/16-April-2018/output.$SGE_TASK_ID
+
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/Hyperparameter_optimization/dp_RHO_avg_k_AR_DP/for_testing/dp_RHO_avg_k_AR_DP
diff --git a/Visualization_Module/permutations.txt b/Visualization_Module/permutations.txt
new file mode 100644
index 0000000..9812045
--- /dev/null
+++ b/Visualization_Module/permutations.txt
@@ -0,0 +1,10000 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
+5566
+5567
+5568
+5569
+5570
+5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
+5591
+5592
+5593
+5594
+5595
+5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
+5617
+5618
+5619
+5620
+5621
+5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
+5642
+5643
+5644
+5645
+5646
+5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
+5672
+5673
+5674
+5675
+5676
+5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
+5708
+5709
+5710
+5711
+5712
+5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
+5737
+5738
+5739
+5740
+5741
+5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
+5767
+5768
+5769
+5770
+5771
+5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
+5798
+5799
+5800
+5801
+5802
+5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
+5832
+5833
+5834
+5835
+5836
+5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
+5874
+5875
+5876
+5877
+5878
+5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
+5904
+5905
+5906
+5907
+5908
+5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
+5933
+5934
+5935
+5936
+5937
+5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
+5957
+5958
+5959
+5960
+5961
+5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
+5987
+5988
+5989
+5990
+5991
+5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
+6017
+6018
+6019
+6020
+6021
+6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
+6046
+6047
+6048
+6049
+6050
+6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
+6069
+6070
+6071
+6072
+6073
+6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
+6099
+6100
+6101
+6102
+6103
+6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
+6116
+6117
+6118
+6119
+6120
+6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
+6139
+6140
+6141
+6142
+6143
+6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
+6161
+6162
+6163
+6164
+6165
+6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
+6191
+6192
+6193
+6194
+6195
+6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
+6213
+6214
+6215
+6216
+6217
+6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
+6243
+6244
+6245
+6246
+6247
+6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
+6287
+6288
+6289
+6290
+6291
+6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
+6316
+6317
+6318
+6319
+6320
+6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
+6351
+6352
+6353
+6354
+6355
+6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
+6379
+6380
+6381
+6382
+6383
+6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
+6413
+6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
+6440
+6441
+6442
+6443
+6444
+6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
+6475
+6476
+6477
+6478
+6479
+6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
+6500
+6501
+6502
+6503
+6504
+6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
+6531
+6532
+6533
+6534
+6535
+6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
+6562
+6563
+6564
+6565
+6566
+6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
+6593
+6594
+6595
+6596
+6597
+6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
+6624
+6625
+6626
+6627
+6628
+6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
+6655
+6656
+6657
+6658
+6659
+6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
+6686
+6687
+6688
+6689
+6690
+6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
+6717
+6718
+6719
+6720
+6721
+6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
+6748
+6749
+6750
+6751
+6752
+6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
+6773
+6774
+6775
+6776
+6777
+6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
+6799
+6800
+6801
+6802
+6803
+6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
+6830
+6831
+6832
+6833
+6834
+6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
+6860
+6861
+6862
+6863
+6864
+6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
+6883
+6884
+6885
+6886
+6887
+6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
+6908
+6909
+6910
+6911
+6912
+6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
+6934
+6935
+6936
+6937
+6938
+6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
+6959
+6960
+6961
+6962
+6963
+6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
+6989
+6990
+6991
+6992
+6993
+6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+7009
+7010
+7011
+7012
+7013
+7014
+7015
+7016
+7017
+7018
+7019
+7020
+7021
+7022
+7023
+7024
+7025
+7026
+7027
+7028
+7029
+7030
+7031
+7032
+7033
+7034
+7035
+7036
+7037
+7038
+7039
+7040
+7041
+7042
+7043
+7044
+7045
+7046
+7047
+7048
+7049
+7050
+7051
+7052
+7053
+7054
+7055
+7056
+7057
+7058
+7059
+7060
+7061
+7062
+7063
+7064
+7065
+7066
+7067
+7068
+7069
+7070
+7071
+7072
+7073
+7074
+7075
+7076
+7077
+7078
+7079
+7080
+7081
+7082
+7083
+7084
+7085
+7086
+7087
+7088
+7089
+7090
+7091
+7092
+7093
+7094
+7095
+7096
+7097
+7098
+7099
+7100
+7101
+7102
+7103
+7104
+7105
+7106
+7107
+7108
+7109
+7110
+7111
+7112
+7113
+7114
+7115
+7116
+7117
+7118
+7119
+7120
+7121
+7122
+7123
+7124
+7125
+7126
+7127
+7128
+7129
+7130
+7131
+7132
+7133
+7134
+7135
+7136
+7137
+7138
+7139
+7140
+7141
+7142
+7143
+7144
+7145
+7146
+7147
+7148
+7149
+7150
+7151
+7152
+7153
+7154
+7155
+7156
+7157
+7158
+7159
+7160
+7161
+7162
+7163
+7164
+7165
+7166
+7167
+7168
+7169
+7170
+7171
+7172
+7173
+7174
+7175
+7176
+7177
+7178
+7179
+7180
+7181
+7182
+7183
+7184
+7185
+7186
+7187
+7188
+7189
+7190
+7191
+7192
+7193
+7194
+7195
+7196
+7197
+7198
+7199
+7200
+7201
+7202
+7203
+7204
+7205
+7206
+7207
+7208
+7209
+7210
+7211
+7212
+7213
+7214
+7215
+7216
+7217
+7218
+7219
+7220
+7221
+7222
+7223
+7224
+7225
+7226
+7227
+7228
+7229
+7230
+7231
+7232
+7233
+7234
+7235
+7236
+7237
+7238
+7239
+7240
+7241
+7242
+7243
+7244
+7245
+7246
+7247
+7248
+7249
+7250
+7251
+7252
+7253
+7254
+7255
+7256
+7257
+7258
+7259
+7260
+7261
+7262
+7263
+7264
+7265
+7266
+7267
+7268
+7269
+7270
+7271
+7272
+7273
+7274
+7275
+7276
+7277
+7278
+7279
+7280
+7281
+7282
+7283
+7284
+7285
+7286
+7287
+7288
+7289
+7290
+7291
+7292
+7293
+7294
+7295
+7296
+7297
+7298
+7299
+7300
+7301
+7302
+7303
+7304
+7305
+7306
+7307
+7308
+7309
+7310
+7311
+7312
+7313
+7314
+7315
+7316
+7317
+7318
+7319
+7320
+7321
+7322
+7323
+7324
+7325
+7326
+7327
+7328
+7329
+7330
+7331
+7332
+7333
+7334
+7335
+7336
+7337
+7338
+7339
+7340
+7341
+7342
+7343
+7344
+7345
+7346
+7347
+7348
+7349
+7350
+7351
+7352
+7353
+7354
+7355
+7356
+7357
+7358
+7359
+7360
+7361
+7362
+7363
+7364
+7365
+7366
+7367
+7368
+7369
+7370
+7371
+7372
+7373
+7374
+7375
+7376
+7377
+7378
+7379
+7380
+7381
+7382
+7383
+7384
+7385
+7386
+7387
+7388
+7389
+7390
+7391
+7392
+7393
+7394
+7395
+7396
+7397
+7398
+7399
+7400
+7401
+7402
+7403
+7404
+7405
+7406
+7407
+7408
+7409
+7410
+7411
+7412
+7413
+7414
+7415
+7416
+7417
+7418
+7419
+7420
+7421
+7422
+7423
+7424
+7425
+7426
+7427
+7428
+7429
+7430
+7431
+7432
+7433
+7434
+7435
+7436
+7437
+7438
+7439
+7440
+7441
+7442
+7443
+7444
+7445
+7446
+7447
+7448
+7449
+7450
+7451
+7452
+7453
+7454
+7455
+7456
+7457
+7458
+7459
+7460
+7461
+7462
+7463
+7464
+7465
+7466
+7467
+7468
+7469
+7470
+7471
+7472
+7473
+7474
+7475
+7476
+7477
+7478
+7479
+7480
+7481
+7482
+7483
+7484
+7485
+7486
+7487
+7488
+7489
+7490
+7491
+7492
+7493
+7494
+7495
+7496
+7497
+7498
+7499
+7500
+7501
+7502
+7503
+7504
+7505
+7506
+7507
+7508
+7509
+7510
+7511
+7512
+7513
+7514
+7515
+7516
+7517
+7518
+7519
+7520
+7521
+7522
+7523
+7524
+7525
+7526
+7527
+7528
+7529
+7530
+7531
+7532
+7533
+7534
+7535
+7536
+7537
+7538
+7539
+7540
+7541
+7542
+7543
+7544
+7545
+7546
+7547
+7548
+7549
+7550
+7551
+7552
+7553
+7554
+7555
+7556
+7557
+7558
+7559
+7560
+7561
+7562
+7563
+7564
+7565
+7566
+7567
+7568
+7569
+7570
+7571
+7572
+7573
+7574
+7575
+7576
+7577
+7578
+7579
+7580
+7581
+7582
+7583
+7584
+7585
+7586
+7587
+7588
+7589
+7590
+7591
+7592
+7593
+7594
+7595
+7596
+7597
+7598
+7599
+7600
+7601
+7602
+7603
+7604
+7605
+7606
+7607
+7608
+7609
+7610
+7611
+7612
+7613
+7614
+7615
+7616
+7617
+7618
+7619
+7620
+7621
+7622
+7623
+7624
+7625
+7626
+7627
+7628
+7629
+7630
+7631
+7632
+7633
+7634
+7635
+7636
+7637
+7638
+7639
+7640
+7641
+7642
+7643
+7644
+7645
+7646
+7647
+7648
+7649
+7650
+7651
+7652
+7653
+7654
+7655
+7656
+7657
+7658
+7659
+7660
+7661
+7662
+7663
+7664
+7665
+7666
+7667
+7668
+7669
+7670
+7671
+7672
+7673
+7674
+7675
+7676
+7677
+7678
+7679
+7680
+7681
+7682
+7683
+7684
+7685
+7686
+7687
+7688
+7689
+7690
+7691
+7692
+7693
+7694
+7695
+7696
+7697
+7698
+7699
+7700
+7701
+7702
+7703
+7704
+7705
+7706
+7707
+7708
+7709
+7710
+7711
+7712
+7713
+7714
+7715
+7716
+7717
+7718
+7719
+7720
+7721
+7722
+7723
+7724
+7725
+7726
+7727
+7728
+7729
+7730
+7731
+7732
+7733
+7734
+7735
+7736
+7737
+7738
+7739
+7740
+7741
+7742
+7743
+7744
+7745
+7746
+7747
+7748
+7749
+7750
+7751
+7752
+7753
+7754
+7755
+7756
+7757
+7758
+7759
+7760
+7761
+7762
+7763
+7764
+7765
+7766
+7767
+7768
+7769
+7770
+7771
+7772
+7773
+7774
+7775
+7776
+7777
+7778
+7779
+7780
+7781
+7782
+7783
+7784
+7785
+7786
+7787
+7788
+7789
+7790
+7791
+7792
+7793
+7794
+7795
+7796
+7797
+7798
+7799
+7800
+7801
+7802
+7803
+7804
+7805
+7806
+7807
+7808
+7809
+7810
+7811
+7812
+7813
+7814
+7815
+7816
+7817
+7818
+7819
+7820
+7821
+7822
+7823
+7824
+7825
+7826
+7827
+7828
+7829
+7830
+7831
+7832
+7833
+7834
+7835
+7836
+7837
+7838
+7839
+7840
+7841
+7842
+7843
+7844
+7845
+7846
+7847
+7848
+7849
+7850
+7851
+7852
+7853
+7854
+7855
+7856
+7857
+7858
+7859
+7860
+7861
+7862
+7863
+7864
+7865
+7866
+7867
+7868
+7869
+7870
+7871
+7872
+7873
+7874
+7875
+7876
+7877
+7878
+7879
+7880
+7881
+7882
+7883
+7884
+7885
+7886
+7887
+7888
+7889
+7890
+7891
+7892
+7893
+7894
+7895
+7896
+7897
+7898
+7899
+7900
+7901
+7902
+7903
+7904
+7905
+7906
+7907
+7908
+7909
+7910
+7911
+7912
+7913
+7914
+7915
+7916
+7917
+7918
+7919
+7920
+7921
+7922
+7923
+7924
+7925
+7926
+7927
+7928
+7929
+7930
+7931
+7932
+7933
+7934
+7935
+7936
+7937
+7938
+7939
+7940
+7941
+7942
+7943
+7944
+7945
+7946
+7947
+7948
+7949
+7950
+7951
+7952
+7953
+7954
+7955
+7956
+7957
+7958
+7959
+7960
+7961
+7962
+7963
+7964
+7965
+7966
+7967
+7968
+7969
+7970
+7971
+7972
+7973
+7974
+7975
+7976
+7977
+7978
+7979
+7980
+7981
+7982
+7983
+7984
+7985
+7986
+7987
+7988
+7989
+7990
+7991
+7992
+7993
+7994
+7995
+7996
+7997
+7998
+7999
+8000
+8001
+8002
+8003
+8004
+8005
+8006
+8007
+8008
+8009
+8010
+8011
+8012
+8013
+8014
+8015
+8016
+8017
+8018
+8019
+8020
+8021
+8022
+8023
+8024
+8025
+8026
+8027
+8028
+8029
+8030
+8031
+8032
+8033
+8034
+8035
+8036
+8037
+8038
+8039
+8040
+8041
+8042
+8043
+8044
+8045
+8046
+8047
+8048
+8049
+8050
+8051
+8052
+8053
+8054
+8055
+8056
+8057
+8058
+8059
+8060
+8061
+8062
+8063
+8064
+8065
+8066
+8067
+8068
+8069
+8070
+8071
+8072
+8073
+8074
+8075
+8076
+8077
+8078
+8079
+8080
+8081
+8082
+8083
+8084
+8085
+8086
+8087
+8088
+8089
+8090
+8091
+8092
+8093
+8094
+8095
+8096
+8097
+8098
+8099
+8100
+8101
+8102
+8103
+8104
+8105
+8106
+8107
+8108
+8109
+8110
+8111
+8112
+8113
+8114
+8115
+8116
+8117
+8118
+8119
+8120
+8121
+8122
+8123
+8124
+8125
+8126
+8127
+8128
+8129
+8130
+8131
+8132
+8133
+8134
+8135
+8136
+8137
+8138
+8139
+8140
+8141
+8142
+8143
+8144
+8145
+8146
+8147
+8148
+8149
+8150
+8151
+8152
+8153
+8154
+8155
+8156
+8157
+8158
+8159
+8160
+8161
+8162
+8163
+8164
+8165
+8166
+8167
+8168
+8169
+8170
+8171
+8172
+8173
+8174
+8175
+8176
+8177
+8178
+8179
+8180
+8181
+8182
+8183
+8184
+8185
+8186
+8187
+8188
+8189
+8190
+8191
+8192
+8193
+8194
+8195
+8196
+8197
+8198
+8199
+8200
+8201
+8202
+8203
+8204
+8205
+8206
+8207
+8208
+8209
+8210
+8211
+8212
+8213
+8214
+8215
+8216
+8217
+8218
+8219
+8220
+8221
+8222
+8223
+8224
+8225
+8226
+8227
+8228
+8229
+8230
+8231
+8232
+8233
+8234
+8235
+8236
+8237
+8238
+8239
+8240
+8241
+8242
+8243
+8244
+8245
+8246
+8247
+8248
+8249
+8250
+8251
+8252
+8253
+8254
+8255
+8256
+8257
+8258
+8259
+8260
+8261
+8262
+8263
+8264
+8265
+8266
+8267
+8268
+8269
+8270
+8271
+8272
+8273
+8274
+8275
+8276
+8277
+8278
+8279
+8280
+8281
+8282
+8283
+8284
+8285
+8286
+8287
+8288
+8289
+8290
+8291
+8292
+8293
+8294
+8295
+8296
+8297
+8298
+8299
+8300
+8301
+8302
+8303
+8304
+8305
+8306
+8307
+8308
+8309
+8310
+8311
+8312
+8313
+8314
+8315
+8316
+8317
+8318
+8319
+8320
+8321
+8322
+8323
+8324
+8325
+8326
+8327
+8328
+8329
+8330
+8331
+8332
+8333
+8334
+8335
+8336
+8337
+8338
+8339
+8340
+8341
+8342
+8343
+8344
+8345
+8346
+8347
+8348
+8349
+8350
+8351
+8352
+8353
+8354
+8355
+8356
+8357
+8358
+8359
+8360
+8361
+8362
+8363
+8364
+8365
+8366
+8367
+8368
+8369
+8370
+8371
+8372
+8373
+8374
+8375
+8376
+8377
+8378
+8379
+8380
+8381
+8382
+8383
+8384
+8385
+8386
+8387
+8388
+8389
+8390
+8391
+8392
+8393
+8394
+8395
+8396
+8397
+8398
+8399
+8400
+8401
+8402
+8403
+8404
+8405
+8406
+8407
+8408
+8409
+8410
+8411
+8412
+8413
+8414
+8415
+8416
+8417
+8418
+8419
+8420
+8421
+8422
+8423
+8424
+8425
+8426
+8427
+8428
+8429
+8430
+8431
+8432
+8433
+8434
+8435
+8436
+8437
+8438
+8439
+8440
+8441
+8442
+8443
+8444
+8445
+8446
+8447
+8448
+8449
+8450
+8451
+8452
+8453
+8454
+8455
+8456
+8457
+8458
+8459
+8460
+8461
+8462
+8463
+8464
+8465
+8466
+8467
+8468
+8469
+8470
+8471
+8472
+8473
+8474
+8475
+8476
+8477
+8478
+8479
+8480
+8481
+8482
+8483
+8484
+8485
+8486
+8487
+8488
+8489
+8490
+8491
+8492
+8493
+8494
+8495
+8496
+8497
+8498
+8499
+8500
+8501
+8502
+8503
+8504
+8505
+8506
+8507
+8508
+8509
+8510
+8511
+8512
+8513
+8514
+8515
+8516
+8517
+8518
+8519
+8520
+8521
+8522
+8523
+8524
+8525
+8526
+8527
+8528
+8529
+8530
+8531
+8532
+8533
+8534
+8535
+8536
+8537
+8538
+8539
+8540
+8541
+8542
+8543
+8544
+8545
+8546
+8547
+8548
+8549
+8550
+8551
+8552
+8553
+8554
+8555
+8556
+8557
+8558
+8559
+8560
+8561
+8562
+8563
+8564
+8565
+8566
+8567
+8568
+8569
+8570
+8571
+8572
+8573
+8574
+8575
+8576
+8577
+8578
+8579
+8580
+8581
+8582
+8583
+8584
+8585
+8586
+8587
+8588
+8589
+8590
+8591
+8592
+8593
+8594
+8595
+8596
+8597
+8598
+8599
+8600
+8601
+8602
+8603
+8604
+8605
+8606
+8607
+8608
+8609
+8610
+8611
+8612
+8613
+8614
+8615
+8616
+8617
+8618
+8619
+8620
+8621
+8622
+8623
+8624
+8625
+8626
+8627
+8628
+8629
+8630
+8631
+8632
+8633
+8634
+8635
+8636
+8637
+8638
+8639
+8640
+8641
+8642
+8643
+8644
+8645
+8646
+8647
+8648
+8649
+8650
+8651
+8652
+8653
+8654
+8655
+8656
+8657
+8658
+8659
+8660
+8661
+8662
+8663
+8664
+8665
+8666
+8667
+8668
+8669
+8670
+8671
+8672
+8673
+8674
+8675
+8676
+8677
+8678
+8679
+8680
+8681
+8682
+8683
+8684
+8685
+8686
+8687
+8688
+8689
+8690
+8691
+8692
+8693
+8694
+8695
+8696
+8697
+8698
+8699
+8700
+8701
+8702
+8703
+8704
+8705
+8706
+8707
+8708
+8709
+8710
+8711
+8712
+8713
+8714
+8715
+8716
+8717
+8718
+8719
+8720
+8721
+8722
+8723
+8724
+8725
+8726
+8727
+8728
+8729
+8730
+8731
+8732
+8733
+8734
+8735
+8736
+8737
+8738
+8739
+8740
+8741
+8742
+8743
+8744
+8745
+8746
+8747
+8748
+8749
+8750
+8751
+8752
+8753
+8754
+8755
+8756
+8757
+8758
+8759
+8760
+8761
+8762
+8763
+8764
+8765
+8766
+8767
+8768
+8769
+8770
+8771
+8772
+8773
+8774
+8775
+8776
+8777
+8778
+8779
+8780
+8781
+8782
+8783
+8784
+8785
+8786
+8787
+8788
+8789
+8790
+8791
+8792
+8793
+8794
+8795
+8796
+8797
+8798
+8799
+8800
+8801
+8802
+8803
+8804
+8805
+8806
+8807
+8808
+8809
+8810
+8811
+8812
+8813
+8814
+8815
+8816
+8817
+8818
+8819
+8820
+8821
+8822
+8823
+8824
+8825
+8826
+8827
+8828
+8829
+8830
+8831
+8832
+8833
+8834
+8835
+8836
+8837
+8838
+8839
+8840
+8841
+8842
+8843
+8844
+8845
+8846
+8847
+8848
+8849
+8850
+8851
+8852
+8853
+8854
+8855
+8856
+8857
+8858
+8859
+8860
+8861
+8862
+8863
+8864
+8865
+8866
+8867
+8868
+8869
+8870
+8871
+8872
+8873
+8874
+8875
+8876
+8877
+8878
+8879
+8880
+8881
+8882
+8883
+8884
+8885
+8886
+8887
+8888
+8889
+8890
+8891
+8892
+8893
+8894
+8895
+8896
+8897
+8898
+8899
+8900
+8901
+8902
+8903
+8904
+8905
+8906
+8907
+8908
+8909
+8910
+8911
+8912
+8913
+8914
+8915
+8916
+8917
+8918
+8919
+8920
+8921
+8922
+8923
+8924
+8925
+8926
+8927
+8928
+8929
+8930
+8931
+8932
+8933
+8934
+8935
+8936
+8937
+8938
+8939
+8940
+8941
+8942
+8943
+8944
+8945
+8946
+8947
+8948
+8949
+8950
+8951
+8952
+8953
+8954
+8955
+8956
+8957
+8958
+8959
+8960
+8961
+8962
+8963
+8964
+8965
+8966
+8967
+8968
+8969
+8970
+8971
+8972
+8973
+8974
+8975
+8976
+8977
+8978
+8979
+8980
+8981
+8982
+8983
+8984
+8985
+8986
+8987
+8988
+8989
+8990
+8991
+8992
+8993
+8994
+8995
+8996
+8997
+8998
+8999
+9000
+9001
+9002
+9003
+9004
+9005
+9006
+9007
+9008
+9009
+9010
+9011
+9012
+9013
+9014
+9015
+9016
+9017
+9018
+9019
+9020
+9021
+9022
+9023
+9024
+9025
+9026
+9027
+9028
+9029
+9030
+9031
+9032
+9033
+9034
+9035
+9036
+9037
+9038
+9039
+9040
+9041
+9042
+9043
+9044
+9045
+9046
+9047
+9048
+9049
+9050
+9051
+9052
+9053
+9054
+9055
+9056
+9057
+9058
+9059
+9060
+9061
+9062
+9063
+9064
+9065
+9066
+9067
+9068
+9069
+9070
+9071
+9072
+9073
+9074
+9075
+9076
+9077
+9078
+9079
+9080
+9081
+9082
+9083
+9084
+9085
+9086
+9087
+9088
+9089
+9090
+9091
+9092
+9093
+9094
+9095
+9096
+9097
+9098
+9099
+9100
+9101
+9102
+9103
+9104
+9105
+9106
+9107
+9108
+9109
+9110
+9111
+9112
+9113
+9114
+9115
+9116
+9117
+9118
+9119
+9120
+9121
+9122
+9123
+9124
+9125
+9126
+9127
+9128
+9129
+9130
+9131
+9132
+9133
+9134
+9135
+9136
+9137
+9138
+9139
+9140
+9141
+9142
+9143
+9144
+9145
+9146
+9147
+9148
+9149
+9150
+9151
+9152
+9153
+9154
+9155
+9156
+9157
+9158
+9159
+9160
+9161
+9162
+9163
+9164
+9165
+9166
+9167
+9168
+9169
+9170
+9171
+9172
+9173
+9174
+9175
+9176
+9177
+9178
+9179
+9180
+9181
+9182
+9183
+9184
+9185
+9186
+9187
+9188
+9189
+9190
+9191
+9192
+9193
+9194
+9195
+9196
+9197
+9198
+9199
+9200
+9201
+9202
+9203
+9204
+9205
+9206
+9207
+9208
+9209
+9210
+9211
+9212
+9213
+9214
+9215
+9216
+9217
+9218
+9219
+9220
+9221
+9222
+9223
+9224
+9225
+9226
+9227
+9228
+9229
+9230
+9231
+9232
+9233
+9234
+9235
+9236
+9237
+9238
+9239
+9240
+9241
+9242
+9243
+9244
+9245
+9246
+9247
+9248
+9249
+9250
+9251
+9252
+9253
+9254
+9255
+9256
+9257
+9258
+9259
+9260
+9261
+9262
+9263
+9264
+9265
+9266
+9267
+9268
+9269
+9270
+9271
+9272
+9273
+9274
+9275
+9276
+9277
+9278
+9279
+9280
+9281
+9282
+9283
+9284
+9285
+9286
+9287
+9288
+9289
+9290
+9291
+9292
+9293
+9294
+9295
+9296
+9297
+9298
+9299
+9300
+9301
+9302
+9303
+9304
+9305
+9306
+9307
+9308
+9309
+9310
+9311
+9312
+9313
+9314
+9315
+9316
+9317
+9318
+9319
+9320
+9321
+9322
+9323
+9324
+9325
+9326
+9327
+9328
+9329
+9330
+9331
+9332
+9333
+9334
+9335
+9336
+9337
+9338
+9339
+9340
+9341
+9342
+9343
+9344
+9345
+9346
+9347
+9348
+9349
+9350
+9351
+9352
+9353
+9354
+9355
+9356
+9357
+9358
+9359
+9360
+9361
+9362
+9363
+9364
+9365
+9366
+9367
+9368
+9369
+9370
+9371
+9372
+9373
+9374
+9375
+9376
+9377
+9378
+9379
+9380
+9381
+9382
+9383
+9384
+9385
+9386
+9387
+9388
+9389
+9390
+9391
+9392
+9393
+9394
+9395
+9396
+9397
+9398
+9399
+9400
+9401
+9402
+9403
+9404
+9405
+9406
+9407
+9408
+9409
+9410
+9411
+9412
+9413
+9414
+9415
+9416
+9417
+9418
+9419
+9420
+9421
+9422
+9423
+9424
+9425
+9426
+9427
+9428
+9429
+9430
+9431
+9432
+9433
+9434
+9435
+9436
+9437
+9438
+9439
+9440
+9441
+9442
+9443
+9444
+9445
+9446
+9447
+9448
+9449
+9450
+9451
+9452
+9453
+9454
+9455
+9456
+9457
+9458
+9459
+9460
+9461
+9462
+9463
+9464
+9465
+9466
+9467
+9468
+9469
+9470
+9471
+9472
+9473
+9474
+9475
+9476
+9477
+9478
+9479
+9480
+9481
+9482
+9483
+9484
+9485
+9486
+9487
+9488
+9489
+9490
+9491
+9492
+9493
+9494
+9495
+9496
+9497
+9498
+9499
+9500
+9501
+9502
+9503
+9504
+9505
+9506
+9507
+9508
+9509
+9510
+9511
+9512
+9513
+9514
+9515
+9516
+9517
+9518
+9519
+9520
+9521
+9522
+9523
+9524
+9525
+9526
+9527
+9528
+9529
+9530
+9531
+9532
+9533
+9534
+9535
+9536
+9537
+9538
+9539
+9540
+9541
+9542
+9543
+9544
+9545
+9546
+9547
+9548
+9549
+9550
+9551
+9552
+9553
+9554
+9555
+9556
+9557
+9558
+9559
+9560
+9561
+9562
+9563
+9564
+9565
+9566
+9567
+9568
+9569
+9570
+9571
+9572
+9573
+9574
+9575
+9576
+9577
+9578
+9579
+9580
+9581
+9582
+9583
+9584
+9585
+9586
+9587
+9588
+9589
+9590
+9591
+9592
+9593
+9594
+9595
+9596
+9597
+9598
+9599
+9600
+9601
+9602
+9603
+9604
+9605
+9606
+9607
+9608
+9609
+9610
+9611
+9612
+9613
+9614
+9615
+9616
+9617
+9618
+9619
+9620
+9621
+9622
+9623
+9624
+9625
+9626
+9627
+9628
+9629
+9630
+9631
+9632
+9633
+9634
+9635
+9636
+9637
+9638
+9639
+9640
+9641
+9642
+9643
+9644
+9645
+9646
+9647
+9648
+9649
+9650
+9651
+9652
+9653
+9654
+9655
+9656
+9657
+9658
+9659
+9660
+9661
+9662
+9663
+9664
+9665
+9666
+9667
+9668
+9669
+9670
+9671
+9672
+9673
+9674
+9675
+9676
+9677
+9678
+9679
+9680
+9681
+9682
+9683
+9684
+9685
+9686
+9687
+9688
+9689
+9690
+9691
+9692
+9693
+9694
+9695
+9696
+9697
+9698
+9699
+9700
+9701
+9702
+9703
+9704
+9705
+9706
+9707
+9708
+9709
+9710
+9711
+9712
+9713
+9714
+9715
+9716
+9717
+9718
+9719
+9720
+9721
+9722
+9723
+9724
+9725
+9726
+9727
+9728
+9729
+9730
+9731
+9732
+9733
+9734
+9735
+9736
+9737
+9738
+9739
+9740
+9741
+9742
+9743
+9744
+9745
+9746
+9747
+9748
+9749
+9750
+9751
+9752
+9753
+9754
+9755
+9756
+9757
+9758
+9759
+9760
+9761
+9762
+9763
+9764
+9765
+9766
+9767
+9768
+9769
+9770
+9771
+9772
+9773
+9774
+9775
+9776
+9777
+9778
+9779
+9780
+9781
+9782
+9783
+9784
+9785
+9786
+9787
+9788
+9789
+9790
+9791
+9792
+9793
+9794
+9795
+9796
+9797
+9798
+9799
+9800
+9801
+9802
+9803
+9804
+9805
+9806
+9807
+9808
+9809
+9810
+9811
+9812
+9813
+9814
+9815
+9816
+9817
+9818
+9819
+9820
+9821
+9822
+9823
+9824
+9825
+9826
+9827
+9828
+9829
+9830
+9831
+9832
+9833
+9834
+9835
+9836
+9837
+9838
+9839
+9840
+9841
+9842
+9843
+9844
+9845
+9846
+9847
+9848
+9849
+9850
+9851
+9852
+9853
+9854
+9855
+9856
+9857
+9858
+9859
+9860
+9861
+9862
+9863
+9864
+9865
+9866
+9867
+9868
+9869
+9870
+9871
+9872
+9873
+9874
+9875
+9876
+9877
+9878
+9879
+9880
+9881
+9882
+9883
+9884
+9885
+9886
+9887
+9888
+9889
+9890
+9891
+9892
+9893
+9894
+9895
+9896
+9897
+9898
+9899
+9900
+9901
+9902
+9903
+9904
+9905
+9906
+9907
+9908
+9909
+9910
+9911
+9912
+9913
+9914
+9915
+9916
+9917
+9918
+9919
+9920
+9921
+9922
+9923
+9924
+9925
+9926
+9927
+9928
+9929
+9930
+9931
+9932
+9933
+9934
+9935
+9936
+9937
+9938
+9939
+9940
+9941
+9942
+9943
+9944
+9945
+9946
+9947
+9948
+9949
+9950
+9951
+9952
+9953
+9954
+9955
+9956
+9957
+9958
+9959
+9960
+9961
+9962
+9963
+9964
+9965
+9966
+9967
+9968
+9969
+9970
+9971
+9972
+9973
+9974
+9975
+9976
+9977
+9978
+9979
+9980
+9981
+9982
+9983
+9984
+9985
+9986
+9987
+9988
+9989
+9990
+9991
+9992
+9993
+9994
+9995
+9996
+9997
+9998
+9999
+10000
diff --git a/Visualization_Module/proj_def.m b/Visualization_Module/proj_def.m
new file mode 100644
index 0000000..04f02a2
--- /dev/null
+++ b/Visualization_Module/proj_def.m
@@ -0,0 +1,24 @@
+function [X,Y] = proj_def(X, Y, u, v)
+%
+% Perform projection deflation of matrices X and Y using u and v
+% Please check Monteiro et al. 2016 for details:
+% doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs: X, Y - data matrices in the form: samples x features.
+%
+% u, v - weight vectors for X and Y, respectively
+%
+%
+% Outputs: X, Y - deflated data matrices
+%
+%
+% Version: 2016-07-06
+%__________________________________________________________________________
+
+% Written by Joao Matos Monteiro
+% Email: joao.monteiro@ucl.ac.uk
+
+X = X - (X*u)*u';
+Y = Y - (Y*v)*v';
+
+end
\ No newline at end of file
diff --git a/Visualization_Module/radarplot.m b/Visualization_Module/radarplot.m
new file mode 100644
index 0000000..9d02a28
--- /dev/null
+++ b/Visualization_Module/radarplot.m
@@ -0,0 +1,130 @@
+function f=radarplot(R,Lable,LineColor,FillColor,LineStyle,LevelNum)
+%Creates a radar (spider) plot for multi-data series.
+%edit by Cheng Li
+%Tsinghua University
+
+%INPUT:
+%R
+% Data, if R is a m*n matrix, means m samples with n options
+
+%Label
+% Label, Label of options
+% Cells of string
+
+%LineColor
+% Color of Line
+% Cells of MatLab colors
+%
+%FillColor
+% Cells of MatLab colors
+%
+%LineStyle
+% Cells of MatLab colors
+%
+%LevelNum
+% number of axis's levels
+%
+%Example:
+%radarplot([1 2 3 4 5 6])
+%radarplot([1 2 3 4 5 6;7 8 9 10 11 12.5])
+%radarplot([1 2 3 4 5 6;7 8 9 10 11 12.5],{'option1','a','b','','c','d'})
+%radarplot([1 2 3 4 5 6;7 8 9 10 11 12.5],{'option1','','','','',''},{'r','g'})
+%radarplot([1 2 3 4 5 6;7 8 9 10 11 12.5],{'option1','','','','',''},{},{'b','r'})
+%radarplot([1 2 3 4 5 6;7 8 9 10 11 12.5],{'option1','','','','',''},{'r','g'})
+%radarplot([1 2 3 4 5 6;7 8 9 10 11 12.5],{'option1','','','','',''},{'r','g'},{'b','r'},{'no',':'}
+%radarplot([1 2 3 4 5 6;7 8 9 10 11 12.5],{'option1','a','b','c','','e'},{'r','g'},{'b','r'},{'no',':'},5)
+
+n=size(R,2);
+m=size(R,1);
+
+if nargin<6
+ LevelNum=4;
+end
+
+
+R=[R R(:,1)];
+
+[Theta,M]=meshgrid(2*pi/n*[0:n]+pi/n,ones(1,size(R,1)));
+
+X=R.*sin(Theta);
+Y=R.*cos(Theta);
+
+A=plot(X',Y','LineWidth',2);
+
+
+MAXAXIS=max(max(R))*1.1;
+axis([-MAXAXIS MAXAXIS -MAXAXIS MAXAXIS]);
+axis equal
+axis off
+
+
+if LevelNum>0
+ AxisR=linspace(0,max(max(R)),LevelNum);
+ for i=1:LevelNum
+ text(AxisR(i)*sin(pi/n-0.3),AxisR(i)*cos(pi/n-0.3),num2str(AxisR(i),2),'FontSize',10)
+ end
+ [M,AxisR]=meshgrid(ones(1,n),AxisR);
+ AxisR=[AxisR AxisR(:,1)];
+ [AxisTheta,M]=meshgrid(2*pi/n*[0:n]+pi/n,ones(1,size(AxisR,1)));
+ AxisX=AxisR.*sin(AxisTheta);
+ AxisY=AxisR.*cos(AxisTheta);
+ hold on
+ plot(AxisX,AxisY,':k')
+ plot(AxisX',AxisY',':k')
+end
+
+
+if nargin>1
+ if length(Lable)>=n
+ LableTheta=2*pi/n*[0:n-1]+pi/n;
+ LableR=MAXAXIS;
+ LableX=LableR.*sin(LableTheta);
+ LableY=LableR.*cos(LableTheta);
+ for i=1:n
+ if ~sum(strcmpi({'' },Lable(i)))
+ text(LableX(i), LableY(i),cell2mat(Lable(i)), 'FontSize',14,'HorizontalAlignment','center','Rotation',0)
+ end
+ end
+ end
+else
+ return
+end
+
+if nargin>2
+ if length(LineColor)>=m
+ for i=1:m
+ if sum(strcmpi({'y' 'm' 'c' 'r' 'g' 'b' 'w' 'k' },LineColor(i)))
+ set(A(i),'Color',cell2mat(LineColor(i)))
+ end
+ end
+ end
+else
+ return
+end
+
+if nargin>3
+ if length(FillColor)>=m
+ for i=1:m
+ if sum(strcmpi({'y' 'm' 'c' 'r' 'g' 'b' 'w' 'k' },FillColor(i)))
+ hold on;
+ F=fill(X(i,:),Y(i,:),cell2mat(FillColor(i)),'LineStyle','none');
+ set(F,'FaceAlpha',0.3)
+ end
+ end
+ end
+else
+ return
+end
+
+if nargin>4
+ if length(LineStyle)>=m
+ for i=1:m
+ if sum(strcmpi({'-' '--' ':' '-.'},LineStyle(i)))
+ set(A(i),'LineStyle',cell2mat(LineStyle(i)))
+ end
+ end
+ end
+else
+ return
+end
+
diff --git a/Visualization_Module/readme.txt b/Visualization_Module/readme.txt
new file mode 100644
index 0000000..5ff3068
--- /dev/null
+++ b/Visualization_Module/readme.txt
@@ -0,0 +1,105 @@
+MATLAB Compiler
+
+1. Prerequisites for Deployment
+
+. Verify the MATLAB runtime is installed and ensure you
+ have installed version 8.5 (R2015a).
+
+. If the MATLAB runtime is not installed, do the following:
+ (1) enter
+
+ >>mcrinstaller
+
+ at MATLAB prompt. The MCRINSTALLER command displays the
+ location of the MATLAB runtime installer.
+
+ (2) run the MATLAB runtime installer.
+
+Or download the Linux 64-bit version of the MATLAB runtime for R2015a
+from the MathWorks Web site by navigating to
+
+ http://www.mathworks.com/products/compiler/mcr/index.html
+
+
+For more information about the MATLAB runtime and the MATLAB runtime installer, see
+Package and Distribute in the MATLAB Compiler documentation
+in the MathWorks Documentation Center.
+
+
+2. Files to Deploy and Package
+
+Files to package for Standalone
+================================
+-DP_SPLS_para_FEF
+-run_DP_SPLS_para_FEF.sh (shell script for temporarily setting environment variables and
+ executing the application)
+ -to run the shell script, type
+
+ ./run_DP_SPLS_para_FEF.sh
+
+ at Linux or Mac command prompt. is the directory
+ where version 8.5 of the MATLAB runtime is installed or the directory where
+ MATLAB is installed on the machine. is all the
+ arguments you want to pass to your application. For example,
+
+ If you have version 8.5 of the MATLAB runtime installed in
+ /mathworks/home/application/v85, run the shell script as:
+
+ ./run_DP_SPLS_para_FEF.sh /mathworks/home/application/v85
+
+ If you have MATLAB installed in /mathworks/devel/application/matlab,
+ run the shell script as:
+
+ ./run_DP_SPLS_para_FEF.sh /mathworks/devel/application/matlab
+-MCRInstaller.zip
+ -if end users are unable to download the MATLAB runtime using the above
+ link, include it when building your component by clicking
+ the "Runtime downloaded from web" link in the Deployment Tool
+-This readme file
+
+3. Definitions
+
+For information on deployment terminology, go to
+http://www.mathworks.com/help. Select MATLAB Compiler >
+Getting Started > About Application Deployment >
+Application Deployment Terms in the MathWorks Documentation
+Center.
+
+
+4. Appendix
+
+A. Linux x86-64 systems:
+ On the target machine, add the MATLAB runtime directory to the environment variable
+ LD_LIBRARY_PATH by issuing the following commands:
+
+ NOTE: is the directory where MATLAB runtime is installed
+ on the target machine.
+
+ setenv LD_LIBRARY_PATH
+ $LD_LIBRARY_PATH:
+ /v85/runtime/glnxa64:
+ /v85/bin/glnxa64:
+ /v85/sys/os/glnxa64:
+ /v85/sys/opengl/lib/glnxa64
+ setenv XAPPLRESDIR /v85/X11/app-defaults
+
+ For more detail information about setting the MATLAB runtime paths, see Package and
+ Distribute in the MATLAB Compiler documentation in the MathWorks Documentation Center.
+
+
+
+ NOTE: To make these changes persistent after logout on Linux
+ or Mac machines, modify the .cshrc file to include this
+ setenv command.
+ NOTE: The environment variable syntax utilizes forward
+ slashes (/), delimited by colons (:).
+ NOTE: When deploying standalone applications, it is possible
+ to run the shell script file run_DP_SPLS_para_FEF.sh
+ instead of setting environment variables. See
+ section 2 "Files to Deploy and Package".
+
+
+
+
+
+
diff --git a/Visualization_Module/requiredMCRProducts.txt b/Visualization_Module/requiredMCRProducts.txt
new file mode 100644
index 0000000..3ed6af0
--- /dev/null
+++ b/Visualization_Module/requiredMCRProducts.txt
@@ -0,0 +1 @@
+35000 35010
\ No newline at end of file
diff --git a/Visualization_Module/run_DP_SPLS_para_FEF.sh b/Visualization_Module/run_DP_SPLS_para_FEF.sh
new file mode 100644
index 0000000..d82dc10
--- /dev/null
+++ b/Visualization_Module/run_DP_SPLS_para_FEF.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+# script for execution of deployed applications
+#
+# Sets up the MATLAB runtime environment for the current $ARCH and executes
+# the specified command.
+#
+exe_name=$0
+exe_dir=`dirname "$0"`
+echo "------------------------------------------"
+if [ "x$1" = "x" ]; then
+ echo Usage:
+ echo $0 \ args
+else
+ echo Setting up environment variables
+ MCRROOT="$1"
+ echo ---
+ LD_LIBRARY_PATH=.:${MCRROOT}/runtime/glnxa64 ;
+ LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRROOT}/bin/glnxa64 ;
+ LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRROOT}/sys/os/glnxa64;
+ LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRROOT}/sys/opengl/lib/glnxa64;
+ export LD_LIBRARY_PATH;
+ echo LD_LIBRARY_PATH is ${LD_LIBRARY_PATH};
+ shift 1
+ args=
+ while [ $# -gt 0 ]; do
+ token=$1
+ args="${args} \"${token}\""
+ shift
+ done
+ eval "\"${exe_dir}/DP_SPLS_para_FEF\"" $args
+fi
+exit
+
diff --git a/Visualization_Module/spls_DP_try.m b/Visualization_Module/spls_DP_try.m
new file mode 100644
index 0000000..771ba2f
--- /dev/null
+++ b/Visualization_Module/spls_DP_try.m
@@ -0,0 +1,265 @@
+function [u, v, success] = spls(X, Y, cu, cv, e, itr_lim)
+%
+% Sparse PLS algorithm, please check Monteiro et al. 2016 for details:
+% doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs: X, Y - data matrices in the form: samples x features. These
+% should have each feature with mean = 0 and std = 1;
+%
+% cu, cv - sparcity regularization hyperparameters, must be
+% between 1 and sqrt(number_features). The lower it is,
+% the spaser the solution. If it is outside this range,
+% no sparsity will be applied in the corresponding view.
+%
+% e - convergence threshold (see the code for info on how it
+% works). Default: 1E-5
+%
+% itr_lim - maximum number of iterations (it give a warning
+% if it does not converge). Default: 1000
+%
+%
+% Outputs: u, v - weight vectors for X and Y, respectively
+%
+% success - will return "false" if something went wrong during
+% the weight vector computation
+%
+% Version: 2016-08-20
+%__________________________________________________________________________
+
+% Written by Joao Matos Monteiro
+% Email: joao.monteiro@ucl.ac.uk
+
+
+%--- Initial checks
+%--------------------------------------------------------------------------
+
+% Check if lu anv lv obey the limits
+if cu < 1 || cu > sqrt(size(X,2))
+ warning('lu is out of interval: 1 <= lu <= sqrt(size(X,2). Not using spasity on u.')
+ no_sparse_X = true;
+ failed_sparsity_u = false;
+else
+ no_sparse_X = false;
+end
+if cv < 1 || cv > sqrt(size(Y,2))
+ warning('lv is out of interval: 1 <= lv <= sqrt(size(Y,2). Not using spasity on v.')
+ no_sparse_Y = true;
+ failed_sparsity_v = false;
+else
+ no_sparse_Y = false;
+end
+
+% Convergence threshold
+if ~exist('e', 'var')
+ e = 1E-5;
+end
+
+% Iteration limit for calculating a vector pair
+if ~exist('itr_lim', 'var')
+ itr_lim = 1000;
+end
+
+
+
+%--- SPLS
+%--------------------------------------------------------------------------
+
+%--- Compute the covariance matrix
+C = X'*Y;
+
+%--- Initialise weight vectors
+u_temp = nan(size(X, 2), 2);
+v_temp = nan(size(Y, 2), 2);
+
+[U,~,V] = svd(C,0);
+u_temp(:,1) = U(:,1);
+u_temp(:,1) = u_temp(:,1)./norm(u_temp(:,1)); % normalise
+v_temp(:,1) = V(:,1);
+v_temp(:,1) = v_temp(:,1)./norm(v_temp(:,1)); % normalise
+
+clear U V
+
+%--- Main Loop
+diff = 10*e; %start the diff with a high value
+i = 0;
+success = true;
+
+while diff > e && success
+
+ %--- Compute u
+ if no_sparse_X
+ u_temp(:,2) = C*v_temp(:,1);
+ u_temp(:,2) = u_temp(:,2)./norm(u_temp(:,2), 2);
+ else
+ [u_temp(:,2), tmp_success] = update(C*v_temp(:,1), cu);
+ failed_sparsity_u = ~tmp_success;
+ if failed_sparsity_u % If it was not successful, return non sparse version
+ u_temp(:,2) = C*v_temp(:,1);
+ u_temp(:,2) = u_temp(:,2)./norm(u_temp(:,2), 2);
+ end
+ end
+ dim_u = sum(u_temp(:,2)~=0);
+ if ~dim_u
+ error(['No weights were included in the model, this should never '...
+ 'happen. Try increasing lu.']);
+ end
+
+
+ %--- Compute v
+ if no_sparse_Y
+ v_temp(:,2) = C'*u_temp(:,2);
+ v_temp(:,2) = v_temp(:,2)./norm(v_temp(:,2), 2);
+ else
+ [v_temp(:,2), tmp_success] = update(C'*u_temp(:,2), cv);
+ failed_sparsity_v = ~tmp_success;
+ if failed_sparsity_v % If it was not successful, return non sparse version
+ v_temp(:,2) = C'*u_temp(:,2);
+ v_temp(:,2) = v_temp(:,2)./norm(v_temp(:,2), 2);
+ end
+ end
+ dim_v = sum(v_temp(:,2)~=0);
+ if ~dim_v
+ error(['No weights were included in the model, this should never '...
+ 'happen. Try increasing lv.']);
+ end
+
+
+ %--- Check convergence
+ diff_u = norm(u_temp(:,2) - u_temp(:,1));
+ diff_v = norm(v_temp(:,2) - v_temp(:,1));
+ if diff_u >= diff_v, diff = diff_u; else diff = diff_v; end
+ % update u and v for the next iteration
+ u_temp(:,1) = u_temp(:,2);
+ v_temp(:,1) = v_temp(:,2);
+
+ if i >= itr_lim
+ warning('Maximum number of iterations reached.');
+ success = false;
+ end
+
+ i = i+1;
+end
+
+if failed_sparsity_u
+ warning(['There was a problem with the delta estimation in u.' ...
+ ' The solution was forced to be non-sparse. Take results with a grain of salt.']);
+ success = false;
+end
+
+if failed_sparsity_v
+ warning(['There was a problem with the delta estimation in v.' ...
+ ' The solution was forced to be non-sparse. Take results with a grain of salt.']);
+ success = false;
+end
+
+fprintf('SPLS: itr: %d diff: %.2e dim_u: %d dim_v: %d\n', i, diff, dim_u, dim_v);
+
+%--- Add converged weight vectors to output
+u = u_temp(:, end);
+v = v_temp(:, end);
+
+return u
+return v
+return success
+
+end
+
+
+%--- Private functions
+%--------------------------------------------------------------------------
+function [up, success] = update(w, c)
+
+success = true;
+
+%--- update values
+delta = 0;
+up = soft_thresh(w, delta);
+up = up./norm(up,2);
+
+%--- check if it obeys the condition. If not, find delta that does.
+if norm(up, 1) > c
+
+ delta1 = delta;
+ delta2 = delta1+1.1; % delta2 must be > 1
+
+ % get first estimate of delta2
+ flag = false;
+ i = 0;
+ max_delta = 0;
+ while ~flag
+ up = soft_thresh(w, delta2);
+ up = up./norm(up,2);
+
+ if sum(abs(up)) == 0 || isnan(sum(abs(up))) % if everthing is zero, the up/|up| will be 0/0 = nan
+ delta2 = delta2/1.618; % They have to be diferent, otherwise it might not converge
+ elseif norm(up, 1) > c
+ delta1 = delta2;
+ delta2 = delta2*2; % They have to be diferent, otherwise it might not converge
+ elseif norm(up, 1) <= c
+ flag = true;
+ end
+
+ if delta2>max_delta, max_delta = delta2;end
+
+ if delta2 == 0
+ warning('Delta has to be zero.');
+ success = false;
+ break
+ end
+ i = i+1;
+ if i>1E4
+ warning('First delta estimation update did not converge.');
+ delta1 = 0;
+ delta2 = max_delta;
+ break
+ end
+ end
+
+
+ up = bisec(w, c, delta1, delta2);
+ if isempty(up) || sum(isnan(up))>0
+ warning('Delta estimation unsuccessful.')
+ success = false;
+ end
+
+
+end
+
+
+
+end
+
+function out = soft_thresh(a,delta)
+% Performs soft threshold (it does not normalize the output)
+diff = abs(a)-delta;
+diff(diff<0) = 0;
+out = sign(a).*diff;
+
+end
+
+
+function out = bisec(K, c, x1,x2)
+converge = false;
+success = true;
+tolerance = 1E-6;
+while ~converge && success
+ x = (x2 + x1) / 2;
+ out = soft_thresh(K, x);
+ out = out./norm(out,2);
+ if sum(abs(out)) == 0
+ x2 = x;
+ elseif norm(out, 1) > c
+ x1 = x;
+ elseif norm(out, 1) < c
+ x2 = x;
+ end
+
+ diff = abs(norm(out, 1) - c);
+ if diff <= tolerance
+ converge = true;
+ elseif isnan(sum(diff))
+ success = false;
+ out = nan(size(K));
+ end
+end
+end
\ No newline at end of file
diff --git a/Visualization_Module/spls_suppressed_display.m b/Visualization_Module/spls_suppressed_display.m
new file mode 100644
index 0000000..14e7faa
--- /dev/null
+++ b/Visualization_Module/spls_suppressed_display.m
@@ -0,0 +1,261 @@
+function [u, v, success] = spls_suppressed_display(X, Y, cu, cv, e, itr_lim)
+%
+% Sparse PLS algorithm, please check Monteiro et al. 2016 for details:
+% doi:10.1016/j.jneumeth.2016.06.011
+%
+% Inputs: X, Y - data matrices in the form: samples x features. These
+% should have each feature with mean = 0 and std = 1;
+%
+% cu, cv - sparcity regularization hyperparameters, must be
+% between 1 and sqrt(number_features). The lower it is,
+% the spaser the solution. If it is outside this range,
+% no sparsity will be applied in the corresponding view.
+%
+% e - convergence threshold (see the code for info on how it
+% works). Default: 1E-5
+%
+% itr_lim - maximum number of iterations (it give a warning
+% if it does not converge). Default: 1000
+%
+%
+% Outputs: u, v - weight vectors for X and Y, respectively
+%
+% success - will return "false" if something went wrong during
+% the weight vector computation
+%
+% Version: 2016-08-20
+%__________________________________________________________________________
+
+% Written by Joao Matos Monteiro
+% Email: joao.monteiro@ucl.ac.uk
+
+
+%--- Initial checks
+%--------------------------------------------------------------------------
+
+% Check if lu anv lv obey the limits
+if cu < 1 || cu > sqrt(size(X,2))
+ warning('cu is out of interval: 1 <= cu <= sqrt(size(X,2). Not using spasity on u.')
+ no_sparse_X = true;
+ failed_sparsity_u = false;
+else
+ no_sparse_X = false;
+end
+if cv < 1 || cv > sqrt(size(Y,2))
+ warning('cv is out of interval: 1 <= cv <= sqrt(size(Y,2). Not using spasity on v.')
+ no_sparse_Y = true;
+ failed_sparsity_v = false;
+else
+ no_sparse_Y = false;
+end
+
+% Convergence threshold
+if ~exist('e', 'var')
+ e = 1E-5;
+end
+
+% Iteration limit for calculating a vector pair
+if ~exist('itr_lim', 'var')
+ itr_lim = 1000;
+end
+
+
+
+%--- SPLS
+%--------------------------------------------------------------------------
+
+%--- Compute the covariance matrix
+C = X'*Y;
+
+%--- Initialise weight vectors
+u_temp = nan(size(X, 2), 2);
+v_temp = nan(size(Y, 2), 2);
+
+[U,~,V] = svd(C,0);
+u_temp(:,1) = U(:,1);
+u_temp(:,1) = u_temp(:,1)./norm(u_temp(:,1)); % normalise
+v_temp(:,1) = V(:,1);
+v_temp(:,1) = v_temp(:,1)./norm(v_temp(:,1)); % normalise
+
+clear U V
+
+%--- Main Loop
+diff = 10*e; %start the diff with a high value
+i = 0;
+success = true;
+
+while diff > e && success
+
+ %--- Compute u
+ if no_sparse_X
+ u_temp(:,2) = C*v_temp(:,1);
+ u_temp(:,2) = u_temp(:,2)./norm(u_temp(:,2), 2);
+ else
+ [u_temp(:,2), tmp_success] = update(C*v_temp(:,1), cu);
+ failed_sparsity_u = ~tmp_success;
+ if failed_sparsity_u % If it was not successful, return non sparse version
+ u_temp(:,2) = C*v_temp(:,1);
+ u_temp(:,2) = u_temp(:,2)./norm(u_temp(:,2), 2);
+ end
+ end
+ dim_u = sum(u_temp(:,2)~=0);
+ if ~dim_u
+ error(['No weights were included in the model, this should never '...
+ 'happen. Try increasing lu.']);
+ end
+
+
+ %--- Compute v
+ if no_sparse_Y
+ v_temp(:,2) = C'*u_temp(:,2);
+ v_temp(:,2) = v_temp(:,2)./norm(v_temp(:,2), 2);
+ else
+ [v_temp(:,2), tmp_success] = update(C'*u_temp(:,2), cv);
+ failed_sparsity_v = ~tmp_success;
+ if failed_sparsity_v % If it was not successful, return non sparse version
+ v_temp(:,2) = C'*u_temp(:,2);
+ v_temp(:,2) = v_temp(:,2)./norm(v_temp(:,2), 2);
+ end
+ end
+ dim_v = sum(v_temp(:,2)~=0);
+ if ~dim_v
+ error(['No weights were included in the model, this should never '...
+ 'happen. Try increasing lv.']);
+ end
+
+
+ %--- Check convergence
+ diff_u = norm(u_temp(:,2) - u_temp(:,1));
+ diff_v = norm(v_temp(:,2) - v_temp(:,1));
+ if diff_u >= diff_v, diff = diff_u; else diff = diff_v; end
+ % update u and v for the next iteration
+ u_temp(:,1) = u_temp(:,2);
+ v_temp(:,1) = v_temp(:,2);
+
+ if i >= itr_lim
+ warning('Maximum number of iterations reached.');
+ success = false;
+ end
+
+ i = i+1;
+end
+
+if failed_sparsity_u
+ warning(['There was a problem with the delta estimation in u.' ...
+ ' The solution was forced to be non-sparse. Take results with a grain of salt.']);
+ success = false;
+end
+
+if failed_sparsity_v
+ warning(['There was a problem with the delta estimation in v.' ...
+ ' The solution was forced to be non-sparse. Take results with a grain of salt.']);
+ success = false;
+end
+
+
+%--- Add converged weight vectors to output
+u = u_temp(:, end);
+v = v_temp(:, end);
+
+
+end
+
+
+%--- Private functions
+%--------------------------------------------------------------------------
+function [up, success] = update(w, c)
+
+success = true;
+
+%--- update values
+delta = 0;
+up = soft_thresh(w, delta);
+up = up./norm(up,2);
+
+%--- check if it obeys the condition. If not, find delta that does.
+if norm(up, 1) > c
+
+ delta1 = delta;
+ delta2 = delta1+1.1; % delta2 must be > 1
+
+ % get first estimate of delta2
+ flag = false;
+ i = 0;
+ max_delta = 0;
+ while ~flag
+ up = soft_thresh(w, delta2);
+ up = up./norm(up,2);
+
+ if sum(abs(up)) == 0 || isnan(sum(abs(up))) % if everthing is zero, the up/|up| will be 0/0 = nan
+ delta2 = delta2/1.618; % They have to be diferent, otherwise it might not converge
+ elseif norm(up, 1) > c
+ delta1 = delta2;
+ delta2 = delta2*2; % They have to be diferent, otherwise it might not converge
+ elseif norm(up, 1) <= c
+ flag = true;
+ end
+
+ if delta2>max_delta, max_delta = delta2;end
+
+ if delta2 == 0
+ warning('Delta has to be zero.');
+ success = false;
+ break
+ end
+ i = i+1;
+ if i>1E4
+ %warning('First delta estimation update did not converge.');
+ delta1 = 0;
+ delta2 = max_delta;
+ break
+ end
+ end
+
+
+ up = bisec(w, c, delta1, delta2);
+ if isempty(up) || sum(isnan(up))>0
+ %warning('Delta estimation unsuccessful.')
+ success = false;
+ end
+
+
+end
+
+
+
+end
+
+function out = soft_thresh(a,delta)
+% Performs soft threshold (it does not normalize the output)
+diff = abs(a)-delta;
+diff(diff<0) = 0;
+out = sign(a).*diff;
+
+end
+
+
+function out = bisec(K, c, x1,x2)
+converge = false;
+success = true;
+tolerance = 1E-6;
+while ~converge && success
+ x = (x2 + x1) / 2;
+ out = soft_thresh(K, x);
+ out = out./norm(out,2);
+ if sum(abs(out)) == 0
+ x2 = x;
+ elseif norm(out, 1) > c
+ x1 = x;
+ elseif norm(out, 1) < c
+ x2 = x;
+ end
+
+ diff = abs(norm(out, 1) - c);
+ if diff <= tolerance
+ converge = true;
+ elseif isnan(sum(diff))
+ success = false;
+ out = nan(size(K));
+ end
+end
+end
\ No newline at end of file
diff --git a/Visualization_Module/test.m b/Visualization_Module/test.m
new file mode 100644
index 0000000..7fc65a5
--- /dev/null
+++ b/Visualization_Module/test.m
@@ -0,0 +1,23 @@
+filecount = size(dir([hyperparameter_folder '/RHO_avg_*']),1);
+
+for i=1:filecount
+
+ if exist([hyperparameter_folder '/RHO_avg_' num2str(i) '.mat'])
+ load([hyperparameter_folder '/RHO_avg_',num2str(i),'.mat']);
+ RHO_avg_collection(i,1) = RHO_avg;
+ else
+ RHO_avg_collection(i,1) = NaN;
+ end
+end
+
+
+filecount = size(dir([permutation_folder '/RHO_b_*']),1);
+
+for i=1:filecount
+ if exist([permutation_folder '/RHO_b_' num2str(i) '.mat'])
+ load([permutation_folder '/RHO_b_',num2str(i),'.mat']);
+ RHO_b_collection(i,1) = RHO_b;
+ else
+ RHO_b_collection(i,1) = NaN;
+ end
+end
\ No newline at end of file
diff --git a/Visualization_Module/test.txt b/Visualization_Module/test.txt
new file mode 100644
index 0000000..f00c965
--- /dev/null
+++ b/Visualization_Module/test.txt
@@ -0,0 +1,10 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/Visualization_Module/testing_queue.sh b/Visualization_Module/testing_queue.sh
new file mode 100644
index 0000000..706a4a1
--- /dev/null
+++ b/Visualization_Module/testing_queue.sh
@@ -0,0 +1,19 @@
+##!/bin/bash
+#$ -S /bin/sh
+#current environment variables are used on you SGE jobs
+#$ -V
+#Use current working directory
+#$ -cwd
+#Merge the standard out and standard error to one file
+#$ -j y
+#$ -o $JOB_ID-output.txt
+#$ -l h_vmem=8G
+#$ -pe 5
+#$ -q psy0cf20 # This is the computer queue. For high RAM jobs use: psy0cf20.
+
+
+LOOPID='/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/test.txt'
+loopid=($(awk "NR==$SGE_TASK_ID" $LOOPID))
+
+/volume/DP_FEF/ScrFun/ScriptsRepository/SPLS_Toolbox/Hyperparameter_optimization/dp_RHO_avg_k_AR_DP/for_testing/dp_RHO_avg_k_AR_DP ${loopid[0]}
+
diff --git a/Visualization_Module/wmean.m b/Visualization_Module/wmean.m
new file mode 100644
index 0000000..a14984d
--- /dev/null
+++ b/Visualization_Module/wmean.m
@@ -0,0 +1,47 @@
+function y = wmean(x,w,dim)
+%WMEAN Weighted Average or mean value.
+% For vectors, WMEAN(X,W) is the weighted mean value of the elements in X
+% using non-negative weights W. For matrices, WMEAN(X,W) is a row vector
+% containing the weighted mean value of each column. For N-D arrays,
+% WMEAN(X,W) is the weighted mean value of the elements along the first
+% non-singleton dimension of X.
+%
+% Each element of X requires a corresponding weight, and hence the size
+% of W must match that of X.
+%
+% WMEAN(X,W,DIM) takes the weighted mean along the dimension DIM of X.
+%
+% Class support for inputs X and W:
+% float: double, single
+%
+% Example:
+% x = rand(5,2);
+% w = rand(5,2);
+% wmean(x,w)
+
+if nargin<2
+ error('Not enough input arguments.');
+end
+
+% Check that dimensions of X match those of W.
+if(~isequal(size(x), size(w)))
+ error('Inputs x and w must be the same size.');
+end
+
+% Check that all of W are non-negative.
+if (any(w(:)<0))
+ error('All weights, W, must be non-negative.');
+end
+
+% Check that there is at least one non-zero weight.
+if (all(w(:)==0))
+ error('At least one weight must be non-zero.');
+end
+
+if nargin==2,
+ % Determine which dimension SUM will use
+ dim = min(find(size(x)~=1));
+ if isempty(dim), dim = 1; end
+end
+
+y = sum(w.*x,dim)./sum(w,dim);
\ No newline at end of file