44 #include <visp3/vision/vpLevenbergMarquartd.h>
45 #include <visp3/core/vpMath.h>
47 #define SIGN(x) ((x) < 0 ? -1 : 1)
48 #define SWAP(a,b,c) {(c) = (a); (a) = (b); (b) = (c);}
49 #define MIJ(m,i,j,s) ((m) + ((long) (i) * (long) (s)) + (long) (j))
80 double enorm (
const double *x,
int n)
82 const double rdwarf = 3.834e-20;
83 const double rgiant = 1.304e19;
86 double agiant, floatn;
87 double norm_eucl = 0.0;
88 double s1 = 0.0, s2 = 0.0, s3 = 0.0;
90 double x1max = 0.0 , x3max = 0.0;
93 agiant = rgiant / floatn;
95 for (i = 0; i < n; i++)
97 xabs = std::fabs(x[i]);
98 if ((xabs > rdwarf) && (xabs < agiant))
106 else if (xabs <= rdwarf)
114 if (xabs > std::numeric_limits<double>::epsilon())
115 s3 += (xabs / x3max) * (xabs / x3max);
119 s3 = 1.0 + s3 * (x3max / xabs) * (x3max / xabs);
131 s1 += (xabs / x1max) * (xabs / x1max);
135 s1 = 1.0 + s1 * (x1max / xabs) * (x1max / xabs);
145 if (std::fabs(s1) <= std::numeric_limits<double>::epsilon())
148 if (std::fabs(s2) <= std::numeric_limits<double>::epsilon())
149 norm_eucl = x3max * sqrt(s3);
150 else if (s2 >= x3max)
151 norm_eucl = sqrt (s2 * (1.0 + ( x3max / s2) * (x3max * s3)));
153 norm_eucl = sqrt (x3max * ((s2 / x3max) + (x3max * s3)));
156 norm_eucl = x1max * sqrt (s1 + (s2 / x1max) / x1max);
232 int lmpar(
int n,
double *r,
int ldr,
int *ipvt,
double *diag,
double *qtb,
233 double *delta,
double *par,
double *x,
double *sdiag,
double *wa1,
double *wa2)
235 const double tol1 = 0.1, tol001 = 0.001;
241 double dxnorm, fp, gnorm, parc;
244 double dwarf = DBL_MIN;
253 for (
int i = 0; i < n; i++)
256 double *pt = MIJ(r, i, i, ldr);
258 if (std::fabs(*pt) <= std::numeric_limits<double>::epsilon() && nsing == n)
267 for (
int k = 0; k < nsing; k++)
269 int i = nsing - 1 - k;
270 wa1[i] /= *MIJ(r, i, i, ldr);
276 for (
unsigned int j = 0; j <= (
unsigned int)jm1; j++)
277 wa1[j] -= *MIJ(r, i, j, ldr) * temp;
282 for (
int j = 0; j < n; j++)
295 for (
int i = 0; i < n; i++)
296 wa2[i] = diag[i] * x[i];
298 dxnorm = enorm(wa2, n);
300 fp = dxnorm - *delta;
302 if (fp > tol1 * (*delta))
313 for (
int i = 0; i < n; i++)
316 wa1[i] = diag[l] * (wa2[l] / dxnorm);
319 for (
int i = 0; i < n; i++)
327 for (
unsigned int j = 0; j <= (
unsigned int)im1; j++)
328 sum += (*MIJ(r, i, j, ldr) * wa1[j]);
330 wa1[i] = (wa1[i] - sum) / *MIJ(r, i, i, ldr);
333 temp = enorm(wa1, n);
334 parl = ((fp / *delta) / temp) / temp;
341 for (
int i = 0; i < n; i++)
345 for (
int j = 0; j <= i; j++)
346 sum += *MIJ(r, i, j, ldr) * qtb[j];
349 wa1[i] = sum / diag[l];
352 gnorm = enorm(wa1, n);
353 paru = gnorm / *delta;
356 if (std::fabs(paru) <= std::numeric_limits<double>::epsilon())
368 if (std::fabs(*par) <= std::numeric_limits<double>::epsilon() )
369 *par = gnorm / dxnorm;
383 if (std::fabs(*par) <= std::numeric_limits<double>::epsilon() )
388 for (
int i = 0; i < n; i++)
389 wa1[i] = temp * diag[i];
391 qrsolv(n, r, ldr, ipvt, wa1, qtb, x, sdiag, wa2);
393 for (
int i = 0; i < n; i++)
394 wa2[i] = diag[i] * x[i];
396 dxnorm = enorm(wa2, n);
398 fp = dxnorm - *delta;
408 if ((std::fabs(fp) <= tol1 * (*delta)) || ((std::fabs(parl) <= std::numeric_limits<double>::epsilon()) && (fp <= temp)
409 && (temp < 0.0)) || (iter == 10))
424 for (
int i = 0; i < n; i++)
427 wa1[i] = diag[l] * (wa2[l] / dxnorm);
430 for (
unsigned int i = 0; i < (
unsigned int)n; i++)
432 wa1[i] = wa1[i] / sdiag[i];
435 if ( (
unsigned int) n >= jp1)
437 for (
unsigned int j = jp1; j < (
unsigned int)n; j++)
438 wa1[j] -= (*MIJ(r, i, j, ldr) * temp);
442 temp = enorm(wa1, n);
443 parc = ((fp / *delta) / temp) / temp;
485 double pythag (
double a,
double b)
487 double pyth, p, r, s, t, u;
492 if (std::fabs(p) <= std::numeric_limits<double>::epsilon() )
498 r = (std::min(std::fabs(a), std::fabs(b)) / p) * (std::min(std::fabs(a), std::fabs(b)) / p);
502 while (std::fabs(t - 4.0) < std::fabs(
vpMath::maximum(t,4.0)) * std::numeric_limits<double>::epsilon() )
507 r *= (s / u) * (s / u);
562 int qrfac(
int m,
int n,
double *a,
int lda,
int *pivot,
int *ipvt,
563 int ,
double *rdiag,
double *acnorm,
double *wa)
565 const double tolerance = 0.05;
567 int i, j, ip1, k, kmax, minmn;
568 double ajnorm, epsmch;
569 double sum, temp, tmp;
574 epsmch = std::numeric_limits<double>::epsilon();
580 for (i = 0; i < m; i++)
582 acnorm[i] = enorm(MIJ(a, i, 0, lda), n);
583 rdiag[i] = acnorm[i];
593 for (i = 0; i < minmn; i++)
602 for (k = i; k < m; k++)
604 if (rdiag[k] > rdiag[kmax])
610 for (j = 0; j < n; j++)
611 SWAP(*MIJ(a, i, j, lda),
612 *MIJ(a, kmax, j, lda), tmp);
614 rdiag[kmax] = rdiag[i];
617 SWAP( ipvt[i], ipvt[kmax], k);
625 ajnorm = enorm(MIJ(a, i, i, lda), n - i);
628 if (std::fabs(ajnorm) > std::numeric_limits<double>::epsilon() )
630 if (*MIJ(a, i, i, lda) < 0.0)
633 for (j = i; j < n; j++)
634 *MIJ(a, i, j, lda) /= ajnorm;
635 *MIJ(a, i, i, lda) += 1.0;
645 for (k = ip1; k < m; k++)
648 for (j = i; j < n; j++)
649 sum += *MIJ(a, i, j, lda) * *MIJ(a, k, j, lda);
651 temp = sum / *MIJ(a, i, i, lda);
653 for (j = i; j < n; j++)
654 *MIJ(a, k, j, lda) -= temp * *MIJ(a, i, j, lda);
657 if (pivot && (std::fabs(rdiag[k]) > std::numeric_limits<double>::epsilon()) )
659 temp = *MIJ (a, k, i, lda) / rdiag[k];
662 if (tolerance * (rdiag[k] / wa[k]) * (rdiag[k] / wa[k]) <= epsmch)
664 rdiag[k] = enorm(MIJ(a, k, ip1, lda), (n -1 - (
int) i));
738 int qrsolv (
int n,
double *r,
int ldr,
int *ipvt,
double *diag,
double *qtb,
739 double *x,
double *sdiag,
double *wa)
741 int i, j, jp1, k, kp1, l;
743 double cosi, cotg, qtbpj, sinu, sum, tg, temp;
750 for (i = 0; i < n; i++)
752 for (j = i; j < n; j++)
753 *MIJ(r, i, j, ldr) = *MIJ(r, j, i, ldr);
755 x[i] = *MIJ(r, i, i, ldr);
764 for (i = 0; i < n; i++)
774 if (std::fabs(diag[l]) > std::numeric_limits<double>::epsilon())
776 for (k = i; k < n; k++)
790 for (k = i; k < n; k++)
799 if (std::fabs(sdiag[k]) > std::numeric_limits<double>::epsilon())
801 if (std::fabs(*MIJ(r, k, k, ldr)) >= std::fabs(sdiag[k]))
803 tg = sdiag[k] / *MIJ(r, k, k, ldr);
804 cosi = 0.5 / sqrt(0.25 + 0.25 * (tg * tg));
809 cotg = *MIJ(r, k, k, ldr) / sdiag[k];
810 sinu = 0.5 / sqrt(0.25 + 0.25 * (cotg * cotg));
819 *MIJ(r, k, k, ldr) = cosi * *MIJ(r, k, k, ldr) + sinu * sdiag[k];
820 temp = cosi * wa[k] + sinu * qtbpj;
821 qtbpj = -sinu * wa[k] + cosi * qtbpj;
833 for (j = kp1; j < n; j++)
835 temp = cosi * *MIJ(r, k, j, ldr) +
837 sdiag[j] = - sinu * *MIJ(r, k, j, ldr) +
839 *MIJ(r, k, j, ldr) = temp;
850 sdiag[i] = *MIJ(r, i, i, ldr);
851 *MIJ(r, i, i, ldr) = x[i];
860 for (i = 0; i < n; i++)
863 if ( (std::fabs(sdiag[i]) <= std::numeric_limits<double>::epsilon()) && nsing == n)
872 for (k = 0; k < nsing; k++)
880 for (j = jp1; j < nsing; j++)
881 sum += *MIJ(r, i, j, ldr) * wa[j];
883 wa[i] = (wa[i] - sum) / sdiag[i];
890 for (j = 0; j < n; j++)
1010 int lmder (
void (*ptr_fcn)(
int m,
int n,
double *xc,
double *fvecc,
1011 double *jac,
int ldfjac,
int iflag),
int m,
int n,
double *x,
1012 double *fvec,
double *fjac,
int ldfjac,
double ftol,
double xtol,
1013 double gtol,
unsigned int maxfev,
double *diag,
int mode,
1014 const double factor,
int nprint,
int *info,
unsigned int *nfev,
1015 int *njev,
int *ipvt,
double *qtf,
double *wa1,
double *wa2,
1016 double *wa3,
double *wa4)
1018 const double tol1 = 0.1, tol5 = 0.5, tol25 = 0.25, tol75 = 0.75, tol0001 = 0.0001;
1023 double actred, delta, dirder, epsmch, fnorm, fnorm1, gnorm;
1024 double ratio = std::numeric_limits<double>::epsilon();
1025 double par, pnorm, prered;
1026 double sum, temp, temp1, temp2, xnorm = 0.0;
1029 epsmch = std::numeric_limits<double>::epsilon();
1054 if ((n <= 0) || (m < n) || (ldfjac < m) || (ftol < 0.0) || (xtol < 0.0)
1055 || (gtol < 0.0) || (maxfev == 0) || (factor <= 0.0))
1066 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1073 for (j = 0; j < n; j++)
1086 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1099 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1115 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1120 fnorm = enorm(fvec, m);
1133 while (count < (
int)maxfev)
1142 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1157 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1168 if ((iter-1) % nprint == 0)
1169 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1182 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1191 qrfac(n, m, fjac, ldfjac, &oncol, ipvt, n, wa1, wa2, wa3);
1202 for (j = 0; j < n; j++)
1206 if (std::fabs(wa2[j]) <= std::numeric_limits<double>::epsilon())
1217 for (j = 0; j < n; j++)
1218 wa3[j] = diag[j] * x[j];
1220 xnorm = enorm (wa3, n);
1221 delta = factor * xnorm;
1224 if (std::fabs(delta) <= std::numeric_limits<double>::epsilon())
1232 for (i = 0; i < m; i++)
1235 for (i = 0; i < n; i++)
1237 double *pt = MIJ(fjac, i, i, ldfjac);
1239 if (std::fabs(*pt) > std::numeric_limits<double>::epsilon() )
1243 for (j = i; j < m; j++)
1244 sum += *MIJ(fjac, i, j, ldfjac) * wa4[j];
1246 temp = - sum / *MIJ(fjac, i, i, ldfjac);
1248 for (j = i; j < m; j++)
1249 wa4[j] += *MIJ(fjac, i, j, ldfjac) * temp;
1253 *MIJ(fjac, i, i, ldfjac) = wa1[i];
1264 if (std::fabs(fnorm) > std::numeric_limits<double>::epsilon())
1266 for (i = 0; i < n; i++)
1270 if (std::fabs(wa2[l]) > std::numeric_limits<double>::epsilon())
1273 for (j = 0; j <= i; j++)
1274 sum += *MIJ(fjac, i, j, ldfjac) * (qtf[j] / fnorm);
1299 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1310 for (j = 0; j < n; j++)
1318 while (ratio < tol0001)
1324 lmpar(n, fjac, ldfjac, ipvt, diag, qtf, &delta, &par, wa1,
1331 for (j = 0; j < n; j++)
1334 wa2[j] = x[j] + wa1[j];
1335 wa3[j] = diag[j] * wa1[j];
1338 pnorm = enorm(wa3, n);
1353 (*ptr_fcn)(m, n, wa2, wa4, fjac, ldfjac, iflag);
1368 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1373 fnorm1 = enorm(wa4, m);
1381 if ((tol1 * fnorm1) < fnorm)
1382 actred = 1.0 - ((fnorm1 / fnorm) * (fnorm1 / fnorm));
1389 for (i = 0; i < n; i++)
1394 for (j = 0; j <= i; j++)
1395 wa3[j] += *MIJ(fjac, i, j, ldfjac) * temp;
1398 temp1 = enorm(wa3, n) / fnorm;
1399 temp2 = (sqrt(par) * pnorm) / fnorm;
1400 prered = (temp1 * temp1) + (temp2 * temp2) / tol5;
1401 dirder = - ((temp1 * temp1) + (temp2 * temp2));
1410 if (std::fabs(prered) > std::numeric_limits<double>::epsilon())
1411 ratio = actred / prered;
1420 if ((std::fabs(par) <= std::numeric_limits<double>::epsilon()) || (ratio <= tol75))
1422 delta = pnorm / tol5;
1432 temp = tol5 * dirder / (dirder + tol5 * actred);
1434 if ((tol1 * fnorm1 >= fnorm) || (temp < tol1))
1444 if (ratio >= tol0001)
1451 for (j = 0; j < n; j++)
1454 wa2[j] = diag[j] * x[j];
1457 for (i = 0; i < m; i++)
1460 xnorm = enorm(wa2, n);
1469 if ((std::fabs(actred) <= ftol) && (prered <= ftol) && (tol5 * ratio <= 1.0))
1472 if (delta <= xtol * xnorm)
1475 if ((std::fabs(actred) <= ftol) && (prered <= ftol) && (tol5 * ratio <= 1.0)
1490 (*ptr_fcn)(m,n,x,fvec,fjac,ldfjac, iflag);
1499 if (*nfev >= maxfev)
1502 if ((std::fabs(actred) <= epsmch) && (prered <= epsmch)
1503 && (tol5 * ratio <= 1.0))
1506 if (delta <= epsmch * xnorm)
1509 if (gnorm <= epsmch)
1523 (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1614 int lmder1 (
void (*ptr_fcn)(
int m,
int n,
double *xc,
double *fvecc,
1615 double *jac,
int ldfjac,
int iflag),
1616 int m,
int n,
double *x,
double *fvec,
double *fjac,
1617 int ldfjac,
double tol,
int *info,
int *ipvt,
int lwa,
double *wa)
1619 const double factor = 100.0;
1620 unsigned int maxfev, nfev;
1621 int mode, njev, nprint;
1622 double ftol, gtol, xtol;
1629 if ( (m < n) || (ldfjac < m) || (tol < 0.0) ||
1630 (lwa < (5 * n + m)) )
1632 printf(
"%d %d %d %d \n", (m < n), (ldfjac < m), (tol < 0.0) , (lwa < (5 * n + m))) ;
1638 maxfev = (
unsigned int)(100 * (n + 1));
1645 lmder (ptr_fcn , m, n, x, fvec, fjac, ldfjac, ftol, xtol, gtol, maxfev, wa,
1646 mode, factor, nprint, info, &nfev, &njev, ipvt, &wa[n], &wa[2 * n],
1647 &wa[3 * n], &wa[4 * n], &wa[5 * n]);
static Type maximum(const Type &a, const Type &b)
static Type minimum(const Type &a, const Type &b)