Run tests, where possible, on user objective function
Run tests, where possible, on user objective function
fnchk checks a user-provided R function, ffn.
fnchk(xpar, ffn, trace=0,...)
Arguments
xpar: the (double) vector of parameters to the objective funcion
ffn: a user-provided function to compute the objective function
trace: set >0 to provide output from fnchk to the console, 0 otherwise
...: optional arguments passed to the objective function.
Details
fnchk attempts to discover various errors in function setup in user-supplied functions primarily intended for use in optimization calculations. There are always more conditions that could be tested!
Returns
The output is a list consisting of list(fval=fval, infeasible=infeasible, excode=excode, msg=msg) - fval: The calculated value of the function at parameters xpar if the function can be evaluated.
infeasible: FALSE if the function can be evaluated, TRUE if not.
excode: An exit code, which has a relationship to
msg: A text string giving information about the result of the function check: Messages and the corresponding values of excode are:
fnchk OK;: excode = 0; infeasible = FALSE
Function returns INADMISSIBLE;: excode = -1; infeasible = TRUE
Function returns a vector not a scalar;: excode = -4; infeasible = TRUE
Function returns a list not a scalar;: excode = -4; infeasible = TRUE
Function returns a matrix list not a scalar;: excode = -4; infeasible = TRUE
Function returns an array not a scalar;: excode = -4; infeasible = TRUE
Function returned not length 1, despite not vector, matrix or array;: excode = -4; infeasible = TRUE
Function returned non-numeric value; excode = 0;: excode = -1; infeasible = TRUE
Function returned Inf or NA (non-computable);: excode = -1; infeasible = TRUE
# Want to illustrate each case.# Ben Bolker idea for a function that is NOT scalar# rm(list=ls())# library(optimx)sessionInfo()benbad<-function(x, y){# y may be provided with different structures f<-(x-y)^2}# very simple, but ...y<-1:10x<-c(1)cat("fc01: test benbad() with y=1:10, x=c(1)\n")fc01<-fnchk(x, benbad, trace=4, y)print(fc01)y<-as.vector(y)cat("fc02: test benbad() with y=as.vector(1:10), x=c(1)\n")fc02<-fnchk(x, benbad, trace=1, y)print(fc02)y<-as.matrix(y)cat("fc03: test benbad() with y=as.matrix(1:10), x=c(1)\n")fc03<-fnchk(x, benbad, trace=1, y)print(fc03)y<-as.array(y)cat("fc04: test benbad() with y=as.array(1:10), x=c(1)\n")fc04<-fnchk(x, benbad, trace=1, y)print(fc04)y<-"This is a string"cat("test benbad() with y a string, x=c(1)\n")fc05<-fnchk(x, benbad, trace=1, y)print(fc05)cat("fnchk with Rosenbrock\n")fr <-function(x){## Rosenbrock Banana function x1 <- x[1] x2 <- x[2]100*(x2 - x1 * x1)^2+(1- x1)^2}xtrad<-c(-1.2,1)ros1<-fnchk(xtrad, fr, trace=1)print(ros1)npar<-2opros<-list2env(list(fn=fr, gr=NULL, hess=NULL, MAXIMIZE=FALSE, PARSCALE=rep(1,npar), FNSCALE=1, KFN=0, KGR=0, KHESS=0, dots=NULL))uros1<-fnchk(xtrad, fr, trace=1)print(uros1)