From 2cf3185a27ec27a24e7d90d081a05568265abec2 Mon Sep 17 00:00:00 2001 From: Marc Becker <33069354+be-marc@users.noreply.github.com> Date: Tue, 15 Oct 2024 09:32:47 +0200 Subject: [PATCH] feat: pass additional information in result to instance (#255) --- R/OptimInstance.R | 4 +++- R/Optimizer.R | 15 +++++++-------- man/OptimInstance.Rd | 5 ++++- .../test_TerminatorStagnationHypervolume.R | 2 ++ 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/R/OptimInstance.R b/R/OptimInstance.R index 0ff08c8d..1ce8e468 100644 --- a/R/OptimInstance.R +++ b/R/OptimInstance.R @@ -107,7 +107,9 @@ OptimInstance = R6Class("OptimInstance", #' columns for extra information. #' @param y (`numeric(1)`)\cr #' Optimal outcome. - assign_result = function(xdt, y) { + #' @param ... (`any`)\cr + #' ignored. + assign_result = function(xdt, y, ...) { stop("Abstract class") }, diff --git a/R/Optimizer.R b/R/Optimizer.R index b81db536..5102b6b6 100644 --- a/R/Optimizer.R +++ b/R/Optimizer.R @@ -166,19 +166,18 @@ Optimizer = R6Class("Optimizer", assign_result_default = function(inst) { assert_r6(inst, "OptimInstance") - res = inst$archive$best() + xydt = inst$archive$best() ids = inst$search_space$ids() - # workaround until ... works - if ("internal_tuned_values" %in% names(res)) ids = c(ids, "internal_tuned_values") - xdt = res[, ids, with = FALSE] + xdt = xydt[, ids, with = FALSE] if (inherits(inst, "OptimInstanceBatchMultiCrit") || inherits(inst, "OptimInstanceAsyncMultiCrit")) { - ydt = res[, inst$archive$cols_y, with = FALSE] - inst$assign_result(xdt, ydt) + ydt = xydt[, inst$archive$cols_y, with = FALSE] + # upstream packages might extract extra columns from xydt + inst$assign_result(xdt, ydt, xydt = xydt) } else { # unlist keeps name! - y = unlist(res[, inst$archive$cols_y, with = FALSE]) - inst$assign_result(xdt, y) + y = unlist(xydt[, inst$archive$cols_y, with = FALSE]) + inst$assign_result(xdt, y, xydt = xydt) } invisible(NULL) diff --git a/man/OptimInstance.Rd b/man/OptimInstance.Rd index e1b5381b..90bb285b 100644 --- a/man/OptimInstance.Rd +++ b/man/OptimInstance.Rd @@ -158,7 +158,7 @@ Printer. The \link{Optimizer} object writes the best found point and estimated performance value here. For internal use. \subsection{Usage}{ -\if{html}{\out{
}}\preformatted{OptimInstance$assign_result(xdt, y)}\if{html}{\out{
}} +\if{html}{\out{
}}\preformatted{OptimInstance$assign_result(xdt, y, ...)}\if{html}{\out{
}} } \subsection{Arguments}{ @@ -171,6 +171,9 @@ columns for extra information.} \item{\code{y}}{(\code{numeric(1)})\cr Optimal outcome.} + +\item{\code{...}}{(\code{any})\cr +ignored.} } \if{html}{\out{}} } diff --git a/tests/testthat/test_TerminatorStagnationHypervolume.R b/tests/testthat/test_TerminatorStagnationHypervolume.R index cb1fdc75..38a654ac 100644 --- a/tests/testthat/test_TerminatorStagnationHypervolume.R +++ b/tests/testthat/test_TerminatorStagnationHypervolume.R @@ -1,4 +1,6 @@ test_that("TerminatorStagnationHypervolume works", { + skip_if_not_installed("emoa") + terminator = trm("stagnation_hypervolume") terminator$param_set$values$iters = 5 terminator$param_set$values$threshold = 0