| // SPDX-FileCopyrightText: The Eigen Authors | |
| // SPDX-License-Identifier: MPL-2.0 | |
| #ifndef EIGEN_STRUCTURED_TEST_HELPERS_H | |
| #define EIGEN_STRUCTURED_TEST_HELPERS_H | |
| #include <Eigen/Core> | |
| namespace Eigen { | |
| // Vectorized complex products can introduce Inf - Inf across component accumulators. | |
| // Preserve scalar evaluation order for the non-finite reference results. | |
| template <typename Scalar> | |
| Matrix<Scalar, Dynamic, 1> reference_product_ieee(const Matrix<Scalar, Dynamic, Dynamic>& matrix, | |
| const Matrix<Scalar, Dynamic, 1>& vector) { | |
| Matrix<Scalar, Dynamic, 1> result(matrix.rows()); | |
| for (Index i = 0; i < matrix.rows(); ++i) { | |
| Scalar accumulator(0); | |
| for (Index j = 0; j < matrix.cols(); ++j) accumulator += matrix(i, j) * vector[j]; | |
| result[i] = accumulator; | |
| } | |
| return result; | |
| } | |
| // The FFT-based products mix every input entry into every output entry, so an Inf or NaN may make more entries | |
| // non-finite than the dense product does. \returns whether it makes at least those. | |
| template <typename Actual, typename Reference> | |
| bool nonfinite_covers_reference(const Actual& actual, const Reference& reference) { | |
| for (Index i = 0; i < reference.size(); ++i) | |
| if (!(numext::isfinite)(reference[i]) && (numext::isfinite)(actual[i])) return false; | |
| return true; | |
| } | |
| } // namespace Eigen | |
| #endif // EIGEN_STRUCTURED_TEST_HELPERS_H |