diff options
author | 2008-09-03 22:35:45 +0000 | |
---|---|---|
committer | 2008-09-03 22:35:45 +0000 | |
commit | 52406aecadd5677f5cb5507a546ed2f68069e61f (patch) | |
tree | 4a1abe9f3006838420143a411bf667d76dc62535 /test | |
parent | c29c7b0ea95b86f73d77224efb26f96abdc189ac (diff) |
* Extend a bit ParametrizedLine and move it to a separate file,
add unit-tests for it.
* remove "using namespace std" in test/main.h such that the compilation
bug found today in SVD won't happen again.
Diffstat (limited to 'test')
-rw-r--r-- | test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/geometry.cpp | 2 | ||||
-rw-r--r-- | test/hyperplane.cpp | 5 | ||||
-rw-r--r-- | test/main.h | 19 | ||||
-rw-r--r-- | test/parametrizedline.cpp | 69 |
5 files changed, 84 insertions, 12 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 505cfd70d..4a58aa8f7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -120,6 +120,7 @@ EI_ADD_TEST(eigensolver) EI_ADD_TEST(svd) EI_ADD_TEST(geometry) EI_ADD_TEST(hyperplane) +EI_ADD_TEST(parametrizedline) EI_ADD_TEST(regression) EI_ADD_TEST(sparse) diff --git a/test/geometry.cpp b/test/geometry.cpp index 10e6bbe92..cb9726346 100644 --- a/test/geometry.cpp +++ b/test/geometry.cpp @@ -74,7 +74,7 @@ template<typename Scalar> void geometry(void) VERIFY_IS_APPROX(v0, AngleAxis(a, v0.normalized()) * v0); VERIFY_IS_APPROX(-v0, AngleAxis(M_PI, v0.unitOrthogonal()) * v0); - VERIFY_IS_APPROX(cos(a)*v0.norm2(), v0.dot(AngleAxis(a, v0.unitOrthogonal()) * v0)); + VERIFY_IS_APPROX(ei_cos(a)*v0.norm2(), v0.dot(AngleAxis(a, v0.unitOrthogonal()) * v0)); m = AngleAxis(a, v0.normalized()).toRotationMatrix().adjoint(); VERIFY_IS_APPROX(Matrix3::Identity(), m * AngleAxis(a, v0.normalized())); VERIFY_IS_APPROX(Matrix3::Identity(), AngleAxis(a, v0.normalized()) * m); diff --git a/test/hyperplane.cpp b/test/hyperplane.cpp index 3ebdf4e6d..0418c71b2 100644 --- a/test/hyperplane.cpp +++ b/test/hyperplane.cpp @@ -2,6 +2,7 @@ // for linear algebra. Eigen itself is part of the KDE project. // // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr> +// Copyright (C) 2008 Benoit Jacob <jacob@math.jussieu.fr> // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -54,7 +55,6 @@ template<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane) Scalar s1 = ei_random<Scalar>(); VERIFY_IS_APPROX( n1.dot(n1), Scalar(1) ); - VERIFY_IS_APPROX( n1.dot(n1), Scalar(1) ); VERIFY_IS_MUCH_SMALLER_THAN( pl0.absDistance(p0), Scalar(1) ); VERIFY_IS_APPROX( pl1.signedDistance(p1 + n1 * s0), s0 ); @@ -96,6 +96,9 @@ template<typename Scalar> void lines() Vector u = Vector::Random(); Vector v = Vector::Random(); Scalar a = ei_random<Scalar>(); + while (ei_abs(a-1) < 1e-4) a = ei_random<Scalar>(); + while (u.norm() < 1e-4) u = Vector::Random(); + while (v.norm() < 1e-4) v = Vector::Random(); HLine line_u = HLine::Through(center + u, center + a*u); HLine line_v = HLine::Through(center + v, center + a*v); diff --git a/test/main.h b/test/main.h index 4e9621543..5079fdb5b 100644 --- a/test/main.h +++ b/test/main.h @@ -229,7 +229,6 @@ inline bool test_ei_isMuchSmallerThan(const MatrixBase<Derived>& m, void EI_PP_CAT(test_,EIGEN_TEST_FUNC)(); using namespace Eigen; -using namespace std; int main(int argc, char *argv[]) { @@ -245,14 +244,14 @@ int main(int argc, char *argv[]) { if(has_set_repeat) { - cout << "Argument " << argv[i] << " conflicting with a former argument" << endl; + std::cout << "Argument " << argv[i] << " conflicting with a former argument" << std::endl; return 1; } repeat = atoi(argv[i]+1); has_set_repeat = true; if(repeat <= 0) { - cout << "Invalid \'repeat\' value " << argv[i]+1 << endl; + std::cout << "Invalid \'repeat\' value " << argv[i]+1 << std::endl; return 1; } } @@ -260,7 +259,7 @@ int main(int argc, char *argv[]) { if(has_set_seed) { - cout << "Argument " << argv[i] << " conflicting with a former argument" << endl; + std::cout << "Argument " << argv[i] << " conflicting with a former argument" << std::endl; return 1; } seed = strtoul(argv[i]+1, 0, 10); @@ -268,7 +267,7 @@ int main(int argc, char *argv[]) bool ok = seed!=0; if(!ok) { - cout << "Invalid \'seed\' value " << argv[i]+1 << endl; + std::cout << "Invalid \'seed\' value " << argv[i]+1 << std::endl; return 1; } } @@ -280,18 +279,18 @@ int main(int argc, char *argv[]) if(need_help) { - cout << "This test application takes the following optional arguments:" << endl; - cout << " rN Repeat each test N times (default: " << DEFAULT_REPEAT << ")" << endl; - cout << " sN Use N as seed for random numbers (default: based on current time)" << endl; + std::cout << "This test application takes the following optional arguments:" << std::endl; + std::cout << " rN Repeat each test N times (default: " << DEFAULT_REPEAT << ")" << std::endl; + std::cout << " sN Use N as seed for random numbers (default: based on current time)" << std::endl; return 1; } if(!has_set_seed) seed = (unsigned int) time(NULL); if(!has_set_repeat) repeat = DEFAULT_REPEAT; - cout << "Initializing random number generator with seed " << seed << endl; + std::cout << "Initializing random number generator with seed " << seed << std::endl; srand(seed); - cout << "Repeating each test " << repeat << " times" << endl; + std::cout << "Repeating each test " << repeat << " times" << std::endl; Eigen::g_repeat = repeat; Eigen::g_test_stack.push_back(EI_PP_MAKE_STRING(EIGEN_TEST_FUNC)); diff --git a/test/parametrizedline.cpp b/test/parametrizedline.cpp new file mode 100644 index 000000000..82962807d --- /dev/null +++ b/test/parametrizedline.cpp @@ -0,0 +1,69 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. Eigen itself is part of the KDE project. +// +// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr> +// Copyright (C) 2008 Benoit Jacob <jacob@math.jussieu.fr> +// +// 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" +#include <Eigen/Geometry> +#include <Eigen/LU> +#include <Eigen/QR> + +template<typename LineType> void parametrizedline(const LineType& _line) +{ + /* this test covers the following files: + ParametrizedLine.h + */ + + const int dim = _line.dim(); + typedef typename LineType::Scalar Scalar; + typedef typename NumTraits<Scalar>::Real RealScalar; + typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, 1> VectorType; + typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, + LineType::AmbientDimAtCompileTime> MatrixType; + + VectorType p0 = VectorType::Random(dim); + VectorType p1 = VectorType::Random(dim); + + VectorType d0 = VectorType::Random(dim).normalized(); + + LineType l0(p0, d0); + + Scalar s0 = ei_random<Scalar>(); + Scalar s1 = ei_abs(ei_random<Scalar>()); + + VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0), RealScalar(1) ); + VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0+s0*d0), RealScalar(1) ); + VERIFY_IS_APPROX( (l0.projection(p1)-p1).norm(), l0.distance(p1) ); + VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(l0.projection(p1)), RealScalar(1) ); + VERIFY_IS_APPROX( l0.distance((p0+s0*d0) + d0.unitOrthogonal() * s1), s1 ); +} + +void test_parametrizedline() +{ + for(int i = 0; i < g_repeat; i++) { + CALL_SUBTEST( parametrizedline(ParametrizedLine<float,2>()) ); + CALL_SUBTEST( parametrizedline(ParametrizedLine<float,3>()) ); + CALL_SUBTEST( parametrizedline(ParametrizedLine<double,4>()) ); + CALL_SUBTEST( parametrizedline(ParametrizedLine<std::complex<double>,5>()) ); + } +} |