ccgsl 2.7.2
C++wrappersforGnuScientificLibrary
fit.hpp
Go to the documentation of this file.
1/*
2 * $Id: fit.hpp 281 2012-08-26 14:35:20Z jdl3 $
3 * Copyright (C) 2011, 2012, 2020 John D Lamb
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or (at
8 * your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20#ifndef CCGSL_FIT_HPP
21#define CCGSL_FIT_HPP
22
23#include<cmath>
24#include<exception>
25#include<gsl/gsl_fit.h>
26#include"vector.hpp"
27
28namespace gsl {
35 namespace fit {
51 inline int linear( double const* x, size_t const xstride, double const* y,
52 size_t const ystride,
53 size_t const n, double* c0, double* c1, double* cov00, double* cov01,
54 double* cov11, double* sumsq ){
55 return gsl_fit_linear( x, xstride, y, ystride, n, c0, c1, cov00, cov01, cov11, sumsq ); }
56
74 inline int wlinear( double const* x, size_t const xstride, double const* w,
75 size_t const wstride,
76 double const* y, size_t const ystride, size_t const n, double* c0,
77 double* c1,
78 double* cov00, double* cov01, double* cov11, double* chisq ){
79 return gsl_fit_wlinear( x, xstride, w, wstride, y, ystride, n, c0, c1, cov00, cov01,
80 cov11, chisq ); }
81
94 inline int linear_est( double const x, double const c0, double const c1, double const cov00,
95 double const cov01, double const cov11, double* y, double* y_err ){
96 return gsl_fit_linear_est( x, c0, c1, cov00, cov01, cov11, y, y_err ); }
97
110 inline int mul( double const* x, size_t const xstride, double const* y, size_t const ystride,
111 size_t const n, double* c1, double* cov11, double* sumsq ){
112 return gsl_fit_mul( x, xstride, y, ystride, n, c1, cov11, sumsq ); }
113
128 inline int wmul( double const* x, size_t const xstride, double const* w,
129 size_t const wstride,
130 double const* y, size_t const ystride, size_t const n,
131 double* c1, double* cov11, double* chisq ){
132 return gsl_fit_wmul( x, xstride, w, wstride, y, ystride, n, c1, cov11, chisq ); }
133
143 inline int mul_est( double const x, double const c1, double const cov11, double* y, double* y_err ){
144 return gsl_fit_mul_est( x, c1, cov11, y, y_err ); }
145
146 // Versions without stride arguments
147
161 inline int linear( double const* x, double const* y,
162 size_t const n, double* c0, double* c1, double* cov00,
163 double* cov01, double* cov11,
164 double* sumsq ){
165 return gsl_fit_linear( x, 1, y, 1, n, c0, c1, cov00, cov01, cov11, sumsq ); }
166
181 inline int wlinear( double const* x, double const* w,
182 double const* y, size_t const n, double* c0, double* c1,
183 double* cov00, double* cov01, double* cov11, double* chisq ){
184 return gsl_fit_wlinear( x, 1, w, 1, y, 1, n, c0, c1, cov00, cov01, cov11, chisq ); }
185
196 inline int mul( double const* x, double const* y,
197 size_t const n, double* c1, double* cov11, double* sumsq ){
198 return gsl_fit_mul( x, 1, y, 1, n, c1, cov11, sumsq ); }
199
211 inline int wmul( double const* x, double const* w,
212 double const* y, size_t const n, double* c1, double* cov11,
213 double* chisq ){
214 return gsl_fit_wmul( x, 1, w, 1, y, 1, n, c1, cov11, chisq ); }
215
216 // CCGSL additions
217
218#ifndef DOXYGEN_SKIP
233 inline int linear( gsl::vector const& x, gsl::vector const& y, double* c0, double* c1,
234 double* cov00, double* cov01, double* cov11, double* sumsq,
235 size_t const n = 0 ){
236 return linear( x.data(), x.get()->stride, y.data(), y.get()->stride,
237 n == 0 ? y.size() / y.get()->stride : n, c0, c1, cov00,
238 cov01, cov11, sumsq ); }
239
255 inline int wlinear( gsl::vector const& x, gsl::vector const& w,
256 gsl::vector const& y, double* c0, double* c1, double* cov00,
257 double* cov01,
258 double* cov11, double* chisq, size_t const n = 0 ){
259 return wlinear( x.data(), x.get()->stride, w.data(), w.get()->stride,
260 y.data(), y.get()->stride, n == 0 ? y.size() / y.get()->stride : n, c0, c1,
261 cov00, cov01, cov11, chisq ); }
262
275 inline int mul( gsl::vector const& x, gsl::vector const& y, double* c1, double* cov11,
276 double* sumsq, size_t const n = 0 ){
277 return mul( x.data(), x.get()->stride, y.data(), y.get()->stride,
278 n == 0 ? y.size() / y.get()->stride : n, c1, cov11, sumsq ); }
279
293 inline int wmul( gsl::vector const& x, gsl::vector const& w,
294 gsl::vector const& y, double* c1, double* cov11, double* chisq,
295 size_t const n = 0 ){
296 return wmul( x.data(), x.get()->stride, w.data(), w.get()->stride,
297 y.data(), y.get()->stride, n == 0 ? y.size() / y.get()->stride : n,
298 c1, cov11, chisq ); }
299#endif /* DOXYGEN_SKIP */
300
301 // Template versions
302#ifndef DOXYGEN_SKIP
317 template<typename ARRAY>
318 inline int linear( ARRAY const& x, ARRAY const& y, double* c0, double* c1,
319 double* cov00, double* cov01, double* cov11, double* sumsq,
320 size_t const n = 0 ){
321 return linear( x.data(), 1, y.data(), 1,
322 n == 0 ? y.size() : n, c0, c1, cov00, cov01, cov11, sumsq ); }
323
340 template<typename ARRAY>
341 inline int wlinear( ARRAY const& x, ARRAY const& w,
342 ARRAY const& y, double* c0, double* c1, double* cov00, double* cov01,
343 double* cov11, double* chisq, size_t const n = 0 ){
344 return wlinear( x.data(), 1, w.data(), 1, y.data(), 1, n == 0 ? y.size() : n, c0, c1,
345 cov00, cov01, cov11, chisq ); }
346
359 template<typename ARRAY>
360 inline int mul( ARRAY const& x, ARRAY const& y, double* c1, double* cov11,
361 double* sumsq, size_t const n = 0 ){
362 return mul( x.data(), 1, y.data(), 1, n == 0 ? y.size() : n, c1, cov11, sumsq ); }
363
377 template<typename ARRAY>
378 inline int wmul( ARRAY const& x, ARRAY const& w,
379 ARRAY const& y, double* c1, double* cov11, double* chisq,
380 size_t const n = 0 ){
381 return wmul( x.data(), 1, w.data(), 1, y.data(), 1, n == 0 ? y.size() : n,
382 c1, cov11, chisq ); }
383#endif
384 // Template versions with no pointers to doubles
399 template<typename ARRAY>
400 inline int linear( ARRAY const& x, ARRAY const& y, double& c0, double& c1,
401 double& cov00, double& cov01, double& cov11, double& sumsq,
402 size_t const n = 0 ){
403 if( 0 == n ){
404 if( x.size() != y.size() )
405 throw std::length_error("gsl::fit::linear(): x and y must have same size.");
406 } else {
407 if( x.size() != n)
408 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have x.size() = n.");
409 if( y.size() != n)
410 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have y.size() = n.");
411 }
412 return linear( x.data(), 1, y.data(), 1,
413 n == 0 ? y.size() : n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq ); }
414
431 template<typename ARRAY>
432 inline int wlinear( ARRAY const& x, ARRAY const& w,
433 ARRAY const& y, double& c0, double& c1, double& cov00, double& cov01,
434 double& cov11, double& chisq, size_t const n = 0 ){
435 if( 0 == n ){
436 if( x.size() != y.size() )
437 throw std::length_error("gsl::fit::linear(): x and y must have same size.");
438 if( w.size() != y.size() )
439 throw std::length_error("gsl::fit::linear(): w and y must have same size.");
440 } else {
441 if( x.size() != n)
442 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have x.size() = n.");
443 if( y.size() != n)
444 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have y.size() = n.");
445 if( w.size() != n)
446 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have w.size() = n.");
447 }
448 return wlinear( x.data(), 1, w.data(), 1, y.data(), 1, n == 0 ? y.size() : n, &c0, &c1,
449 &cov00, &cov01, &cov11, &chisq ); }
450
463 template<typename ARRAY>
464 inline int mul( ARRAY const& x, ARRAY const& y, double& c1, double& cov11,
465 double& sumsq, size_t const n = 0 ){
466 if( 0 == n ){
467 if( x.size() != y.size() )
468 throw std::length_error("gsl::fit::linear(): x and y must have same size.");
469 } else {
470 if( x.size() != n)
471 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have x.size() = n.");
472 if( y.size() != n)
473 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have y.size() = n.");
474 }
475 return mul( x.data(), 1, y.data(), 1, n == 0 ? y.size() : n, &c1, &cov11, &sumsq ); }
476
490 template<typename ARRAY>
491 inline int wmul( ARRAY const& x, ARRAY const& w,
492 ARRAY const& y, double& c1, double& cov11, double& chisq,
493 size_t const n = 0 ){
494 if( 0 == n ){
495 if( x.size() != y.size() )
496 throw std::length_error("gsl::fit::linear(): x and y must have same size.");
497 if( w.size() != y.size() )
498 throw std::length_error("gsl::fit::linear(): w and y must have same size.");
499 } else {
500 if( x.size() != n)
501 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have x.size() = n.");
502 if( y.size() != n)
503 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have y.size() = n.");
504 if( w.size() != n)
505 throw std::length_error("gsl::fit::linear(): if n ≠ 0, you must have w.size() = n.");
506 }
507 return wmul( x.data(), 1, w.data(), 1, y.data(), 1, n == 0 ? y.size() : n,
508 &c1, &cov11, &chisq ); }
509
510 }
511}
512#endif
This class handles vector objects as shared handles.
Definition: vector.hpp:74
gsl_vector * get()
Get the gsl_vector.
Definition: vector.hpp:1320
size_type size() const
The size (number of elements) of the vector.
Definition: vector.hpp:1169
double * data()
Give access to the data block.
Definition: vector.hpp:1177
int wmul(double const *x, size_t const xstride, double const *w, size_t const wstride, double const *y, size_t const ystride, size_t const n, double *c1, double *cov11, double *chisq)
C++ version of gsl_fit_wmul().
Definition: fit.hpp:128
int mul(double const *x, size_t const xstride, double const *y, size_t const ystride, size_t const n, double *c1, double *cov11, double *sumsq)
C++ version of gsl_fit_mul().
Definition: fit.hpp:110
int linear(double const *x, size_t const xstride, double const *y, size_t const ystride, size_t const n, double *c0, double *c1, double *cov00, double *cov01, double *cov11, double *sumsq)
C++ version of gsl_fit_linear().
Definition: fit.hpp:51
int mul_est(double const x, double const c1, double const cov11, double *y, double *y_err)
C++ version of gsl_fit_mul_est().
Definition: fit.hpp:143
int linear_est(double const x, double const c0, double const c1, double const cov00, double const cov01, double const cov11, double *y, double *y_err)
C++ version of gsl_fit_linear_est().
Definition: fit.hpp:94
int wlinear(double const *x, size_t const xstride, double const *w, size_t const wstride, double const *y, size_t const ystride, size_t const n, double *c0, double *c1, double *cov00, double *cov01, double *cov11, double *chisq)
C++ version of gsl_fit_wlinear().
Definition: fit.hpp:74
double chisq(rng const &r, double const nu)
C++ version of gsl_ran_chisq().
Definition: randist.hpp:365
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
Definition: rstat.hpp:299
The gsl package creates an interface to the GNU Scientific Library for C++.
Definition: blas.hpp:34