porting lmder1 to eigen (no more wrapper)

This commit is contained in:
Thomas Capricelli 2009-08-20 22:09:05 +02:00
parent a84dc9a5c1
commit 980c40f72c
3 changed files with 27 additions and 81 deletions

View File

@ -127,7 +127,6 @@ Scalar ei_enorm ( int n, const Scalar *x ){
// return Map< Matrix< Scalar, Dynamic, 1 > >(x,n).blueNorm();
}
#include "src/NonLinear/lmder1.h"
#include "src/NonLinear/lmder.h"
#include "src/NonLinear/hybrd1.h"
#include "src/NonLinear/hybrd.h"
@ -139,6 +138,7 @@ Scalar ei_enorm ( int n, const Scalar *x ){
#include "src/NonLinear/hybrj.h"
#include "src/NonLinear/chkder.h"
#include "src/NonLinear/MathFunctions.h"
#include "src/NonLinear/lmder1.h"
//@}

View File

@ -216,32 +216,6 @@ int ei_lmstr(
);
}
template<typename Functor, typename Scalar>
int ei_lmder1(
Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
VectorXi &ipvt,
Scalar tol = ei_sqrt(epsilon<Scalar>())
)
{
int lwa = 5*x.size()+fvec.size();
int ldfjac = fvec.size();
Matrix< Scalar, Dynamic, 1 > wa(lwa);
Matrix< Scalar, Dynamic, Dynamic > fjac(ldfjac, x.size());
ipvt.resize(x.size());
return lmder1_template<Scalar> (
Functor::f, 0,
fvec.size(), x.size(), x.data(), fvec.data(),
fjac.data() , ldfjac,
tol,
ipvt.data(),
wa.data(), lwa
);
}
template<typename Functor, typename Scalar>
int ei_lmder(
Matrix< Scalar, Dynamic, 1 > &x,

View File

@ -1,62 +1,34 @@
template<typename Scalar>
int lmder1_template(minpack_funcder_mn fcn, void *p, int m, int n, Scalar *x,
Scalar *fvec, Scalar *fjac, int ldfjac, Scalar tol,
int *ipvt, Scalar *wa, int lwa)
template<typename Functor, typename Scalar>
int ei_lmder1(
Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
VectorXi &ipvt,
Scalar tol = ei_sqrt(epsilon<Scalar>())
)
{
/* Initialized data */
const int n = x.size(), m=fvec.size();
int info, nfev, njev;
Matrix< Scalar, Dynamic, Dynamic > fjac(m, n);
Matrix< Scalar, Dynamic, 1> diag;
ipvt.resize(n);
const Scalar factor = 100.;
/* System generated locals */
int fjac_dim1, fjac_offset;
/* Local variables */
int mode, nfev, njev;
Scalar ftol, gtol, xtol;
int maxfev, nprint;
int info;
/* Parameter adjustments */
--fvec;
--ipvt;
--x;
fjac_dim1 = ldfjac;
fjac_offset = 1 + fjac_dim1 * 1;
fjac -= fjac_offset;
--wa;
/* Function Body */
info = 0;
/* check the input parameters for errors. */
if (n <= 0 || m < n || ldfjac < m || tol < 0. || lwa < n * 5 +
m) {
/* goto L10; */
printf("lmder1 bad args : m,n,tol,...");
return info;
if (n <= 0 || m < n || tol < 0.) {
printf("ei_lmder1 bad args : m,n,tol,...");
return 0;
}
/* call lmder. */
maxfev = (n + 1) * 100;
ftol = tol;
xtol = tol;
gtol = 0.;
mode = 1;
nprint = 0;
info = lmder(fcn, p, m, n, &x[1], &fvec[1], &fjac[fjac_offset], ldfjac,
ftol, xtol, gtol, maxfev, &wa[1], mode, factor, nprint,
&nfev, &njev, &ipvt[1], &wa[n + 1], &wa[(n << 1) + 1], &
wa[n * 3 + 1], &wa[(n << 2) + 1], &wa[n * 5 + 1]);
if (info == 8) {
info = 4;
}
/* L10: */
return info;
/* last card of subroutine lmder1. */
} /* lmder1_ */
info = ei_lmder<Functor,Scalar>(
x, fvec,
nfev, njev,
fjac, ipvt, diag,
1,
100.,
(n+1)*100,
tol, tol, Scalar(0.)
);
return (info==8)?4:info;
}