aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2009-07-26 13:01:37 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2009-07-26 13:01:37 +0200
commitf3fde74695eff236fe24b05ffb053d3890346420 (patch)
treee67b2323c788de9cb55686499c8d08c8ca885a1b /test
parent282e18da4915943b0dc2ed0140cfd037aaa02a70 (diff)
finalize trsm: works in all situations, and it is now used by solve() and solveInPlace()
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt1
-rw-r--r--test/product_trsm.cpp95
2 files changed, 96 insertions, 0 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index d1c4d49e2..462032453 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -101,6 +101,7 @@ ei_add_test(product_extra ${EI_OFLAG})
ei_add_test(product_selfadjoint ${EI_OFLAG})
ei_add_test(product_symm ${EI_OFLAG})
ei_add_test(product_syrk ${EI_OFLAG})
+ei_add_test(product_trsm ${EI_OFLAG})
ei_add_test(diagonalmatrices)
ei_add_test(adjoint)
ei_add_test(submatrices)
diff --git a/test/product_trsm.cpp b/test/product_trsm.cpp
new file mode 100644
index 000000000..80df5861e
--- /dev/null
+++ b/test/product_trsm.cpp
@@ -0,0 +1,95 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@gmail.com>
+//
+// Eigen is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 3 of the License, or (at your option) any later version.
+//
+// Alternatively, you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License and a copy of the GNU General Public License along with
+// Eigen. If not, see <http://www.gnu.org/licenses/>.
+
+#include "main.h"
+
+template<typename Lhs, typename Rhs>
+void solve_ref(const Lhs& lhs, Rhs& rhs)
+{
+ for (int j=0; j<rhs.cols(); ++j)
+ lhs.solveInPlace(rhs.col(j));
+}
+
+template<typename Scalar> void trsm(int size,int cols)
+{
+ typedef typename NumTraits<Scalar>::Real RealScalar;
+
+ Matrix<Scalar,Dynamic,Dynamic,ColMajor> cmLhs(size,size);
+ Matrix<Scalar,Dynamic,Dynamic,RowMajor> rmLhs(size,size);
+
+ Matrix<Scalar,Dynamic,Dynamic,ColMajor> cmRef(size,cols), cmRhs(size,cols);
+ Matrix<Scalar,Dynamic,Dynamic,RowMajor> rmRef(size,cols), rmRhs(size,cols);
+
+ cmLhs.setRandom(); cmLhs.diagonal().cwise() += 10;
+ rmLhs.setRandom(); rmLhs.diagonal().cwise() += 10;
+
+ cmRhs.setRandom(); cmRef = cmRhs;
+ cmLhs.conjugate().template triangularView<LowerTriangular>().solveInPlace(cmRhs);
+ solve_ref(cmLhs.conjugate().template triangularView<LowerTriangular>(),cmRef);
+ VERIFY_IS_APPROX(cmRhs, cmRef);
+
+ cmRhs.setRandom(); cmRef = cmRhs;
+ cmLhs.conjugate().template triangularView<UpperTriangular>().solveInPlace(cmRhs);
+ solve_ref(cmLhs.conjugate().template triangularView<UpperTriangular>(),cmRef);
+ VERIFY_IS_APPROX(cmRhs, cmRef);
+
+ rmRhs.setRandom(); rmRef = rmRhs;
+ cmLhs.template triangularView<LowerTriangular>().solveInPlace(rmRhs);
+ solve_ref(cmLhs.template triangularView<LowerTriangular>(),rmRef);
+ VERIFY_IS_APPROX(rmRhs, rmRef);
+
+ rmRhs.setRandom(); rmRef = rmRhs;
+ cmLhs.template triangularView<UpperTriangular>().solveInPlace(rmRhs);
+ solve_ref(cmLhs.template triangularView<UpperTriangular>(),rmRef);
+ VERIFY_IS_APPROX(rmRhs, rmRef);
+
+
+ cmRhs.setRandom(); cmRef = cmRhs;
+ rmLhs.template triangularView<UnitLowerTriangular>().solveInPlace(cmRhs);
+ solve_ref(rmLhs.template triangularView<UnitLowerTriangular>(),cmRef);
+ VERIFY_IS_APPROX(cmRhs, cmRef);
+
+ cmRhs.setRandom(); cmRef = cmRhs;
+ rmLhs.template triangularView<UnitUpperTriangular>().solveInPlace(cmRhs);
+ solve_ref(rmLhs.template triangularView<UnitUpperTriangular>(),cmRef);
+ VERIFY_IS_APPROX(cmRhs, cmRef);
+
+ rmRhs.setRandom(); rmRef = rmRhs;
+ rmLhs.template triangularView<LowerTriangular>().solveInPlace(rmRhs);
+ solve_ref(rmLhs.template triangularView<LowerTriangular>(),rmRef);
+ VERIFY_IS_APPROX(rmRhs, rmRef);
+
+ rmRhs.setRandom(); rmRef = rmRhs;
+ rmLhs.template triangularView<UpperTriangular>().solveInPlace(rmRhs);
+ solve_ref(rmLhs.template triangularView<UpperTriangular>(),rmRef);
+ VERIFY_IS_APPROX(rmRhs, rmRef);
+}
+void test_product_trsm()
+{
+ for(int i = 0; i < g_repeat ; i++)
+ {
+ trsm<float>(ei_random<int>(1,320),ei_random<int>(1,320));
+ trsm<std::complex<double> >(ei_random<int>(1,320),ei_random<int>(1,320));
+ }
+}