adapt Bruno method into package, add 'operational' mode
[talweg.git] / pkg / R / F_Average.R
index a1f29ad..bee1974 100644 (file)
@@ -7,7 +7,7 @@
 #' averaged to provide a smooth prediction. This forecast will most of the time be wrong,
 #' but will also look plausible enough.
 #'
-#' @usage f <- AverageForecaster$new(pjump)
+#' @usage # AverageForecaster$new(pjump)
 #'
 #' @docType class
 #' @format R6 class, inherits Forecaster
@@ -17,25 +17,41 @@ AverageForecaster = R6::R6Class("AverageForecaster",
        inherit = Forecaster,
 
        public = list(
-               predictShape = function(data, today, memory, horizon, ...)
+               predictShape = function(data, today, memory, predict_from, horizon, ...)
                {
-                       avg = rep(0., horizon)
+                       avg = rep(0., (horizon-predict_from+1))
                        first_day = max(1, today-memory)
-                       index = today-7 + 1
+                       index <- today
                        nb_no_na_series = 0
+                       opera = ifelse(hasArg("opera"), list(...)$opera, FALSE)
                        repeat
                        {
-                               {
-                                       serie_on_horizon = data$getCenteredSerie(index)[1:horizon]
-                                       index = index - 7
-                               };
+                               index = index - 7
+                               if (index < first_day)
+                                       break
+                               serie_on_horizon = data$getCenteredSerie(index)[predict_from:horizon]
                                if (!any(is.na(serie_on_horizon)))
                                {
                                        avg = avg + serie_on_horizon
                                        nb_no_na_series = nb_no_na_series + 1
-                               };
-                               if (index < first_day)
-                                       break
+                               }
+                       }
+                       if (!opera)
+                       {
+                               # The same, in the future
+                               index <- today
+                               repeat
+                               {
+                                       index = index + 7
+                                       if (index > data$getSize())
+                                               break
+                                       serie_on_horizon = data$getCenteredSerie(index)[predict_from:horizon]
+                                       if (!any(is.na(serie_on_horizon)))
+                                       {
+                                               avg = avg + serie_on_horizon
+                                               nb_no_na_series = nb_no_na_series + 1
+                                       }
+                               }
                        }
                        avg / nb_no_na_series
                }