blob: 3a5691c2a77ff1fc2dc32ff727dc815e3879abc0 [file]
/*
* 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: TestXprMatrixOperators.h,v 1.1 2004/04/24 11:55:15 opetzold Exp $
*/
#ifndef TVMET_TEST_XPR_MATRIXOPS_H
#define TVMET_TEST_XPR_MATRIXOPS_H
#include <cppunit/extensions/HelperMacros.h>
#include <tvmet/Vector.h>
#include <tvmet/Matrix.h>
#include <tvmet/util/General.h>
template <class T>
class TestXprMatrixOperators : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( TestXprMatrixOperators );
CPPUNIT_TEST( scalarOps1 );
CPPUNIT_TEST( scalarOps2 );
CPPUNIT_TEST( globalMatrixOps );
CPPUNIT_TEST( negate );
CPPUNIT_TEST( prodOps );
CPPUNIT_TEST_SUITE_END();
private:
typedef tvmet::Vector<T, 3> vector_type;
typedef tvmet::Matrix<T, 3, 3> matrix_type;
public:
TestXprMatrixOperators()
: mZero(0), mOne(1), scalar(10), scalar2(2) { }
public: // cppunit interface
/** cppunit hook for fixture set up. */
void setUp();
/** cppunit hook for fixture tear down. */
void tearDown();
protected:
void scalarOps1();
void scalarOps2();
void globalMatrixOps();
void negate();
void prodOps();
private:
const matrix_type mZero;
const matrix_type mOne;
matrix_type m1;
matrix_type mBig; /**< matrix 10x bigger than m1 */
private:
vector_type m1_r0, m1_r1, m1_r2; // row vectors
vector_type m1_c0, m1_c1, m1_c2; // col vectors
private:
const T scalar;
const T scalar2;
};
/*****************************************************************************
* Implementation Part I (cppunit part)
****************************************************************************/
template <class T>
void TestXprMatrixOperators<T>::setUp() {
m1 = 1,4,7,
2,5,8,
3,6,9;
m1_r0 = 1,4,7;
m1_r1 = 2,5,8;
m1_r2 = 3,6,9;
m1_c0 = 1,2,3;
m1_c1 = 4,5,6;
m1_c2 = 7,8,9;
mBig = 10,40,70,
20,50,80,
30,60,90;
}
template <class T>
void TestXprMatrixOperators<T>::tearDown() { }
/*****************************************************************************
* Implementation Part II
****************************************************************************/
/*
* global math operators with scalars
* Note: checked against member operators since they are allready checked
*/
template <class T>
void
TestXprMatrixOperators<T>::scalarOps1() {
matrix_type r1(m1), r2(m1);
matrix_type t1(0), t2(0), t3(0), t4(0);
r1 += scalar;
r2 -= scalar;
t1 = T(1)*m1 + scalar;
t2 = T(1)*m1 - scalar;
t3 = T(1)*m1 * scalar;
t4 = T(1)*mBig / scalar;
CPPUNIT_ASSERT( all_elements(t1 == r1) );
CPPUNIT_ASSERT( all_elements(t2 == r2) );
CPPUNIT_ASSERT( all_elements(t3 == mBig) );
CPPUNIT_ASSERT( all_elements(t4 == m1) );
}
/*
* global math operators with scalars, part II
* Note: checked against member operators since they are allready checked
*/
template <class T>
void
TestXprMatrixOperators<T>::scalarOps2() {
matrix_type r1(m1), r2(m1);
matrix_type t1(0), t2(0);
r1 += scalar;
r2 *= scalar;
t1 = scalar + T(1)*m1;
t2 = scalar * (T(1)*m1);
CPPUNIT_ASSERT( all_elements(t1 == r1) );
CPPUNIT_ASSERT( all_elements(t2 == r2) );
}
/*
* global math operators with matrizes
*/
template <class T>
void
TestXprMatrixOperators<T>::globalMatrixOps() {
matrix_type t1(0), t2(0), t3(0), t4(0);
t1 = T(1)*m1 + T(1)*m1;
t2 = T(1)*m1 - T(1)*m1;
{
using namespace tvmet::element_wise;
//t3 = m1 * mOne; // overloaded by global op*()
t4 = T(1)*m1 / (T(1)*mOne);
}
CPPUNIT_ASSERT( all_elements(t1 == 2*m1) );
CPPUNIT_ASSERT( all_elements(t2 == T(0)) );
//CPPUNIT_ASSERT( all_elements(t3 == m1) );
CPPUNIT_ASSERT( all_elements(t4 == m1) );
}
/*
* negate operators with matrizes
*/
template <class T>
void
TestXprMatrixOperators<T>::negate() {
matrix_type m1;
m1 = -(T(1)*mOne);
CPPUNIT_ASSERT( all_elements(m1 == T(-1)) );
}
/*
* product functions with matrizes
* Note: Take care on aliasing!
*/
template <class T>
void
TestXprMatrixOperators<T>::prodOps() {
matrix_type t1, t2, t3;
matrix_type r1, r2, r3;
matrix_type m2(m1);;
tvmet::util::Gemm(m1, m1, r1);
tvmet::util::Gemm(m1, mBig, r2);
tvmet::util::Gemm(mBig, m1, r3);
CPPUNIT_ASSERT( all_elements(r2 == r3) );
t1 = (T(1)*m1) * (T(1)*m2);
CPPUNIT_ASSERT( all_elements(t1 == r1) );
t2 = (T(1)*m1) * (T(1)*mBig);
CPPUNIT_ASSERT( all_elements(t2 == r2) );
t3 = (T(1))*mBig * (T(1)*m1);
CPPUNIT_ASSERT( all_elements(t3 == r3) );
}
#endif // TVMET_TEST_XPR_MATRIXOPS_H
// Local Variables:
// mode:C++
// End: