#' Forecaster #' #' Forecaster (abstract class, implemented by all forecasters) #' #' @docType class #' @importFrom R6 R6Class #' #' @field params List of computed parameters, for post-run analysis (dev) #' @field data Dataset, object of class Data #' @field pjump Function: how to predict the jump at day interface ? #' #' @section Methods: \describe{ #' \item{\code{initialize(data, pjump)}} #' {Initialize a Forecaster object with a Data object and a jump prediction function.} #' \item{\code{predictSerie(today,memory,horizon,...)}} #' {Predict a new serie of \code{horizon} values at day index \code{today} #' using \code{memory} days in the past.} #' \item{\code{predictShape(today,memory,horizon,...)}} #' {Predict a new shape of \code{horizon} values at day index \code{today} #' using \code{memory} days in the past.} #' \item{\code{getParameters()}} #' {Return (internal) parameters.}} Forecaster = R6::R6Class("Forecaster", private = list( .params = list(), .data = NULL, .pjump = NULL ), public = list( initialize = function(data, pjump) { private$.data <- data private$.pjump <- pjump invisible(self) }, predictSerie = function(today, memory, horizon, ...) { # Parameters (potentially) computed during shape prediction stage predicted_shape = self$predictShape(today, memory, horizon, ...) predicted_delta = private$.pjump( private$.data, today, memory, horizon, private$.params, ...) # Predicted shape is aligned it on the end of current day + jump predicted_shape + tail(private$.data$getSerie(today),1) - predicted_shape[1] + predicted_delta }, predictShape = function(today, memory, horizon, ...) NULL #empty default implementation: to implement in inherited classes , getParameters = function() private$.params ) )