Skip to content

Commit 6a6db9b

Browse files
committed
handle multiple noisy instances
1 parent 10e4734 commit 6a6db9b

11 files changed

+154
-5
lines changed

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export(renderExampleRunPlot)
5656
export(setMBOControlInfill)
5757
export(setMBOControlMultiObj)
5858
export(setMBOControlMultiPoint)
59+
export(setMBOControlNoisy)
5960
export(setMBOControlTermination)
6061
export(trafoLog)
6162
export(trafoSqrt)

R/evalTargetFun.R

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,30 @@ evalTargetFun.OptState = function(opt.state, xs, extras) {
2525
# short names and so on
2626
nevals = length(xs)
2727
ny = control$n.objectives
28+
29+
# trafo X points
30+
xs.trafo = lapply(xs, trafoValue, par = par.set)
31+
32+
# handle noisy instances
33+
if (isTRUE(control$noisy.instances > 1L)) {
34+
nevals = nevals * control$noisy.instances
35+
xs = rep(xs, each = control$noisy.instances)
36+
extras = rep(extras, each = control$noisy.instances)
37+
if (!control$noisy.self.replicating) {
38+
xs.trafo = rep(xs.trafo, each = control$noisy.instances)
39+
if (!is.na(control$noisy.instance.param)) {
40+
inst.param = lapply(seq_len(control$noisy.instances), function(x) setNames(list(x), control$noisy.instance.param))
41+
xs.trafo = Map(c, xs.trafo, inst.param)
42+
}
43+
}
44+
}
45+
46+
2847
num.format = control$output.num.format
2948
num.format.string = paste("%s = ", num.format, sep = "")
3049
dobs = ensureVector(asInteger(getOptStateLoop(opt.state)), n = nevals, cl = "integer")
3150
imputeY = control$impute.y.fun
3251

33-
# trafo X points
34-
xs.trafo = lapply(xs, trafoValue, par = par.set)
3552

3653
# function to measure of fun call
3754
wrapFun = function(x) {
@@ -43,6 +60,9 @@ evalTargetFun.OptState = function(opt.state, xs, extras) {
4360
user.extras = attr(y, "extras")
4461
y = setAttribute(y, "extras", NULL)
4562
}
63+
if (!is.null(control$noisy.instance.param) && !is.na(control$noisy.instance.param) && !control$noisy.self.replicating) {
64+
user.extras = c(user.extras, x[control$noisy.instance.param])
65+
}
4666
st = proc.time() - st
4767
list(y = y, time = st[3], user.extras = user.extras)
4868
}
@@ -56,6 +76,17 @@ evalTargetFun.OptState = function(opt.state, xs, extras) {
5676
res = parallelMap(wrapFun, xs.trafo, level = "mlrMBO.feval",
5777
impute.error = if (is.null(imputeY)) NULL else identity)
5878

79+
# handle noisy instances of self.replicating functions
80+
if (isTRUE(control$noisy.instances > 1L) && control$noisy.self.replicating) {
81+
xs.trafo = rep(xs.trafo, each = control$noisy.instances)
82+
res = lapply(res, function(r) {
83+
lapply(seq_along(r$y), function(i) {
84+
list(y = r$y[i], time = r$time / length(r$y), user.extras = c(r$user.extras, setNames(list(i), control$noisy.instance.param)))
85+
})
86+
})
87+
res = unlist(res, recursive = FALSE)
88+
}
89+
5990
# loop evals and to some post-processing
6091
for (i in seq_len(nevals)) {
6192
r = res[[i]]; x = xs[[i]]; x.trafo = xs.trafo[[i]]; dob = dobs[i]

R/setMBOControlNoisy.R

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#' @title Set multipoint proposal options.
2+
#' @description
3+
#' Extends an MBO control object with options for multipoint proposal.
4+
#' @template arg_control
5+
#' @param instances [\code{integer(1)}]\cr
6+
#' How many instances of one parameter will be calculated?
7+
#' @param instance.param [\code{character(1)}]\cr
8+
#' What is the name of the function param that defines the instance?
9+
#' @param self.replicating [\code{logical(1)}]\cr
10+
#' TRUE if the function returns a vector of noisy results for one input. Then \code{instances} specifies the length of the result we expect.
11+
#' @return [\code{\link{MBOControl}}].
12+
#' @family MBOControl
13+
#' @export
14+
setMBOControlNoisy = function(control,
15+
instances = NULL,
16+
instance.param = NULL,
17+
self.replicating = NULL) {
18+
19+
assertClass(control, "MBOControl")
20+
21+
control$noisy.instances = assertInt(instances, lower = 1L, null.ok = TRUE, na.ok = FALSE) %??% control$noisy.instances
22+
control$noisy.self.replicating = assertFlag(self.replicating, null.ok = TRUE, na.ok = FALSE) %??% control$noisy.self.replicating %??% FALSE
23+
control$noisy.instance.param = assertString(instance.param, null.ok = TRUE, na.ok = TRUE) %??% control$noisy.instance.param %??% ifelse(control$noisy.self.replicating, "noisy.repl", NA_character_)
24+
25+
if (control$noisy.self.replicating && control$noisy.instance.param != "noisy.repl") {
26+
stop("You can not change the instance.param for self replicating functions.")
27+
}
28+
29+
return(control)
30+
}

man/makeMBOControl.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/setMBOControlInfill.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/setMBOControlMultiObj.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/setMBOControlMultiPoint.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/setMBOControlNoisy.Rd

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/setMBOControlTermination.Rd

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test_mbo_km.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
context("mbo km")
1+
context("mbo noisy")
22

3-
test_that("mbo works with km", {
3+
test_that("mbo works with multiple instances of noisy problems", {
44
des = testd.fsphere.2d
55
des$y = apply(des, 1, testf.fsphere.2d)
66
learner = makeLearner("regr.km", nugget.estim = TRUE)

0 commit comments

Comments
 (0)