gslcpp
Modern-C++ Wrapper for GSL
sum.hpp
Go to the documentation of this file.
1 /// \file include/gslcpp/wrap/sum.hpp
2 /// \copyright 2022 Thomas E. Vaughan, all rights reserved.
3 /// \brief Definition of gsl::w_sum().
4 
5 #pragma once
6 #include "container.hpp" // w_vector
7 #include "element.hpp" // element_t
8 #include <Eigen/Core> // Dynamic, Map, Matrix, Stride
9 
10 namespace gsl {
11 
12 
13 /// Sum of elements in vector `v`.
14 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
15 /// @param v Pointer to vector.
16 /// @return Sum of elements in `v`.
17 inline auto w_sum(w_vector<double const> *v) { return gsl_vector_sum(v); }
18 
19 
20 /// Sum of elements in vector `v`.
21 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
22 /// @param v Pointer to vector.
23 /// @return Sum of elements in `v`.
24 inline auto w_sum(w_vector<float const> *v) { return gsl_vector_float_sum(v); }
25 
26 
27 /// Sum of elements in vector `v`.
28 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
29 /// @param v Pointer to vector.
30 /// @return Sum of elements in `v`.
31 inline auto w_sum(w_vector<long double const> *v) {
32  return gsl_vector_long_double_sum(v);
33 }
34 
35 
36 /// Sum of elements in vector `v`.
37 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
38 /// @param v Pointer to vector.
39 /// @return Sum of elements in `v`.
40 inline auto w_sum(w_vector<int const> *v) { return gsl_vector_int_sum(v); }
41 
42 
43 /// Sum of elements in vector `v`.
44 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
45 /// @param v Pointer to vector.
46 /// @return Sum of elements in `v`.
47 inline auto w_sum(w_vector<unsigned const> *v) {
48  return gsl_vector_uint_sum(v);
49 }
50 
51 
52 /// Sum of elements in vector `v`.
53 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
54 /// @param v Pointer to vector.
55 /// @return Sum of elements in `v`.
56 inline auto w_sum(w_vector<long const> *v) { return gsl_vector_long_sum(v); }
57 
58 
59 /// Sum of elements in vector `v`.
60 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
61 /// @param v Pointer to vector.
62 /// @return Sum of elements in `v`.
63 inline auto w_sum(w_vector<unsigned long const> *v) {
64  return gsl_vector_ulong_sum(v);
65 }
66 
67 
68 /// Sum of elements in vector `v`.
69 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
70 /// @param v Pointer to vector.
71 /// @return Sum of elements in `v`.
72 inline auto w_sum(w_vector<short const> *v) { return gsl_vector_short_sum(v); }
73 
74 
75 /// Sum of elements in vector `v`.
76 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
77 /// @param v Pointer to vector.
78 /// @return Sum of elements in `v`.
79 inline auto w_sum(w_vector<unsigned short const> *v) {
80  return gsl_vector_ushort_sum(v);
81 }
82 
83 
84 /// Sum of elements in vector `v`.
85 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
86 /// @param v Pointer to vector.
87 /// @return Sum of elements in `v`.
88 inline auto w_sum(w_vector<char const> *v) { return gsl_vector_char_sum(v); }
89 
90 
91 /// Sum of elements in vector `v`.
92 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
93 /// @param v Pointer to vector.
94 /// @return Sum of elements in `v`.
95 inline auto w_sum(w_vector<unsigned char const> *v) {
96  return gsl_vector_uchar_sum(v);
97 }
98 
99 
100 /// Sum of elements in complex vector, not covered by GSL's sum.
101 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
102 /// This implementation uses Eigen to compute the sum.
103 /// @tparam C Complex type of vector's element.
104 /// @param v Reference to vector.
105 /// @return Sum of elements.
106 template<typename C> C complex_sum(w_vector<C const> *v) {
107  using Eigen::Dynamic;
108  using Eigen::Map;
109  using Eigen::Matrix;
110  using Eigen::Stride;
111  using S= Stride<Dynamic, Dynamic>;
112  using map= Map<Matrix<C, Dynamic, 1> const, 0, S>;
113  S const s(v->size * v->stride, v->stride);
114  return map((C const *)v->data, v->size, s).sum();
115 }
116 
117 
118 /// Sum of elements in vector `v`.
119 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
120 /// @param v Pointer to vector.
121 /// @return Sum of elements in `v`.
122 inline auto w_sum(w_vector<gsl::complex<double> const> *v) {
123  return complex_sum<gsl::complex<double>>(v);
124 }
125 
126 
127 /// Sum of elements in vector `v`.
128 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
129 /// @param v Pointer to vector.
130 /// @return Sum of elements in `v`.
131 inline auto w_sum(w_vector<gsl::complex<float> const> *v) {
132  return complex_sum<gsl::complex<float>>(v);
133 }
134 
135 
136 /// Sum of elements in vector `v`.
137 /// https://www.gnu.org/software/gsl/doc/html/vectors.html#c.gsl_vector_sum
138 /// @param v Pointer to vector.
139 /// @return Sum of elements in `v`.
140 inline auto w_sum(w_vector<gsl::complex<long double> const> *v) {
141  return complex_sum<gsl::complex<long double>>(v);
142 }
143 
144 
145 } // namespace gsl
146 
147 // EOF
gsl::w_sum
auto w_sum(w_vector< long double const > *v)
Sum of elements in vector v.
Definition: sum.hpp:31
gsl::w_sum
auto w_sum(w_vector< float const > *v)
Sum of elements in vector v.
Definition: sum.hpp:24
gsl::w_sum
auto w_sum(w_vector< gsl::complex< double > const > *v)
Sum of elements in vector v.
Definition: sum.hpp:122
gsl::w_sum
auto w_sum(w_vector< short const > *v)
Sum of elements in vector v.
Definition: sum.hpp:72
gsl::w_sum
auto w_sum(w_vector< gsl::complex< long double > const > *v)
Sum of elements in vector v.
Definition: sum.hpp:140
gsl::w_sum
auto w_sum(w_vector< int const > *v)
Sum of elements in vector v.
Definition: sum.hpp:40
gsl::w_sum
auto w_sum(w_vector< char const > *v)
Sum of elements in vector v.
Definition: sum.hpp:88
gsl::w_sum
auto w_sum(w_vector< gsl::complex< float > const > *v)
Sum of elements in vector v.
Definition: sum.hpp:131
gsl::w_sum
auto w_sum(w_vector< long const > *v)
Sum of elements in vector v.
Definition: sum.hpp:56
gsl::complex_sum
C complex_sum(w_vector< C const > *v)
Sum of elements in complex vector, not covered by GSL's sum.
Definition: sum.hpp:106
gsl::w_sum
auto w_sum(w_vector< unsigned long const > *v)
Sum of elements in vector v.
Definition: sum.hpp:63
gsl::w_sum
auto w_sum(w_vector< unsigned const > *v)
Sum of elements in vector v.
Definition: sum.hpp:47
gsl::w_sum
auto w_sum(w_vector< double const > *v)
Sum of elements in vector v.
Definition: sum.hpp:17
gsl::w_sum
auto w_sum(w_vector< unsigned short const > *v)
Sum of elements in vector v.
Definition: sum.hpp:79
gsl::w_sum
auto w_sum(w_vector< unsigned char const > *v)
Sum of elements in vector v.
Definition: sum.hpp:95
gsl
Namespace for C++-interface to GSL.
Definition: v-iface.hpp:51