adapt Bruno method into package, add 'operational' mode
[talweg.git] / pkg / R / utils.R
index a4efd61..bb76996 100644 (file)
@@ -63,7 +63,8 @@ integerIndexToDate = function(index, data)
 #' @param days_in Optional set to intersect with results (NULL to discard)
 #'
 #' @export
-getSimilarDaysIndices = function(index, data, limit, same_season, days_in=NULL)
+getSimilarDaysIndices = function(index, data, limit, same_season,
+       days_in=NULL, operational=TRUE)
 {
        index = dateIndexToInteger(index, data)
 
@@ -73,15 +74,30 @@ getSimilarDaysIndices = function(index, data, limit, same_season, days_in=NULL)
        day_ref = dt_ref$wday #1=monday, ..., 6=saturday, 0=sunday
        month_ref = as.POSIXlt(data$getTime(index)[1])$mon+1 #month in 1...12
        i = index - 1
-       while (i >= 1 && length(days) < limit)
+       if (!operational)
+               j = index + 1
+       while (length(days) < min( limit, ifelse(is.null(days_in),Inf,length(days_in)) ))
        {
-               dt = as.POSIXlt(data$getTime(i)[1])
-               if ((is.null(days_in) || i %in% days_in) && .isSameDay(dt$wday, day_ref))
+               if (i >= 1)
                {
-                       if (!same_season || .isSameSeason(dt$mon+1, month_ref))
-                               days = c(days, i)
+                       dt = as.POSIXlt(data$getTime(i)[1])
+                       if ((is.null(days_in) || i %in% days_in) && .isSameDay(dt$wday, day_ref))
+                       {
+                               if (!same_season || .isSameSeason(dt$mon+1, month_ref))
+                                       days = c(days, i)
+                       }
+                       i = i - 1
+               }
+               if (!operational && j <= data$getSize())
+               {
+                       dt = as.POSIXlt(data$getTime(j)[1])
+                       if ((is.null(days_in) || j %in% days_in) && .isSameDay(dt$wday, day_ref))
+                       {
+                               if (!same_season || .isSameSeason(dt$mon+1, month_ref))
+                                       days = c(days, j)
+                       }
+                       j = j + 1
                }
-               i = i - 1
        }
        return ( days )
 }