R: Run tests, where possible, on user objective function

fnchk {optextras} | R Documentation

## Run tests, where possible, on user objective function

### Description

`fnchk` checks a user-provided R function, `ffn`.

### Usage

       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!

### Value

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 <nashjc@uottawa.ca>

### Examples

    # Want to illustrate each case.
    # Ben Bolker idea for a function that is NOT scalar

    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("test benbad() with y=1:10, x=c(1)\n")
    fc01<-fnchk(x, benbad, trace=1, y)
    print(fc01)

    y<-as.vector(y)
    cat("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("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("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)

    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, ufn, trace=1, fnuser=opros)
    print(uros1)

[Package optextras version 2016-8.8 Index]