ParameterSet objects store parameters (prm objects) and add
internal validation checks and methods for:
Getting and setting parameter values
Transforming parameter values
Providing dependencies of parameters on each other
Tagging parameters, which may enable further properties
Storing subsets of parameters under prefixes
tagsNone -> named_list()
Get tags from the parameter set.
idsNone -> character()
Get ids from the parameter set.
lengthNone -> integer(1)
Get the length of the parameter set as the number of parameters.
depsNone -> data.table::data.table Get parameter dependencies, NULL if none.
supportsNone -> named_list()
Get supports from the parameter set.
tag_propertieslist() -> self / None -> list()
If x is missing then returns tag properties if any.
If x is not missing then used to tag properties. Currently properties
can either be:
i) 'required' - parameters with this tag must have set (non-NULL)
values; if a parameter is both 'required' and 'linked' then exactly
one parameter in the 'linked' tag must be tagged;
ii) 'linked' - parameters with 'linked' tags are dependent on one another
and only one can be set (non-NULL at a time);
iii) 'unique' - parameters with this tag must have no duplicated
elements, therefore this tag only makes sense for vector parameters;
iv) 'immutable' - parameters with this tag cannot be updated after
construction.
valueslist() -> self / None -> list()
If x is missing then returns the set (non-NULL) values without
transformation or filtering; use $get_values for a more sophisticated
getter of values.
If x is not missing then used to set values of parameters, which are
first checked internally with the $check method before setting the new
values.
See examples at end.
trafofunction()|list() -> self / None -> function()|list()
If x is missing then returns a transformation function if previously
set, a list of transformation functions, otherwise NULL.
If x is not missing then it should either be:
a function with arguments x and self, which internally correspond
to self being the ParameterSet the transformation is being added to,
and x <- self$values.
a list of functions like above
The transformation function is automatically called after a call to
self$get_values() and is used to transform set values, it should
therefore result in a list. If using self$get_values() within the
transformation function, make sure to set transform = FALSE to prevent
infinite recursion, see examples at end.
It is generally safer to call the transformation with
$transform(self$values) as this will first check to see if $trafo
is a function or list. If the latter then each function in the list is
applied, one after the other.
new()Constructs a ParameterSet object.
ParameterSet$new(prms = list(), tag_properties = NULL)prmstag_properties(list())
List of tag properties. Currently supported properties are: i) 'required' -
parameters with this tag property must be non-NULL; ii) 'linked' - only one
parameter in a linked tag group can be non-NULL and the others should be
NULL, this only makes sense with an associated trafo; iii) 'unique' -
parameters with this tag must have no duplicated elements, only makes sense
for vector parameters; iv) 'immutable' - parameters with this tag cannot be
updated after construction.
print()Prints the ParameterSet after coercion with
as.data.table.ParameterSet.
get_values()Gets values from the ParameterSet with options to filter
by specific IDs and tags, and also to transform the values.
ParameterSet$get_values(
id = NULL,
tags = NULL,
transform = TRUE,
inc_null = TRUE,
simplify = TRUE
)id(character())
If not NULL then returns values for given ids.
tags(character())
If not NULL then returns values for given tags.
transform(logical(1))
If TRUE (default) and $trafo is not NULL then runs the set
transformation function before returning the values.
inc_null(logical(1))
If TRUE (default) then returns values for all ids even if NULL.
simplify(logical(1))
If TRUE (default) then unlists scalar values, otherwise always
returns a list.
add_dep()Gets values from the ParameterSet with options to filter
by specific IDs and tags, and also to transform the values.
id(character(1))
The dependent variable for the condition that depends on the given
variable, on, being a particular value. Should be in self$ids.
on(character(1))
The independent variable for the condition that is depended on by the
given variable, id. Should be in self$ids.
cnd(cnd(1))
The condition defined by cnd which determines how id depends on on.
# not run as errors
\dontrun{
# Dependency on specific value
prms <- list(
prm("a", "reals", NULL),
prm("b", "reals", 1)
)
p <- ParameterSet$new(prms)
p$add_dep("a", "b", cnd("eq", 2))
# 'a' can only be set if 'b' equals 2
p$values$a <- 1
p$values <- list(a = 1, b = 2)
# Dependency on variable value
prms <- list(
prm("a", "reals", NULL),
prm("b", "reals", 1)
)
p <- ParameterSet$new(prms)
p$add_dep("a", "b", cnd("eq", id = "b"))
# 'a' can only be set if it equals 'b'
p$values$a <- 2
p$values <- list(a = 2, b = 2)
}
rep()Replicate the ParameterSet with identical parameters.
In order to avoid duplicated parameter ids, every id in the
ParameterSet is given a prefix in the format prefix__id. In
addition, linked tags are also given the same prefix to prevent
incorrectly linking parameters.
The primary use-case of this method is to treat the ParameterSet as a
collection of identical ParameterSet objects.
Note that this mutates the ParameterSet, if you want to instead create
a new object then use rep.ParameterSet instead (or copy and deep clone)
first.
extract()Creates a new ParameterSet by extracting the given
parameters.
id(character())
If not NULL then specifies the parameters by id to extract. Should be
NULL if prefix is not NULL.
tags(character())
If not NULL then specifies the parameters by tag to extract. Should be
NULL if prefix is not NULL.
prefix(character())
If not NULL then extracts parameters according to their prefix and
additionally removes the prefix from the id. A prefix is determined as
the string before "__" in an id.
# extract by id
prms <- list(
prm("a", "reals", NULL),
prm("b", "reals", 1)
)
p <- ParameterSet$new(prms)
p$extract("a")
# equivalently
p["a"]
# extract by prefix
prms <- list(
prm("Pre1__par1", Set$new(1), 1, tags = "t1"),
prm("Pre1__par2", "reals", 3, tags = "t2"),
prm("Pre2__par1", Set$new(1), 1, tags = "t1"),
prm("Pre2__par2", "reals", 3, tags = "t2")
)
p <- ParameterSet$new(prms)
p$extract(tags = "t1")
p$extract(prefix = "Pre1")
# equivalently
p[prefix = "Pre1"]remove()Removes the given parameters from the set.
id(character())
If not NULL then specifies the parameters by id to extract. Should be
NULL if prefix is not NULL.
prefix(character())
If not NULL then extracts parameters according to their prefix and
additionally removes the prefix from the id. A prefix is determined as
the string before "__" in an id.
getParameterValue()Deprecated method added for distr6 compatibility. Use $values/$get_values() in the future. Will be removed in 0.3.0.
setParameterValue()Deprecated method added for distr6 compatibility. Use $set_values in the future. Will be removed in 0.3.0.
ParameterSet$setParameterValue(..., lst = list(...))set_values()Convenience function for setting multiple parameters without changing or accidentally removing others.
ParameterSet$set_values(..., lst = list(...))parameters()Deprecated method added for distr6 compatibility. Use $print/as.data.table() in the future. Will be removed in 0.3.0.
transform()Applies the internal transformation function.
If no function has been passed to $trafo then x is returned
unchanged. If $trafo is a function then x is passed directly to
this. If $trafo is a list then x is evaluated and passed down the
list iteratively.
library(set6)
## $value examples
p <- ParameterSet$new(list(prm(id = "a", support = Reals$new())))
p$values$a <- 2
p$values
#> $a
#> [1] 2
#>
## $trafo examples
p <- ParameterSet$new(list(prm(id = "a", 2, support = Reals$new())))
p$trafo
#> NULL
# simple transformation
p$get_values()
#> [1] 2
p$trafo <- function(x, self) {
x$a <- exp(x$a)
x
}
p$get_values()
#> [1] 7.389056
# more complex transformation on tags
p <- ParameterSet$new(
list(prm(id = "a", 2, support = Reals$new(), tags = "t1"),
prm(id = "b", 3, support = Reals$new(), tags = "t1"),
prm(id = "d", 4, support = Reals$new()))
)
# make sure `transform = FALSE` to prevent infinite recursion
p$trafo <- function(x, self) {
out <- lapply(self$get_values(tags = "t1", transform = FALSE),
function(.x) 2^.x)
out <- c(out, list(d = x$d))
out
}
p$get_values()
#> $a
#> [1] 4
#>
#> $b
#> [1] 8
#>
#> $d
#> [1] 4
#>
## ------------------------------------------------
## Method `ParameterSet$new`
## ------------------------------------------------
prms <- list(
prm("a", Set$new(1), 1, tags = "t1"),
prm("b", "reals", 1.5, tags = "t1"),
prm("d", "reals", 2, tags = "t2")
)
ParameterSet$new(prms)
#> Id Support Value Tags
#> 1: a {1} 1 t1
#> 2: b ℝ 1.5 t1
#> 3: d ℝ 2 t2
## ------------------------------------------------
## Method `ParameterSet$print`
## ------------------------------------------------
prms <- list(
prm("a", Set$new(1), 1, tags = "t1"),
prm("b", "reals", 1.5, tags = "t1"),
prm("d", "reals", 2, tags = "t2")
)
p <- ParameterSet$new(prms)
p$print()
#> Id Support Value Tags
#> 1: a {1} 1 t1
#> 2: b ℝ 1.5 t1
#> 3: d ℝ 2 t2
print(p)
#> Id Support Value Tags
#> 1: a {1} 1 t1
#> 2: b ℝ 1.5 t1
#> 3: d ℝ 2 t2
p
#> Id Support Value Tags
#> 1: a {1} 1 t1
#> 2: b ℝ 1.5 t1
#> 3: d ℝ 2 t2
## ------------------------------------------------
## Method `ParameterSet$get_values`
## ------------------------------------------------
prms <- list(
prm("a", "reals", 1, tags = "t1"),
prm("b", "reals", 1.5, tags = "t1"),
prm("d", "reals", tags = "t2")
)
p <- ParameterSet$new(prms)
p$trafo <- function(x, self) {
x$a <- exp(x$a)
x
}
p$get_values()
#> $a
#> [1] 2.718282
#>
#> $b
#> [1] 1.5
#>
#> $d
#> NULL
#>
p$get_values(inc_null = FALSE)
#> $a
#> [1] 2.718282
#>
#> $b
#> [1] 1.5
#>
p$get_values(id = "a")
#> [1] 2.718282
p$get_values(tags = "t1")
#> $a
#> [1] 2.718282
#>
#> $b
#> [1] 1.5
#>
## ------------------------------------------------
## Method `ParameterSet$add_dep`
## ------------------------------------------------
# not run as errors
if (FALSE) {
# Dependency on specific value
prms <- list(
prm("a", "reals", NULL),
prm("b", "reals", 1)
)
p <- ParameterSet$new(prms)
p$add_dep("a", "b", cnd("eq", 2))
# 'a' can only be set if 'b' equals 2
p$values$a <- 1
p$values <- list(a = 1, b = 2)
# Dependency on variable value
prms <- list(
prm("a", "reals", NULL),
prm("b", "reals", 1)
)
p <- ParameterSet$new(prms)
p$add_dep("a", "b", cnd("eq", id = "b"))
# 'a' can only be set if it equals 'b'
p$values$a <- 2
p$values <- list(a = 2, b = 2)
}
## ------------------------------------------------
## Method `ParameterSet$extract`
## ------------------------------------------------
# extract by id
prms <- list(
prm("a", "reals", NULL),
prm("b", "reals", 1)
)
p <- ParameterSet$new(prms)
p$extract("a")
#> Id Support Value Tags
#> 1: a ℝ
# equivalently
p["a"]
#> Id Support Value Tags
#> 1: a ℝ
# extract by prefix
prms <- list(
prm("Pre1__par1", Set$new(1), 1, tags = "t1"),
prm("Pre1__par2", "reals", 3, tags = "t2"),
prm("Pre2__par1", Set$new(1), 1, tags = "t1"),
prm("Pre2__par2", "reals", 3, tags = "t2")
)
p <- ParameterSet$new(prms)
p$extract(tags = "t1")
#> Id Support Value Tags
#> 1: Pre1__par1 {1} 1 t1
#> 2: Pre2__par1 {1} 1 t1
p$extract(prefix = "Pre1")
#> Id Support Value Tags
#> 1: par1 {1} 1 t1
#> 2: par2 ℝ 3 t2
# equivalently
p[prefix = "Pre1"]
#> Id Support Value Tags
#> 1: par1 {1} 1 t1
#> 2: par2 ℝ 3 t2