/* * MINPACK-1 Least Squares Fitting Library * * Original public domain version by B. Garbow, K. Hillstrom, J. More' * (Argonne National Laboratory, MINPACK project, March 1980) * * Tranlation to C Language by S. Moshier (moshier.net) * * Enhancements and packaging by C. Markwardt * (comparable to IDL fitting routine MPFIT * see http://cow.physics.wisc.edu/~craigm/idl/idl.html) */ /* Header file defining constants, data structures and functions of mpfit library $Id: mpfit.h,v 1.16 2016/06/02 19:14:16 craigm Exp $ */ #ifndef MPFIT_H #define MPFIT_H /* This is a C library. Allow compilation with a C++ compiler */ #ifdef __cplusplus extern "C" { #endif /* MPFIT version string */ #define MPFIT_VERSION "1.3" /* Definition of a parameter constraint structure */ struct mp_par_struct { int fixed; /* 1 = fixed; 0 = free */ int limited[2]; /* 1 = low/upper limit; 0 = no limit */ double limits[2]; /* lower/upper limit boundary value */ char *parname; /* Name of parameter, or 0 for none */ double step; /* Step size for finite difference */ double relstep; /* Relative step size for finite difference */ int side; /* Sidedness of finite difference derivative 0 - one-sided derivative computed automatically 1 - one-sided derivative (f(x+h) - f(x) )/h -1 - one-sided derivative (f(x) - f(x-h))/h 2 - two-sided derivative (f(x+h) - f(x-h))/(2*h) 3 - user-computed analytical derivatives */ int deriv_debug; /* Derivative debug mode: 1 = Yes; 0 = No; If yes, compute both analytical and numerical derivatives and print them to the console for comparison. NOTE: when debugging, do *not* set side = 3, but rather to the kind of numerical derivative you want to compare the user-analytical one to (0, 1, -1, or 2). */ double deriv_reltol; /* Relative tolerance for derivative debug printout */ double deriv_abstol; /* Absolute tolerance for derivative debug printout */ }; /* Just a placeholder - do not use!! */ typedef void (*mp_iterproc)(void); /* Definition of MPFIT configuration structure */ struct mp_config_struct { /* NOTE: the user may set the value explicitly; OR, if the passed value is zero, then the "Default" value will be substituted by mpfit(). */ double ftol; /* Relative chi-square convergence criterium Default: 1e-10 */ double xtol; /* Relative parameter convergence criterium Default: 1e-10 */ double gtol; /* Orthogonality convergence criterium Default: 1e-10 */ double epsfcn; /* Finite derivative step size Default: MP_MACHEP0 */ double stepfactor; /* Initial step bound Default: 100.0 */ double covtol; /* Range tolerance for covariance calculation Default: 1e-14 */ int maxiter; /* Maximum number of iterations. If maxiter == MP_NO_ITER, then basic error checking is done, and parameter errors/covariances are estimated based on input parameter values, but no fitting iterations are done. Default: 200 */ #define MP_NO_ITER (-1) /* No iterations, just checking */ int maxfev; /* Maximum number of function evaluations, or 0 for no limit Default: 0 (no limit) */ int nprint; /* Default: 1 */ int douserscale; /* Scale variables by user values? 1 = yes, user scale values in diag; 0 = no, variables scaled internally (Default) */ int nofinitecheck; /* Disable check for infinite quantities from user? 0 = do not perform check (Default) 1 = perform check */ mp_iterproc iterproc; /* Placeholder pointer - must set to 0 */ }; /* Definition of results structure, for when fit completes */ struct mp_result_struct { double bestnorm; /* Final chi^2 */ double orignorm; /* Starting value of chi^2 */ int niter; /* Number of iterations */ int nfev; /* Number of function evaluations */ int status; /* Fitting status code */ int npar; /* Total number of parameters */ int nfree; /* Number of free parameters */ int npegged; /* Number of pegged parameters */ int nfunc; /* Number of residuals (= num. of data points) */ double *resid; /* Final residuals nfunc-vector, or 0 if not desired */ double *xerror; /* Final parameter uncertainties (1-sigma) npar-vector, or 0 if not desired */ double *covar; /* Final parameter covariance matrix npar x npar array, or 0 if not desired */ char version[20]; /* MPFIT version string */ }; /* Convenience typedefs */ typedef struct mp_par_struct mp_par; typedef struct mp_config_struct mp_config; typedef struct mp_result_struct mp_result; /* Enforce type of fitting function */ typedef int (*mp_func)(int m, /* Number of functions (elts of fvec) */ int n, /* Number of variables (elts of x) */ double *x, /* I - Parameters */ double *fvec, /* O - function values */ double **dvec, /* O - function derivatives (optional)*/ void *private_data); /* I/O - function private data*/ /* Error codes */ #define MP_ERR_INPUT (0) /* General input parameter error */ #define MP_ERR_NAN (-16) /* User function produced non-finite values */ #define MP_ERR_FUNC (-17) /* No user function was supplied */ #define MP_ERR_NPOINTS (-18) /* No user data points were supplied */ #define MP_ERR_NFREE (-19) /* No free parameters */ #define MP_ERR_MEMORY (-20) /* Memory allocation error */ #define MP_ERR_INITBOUNDS (-21) /* Initial values inconsistent w constraints*/ #define MP_ERR_BOUNDS (-22) /* Initial constraints inconsistent */ #define MP_ERR_PARAM (-23) /* General input parameter error */ #define MP_ERR_DOF (-24) /* Not enough degrees of freedom */ /* Potential success status codes */ #define MP_OK_CHI (1) /* Convergence in chi-square value */ #define MP_OK_PAR (2) /* Convergence in parameter value */ #define MP_OK_BOTH (3) /* Both MP_OK_PAR and MP_OK_CHI hold */ #define MP_OK_DIR (4) /* Convergence in orthogonality */ #define MP_MAXITER (5) /* Maximum number of iterations reached */ #define MP_FTOL (6) /* ftol is too small; no further improvement*/ #define MP_XTOL (7) /* xtol is too small; no further improvement*/ #define MP_GTOL (8) /* gtol is too small; no further improvement*/ /* Double precision numeric constants */ #define MP_MACHEP0 2.2204460e-16 #define MP_DWARF 2.2250739e-308 #define MP_GIANT 1.7976931e+308 #if 0 /* Float precision */ #define MP_MACHEP0 1.19209e-07 #define MP_DWARF 1.17549e-38 #define MP_GIANT 3.40282e+38 #endif #define MP_RDWARF (sqrt(MP_DWARF * 1.5) * 10) #define MP_RGIANT (sqrt(MP_GIANT) * 0.1) /* External function prototype declarations */ extern int mpfit(mp_func funct, int m, int npar, double *xall, mp_par *pars, mp_config *config, void *private_data, mp_result *result); /* C99 uses isfinite() instead of finite() */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define mpfinite(x) isfinite(x) /* Microsoft C uses _finite(x) instead of finite(x) */ #elif defined(_MSC_VER) && _MSC_VER #include #define mpfinite(x) _finite(x) /* Default is to assume that compiler/library has finite() function */ #else #define mpfinite(x) finite(x) #endif #ifdef __cplusplus } /* extern "C" */ #endif #endif /* MPFIT_H */