20#ifndef CCGSL_VECTOR_HPP
21#define CCGSL_VECTOR_HPP
23#include<gsl/gsl_vector.h>
51 namespace multilarge {
103 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
118 if(
n > 0 )
ccgsl_pointer = gsl_vector_alloc(
static_cast<size_t>(
n ) );
120 gsl_error(
"failed tring to make a vector of negative length",
124 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
138 explicit vector( gsl_vector* v )
145#ifdef __GXX_EXPERIMENTAL_CXX0X__
150 vector( std::initializer_list<double> initializer_list )
152 size_t const n = initializer_list.size();
155 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
164 for(
auto x : initializer_list ){ *p = x; ++p; }
217 template<
typename V>
vector( V& v,
size_t const stride = 1 )
219 size_t const n = v.size() / stride;
220 ccgsl_pointer =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
227 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
244 gsl_vector_memcpy( copy.
get(),
get() );
308#ifdef __GXX_EXPERIMENTAL_CXX0X__
315 std::swap(
count, v.count );
316 v.ccgsl_pointer =
nullptr;
324 vector( std::move( v ) ).swap( *
this );
356 for(
size_t i = 0; i <
min; ++i ){
359 if( t < u )
return true;
360 if( u < t )
return false;
363 return size < v_size;
383 for(
size_t i = 0; i <
min; ++i ){
386 if( t > u )
return true;
387 if( u > t )
return false;
390 return size > v_size;
448 template<
typename container,
typename content,
bool reverse_t>
class iterator_base {
480 static content something = 0;
485 }
else if(
v->ccgsl_pointer == 0 ){
499 return *(
v->ccgsl_pointer->data +
position *
v->ccgsl_pointer->stride);
511 }
else if(
v->ccgsl_pointer == 0 ){
525 return v->ccgsl_pointer->data +
position *
v->ccgsl_pointer->stride;
535 static content something = 0;
540 }
else if(
v->ccgsl_pointer == 0 ){
555 return *(
v->ccgsl_pointer->data + p *
v->ccgsl_pointer->stride);
565 if(
v == 0 or i.
v == 0 ){
568 }
else if(
v->ccgsl_pointer == 0 or i.
v->ccgsl_pointer == 0 ){
573 if(
v->ccgsl_pointer != i.
v->ccgsl_pointer ){
574 gsl_error(
"trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
607 if(
v == 0 or i.
v == 0 ){
612 if(
v->ccgsl_pointer != i.
v->ccgsl_pointer ){
613 gsl_error(
"trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
629 }
else if(
v->ccgsl_pointer == 0 ){
646 }
else if(
v->ccgsl_pointer == 0 ){
663 }
else if(
v->ccgsl_pointer == 0 ){
811 if( this->
v == 0 or i.
v == 0 ){
820 gsl_error(
"trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
849 if( this->
v == 0 or i.
v == 0 ){
855 gsl_error(
"trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
997 if( this->
v == 0 or i.
v == 0 ){
1006 gsl_error(
"trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
1047 if( this->
v == 0 or i.
v == 0 ){
1053 gsl_error(
"trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
1082 if( this->
v == 0 or i.
v == 0 ){
1088 gsl_error(
"trying to take difference of iterators for different vector objects", __FILE__, __LINE__,
1178 if(
ccgsl_pointer == 0 ) gsl_error(
"null vector", __FILE__, __LINE__, GSL_EFAULT );
1179#ifndef GSL_RANGE_CHECK_OFF
1181 gsl_error(
"vector does not have stride of size 1", __FILE__, __LINE__, GSL_EBADLEN );
1192 if(
ccgsl_pointer == 0 ) gsl_error(
"null vector", __FILE__, __LINE__, GSL_EFAULT );
1193#ifndef GSL_RANGE_CHECK_OFF
1195 gsl_error(
"vector does not have stride of size 1", __FILE__, __LINE__, GSL_EBADLEN );
1262 static double something = 0;
1268#ifndef GSL_RANGE_CHECK_OFF
1285 static double something = 0;
1291#ifndef GSL_RANGE_CHECK_OFF
1342#ifdef __GXX_EXPERIMENTAL_CXX0X__
1388 return gsl_vector_swap_elements(
get(), i, j ); }
1393 double max()
const {
return gsl_vector_max(
get() ); }
1398 double min()
const {
return gsl_vector_min(
get() ); }
1404 void minmax(
double* min_out,
double* max_out )
const {
1405 gsl_vector_minmax(
get(), min_out, max_out ); }
1422 gsl_vector_minmax_index(
get(), imin, imax ); }
1429 gsl_vector_minmax_index(
get(), &imin, &imax ); }
1459 int scale(
double const x ){
return gsl_vector_scale(
get(), x ); }
1474 double const beta ){
1475 return gsl_vector_axpby( alpha, x.
get(),
beta,
get() );
1482 double sum(
vector const&
a )
const {
return gsl_vector_sum(
a.get() ); }
1492 int ispos()
const {
return gsl_vector_ispos(
get() ); }
1497 int isneg()
const {
return gsl_vector_isneg(
get() ); }
1508 double get(
size_t const i )
const {
return gsl_vector_get(
get(), i ); }
1514 void set(
size_t const i,
double x ){ gsl_vector_set(
get(), i, x ); }
1520 double*
ptr(
size_t const i ){
return gsl_vector_ptr(
get(), i ); }
1526 double const*
const_ptr(
size_t const i )
const {
return gsl_vector_const_ptr(
get(), i ); }
1532 int fread( FILE* stream ){
return gsl_vector_fread( stream,
get() ); }
1538 int fwrite( FILE* stream )
const {
return gsl_vector_fwrite( stream,
get() ); }
1544 int fscanf( FILE* stream ){
return gsl_vector_fscanf( stream,
get() ); }
1551 int fprintf( FILE* stream,
char const* format )
const {
1552 return gsl_vector_fprintf( stream,
get(), format ); }
1560 vector(
block&
b,
size_t const offset,
size_t const n,
size_t const stride = 1 ){
1561 ccgsl_pointer = gsl_vector_alloc_from_block(
b.get(), offset,
n, stride );
1563 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
1577 vector(
vector& v,
size_t const offset,
size_t const n,
size_t const stride = 1 ){
1580 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
1594 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1595 *w = gsl_vector_view_array( v,
n ).
vector;
1607 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1608 *w = gsl_vector_view_array_with_stride( base, stride,
n ).
vector;
1620 gsl_vector* w =
static_cast<gsl_vector *
>( malloc(
sizeof( gsl_vector ) ) );
1621 *w = gsl_vector_const_view_array( v,
n ).
vector;
1633 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1634 *w = gsl_vector_const_view_array_with_stride( base, stride,
n ).
vector;
1647 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1648 *w = gsl_vector_const_view_array( v,
n ).
vector;
1663 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1664 *w = gsl_vector_const_view_array_with_stride( base, stride,
n ).
vector;
1677 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1678 *w = gsl_vector_subvector(
get(), i,
n ).
vector;
1691 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1692 *w = gsl_vector_subvector_with_stride(
get(), i, stride,
n ).
vector;
1704 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1705 *w = gsl_vector_const_subvector(
get(), i,
n ).
vector;
1718 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1719 *w = gsl_vector_const_subvector_with_stride(
get(), i, stride,
n ).
vector;
1732 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1733 *w = gsl_vector_const_subvector(
get(), i,
n ).
vector;
1748 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1749 *w = gsl_vector_const_subvector_with_stride(
get(), i, stride,
n ).
vector;
1761 template<
typename ARRAY>
1767 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1768 *w = gsl_vector_view_array( v.data(),
n ).vector;
1780 template<
typename ARRAY>
1783 n = base.size()/stride;
1784 if((
n-1)*stride > base.size())
1786 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1787 *w = gsl_vector_view_array_with_stride( base.data(), stride,
n ).vector;
1798 template<
typename ARRAY>
1804 gsl_vector* w =
static_cast<gsl_vector *
>( malloc(
sizeof( gsl_vector ) ) );
1805 *w = gsl_vector_const_view_array( v.data(),
n ).vector;
1817 template<
typename ARRAY>
1820 n = base.size()/stride;
1821 if((
n-1)*stride > base.size())
1823 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1824 *w = gsl_vector_const_view_array_with_stride( base.data(), stride,
n ).vector;
1836 template<
typename ARRAY>
1842 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1843 *w = gsl_vector_const_view_array( v.data(),
n ).vector;
1857 template<
typename ARRAY>
1860 n = base.size()/stride;
1861 if((
n-1)*stride > base.size())
1863 gsl_vector* w =
static_cast<gsl_vector*
>( malloc(
sizeof( gsl_vector ) ) );
1864 *w = gsl_vector_const_view_array_with_stride( base.data(), stride,
n ).vector;
1890 static double get( gsl_vector
const* v,
size_t const i ){
return gsl_vector_get( v, i ); }
This class handles vectors as shared handles.
@ GSL_EDOM
input domain error, e.g sqrt(-1)
@ GSL_EFAILED
generic failure
@ GSL_EINVAL
invalid argument supplied by user
@ GSL_EBADLEN
matrix, vector lengths are not conformant
@ GSL_EFAULT
invalid pointer
This class handles matrix objects as shared handles.
Class that extends gsl_multifit_function so that it can be constructed from arbitrary function object...
Class that extends gsl_multifit_nlinear_fdf so that it can be constructed from arbitrary function obj...
Class that extends gsl_multilarge_nlinear_fdf so that it can be constructed from arbitrary function o...
Class that extends gsl_multimin_function_fdf so that it can be constructed from arbitrary function ob...
Class that extends gsl_multimin_function so that it can be constructed from arbitrary function object...
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...
A class template for the const iterators.
const_iterator_t(vector const *v, difference_type position)
This constructor allows vector to create non-default iterators.
bool operator<(iterator_t< reverse_t > const &i) const
Comparison with non-const iterator.
const_iterator_t< reverse_t > operator+(difference_type const n) const
The + operator.
const_iterator_t()
The default constructor.
const_iterator_t(iterator_t< reverse_t > const &i)
A copy constructor.
bool operator!=(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
const_iterator_t< reverse_t > & operator+=(difference_type const n)
The += operator.
bool operator<(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
bool operator!=(iterator_t< reverse_t > const &i) const
Comparison with non-const iterator.
bool operator==(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
const_iterator_t< reverse_t > operator-(difference_type const n) const
The - operator: subtract distance from iterator.
const_iterator_t< reverse_t > operator++(int)
The postfix ++ operator.
const_iterator_t< reverse_t > & operator-=(difference_type const n)
The -= operator.
iterator_base< vectorconst, double, reverse_t >::difference_type difference_type
Difference type.
difference_type operator-(const_iterator_t< reverse_t > const &i) const
The - operator: find distance between two iterators.
const_iterator_t< reverse_t > & operator--()
The prefix – operator.
const_iterator_t< reverse_t > & operator=(const_iterator_t< reverse_t > const &i)
We can assign one output iterator from another.
difference_type operator-(iterator_t< reverse_t > const &i) const
The - operator: find distance between two iterators.
const_iterator_t< reverse_t > operator--(int)
The postfix – operator.
bool operator==(iterator_t< reverse_t > const &i) const
Comparison with non-const iterator.
const_iterator_t< reverse_t > & operator++()
The prefix ++ operator.
The container must have iterator types.
void shift(difference_type const n)
Shift iterator n places.
std::random_access_iterator_tag iterator_category
An iterator must have an iterator category.
double value_type
An iterator must have a value type.
value_type & reference
An iterator must have a reference type.
value_type * pointer
An iterator must have a pointer typea.
bool operator<(iterator_base< container, content, reverse_t > const &i) const
The < operator is used to compare iterators.
iterator_base()
The iterator is default constructible.
ptrdiff_t difference_type
An iterator must have a difference_type.
iterator_base(container *v, difference_type position)
This constructor allows vector to create non-default iterators.
bool operator!=(iterator_base< container, content, reverse_t > const &i) const
The != operator.
reference operator[](difference_type const n) const
Get element at i + n by reference ([] operator).
bool operator==(iterator_base< container, content, reverse_t > const &i) const
The == operator.
container * v
Store a pointer to a vector we can iterate over: 0 if no vector.
reference operator*() const
Dereference the pointer.
pointer operator->() const
Dereference the pointer.
difference_type operator-(iterator_base< container, content, reverse_t > const &i) const
The - operator: find distance between two iterators.
void increment()
Increment the iterator.
void decrement()
Decrement the iterator.
difference_type position
Mark position of iterator within vector.
A class template for the two non-const iterators.
iterator_t< reverse_t > & operator=(iterator_t< reverse_t > const &i)
We can assign one output iterator from another.
iterator_t< reverse_t > & operator--()
The prefix – operator.
iterator_t< reverse_t > & operator++()
The prefix ++ operator.
iterator_base< vector, double, reverse_t >::difference_type difference_type
Difference type.
iterator_t< reverse_t > & operator-=(difference_type const n)
The -= operator.
iterator_t< reverse_t > operator++(int)
The postfix ++ operator.
difference_type operator-(iterator_t< reverse_t > const &i) const
The - operator: find distance between two iterators.
difference_type operator-(const_iterator_t< reverse_t > const &i) const
The - operator: find distance between two iterators.
iterator_t< reverse_t > operator-(difference_type const n) const
The - operator: subtract distance from iterator.
iterator_t(vector *v, difference_type position)
This constructor allows vector to create non-default iterators.
iterator_t()
The default constructor.
iterator_t< reverse_t > operator+(difference_type const n) const
The + operator.
bool operator==(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
bool operator!=(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
iterator_t< reverse_t > & operator+=(difference_type const n)
The += operator.
bool operator<(const_iterator_t< reverse_t > const &i) const
Comparison with const iterator.
iterator_t< reverse_t > operator--(int)
The postfix – operator.
This class handles vector objects as shared handles.
gsl_vector * get()
Get the gsl_vector.
bool operator!=(vector const &v) const
Two vector objects are different equal if their elements are not identical.
size_type size() const
The size (number of elements) of the vector.
vector(vector &v)
The copy constructor.
const_iterator_t< true > const_reverse_iterator
The const_reverse_t type.
vector const const_subvector(size_t i, size_t n) const
C++ version of gsl_vector_const_subvector().
int fscanf(FILE *stream)
C++ version of gsl_vector_fscanf().
static vector view_array_with_stride(ARRAY &base, size_t stride, size_t n=0)
C++ version of gsl_vector_view_array_with_stride().
void set_all(double x)
C++ version of gsl_vector_set_all().
bool empty() const
Find if the vector is empty.
friend class multifit::function_fdf
static vector alloc_row_from_matrix(matrix &m, size_t const i)
C++ version of gsl_vector_alloc_row_from_matrix().
double min() const
C++ version of gsl_vector_min().
void wrap_gsl_vector_without_ownership(gsl_vector *v)
This function is intended mainly for internal use.
const_iterator_t< false > const_iterator
The const_iterator type.
const_iterator begin() const
Get iterator pointing to first vector element.
size_type max_size() const
The max size (number of elements) of the vector.
int isnull() const
C++ version of gsl_vector_isnull().
bool unique() const
Find if this is the only object sharing the gsl_vector.
int isnonneg() const
C++ version of gsl_vector_isnonneg().
double const * const_ptr(size_t const i) const
C++ version of gsl_vector_const_ptr().
void swap(vector &v)
Swap two vector objects.
int div(vector const &b)
C++ version of gsl_vector_div().
vector(vector &v, size_t const offset, size_t const n, size_t const stride=1)
C++ version of gsl_vector_alloc_from_vector().
reverse_iterator rbegin()
Get iterator pointing to first vector element.
size_t size_type
A container must have a size_type.
static vector view_array_with_stride(double *base, size_t stride, size_t n)
C++ version of gsl_vector_view_array_with_stride().
vector const const_subvector_with_stride(size_t i, size_t stride, size_t n) const
C++ version of gsl_vector_const_subvector_with_stride().
bool owns_data
Used to allow a vector that does not own its data.
const_reverse_iterator rbegin() const
Get iterator pointing to first vector element.
static vector calloc(size_t const n)
C++ version of gsl_vector_calloc().
int axpby(double const alpha, vector const &x, double const beta)
C++ version of gsl_vector_axpby().
iterator_t< false > iterator
The iterator type.
static vector view_array(double *v, size_t n)
C++ version of gsl_vector_view_array().
void reset()
Stop sharing ownership of the shared pointer.
value_type const * const_pointer
A container must have a constant pointer type.
value_type & reference
A container must have a reference type.
static vector const const_view_array(ARRAY const &v, size_t n=0)
C++ version of gsl_vector _const_view_array().
bool operator==(vector const &v) const
Two vector objects are identically equal if their elements are identical.
double max() const
C++ version of gsl_vector_max().
double value_type
A container must have a value_type.
const_iterator end() const
Get iterator pointing beyond last vector element.
vector(block &b, size_t const offset, size_t const n, size_t const stride=1)
C++ version of gsl_vector_alloc_from_block().
size_t use_count() const
Find how many vector objects share this pointer.
int sub(vector const &b)
C++ version of gsl_vector_sub().
bool operator>=(vector const &v) const
A container needs to define an ordering for sorting.
vector()
The default constructor is only really useful for assigning to.
int swap_elements(size_t const i, size_t const j)
C++ version of gsl_vector_swap_elements().
iterator end()
Get iterator pointing beyond last vector element.
int add(vector const &b)
C++ version of gsl_vector_add().
reverse_iterator rend()
Get iterator pointing beyond last vector element.
vector & operator=(vector &&v)
Move operator.
bool operator<=(vector const &v) const
A container needs to define an ordering for sorting.
vector(V &v, size_t const stride=1)
Construct from an object that implements data() and size().
double * data()
Give access to the data block.
double get(size_t const i) const
C++ version of gsl_vector_get().
int scale(double const x)
C++ version of gsl_vector_scale().
static vector const const_view_array_with_stride(double const *base, size_t stride, size_t n)
C++ version of gsl_vector_const_view_array_with_stride().
~vector()
The destructor only deletes the pointers if count reaches zero.
size_t max_index() const
C++ version of gsl_vector_max_index().
vector(size_t const n)
The default constructor creates a new vector with n elements.
int isneg() const
C++ version of gsl_vector_isneg().
iterator begin()
Get iterator pointing to first vector element.
double sum(vector const &a) const
C++ version of gsl_vector_sum().
void minmax_index(size_t &imin, size_t &imax) const
C++ version of gsl_vector_minmax_index().
const_iterator::difference_type difference_type
A container must have a difference_type.
bool operator<(vector const &v) const
A container needs to define an ordering for sorting.
vector(vector &&v)
Move constructor.
void set_zero()
C++ version of gsl_vector_set_zero().
value_type const & const_reference
A container must have a constant reference type.
double * ptr(size_t const i)
C++ version of gsl_vector_ptr().
int ispos() const
C++ version of gsl_vector_ispos().
gsl_vector * ccgsl_pointer
The shared pointer.
vector & operator=(vector const &v)
The assignment operator.
value_type * pointer
A container must have a pointer type.
void minmax_index(size_t *imin, size_t *imax) const
C++ version of gsl_vector_minmax_index().
static vector const const_view_array_with_stride(ARRAY const &base, size_t stride, size_t n=0)
C++ version of gsl_vector_const_view_array_with_stride().
int fread(FILE *stream)
C++ version of gsl_vector_fread().
vector subvector(size_t i, size_t n)
C++ version of gsl_vector_subvector().
size_t * count
The shared reference count.
vector(vector const &v)
The copy constructor.
void set(size_t const i, double x)
C++ version of gsl_vector_set().
void minmax(double *min_out, double *max_out) const
C++ version of gsl_vector_minmax().
gsl_vector const * get() const
Get the gsl_vector.
vector subvector_with_stride(size_t i, size_t stride, size_t n)
C++ version of gsl_vector_subvectorwith_stride().
double & operator[](size_t const n)
Get element at position n by reference ([] operator).
int mul(vector const &b)
C++ version of gsl_vector_mul().
int add_constant(double const x)
C++ version of gsl_vector_add_constant().
int memcpy(vector const &src)
C++ version of gsl_vector_memcpy().
iterator_t< true > reverse_iterator
The reverse_iterator type.
static vector view_array(ARRAY &v, size_t n=0)
C++ version of gsl_vector_view_array().
size_t min_index() const
C++ version of gsl_vector_min_index().
double const & operator[](size_t const n) const
Get element at position n by reference ([] operator).
const_reverse_iterator rend() const
Get iterator pointing beyond last vector element.
int fprintf(FILE *stream, char const *format) const
C++ version of gsl_vector_fprintf().
vector(std::initializer_list< double > initializer_list)
Could construct from a std::initializer_list in C++11.
static vector const const_view_array(double const *v, size_t n)
C++ version of gsl_vector _const_view_array().
bool operator>(vector const &v) const
A container needs to define an ordering for sorting.
int reverse()
C++ version of gsl_vector_reverse().
static vector alloc_col_from_matrix(matrix &m, size_t const j)
C++ version of gsl_vector_alloc_col_from_matrix().
static double get(gsl_vector const *v, size_t const i)
C++ version of get().
double const * data() const
Give access to the data block.
int fwrite(FILE *stream) const
C++ version of gsl_vector_fwrite().
int set_basis(size_t i)
C++ version of gsl_vector_set_basis().
vector clone() const
The clone function.
double beta(rng const &r, double const a, double const b)
C++ version of gsl_ran_beta().
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
double b(int order, double qq)
C++ version of gsl_sf_mathieu_b().
double a(int order, double qq)
C++ version of gsl_sf_mathieu_a().
gsl_sf_result result
Typedef for gsl_sf_result.
The gsl package creates an interface to the GNU Scientific Library for C++.