I would like to learn how optim(..., hessian=TRUE) computes a Hessian, so I took a look at the function's definition. Near its end, it includes this call to .External2():
if (hessian)
res$hessian <- .External2(C_optimhess, res$par, fn1,
gr1, con)
Looks like there's a call to an external C function named C_optimhess, so I grep'd the R source directory for C_optimhess, but came up emptyhanded. There are only two occurrences of that string in R's code base, one in optim and one in optimHess. Both functions are defined in $R_SOURCE_DIR/src/library/stats/R/optim.R, and that file includes no additional hints/comments/references.
optim's help file references code on which several of the function's optimization methods were based, but doesn't (seem to) point to the source of C_optimhess.
In a case like this, where should I look to find the C code being called by .External2?
Notice that C_optimhess is an object, not a string.
> stats:::C_optimhess
$name
[1] "optimhess"
$address
<pointer: 0x266b1a0>
attr(,"class")
[1] "RegisteredNativeSymbol"
$dll
DLL name: stats
Filename: /usr/lib/R/library/stats/libs/stats.so
Dynamic lookup: FALSE
$numParameters
[1] 4
attr(,"class")
[1] "ExternalRoutine" "NativeSymbolInfo"
So you need to grep for "optimhess" in $R_SOURCE_DIR/src/library/stats/src/:
josh@compy: $R_SOURCE_DIR/src/library/stats/src
> grep optimhess *
init.c: EXTDEF(optimhess, 4),
optim.c:SEXP optimhess(SEXP call, SEXP op, SEXP args, SEXP rho)
statsR.h:SEXP optimhess(SEXP call, SEXP op, SEXP args, SEXP rho);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With