to_tune() creates a TuneToken object which can be assigned to the $values slot of a ParamSet as an alternative to a concrete value. This indicates that the value is not given directly but should be tuned using bbotk or mlr3tuning. If the thus parameterized object is invoked directly, without being wrapped by or given to a tuner, it will give an error.

The tuning range ParamSet that is constructed from the TuneToken values in a ParamSet's $values slot can be accessed through the ParamSet$search_space() method. This is done automatically by tuners if no tuning range is given, but it is also possible to access the $search_space() method, modify it further, and give the modified ParamSet to a tuning function (or do anything else with it, nobody is judging you).

A TuneToken represents the range over which the parameter whose $values slot it occupies should be tuned over. It can be constructed via the to_tune() function in one of several ways:

  • to_tune(): Indicates a parameter should be tuned over its entire range. Only applies to finite parameters (i.e. discrete or bounded numeric parameters)

  • to_tune(lower, upper): Indicates a numeric parameter should be tuned in the inclusive interval spanning lower to upper. Depending on the parameter, integer (if it is a ParamInt) or real values (if it is a ParamDbl) are used.

  • to_tune(levels): Indicates a parameter should be tuned through the given discrete values. levels can be any named or unnamed atomic vector or list (although in the unnamed case it must be possible to construct a corresponding character vector with distinct values using as.character).

  • to_tune(<Domain>): The given Domain object (constructed e.g. with p_int() or p_fct()) indicates the range which should be tuned over. The supplied trafo function is used for parameter transformation.

  • to_tune(<Param>): The given Param object indicates the range which should be tuned over.

  • to_tune(<ParamSet>): The given ParamSet is used to tune over a single Param. This is useful for cases where a single evaluation-time parameter value (e.g. ParamUty) is constructed from multiple tuner-visible parameters (which may not be ParamUty). The supplied ParamSet should always contain a $trafo function, which must always return a list with a single entry.

The TuneToken object's internals are subject to change and should not be relied upon. TuneToken objects should only be constructed via to_tune(), and should only be used by giving them to $values of a ParamSet.

to_tune(...)

Arguments

...

if given, restricts the range to be tuning over, as described above.

Value

A TuneToken object.

See also

Other ParamSet construction helpers: Domain, ps()

Examples

params = ParamSet$new(list( ParamInt$new("int", 0, 10), ParamInt$new("int_unbounded"), ParamDbl$new("dbl", 0, 10), ParamDbl$new("dbl_unbounded"), ParamFct$new("fct", c("a", "b", "c")), ParamUty$new("uty1"), ParamUty$new("uty2"), ParamUty$new("uty3"), ParamUty$new("uty4"), ParamUty$new("uty5") )) params$values = list( # tune over entire range of `int`, 0..10: int = to_tune(), # tune over 2..7: int_unbounded = to_tune(2, 7), # tune on a log scale in range 1..10: # (you have to make sure exp(log(x)) does not overstep boundaries because # of rounding errors; unfortunately paradox is your enemy here.) dbl = to_tune(p_dbl(log(1 + 1e-10), log(10 - 1e-10), trafo = exp)), # nothing keeps us from tuning a dbl over integer values dbl_unbounded = to_tune(p_int(1, 10)), # tune over values "a" and "b" only fct = to_tune(c("a", "b")), # tune over integers 2..8. # ParamUty needs type information in form of p_xxx() in to_tune. uty1 = to_tune(p_int(2, 8)), # tune uty2 like a factor, trying 1, 10, and 100: uty2 = to_tune(c(1, 10, 100)), # tune uty3 like a factor. The factor levels are the names of the list # ("exp", "square"), but the trafo will generate the values from the list. # This way you can tune an objective that has function-valued inputs. uty3 = to_tune(list(exp = exp, square = function(x) x^2)), # tune through multiple parameters. When doing this, the ParamSet in tune() # must have the trafo that generates a list with one element and the right # name: uty4 = to_tune(ps( base = p_dbl(0, 1), exp = p_int(0, 3), .extra_trafo = function(x, param_set) { list(uty4 = x$base ^ x$exp) } )), # not all values need to be tuned! uty5 = 100 ) print(params$values)
#> $int #> Tuning over: #> <entire parameter range> #> #> $int_unbounded #> Tuning over: #> range [2, 7] #> #> #> $dbl #> Tuning over: #> p_dbl(lower = 1.00000008269037e-10, upper = 2.30258509298405, #> trafo = exp) #> #> $dbl_unbounded #> Tuning over: #> p_int(lower = 1, upper = 10) #> #> $fct #> Tuning over: #> p_fct(levels = c("a", "b")) #> #> $uty1 #> Tuning over: #> p_int(lower = 2, upper = 8) #> #> $uty2 #> Tuning over: #> p_fct(levels = c("1", "10", "100")) #> #> $uty3 #> Tuning over: #> p_fct(levels = c("exp", "square")) #> #> $uty4 #> Tuning over: #> <ParamSet> #> id class lower upper levels default value #> 1: base ParamDbl 0 1 <NoDefault[3]> #> 2: exp ParamInt 0 3 <NoDefault[3]> #> Trafo is set. #> #> $uty5 #> [1] 100 #>
print(params$search_space())
#> <ParamSet> #> id class lower upper levels default value #> 1: int ParamInt 0e+00 10.000000 <NoDefault[3]> #> 2: int_unbounded ParamInt 2e+00 7.000000 <NoDefault[3]> #> 3: dbl ParamDbl 1e-10 2.302585 <NoDefault[3]> #> 4: dbl_unbounded ParamInt 1e+00 10.000000 <NoDefault[3]> #> 5: fct ParamFct NA NA a,b <NoDefault[3]> #> 6: uty1 ParamInt 2e+00 8.000000 <NoDefault[3]> #> 7: uty2 ParamFct NA NA 1,10,100 <NoDefault[3]> #> 8: uty3 ParamFct NA NA exp,square <NoDefault[3]> #> 9: base ParamDbl 0e+00 1.000000 <NoDefault[3]> #> 10: exp ParamInt 0e+00 3.000000 <NoDefault[3]> #> Trafo is set.
# Change `$values` directly and generate new `$search_space()` to play around params$values$uty3 = 8 params$values$uty2 = to_tune(c(2, 4, 8)) print(params$search_space())
#> <ParamSet> #> id class lower upper levels default value #> 1: int ParamInt 0e+00 10.000000 <NoDefault[3]> #> 2: int_unbounded ParamInt 2e+00 7.000000 <NoDefault[3]> #> 3: dbl ParamDbl 1e-10 2.302585 <NoDefault[3]> #> 4: dbl_unbounded ParamInt 1e+00 10.000000 <NoDefault[3]> #> 5: fct ParamFct NA NA a,b <NoDefault[3]> #> 6: uty1 ParamInt 2e+00 8.000000 <NoDefault[3]> #> 7: uty2 ParamFct NA NA 2,4,8 <NoDefault[3]> #> 8: base ParamDbl 0e+00 1.000000 <NoDefault[3]> #> 9: exp ParamInt 0e+00 3.000000 <NoDefault[3]> #> Trafo is set.