diff --git a/DESCRIPTION b/DESCRIPTION index 28e6431d..5d18c04f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -41,13 +41,13 @@ BugReports: https://github.com/mlr-org/mlr3mbo/issues Depends: R (>= 3.1.0) Imports: - bbotk (>= 1.0.0), + bbotk (>= 1.1.1), checkmate (>= 2.0.0), data.table, lgr (>= 0.3.4), mlr3 (>= 0.21.0), mlr3misc (>= 0.11.0), - mlr3tuning (>= 1.0.0), + mlr3tuning (>= 1.0.2), paradox (>= 1.0.0), spacefillr, R6 (>= 2.4.1) diff --git a/R/ResultAssignerArchive.R b/R/ResultAssignerArchive.R index 1c6f9399..c9266fdb 100644 --- a/R/ResultAssignerArchive.R +++ b/R/ResultAssignerArchive.R @@ -29,15 +29,15 @@ ResultAssignerArchive = R6Class("ResultAssignerArchive", #' @param instance ([bbotk::OptimInstanceBatchSingleCrit] | [bbotk::OptimInstanceBatchMultiCrit])\cr #' The [bbotk::OptimInstance] the final result should be assigned to. assign_result = function(instance) { - res = instance$archive$best() - xdt = res[, instance$search_space$ids(), with = FALSE] + xydt = instance$archive$best() + xdt = xydt[, instance$search_space$ids(), with = FALSE] if (inherits(instance, "OptimInstanceBatchMultiCrit")) { - ydt = res[, instance$archive$cols_y, with = FALSE] - instance$assign_result(xdt, ydt) + ydt = xydt[, instance$archive$cols_y, with = FALSE] + instance$assign_result(xdt, ydt, xydt = xydt) } else { - y = unlist(res[, instance$archive$cols_y, with = FALSE]) - instance$assign_result(xdt, y) + y = unlist(xydt[, instance$archive$cols_y, with = FALSE]) + instance$assign_result(xdt, y, xydt = xydt) } } ), diff --git a/R/ResultAssignerSurrogate.R b/R/ResultAssignerSurrogate.R index 0bf824a3..4870947a 100644 --- a/R/ResultAssignerSurrogate.R +++ b/R/ResultAssignerSurrogate.R @@ -59,7 +59,8 @@ ResultAssignerSurrogate = R6Class("ResultAssignerSurrogate", } archive_tmp = archive$clone(deep = TRUE) archive_tmp$data[, self$surrogate$cols_y := means] - best = archive_tmp$best()[, archive_tmp$cols_x, with = FALSE] + xydt = archive_tmp$best() + best = xydt[, archive_tmp$cols_x, with = FALSE] # ys are still the ones originally evaluated best_y = if (inherits(instance, "OptimInstanceBatchSingleCrit")) { @@ -67,7 +68,7 @@ ResultAssignerSurrogate = R6Class("ResultAssignerSurrogate", } else if (inherits(instance, "OptimInstanceBatchMultiCrit")) { archive$data[best, on = archive$cols_x][, archive$cols_y, with = FALSE] } - instance$assign_result(xdt = best, best_y) + instance$assign_result(xdt = best, best_y, xydt = xydt) } ), diff --git a/tests/testthat/test_ResultAssignerArchive.R b/tests/testthat/test_ResultAssignerArchive.R index c5abb171..0ce9ca38 100644 --- a/tests/testthat/test_ResultAssignerArchive.R +++ b/tests/testthat/test_ResultAssignerArchive.R @@ -54,3 +54,31 @@ test_that("ResultAssignerArchive works with OptimizerMbo and bayesopt_smsego", { expect_data_table(instance$result, min.rows = 1L) }) +test_that("ResultAssignerArchive passes internal tuned values", { + result_assigner = ResultAssignerArchive$new() + + learner = lrn("classif.debug", + validate = 0.2, + early_stopping = TRUE, + x = to_tune(0.2, 0.3), + iter = to_tune(upper = 1000, internal = TRUE, aggr = function(x) 99)) + + instance = ti( + task = tsk("pima"), + learner = learner, + resampling = rsmp("cv", folds = 3), + measures = msr("classif.ce"), + terminator = trm("evals", n_evals = 20), + store_benchmark_result = TRUE + ) + surrogate = SurrogateLearner$new(REGR_KM_DETERM) + acq_function = AcqFunctionEI$new() + acq_optimizer = AcqOptimizer$new(opt("random_search", batch_size = 2L), terminator = trm("evals", n_evals = 2L)) + + tuner = tnr("mbo", result_assigner = result_assigner) + expect_data_table(tuner$optimize(instance), nrows = 1) + expect_list(instance$archive$data$internal_tuned_values, len = 20, types = "list") + expect_equal(instance$archive$data$internal_tuned_values[[1]], list(iter = 99)) + expect_false(instance$result_learner_param_vals$early_stopping) + expect_equal(instance$result_learner_param_vals$iter, 99) +}) diff --git a/tests/testthat/test_ResultAssignerSurrogate.R b/tests/testthat/test_ResultAssignerSurrogate.R index b43c1e39..868b5c21 100644 --- a/tests/testthat/test_ResultAssignerSurrogate.R +++ b/tests/testthat/test_ResultAssignerSurrogate.R @@ -85,3 +85,31 @@ test_that("ResultAssignerSurrogate works with OptimizerMbo and bayesopt_smsego", expect_data_table(instance$result, min.rows = 1L) }) +test_that("ResultAssignerSurrogate passes internal tuned values", { + result_assigner = ResultAssignerSurrogate$new() + + learner = lrn("classif.debug", + validate = 0.2, + early_stopping = TRUE, + x = to_tune(0.2, 0.3), + iter = to_tune(upper = 1000, internal = TRUE, aggr = function(x) 99)) + + instance = ti( + task = tsk("pima"), + learner = learner, + resampling = rsmp("cv", folds = 3), + measures = msr("classif.ce"), + terminator = trm("evals", n_evals = 20), + store_benchmark_result = TRUE + ) + surrogate = SurrogateLearner$new(REGR_KM_DETERM) + acq_function = AcqFunctionEI$new() + acq_optimizer = AcqOptimizer$new(opt("random_search", batch_size = 2L), terminator = trm("evals", n_evals = 2L)) + + tuner = tnr("mbo", result_assigner = result_assigner) + expect_data_table(tuner$optimize(instance), nrows = 1) + expect_list(instance$archive$data$internal_tuned_values, len = 20, types = "list") + expect_equal(instance$archive$data$internal_tuned_values[[1]], list(iter = 99)) + expect_false(instance$result_learner_param_vals$early_stopping) + expect_equal(instance$result_learner_param_vals$iter, 99) +})