The Objective object specifies the framework for an objective function
for numerical optimization.
Active bindings
objective_name[
character(1)]
The label for the objective function.fixed_arguments[
character(), read-only]
The name(s) of the fixed argument(s) (if any).seconds[
numeric(1)]
A time limit in seconds. Computations are interrupted prematurely ifsecondsis exceeded.No time limit if
seconds = Inf(the default).Note the limitations documented in
setTimeLimit.hide_warnings[
logical(1)]
Hide warnings when evaluating the objective function?verbose[
logical(1)]
Print status messages?npar[
integer(), read-only]
The length of each target argument.target[
character(), read-only]
The argument name(s) that get optimized.gradient_specified[
logical(1), read-only]
Whether a gradient function has been specified via$set_gradient().hessian_specified[
logical(1), read-only]
Whether a Hessian function has been specified via$set_hessian().
Methods
Method new()
Creates a new Objective object.
Usage
Objective$new(f, target = NULL, npar, ...)Arguments
f[
function]
Afunctionto be optimized.It is expected that
fhas at least onenumericargument.Further, it is expected that the return value of
fis of the structurenumeric(1), i.e. a singlenumericvalue.target[
character()]
The argument name(s) that get optimized.All target arguments must be
numeric.Can be
NULL(default), then the first function argument is selected.npar[
integer()]
The length of each target argument, i.e., the length(s) of thenumericvectorargument(s) specified bytarget....Optionally additional function arguments that are fixed during the optimization.
Method set_gradient()
Set a gradient function.
Usage
Objective$set_gradient(
gradient,
target = self$target,
npar = self$npar,
...,
.verbose = self$verbose
)Arguments
gradient[
function]
Afunctionthat computes the gradient of the objective functionf.It is expected that
gradienthas the same call asf, and thatgradientreturns anumericvectorof lengthself$npar.target[
character()]
The argument name(s) that get optimized.All target arguments must be
numeric.Can be
NULL(default), then the first function argument is selected.npar[
integer()]
The length of each target argument, i.e., the length(s) of thenumericvectorargument(s) specified bytarget....Optionally additional function arguments that are fixed during the optimization.
.verbose[
logical(1)]
Print status messages?
Method set_hessian()
Set a Hessian function.
Usage
Objective$set_hessian(
hessian,
target = self$target,
npar = self$npar,
...,
.verbose = self$verbose
)Arguments
hessian[
function]
Afunctionthat computes the Hessian of the objective functionf.It is expected that
hessianhas the same call asf, and thathessianreturns anumericmatrixof dimensionself$npartimesself$npar.target[
character()]
The argument name(s) that get optimized.All target arguments must be
numeric.Can be
NULL(default), then the first function argument is selected.npar[
integer()]
The length of each target argument, i.e., the length(s) of thenumericvectorargument(s) specified bytarget....Optionally additional function arguments that are fixed during the optimization.
.verbose[
logical(1)]
Print status messages?
Method evaluate()
Evaluate the objective function.
Usage
Objective$evaluate(
.at,
.negate = FALSE,
.gradient_as_attribute = FALSE,
.gradient_attribute_name = "gradient",
.gradient_numeric = FALSE,
.hessian_as_attribute = FALSE,
.hessian_attribute_name = "hessian",
.hessian_numeric = FALSE,
...
)Arguments
.at[
numeric()]
The values for the target argument(s), written in a single vector.Must be of length
sum(self$npar)..negate[
logical(1)]
Negate the function return value?.gradient_as_attribute[
logical(1)]
Add the value of the gradient function as an attribute to the output?The attribute name is defined via the
.gradient_attribute_nameargument.Ignored if
$gradient_specifiedand.gradient_numericareFALSE..gradient_attribute_name[
character(1)]
Only relevant if.gradient_as_attribute = TRUE.In that case, the attribute name for the gradient (if available).
.gradient_numeric[
logical(1)]
Calculate the gradient via the numerical approximationgrad?.hessian_as_attribute[
logical(1)]
Add the value of the Hessian function as an attribute to the output?The attribute name is defined via the
.hessian_attribute_nameargument.Ignored if
$hessian_specifiedandhessian_numericareFALSE..hessian_attribute_name[
character(1)]
Only relevant if.hessian_as_attribute = TRUE.In that case, the attribute name for the Hessian (if available).
.hessian_numeric[
logical(1)]
Calculate the Hessian via the numerical approximationhessian?...Optionally additional function arguments that are fixed during the optimization.
Method evaluate_gradient()
Evaluate the gradient function.
Arguments
.at[
numeric()]
The values for the target argument(s), written in a single vector.Must be of length
sum(self$npar)..negate[
logical(1)]
Negate the function return value?...Optionally additional function arguments that are fixed during the optimization.
Method evaluate_gradient_numeric()
Evaluate the numerical gradient grad.
Arguments
.at[
numeric()]
The values for the target argument(s), written in a single vector.Must be of length
sum(self$npar)..negate[
logical(1)]
Negate the function return value?...Optionally additional function arguments that are fixed during the optimization.
Method evaluate_hessian()
Evaluate the Hessian function.
Arguments
.at[
numeric()]
The values for the target argument(s), written in a single vector.Must be of length
sum(self$npar)..negate[
logical(1)]
Negate the function return value?...Optionally additional function arguments that are fixed during the optimization.
Method evaluate_hessian_numeric()
Evaluate the numerical Hessian hessian.
Arguments
.at[
numeric()]
The values for the target argument(s), written in a single vector.Must be of length
sum(self$npar)..negate[
logical(1)]
Negate the function return value?...Optionally additional function arguments that are fixed during the optimization.
Examples
### define log-likelihood function of Gaussian mixture model
llk <- function(mu, sd, lambda, data) {
sd <- exp(sd)
lambda <- plogis(lambda)
cluster_1 <- lambda * dnorm(data, mu[1], sd[1])
cluster_2 <- (1 - lambda) * dnorm(data, mu[2], sd[2])
sum(log(cluster_1 + cluster_2))
}
### optimize over the first three arguments, the 'data' argument is constant
objective <- Objective$new(
f = llk, target = c("mu", "sd", "lambda"), npar = c(2, 2, 1),
data = faithful$eruptions
)
### evaluate at 1:5 (1:2 is passed to mu, 3:4 to sd, and 5 to lambda)
objective$evaluate(1:5)
#> [1] -1069.623
