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