mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
308 lines
8.0 KiB
C
308 lines
8.0 KiB
C
|
|
/*
|
||
|
|
* Tiny Vector Matrix Library
|
||
|
|
* Dense Vector Matrix Libary of Tiny size using Expression Templates
|
||
|
|
*
|
||
|
|
* Copyright (C) 2001 - 2003 Olaf Petzold <opetzold@users.sourceforge.net>
|
||
|
|
*
|
||
|
|
* This library 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 2.1 of the License, or (at your option) any later version.
|
||
|
|
*
|
||
|
|
* This library 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 for more details.
|
||
|
|
*
|
||
|
|
* You should have received a copy of the GNU Lesser General Public
|
||
|
|
* License along with this library; if not, write to the Free Software
|
||
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
*
|
||
|
|
* $Id: TestMatrixEval.h,v 1.1 2004/04/24 11:55:15 opetzold Exp $
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef TVMET_TEST_MATRIX_EVAL_H
|
||
|
|
#define TVMET_TEST_MATRIX_EVAL_H
|
||
|
|
|
||
|
|
#include <cppunit/extensions/HelperMacros.h>
|
||
|
|
|
||
|
|
#include <tvmet/Matrix.h>
|
||
|
|
|
||
|
|
#include <cassert>
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
class TestMatrixEval : public CppUnit::TestFixture
|
||
|
|
{
|
||
|
|
CPPUNIT_TEST_SUITE( TestMatrixEval );
|
||
|
|
CPPUNIT_TEST( Greater );
|
||
|
|
CPPUNIT_TEST( Less );
|
||
|
|
CPPUNIT_TEST( GreaterOrEqual );
|
||
|
|
CPPUNIT_TEST( LessOrEqual );
|
||
|
|
CPPUNIT_TEST( Equal );
|
||
|
|
CPPUNIT_TEST( NotEqual );
|
||
|
|
CPPUNIT_TEST( LogicalAnd );
|
||
|
|
CPPUNIT_TEST( LogicalOr );
|
||
|
|
|
||
|
|
// others
|
||
|
|
CPPUNIT_TEST( AllElements );
|
||
|
|
CPPUNIT_TEST( AnyElements );
|
||
|
|
CPPUNIT_TEST( Eval3 );
|
||
|
|
CPPUNIT_TEST( EvalPod3 );
|
||
|
|
|
||
|
|
CPPUNIT_TEST_SUITE_END();
|
||
|
|
|
||
|
|
private:
|
||
|
|
typedef tvmet::Matrix<T, 3, 3> matrix_type;
|
||
|
|
|
||
|
|
public:
|
||
|
|
TestMatrixEval()
|
||
|
|
: mOne(1), mZero(0) { }
|
||
|
|
|
||
|
|
public: // cppunit interface
|
||
|
|
/** cppunit hook for fixture set up. */
|
||
|
|
void setUp();
|
||
|
|
|
||
|
|
/** cppunit hook for fixture tear down. */
|
||
|
|
void tearDown();
|
||
|
|
|
||
|
|
protected:
|
||
|
|
void Greater();
|
||
|
|
void Less();
|
||
|
|
void GreaterOrEqual();
|
||
|
|
void LessOrEqual();
|
||
|
|
void Equal();
|
||
|
|
void NotEqual();
|
||
|
|
void LogicalAnd();
|
||
|
|
void LogicalOr();
|
||
|
|
|
||
|
|
void AllElements();
|
||
|
|
void AnyElements();
|
||
|
|
void Eval3();
|
||
|
|
void EvalPod3();
|
||
|
|
|
||
|
|
private:
|
||
|
|
matrix_type m1;
|
||
|
|
matrix_type mBig; /**< matrix bigger than m1 */
|
||
|
|
const matrix_type mOne;
|
||
|
|
const matrix_type mZero;
|
||
|
|
};
|
||
|
|
|
||
|
|
/*****************************************************************************
|
||
|
|
* Implementation Part I (cppunit part)
|
||
|
|
****************************************************************************/
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void TestMatrixEval<T>::setUp () {
|
||
|
|
m1 = 1,4,7,
|
||
|
|
2,5,8,
|
||
|
|
3,6,9;
|
||
|
|
mBig = 10,40,70,
|
||
|
|
20,50,80,
|
||
|
|
30,60,90;
|
||
|
|
}
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void TestMatrixEval<T>::tearDown() { }
|
||
|
|
|
||
|
|
/*****************************************************************************
|
||
|
|
* Implementation Part II
|
||
|
|
* these are elemental - therefore we use std::assert
|
||
|
|
****************************************************************************/
|
||
|
|
|
||
|
|
/*
|
||
|
|
* on SelfTest, we have the guarantee, that the container holds the
|
||
|
|
* expected values. Now check comparing operation using tvmet's
|
||
|
|
* eval function. This is the basic for all further test since it's
|
||
|
|
* the way we check the correctness. The other way would be element wise
|
||
|
|
* compare as in SelfTest, urgh...
|
||
|
|
*/
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::Greater() {
|
||
|
|
// all test are element wise !
|
||
|
|
assert( all_elements(mBig > m1) );
|
||
|
|
}
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::Less() {
|
||
|
|
// all test are element wise !
|
||
|
|
assert( all_elements(m1 < mBig) );
|
||
|
|
}
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::GreaterOrEqual() {
|
||
|
|
// all test are element wise !
|
||
|
|
assert( all_elements(mBig >= m1) );
|
||
|
|
assert( all_elements(m1 >= m1) );
|
||
|
|
assert( all_elements(mBig >= mBig) );
|
||
|
|
assert( all_elements(mOne >= T(1)) );
|
||
|
|
assert( all_elements(mZero>= T(0)) );
|
||
|
|
}
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::LessOrEqual() {
|
||
|
|
// all test are element wise !
|
||
|
|
assert( all_elements(m1 <= mBig) );
|
||
|
|
assert( all_elements(m1 <= m1) );
|
||
|
|
assert( all_elements(mBig <= mBig) );
|
||
|
|
assert( all_elements(mOne <= T(1)) );
|
||
|
|
assert( all_elements(mZero<= T(0)) );
|
||
|
|
}
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::Equal() {
|
||
|
|
// all test are element wise !
|
||
|
|
assert( all_elements(m1 == m1) );
|
||
|
|
assert( all_elements(mBig == mBig) );
|
||
|
|
assert( all_elements(mOne == T(1)) );
|
||
|
|
assert( all_elements(mZero == T(0)) );
|
||
|
|
}
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::NotEqual() {
|
||
|
|
// all test are element wise !
|
||
|
|
assert( all_elements(m1 != mBig) );
|
||
|
|
}
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::LogicalAnd() {
|
||
|
|
// TODO: implement
|
||
|
|
}
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::LogicalOr() {
|
||
|
|
// TODO: implement
|
||
|
|
}
|
||
|
|
|
||
|
|
/*****************************************************************************
|
||
|
|
* Implementation Part III
|
||
|
|
* test on generell and eval functions
|
||
|
|
****************************************************************************/
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::AllElements() {
|
||
|
|
// true cases
|
||
|
|
CPPUNIT_ASSERT( all_elements(mBig > T(0)) );
|
||
|
|
CPPUNIT_ASSERT( all_elements(mBig >= T(1)) );
|
||
|
|
|
||
|
|
CPPUNIT_ASSERT( all_elements(mBig < T(1000)) );
|
||
|
|
CPPUNIT_ASSERT( all_elements(mBig <= T(1000)) );
|
||
|
|
|
||
|
|
CPPUNIT_ASSERT( all_elements(T(0) < mBig) ); // possible, I newer would write it
|
||
|
|
CPPUNIT_ASSERT( all_elements(T(1000) > mBig) ); // possible, I newer would write it
|
||
|
|
|
||
|
|
CPPUNIT_ASSERT( all_elements(mOne == T(1)) );
|
||
|
|
CPPUNIT_ASSERT( all_elements(mZero == T(0)) );
|
||
|
|
|
||
|
|
CPPUNIT_ASSERT( all_elements(mBig != T(1000)) );
|
||
|
|
|
||
|
|
// false cases
|
||
|
|
CPPUNIT_ASSERT( !all_elements(mBig < T(0)) );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::AnyElements() {
|
||
|
|
// true cases
|
||
|
|
CPPUNIT_ASSERT( any_elements(mBig > T(0)) );
|
||
|
|
CPPUNIT_ASSERT( any_elements(mBig >= T(1)) );
|
||
|
|
|
||
|
|
CPPUNIT_ASSERT( any_elements(mBig < T(1000)) );
|
||
|
|
CPPUNIT_ASSERT( any_elements(mBig <= T(1000)) );
|
||
|
|
|
||
|
|
CPPUNIT_ASSERT( any_elements(T(2) < m1) ); // possible, I newer would write it
|
||
|
|
CPPUNIT_ASSERT( any_elements(T(2) > m1) ); // possible, I newer would write it
|
||
|
|
|
||
|
|
CPPUNIT_ASSERT( any_elements(mOne == T(1)) );
|
||
|
|
CPPUNIT_ASSERT( any_elements(mZero == T(0)) );
|
||
|
|
|
||
|
|
CPPUNIT_ASSERT( any_elements(mBig != T(1000)) );
|
||
|
|
|
||
|
|
// false cases
|
||
|
|
CPPUNIT_ASSERT( !any_elements(mBig < T(2)) );
|
||
|
|
CPPUNIT_ASSERT( !any_elements(mOne == T(0)) );
|
||
|
|
CPPUNIT_ASSERT( !any_elements(mZero == T(1)) );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::Eval3() {
|
||
|
|
matrix_type v;
|
||
|
|
T a(1); // scalar
|
||
|
|
|
||
|
|
// XprMatrix<E1, Rows, Cols> ? Matrix<T2, Rows, Cols> : Matrix<T3, Rows, Cols>
|
||
|
|
v = eval( m1 < mBig, m1, mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == m1) );
|
||
|
|
|
||
|
|
v = eval( m1 > mBig, m1, mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == mBig) );
|
||
|
|
|
||
|
|
// XprMatrix<E1, Rows, Cols> ? Matrix<T2, Rows, Cols> : XprMatrix<E3, Rows, Cols>
|
||
|
|
v = eval( m1 < mBig, m1, a*mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == m1) );
|
||
|
|
|
||
|
|
v = eval( m1 > mBig, m1, a*mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == mBig) );
|
||
|
|
|
||
|
|
// XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : Matrix<T3, Rows, Cols>
|
||
|
|
v = eval( m1 < mBig, a*m1, mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == m1) );
|
||
|
|
|
||
|
|
v = eval( m1 > mBig, a*m1, mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == mBig) );
|
||
|
|
|
||
|
|
// XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : XprMatrix<E3, Rows, Cols>
|
||
|
|
v = eval( m1 < mBig, a*m1, a*mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == m1) );
|
||
|
|
|
||
|
|
v = eval( m1 > mBig, a*m1, a*mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == mBig) );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
void
|
||
|
|
TestMatrixEval<T>::EvalPod3() {
|
||
|
|
matrix_type v;
|
||
|
|
T a(1); // scalar
|
||
|
|
|
||
|
|
// XprMatrix<E, Rows, Cols> ? POD1 : POD2
|
||
|
|
v = eval( m1 < mBig, T(0), T(1));
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == T(0)) );
|
||
|
|
|
||
|
|
v = eval( m1 > mBig, T(0), T(1));
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == T(1)) );
|
||
|
|
|
||
|
|
// XprMatrix<E1, Rows, Cols> ? POD : XprMatrix<E3, Rows, Cols>
|
||
|
|
v = eval( m1 < mBig, 1, a*mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == mOne) );
|
||
|
|
|
||
|
|
v = eval( m1 > mBig, 1, a*mBig);
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == mBig) );
|
||
|
|
|
||
|
|
// XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : POD
|
||
|
|
v = eval( m1 < mBig, a*m1, T(1));
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == m1) );
|
||
|
|
|
||
|
|
v = eval( m1 > mBig, a*m1, T(1));
|
||
|
|
CPPUNIT_ASSERT( all_elements(v == mOne) );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
#endif // TVMET_TEST_MATRIX_EVAL_H
|
||
|
|
|
||
|
|
// Local Variables:
|
||
|
|
// mode:C++
|
||
|
|
// End:
|