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
tags
None -> named_list()
Get tags from the parameter set.
ids
None -> character()
Get ids from the parameter set.
length
None -> integer(1)
Get the length of the parameter set as the number of parameters.
deps
None -> data.table::data.table Get parameter dependencies, NULL if none.
supports
None -> named_list()
Get supports from the parameter set.
tag_properties
list() -> 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.
values
list() -> 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.
trafo
function()|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)
prms
tag_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