wisp
 
(Arne Babenhauserheide)
2017-04-06: move to an iterative EnSRF

move to an iterative EnSRF

diff --git a/examples/benchmark.w b/examples/benchmark.w
--- a/examples/benchmark.w
+++ b/examples/benchmark.w
@@ -287,8 +287,9 @@ define : flatten li
 ;; TODO: add filename and title and fix the units
 define* : plot-benchmark-result bench H #:key filename title
      let*
-        : ensemble-member-count 64
-          ensemble-member-plot-skip 16 ;; must not be zero!
+        : ensemble-member-count 32
+          ensemble-member-plot-skip 8 ;; must not be zero!
+          iterations 4
           y_0 : apply min : map car : map cdr bench
           y_m : * 0.25 : apply max : map car : map cdr bench
           nb : apply max : interleave (map car (map car bench)) (map car (map cdr (map car bench)))
@@ -298,9 +299,25 @@ define* : plot-benchmark-result bench H 
           P : make-covariance-matrix-with-offdiagonals-using-stds x^b-std
           y⁰-pos : map car bench
           y⁰ : append-map cdr bench
-          y⁰-stds : list-ec (: i y⁰) : min max-absolute-uncertainty-seconds {max-relative-uncertainty * i} ; enforcing 20% max std in benchmark-run
+          ;; several iterations to better cope with non-linearity, following http://journals.ametsoc.org/doi/abs/10.1175/MWR-D-11-00176.1 (but globally)
+          y⁰-stds : list-ec (: i y⁰) : * (sqrt iterations) : min max-absolute-uncertainty-seconds {max-relative-uncertainty * i} ; enforcing 20% max std in benchmark-run
           R : make-covariance-matrix-with-offdiagonals-using-stds y⁰-stds
-          optimized : EnSRF H x^b P y⁰ R y⁰-pos ensemble-member-count
+          optimized ;; iterate N times
+              let lp : (N iterations) (x^b x^b) (P P)
+                  let : : optimized : EnSRF H x^b P y⁰ R y⁰-pos ensemble-member-count
+                      cond
+                         : <= N 1
+                            . optimized
+                         else
+                            let*
+                              : x-opt : list-ref optimized 0
+                                x-deviations : list-ref optimized 1
+                                x-std ;; re-create the ensemble with the new std
+                                    list-ec (: i (length x-opt))
+                                        apply standard-deviation-from-deviations
+                                            list-ec (: j x-deviations) : list-ref j i
+                                P : make-covariance-matrix-with-offdiagonals-using-stds x-std
+                              lp (- N 1) x-opt P
           x-opt : list-ref optimized 0
           x-deviations : list-ref optimized 1
           x-std 
@@ -404,7 +421,7 @@ define : main args
                       if (equal? dN 0) N "N"
                       if (equal? dm 0) m "m"
               pbr (bench-ref param-list) H
-                  . #:title : title "list-ref (iota (max m N)) m"
+                  . #:title : title "list-ref (iota (max m N)) (- m 1)"
                   . #:filename : filename "list-ref"
               when : equal? dm 0 ;; only over N
                   pbr (bench-car param-list) H