1 /////////////////////////////////////////////////////////////////////////////////
2 //
3 //  Levenberg - Marquardt non-linear minimization algorithm
4 //  Copyright (C) 2004  Manolis Lourakis (lourakis at ics forth gr)
5 //  Institute of Computer Science, Foundation for Research & Technology - Hellas
6 //  Heraklion, Crete, Greece.
7 //
8 //  This program is free software; you can redistribute it and/or modify
9 //  it under the terms of the GNU General Public License as published by
10 //  the Free Software Foundation; either version 2 of the License, or
11 //  (at your option) any later version.
12 //
13 //  This program is distributed in the hope that it will be useful,
14 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 //  GNU General Public License for more details.
17 //
18 /////////////////////////////////////////////////////////////////////////////////
19 
20 /********************************************************************************
21  * Levenberg-Marquardt nonlinear minimization. The same core code is used with
22  * appropriate #defines to derive single and double precision versions, see
23  * also lm_core.c
24  ********************************************************************************/
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <math.h>
29 #include <float.h>
30 
31 #include "levmar.h"
32 #include "compiler.h"
33 #include "misc.h"
34 
35 #define EPSILON       1E-12
36 #define ONE_THIRD     0.3333333334 /* 1.0/3.0 */
37 
38 #if !defined(LM_DBL_PREC) && !defined(LM_SNGL_PREC)
39 #error At least one of LM_DBL_PREC, LM_SNGL_PREC should be defined!
40 #endif
41 
42 
43 #ifdef LM_SNGL_PREC
44 /* single precision (float) definitions */
45 #define LM_REAL float
46 #define LM_PREFIX s
47 
48 #define LM_REAL_MAX FLT_MAX
49 #define LM_REAL_MIN -FLT_MAX
50 #define LM_REAL_EPSILON FLT_EPSILON
51 #define __SUBCNST(x) x##F
52 #define LM_CNST(x) __SUBCNST(x) // force substitution
53 
54 #include "lm_core.c" // read in core code
55 
56 #undef LM_REAL
57 #undef LM_PREFIX
58 #undef LM_REAL_MAX
59 #undef LM_REAL_EPSILON
60 #undef LM_REAL_MIN
61 #undef __SUBCNST
62 #undef LM_CNST
63 #endif /* LM_SNGL_PREC */
64 
65 #ifdef LM_DBL_PREC
66 /* double precision definitions */
67 #define LM_REAL double
68 #define LM_PREFIX d
69 
70 #define LM_REAL_MAX DBL_MAX
71 #define LM_REAL_MIN -DBL_MAX
72 #define LM_REAL_EPSILON DBL_EPSILON
73 #define LM_CNST(x) (x)
74 
75 #include "lm_core.c" // read in core code
76 
77 #undef LM_REAL
78 #undef LM_PREFIX
79 #undef LM_REAL_MAX
80 #undef LM_REAL_EPSILON
81 #undef LM_REAL_MIN
82 #undef LM_CNST
83 #endif /* LM_DBL_PREC */
84