Test: Match DPLR fast-path reciprocal evaluation libeigen/eigen!3034 Closes #3154 Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
diff --git a/unsupported/test/structured_dplr.cpp b/unsupported/test/structured_dplr.cpp index 2c915f1..18daae2 100644 --- a/unsupported/test/structured_dplr.cpp +++ b/unsupported/test/structured_dplr.cpp
@@ -552,14 +552,16 @@ random_dplr<Scalar>(n, k, d, U, V); DiagonalPlusLowRank<Scalar> A(d, U, V); + // Match the stored reciprocal: scalar and packet complex division can round differently. + const Vec dinv = d.cwiseInverse(); Mat capRef = Mat::Identity(k, k); - capRef.noalias() += V.adjoint() * d.cwiseInverse().asDiagonal() * U; + capRef.noalias() += V.adjoint() * dinv.asDiagonal() * U; VERIFY_IS_CWISE_EQUAL(A.capacitance(), capRef); Vec b = Vec::Random(n); PartialPivLU<Mat> capLU(capRef); - Vec xRef = d.cwiseInverse().asDiagonal() * b; - xRef.noalias() -= d.cwiseInverse().asDiagonal() * (U * capLU.solve(V.adjoint() * xRef)); + Vec xRef = dinv.asDiagonal() * b; + xRef.noalias() -= dinv.asDiagonal() * (U * capLU.solve(V.adjoint() * xRef)); VERIFY_IS_CWISE_EQUAL(A.solve(b), xRef); }