ccgsl 2.7.2
C++wrappersforGnuScientificLibrary
multiroots.hpp
Go to the documentation of this file.
1/*
2 * $Id: multiroots.hpp 171 2012-06-19 19:15:15Z jdl3 $
3 * Copyright (C) 2010, 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_MULTIROOTS_HPP
21#define CCGSL_MULTIROOTS_HPP
22
23#include<gsl/gsl_multiroots.h>
24#include"vector.hpp"
26#include"matrix.hpp"
28
29namespace gsl {
33 namespace multiroot {
43 inline int fdjacobian( multiroot::function& F, vector const& x, vector const& f,
44 double epsrel, matrix& jacobian ){
45 return gsl_multiroot_fdjacobian( &F, x.get(), f.get(), epsrel, jacobian.get() ); }
46#ifndef DOXYGEN_SKIP
56 inline int fdjacobian( gsl_multiroot_function* F, vector const& x, vector const& f,
57 double epsrel, matrix& jacobian ){
58 return gsl_multiroot_fdjacobian( F, x.get(), f.get(), epsrel, jacobian.get() ); }
59#endif // DOXYGEN_SKIP
60
65 class fsolver {
66 public:
70 typedef gsl_multiroot_fsolver_type type;
75 ccgsl_pointer = 0;
76 count = 0; // initially nullptr will do
77 }
78 // Refines random access container
79 // Refines assignable
85 explicit fsolver( type const* T, size_t const n ){
86 ccgsl_pointer = gsl_multiroot_fsolver_alloc( T, n );
87 // just plausibly we could allocate fsolver but not count
88 try { count = new size_t; } catch( std::bad_alloc& e ){
89 // try to tidy up before rethrowing
90 gsl_multiroot_fsolver_free( ccgsl_pointer );
91 throw e;
92 }
93 *count = 1; // initially there is just one reference to ccgsl_pointer
94 }
101 explicit fsolver( gsl_multiroot_fsolver* v ){
102 ccgsl_pointer = v;
103 // just plausibly we could fail to allocate count: no further action needed.
104 count = new size_t;
105 *count = 1; // initially there is just one reference to ccgsl_pointer
106 }
107 // copy constructor
113 count = v.count; if( count != 0 ) ++*count; }
114 // assignment operator
120 // first, possibly delete anything pointed to by this
121 if( count == 0 or --*count == 0 ){
122 if( ccgsl_pointer != 0 ) gsl_multiroot_fsolver_free( ccgsl_pointer );
123 delete count;
124 } // Then copy
125 ccgsl_pointer = v.ccgsl_pointer; count = v.count; if( count != 0 ) ++*count; return *this;
126 }
127 // destructor
132 if( count == 0 or --*count == 0 ){
133 // could have allocated null pointer
134 if( ccgsl_pointer != 0 ) gsl_multiroot_fsolver_free( ccgsl_pointer );
135 delete count;
136 }
137 }
138#ifdef __GXX_EXPERIMENTAL_CXX0X__
144 std::swap( count, v.count );
145 v.ccgsl_pointer = nullptr;
146 }
153 fsolver( std::move( v ) ).swap( *this );
154 return *this;
155 }
156#endif
157 // Refines equality comparable
158 // == operator
165 bool operator==( fsolver const& v ) const { return ccgsl_pointer == v.ccgsl_pointer; }
166 // != operator
173 bool operator!=( fsolver const& v ) const { return not operator==( v ); }
174 // Refines forward container
175 // Refines less than comparable
176 // operator<
185 bool operator<( fsolver const& v ) const { return ccgsl_pointer < v.ccgsl_pointer; }
186 // operator>
195 bool operator>( fsolver const& v ) const { return ccgsl_pointer > v.ccgsl_pointer; }
196 // operator<=
205 bool operator<=( fsolver const& v ) const { return ccgsl_pointer <= v.ccgsl_pointer; }
206 // operator>=
215 bool operator>=( fsolver const& v ) const { return ccgsl_pointer >= v.ccgsl_pointer; }
220 bool empty() const { return ccgsl_pointer == 0; }
221 // swap() --- should work even if sizes don't match
227 void swap( fsolver& v ){
228 std::swap( ccgsl_pointer, v.ccgsl_pointer );
229 std::swap( count, v.count );
230 }
231 private:
235 gsl_multiroot_fsolver* ccgsl_pointer;
239 size_t* count;
240 public:
241 // shared reference functions
246 gsl_multiroot_fsolver* get() const { return ccgsl_pointer; }
252 bool unique() const { return count != 0 and *count == 1; }
257 size_t use_count() const { return count == 0 ? 0 : *count; }
263#ifdef __GXX_EXPERIMENTAL_CXX0X__
264 explicit
265#endif
266 operator bool() const { return ccgsl_pointer != 0; }
267
268#ifndef DOXYGEN_SKIP
276 inline static int set( fsolver& s, function* f, vector const& x ){
277 return gsl_multiroot_fsolver_set( s.get(), f, x.get() ); }
278#endif // DOXYGEN_SKIP
286 inline static int set( fsolver& s, function& f, vector const& x ){
287 return gsl_multiroot_fsolver_set( s.get(), &f, x.get() ); }
288
294 inline static int iterate( fsolver& s ){
295 return gsl_multiroot_fsolver_iterate( s.get() ); }
296
302 inline static std::string name( fsolver const& s ){
303 return std::string( gsl_multiroot_fsolver_name( s.get() ) ); }
304
312 inline static vector root( fsolver const& s ){
313 vector result( gsl_multiroot_fsolver_root( s.get() ) );
314 return result;
315 }
316
324 inline static vector dx( fsolver const& s ){
325 vector result( gsl_multiroot_fsolver_dx( s.get() ) );
326 return result;
327 }
328
336 inline static vector f( fsolver const& s ){
337 vector result( gsl_multiroot_fsolver_f( s.get() ) );
338 return result;
339 }
340
341 // Member functions
342
343#ifndef DOXYGEN_SKIP
350 int set( function* f, vector const& x ){
351 return gsl_multiroot_fsolver_set( get(), f, x.get() ); }
352#endif // DOXYGEN_SKIP
359 int set( function& f, vector const& x ){
360 return gsl_multiroot_fsolver_set( get(), &f, x.get() ); }
361
366 int iterate(){
367 return gsl_multiroot_fsolver_iterate( get() ); }
368
373 char const* name(){ return gsl_multiroot_fsolver_name( get() ); }
374
381 vector const root(){
383 result.wrap_gsl_vector_without_ownership( gsl_multiroot_fsolver_root( get() ) );
384 return result;
385 }
386
393 vector const dx(){
395 result.wrap_gsl_vector_without_ownership( gsl_multiroot_fsolver_dx( get() ) );
396 return result;
397 }
398
405 vector const f(){
407 result. wrap_gsl_vector_without_ownership( gsl_multiroot_fsolver_f( get() ) );
408 return result;
409 }
410
411 // Solver types
416 inline static type const* dnewton(){ return gsl_multiroot_fsolver_dnewton; }
421 inline static type const* broyden(){ return gsl_multiroot_fsolver_broyden; }
426 inline static type const* hybrid(){ return gsl_multiroot_fsolver_hybrid; }
431 inline static type const* hybrids(){ return gsl_multiroot_fsolver_hybrids; }
432 };
433
438 class fdfsolver {
439 public:
443 typedef gsl_multiroot_fdfsolver_type type;
448 ccgsl_pointer = 0;
449 count = 0; // initially nullptr will do
450 }
451 // Refines random access container
452 // Refines assignable
458 explicit fdfsolver( type const* T, size_t const n ){
459 ccgsl_pointer = gsl_multiroot_fdfsolver_alloc( T, n );
460 // just plausibly we could allocate fdfsolver but not count
461 try { count = new size_t; } catch( std::bad_alloc& e ){
462 // try to tidy up before rethrowing
463 gsl_multiroot_fdfsolver_free( ccgsl_pointer );
464 throw e;
465 }
466 *count = 1; // initially there is just one reference to ccgsl_pointer
467 }
474 explicit fdfsolver( gsl_multiroot_fdfsolver* v ){
475 ccgsl_pointer = v;
476 // just plausibly we could fail to allocate count: no further action needed.
477 count = new size_t;
478 *count = 1; // initially there is just one reference to ccgsl_pointer
479 }
480 // copy constructor
485 fdfsolver( fdfsolver const& v ){ ccgsl_pointer = v.ccgsl_pointer;
486 count = v.count; if( count != 0 ) ++*count; }
487 // assignment operator
493 // first, possibly delete anything pointed to by this
494 if( count == 0 or --*count == 0 ){
495 if( ccgsl_pointer != 0 ) gsl_multiroot_fdfsolver_free( ccgsl_pointer );
496 delete count;
497 } // Then copy
498 ccgsl_pointer = v.ccgsl_pointer; count = v.count; if( count != 0 ) ++*count; return *this;
499 }
500 // destructor
505 if( count == 0 or --*count == 0 ){
506 // could have allocated null pointer
507 if( ccgsl_pointer != 0 ) gsl_multiroot_fdfsolver_free( ccgsl_pointer );
508 delete count;
509 }
510 }
511#ifdef __GXX_EXPERIMENTAL_CXX0X__
516 fdfsolver( fdfsolver&& v ) : ccgsl_pointer( v.ccgsl_pointer ), count( nullptr ){
517 std::swap( count, v.count );
518 v.ccgsl_pointer = nullptr;
519 }
526 fdfsolver( std::move( v ) ).swap( *this );
527 return *this;
528 }
529#endif
530 // Refines equality comparable
531 // == operator
538 bool operator==( fdfsolver const& v ) const { return ccgsl_pointer == v.ccgsl_pointer; }
539 // != operator
546 bool operator!=( fdfsolver const& v ) const { return not operator==( v ); }
547 // Refines forward container
548 // Refines less than comparable
549 // operator<
558 bool operator<( fdfsolver const& v ) const { return ccgsl_pointer < v.ccgsl_pointer; }
559 // operator>
568 bool operator>( fdfsolver const& v ) const { return ccgsl_pointer > v.ccgsl_pointer; }
569 // operator<=
578 bool operator<=( fdfsolver const& v ) const { return ccgsl_pointer <= v.ccgsl_pointer; }
579 // operator>=
588 bool operator>=( fdfsolver const& v ) const { return ccgsl_pointer >= v.ccgsl_pointer; }
593 bool empty() const { return ccgsl_pointer == 0; }
594 // swap() --- should work even if sizes don't match
600 void swap( fdfsolver& v ){
601 std::swap( ccgsl_pointer, v.ccgsl_pointer );
602 std::swap( count, v.count );
603 }
604 private:
608 gsl_multiroot_fdfsolver* ccgsl_pointer;
612 size_t* count;
613 public:
614 // shared reference functions
619 gsl_multiroot_fdfsolver* get() const { return ccgsl_pointer; }
625 bool unique() const { return count != 0 and *count == 1; }
630 size_t use_count() const { return count == 0 ? 0 : *count; }
636#ifdef __GXX_EXPERIMENTAL_CXX0X__
637 explicit
638#endif
639 operator bool() const { return ccgsl_pointer != 0; }
640
641#ifndef DOXYGEN_SKIP
649 inline static int set( fdfsolver& s, function_fdf* f, vector const& x ){
650 return gsl_multiroot_fdfsolver_set( s.get(), f, x.get() ); }
651#endif // DOXYGEN_SKIP
659 inline static int set( fdfsolver& s, function_fdf& f, vector const& x ){
660 return gsl_multiroot_fdfsolver_set( s.get(), &f, x.get() ); }
661
667 inline static int iterate( fdfsolver& s ){
668 return gsl_multiroot_fdfsolver_iterate( s.get() ); }
669
675 inline static std::string name( fdfsolver const& s ){
676 return std::string( gsl_multiroot_fdfsolver_name( s.get() ) ); }
677
685 inline static vector root( fdfsolver const& s ){
686 vector result( gsl_multiroot_fdfsolver_root( s.get() ) );
687 return result;
688 }
689
697 inline static vector dx( fdfsolver const& s ){
698 vector result( gsl_multiroot_fdfsolver_dx( s.get() ) );
699 return result;
700 }
701
709 inline static vector f( fdfsolver const& s ){
710 vector result( gsl_multiroot_fdfsolver_f( s.get() ) );
711 return result;
712 }
713
714 // Member functions
715
716#ifndef DOXYGEN_SKIP
723 int set( function_fdf* f, vector const& x ){
724 return gsl_multiroot_fdfsolver_set( get(), f, x.get() ); }
725#endif // DOXYGEN_SKIP
732 int set( function_fdf& f, vector const& x ){
733 return gsl_multiroot_fdfsolver_set( get(), &f, x.get() ); }
734
739 int iterate(){
740 return gsl_multiroot_fdfsolver_iterate( get() ); }
741
746 char const* name(){ return gsl_multiroot_fdfsolver_name( get() ); }
747
754 vector const root(){
756 result.wrap_gsl_vector_without_ownership( gsl_multiroot_fdfsolver_root( get() ) );
757 return result;
758 }
759
766 vector const dx(){
768 result.wrap_gsl_vector_without_ownership( gsl_multiroot_fdfsolver_dx( get() ) );
769 return result;
770 }
771
778 vector const f(){
780 result. wrap_gsl_vector_without_ownership( gsl_multiroot_fdfsolver_f( get() ) );
781 return result;
782 }
783
784 // Solver types
789 inline static type const* hybridsj(){ return gsl_multiroot_fdfsolver_hybridsj; }
794 inline static type const* hybridj(){ return gsl_multiroot_fdfsolver_hybridj; }
799 inline static type const* newton(){ return gsl_multiroot_fdfsolver_newton; }
804 inline static type const* gnewton(){ return gsl_multiroot_fdfsolver_gnewton; }
805 };
806
810 namespace test {
819 inline int delta( vector const& dx, vector const& x, double epsabs, double epsrel ){
820 return gsl_multiroot_test_delta( dx.get(), x.get(), epsabs, epsrel ); }
821
828 inline int residual( vector const& f, double epsabs ){
829 return gsl_multiroot_test_residual( f.get(), epsabs ); }
830 }
831 }
832}
833#endif
This class handles matrix objects as shared handles.
Definition: matrix.hpp:72
gsl_matrix * get()
Get the gsl_matrix.
Definition: matrix.hpp:1207
Workspace for solving multidimensional root finding problems.
Definition: multiroots.hpp:438
fdfsolver()
The default constructor is only really useful for assigning to.
Definition: multiroots.hpp:447
gsl_multiroot_fdfsolver * get() const
Get the gsl_multiroot_fdfsolver.
Definition: multiroots.hpp:619
static std::string name(fdfsolver const &s)
C++ version of gsl_multiroot_fdfsolver_name().
Definition: multiroots.hpp:675
gsl_multiroot_fdfsolver * ccgsl_pointer
The shared pointer.
Definition: multiroots.hpp:608
fdfsolver(fdfsolver &&v)
Move constructor.
Definition: multiroots.hpp:516
bool operator!=(fdfsolver const &v) const
Two fdfsolver are different if their elements are not identical.
Definition: multiroots.hpp:546
fdfsolver(gsl_multiroot_fdfsolver *v)
Could construct from a gsl_multiroot_fdfsolver.
Definition: multiroots.hpp:474
gsl_multiroot_fdfsolver_type type
Typedef.
Definition: multiroots.hpp:443
bool empty() const
Find if the fdfsolver is empty.
Definition: multiroots.hpp:593
vector const root()
C++ version of gsl_multiroot_fdfsolver_root().
Definition: multiroots.hpp:754
size_t use_count() const
Find how many fdfsolver objects share this pointer.
Definition: multiroots.hpp:630
static vector dx(fdfsolver const &s)
C++ version of gsl_multiroot_fdfsolver_dx().
Definition: multiroots.hpp:697
char const * name()
C++ version of gsl_multiroot_fdfsolver_name().
Definition: multiroots.hpp:746
bool operator>(fdfsolver const &v) const
A container needs to define an ordering for sorting.
Definition: multiroots.hpp:568
static type const * hybridj()
Static type.
Definition: multiroots.hpp:794
static vector root(fdfsolver const &s)
C++ version of gsl_multiroot_fdfsolver_root().
Definition: multiroots.hpp:685
static type const * newton()
Static type.
Definition: multiroots.hpp:799
fdfsolver & operator=(fdfsolver const &v)
The assignment operator.
Definition: multiroots.hpp:492
static type const * gnewton()
Static type.
Definition: multiroots.hpp:804
fdfsolver & operator=(fdfsolver &&v)
Move operator.
Definition: multiroots.hpp:525
size_t * count
The shared reference count.
Definition: multiroots.hpp:612
void swap(fdfsolver &v)
Swap two fdfsolver objects.
Definition: multiroots.hpp:600
~fdfsolver()
The destructor only deletes the pointers if count reaches zero.
Definition: multiroots.hpp:504
fdfsolver(type const *T, size_t const n)
The default constructor creates a new fdfsolver with n elements.
Definition: multiroots.hpp:458
bool operator==(fdfsolver const &v) const
Two fdfsolver are identically equal if their elements are identical.
Definition: multiroots.hpp:538
bool operator>=(fdfsolver const &v) const
A container needs to define an ordering for sorting.
Definition: multiroots.hpp:588
vector const dx()
C++ version of gsl_multiroot_fdfsolver_dx().
Definition: multiroots.hpp:766
bool operator<=(fdfsolver const &v) const
A container needs to define an ordering for sorting.
Definition: multiroots.hpp:578
vector const f()
C++ version of gsl_multiroot_fdfsolver_f().
Definition: multiroots.hpp:778
static vector f(fdfsolver const &s)
C++ version of gsl_multiroot_fdfsolver_f().
Definition: multiroots.hpp:709
bool unique() const
Find if this is the only object sharing the gsl_multiroot_fdfsolver.
Definition: multiroots.hpp:625
static int iterate(fdfsolver &s)
C++ version of gsl_multiroot_fdfsolver_iterate().
Definition: multiroots.hpp:667
static type const * hybridsj()
Static type.
Definition: multiroots.hpp:789
bool operator<(fdfsolver const &v) const
A container needs to define an ordering for sorting.
Definition: multiroots.hpp:558
fdfsolver(fdfsolver const &v)
The copy constructor.
Definition: multiroots.hpp:485
int iterate()
C++ version of gsl_multiroot_fdfsolver_iterate().
Definition: multiroots.hpp:739
Workspace for solving multidimensional root finding problems.
Definition: multiroots.hpp:65
static vector f(fsolver const &s)
C++ version of gsl_multiroot_fsolver_f().
Definition: multiroots.hpp:336
char const * name()
C++ version of gsl_multiroot_fsolver_name().
Definition: multiroots.hpp:373
bool operator!=(fsolver const &v) const
Two fsolver are different if their elements are not identical.
Definition: multiroots.hpp:173
bool operator<(fsolver const &v) const
A container needs to define an ordering for sorting.
Definition: multiroots.hpp:185
fsolver(fsolver &&v)
Move constructor.
Definition: multiroots.hpp:143
vector const dx()
C++ version of gsl_multiroot_fsolver_dx().
Definition: multiroots.hpp:393
bool operator<=(fsolver const &v) const
A container needs to define an ordering for sorting.
Definition: multiroots.hpp:205
static int iterate(fsolver &s)
C++ version of gsl_multiroot_fsolver_iterate().
Definition: multiroots.hpp:294
static type const * dnewton()
Static type.
Definition: multiroots.hpp:416
gsl_multiroot_fsolver_type type
Typedef.
Definition: multiroots.hpp:70
size_t * count
The shared reference count.
Definition: multiroots.hpp:239
size_t use_count() const
Find how many fsolver objects share this pointer.
Definition: multiroots.hpp:257
fsolver(fsolver const &v)
The copy constructor.
Definition: multiroots.hpp:112
bool operator==(fsolver const &v) const
Two fsolver are identically equal if their elements are identical.
Definition: multiroots.hpp:165
fsolver()
The default constructor is only really useful for assigning to.
Definition: multiroots.hpp:74
static vector root(fsolver const &s)
C++ version of gsl_multiroot_fsolver_root().
Definition: multiroots.hpp:312
bool empty() const
Find if the fsolver is empty.
Definition: multiroots.hpp:220
static type const * hybrids()
Static type.
Definition: multiroots.hpp:431
~fsolver()
The destructor only deletes the pointers if count reaches zero.
Definition: multiroots.hpp:131
gsl_multiroot_fsolver * ccgsl_pointer
The shared pointer.
Definition: multiroots.hpp:235
gsl_multiroot_fsolver * get() const
Get the gsl_multiroot_fsolver.
Definition: multiroots.hpp:246
vector const root()
C++ version of gsl_multiroot_fsolver_root().
Definition: multiroots.hpp:381
static std::string name(fsolver const &s)
C++ version of gsl_multiroot_fsolver_name().
Definition: multiroots.hpp:302
fsolver(type const *T, size_t const n)
The default constructor creates a new fsolver with n elements.
Definition: multiroots.hpp:85
fsolver & operator=(fsolver const &v)
The assignment operator.
Definition: multiroots.hpp:119
bool unique() const
Find if this is the only object sharing the gsl_multiroot_fsolver.
Definition: multiroots.hpp:252
fsolver(gsl_multiroot_fsolver *v)
Could construct from a gsl_multiroot_fsolver.
Definition: multiroots.hpp:101
static type const * broyden()
Static type.
Definition: multiroots.hpp:421
static int set(fsolver &s, function &f, vector const &x)
C++ version of gsl_multiroot_fsolver_set().
Definition: multiroots.hpp:286
void swap(fsolver &v)
Swap two fsolver objects.
Definition: multiroots.hpp:227
vector const f()
C++ version of gsl_multiroot_fsolver_f().
Definition: multiroots.hpp:405
static vector dx(fsolver const &s)
C++ version of gsl_multiroot_fsolver_dx().
Definition: multiroots.hpp:324
fsolver & operator=(fsolver &&v)
Move operator.
Definition: multiroots.hpp:152
bool operator>(fsolver const &v) const
A container needs to define an ordering for sorting.
Definition: multiroots.hpp:195
int iterate()
C++ version of gsl_multiroot_fsolver_iterate().
Definition: multiroots.hpp:366
bool operator>=(fsolver const &v) const
A container needs to define an ordering for sorting.
Definition: multiroots.hpp:215
static type const * hybrid()
Static type.
Definition: multiroots.hpp:426
Class that extends gsl_multiroot_function_fdf so that it can be constructed from arbitrary function o...
Class that extends gsl_multiroot_function so that it can be constructed from arbitrary function objec...
This class handles vector objects as shared handles.
Definition: vector.hpp:74
gsl_vector * get()
Get the gsl_vector.
Definition: vector.hpp:1320
int test(double const xtol, double const gtol, double const ftol, int *info, workspace const &w)
C++ version of gsl_multifit_nlinear_test().
int residual(vector const &f, double epsabs)
C++ version of gsl_multiroot_test_residual().
Definition: multiroots.hpp:828
int delta(vector const &dx, vector const &x, double epsabs, double epsrel)
C++ version of gsl_multiroot_test_delta().
Definition: multiroots.hpp:819
int fdjacobian(multiroot::function &F, vector const &x, vector const &f, double epsrel, matrix &jacobian)
C++ version of gsl_multiroot_fdjacobian().
Definition: multiroots.hpp:43
double get(quantile_workspace &w)
C++ version of gsl_rstat_quantile_get().
Definition: rstat.hpp:626
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
Definition: rstat.hpp:299
double F(double phi, double k, mode_t mode)
C++ version of gsl_sf_ellint_F().
Definition: sf_ellint.hpp:138
gsl_sf_result result
Typedef for gsl_sf_result.
Definition: sf_result.hpp:30
The gsl package creates an interface to the GNU Scientific Library for C++.
Definition: blas.hpp:34