1 /** D bindings for GSL. 2 Authors: Chibisi Chima-Okereke 3 Copyright: Copyright (c) 2016, Chibisi Chima-Okereke. All rights reserved. 4 License: Boost License 1.0 5 */ 6 7 module gsl.multifit; 8 import gsl.math; 9 import gsl.vector; 10 import gsl.matrix; 11 import gsl.permutation; 12 13 extern (C): 14 15 //gsl_multifit 16 extern __gshared const(gsl_multifit_robust_type)* gsl_multifit_robust_default; 17 extern __gshared const(gsl_multifit_robust_type)* gsl_multifit_robust_bisquare; 18 extern __gshared const(gsl_multifit_robust_type)* gsl_multifit_robust_cauchy; 19 extern __gshared const(gsl_multifit_robust_type)* gsl_multifit_robust_fair; 20 extern __gshared const(gsl_multifit_robust_type)* gsl_multifit_robust_huber; 21 extern __gshared const(gsl_multifit_robust_type)* gsl_multifit_robust_ols; 22 extern __gshared const(gsl_multifit_robust_type)* gsl_multifit_robust_welsch; 23 24 struct gsl_multifit_linear_workspace 25 { 26 size_t nmax; 27 size_t pmax; 28 size_t n; 29 size_t p; 30 gsl_matrix* A; 31 gsl_matrix* Q; 32 gsl_matrix* QSI; 33 gsl_vector* S; 34 gsl_vector* t; 35 gsl_vector* xt; 36 gsl_vector* D; 37 double rcond; 38 } 39 40 struct gsl_multifit_robust_type 41 { 42 const(char)* name; 43 int function (const(gsl_vector)*, gsl_vector*) wfun; 44 int function (const(gsl_vector)*, gsl_vector*) psi_deriv; 45 double tuning_default; 46 } 47 48 struct gsl_multifit_robust_stats 49 { 50 double sigma_ols; 51 double sigma_mad; 52 double sigma_rob; 53 double sigma; 54 double Rsq; 55 double adj_Rsq; 56 double rmse; 57 double sse; 58 size_t dof; 59 size_t numit; 60 gsl_vector* weights; 61 gsl_vector* r; 62 } 63 64 struct gsl_multifit_robust_workspace 65 { 66 size_t n; 67 size_t p; 68 size_t numit; 69 size_t maxiter; 70 const(gsl_multifit_robust_type)* type; 71 double tune; 72 gsl_vector* r; 73 gsl_vector* weights; 74 gsl_vector* c_prev; 75 gsl_vector* resfac; 76 gsl_vector* psi; 77 gsl_vector* dpsi; 78 gsl_matrix* QSI; 79 gsl_vector* D; 80 gsl_vector* workn; 81 gsl_multifit_robust_stats stats; 82 gsl_multifit_linear_workspace* multifit_p; 83 } 84 85 gsl_multifit_linear_workspace* gsl_multifit_linear_alloc (const size_t n, const size_t p); 86 void gsl_multifit_linear_free (gsl_multifit_linear_workspace* w); 87 int gsl_multifit_linear (const(gsl_matrix)* X, const(gsl_vector)* y, gsl_vector* c, gsl_matrix* cov, double* chisq, gsl_multifit_linear_workspace* work); 88 int gsl_multifit_linear_svd (const(gsl_matrix)* X, gsl_multifit_linear_workspace* work); 89 int gsl_multifit_linear_bsvd (const(gsl_matrix)* X, gsl_multifit_linear_workspace* work); 90 int gsl_multifit_linear_solve (const double lambda, const(gsl_matrix)* X, const(gsl_vector)* y, gsl_vector* c, double* rnorm, double* snorm, gsl_multifit_linear_workspace* work); 91 int gsl_multifit_linear_applyW (const(gsl_matrix)* X, const(gsl_vector)* w, const(gsl_vector)* y, gsl_matrix* WX, gsl_vector* Wy); 92 int gsl_multifit_linear_stdform1 (const(gsl_vector)* L, const(gsl_matrix)* X, const(gsl_vector)* y, gsl_matrix* Xs, gsl_vector* ys, gsl_multifit_linear_workspace* work); 93 int gsl_multifit_linear_wstdform1 (const(gsl_vector)* L, const(gsl_matrix)* X, const(gsl_vector)* w, const(gsl_vector)* y, gsl_matrix* Xs, gsl_vector* ys, gsl_multifit_linear_workspace* work); 94 int gsl_multifit_linear_L_decomp (gsl_matrix* L, gsl_vector* tau); 95 int gsl_multifit_linear_stdform2 (const(gsl_matrix)* LQR, const(gsl_vector)* Ltau, const(gsl_matrix)* X, const(gsl_vector)* y, gsl_matrix* Xs, gsl_vector* ys, gsl_matrix* M, gsl_multifit_linear_workspace* work); 96 int gsl_multifit_linear_wstdform2 (const(gsl_matrix)* LQR, const(gsl_vector)* Ltau, const(gsl_matrix)* X, const(gsl_vector)* w, const(gsl_vector)* y, gsl_matrix* Xs, gsl_vector* ys, gsl_matrix* M, gsl_multifit_linear_workspace* work); 97 int gsl_multifit_linear_genform1 (const(gsl_vector)* L, const(gsl_vector)* cs, gsl_vector* c, gsl_multifit_linear_workspace* work); 98 int gsl_multifit_linear_genform2 (const(gsl_matrix)* LQR, const(gsl_vector)* Ltau, const(gsl_matrix)* X, const(gsl_vector)* y, const(gsl_vector)* cs, const(gsl_matrix)* M, gsl_vector* c, gsl_multifit_linear_workspace* work); 99 int gsl_multifit_linear_wgenform2 (const(gsl_matrix)* LQR, const(gsl_vector)* Ltau, const(gsl_matrix)* X, const(gsl_vector)* w, const(gsl_vector)* y, const(gsl_vector)* cs, const(gsl_matrix)* M, gsl_vector* c, gsl_multifit_linear_workspace* work); 100 int gsl_multifit_linear_lreg (const double smin, const double smax, gsl_vector* reg_param); 101 int gsl_multifit_linear_lcurve (const(gsl_vector)* y, gsl_vector* reg_param, gsl_vector* rho, gsl_vector* eta, gsl_multifit_linear_workspace* work); 102 int gsl_multifit_linear_lcorner (const(gsl_vector)* rho, const(gsl_vector)* eta, size_t* idx); 103 int gsl_multifit_linear_lcorner2 (const(gsl_vector)* reg_param, const(gsl_vector)* eta, size_t* idx); 104 int gsl_multifit_linear_Lk (const size_t p, const size_t k, gsl_matrix* L); 105 int gsl_multifit_linear_Lsobolev (const size_t p, const size_t kmax, const(gsl_vector)* alpha, gsl_matrix* L, gsl_multifit_linear_workspace* work); 106 int gsl_multifit_wlinear (const(gsl_matrix)* X, const(gsl_vector)* w, const(gsl_vector)* y, gsl_vector* c, gsl_matrix* cov, double* chisq, gsl_multifit_linear_workspace* work); 107 int gsl_multifit_wlinear_svd (const(gsl_matrix)* X, const(gsl_vector)* w, const(gsl_vector)* y, double tol, size_t* rank, gsl_vector* c, gsl_matrix* cov, double* chisq, gsl_multifit_linear_workspace* work); 108 int gsl_multifit_wlinear_usvd (const(gsl_matrix)* X, const(gsl_vector)* w, const(gsl_vector)* y, double tol, size_t* rank, gsl_vector* c, gsl_matrix* cov, double* chisq, gsl_multifit_linear_workspace* work); 109 int gsl_multifit_linear_est (const(gsl_vector)* x, const(gsl_vector)* c, const(gsl_matrix)* cov, double* y, double* y_err); 110 double gsl_multifit_linear_rcond (const(gsl_multifit_linear_workspace)* w); 111 int gsl_multifit_linear_residuals (const(gsl_matrix)* X, const(gsl_vector)* y, const(gsl_vector)* c, gsl_vector* r); 112 gsl_multifit_robust_workspace* gsl_multifit_robust_alloc (const(gsl_multifit_robust_type)* T, const size_t n, const size_t p); 113 void gsl_multifit_robust_free (gsl_multifit_robust_workspace* w); 114 int gsl_multifit_robust_tune (const double tune, gsl_multifit_robust_workspace* w); 115 int gsl_multifit_robust_maxiter (const size_t maxiter, gsl_multifit_robust_workspace* w); 116 const(char)* gsl_multifit_robust_name (const(gsl_multifit_robust_workspace)* w); 117 gsl_multifit_robust_stats gsl_multifit_robust_statistics (const(gsl_multifit_robust_workspace)* w); 118 int gsl_multifit_robust_weights (const(gsl_vector)* r, gsl_vector* wts, gsl_multifit_robust_workspace* w); 119 int gsl_multifit_robust (const(gsl_matrix)* X, const(gsl_vector)* y, gsl_vector* c, gsl_matrix* cov, gsl_multifit_robust_workspace* w); 120 int gsl_multifit_robust_est (const(gsl_vector)* x, const(gsl_vector)* c, const(gsl_matrix)* cov, double* y, double* y_err); 121 int gsl_multifit_robust_residuals (const(gsl_matrix)* X, const(gsl_vector)* y, const(gsl_vector)* c, gsl_vector* r, gsl_multifit_robust_workspace* w); 122 123 //gsl_multifit_nlin 124 alias gsl_multifit_function_struct gsl_multifit_function; 125 alias gsl_multifit_function_fdf_struct gsl_multifit_function_fdf; 126 127 extern __gshared const(gsl_multifit_fdfsolver_type)* gsl_multifit_fdfsolver_lmsder; 128 extern __gshared const(gsl_multifit_fdfsolver_type)* gsl_multifit_fdfsolver_lmder; 129 extern __gshared const(gsl_multifit_fdfsolver_type)* gsl_multifit_fdfsolver_lmniel; 130 131 struct gsl_multifit_function_struct 132 { 133 int function (const(gsl_vector)*, void*, gsl_vector*) f; 134 size_t n; 135 size_t p; 136 void* params; 137 } 138 139 struct gsl_multifit_fsolver_type 140 { 141 const(char)* name; 142 size_t size; 143 int function (void*, size_t, size_t) alloc; 144 int function (void*, gsl_multifit_function*, gsl_vector*, gsl_vector*, gsl_vector*) set; 145 int function (void*, gsl_multifit_function*, gsl_vector*, gsl_vector*, gsl_vector*) iterate; 146 void function (void*) free; 147 } 148 149 struct gsl_multifit_fsolver 150 { 151 const(gsl_multifit_fsolver_type)* type; 152 gsl_multifit_function* function_; 153 gsl_vector* x; 154 gsl_vector* f; 155 gsl_vector* dx; 156 void* state; 157 } 158 159 struct gsl_multifit_function_fdf_struct 160 { 161 int function (const(gsl_vector)*, void*, gsl_vector*) f; 162 int function (const(gsl_vector)*, void*, gsl_matrix*) df; 163 int function (const(gsl_vector)*, void*, gsl_vector*, gsl_matrix*) fdf; 164 size_t n; 165 size_t p; 166 void* params; 167 size_t nevalf; 168 size_t nevaldf; 169 } 170 171 struct gsl_multifit_fdfsolver_type 172 { 173 const(char)* name; 174 size_t size; 175 int function (void*, size_t, size_t) alloc; 176 int function (void*, const(gsl_vector)*, gsl_multifit_function_fdf*, gsl_vector*, gsl_vector*, gsl_vector*) set; 177 int function (void*, const(gsl_vector)*, gsl_multifit_function_fdf*, gsl_vector*, gsl_vector*, gsl_vector*) iterate; 178 int function (void*, gsl_vector*) gradient; 179 int function (void*, gsl_matrix*) jac; 180 void function (void*) free; 181 } 182 183 struct gsl_multifit_fdfsolver 184 { 185 const(gsl_multifit_fdfsolver_type)* type; 186 gsl_multifit_function_fdf* fdf; 187 gsl_vector* x; 188 gsl_vector* f; 189 gsl_vector* dx; 190 gsl_vector* g; 191 gsl_vector* sqrt_wts; 192 size_t niter; 193 void* state; 194 } 195 196 struct gsl_multifit_fdfridge 197 { 198 size_t n; 199 size_t p; 200 double lambda; 201 const(gsl_vector)* L_diag; 202 const(gsl_matrix)* L; 203 gsl_vector* f; 204 gsl_vector* wts; 205 gsl_multifit_fdfsolver* s; 206 gsl_multifit_function_fdf* fdf; 207 gsl_multifit_function_fdf fdftik; 208 } 209 210 int gsl_multifit_gradient (const(gsl_matrix)* J, const(gsl_vector)* f, gsl_vector* g); 211 int gsl_multifit_covar (const(gsl_matrix)* J, const double epsrel, gsl_matrix* covar); 212 int gsl_multifit_covar_QRPT (gsl_matrix* r, gsl_permutation* perm, const double epsrel, gsl_matrix* covar); 213 gsl_multifit_fsolver* gsl_multifit_fsolver_alloc (const(gsl_multifit_fsolver_type)* T, size_t n, size_t p); 214 void gsl_multifit_fsolver_free (gsl_multifit_fsolver* s); 215 int gsl_multifit_fsolver_set (gsl_multifit_fsolver* s, gsl_multifit_function* f, const(gsl_vector)* x); 216 int gsl_multifit_fsolver_iterate (gsl_multifit_fsolver* s); 217 int gsl_multifit_fsolver_driver (gsl_multifit_fsolver* s, const size_t maxiter, const double epsabs, const double epsrel); 218 const(char)* gsl_multifit_fsolver_name (const(gsl_multifit_fsolver)* s); 219 gsl_vector* gsl_multifit_fsolver_position (const(gsl_multifit_fsolver)* s); 220 gsl_multifit_fdfsolver* gsl_multifit_fdfsolver_alloc (const(gsl_multifit_fdfsolver_type)* T, size_t n, size_t p); 221 int gsl_multifit_fdfsolver_set (gsl_multifit_fdfsolver* s, gsl_multifit_function_fdf* fdf, const(gsl_vector)* x); 222 int gsl_multifit_fdfsolver_wset (gsl_multifit_fdfsolver* s, gsl_multifit_function_fdf* f, const(gsl_vector)* x, const(gsl_vector)* wts); 223 int gsl_multifit_fdfsolver_iterate (gsl_multifit_fdfsolver* s); 224 int gsl_multifit_fdfsolver_driver (gsl_multifit_fdfsolver* s, const size_t maxiter, const double xtol, const double gtol, const double ftol, int* info); 225 int gsl_multifit_fdfsolver_jac (gsl_multifit_fdfsolver* s, gsl_matrix* J); 226 void gsl_multifit_fdfsolver_free (gsl_multifit_fdfsolver* s); 227 const(char)* gsl_multifit_fdfsolver_name (const(gsl_multifit_fdfsolver)* s); 228 gsl_vector* gsl_multifit_fdfsolver_position (const(gsl_multifit_fdfsolver)* s); 229 gsl_vector* gsl_multifit_fdfsolver_residual (const(gsl_multifit_fdfsolver)* s); 230 size_t gsl_multifit_fdfsolver_niter (const(gsl_multifit_fdfsolver)* s); 231 int gsl_multifit_eval_wf (gsl_multifit_function_fdf* fdf, const(gsl_vector)* x, const(gsl_vector)* wts, gsl_vector* y); 232 int gsl_multifit_eval_wdf (gsl_multifit_function_fdf* fdf, const(gsl_vector)* x, const(gsl_vector)* wts, gsl_matrix* dy); 233 int gsl_multifit_fdfsolver_test (const(gsl_multifit_fdfsolver)* s, const double xtol, const double gtol, const double ftol, int* info); 234 int gsl_multifit_test_delta (const(gsl_vector)* dx, const(gsl_vector)* x, double epsabs, double epsrel); 235 int gsl_multifit_test_gradient (const(gsl_vector)* g, double epsabs); 236 int gsl_multifit_fdfsolver_dif_df (const(gsl_vector)* x, const(gsl_vector)* wts, gsl_multifit_function_fdf* fdf, const(gsl_vector)* f, gsl_matrix* J); 237 int gsl_multifit_fdfsolver_dif_fdf (const(gsl_vector)* x, gsl_multifit_function_fdf* fdf, gsl_vector* f, gsl_matrix* J); 238 gsl_multifit_fdfridge* gsl_multifit_fdfridge_alloc (const(gsl_multifit_fdfsolver_type)* T, const size_t n, const size_t p); 239 void gsl_multifit_fdfridge_free (gsl_multifit_fdfridge* work); 240 const(char)* gsl_multifit_fdfridge_name (const(gsl_multifit_fdfridge)* w); 241 gsl_vector* gsl_multifit_fdfridge_position (const(gsl_multifit_fdfridge)* w); 242 gsl_vector* gsl_multifit_fdfridge_residual (const(gsl_multifit_fdfridge)* w); 243 size_t gsl_multifit_fdfridge_niter (const(gsl_multifit_fdfridge)* w); 244 int gsl_multifit_fdfridge_set (gsl_multifit_fdfridge* w, gsl_multifit_function_fdf* f, const(gsl_vector)* x, const double lambda); 245 int gsl_multifit_fdfridge_wset (gsl_multifit_fdfridge* w, gsl_multifit_function_fdf* f, const(gsl_vector)* x, const double lambda, const(gsl_vector)* wts); 246 int gsl_multifit_fdfridge_set2 (gsl_multifit_fdfridge* w, gsl_multifit_function_fdf* f, const(gsl_vector)* x, const(gsl_vector)* lambda); 247 int gsl_multifit_fdfridge_wset2 (gsl_multifit_fdfridge* w, gsl_multifit_function_fdf* f, const(gsl_vector)* x, const(gsl_vector)* lambda, const(gsl_vector)* wts); 248 int gsl_multifit_fdfridge_set3 (gsl_multifit_fdfridge* w, gsl_multifit_function_fdf* f, const(gsl_vector)* x, const(gsl_matrix)* L); 249 int gsl_multifit_fdfridge_wset3 (gsl_multifit_fdfridge* w, gsl_multifit_function_fdf* f, const(gsl_vector)* x, const(gsl_matrix)* L, const(gsl_vector)* wts); 250 int gsl_multifit_fdfridge_iterate (gsl_multifit_fdfridge* w); 251 int gsl_multifit_fdfridge_driver (gsl_multifit_fdfridge* w, const size_t maxiter, const double xtol, const double gtol, const double ftol, int* info);