Visual Servoing Platform  version 3.6.1 under development (2024-11-15)
vpLevenbergMarquartd.h
1 /*
2  * ViSP, open source Visual Servoing Platform software.
3  * Copyright (C) 2005 - 2024 by Inria. All rights reserved.
4  *
5  * This software is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  * See the file LICENSE.txt at the root directory of this source
10  * distribution for additional information about the GNU GPL.
11  *
12  * For using ViSP with software that can not be combined with the GNU
13  * GPL, please contact Inria about acquiring a ViSP Professional
14  * Edition License.
15  *
16  * See https://visp.inria.fr for more information.
17  *
18  * This software was developed at:
19  * Inria Rennes - Bretagne Atlantique
20  * Campus Universitaire de Beaulieu
21  * 35042 Rennes Cedex
22  * France
23  *
24  * If you have questions regarding the use of this file, please contact
25  * Inria at visp@inria.fr
26  *
27  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29  *
30  * Description:
31  * Levenberg Marquartd.
32  */
33 
34 #ifndef VP_LEVENBERG_MARQUARTD_H
35 #define VP_LEVENBERG_MARQUARTD_H
36 
37 #include <visp3/core/vpConfig.h>
38 #include <visp3/core/vpMath.h>
39 
40 #include <errno.h>
41 #include <float.h>
42 #include <math.h>
43 #include <stdio.h>
44 #include <stdlib.h>
45 
46 BEGIN_VISP_NAMESPACE
47 
103  int VISP_EXPORT qrsolv(int n, double *r, int ldr, int *ipvt, double *diag, double *qtb, double *x, double *sdiag,
104  double *wa);
105 
106  /*
107  * PROCEDURE : enorm
108  *
109  * ENTREE :
110  *
111  * x Vecteur de taille "n"
112  * n Taille du vecteur "x"
113  *
114  * DESCRIPTION :
115  * La procedure calcule la norme euclidienne d'un vecteur "x" de taille "n"
116  * La norme euclidienne est calculee par accumulation de la somme des carres
117  * dans les trois directions. Les sommes des carres pour les petits et grands
118  * elements sont mis a echelle afin d'eviter les overflows. Des underflows non
119  * destructifs sont autorisee. Les underflows et overflows sont evites dans le
120  * calcul des sommes des carres non encore mis a echelle par les elements
121  * intermediaires. La definition des elements petit, intermediaire et grand
122  * depend de deux constantes : rdwarf et rdiant. Les restrictions principales
123  * sur ces constantes sont rdwarf^2 n'est pas en underflow et rdgiant^2 n'est
124  * pas en overflow. Les constantes donnees ici conviennent pour la plupart des
125  * pc connus.
126  *
127  * RETOUR :
128  * En cas de succes, la valeur retournee est la norme euclidienne du vecteur
129  * Sinon, la valeur -1 est retournee et la variable globale "errno" est
130  * initialisee pour indiquee le type de l'erreur.
131  */
132 double VISP_EXPORT enorm(const double *x, int n);
133 
134 /* PROCEDURE : lmpar
135  *
136  * ENTREE :
137  * n Ordre de la matrice "r".
138  * r Matrice de taille "n" x "n". En entree, la toute la partie
139  * triangulaire superieure doit contenir toute la partie
140  * triangulaire superieure de "r".
141  *
142  * ldr Taille maximum de la matrice "r". "ldr" >= "n".
143  *
144  * ipvt Vecteur de taille "n" qui definit la matrice de permutation
145  * "p" tel que : a * p = q * r. La jeme colonne de p la colonne ipvt[j] de la
146  * matrice d'identite.
147  *
148  * diag Vecteur de taille "n" contenant les elements diagonaux de la
149  * matrice "d".
150  *
151  * qtb Vecteur de taille "n" contenant les "n" premiers elements du
152  * vecteur (q transpose)*b.
153  *
154  * delta Limite superieure de la norme euclidienne de d * x.
155  *
156  * par Estimee initiale du parametre de Levenberg-Marquardt.
157  * wa1, wa2 Vecteurs de taille "n" de travail.
158  *
159  * DESCRIPTION :
160  * La procedure determine le parametre de Levenberg-Marquardt. Soit une
161  * matrice "a" de taille "m" x "n", une matrice diagonale "d" non singuliere de
162  * taille "n" x "n", un vecteur "b" de taille "m" et un nombre positf delta,
163  * le probleme est le calcul du parametre "par" de telle facon que si "x"
164  * resoud le systeme
165  *
166  * a * x = b , sqrt(par) * d * x = 0 ,
167  *
168  * au sens des moindre carre, et dxnorm est la norme euclidienne de d * x
169  * alors "par" vaut 0.0 et (dxnorm - delta) <= 0.1 * delta ,
170  * ou "par" est positif et abs(dxnorm-delta) <= 0.1 * delta.
171  * Cette procedure complete la solution du probleme si on lui fourni les infos
172  * nessaires de la factorisation qr, avec pivotage de colonnes de a.
173  * Donc, si a * p = q * r, ou "p" est une matrice de permutation, les colonnes
174  * de "q" sont orthogonales, et "r" est une matrice triangulaire superieure
175  * avec les elements diagonaux classes par ordre decroissant de leur valeur,
176  * lmpar attend une matrice triangulaire superieure complete, la matrice de
177  * permutation "p" et les "n" premiers elements de (q transpose) * b. En
178  * sortie, la procedure lmpar fournit aussi une matrice triangulaire
179  * superieure "s" telle que
180  *
181  * t t t
182  * p * (a * a + par * d * d )* p = s * s .
183  *
184  * "s" est utilise a l'interieure de lmpar et peut etre d'un interet separe.
185  *
186  * Seulement quelques iterations sont necessaire pour la convergence de
187  * l'algorithme. Si neanmoins la limite de 10 iterations est atteinte, la
188  * valeur de sortie "par" aura la derniere meilleure valeur.
189  *
190  * SORTIE :
191  * r En sortie, tout le triangle superieur est inchange, et le
192  * le triangle inferieur contient les elements de la partie
193  * triangulaire superieure (transpose) de la matrice triangulaire
194  * superieure de "s".
195  * par Estimee finale du parametre de Levenberg-Marquardt.
196  * x Vecteur de taille "n" contenant la solution au sens des
197  * moindres carres du systeme a * x = b, sqrt(par) * d * x = 0, pour le
198  * parametre en sortie "par"
199  * sdiag Vecteur de taille "n" contenant les elements diagonaux de la
200  * matrice triangulaire "s".
201  *
202  * RETOUR :
203  * En cas de succes, la valeur 0.0 est retournee.
204  */
205 int VISP_EXPORT lmpar(int n, double *r, int ldr, int *ipvt, double *diag, double *qtb, double *delta, double *par,
206  double *x, double *sdiag, double *wa1, double *wa2);
207 
208 /*
209  * PROCEDURE : pythag
210  *
211  * ENTREES :
212  * a, b Variables dont on veut la racine carre de leur somme de carre
213  *
214  * DESCRIPTION :
215  * La procedure calcule la racine carre de la somme des carres de deux nombres
216  * en evitant l'overflow ou l'underflow destructif.
217  *
218  * RETOUR :
219  * La procedure retourne la racine carre de a^2 + b^2.
220  */
221 double VISP_EXPORT pythag(double a, double b);
222 
223 /*
224  * PROCEDURE : qrfac
225  *
226  * ENTREE :
227  * m Nombre de lignes de la matrice "a".
228  * n Nombre de colonne de la matrice "a".
229  * a Matrice de taille "m" x "n". elle contient, en entree la
230  *matrice dont on veut sa factorisation qr.
231  * lda Taille maximale de "a". lda >= m.
232  * pivot Booleen. Si pivot est TRUE, le pivotage de colonnes est
233  *realise Si pivot = FALSE, pas de pivotage.
234  * lipvt Taille du vecteur "ipvt". Si pivot est FALSE, lipvt est de
235  * l'ordre de 1. Sinon lipvt est de l'ordre de "n".
236  * wa Vecteur de travail de taille "n". Si pivot = FALSE "wa"
237  * coincide avec rdiag.
238  *
239  * DESCRIPTION :
240  * La procedure effectue une decomposition de la matrice "a"par la methode qr.
241  * Elle utilise les transformations de householders avec pivotage sur les
242  * colonnes (option) pour calculer la factorisation qr de la matrice "a" de
243  * taille "m" x "n". La procedure determine une matrice orthogonale "q", une
244  * matrice de permutation "p" et une matrice trapesoidale superieure "r" dont
245  * les elements diagonaux sont ordonnes dans l'ordre decroissant de leurs
246  * valeurs,tel que a * p = q * r. La transformation de householder pour la
247  * colonne k, k = 1,2,...,min(m,n), est de la forme
248  * t
249  * i - (1 / u(k)) * u * u
250  *
251  * Ou u a des zeros dans les k-1 premieres positions.
252  *
253  * SORTIE :
254  * a Matrice de taille "m" x "n" dont le trapeze superieur de "a"
255  * contient la partie trapezoidale superieure de "r" et la partie
256  * trapezoidale inferieure de "a" contient une forme factorisee
257  * de "q" (les elements non triviaux du vecteurs "u" sont decrits
258  * ci-dessus).
259  * ipvt Vecteur de taille "n". Il definit la matrice de permutation
260  * "p" tel que a * p = q * r. La jeme colonne de p est la colonne ipvt[j] de la
261  * matrice d'identite. Si pivot = FALSE, ipvt n'est pas referencee. rdiag
262  * Vecteur de taille "n" contenant les elements diagonaux de la matrice
263  * "r". acnorm Vecteur de taille "n" contenant les normes des lignes
264  * correspondantes de la matrice "a". Si cette information n'est
265  * pas requise, acnorm coincide avec rdiag.
266  */
267 int VISP_EXPORT qrfac(int m, int n, double *a, int lda, int *pivot, int *ipvt, int lipvt, double *rdiag, double *acnorm,
268  double *wa);
269 
273 typedef void (*ComputeFunctionAndJacobian)(int m, int n, double *xc, double *fvecc, double *jac, int ldfjac, int iflag);
274 
275 /*
276  * PROCEDURE : lmder
277  *
278  *
279  * ENTREE :
280  * fcn Fonction qui calcule la fonction et le jacobien de la
281  * fonction. m Nombre de fonctions.
282  * n Nombre de variables. n <= m
283  * x Vecteur de taille "n" contenant en entree une estimation
284  * initiale de la solution.
285  * ldfjac Taille dominante de la matrice "fjac". ldfjac >= "m".
286  * ftol Erreur relative desiree dans la somme des carre. La
287  * terminaison survient quand les preductions estimee et vraie de la somme des
288  * carres sont toutes deux au moins egal a ftol.
289  * xtol Erreur relative desiree dans la solution approximee. La
290  * terminaison survient quand l'erreur relative entre deux
291  * iterations consecutives est au moins egal a xtol.
292  * gtol Mesure de l'orthogonalite entre le vecteur des fonctions et
293  * les colonnes du jacobien. La terminaison survient quand le cosinus de
294  * l'angle entre fvec et n'importe quelle colonne du jacobien est au moins
295  * egal a gtol, en valeur absolue. maxfev Nombre d'appel maximum. La
296  * terminaison se produit lorsque le nombre d'appel a fcn avec iflag = 1 a
297  * atteint "maxfev".
298  * diag Vecteur de taille "n". Si mode = 1 (voir ci-apres), diag est
299  * initialisee en interne. Si mode = 2, diag doit contenir les
300  * entree positives qui servent de facteurs d'echelle aux
301  * variables.
302  * mode Si mode = 1, les variables seront mis a l'echelle en interne.
303  * Si mode = 2, la mise a l'echelle est specifie par l'entree
304  * diag. Les autres valeurs de mode sont equivalents a mode = 1. factor
305  * Definit la limite de l'etape initial. Cette limite est initialise au
306  * produit de "factor" et de la norme euclidienne de "diag" * "x" sinon nul.
307  * ou a "factor" lui meme. Dans la plupart des cas, "factor" doit se trouve
308  * dans l'intervalle (1, 100); ou 100 est la valeur recommandee. nprint
309  * Controle de l'impression des iterees (si valeur positive). Dans ce
310  * cas, fcn est appelle avec iflag = 0 au debut de la premiere iteration et
311  * apres chaque nprint iteration, x, fvec, et fjac sont disponible pour
312  * impression, cela avant de quitter la procedure. Si "nprint" est negatif,
313  * aucun appel special de fcn est faite. wa1, wa2, wa3 Vecteur de travail de
314  * taille "n". wa4 Vecteur de travail de taille "m".
315  *
316  * SORTIE :
317  * x Vecteur de taille "n" contenant en sortie l'estimee finale
318  * de la solution.
319  * fvec Vecteur de taille "m" contenant les fonctions evaluee en "x".
320  * fjac Matrice de taille "m" x "n". La sous matrice superieure de
321  * taille "n" x "n" de fjac contient une matrice triangulaire
322  * superieure r dont les elements diagonaux, classe dans le sens
323  * decroissant de leur valeur, sont de la forme :
324  *
325  * T T T
326  * p * (jac * jac) * p = r * r
327  *
328  * Ou p est une matrice de permutation et jac est le jacobien
329  * final calcule.
330  * La colonne j de p est la colonne ipvt (j) (voir ci apres) de
331  * la matrice identite. La partie trapesoidale inferieure de fjac
332  * contient les information genere durant le calcul de r.
333  * info Information de l'execution de la procedure. Lorsque la
334  * procedure a termine son execution, "info" est inialisee a la valeur
335  * (negative) de iflag. sinon elle prend les valeurs suivantes :
336  * info = 0 : parametres en entree non valides.
337  * info = 1 : les reductions relatives reelle et estimee de la
338  * somme des carres sont au moins egales a ftol.
339  * info = 2 : erreur relative entre deux iteres consecutives sont
340  * egaux a xtol.
341  * info = 3 : conditions info = 1 et info = 2 tous deux requis.
342  * info = 4 : le cosinus de l'angle entre fvec et n'importe
343  * quelle colonne du jacobien est au moins egal a gtol, en valeur absolue. info
344  * = 5 : nombre d'appels a fcn avec iflag = 1 a atteint maxfev. info = 6 :
345  * ftol est trop petit. Plus moyen de reduire de la somme des carres. info =
346  * 7 : xtol est trop petit. Plus d'amelioration possible pour approximer la
347  * solution x. info = 8 : gtol est trop petit. "fvec" est orthogonal aux
348  * colonnes du jacobien a la precision machine pres.
349  * nfev Nombre d'appel a "fcn" avec iflag = 1.
350  * njev Nombre d'appel a "fcn" avec iflag = 2.
351  * ipvt Vecteur de taille "n". Il definit une matrice de permutation p
352  * tel que jac * p = q * p, ou jac est le jacbien final calcule,
353  * q est orthogonal (non socke) et r est triangulaire superieur,
354  * avec les elements diagonaux classes en ordre decroissant de
355  * leur valeur. La colonne j de p est ipvt[j] de la matrice
356  * identite. qtf Vecteur de taille n contenant les n premiers elements
357  * du vecteur qT * fvec.
358  *
359  * DESCRIPTION :
360  * La procedure minimize la somme de carre de m equation non lineaire a n
361  * variables par une modification de l'algorithme de Levenberg - Marquardt.
362  *
363  * REMARQUE :
364  * L'utilisateur doit fournir une procedure "fcn" qui calcule la fonction et
365  * le jacobien.
366  * "fcn" doit etre declare dans une instruction externe a la procedure et doit
367  * etre appele comme suit :
368  * fcn (int m, int n, int ldfjac, double *x, double *fvec, double *fjac, int
369  * *iflag)
370  *
371  * si iflag = 1 calcul de la fonction en x et retour de ce vecteur dans fvec.
372  * fjac n'est pas modifie.
373  * si iflag = 2 calcul du jacobien en x et retour de cette matrice dans fjac.
374  * fvec n'est pas modifie.
375  *
376  * RETOUR :
377  * En cas de succes, la valeur zero est retournee.
378  * Sinon la valeur -1 est retournee.
379  */
380 int VISP_EXPORT lmder(ComputeFunctionAndJacobian ptr_fcn,
381  int m, int n, double *x, double *fvec, double *fjac, int ldfjac, double ftol, double xtol,
382  double gtol, unsigned int maxfev, double *diag, int mode, const double factor, int nprint,
383  int *info, unsigned int *nfev, int *njev, int *ipvt, double *qtf, double *wa1, double *wa2,
384  double *wa3, double *wa4);
385 
386 /*
387  * PROCEDURE : lmder1
388  *
389  * ENTREE :
390  * fcn Fonction qui calcule la fonction et le jacobien de la
391  * fonction. m Nombre de fonctions. n Nombre de variables
392  * (parametres). n <= m x Vecteur de taille "n" contenant en
393  * entree une estimation initiale de la solution.
394  * ldfjac Taille maximale de la matrice "fjac". ldfjac >= "m".
395  * tol Tolerance. La terminaison de la procedure survient quand
396  * l'algorithme estime que l'erreur relative dans la somme des
397  * carres est au moins egal a tol ou bien que l'erreur relative
398  * entre x et la solution est au moins egal atol.
399  * wa Vecteur de travail de taille "lwa".
400  * lwa Taille du vecteur "wa". wa >= 5 * n + m.
401  *
402  *
403  * SORTIE :
404  * x Vecteur de taille "n" contenant en sortie l'estimee finale
405  * de la solution.
406  * fvec Vecteur de taille "m" contenant les fonctions evaluee en "x".
407  * fjac Matrice de taille "m" x "n". La sous matrice superieure de
408  * taille "n" x "n" de fjac contient une matrice triangulaire
409  * superieure r dont les elements diagonaux, classe dans le sens
410  * decroissant de leur valeur, sont de la forme :
411  *
412  * T T T
413  * p * (jac * jac) * p = r * r
414  *
415  * Ou p est une matrice de permutation et jac est le jacobien
416  * final calcule.
417  * La colonne j de p est la colonne ipvt (j) (voir ci apres) de
418  * la matrice identite. La partie trapesoidale inferieure de fjac
419  * contient les information genere durant le calcul de r.
420  * info Information de l'executionde la procedure. Lorsque la
421  * procedure a termine son execution, "info" est inialisee a la valeur
422  * (negative) de iflag. sinon elle prend les valeurs suivantes :
423  * info = 0 : parametres en entre non valides.
424  * info = 1 : estimation par l'algorithme que l'erreur relative
425  * de la somme des carre est egal a tol.
426  * info = 2 : estimation par l'algorithme que l'erreur relative
427  * entre x et la solution est egal a tol.
428  * info = 3 : conditions info = 1 et info = 2 tous deux requis.
429  * info = 4 : fvec est orthogonal aux colonnes du jacobien.
430  * info = 5 : nombre d'appels a fcn avec iflag = 1 a atteint
431  * 100 * (n + 1).
432  * info = 6 : tol est trop petit. Plus moyen de reduire de la
433  * somme des carres.
434  * info = 7 : tol est trop petit. Plus d'amelioration possible
435  * d' approximer la solution x.
436  * ipvt Vecteur de taille "n". Il definit une matrice de permutation p
437  * tel que jac * p = q * p, ou jac est le jacbien final calcule,
438  * q est orthogonal (non socke) et r est triangulaire superieur,
439  * avec les elements diagonaux classes en ordre decroissant de
440  * leur valeur. La colonne j de p est ipvt[j] de la matrice
441  * identite.
442  *
443  * DESCRIPTION :
444  * La procedure minimize la somme de carre de m equation non lineaire a n
445  * variables par une modification de l'algorithme de Levenberg - Marquardt.
446  * Cette procedure appele la procedure generale au moindre carre lmder.
447  *
448  * REMARQUE :
449  * L'utilisateur doit fournir une procedure "fcn" qui calcule la fonction et
450  * le jacobien.
451  * "fcn" doit etre declare dans une instruction externe a la procedure et doit
452  * etre appele comme suit :
453  * fcn (int m, int n, int ldfjac, double *x, double *fvec, double *fjac, int
454  * *iflag)
455  *
456  * si iflag = 1 calcul de la fonction en x et retour de ce vecteur dans fvec.
457  * fjac n'est pas modifie.
458  * si iflag = 2 calcul du jacobien en x et retour de cette matrice dans fjac.
459  * fvec n'est pas modifie.
460  *
461  * RETOUR :
462  * En cas de succes, la valeur zero est retournee.
463  * Sinon, la valeur -1.
464  */
465 int VISP_EXPORT lmder1(ComputeFunctionAndJacobian ptr_fcn,
466  int m, int n, double *x, double *fvec, double *fjac, int ldfjac, double tol, int *info,
467  int *ipvt, int lwa, double *wa);
468 
469 END_VISP_NAMESPACE
470 
471 #endif