source: branches/2929_PrioritizedGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.PGE/3.3/src/go-levmar/levmar-2.6/levmar.h @ 16620

Last change on this file since 16620 was 16620, checked in by hmaislin, 9 months ago

#2929: Reorganized folder structure for make script, removed explicit marshalling, erased go-side logging

File size: 18.8 KB
Line 
1/*
2////////////////////////////////////////////////////////////////////////////////////
3//
4//  Prototypes and definitions for the Levenberg - Marquardt minimization algorithm
5//  Copyright (C) 2004  Manolis Lourakis (lourakis at ics forth gr)
6//  Institute of Computer Science, Foundation for Research & Technology - Hellas
7//  Heraklion, Crete, Greece.
8//
9//  This program is free software; you can redistribute it and/or modify
10//  it under the terms of the GNU General Public License as published by
11//  the Free Software Foundation; either version 2 of the License, or
12//  (at your option) any later version.
13//
14//  This program is distributed in the hope that it will be useful,
15//  but WITHOUT ANY WARRANTY; without even the implied warranty of
16//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17//  GNU General Public License for more details.
18//
19////////////////////////////////////////////////////////////////////////////////////
20*/
21
22#ifndef _LEVMAR_H_
23#define _LEVMAR_H_
24
25/************************************* Start of configuration options *************************************/
26/* Note that when compiling with CMake, this configuration section is automatically generated
27 * based on the user's input, see levmar.h.in
28 */
29
30/* specifies whether to use LAPACK or not. Using LAPACK is strongly recommended */
31#define HAVE_LAPACK
32
33/* specifies whether the PLASMA parallel library for multicore CPUs is available */
34/* #undef HAVE_PLASMA */
35                     
36/* to avoid the overhead of repeated mallocs(), routines in Axb.c can be instructed to
37 * retain working memory between calls. Such a choice, however, renders these routines
38 * non-reentrant and is not safe in a shared memory multiprocessing environment.
39 * Bellow, an attempt is made to issue a warning if this option is turned on and OpenMP
40 * is being used (note that this will work only if omp.h is included before levmar.h)
41 */
42/* #undef LINSOLVERS_RETAIN_MEMORY */
43#if (defined(_OPENMP))
44# ifdef LINSOLVERS_RETAIN_MEMORY
45#  ifdef _MSC_VER
46#  pragma message("LINSOLVERS_RETAIN_MEMORY is not safe in a multithreaded environment and should be turned off!")
47#  else
48#  warning LINSOLVERS_RETAIN_MEMORY is not safe in a multithreaded environment and should be turned off!
49#  endif /* _MSC_VER */
50# endif /* LINSOLVERS_RETAIN_MEMORY */
51#endif /* _OPENMP */
52
53/* specifies whether double precision routines will be compiled or not */
54#define LM_DBL_PREC
55/* specifies whether single precision routines will be compiled or not */
56#define LM_SNGL_PREC
57
58/****************** End of configuration options, no changes necessary beyond this point ******************/
59
60
61#ifdef __cplusplus
62extern "C" {
63#endif
64
65/* work arrays size for ?levmar_der and ?levmar_dif functions.
66 * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes
67 */
68#define LM_DER_WORKSZ(npar, nmeas) (2*(nmeas) + 4*(npar) + (nmeas)*(npar) + (npar)*(npar))
69#define LM_DIF_WORKSZ(npar, nmeas) (4*(nmeas) + 4*(npar) + (nmeas)*(npar) + (npar)*(npar))
70
71/* work arrays size for ?levmar_bc_der and ?levmar_bc_dif functions.
72 * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes
73 */
74#define LM_BC_DER_WORKSZ(npar, nmeas) (2*(nmeas) + 4*(npar) + (nmeas)*(npar) + (npar)*(npar))
75#define LM_BC_DIF_WORKSZ(npar, nmeas) LM_BC_DER_WORKSZ((npar), (nmeas)) /* LEVMAR_BC_DIF currently implemented using LEVMAR_BC_DER()! */
76
77/* work arrays size for ?levmar_lec_der and ?levmar_lec_dif functions.
78 * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes
79 */
80#define LM_LEC_DER_WORKSZ(npar, nmeas, nconstr) LM_DER_WORKSZ((npar)-(nconstr), (nmeas))
81#define LM_LEC_DIF_WORKSZ(npar, nmeas, nconstr) LM_DIF_WORKSZ((npar)-(nconstr), (nmeas))
82
83/* work arrays size for ?levmar_blec_der and ?levmar_blec_dif functions.
84 * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes
85 */
86#define LM_BLEC_DER_WORKSZ(npar, nmeas, nconstr) LM_LEC_DER_WORKSZ((npar), (nmeas)+(npar), (nconstr))
87#define LM_BLEC_DIF_WORKSZ(npar, nmeas, nconstr) LM_LEC_DIF_WORKSZ((npar), (nmeas)+(npar), (nconstr))
88
89/* work arrays size for ?levmar_bleic_der and ?levmar_bleic_dif functions.
90 * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes
91 */
92#define LM_BLEIC_DER_WORKSZ(npar, nmeas, nconstr1, nconstr2) LM_BLEC_DER_WORKSZ((npar)+(nconstr2), (nmeas)+(nconstr2), (nconstr1)+(nconstr2))
93#define LM_BLEIC_DIF_WORKSZ(npar, nmeas, nconstr1, nconstr2) LM_BLEC_DIF_WORKSZ((npar)+(nconstr2), (nmeas)+(nconstr2), (nconstr1)+(nconstr2))
94
95#define LM_OPTS_SZ       5 /* max(4, 5) */
96#define LM_INFO_SZ       10
97#define LM_ERROR         -1
98#define LM_INIT_MU       1E-03
99#define LM_STOP_THRESH   1E-17
100#define LM_DIFF_DELTA    1E-06
101#define LM_VERSION       "2.6 (November 2011)"
102
103#ifdef LM_DBL_PREC
104/* double precision LM, with & without Jacobian */
105/* unconstrained minimization */
106extern int dlevmar_der(
107      void (*func)(double *p, double *hx, int m, int n, void *adata),
108      void (*jacf)(double *p, double *j, int m, int n, void *adata),
109      double *p, double *x, int m, int n, int itmax, double *opts,
110      double *info, double *work, double *covar, void *adata);
111
112extern int dlevmar_dif(
113      void (*func)(double *p, double *hx, int m, int n, void *adata),
114      double *p, double *x, int m, int n, int itmax, double *opts,
115      double *info, double *work, double *covar, void *adata);
116
117/* box-constrained minimization */
118extern int dlevmar_bc_der(
119       void (*func)(double *p, double *hx, int m, int n, void *adata),
120       void (*jacf)(double *p, double *j, int m, int n, void *adata), 
121       double *p, double *x, int m, int n, double *lb, double *ub, double *dscl,
122       int itmax, double *opts, double *info, double *work, double *covar, void *adata);
123
124extern int dlevmar_bc_dif(
125       void (*func)(double *p, double *hx, int m, int n, void *adata),
126       double *p, double *x, int m, int n, double *lb, double *ub, double *dscl,
127       int itmax, double *opts, double *info, double *work, double *covar, void *adata);
128
129#ifdef HAVE_LAPACK
130/* linear equation constrained minimization */
131extern int dlevmar_lec_der(
132      void (*func)(double *p, double *hx, int m, int n, void *adata),
133      void (*jacf)(double *p, double *j, int m, int n, void *adata),
134      double *p, double *x, int m, int n, double *A, double *b, int k,
135      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
136
137extern int dlevmar_lec_dif(
138      void (*func)(double *p, double *hx, int m, int n, void *adata),
139      double *p, double *x, int m, int n, double *A, double *b, int k,
140      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
141
142/* box & linear equation constrained minimization */
143extern int dlevmar_blec_der(
144      void (*func)(double *p, double *hx, int m, int n, void *adata),
145      void (*jacf)(double *p, double *j, int m, int n, void *adata),
146      double *p, double *x, int m, int n, double *lb, double *ub, double *A, double *b, int k, double *wghts,
147      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
148
149extern int dlevmar_blec_dif(
150      void (*func)(double *p, double *hx, int m, int n, void *adata),
151      double *p, double *x, int m, int n, double *lb, double *ub, double *A, double *b, int k, double *wghts,
152      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
153
154/* box, linear equations & inequalities constrained minimization */
155extern int dlevmar_bleic_der(
156      void (*func)(double *p, double *hx, int m, int n, void *adata),
157      void (*jacf)(double *p, double *j, int m, int n, void *adata),
158      double *p, double *x, int m, int n, double *lb, double *ub,
159      double *A, double *b, int k1, double *C, double *d, int k2,
160      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
161
162extern int dlevmar_bleic_dif(
163      void (*func)(double *p, double *hx, int m, int n, void *adata),
164      double *p, double *x, int m, int n, double *lb, double *ub, 
165      double *A, double *b, int k1, double *C, double *d, int k2,
166      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
167
168/* box & linear inequality constraints */
169extern int dlevmar_blic_der(
170      void (*func)(double *p, double *hx, int m, int n, void *adata),
171      void (*jacf)(double *p, double *j, int m, int n, void *adata),
172      double *p, double *x, int m, int n, double *lb, double *ub, double *C, double *d, int k2,
173      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
174
175extern int dlevmar_blic_dif(
176      void (*func)(double *p, double *hx, int m, int n, void *adata),
177      double *p, double *x, int m, int n, double *lb, double *ub, double *C, double *d, int k2,
178      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
179
180/* linear equation & inequality constraints */
181extern int dlevmar_leic_der(
182      void (*func)(double *p, double *hx, int m, int n, void *adata),
183      void (*jacf)(double *p, double *j, int m, int n, void *adata),
184      double *p, double *x, int m, int n, double *A, double *b, int k1, double *C, double *d, int k2,
185      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
186
187extern int dlevmar_leic_dif(
188      void (*func)(double *p, double *hx, int m, int n, void *adata),
189      double *p, double *x, int m, int n, double *A, double *b, int k1, double *C, double *d, int k2,
190      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
191
192/* linear inequality constraints */
193extern int dlevmar_lic_der(
194      void (*func)(double *p, double *hx, int m, int n, void *adata),
195      void (*jacf)(double *p, double *j, int m, int n, void *adata),
196      double *p, double *x, int m, int n, double *C, double *d, int k2,
197      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
198
199extern int dlevmar_lic_dif(
200      void (*func)(double *p, double *hx, int m, int n, void *adata),
201      double *p, double *x, int m, int n, double *C, double *d, int k2,
202      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
203#endif /* HAVE_LAPACK */
204
205#endif /* LM_DBL_PREC */
206
207
208#ifdef LM_SNGL_PREC
209/* single precision LM, with & without Jacobian */
210/* unconstrained minimization */
211extern int slevmar_der(
212      void (*func)(float *p, float *hx, int m, int n, void *adata),
213      void (*jacf)(float *p, float *j, int m, int n, void *adata),
214      float *p, float *x, int m, int n, int itmax, float *opts,
215      float *info, float *work, float *covar, void *adata);
216
217extern int slevmar_dif(
218      void (*func)(float *p, float *hx, int m, int n, void *adata),
219      float *p, float *x, int m, int n, int itmax, float *opts,
220      float *info, float *work, float *covar, void *adata);
221
222/* box-constrained minimization */
223extern int slevmar_bc_der(
224       void (*func)(float *p, float *hx, int m, int n, void *adata),
225       void (*jacf)(float *p, float *j, int m, int n, void *adata), 
226       float *p, float *x, int m, int n, float *lb, float *ub, float *dscl,
227       int itmax, float *opts, float *info, float *work, float *covar, void *adata);
228
229extern int slevmar_bc_dif(
230       void (*func)(float *p, float *hx, int m, int n, void *adata),
231       float *p, float *x, int m, int n, float *lb, float *ub, float *dscl,
232       int itmax, float *opts, float *info, float *work, float *covar, void *adata);
233
234#ifdef HAVE_LAPACK
235/* linear equation constrained minimization */
236extern int slevmar_lec_der(
237      void (*func)(float *p, float *hx, int m, int n, void *adata),
238      void (*jacf)(float *p, float *j, int m, int n, void *adata),
239      float *p, float *x, int m, int n, float *A, float *b, int k,
240      int itmax, float *opts, float *info, float *work, float *covar, void *adata);
241
242extern int slevmar_lec_dif(
243      void (*func)(float *p, float *hx, int m, int n, void *adata),
244      float *p, float *x, int m, int n, float *A, float *b, int k,
245      int itmax, float *opts, float *info, float *work, float *covar, void *adata);
246
247/* box & linear equation constrained minimization */
248extern int slevmar_blec_der(
249      void (*func)(float *p, float *hx, int m, int n, void *adata),
250      void (*jacf)(float *p, float *j, int m, int n, void *adata),
251      float *p, float *x, int m, int n, float *lb, float *ub, float *A, float *b, int k, float *wghts,
252      int itmax, float *opts, float *info, float *work, float *covar, void *adata);
253
254extern int slevmar_blec_dif(
255      void (*func)(float *p, float *hx, int m, int n, void *adata),
256      float *p, float *x, int m, int n, float *lb, float *ub, float *A, float *b, int k, float *wghts,
257      int itmax, float *opts, float *info, float *work, float *covar, void *adata);
258
259/* box, linear equations & inequalities constrained minimization */
260extern int slevmar_bleic_der(
261      void (*func)(float *p, float *hx, int m, int n, void *adata),
262      void (*jacf)(float *p, float *j, int m, int n, void *adata),
263      float *p, float *x, int m, int n, float *lb, float *ub,
264      float *A, float *b, int k1, float *C, float *d, int k2,
265      int itmax, float *opts, float *info, float *work, float *covar, void *adata);
266
267extern int slevmar_bleic_dif(
268      void (*func)(float *p, float *hx, int m, int n, void *adata),
269      float *p, float *x, int m, int n, float *lb, float *ub,
270      float *A, float *b, int k1, float *C, float *d, int k2,
271      int itmax, float *opts, float *info, float *work, float *covar, void *adata);
272
273/* box & linear inequality constraints */
274extern int slevmar_blic_der(
275      void (*func)(float *p, float *hx, int m, int n, void *adata),
276      void (*jacf)(float *p, float *j, int m, int n, void *adata),
277      float *p, float *x, int m, int n, float *lb, float *ub, float *C, float *d, int k2,
278      int itmax, float opts[4], float info[LM_INFO_SZ], float *work, float *covar, void *adata);
279
280extern int slevmar_blic_dif(
281      void (*func)(float *p, float *hx, int m, int n, void *adata),
282      float *p, float *x, int m, int n, float *lb, float *ub, float *C, float *d, int k2,
283      int itmax, float opts[5], float info[LM_INFO_SZ], float *work, float *covar, void *adata);
284
285/* linear equality & inequality constraints */
286extern int slevmar_leic_der(
287      void (*func)(float *p, float *hx, int m, int n, void *adata),
288      void (*jacf)(float *p, float *j, int m, int n, void *adata),
289      float *p, float *x, int m, int n, float *A, float *b, int k1, float *C, float *d, int k2,
290      int itmax, float opts[4], float info[LM_INFO_SZ], float *work, float *covar, void *adata);
291
292extern int slevmar_leic_dif(
293      void (*func)(float *p, float *hx, int m, int n, void *adata),
294      float *p, float *x, int m, int n, float *A, float *b, int k1, float *C, float *d, int k2,
295      int itmax, float opts[5], float info[LM_INFO_SZ], float *work, float *covar, void *adata);
296
297/* linear inequality constraints */
298extern int slevmar_lic_der(
299      void (*func)(float *p, float *hx, int m, int n, void *adata),
300      void (*jacf)(float *p, float *j, int m, int n, void *adata),
301      float *p, float *x, int m, int n, float *C, float *d, int k2,
302      int itmax, float opts[4], float info[LM_INFO_SZ], float *work, float *covar, void *adata);
303
304extern int slevmar_lic_dif(
305      void (*func)(float *p, float *hx, int m, int n, void *adata),
306      float *p, float *x, int m, int n, float *C, float *d, int k2,
307      int itmax, float opts[5], float info[LM_INFO_SZ], float *work, float *covar, void *adata);
308#endif /* HAVE_LAPACK */
309
310#endif /* LM_SNGL_PREC */
311
312/* linear system solvers */
313#ifdef HAVE_LAPACK
314
315#ifdef LM_DBL_PREC
316extern int dAx_eq_b_QR(double *A, double *B, double *x, int m);
317extern int dAx_eq_b_QRLS(double *A, double *B, double *x, int m, int n);
318extern int dAx_eq_b_Chol(double *A, double *B, double *x, int m);
319extern int dAx_eq_b_LU(double *A, double *B, double *x, int m);
320extern int dAx_eq_b_SVD(double *A, double *B, double *x, int m);
321extern int dAx_eq_b_BK(double *A, double *B, double *x, int m);
322#endif /* LM_DBL_PREC */
323
324#ifdef LM_SNGL_PREC
325extern int sAx_eq_b_QR(float *A, float *B, float *x, int m);
326extern int sAx_eq_b_QRLS(float *A, float *B, float *x, int m, int n);
327extern int sAx_eq_b_Chol(float *A, float *B, float *x, int m);
328extern int sAx_eq_b_LU(float *A, float *B, float *x, int m);
329extern int sAx_eq_b_SVD(float *A, float *B, float *x, int m);
330extern int sAx_eq_b_BK(float *A, float *B, float *x, int m);
331#endif /* LM_SNGL_PREC */
332
333#else /* no LAPACK */
334
335#ifdef LM_DBL_PREC
336extern int dAx_eq_b_LU_noLapack(double *A, double *B, double *x, int n);
337#endif /* LM_DBL_PREC */
338
339#ifdef LM_SNGL_PREC
340extern int sAx_eq_b_LU_noLapack(float *A, float *B, float *x, int n);
341#endif /* LM_SNGL_PREC */
342
343#endif /* HAVE_LAPACK */
344
345#ifdef HAVE_PLASMA
346#ifdef LM_DBL_PREC
347extern int dAx_eq_b_PLASMA_Chol(double *A, double *B, double *x, int m);
348#endif
349#ifdef LM_SNGL_PREC
350extern int sAx_eq_b_PLASMA_Chol(float *A, float *B, float *x, int m);
351#endif
352extern void levmar_PLASMA_setnbcores(int cores);
353#endif /* HAVE_PLASMA */
354
355/* Jacobian verification, double & single precision */
356#ifdef LM_DBL_PREC
357extern void dlevmar_chkjac(
358    void (*func)(double *p, double *hx, int m, int n, void *adata),
359    void (*jacf)(double *p, double *j, int m, int n, void *adata),
360    double *p, int m, int n, void *adata, double *err);
361#endif /* LM_DBL_PREC */
362
363#ifdef LM_SNGL_PREC
364extern void slevmar_chkjac(
365    void (*func)(float *p, float *hx, int m, int n, void *adata),
366    void (*jacf)(float *p, float *j, int m, int n, void *adata),
367    float *p, int m, int n, void *adata, float *err);
368#endif /* LM_SNGL_PREC */
369
370/* miscellaneous: standard deviation, coefficient of determination (R2),
371 *                Pearson's correlation coefficient for best-fit parameters
372 */
373#ifdef LM_DBL_PREC
374extern double dlevmar_stddev( double *covar, int m, int i);
375extern double dlevmar_corcoef(double *covar, int m, int i, int j);
376extern double dlevmar_R2(void (*func)(double *p, double *hx, int m, int n, void *adata), double *p, double *x, int m, int n, void *adata);
377
378#endif /* LM_DBL_PREC */
379
380#ifdef LM_SNGL_PREC
381extern float slevmar_stddev( float *covar, int m, int i);
382extern float slevmar_corcoef(float *covar, int m, int i, int j);
383extern float slevmar_R2(void (*func)(float *p, float *hx, int m, int n, void *adata), float *p, float *x, int m, int n, void *adata);
384
385extern void slevmar_locscale(
386        void (*func)(float *p, float *hx, int m, int n, void *adata),
387        float *p, float *x, int m, int n, void *adata,
388        int howto, float locscl[2], float **residptr);
389
390extern int slevmar_outlid(float *r, int n, float thresh, float ls[2], char *outlmap);
391
392#endif /* LM_SNGL_PREC */
393
394#ifdef __cplusplus
395}
396#endif
397
398#endif /* _LEVMAR_H_ */
Note: See TracBrowser for help on using the repository browser.