MCPcopy Create free account
hub / github.com/avaxman/Directional / array_generic

Function array_generic

external/eigen/test/array_cwise.cpp:460–637  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

458}
459
460template<typename ArrayType> void array_generic(const ArrayType& m)
461{
462 typedef typename ArrayType::Scalar Scalar;
463 typedef typename ArrayType::RealScalar RealScalar;
464 typedef Array<Scalar, ArrayType::RowsAtCompileTime, 1> ColVectorType;
465 typedef Array<Scalar, 1, ArrayType::ColsAtCompileTime> RowVectorType;
466
467 Index rows = m.rows();
468 Index cols = m.cols();
469
470 ArrayType m1 = ArrayType::Random(rows, cols);
471 if (NumTraits<RealScalar>::IsInteger && NumTraits<RealScalar>::IsSigned
472 && !NumTraits<Scalar>::IsComplex) {
473 // Here we cap the size of the values in m1 such that pow(3)/cube()
474 // doesn't overflow and result in undefined behavior. Notice that because
475 // pow(int, int) promotes its inputs and output to double (according to
476 // the C++ standard), we have to make sure that the result fits in 53 bits
477 // for int64,
478 RealScalar max_val =
479 numext::mini(RealScalar(std::cbrt(NumTraits<RealScalar>::highest())),
480 RealScalar(std::cbrt(1LL << 53)))/2;
481 m1.array() = (m1.abs().array() <= max_val).select(m1, Scalar(max_val));
482 }
483 ArrayType m2 = ArrayType::Random(rows, cols),
484 m3(rows, cols);
485 ArrayType m4 = m1; // copy constructor
486 VERIFY_IS_APPROX(m1, m4);
487
488 ColVectorType cv1 = ColVectorType::Random(rows);
489 RowVectorType rv1 = RowVectorType::Random(cols);
490
491 Scalar s1 = internal::random<Scalar>(),
492 s2 = internal::random<Scalar>();
493
494 // scalar addition
495 VERIFY_IS_APPROX(m1 + s1, s1 + m1);
496 VERIFY_IS_APPROX(m1 + s1, ArrayType::Constant(rows,cols,s1) + m1);
497 VERIFY_IS_APPROX(s1 - m1, (-m1)+s1 );
498 VERIFY_IS_APPROX(m1 - s1, m1 - ArrayType::Constant(rows,cols,s1));
499 VERIFY_IS_APPROX(s1 - m1, ArrayType::Constant(rows,cols,s1) - m1);
500 VERIFY_IS_APPROX((m1*Scalar(2)) - s2, (m1+m1) - ArrayType::Constant(rows,cols,s2) );
501 m3 = m1;
502 m3 += s2;
503 VERIFY_IS_APPROX(m3, m1 + s2);
504 m3 = m1;
505 m3 -= s1;
506 VERIFY_IS_APPROX(m3, m1 - s1);
507
508 // scalar operators via Maps
509 m3 = m1; m4 = m1;
510 ArrayType::Map(m4.data(), m4.rows(), m4.cols()) -= ArrayType::Map(m2.data(), m2.rows(), m2.cols());
511 VERIFY_IS_APPROX(m4, m3 - m2);
512
513 m3 = m1; m4 = m1;
514 ArrayType::Map(m4.data(), m4.rows(), m4.cols()) += ArrayType::Map(m2.data(), m2.rows(), m2.cols());
515 VERIFY_IS_APPROX(m4, m3 + m2);
516
517 m3 = m1; m4 = m1;

Callers 1

EIGEN_DECLARE_TESTFunction · 0.85

Calls 15

miniFunction · 0.85
isMuchSmallerThanFunction · 0.85
selectMethod · 0.80
colwiseMethod · 0.80
rowwiseMethod · 0.80
powMethod · 0.80
squareMethod · 0.80
cubeMethod · 0.80
absFunction · 0.70
realClass · 0.70
MapClass · 0.50
powFunction · 0.50

Tested by

no test coverage detected