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);