20#ifndef CCGSL_MULTILARGE
21#define CCGSL_MULTILARGE
24#include<gsl/gsl_multilarge_nlinear.h>
30 namespace multilarge {
38 typedef gsl_multilarge_nlinear_type
type;
43 type const* trust = gsl_multilarge_nlinear_trust;
52 typedef gsl_multilarge_nlinear_trs
trs;
56 typedef gsl_multilarge_nlinear_scale
scale;
60 typedef gsl_multilarge_nlinear_solver
solver;
65 trs const* lm = gsl_multilarge_nlinear_trs_lm;
69 trs const* lmaccel = gsl_multilarge_nlinear_trs_lmaccel;
73 trs const* dogleg = gsl_multilarge_nlinear_trs_dogleg;
77 trs const* ddogleg = gsl_multilarge_nlinear_trs_ddogleg;
81 trs const* subspace2D = gsl_multilarge_nlinear_trs_subspace2D;
85 trs const* cgst = gsl_multilarge_nlinear_trs_cgst;
89 scale const* levenberg = gsl_multilarge_nlinear_scale_levenberg;
93 scale const* marquardt = gsl_multilarge_nlinear_scale_marquardt;
97 scale const* more = gsl_multilarge_nlinear_scale_more;
101 solver const* cholesky = gsl_multilarge_nlinear_solver_cholesky;
109 solver const* none = gsl_multilarge_nlinear_solver_none;
114 typedef gsl_multilarge_nlinear_fdf
fdf;
118 typedef gsl_multilarge_nlinear_fdtype
fdtype;
142 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
155 explicit workspace( gsl_multilarge_nlinear_workspace* v ){
193#ifdef __GXX_EXPERIMENTAL_CXX0X__
199 std::swap(
count, v.count );
200 v.ccgsl_pointer =
nullptr;
208 workspace( std::move( v ) ).swap( *
this );
223 ( gsl_multilarge_nlinear_workspace* w ){
338#ifdef __GXX_EXPERIMENTAL_CXX0X__
349 return gsl_multilarge_nlinear_init( x.
get(), &
fdf,
get() ); }
359 return gsl_multilarge_nlinear_winit( x.
get(), wts.
get(), &
fdf,
get() ); }
364 int iterate(){
return gsl_multilarge_nlinear_iterate(
get() ); }
369 double avratio()
const {
return gsl_multilarge_nlinear_avratio(
get() ); }
407 class CallbackImplement {
412 typedef void (*function_t)(
size_t const,
void*,gsl_multilarge_nlinear_workspace
const*);
426 virtual function_t getFunction() = 0;
431 template<
typename T>
class F :
public base_F {
443 static void function(
size_t const i,
void* params,
444 gsl_multilarge_nlinear_workspace
const* w ){
445 T* t =
reinterpret_cast<T*
>( params );
447 W.wrap_gsl_multilarge_nlinear_workspace_without_ownership
448 (
const_cast<gsl_multilarge_nlinear_workspace*
>( w ) );
449 return t->function( i, W );
455 function_t getFunction(){
return &F<T>::function; }
461 template<
typename T> CallbackImplement( T& t ){
473 CallbackImplement( CallbackImplement
const& v ) : f( v.f ), count( v.count ){
474 if( count != 0 ) ++*count;
481 CallbackImplement& operator=( CallbackImplement
const& v ){
483 if( count == 0 or --*count == 0 ){
490 if( count != 0 ) ++*count;
493#ifdef __GXX_EXPERIMENTAL_CXX0X__
498 CallbackImplement( CallbackImplement&& v ) : f( v.f ), count( nullptr ){
499 std::swap( count, v.count );
507 CallbackImplement& operator=( CallbackImplement&& v ){
509 std::swap( count, v.count );
516 ~CallbackImplement(){
518 if( count == 0 or --*count == 0 ){
527 function_t getFunction(){
return f->getFunction(); }
545 return gsl_multilarge_nlinear_default_parameters(); }
555 return gsl_multilarge_nlinear_init( x.
get(), &
fdf, w.
get() ); }
566 return gsl_multilarge_nlinear_winit( x.
get(), wts.
get(), &
fdf, w.
get() ); }
579 return gsl_multilarge_nlinear_avratio( w.
get() ); }
587 return gsl_multilarge_nlinear_rcond( &
rcond, w.
get() ); }
595 return gsl_multilarge_nlinear_covar(
covar.get(), w.
get() ); }
615 void* callback_params =
reinterpret_cast<void*
>( &callback );
616 CallbackImplement callbackImplement( callback );
617 void (*function)(
size_t const,
void*,gsl_multilarge_nlinear_workspace
const*)
618 = callbackImplement.getFunction();
619 return gsl_multilarge_nlinear_driver( maxiter, xtol, gtol, ftol, function,
620 callback_params, &info, w.
get() ); }
625 gsl_multilarge_nlinear_workspace
const* w);
638 inline int driver(
size_t const maxiter,
double const xtol,
double const gtol,
640 void* callback_params,
int& info,
workspace& w ){
641 return gsl_multilarge_nlinear_driver( maxiter, xtol, gtol, ftol, callback,
642 callback_params, &info, w.
get() ); }
649 return gsl_multilarge_nlinear_name( w.
get() ); }
656 return vector( gsl_multilarge_nlinear_position( w.
get() ) ); }
663 return vector( gsl_multilarge_nlinear_residual( w.
get() ) ); }
670 return vector( gsl_multilarge_nlinear_step( w.
get() ) ); }
677 return gsl_multilarge_nlinear_niter( w.
get() ); }
684 return gsl_multilarge_nlinear_trs_name( w.
get() ); }
695 return gsl_multilarge_nlinear_eval_f( &
fdf, x.
get(), swts.
get(), y.
get() ); }
715 return gsl_multilarge_nlinear_eval_df( TransJ, x.
get(), f.
get(), u.
get(),
717 JTJ.
get(), work.
get() ); }
733 return gsl_multilarge_nlinear_eval_fvv( h, x.
get(), v.
get(), f.
get(), swts.
get(),
744 inline int test(
double const xtol,
double const gtol,
double const ftol,
int& info,
746 return gsl_multilarge_nlinear_test( xtol, gtol, ftol, &info, w.
get() ); }
781 return gsl_multilarge_nlinear_fdfvv( h, x.
get(), v.
get(), f.
get(), J.
get(), swts.
get(),
This class handles matrix objects as shared handles.
gsl_matrix * get()
Get the gsl_matrix.
You can create callbacks as a subclass of this class.
virtual void function(size_t const iter, workspace const &w)=0
This is the callback function.
Class that extends gsl_multilarge_nlinear_fdf so that it can be constructed from arbitrary function o...
Workspace for solving systems.
bool unique() const
Find if this is the only object sharing the gsl_multilarge_nlinear_workspace.
workspace()
The default constructor is only really useful for assigning to.
double avratio() const
C++ version of gsl_multilarge_nlinear_avratio().
gsl_multilarge_nlinear_workspace * ccgsl_pointer
The shared pointer.
workspace(workspace &&v)
Move constructor.
bool operator==(workspace const &v) const
Two workspace are identically equal if their elements are identical.
bool empty() const
Find if the workspace is empty.
workspace(workspace const &v)
The copy constructor.
int winit(vector const &x, vector const &wts, gsl::multilarge::nlinear::function_fdf &fdf)
C++ version of gsl_multilarge_nlinear_winit().
int covar(matrix &covar)
C++ version of gsl_multilarge_nlinear_covar().
bool operator>=(workspace const &v) const
A container needs to define an ordering for sorting.
bool operator>(workspace const &v) const
A container needs to define an ordering for sorting.
bool operator<(workspace const &v) const
A container needs to define an ordering for sorting.
void swap(workspace &v)
Swap two workspace objects.
int rcond(double &rcond)
C++ version of gsl_multilarge_nlinear_rcond().
~workspace()
The destructor only deletes the pointers if count reaches zero.
gsl_multilarge_nlinear_workspace * get() const
Get the gsl_multilarge_nlinear_workspace.
bool operator<=(workspace const &v) const
A container needs to define an ordering for sorting.
int init(vector const &x, gsl::multilarge::nlinear::function_fdf &fdf)
C++ version of gsl_multilarge_nlinear_init().
workspace(type const *T, parameters const *params, size_t const n, size_t const p)
The default constructor creates a new workspace with window length K.
void wrap_gsl_multilarge_nlinear_workspace_without_ownership(gsl_multilarge_nlinear_workspace *w)
This function is intended mainly for internal use.
bool operator!=(workspace const &v) const
Two workspace are different if their elements are not identical.
workspace(gsl_multilarge_nlinear_workspace *v)
Could construct from a gsl_multilarge_nlinear_workspace*.
size_t use_count() const
Find how many workspace objects share this pointer.
int iterate()
C++ version of gsl_multilarge_nlinear_iterate().
size_t * count
The shared reference count.
workspace & operator=(workspace &&v)
Move operator.
workspace & operator=(workspace const &v)
The assignment operator.
This class handles vector objects as shared handles.
gsl_vector * get()
Get the gsl_vector.
gsl_multilarge_nlinear_parameters parameters
Typedef for shorthand.
size_t niter(workspace const &w)
C++ version of gsl_multilarge_nlinear_niter().
void(* driver_callback)(const size_t iter, void *params, gsl_multilarge_nlinear_workspace const *w)
Convenient typedef.
double avratio(workspace const &w)
C++ version of gsl_multilarge_nlinear_avratio().
gsl_multilarge_nlinear_type type
Typedef for shorthand.
vector residual(workspace const &w)
C++ version of gsl_multilarge_nlinear_residual().
int rcond(double &rcond, workspace const &w)
C++ version of gsl_multilarge_nlinear_rcond().
int covar(matrix &covar, workspace &w)
C++ version of gsl_multilarge_nlinear_covar().
gsl_multilarge_nlinear_fdf fdf
Typedef for shorthand.
int iterate(workspace &w)
C++ version of gsl_multilarge_nlinear_iterate().
int init(vector const &x, gsl::multilarge::nlinear::function_fdf &fdf, workspace &w)
C++ version of gsl_multilarge_nlinear_init().
vector step(workspace const &w)
C++ version of gsl_multilarge_nlinear_step().
gsl_multilarge_nlinear_trs trs
Typedef for shorthand.
int eval_f(gsl::multilarge::nlinear::function_fdf &fdf, vector const &x, vector const &swts, vector &y)
C++ version of gsl_multilarge_nlinear_eval_f().
int eval_fvv(double const h, vector const &x, vector const &v, vector const &f, vector const &swts, gsl::multilarge::nlinear::function_fdf &fdf, vector &yvv, vector &work)
C++ version of gsl_multilarge_nlinear_eval_fvv().
int winit(vector const &x, vector const &wts, gsl::multilarge::nlinear::function_fdf &fdf, workspace &w)
C++ version of gsl_multilarge_nlinear_winit().
gsl_multilarge_nlinear_fdtype fdtype
Typedef for shorthand.
int eval_df(CBLAS_TRANSPOSE_t const TransJ, vector const &x, vector const &f, vector const &u, vector const &swts, double const h, fdtype const fdtype, gsl::multilarge::nlinear::function_fdf &fdf, vector &v, matrix &JTJ, vector &work)
C++ version of gsl_multilarge_nlinear_eval_df().
vector position(workspace &w)
C++ version of gsl_multilarge_nlinear_position().
char const * trs_name(workspace const &w)
C++ version of gsl_multilarge_nlinear_trs_name().
gsl_multilarge_nlinear_scale scale
Typedef for shorthand.
int test(double const xtol, double const gtol, double const ftol, int &info, workspace const &w)
C++ version of gsl_multilarge_nlinear_test().
int fdfvv(double const h, vector const &x, vector const &v, vector const &f, matrix const &J, vector const &swts, gsl::multilarge::nlinear::function_fdf &fdf, vector &fvv, vector &work)
C++ version of gsl_multilarge_nlinear_fdfvv().
int driver(size_t const maxiter, double const xtol, double const gtol, double const ftol, CallbackBase &callback, int &info, workspace &w)
C++ version of gsl_multilarge_nlinear_driver().
gsl_multilarge_nlinear_solver solver
Typedef for shorthand.
int df(double const h, fdtype const fdtype, vector const &x, vector const &wts, gsl::multilarge::nlinear::function_fdf &fdf, vector const &f, matrix &J, vector &work)
C++ version of gsl_multilarge_nlinear_df().
char const * name(workspace const &w)
C++ version of gsl_multilarge_nlinear_name().
parameters default_parameters()
C++ version of gsl_multilarge_nlinear_default_parameters().
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
double F(double phi, double k, mode_t mode)
C++ version of gsl_sf_ellint_F().
The gsl package creates an interface to the GNU Scientific Library for C++.