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