blob: 47469c82ee9881aa1fc65dc9409ed38dbb54bda0 [file] [log] [blame]
/*
* 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 <float.h>
#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 */