tests/testthat/test_makeMBOLearner.R

test_that("makeMBOLearner", {

  ctrl = makeMBOControl()
  ctrl = setMBOControlTermination(ctrl, iters = 2L)


  #fully numeric case
  par.set = makeParamSet(
    makeNumericParam("x1", lower = -2, upper = 1),
    makeIntegerParam("x2", lower = -1, upper = 2)
  )

  f = makeSingleObjectiveFunction(
    fn = function(x) {
      x[1]^2+x[2]^2
    },
    par.set = par.set
  )

  lrn = makeMBOLearner(ctrl, f)
  expect_equal(lrn, makeLearner("regr.km", predict.type = "se",
    par.vals = list(covtype = "matern3_2", optim.method = "gen", nugget.stability = 10^-8)))
  expect_output(print(mbo(f, control = ctrl, learner = lrn)), "Recommended parameters")

  # fully numeric, without se prediction
  ctrl = setMBOControlInfill(ctrl, crit = makeMBOInfillCritMeanResponse())
  lrn = makeMBOLearner(ctrl, f)
  expect_equal(lrn, makeLearner("regr.km",
    par.vals = list(covtype = "matern3_2", optim.method = "gen", nugget.stability = 10^-8)))
  expect_output(print(mbo(f, control = ctrl, learner = lrn)), "Recommended parameters")

  ctrl = setMBOControlInfill(ctrl, crit = makeMBOInfillCritCB())

  # fully numeric, noisy case
  f = makeSingleObjectiveFunction(
    fn = function(x) {
      x[1]^2+x[2]^2 + rnorm(1, sd = 0.5)
    },
    par.set = par.set,
    noisy = TRUE
  )

  lrn = makeMBOLearner(ctrl, f)
  expect_equal(lrn, makeLearner("regr.km", predict.type = "se",
    par.vals = list(covtype = "matern3_2", optim.method = "gen", nugget.estim = TRUE, jitter = TRUE )))
  expect_output(suppressWarnings(print(mbo(f, control = ctrl, learner = lrn)), "Recommended parameters"))


  # discrete case

  set.seed(42)

  par.set = makeParamSet(
    makeNumericParam("x1", lower = -2, upper = 1),
    makeIntegerParam("x2", lower = -1, upper = 2),
    makeDiscreteParam("x3", values = c("a", "b"))
  )

  f = makeSingleObjectiveFunction(
    fn = function(x) {
      if (x[[3]] == "a")
        x[[1]]^2+x[[2]]^2
      else
        x[[1]]^2+x[[2]]^2 + 20
    },
    par.set = par.set,
    has.simple.signature = FALSE
  )

  lrn = makeMBOLearner(ctrl, f)
  expect_equal(lrn, makeLearner("regr.randomForest", predict.type = "se",
    par.vals = list(se.method = "jackknife", keep.inbag = TRUE)))
  expect_output(print(mbo(f, control = ctrl, learner = lrn)), "Recommended parameters")

  # discrete case, without se estimation
  ctrl = setMBOControlInfill(ctrl, crit = makeMBOInfillCritMeanResponse())
  lrn = makeMBOLearner(ctrl, f)
  expect_equal(lrn, makeLearner("regr.randomForest",
    par.vals = list(se.method = "jackknife", keep.inbag = TRUE)))
  expect_output(print(mbo(f, control = ctrl, learner = lrn)), "Recommended parameters")

  ctrl = setMBOControlInfill(ctrl, crit = makeMBOInfillCritCB())


  # discrete dependend case

  set.seed(42)

  par.set = makeParamSet(
    makeNumericParam("x1", lower = -2, upper = 1),
    makeIntegerParam("x2", lower = -1, upper = 2, requires = quote(x3 == "b")),
    makeDiscreteParam("x3", values = c("a", "b"))
  )

  f = makeSingleObjectiveFunction(
    fn = function(x) {
      if (x[[3]] == "a")
        x[[1]]^2
      else
        x[[1]]^2+x[[2]]^2 + 20
    },
    par.set = par.set,
    has.simple.signature = FALSE
  )

  lrn = makeMBOLearner(ctrl, f)
  # FIXME: this fails on R >= 4.1
  # expect_equal(lrn, makeImputeWrapper(makeLearner("regr.randomForest", predict.type = "se",
  #   par.vals = list(se.method = "jackknife", keep.inbag = TRUE)), classes = list(numeric = imputeMax(2), factor = imputeConstant("__miss__"))))
  # expect_output(print(mbo(f, control = ctrl, learner = lrn)), "Recommended parameters")

  par.set = makeParamSet(
    makeNumericParam("x1", lower = -2, upper = 1),
    makeDiscreteParam("x2", values = c("c", "d"), requires = quote(x3 == "b")),
    makeDiscreteParam("x3", values = c("a", "b"))
  )

  f = makeSingleObjectiveFunction(
    fn = function(x) {
      if (x[[3]] == "a")
        x[[1]]^2
      else
        if (x[[2]] == "c")
          x[[1]]^2 + 20
        else
          20
    },
    par.set = par.set,
    has.simple.signature = FALSE
  )

  lrn = makeMBOLearner(ctrl, f)
  # FIXME: this fails on R >= 4.1
  # expect_equal(lrn, makeImputeWrapper(makeLearner("regr.randomForest", predict.type = "se",
  #   par.vals = list(se.method = "jackknife", keep.inbag = TRUE)), classes = list(numeric = imputeMax(2), factor = imputeConstant("__miss__"))))
  # expect_output(print(mbo(f, control = ctrl, learner = lrn)), "Recommended parameters")

})
berndbischl/mlrMBO documentation built on Oct. 11, 2022, 1:44 p.m.