fnchk function

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

Author(s)

John C. Nash profjcnash@gmail.com

Examples

# 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:10 x<-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<-2 opros<-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)
  • Maintainer: John C Nash
  • License: GPL-2
  • Last published: 2024-12-10