1 | Index: boost/numeric/ublas/vector_expression.hpp
|
---|
2 | ===================================================================
|
---|
3 | --- boost/numeric/ublas/vector_expression.hpp (revision 66890)
|
---|
4 | +++ boost/numeric/ublas/vector_expression.hpp (working copy)
|
---|
5 | @@ -950,6 +950,17 @@
|
---|
6 | return expression_type (e1 (), e2 ());
|
---|
7 | }
|
---|
8 |
|
---|
9 | + // pow (v1, v2) [i] = pow( v1 [i], v2 [i] )
|
---|
10 | + template<class E1, class E2>
|
---|
11 | + BOOST_UBLAS_INLINE
|
---|
12 | + typename vector_binary_traits<E1, E2, scalar_pow<typename E1::value_type,
|
---|
13 | + typename E2::value_type> >::result_type
|
---|
14 | + element_pow (const vector_expression<E1> &e1,
|
---|
15 | + const vector_expression<E2> &e2) {
|
---|
16 | + typedef typename vector_binary_traits<E1, E2, scalar_pow<typename E1::value_type,
|
---|
17 | + typename E2::value_type> >::expression_type expression_type;
|
---|
18 | + return expression_type (e1 (), e2 ());
|
---|
19 | + }
|
---|
20 |
|
---|
21 | template<class E1, class E2, class F>
|
---|
22 | class vector_binary_scalar1:
|
---|
23 | @@ -1416,6 +1427,15 @@
|
---|
24 | return expression_type (e1 (), e2);
|
---|
25 | }
|
---|
26 |
|
---|
27 | + // pow (v, t) [i] = pow( v [i], t )
|
---|
28 | + template<class E1, class T2>
|
---|
29 | + BOOST_UBLAS_INLINE
|
---|
30 | + typename vector_binary_scalar2_traits<E1, const T2, scalar_pow<typename E1::value_type, T2> >::result_type
|
---|
31 | + pow (const vector_expression<E1> &e1,
|
---|
32 | + const T2 &e2) {
|
---|
33 | + typedef typename vector_binary_scalar2_traits<E1, const T2, scalar_pow<typename E1::value_type, T2> >::expression_type expression_type;
|
---|
34 | + return expression_type (e1 (), e2);
|
---|
35 | + }
|
---|
36 |
|
---|
37 | template<class E, class F>
|
---|
38 | class vector_scalar_unary:
|
---|
39 | Index: boost/numeric/ublas/matrix_expression.hpp
|
---|
40 | ===================================================================
|
---|
41 | --- boost/numeric/ublas/matrix_expression.hpp (revision 66890)
|
---|
42 | +++ boost/numeric/ublas/matrix_expression.hpp (working copy)
|
---|
43 | @@ -2518,6 +2518,18 @@
|
---|
44 | return expression_type (e1 (), e2 ());
|
---|
45 | }
|
---|
46 |
|
---|
47 | + // pow (m1, m2) [i] [j] = pow (m1 [i] [j], m2 [i] [j])
|
---|
48 | + template<class E1, class E2>
|
---|
49 | + BOOST_UBLAS_INLINE
|
---|
50 | + typename matrix_binary_traits<E1, E2, scalar_pow<typename E1::value_type,
|
---|
51 | + typename E2::value_type> >::result_type
|
---|
52 | + element_pow (const matrix_expression<E1> &e1,
|
---|
53 | + const matrix_expression<E2> &e2) {
|
---|
54 | + typedef typename matrix_binary_traits<E1, E2, scalar_pow<typename E1::value_type,
|
---|
55 | + typename E2::value_type> >::expression_type expression_type;
|
---|
56 | + return expression_type (e1 (), e2 ());
|
---|
57 | + }
|
---|
58 | +
|
---|
59 | template<class E1, class E2, class F>
|
---|
60 | class matrix_binary_scalar1:
|
---|
61 | public matrix_expression<matrix_binary_scalar1<E1, E2, F> > {
|
---|
62 | @@ -3394,6 +3406,15 @@
|
---|
63 | return expression_type (e1 (), e2);
|
---|
64 | }
|
---|
65 |
|
---|
66 | + // pow (m, p) [i] [j] = pow (m [i] [j], p)
|
---|
67 | + template<class E1, class T2>
|
---|
68 | + BOOST_UBLAS_INLINE
|
---|
69 | + typename matrix_binary_scalar2_traits<E1, const T2, scalar_pow<typename E1::value_type, T2> >::result_type
|
---|
70 | + pow (const matrix_expression<E1> &e1,
|
---|
71 | + const T2 &e2) {
|
---|
72 | + typedef typename matrix_binary_scalar2_traits<E1, const T2, scalar_pow<typename E1::value_type, T2> >::expression_type expression_type;
|
---|
73 | + return expression_type (e1 (), e2);
|
---|
74 | + }
|
---|
75 |
|
---|
76 | template<class E1, class E2, class F>
|
---|
77 | class matrix_vector_binary1:
|
---|
78 | Index: boost/numeric/ublas/functional.hpp
|
---|
79 | ===================================================================
|
---|
80 | --- boost/numeric/ublas/functional.hpp (revision 66890)
|
---|
81 | +++ boost/numeric/ublas/functional.hpp (working copy)
|
---|
82 | @@ -172,7 +172,19 @@
|
---|
83 | return t1 / t2;
|
---|
84 | }
|
---|
85 | };
|
---|
86 | + template<class T, class U>
|
---|
87 | + struct scalar_pow:
|
---|
88 | + public scalar_binary_functor<T, U> {
|
---|
89 | + typedef typename scalar_binary_functor<T, U>::argument1_type argument1_type;
|
---|
90 | + typedef typename scalar_binary_functor<T, U>::argument2_type argument2_type;
|
---|
91 | + typedef typename boost::remove_reference< argument1_type >::type result_type;
|
---|
92 |
|
---|
93 | + static BOOST_UBLAS_INLINE
|
---|
94 | + result_type apply (argument1_type t, argument2_type p) {
|
---|
95 | + return type_traits<T>::type_pow (t,p);
|
---|
96 | + }
|
---|
97 | + };
|
---|
98 | +
|
---|
99 | template<class T1, class T2>
|
---|
100 | struct scalar_binary_assign_functor {
|
---|
101 | // ISSUE Remove reference to avoid reference to reference problems
|
---|
102 | Index: boost/numeric/ublas/traits.hpp
|
---|
103 | ===================================================================
|
---|
104 | --- boost/numeric/ublas/traits.hpp (revision 66890)
|
---|
105 | +++ boost/numeric/ublas/traits.hpp (working copy)
|
---|
106 | @@ -41,6 +41,11 @@
|
---|
107 | // we'll find either std::abs or else another version via ADL:
|
---|
108 | return abs (t);
|
---|
109 | }
|
---|
110 | + template<class T, class U> T boost_numeric_ublas_pow (const T& t, const U& p) {
|
---|
111 | + using namespace std;
|
---|
112 | + // we'll find either std::pow or else another version via ADL:
|
---|
113 | + return pow (t,p);
|
---|
114 | + }
|
---|
115 | }
|
---|
116 |
|
---|
117 | namespace boost { namespace numeric { namespace ublas {
|
---|
118 | @@ -186,6 +191,11 @@
|
---|
119 | real_type type_abs (const_reference t) {
|
---|
120 | return boost_numeric_ublas_abs (t);
|
---|
121 | }
|
---|
122 | + template<class U> static
|
---|
123 | + BOOST_UBLAS_INLINE
|
---|
124 | + value_type type_pow (const_reference t, const U& p) {
|
---|
125 | + return boost_numeric_ublas_pow (t,p);
|
---|
126 | + }
|
---|
127 | static
|
---|
128 | BOOST_UBLAS_INLINE
|
---|
129 | value_type type_sqrt (const_reference t) {
|
---|
130 | @@ -297,6 +307,11 @@
|
---|
131 | real_type type_abs (const_reference t) {
|
---|
132 | return abs (t);
|
---|
133 | }
|
---|
134 | + template<class U> static
|
---|
135 | + BOOST_UBLAS_INLINE
|
---|
136 | + value_type type_pow (const_reference t, const U& p) {
|
---|
137 | + return boost_numeric_ublas_pow (t,p);
|
---|
138 | + }
|
---|
139 | static
|
---|
140 | BOOST_UBLAS_INLINE
|
---|
141 | value_type type_sqrt (const_reference t) {
|
---|
142 | Index: libs/numeric/ublas/test/test_pow.cpp
|
---|
143 | ===================================================================
|
---|
144 | --- libs/numeric/ublas/test/test_pow.cpp (revision 0)
|
---|
145 | +++ libs/numeric/ublas/test/test_pow.cpp (revision 0)
|
---|
146 | @@ -0,0 +1,118 @@
|
---|
147 | +#include "test_pow.hpp"
|
---|
148 | +
|
---|
149 | +template<class V, int N>
|
---|
150 | +struct test_vector_pow {
|
---|
151 | + typedef typename V::value_type value_type;
|
---|
152 | + typedef typename V::size_type size_type;
|
---|
153 | + typedef typename ublas::type_traits<value_type>::real_type real_type;
|
---|
154 | +
|
---|
155 | + template<class VP>
|
---|
156 | + void test_pow_with (VP &v1, VP &v2, VP &v3) const {
|
---|
157 | + initialize_vector (v1);
|
---|
158 | + v2 = v1;
|
---|
159 | + std::cout << "v2 = v1 = " << v1 << std::endl;
|
---|
160 | + v2 = pow( v1, 2 );
|
---|
161 | + std::cout << "pow( v1, 2 ) = " << v2 << std::endl;
|
---|
162 | + v1 = pow( v2, 0.5 );
|
---|
163 | + std::cout << "pow( v2, 0.5 ) = " << v1 << std::endl;
|
---|
164 | +
|
---|
165 | + initialize_vector (v1);
|
---|
166 | + v2 = v1;
|
---|
167 | + std::cout << "v2 = v1 = " << v1 << std::endl;
|
---|
168 | + v3 = element_pow( v1, v2 );
|
---|
169 | + std::cout << "element_pow( v1, v2 ) = " << v3 << std::endl;
|
---|
170 | + }
|
---|
171 | +
|
---|
172 | + void operator () () const {
|
---|
173 | + V v1 (N);
|
---|
174 | + V v2 (N);
|
---|
175 | + V v3 (N);
|
---|
176 | + test_pow_with (v1, v2, v3);
|
---|
177 | + }
|
---|
178 | +};
|
---|
179 | +
|
---|
180 | +template<class M, int N>
|
---|
181 | +struct test_matrix_pow {
|
---|
182 | + typedef typename M::value_type value_type;
|
---|
183 | +
|
---|
184 | + template<class MP>
|
---|
185 | + void test_pow_with (MP &m1, MP &m2, MP &m3) const {
|
---|
186 | + initialize_matrix (m1);
|
---|
187 | + m2 = m1;
|
---|
188 | + std::cout << "m2 = m1 = " << m1 << std::endl;
|
---|
189 | + m2 = pow( m1, 2 );
|
---|
190 | + std::cout << "pow( m1, 2 ) = " << m2 << std::endl;
|
---|
191 | + m1 = pow( m2, 0.5 );
|
---|
192 | + std::cout << "pow( m2, 0.5 ) = " << m1 << std::endl;
|
---|
193 | +
|
---|
194 | + initialize_matrix (m1);
|
---|
195 | + m2 = m1;
|
---|
196 | + std::cout << "m2 = m1 = " << m1 << std::endl;
|
---|
197 | + m3 = element_pow( m1, m2 );
|
---|
198 | + std::cout << "element_pow( m1, m2 ) = " << m3 << std::endl;
|
---|
199 | + }
|
---|
200 | + void operator () () const {
|
---|
201 | + M m1 (N, N);
|
---|
202 | + M m2 (N, N);
|
---|
203 | + M m3 (N, N);
|
---|
204 | + test_pow_with (m1, m2, m3);
|
---|
205 | + }
|
---|
206 | +};
|
---|
207 | +
|
---|
208 | +void test_vector () {
|
---|
209 | + std::cout << "test_vector" << std::endl;
|
---|
210 | +
|
---|
211 | +#ifdef USE_FLOAT
|
---|
212 | + std::cout << "float" << std::endl;
|
---|
213 | + test_vector_pow<ublas::vector<float>, 3> () ();
|
---|
214 | +#endif
|
---|
215 | +
|
---|
216 | +#ifdef USE_DOUBLE
|
---|
217 | + std::cout << "double" << std::endl;
|
---|
218 | + test_vector_pow<ublas::vector<double>, 3> () ();
|
---|
219 | +#endif
|
---|
220 | +
|
---|
221 | +#ifdef USE_STD_COMPLEX
|
---|
222 | +#ifdef USE_FLOAT
|
---|
223 | + std::cout << "std::complex<float>" << std::endl;
|
---|
224 | + test_vector_pow<ublas::vector<std::complex<float> >, 3> () ();
|
---|
225 | +#endif
|
---|
226 | +
|
---|
227 | +#ifdef USE_DOUBLE
|
---|
228 | + std::cout << "std::complex<double>" << std::endl;
|
---|
229 | + test_vector_pow<ublas::vector<std::complex<double> >, 3> () ();
|
---|
230 | +#endif
|
---|
231 | +#endif
|
---|
232 | +}
|
---|
233 | +
|
---|
234 | +void test_matrix () {
|
---|
235 | + std::cout << "test_matrix" << std::endl;
|
---|
236 | +
|
---|
237 | +#ifdef USE_FLOAT
|
---|
238 | + std::cout << "float" << std::endl;
|
---|
239 | + test_matrix_pow<ublas::matrix<float>, 3> () ();
|
---|
240 | +#endif
|
---|
241 | +
|
---|
242 | +#ifdef USE_DOUBLE
|
---|
243 | + std::cout << "double" << std::endl;
|
---|
244 | + test_matrix_pow<ublas::matrix<double>, 3> () ();
|
---|
245 | +#endif
|
---|
246 | +
|
---|
247 | +#ifdef USE_STD_COMPLEX
|
---|
248 | +#ifdef USE_FLOAT
|
---|
249 | + std::cout << "std::complex<float>" << std::endl;
|
---|
250 | + test_matrix_pow<ublas::matrix<std::complex<float> >, 3> () ();
|
---|
251 | +#endif
|
---|
252 | +
|
---|
253 | +#ifdef USE_DOUBLE
|
---|
254 | + std::cout << "std::complex<double>" << std::endl;
|
---|
255 | + test_matrix_pow<ublas::matrix<std::complex<double> >, 3> () ();
|
---|
256 | +#endif
|
---|
257 | +#endif
|
---|
258 | +}
|
---|
259 | +
|
---|
260 | +int main () {
|
---|
261 | + test_vector ();
|
---|
262 | + test_matrix ();
|
---|
263 | + return 0;
|
---|
264 | +}
|
---|
265 | Index: libs/numeric/ublas/test/test_pow.hpp
|
---|
266 | ===================================================================
|
---|
267 | --- libs/numeric/ublas/test/test_pow.hpp (revision 0)
|
---|
268 | +++ libs/numeric/ublas/test/test_pow.hpp (revision 0)
|
---|
269 | @@ -0,0 +1,20 @@
|
---|
270 | +#ifndef TEST_POW_H
|
---|
271 | +#define TEST_POW_H
|
---|
272 | +
|
---|
273 | +#include <iostream>
|
---|
274 | +
|
---|
275 | +#include <boost/numeric/ublas/vector.hpp>
|
---|
276 | +#include <boost/numeric/ublas/vector_proxy.hpp>
|
---|
277 | +#include <boost/numeric/ublas/matrix.hpp>
|
---|
278 | +#include <boost/numeric/ublas/matrix_proxy.hpp>
|
---|
279 | +#include <boost/numeric/ublas/io.hpp>
|
---|
280 | +
|
---|
281 | +namespace ublas = boost::numeric::ublas;
|
---|
282 | +
|
---|
283 | +#include "common/init.hpp"
|
---|
284 | +
|
---|
285 | +void test_vector ();
|
---|
286 | +void test_matrix ();
|
---|
287 | +
|
---|
288 | +
|
---|
289 | +#endif
|
---|
290 | Index: libs/numeric/ublas/test/Jamfile.v2
|
---|
291 | ===================================================================
|
---|
292 | --- libs/numeric/ublas/test/Jamfile.v2 (revision 66890)
|
---|
293 | +++ libs/numeric/ublas/test/Jamfile.v2 (working copy)
|
---|
294 | @@ -132,6 +132,10 @@
|
---|
295 | ]
|
---|
296 | [ run test_complex_norms.cpp
|
---|
297 | ]
|
---|
298 | + [ run test_pow.cpp
|
---|
299 | + : : :
|
---|
300 | + <define>$(UBLAS_TESTSET)
|
---|
301 | + ]
|
---|
302 | [ run test_assignment.cpp
|
---|
303 | ]
|
---|
304 | ;
|
---|