Lines 3-18
Link Here
|
3 |
// |
3 |
// |
4 |
// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com> |
4 |
// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com> |
5 |
// |
5 |
// |
6 |
// This Source Code Form is subject to the terms of the Mozilla |
6 |
// This Source Code Form is subject to the terms of the Mozilla |
7 |
// Public License v. 2.0. If a copy of the MPL was not distributed |
7 |
// Public License v. 2.0. If a copy of the MPL was not distributed |
8 |
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 |
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
9 |
|
9 |
|
10 |
#define EIGEN_NO_STATIC_ASSERT // otherwise we fail at compile time on unused paths |
10 |
#define EIGEN_NO_STATIC_ASSERT // otherwise we fail at compile time on unused paths |
|
|
11 |
#define EIGEN_DEBUG_DEMANGLING |
11 |
#include "main.h" |
12 |
#include "main.h" |
12 |
|
13 |
|
13 |
template<typename MatrixType, typename Index, typename Scalar> |
14 |
template<typename MatrixType, typename Index, typename Scalar> |
14 |
typename Eigen::internal::enable_if<!NumTraits<typename MatrixType::Scalar>::IsComplex,typename MatrixType::Scalar>::type |
15 |
typename Eigen::internal::enable_if<!NumTraits<typename MatrixType::Scalar>::IsComplex,typename MatrixType::Scalar>::type |
15 |
block_real_only(const MatrixType &m1, Index r1, Index r2, Index c1, Index c2, const Scalar& s1) { |
16 |
block_real_only(const MatrixType &m1, Index r1, Index r2, Index c1, Index c2, const Scalar& s1) { |
16 |
// check cwise-Functions: |
17 |
// check cwise-Functions: |
17 |
VERIFY_IS_APPROX(m1.row(r1).cwiseMax(s1), m1.cwiseMax(s1).row(r1)); |
18 |
VERIFY_IS_APPROX(m1.row(r1).cwiseMax(s1), m1.cwiseMax(s1).row(r1)); |
18 |
VERIFY_IS_APPROX(m1.col(c1).cwiseMin(s1), m1.cwiseMin(s1).col(c1)); |
19 |
VERIFY_IS_APPROX(m1.col(c1).cwiseMin(s1), m1.cwiseMin(s1).col(c1)); |
Lines 183-198
template<typename MatrixType> void block
Link Here
|
183 |
VERIFY_IS_EQUAL(dv, dm); |
184 |
VERIFY_IS_EQUAL(dv, dm); |
184 |
|
185 |
|
185 |
VERIFY_IS_EQUAL( (m1.template block<Dynamic,1>(1,0,0,1)), m1.block(1,0,0,1)); |
186 |
VERIFY_IS_EQUAL( (m1.template block<Dynamic,1>(1,0,0,1)), m1.block(1,0,0,1)); |
186 |
VERIFY_IS_EQUAL( (m1.template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); |
187 |
VERIFY_IS_EQUAL( (m1.template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); |
187 |
VERIFY_IS_EQUAL( ((m1*1).template block<Dynamic,1>(1,0,0,1)), m1.block(1,0,0,1)); |
188 |
VERIFY_IS_EQUAL( ((m1*1).template block<Dynamic,1>(1,0,0,1)), m1.block(1,0,0,1)); |
188 |
VERIFY_IS_EQUAL( ((m1*1).template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); |
189 |
VERIFY_IS_EQUAL( ((m1*1).template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); |
189 |
} |
190 |
} |
190 |
|
191 |
|
|
|
192 |
template<typename T> |
193 |
bool same_type(const T&, const T&) { return true; } |
194 |
|
195 |
template<typename Expr, typename Ref, typename ExprFused> |
196 |
void checkbb(const DenseBase<Expr> &a_xpr, const DenseBase<Ref> &a_ref, const DenseBase<ExprFused> &a_xprfused) |
197 |
{ |
198 |
const Expr& xpr(a_xpr.derived());TRACK; |
199 |
const Ref& ref(a_ref.derived());TRACK; |
200 |
const ExprFused& xprfused(a_xprfused.derived());TRACK; |
201 |
|
202 |
VERIFY_IS_APPROX(xprfused, ref);TRACK; |
203 |
|
204 |
VERIFY(same_type<ExprFused>(xpr, xprfused));TRACK; |
205 |
|
206 |
if(ExprFused::Flags!=Expr::Flags) |
207 |
std::cerr << "Expected: " << internal::demangle_flags(ExprFused::Flags) << std::endl |
208 |
<< "Got: " << internal::demangle_flags(Expr::Flags) << std::endl; |
209 |
|
210 |
VERIFY_IS_EQUAL(ExprFused::Flags, Expr::Flags);TRACK; |
211 |
VERIFY_IS_EQUAL(ExprFused::RowsAtCompileTime, Expr::RowsAtCompileTime);TRACK; |
212 |
VERIFY_IS_EQUAL(ExprFused::ColsAtCompileTime, Expr::ColsAtCompileTime);TRACK; |
213 |
|
214 |
typedef internal::evaluator<ExprFused> EvalFused;TRACK; |
215 |
typedef internal::evaluator<Expr> EvalExpr;TRACK; |
216 |
VERIFY_IS_EQUAL(EvalFused::Flags, EvalExpr::Flags);TRACK; |
217 |
VERIFY_IS_EQUAL(EvalFused::Alignment, EvalExpr::Alignment);TRACK; |
218 |
|
219 |
VERIFY_IS_APPROX(xpr.derived(), ref);TRACK; |
220 |
VERIFY_IS_APPROX(xpr, ref);TRACK; |
221 |
} |
222 |
|
223 |
template<typename MatrixType> |
224 |
void block_rec(const MatrixType& a) |
225 |
{ |
226 |
if(a.cols()>1) |
227 |
{ |
228 |
block_rec(a.leftCols(a.cols()/2)); |
229 |
block_rec(a.rightCols(a.cols()/2)); |
230 |
} |
231 |
} |
232 |
|
233 |
template<typename T> const T& make_const(const T& x) { return x; } |
234 |
|
235 |
template<typename MatrixType> |
236 |
void check_block_block_fusion(const MatrixType &m) |
237 |
{ |
238 |
Index rows = m.rows(); |
239 |
Index cols = m.cols(); |
240 |
|
241 |
MatrixType m1 = MatrixType::Random(rows, cols), |
242 |
m2 = MatrixType::Random(rows, cols); |
243 |
|
244 |
Index r1 = internal::random<Index>(0,rows-1); |
245 |
Index c1 = internal::random<Index>(0,cols-1); |
246 |
Index nr1 = internal::random<Index>(1,rows-r1); |
247 |
Index nc1 = internal::random<Index>(1,cols-c1); |
248 |
|
249 |
Index r2 = internal::random<Index>(0,nr1-1); |
250 |
Index c2 = internal::random<Index>(0,nc1-1); |
251 |
Index nr2 = internal::random<Index>(1,nr1-r2); |
252 |
Index nc2 = internal::random<Index>(1,nc1-c2); |
253 |
|
254 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).block(r2,c2,nr2,nc2), |
255 |
m1.block(r1,c1, nr1,nc1).eval().block(r2,c2,nr2,nc2).eval(), |
256 |
m1.block(r1+r2, c1+c2, nr2, nc2)) ); |
257 |
CALL_SUBTEST( checkbb(make_const(m1.block(r1,c1, nr1,nc1)).block(r2,c2,nr2,nc2), |
258 |
m1.block(r1,c1, nr1,nc1).eval().block(r2,c2,nr2,nc2).eval(), |
259 |
make_const(m1).block(r1+r2, c1+c2, nr2, nc2)) ); |
260 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).block(r2,c2,nr2,nc2), |
261 |
(m1+m2).block(r1,c1, nr1,nc1).eval().block(r2,c2,nr2,nc2).eval(), |
262 |
(m1+m2).block(r1+r2, c1+c2, nr2, nc2)) ); |
263 |
|
264 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).row(r2), |
265 |
m1.block(r1,c1, nr1,nc1).eval().row(r2).eval(), |
266 |
m1.template block<1,Dynamic>(r1+r2, c1, 1, nc1)) ); |
267 |
CALL_SUBTEST( checkbb(make_const(m1.block(r1,c1, nr1,nc1)).row(r2), |
268 |
m1.block(r1,c1, nr1,nc1).eval().row(r2).eval(), |
269 |
make_const(m1).template block<1,Dynamic>(r1+r2, c1, 1, nc1)) ); |
270 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).row(r2), |
271 |
(m1+m2).block(r1,c1, nr1,nc1).eval().row(r2).eval(), |
272 |
(m1+m2).template block<1,Dynamic>(r1+r2, c1, 1, nc1)) ); |
273 |
|
274 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).col(c2), |
275 |
m1.block(r1,c1, nr1,nc1).eval().col(c2).eval(), |
276 |
m1.template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
277 |
CALL_SUBTEST( checkbb(make_const(m1.block(r1,c1, nr1,nc1)).col(c2), |
278 |
m1.block(r1,c1, nr1,nc1).eval().col(c2).eval(), |
279 |
make_const(m1).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
280 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).col(c2), |
281 |
(m1+m2).block(r1,c1, nr1,nc1).eval().col(c2).eval(), |
282 |
(m1+m2).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
283 |
|
284 |
CALL_SUBTEST( checkbb(m1.row(r1).segment(c1,nc1), |
285 |
m1.row(r1).eval().segment(c1,nc1).eval(), |
286 |
m1.template block<1,Dynamic>(r1, c1, 1, nc1)) ); |
287 |
CALL_SUBTEST( checkbb(make_const(m1.row(r1)).segment(c1,nc1), |
288 |
m1.row(r1).eval().segment(c1,nc1).eval(), |
289 |
make_const(m1).template block<1,Dynamic>(r1, c1, 1, nc1)) ); |
290 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).segment(c1,nc1), |
291 |
(m1+m2).row(r1).eval().segment(c1,nc1).eval(), |
292 |
(m1+m2).template block<1,Dynamic>(r1, c1, 1, nc1)) ); |
293 |
|
294 |
CALL_SUBTEST( checkbb(m1.col(c1).segment(r1,nr1), |
295 |
m1.col(c1).eval().segment(r1,nr1).eval(), |
296 |
m1.template block<Dynamic,1>(r1, c1, nr1, 1)) ); |
297 |
CALL_SUBTEST( checkbb(make_const(m1.col(c1)).segment(r1,nr1), |
298 |
m1.col(c1).eval().segment(r1,nr1).eval(), |
299 |
make_const(m1).template block<Dynamic,1>(r1, c1, nr1, 1)) ); |
300 |
CALL_SUBTEST( checkbb((m1+m2).col(c1).segment(r1,nr1), |
301 |
(m1+m2).col(c1).eval().segment(r1,nr1).eval(), |
302 |
(m1+m2).template block<Dynamic,1>(r1, c1, nr1, 1)) ); |
303 |
|
304 |
CALL_SUBTEST( checkbb(m1.middleCols(c1,nc1).col(c2).segment(r1,nr1), |
305 |
m1.middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
306 |
m1.template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
307 |
CALL_SUBTEST( checkbb(make_const(m1.middleCols(c1,nc1)).col(c2).segment(r1,nr1), |
308 |
m1.middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
309 |
make_const(m1).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
310 |
CALL_SUBTEST( checkbb(make_const(m1.middleCols(c1,nc1).col(c2)).segment(r1,nr1), |
311 |
m1.middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
312 |
make_const(m1).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
313 |
CALL_SUBTEST( checkbb((m1+m2).middleCols(c1,nc1).col(c2).segment(r1,nr1), |
314 |
(m1+m2).middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
315 |
(m1+m2).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
316 |
|
317 |
CALL_SUBTEST( checkbb(m1.row(r1).col(c1), |
318 |
m1.row(r1).eval().col(c1).eval(), |
319 |
m1.template block<1,1>(r1, c1)) ); |
320 |
CALL_SUBTEST( checkbb(make_const(m1.row(r1)).col(c1), |
321 |
m1.row(r1).eval().col(c1).eval(), |
322 |
make_const(m1).template block<1,1>(r1, c1)) ); |
323 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).col(c1), |
324 |
(m1+m2).row(r1).eval().col(c1).eval(), |
325 |
(m1+m2).template block<1,1>(r1, c1)) ); |
326 |
|
327 |
CALL_SUBTEST( checkbb(m1.row(r1).col(c1).segment(0,1), |
328 |
m1.row(r1).eval().col(c1).eval().segment(0,1).eval(), |
329 |
m1.template block<Dynamic,1>(r1, c1, 1,1)) ); |
330 |
CALL_SUBTEST( checkbb(make_const(m1.row(r1)).col(c1).segment(0,1), |
331 |
m1.row(r1).eval().col(c1).eval().segment(0,1).eval(), |
332 |
make_const(m1).template block<Dynamic,1>(r1, c1, 1,1)) ); |
333 |
CALL_SUBTEST( checkbb(make_const(m1.row(r1).col(c1)).segment(0,1), |
334 |
m1.row(r1).eval().col(c1).eval().segment(0,1).eval(), |
335 |
make_const(m1).template block<Dynamic,1>(r1, c1, 1,1)) ); |
336 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).col(c1).segment(0,1), |
337 |
(m1+m2).row(r1).eval().col(c1).eval().segment(0,1).eval(), |
338 |
(m1+m2).template block<Dynamic,1>(r1, c1, 1,1)) ); |
339 |
|
340 |
block_rec(m1); |
341 |
block_rec(m1+m2); |
342 |
block_rec(m1.transpose()); |
343 |
} |
191 |
|
344 |
|
192 |
template<typename MatrixType> |
345 |
template<typename MatrixType> |
193 |
void compare_using_data_and_stride(const MatrixType& m) |
346 |
void compare_using_data_and_stride(const MatrixType& m) |
194 |
{ |
347 |
{ |
195 |
typedef typename MatrixType::Index Index; |
348 |
typedef typename MatrixType::Index Index; |
196 |
Index rows = m.rows(); |
349 |
Index rows = m.rows(); |
197 |
Index cols = m.cols(); |
350 |
Index cols = m.cols(); |
198 |
Index size = m.size(); |
351 |
Index size = m.size(); |
Lines 251-264
void test_block()
Link Here
|
251 |
CALL_SUBTEST_2( block(Matrix4d()) ); |
404 |
CALL_SUBTEST_2( block(Matrix4d()) ); |
252 |
CALL_SUBTEST_3( block(MatrixXcf(3, 3)) ); |
405 |
CALL_SUBTEST_3( block(MatrixXcf(3, 3)) ); |
253 |
CALL_SUBTEST_4( block(MatrixXi(8, 12)) ); |
406 |
CALL_SUBTEST_4( block(MatrixXi(8, 12)) ); |
254 |
CALL_SUBTEST_5( block(MatrixXcd(20, 20)) ); |
407 |
CALL_SUBTEST_5( block(MatrixXcd(20, 20)) ); |
255 |
CALL_SUBTEST_6( block(MatrixXf(20, 20)) ); |
408 |
CALL_SUBTEST_6( block(MatrixXf(20, 20)) ); |
256 |
|
409 |
|
257 |
CALL_SUBTEST_8( block(Matrix<float,Dynamic,4>(3, 4)) ); |
410 |
CALL_SUBTEST_8( block(Matrix<float,Dynamic,4>(3, 4)) ); |
258 |
|
411 |
|
|
|
412 |
CALL_SUBTEST_9( check_block_block_fusion(MatrixXi(internal::random(1,50), internal::random(1,50))) ); |
413 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix4i()) ); |
414 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix3i()) ); |
415 |
|
416 |
CALL_SUBTEST_9( check_block_block_fusion(MatrixXd(internal::random(1,50), internal::random(1,50))) ); |
417 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix4d()) ); |
418 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix3d()) ); |
419 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix2d()) ); |
420 |
|
259 |
#ifndef EIGEN_DEFAULT_TO_ROW_MAJOR |
421 |
#ifndef EIGEN_DEFAULT_TO_ROW_MAJOR |
260 |
CALL_SUBTEST_6( data_and_stride(MatrixXf(internal::random(5,50), internal::random(5,50))) ); |
422 |
CALL_SUBTEST_6( data_and_stride(MatrixXf(internal::random(5,50), internal::random(5,50))) ); |
261 |
CALL_SUBTEST_7( data_and_stride(Matrix<int,Dynamic,Dynamic,RowMajor>(internal::random(5,50), internal::random(5,50))) ); |
423 |
CALL_SUBTEST_7( data_and_stride(Matrix<int,Dynamic,Dynamic,RowMajor>(internal::random(5,50), internal::random(5,50))) ); |
262 |
#endif |
424 |
#endif |
263 |
} |
425 |
} |
264 |
} |
426 |
} |