aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/product_mmtr.cpp
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2017-01-17 18:03:35 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2017-01-17 18:03:35 +0100
commit655ba783f8b2c9a8c3f4edb45e6db468aca22188 (patch)
treec71924c27b1b4746acd108e254e721c51f376085 /test/product_mmtr.cpp
parentc4fc2611ba34652f98b5e0ac9f817879bef8eed1 (diff)
Defer set-to-zero in triangular = product so that no aliasing issue occur in the common:
A.triangularView() = B*A.sefladjointView()*B.adjoint() case that used to work in 3.2.
Diffstat (limited to 'test/product_mmtr.cpp')
-rw-r--r--test/product_mmtr.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/test/product_mmtr.cpp b/test/product_mmtr.cpp
index b66529acd..f6e4bb1ae 100644
--- a/test/product_mmtr.cpp
+++ b/test/product_mmtr.cpp
@@ -62,6 +62,19 @@ template<typename Scalar> void mmtr(int size)
CHECK_MMTR(matc, Upper, -= (s*sqc).template triangularView<Upper>()*sqc);
CHECK_MMTR(matc, Lower, = (s*sqr).template triangularView<Lower>()*sqc);
CHECK_MMTR(matc, Upper, += (s*sqc).template triangularView<Lower>()*sqc);
+
+ // check aliasing
+ ref2 = ref1 = matc;
+ ref1 = sqc.adjoint() * matc * sqc;
+ ref2.template triangularView<Upper>() = ref1.template triangularView<Upper>();
+ matc.template triangularView<Upper>() = sqc.adjoint() * matc * sqc;
+ VERIFY_IS_APPROX(matc, ref2);
+
+ ref2 = ref1 = matc;
+ ref1 = sqc * matc * sqc.adjoint();
+ ref2.template triangularView<Lower>() = ref1.template triangularView<Lower>();
+ matc.template triangularView<Lower>() = sqc * matc * sqc.adjoint();
+ VERIFY_IS_APPROX(matc, ref2);
}
void test_product_mmtr()