Skip to content

Commit e8cd5bd

Browse files
committed
simplify the whole stuff, remove manual noisy instances
1 parent 6e35606 commit e8cd5bd

File tree

3 files changed

+52
-56
lines changed

3 files changed

+52
-56
lines changed

DESCRIPTION

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,5 @@ LazyData: yes
6161
Encoding: UTF-8
6262
ByteCompile: yes
6363
Version: 1.1.3
64-
RoxygenNote: 6.0.1
64+
RoxygenNote: 6.1.1
6565
VignetteBuilder: knitr

R/evalTargetFun.R

+48-40
Original file line numberDiff line numberDiff line change
@@ -25,60 +25,65 @@ evalTargetFun.OptState = function(opt.state, xs, extras) {
2525
# short names and so on
2626
nevals = length(xs)
2727
ny = control$n.objectives
28+
imputeY = control$impute.y.fun
2829

2930
# trafo X points
3031
xs.trafo = lapply(xs, trafoValue, par = par.set)
3132

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-
47-
num.format = control$output.num.format
48-
num.format.string = paste("%s = ", num.format, sep = "")
49-
dobs = ensureVector(asInteger(getOptStateLoop(opt.state)), n = nevals, cl = "integer")
50-
imputeY = control$impute.y.fun
51-
52-
5333
# function to measure of fun call
54-
wrapFun = function(x) {
55-
st = proc.time()
56-
y = do.call(getOptProblemFun(opt.problem), insert(list(x = x), getOptProblemMoreArgs(opt.problem)))
57-
user.extras = list()
34+
wrapFun = function(x) {
35+
st = proc.time()
36+
y = do.call(getOptProblemFun(opt.problem), insert(list(x = x), getOptProblemMoreArgs(opt.problem)))
37+
user.extras = list()
5838
# here we extract additional stuff which the user wants to log in the opt path
59-
if (hasAttributes(y, "extras")) {
60-
user.extras = attr(y, "extras")
61-
y = setAttribute(y, "extras", NULL)
62-
}
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-
}
66-
st = proc.time() - st
67-
list(y = y, time = st[3], user.extras = user.extras)
39+
if (hasAttributes(y, "extras")) {
40+
user.extras = attr(y, "extras")
41+
y = setAttribute(y, "extras", NULL)
42+
}
43+
if (!is.null(control$noisy.instance.param) && !is.na(control$noisy.instance.param) && !control$noisy.self.replicating) {
44+
user.extras = c(user.extras, x[control$noisy.instance.param])
6845
}
46+
st = proc.time() - st
47+
list(y = y, time = st[3], user.extras = user.extras)
48+
}
6949

7050
# do we have a valid y object?
7151
isYValid = function(y) {
72-
!is.error(y) && testNumeric(y, len = ny, any.missing = FALSE, finite = TRUE)
52+
if (!isTRUE(control$noisy.self.replicating)) {
53+
len = NULL
54+
} else {
55+
len = ny
56+
}
57+
!is.error(y) && testNumeric(y, len = len, any.missing = FALSE, finite = TRUE)
7358
}
7459

7560
# return error objects if we impute
76-
res = parallelMap(wrapFun, xs.trafo, level = "mlrMBO.feval",
77-
impute.error = if (is.null(imputeY)) NULL else identity)
61+
res = parallelMap(wrapFun, xs.trafo, level = "mlrMBO.feval", impute.error = if (is.null(imputeY)) NULL else identity)
62+
63+
# handle noisy instances
64+
if (isTRUE(control$noisy.self.replicating)) {
65+
nevals.each = lengths(extractSubList(res, "y", simplify = FALSE))
66+
nevals = sum(nevals.each)
67+
68+
# replications for opt path stuff
69+
repVec = function(x, fun = replicate) {
70+
unlist(Map(fun, nevals.each, x, simplify = FALSE), recursive = FALSE)
71+
}
72+
xs = repVec(xs)
73+
xs.trafo = repVec(xs.trafo)
74+
75+
#set extras to NA that are only important for the first point
76+
setNAfun = function(n, xs, ...) {
77+
res = replicate(n = n, expr = xs, ...)
78+
res[-1] = lapply(res[-1], function(x) {
79+
x[c("train.time", "error.model", "propose.time")] = NA
80+
x
81+
})
82+
res
83+
}
84+
extras = repVec(extras, setNAfun)
7885

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)
86+
# handle result list
8287
res = lapply(res, function(r) {
8388
if (is.error(r)) {
8489
rep(list(r), control$noisy.instances)
@@ -91,6 +96,9 @@ evalTargetFun.OptState = function(opt.state, xs, extras) {
9196
res = unlist(res, recursive = FALSE)
9297
}
9398

99+
num.format.string = paste("%s = ", control$output.num.format, sep = "")
100+
dobs = ensureVector(asInteger(getOptStateLoop(opt.state)), n = nevals, cl = "integer")
101+
94102
# loop evals and to some post-processing
95103
for (i in seq_len(nevals)) {
96104
r = res[[i]]; x = xs[[i]]; x.trafo = xs.trafo[[i]]; dob = dobs[i]

R/setMBOControlNoisy.R

+3-15
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,17 @@
22
#' @description
33
#' Extends an MBO control object with options for multipoint proposal.
44
#' @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?
95
#' @param self.replicating [\code{logical(1)}]\cr
106
#' TRUE if the function returns a vector of noisy results for one input. Then \code{instances} specifies the length of the result we expect.
117
#' @return [\code{\link{MBOControl}}].
128
#' @family MBOControl
139
#' @export
14-
setMBOControlNoisy = function(control,
15-
instances = NULL,
16-
instance.param = NULL,
17-
self.replicating = NULL) {
10+
setMBOControlNoisy = function(control, self.replicating) {
1811

1912
assertClass(control, "MBOControl")
2013

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-
}
14+
control$noisy.self.replicating = assertFlag(self.replicating %??% control$noisy.self.replicating %??% TRUE, na.ok = FALSE)
15+
control$noisy.instance.param = "noisy.repl"
2816

2917
return(control)
3018
}

0 commit comments

Comments
 (0)