playing with functors

This commit is contained in:
Thomas Capricelli
2009-08-24 19:45:35 +02:00
parent 6f567f10be
commit 15d2c3af90
3 changed files with 54 additions and 43 deletions

View File

@@ -1,6 +1,7 @@
template<typename Functor, typename Scalar>
template<typename FunctorType, typename Scalar>
int ei_lmder(
const FunctorType &Functor,
Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev,
@@ -56,7 +57,7 @@ int ei_lmder(
/* evaluate the function at the starting point */
/* and calculate its norm. */
iflag = Functor::f(x, fvec);
iflag = Functor.f(x, fvec);
nfev = 1;
if (iflag < 0)
goto algo_end;
@@ -73,17 +74,17 @@ int ei_lmder(
/* calculate the jacobian matrix. */
iflag = Functor::df(x, fjac);
iflag = Functor.df(x, fjac);
++njev;
if (iflag < 0)
break;
/* if requested, call Functor::f to enable printing of iterates. */
/* if requested, call Functor.f to enable printing of iterates. */
if (nprint > 0) {
iflag = 0;
if ((iter - 1) % nprint == 0)
iflag = Functor::debug(x, fvec, fjac);
iflag = Functor.debug(x, fvec, fjac);
if (iflag < 0)
break;
}
@@ -179,7 +180,7 @@ int ei_lmder(
/* evaluate the function at x + p and calculate its norm. */
iflag = Functor::f(wa2, wa4);
iflag = Functor.f(wa2, wa4);
++nfev;
if (iflag < 0)
goto algo_end;
@@ -276,7 +277,7 @@ algo_end:
if (iflag < 0)
info = iflag;
if (nprint > 0)
iflag = Functor::debug(x, fvec, fjac);
iflag = Functor.debug(x, fvec, fjac);
return info;
}

View File

@@ -1,10 +1,11 @@
template<typename Functor, typename Scalar>
template<typename FunctorType, typename Scalar>
int ei_lmder1(
const FunctorType &Functor,
Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
VectorXi &ipvt,
Scalar tol = ei_sqrt(epsilon<Scalar>())
const Scalar tol = ei_sqrt(epsilon<Scalar>())
)
{
const int n = x.size(), m=fvec.size();
@@ -19,7 +20,8 @@ int ei_lmder1(
}
ipvt.resize(n);
info = ei_lmder<Functor,Scalar>(
info = ei_lmder(
Functor,
x, fvec,
nfev, njev,
fjac, ipvt, qtf, diag,