From 5985e89c8d7460f17ede727615bad795b3ab2c87 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 9 Apr 2018 09:14:06 -0600 Subject: Added MPFIT based poser --- redist/mpfit/mpfit.h | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 redist/mpfit/mpfit.h (limited to 'redist/mpfit/mpfit.h') diff --git a/redist/mpfit/mpfit.h b/redist/mpfit/mpfit.h new file mode 100644 index 0000000..67bf635 --- /dev/null +++ b/redist/mpfit/mpfit.h @@ -0,0 +1,192 @@ +/* + * 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 */ -- cgit v1.2.3