update following 23/05 TODOs
[talweg.git] / pkg / R / F_Neighbors.R
index 8eb1ddc..0295cd5 100644 (file)
@@ -57,7 +57,7 @@ NeighborsForecaster = R6::R6Class("NeighborsForecaster",
                        if (!opera)
                                tdays = setdiff(tdays, today) #always exclude current day
 
-                       # Shortcut if window is known #TODO: cross-validation for number of days, on similar (yerste)days
+                       # Shortcut if window is known
                        if (hasArg("window"))
                        {
                                return ( private$.predictShapeAux(data, tdays, today, predict_from, horizon,
@@ -99,6 +99,11 @@ NeighborsForecaster = R6::R6Class("NeighborsForecaster",
                                best_window_exo = optimize(
                                        errorOnLastNdays, c(0,7), simtype="exo")$minimum
                        }
+                       if (local)
+                       {
+                               best_window_local = optimize(
+                                       errorOnLastNdays, c(3,30), simtype="none")$minimum
+                       }
 
                        best_window =
                                if (simtype == "endo")
@@ -107,8 +112,10 @@ NeighborsForecaster = R6::R6Class("NeighborsForecaster",
                                        best_window_exo
                                else if (simtype == "mix")
                                        c(best_window_endo,best_window_exo)
-                               else #none: value doesn't matter
-                                       1
+                               else #none: no value
+                                       NULL
+                       if (local)
+                               best_window = c(best_window, best_window_local)
 
                        return( private$.predictShapeAux(data, tdays, today, predict_from, horizon, local,
                                best_window, simtype, opera, TRUE) )
@@ -126,21 +133,22 @@ NeighborsForecaster = R6::R6Class("NeighborsForecaster",
                        if (local)
                        {
                                # limit=Inf to not censor any day (TODO: finite limit? 60?)
-                               tdays = getSimilarDaysIndices(today, data, limit=Inf, same_season=TRUE,
+                               tdays <- getSimilarDaysIndices(today, data, limit=Inf, same_season=TRUE,
                                        days_in=tdays_cut, operational=opera)
+                               nb_neighbs <- round( window[length(window)] )
                                # TODO: 10 == magic number
-                               tdays = .getConstrainedNeighbs(today, data, tdays, min_neighbs=10)
+                               tdays <- .getConstrainedNeighbs(today, data, tdays, min_neighbs=nb_neighbs)
                                if (length(tdays) == 1)
                                {
                                        if (final_call)
                                        {
                                                private$.params$weights <- 1
                                                private$.params$indices <- tdays
-                                               private$.params$window <- 1
+                                               private$.params$window <- window
                                        }
                                        return ( data$getSerie(tdays[1])[predict_from:horizon] )
                                }
-                               max_neighbs = 12 #TODO: 10 or 12 or... ?
+                               max_neighbs = nb_neighbs #TODO: something else?
                                if (length(tdays) > max_neighbs)
                                {
                                        distances2 <- .computeDistsEndo(data, today, tdays, predict_from)
@@ -153,23 +161,20 @@ NeighborsForecaster = R6::R6Class("NeighborsForecaster",
 
                        if (simtype == "endo" || simtype == "mix")
                        {
-                               # Compute endogen similarities using given window
-                               window_endo = ifelse(simtype=="mix", window[1], window)
-
                                # Distances from last observed day to selected days in the past
                                # TODO: redundant computation if local==TRUE
                                distances2 <- .computeDistsEndo(data, today, tdays, predict_from)
 
-                               simils_endo <- .computeSimils(distances2, window_endo)
+                               # Compute endogen similarities using the given window
+                               simils_endo <- .computeSimils(distances2, window[1])
                        }
 
                        if (simtype == "exo" || simtype == "mix")
                        {
-                               # Compute exogen similarities using given window
-                               window_exo = ifelse(simtype=="mix", window[2], window)
-
                                distances2 <- .computeDistsExo(data, today, tdays)
 
+                               # Compute exogen similarities using the given window
+                               window_exo = ifelse(simtype=="mix", window[2], window[1])
                                simils_exo <- .computeSimils(distances2, window_exo)
                        }
 
@@ -195,15 +200,7 @@ NeighborsForecaster = R6::R6Class("NeighborsForecaster",
                        {
                                private$.params$weights <- similarities
                                private$.params$indices <- tdays
-                               private$.params$window <-
-                                       if (simtype=="endo")
-                                               window_endo
-                                       else if (simtype=="exo")
-                                               window_exo
-                                       else if (simtype=="mix")
-                                               c(window_endo,window_exo)
-                                       else #none
-                                               1
+                               private$.params$window <- window
                        }
 
                        return (prediction)