vectorwiseop.cpp File Reference
#include "main.h"

Macros

#define TEST_ENABLE_TEMPORARY_TRACKING
 
#define TEST_PARTIAL_REDUX_BASIC(FUNC, ROW, COL, PREPROCESS)
 

Functions

template<typename ArrayType >
void vectorwiseop_array (const ArrayType &m)
 
template<typename MatrixType >
void vectorwiseop_matrix (const MatrixType &m)
 
 EIGEN_DECLARE_TEST (vectorwiseop)
 

Macro Definition Documentation

◆ TEST_ENABLE_TEMPORARY_TRACKING

#define TEST_ENABLE_TEMPORARY_TRACKING

◆ TEST_PARTIAL_REDUX_BASIC

#define TEST_PARTIAL_REDUX_BASIC (   FUNC,
  ROW,
  COL,
  PREPROCESS 
)
Value:
{ \
ROW = m1 PREPROCESS.colwise().FUNC; \
for (Index k = 0; k < cols; ++k) VERIFY_IS_APPROX(ROW(k), m1.col(k) PREPROCESS.FUNC); \
COL = m1 PREPROCESS.rowwise().FUNC; \
for (Index k = 0; k < rows; ++k) VERIFY_IS_APPROX(COL(k), m1.row(k) PREPROCESS.FUNC); \
}
Matrix3d m1
Definition: IOFormat.cpp:2
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
char char char int int * k
Definition: level2_impl.h:374
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
@ COL
Definition: oomph_superlu_4.3/superlu_enum_consts.h:22
@ ROW
Definition: oomph_superlu_4.3/superlu_enum_consts.h:22

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( vectorwiseop  )
217  {
218  CALL_SUBTEST_1(vectorwiseop_array(Array22cd()));
220  CALL_SUBTEST_3(vectorwiseop_array(ArrayXXf(3, 4)));
221  CALL_SUBTEST_4(vectorwiseop_matrix(Matrix4cf()));
222  CALL_SUBTEST_5(vectorwiseop_matrix(Matrix4f()));
223  CALL_SUBTEST_5(vectorwiseop_matrix(Vector4f()));
226  MatrixXd(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
227  CALL_SUBTEST_7(vectorwiseop_matrix(VectorXd(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
228  CALL_SUBTEST_7(vectorwiseop_matrix(RowVectorXd(internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
229 }
#define EIGEN_TEST_MAX_SIZE
Definition: boostmultiprec.cpp:16
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:48
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
#define CALL_SUBTEST_6(FUNC)
Definition: split_test_helper.h:34
#define CALL_SUBTEST_3(FUNC)
Definition: split_test_helper.h:16
#define CALL_SUBTEST_1(FUNC)
Definition: split_test_helper.h:4
#define CALL_SUBTEST_5(FUNC)
Definition: split_test_helper.h:28
#define CALL_SUBTEST_2(FUNC)
Definition: split_test_helper.h:10
#define CALL_SUBTEST_7(FUNC)
Definition: split_test_helper.h:40
#define CALL_SUBTEST_4(FUNC)
Definition: split_test_helper.h:22
void vectorwiseop_matrix(const MatrixType &m)
Definition: vectorwiseop.cpp:97
void vectorwiseop_array(const ArrayType &m)
Definition: vectorwiseop.cpp:16

References CALL_SUBTEST_1, CALL_SUBTEST_2, CALL_SUBTEST_3, CALL_SUBTEST_4, CALL_SUBTEST_5, CALL_SUBTEST_6, CALL_SUBTEST_7, EIGEN_TEST_MAX_SIZE, vectorwiseop_array(), and vectorwiseop_matrix().

◆ vectorwiseop_array()

template<typename ArrayType >
void vectorwiseop_array ( const ArrayType &  m)
16  {
17  typedef typename ArrayType::Scalar Scalar;
20 
21  Index rows = m.rows();
22  Index cols = m.cols();
23  Index r = internal::random<Index>(0, rows - 1), c = internal::random<Index>(0, cols - 1);
24 
25  ArrayType m1 = ArrayType::Random(rows, cols), m2(rows, cols), m3(rows, cols);
26 
27  ColVectorType colvec = ColVectorType::Random(rows);
28  RowVectorType rowvec = RowVectorType::Random(cols);
29 
30  // test addition
31  m2 = m1;
32  m2.colwise() += colvec;
33  VERIFY_IS_APPROX(m2, m1.colwise() + colvec);
34  VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec);
35 
36  m2 = m1;
37  m2.rowwise() += rowvec;
38  VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec);
39  VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec);
40 
41  // test subtraction
42  m2 = m1;
43  m2.colwise() -= colvec;
44  VERIFY_IS_APPROX(m2, m1.colwise() - colvec);
45  VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec);
46 
47  m2 = m1;
48  m2.rowwise() -= rowvec;
49  VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec);
50  VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec);
51 
52  // test multiplication
53  m2 = m1;
54  m2.colwise() *= colvec;
55  VERIFY_IS_APPROX(m2, m1.colwise() * colvec);
56  VERIFY_IS_APPROX(m2.col(c), m1.col(c) * colvec);
57 
58  m2 = m1;
59  m2.rowwise() *= rowvec;
60  VERIFY_IS_APPROX(m2, m1.rowwise() * rowvec);
61  VERIFY_IS_APPROX(m2.row(r), m1.row(r) * rowvec);
62 
63  // test quotient
64  m2 = m1;
65  m2.colwise() /= colvec;
66  VERIFY_IS_APPROX(m2, m1.colwise() / colvec);
67  VERIFY_IS_APPROX(m2.col(c), m1.col(c) / colvec);
68 
69  m2 = m1;
70  m2.rowwise() /= rowvec;
71  VERIFY_IS_APPROX(m2, m1.rowwise() / rowvec);
72  VERIFY_IS_APPROX(m2.row(r), m1.row(r) / rowvec);
73 
74  m2 = m1;
75  // yes, there might be an aliasing issue there but ".rowwise() /="
76  // is supposed to evaluate " m2.colwise().sum()" into a temporary to avoid
77  // evaluating the reduction multiple times
78  if (ArrayType::RowsAtCompileTime > 2 || ArrayType::RowsAtCompileTime == Dynamic) {
79  m2.rowwise() /= m2.colwise().sum();
80  VERIFY_IS_APPROX(m2, m1.rowwise() / m1.colwise().sum());
81  }
82 
83  // all/any
85  mb = (m1.real() <= 0.7).colwise().all();
86  VERIFY((mb.col(c) == (m1.real().col(c) <= 0.7).all()).all());
87  mb = (m1.real() <= 0.7).rowwise().all();
88  VERIFY((mb.row(r) == (m1.real().row(r) <= 0.7).all()).all());
89 
90  mb = (m1.real() >= 0.7).colwise().any();
91  VERIFY((mb.col(c) == (m1.real().col(c) >= 0.7).any()).all());
92  mb = (m1.real() >= 0.7).rowwise().any();
93  VERIFY((mb.row(r) == (m1.real().row(r) >= 0.7).any()).all());
94 }
MatrixType m2(n_dims)
SCALAR Scalar
Definition: bench_gemm.cpp:45
int * m
Definition: level2_cplx_impl.h:294
#define VERIFY(a)
Definition: main.h:362
const int Dynamic
Definition: Constants.h:25
r
Definition: UniformPSDSelfTest.py:20
int c
Definition: calibrate.py:100

References calibrate::c, cols, Eigen::Dynamic, m, m1, m2(), UniformPSDSelfTest::r, rows, VERIFY, and VERIFY_IS_APPROX.

Referenced by EIGEN_DECLARE_TEST().

◆ vectorwiseop_matrix()

template<typename MatrixType >
void vectorwiseop_matrix ( const MatrixType m)
97  {
98  typedef typename MatrixType::Scalar Scalar;
99  typedef typename NumTraits<Scalar>::Real RealScalar;
104  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixX;
105 
106  Index rows = m.rows();
107  Index cols = m.cols();
108  Index r = internal::random<Index>(0, rows - 1), c = internal::random<Index>(0, cols - 1);
109 
110  MatrixType m1 = MatrixType::Random(rows, cols), m2(rows, cols), m3(rows, cols);
111 
112  ColVectorType colvec = ColVectorType::Random(rows);
113  RowVectorType rowvec = RowVectorType::Random(cols);
114  RealColVectorType rcres;
115  RealRowVectorType rrres;
116 
117  // test broadcast assignment
118  m2 = m1;
119  m2.colwise() = colvec;
120  for (Index j = 0; j < cols; ++j) VERIFY_IS_APPROX(m2.col(j), colvec);
121  m2.rowwise() = rowvec;
122  for (Index i = 0; i < rows; ++i) VERIFY_IS_APPROX(m2.row(i), rowvec);
123 
124  // test addition
125  m2 = m1;
126  m2.colwise() += colvec;
127  VERIFY_IS_APPROX(m2, m1.colwise() + colvec);
128  VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec);
129 
130  m2 = m1;
131  m2.rowwise() += rowvec;
132  VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec);
133  VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec);
134 
135  // test subtraction
136  m2 = m1;
137  m2.colwise() -= colvec;
138  VERIFY_IS_APPROX(m2, m1.colwise() - colvec);
139  VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec);
140 
141  m2 = m1;
142  m2.rowwise() -= rowvec;
143  VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec);
144  VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec);
145 
146  // ------ partial reductions ------
147 
148 #define TEST_PARTIAL_REDUX_BASIC(FUNC, ROW, COL, PREPROCESS) \
149  { \
150  ROW = m1 PREPROCESS.colwise().FUNC; \
151  for (Index k = 0; k < cols; ++k) VERIFY_IS_APPROX(ROW(k), m1.col(k) PREPROCESS.FUNC); \
152  COL = m1 PREPROCESS.rowwise().FUNC; \
153  for (Index k = 0; k < rows; ++k) VERIFY_IS_APPROX(COL(k), m1.row(k) PREPROCESS.FUNC); \
154  }
155 
156  TEST_PARTIAL_REDUX_BASIC(sum(), rowvec, colvec, EIGEN_EMPTY);
157  TEST_PARTIAL_REDUX_BASIC(prod(), rowvec, colvec, EIGEN_EMPTY);
158  TEST_PARTIAL_REDUX_BASIC(mean(), rowvec, colvec, EIGEN_EMPTY);
159  TEST_PARTIAL_REDUX_BASIC(minCoeff(), rrres, rcres, .real());
160  TEST_PARTIAL_REDUX_BASIC(maxCoeff(), rrres, rcres, .real());
161  TEST_PARTIAL_REDUX_BASIC(norm(), rrres, rcres, EIGEN_EMPTY);
162  TEST_PARTIAL_REDUX_BASIC(squaredNorm(), rrres, rcres, EIGEN_EMPTY);
163  TEST_PARTIAL_REDUX_BASIC(redux(internal::scalar_sum_op<Scalar, Scalar>()), rowvec, colvec, EIGEN_EMPTY);
164 
165  VERIFY_IS_APPROX(m1.cwiseAbs().colwise().sum(), m1.colwise().template lpNorm<1>());
166  VERIFY_IS_APPROX(m1.cwiseAbs().rowwise().sum(), m1.rowwise().template lpNorm<1>());
167  VERIFY_IS_APPROX(m1.cwiseAbs().colwise().maxCoeff(), m1.colwise().template lpNorm<Infinity>());
168  VERIFY_IS_APPROX(m1.cwiseAbs().rowwise().maxCoeff(), m1.rowwise().template lpNorm<Infinity>());
169 
170  // regression for bug 1158
171  VERIFY_IS_APPROX(m1.cwiseAbs().colwise().sum().x(), m1.col(0).cwiseAbs().sum());
172 
173  // test normalized
174  m2 = m1.colwise().normalized();
175  VERIFY_IS_APPROX(m2.col(c), m1.col(c).normalized());
176  m2 = m1.rowwise().normalized();
177  VERIFY_IS_APPROX(m2.row(r), m1.row(r).normalized());
178 
179  // test normalize
180  m2 = m1;
181  m2.colwise().normalize();
182  VERIFY_IS_APPROX(m2.col(c), m1.col(c).normalized());
183  m2 = m1;
184  m2.rowwise().normalize();
185  VERIFY_IS_APPROX(m2.row(r), m1.row(r).normalized());
186 
187  // test with partial reduction of products
189  VERIFY_IS_APPROX((m1 * m1.transpose()).colwise().sum(), m1m1.colwise().sum());
191  VERIFY_EVALUATION_COUNT(tmp = (m1 * m1.transpose()).colwise().sum(), 1);
192 
193  m2 = m1.rowwise() - (m1.colwise().sum() / RealScalar(m1.rows())).eval();
194  m1 = m1.rowwise() - (m1.colwise().sum() / RealScalar(m1.rows()));
196  VERIFY_EVALUATION_COUNT(m2 = (m1.rowwise() - m1.colwise().sum() / RealScalar(m1.rows())),
197  (MatrixType::RowsAtCompileTime != 1 ? 1 : 0));
198 
199  // test empty expressions
200  VERIFY_IS_APPROX(m1.matrix().middleCols(0, 0).rowwise().sum().eval(), MatrixX::Zero(rows, 1));
201  VERIFY_IS_APPROX(m1.matrix().middleRows(0, 0).colwise().sum().eval(), MatrixX::Zero(1, cols));
202  VERIFY_IS_APPROX(m1.matrix().middleCols(0, fix<0>).rowwise().sum().eval(), MatrixX::Zero(rows, 1));
203  VERIFY_IS_APPROX(m1.matrix().middleRows(0, fix<0>).colwise().sum().eval(), MatrixX::Zero(1, cols));
204 
205  VERIFY_IS_APPROX(m1.matrix().middleCols(0, 0).rowwise().prod().eval(), MatrixX::Ones(rows, 1));
206  VERIFY_IS_APPROX(m1.matrix().middleRows(0, 0).colwise().prod().eval(), MatrixX::Ones(1, cols));
207  VERIFY_IS_APPROX(m1.matrix().middleCols(0, fix<0>).rowwise().prod().eval(), MatrixX::Ones(rows, 1));
208  VERIFY_IS_APPROX(m1.matrix().middleRows(0, fix<0>).colwise().prod().eval(), MatrixX::Ones(1, cols));
209  VERIFY_IS_APPROX(m1.matrix().middleCols(0, 0).rowwise().squaredNorm().eval(), MatrixX::Zero(rows, 1));
210 
211  VERIFY_IS_EQUAL(m1.real().middleRows(0, 0).rowwise().maxCoeff().eval().rows(), 0);
212  VERIFY_IS_EQUAL(m1.real().middleCols(0, 0).colwise().maxCoeff().eval().cols(), 0);
213  VERIFY_IS_EQUAL(m1.real().middleRows(0, fix<0>).rowwise().maxCoeff().eval().rows(), 0);
214  VERIFY_IS_EQUAL(m1.real().middleCols(0, fix<0>).colwise().maxCoeff().eval().cols(), 0);
215 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_EMPTY
Definition: Macros.h:1081
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
float real
Definition: datatypes.h:10
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
double Zero
Definition: pseudosolid_node_update_elements.cc:35
EIGEN_DONT_INLINE void prod(const Lhs &a, const Rhs &b, Res &c)
Definition: product_threshold.cpp:53
internal::nested_eval< T, 1 >::type eval(const T &xpr)
Definition: sparse_permutations.cpp:47
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
#define VERIFY_EVALUATION_COUNT(XPR, N)
Definition: test/sparse_product.cpp:28
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2
#define TEST_PARTIAL_REDUX_BASIC(FUNC, ROW, COL, PREPROCESS)

References calibrate::c, cols, EIGEN_EMPTY, eval(), i, j, m, m1, m2(), prod(), UniformPSDSelfTest::r, rows, TEST_PARTIAL_REDUX_BASIC, tmp, VERIFY_EVALUATION_COUNT, VERIFY_IS_APPROX, VERIFY_IS_EQUAL, and oomph::PseudoSolidHelper::Zero.

Referenced by EIGEN_DECLARE_TEST().