Re-architect fitfunction derivatives API using Eigen
authorjpritikin <jpritikin@df83fd30-4cca-4c36-ab9d-e8b5583ccbd1>
Thu, 13 Mar 2014 20:32:18 +0000 (20:32 +0000)
committerjpritikin <jpritikin@df83fd30-4cca-4c36-ab9d-e8b5583ccbd1>
Thu, 13 Mar 2014 20:32:18 +0000 (20:32 +0000)
commitd02ece48f1ee7e47af5e3c0a44e878656d8deeb1
tree0a1004b9fc65c031fd9a3ffabaa7258102c5fa14
parent816a309380f89cf463424bf5541cf69c41dbe39d
Re-architect fitfunction derivatives API using Eigen

Why do we need another matrix algebra library? We already have two, that
is, omxMatrix (original) and Matrix (from CSOLNP). For IFA models with
many items, it is essential to perform a sparse matrix-vector product
(Hessian %*% gradient) in Newton-Raphson. I initially wrote bespoke code
for sparse matrix-vector product. This was working well. However, it
came to my attention that inverting the Hessian can also benefit from
sparse matrix algebra. Rather than re-invent the wheel, Eigen looks like
a promising implementation.

Additional changes:

+ Internal derivatives are no longer reported back to R. You need to use
mxComputeReportDeriv to request them. Report derivs by default seemed
like a bad idea if they are so big that we are using a sparse
representation.

+ MxComputeNumericDeriv got a verbose parameter to enable debugging at
runtime.

+ ifa-drm-wide.R is moved to the failing directory temporarily. This
commit does not optimize manipulation of the Hessian but uses a simple
dense representation. dsytrf/dsytri are used to invert the Hessian. This
doesn't scale, but the improved accuracy results in many fewer
Newton-Raphson iterations highlighting the poor accuracy of the replaced
code.

+ Eigen has a great debug mode that NaN initializes memory and does
bounds checking. With these tools to assist debugging, I decided to
never store the lower triangle of a Hessian.

git-svn-id: http://openmx.psyc.virginia.edu/svn/trunk@3141 df83fd30-4cca-4c36-ab9d-e8b5583ccbd1
47 files changed:
Makefile
R/MxCompute.R
R/MxRun.R
models/failing/ifa-drm-wide.R [new file with mode: 0644]
models/nightly/fm-example2-1.R
models/nightly/ifa-2d-mg.R
models/nightly/ifa-bifactor.R
models/nightly/ifa-cai2009.R
models/nightly/ifa-dLL.R
models/nightly/ifa-drm-wide.R [deleted file]
models/nightly/ifa-fisher-info.R
models/nightly/ifa-latent-2d.R
models/nightly/ifa-meat-2d.R
models/nightly/ifa-meat-2tier.R
models/nightly/ifa-ms.R
models/passing/ifa-drm-mg.R
models/passing/ifa-drm-mg2.R
models/passing/ifa-drm1.R
models/passing/ifa-grm1.R
src/Compute.cpp
src/Compute.h
src/ComputeGD.cpp
src/ComputeNR.cpp
src/Makevars.in
src/dmvnorm.cpp
src/fitMultigroup.cpp
src/glue.cpp
src/matrix.cpp
src/matrix.h
src/omxBuffer.h
src/omxCsolnp.cpp
src/omxData.cpp
src/omxDefines.h
src/omxExpectationBA81.cpp
src/omxExpectationBA81.h
src/omxExportBackendState.h
src/omxFIMLSingleIteration.cpp
src/omxFitFunction.cpp
src/omxFitFunctionBA81.cpp
src/omxHessianCalculation.cpp
src/omxMatrix.h
src/omxNPSOLSpecific.cpp
src/omxNPSOLSpecific.h
src/omxState.cpp
src/omxState.h
src/omxStateSpaceExpectation.cpp
src/types.h [deleted file]