Yu-Group/simChef

Caching bug with function arguments

tiffanymtang opened this issue · 0 comments

Caching does not work properly with DGPs (and Methods) that take in function arguments that explicitly contain a nested function.

Example:

rm(list = ls())
library(simChef)
library(magrittr)

n <- 300
p <- 3

dgp_fun <- function(n, p, func_arg) {
  X <- matrix(rnorm(n * p), nrow = n, ncol = p)
  y <- rnorm(n)
  return(list(X = X, y = y))
}

method_fun <- function(X, y) {
  lm_df <- cbind(data.frame(X), .y = y)
  lm_fit <- lm(.y ~ ., dat = lm_df)
  return(coef(lm_fit))
}
method <- create_method(method_fun, .name = "Method")

Example DGPs where caching works:

helper_fun <- function(x) sum(x)
working_func_arg <- function() {
  z <- apply(X, 1, FUN = helper_fun)
}
working_dgp <- create_dgp(dgp_fun, .name = "Working DGP", n = n, p = p, func_arg = working_func_arg)

experiment <- create_experiment() %>%
  add_dgp(working_dgp) %>%
  add_method(method)

out <- run_experiment(experiment, save = TRUE, use_cached = FALSE)
out <- run_experiment(experiment, save = TRUE, use_cached = TRUE)

Example DGPs where caching does not work:

buggy_func_arg1 <- function() {
  z <- apply(X, 1, FUN = function(x) sum(x))
}
buggy_dgp1 <- create_dgp(dgp_fun, .name = "Buggy DGP1", n = n, p = p, func_arg = buggy_func_arg1)

buggy_func_arg2 <- function() {
  function(x) sum(x)
  return("hi")
}
buggy_dgp2 <- create_dgp(dgp_fun, .name = "Buggy DGP2", n = n, p = p, func_arg = buggy_func_arg2)

experiment <- create_experiment() %>%
  add_dgp(buggy_dgp1) %>%
  add_dgp(buggy_dgp2) %>%
  add_method(method)

out <- run_experiment(experiment, save = TRUE, use_cached = FALSE)
out <- run_experiment(experiment, save = TRUE, use_cached = TRUE)