blob: ce472fd385e715737202b431eca4b4322eddb378 [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: TestXpr.h,v 1.1 2004/04/24 11:55:15 opetzold Exp $
*/
#ifndef TVMET_TEST_XPR_H
#define TVMET_TEST_XPR_H
#include <cppunit/extensions/HelperMacros.h>
#include <tvmet/Vector.h>
#include <tvmet/Matrix.h>
#include <tvmet/util/General.h>
template <class T>
class TestXpr : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( TestXpr );
CPPUNIT_TEST( fn_MMProd );
CPPUNIT_TEST( fn_MMMProd );
CPPUNIT_TEST( fn_MVProd );
CPPUNIT_TEST( op_MMProd );
CPPUNIT_TEST( op_MMMProd );
CPPUNIT_TEST( op_MVProd );
CPPUNIT_TEST_SUITE_END();
private:
typedef tvmet::Vector<T, 3> vector_type;
typedef tvmet::Matrix<T, 3, 3> matrix_type;
public:
TestXpr()
: vZero(0), vOne(1), mZero(0), mOne(1), scalar(10) { }
public: // cppunit interface
/** cppunit hook for fixture set up. */
void setUp();
/** cppunit hook for fixture tear down. */
void tearDown();
protected:
void fn_MMProd();
void fn_MMMProd();
void fn_MVProd();
void op_MMProd();
void op_MMMProd();
void op_MVProd();
private:
const vector_type vZero;
const vector_type vOne;
vector_type v1, v1b;
vector_type vBig; /**< vector 10x bigger than v1 */
private:
const matrix_type mZero;
const matrix_type mOne;
matrix_type m1, m1b;
matrix_type mBig; /**< matrix 10x bigger than m1 */
private:
const T scalar;
};
/*****************************************************************************
* Implementation part I (cppunit part)
****************************************************************************/
template <class T>
void TestXpr<T>::setUp() {
v1 = 1,2,3;
v1b = v1;
vBig = 10,20,30;
m1 = 1,4,7,
2,5,8,
3,6,9;
m1b = m1;
mBig = 10,40,70,
20,50,80,
30,60,90;
}
template <class T>
void TestXpr<T>::tearDown() { }
/*****************************************************************************
* Implementation part II
****************************************************************************/
/*
* XprMatrix - XprMatrix
*/
template <class T>
void
TestXpr<T>::fn_MMProd() {
matrix_type mr1(0), mr2(0), mr(0);
matrix_type m;
tvmet::util::Gemm(m1, mOne, mr1);
tvmet::util::Gemm(m1, mOne, mr2);
tvmet::util::Gemm(mr1, mr2, mr);
// XprMatrix * XprMatrix
m = prod(prod(m1,mOne), prod(m1,mOne));
CPPUNIT_ASSERT( all_elements(mr == m) );
}
/*
* Matrix - XprMatrix - XprMatrix
*/
template <class T>
void
TestXpr<T>::fn_MMMProd() {
matrix_type m;
matrix_type rhs(0), r(0);
tvmet::util::Gemm(m1, m1, rhs);
tvmet::util::Gemm(m1, rhs, r);
// Matrix * XprMatrix * XprMatrix
m = prod(m1, prod(m1, m1));
CPPUNIT_ASSERT( all_elements(r == m) );
}
/*
* XprMatrix - XprVector
*/
template <class T>
void
TestXpr<T>::fn_MVProd() {
matrix_type mr1(0);
vector_type vr(0), v;
tvmet::util::Gemm(m1, mOne, mr1);
tvmet::util::Gemv(mr1, v1, vr);
// XprMatrix * XprVector
v = prod(prod(m1,mOne), mul(v1,vOne));
CPPUNIT_ASSERT( all_elements(vr == v) );
}
/*
* XprMatrix - XprMatrix
*/
template <class T>
void
TestXpr<T>::op_MMProd() {
matrix_type mr1(0), mr2(0), mr(0), m;
tvmet::util::Gemm(m1, mOne, mr1);
tvmet::util::Gemm(m1, mOne, mr2);
tvmet::util::Gemm(mr1, mr2, mr);
// XprMatrix * XprMatrix
m = (m1*mOne)*(m1*mOne);
CPPUNIT_ASSERT( all_elements(mr == m) );
}
/*
* Matrix - XprMatrix - XprMatrix
*/
template <class T>
void
TestXpr<T>::op_MMMProd() {
matrix_type m;
matrix_type rhs(0), r(0);
tvmet::util::Gemm(m1, m1, rhs);
tvmet::util::Gemm(m1, rhs, r);
// Matrix * XprMatrix * XprMatrix
m = m1 * m1 * m1;
CPPUNIT_ASSERT( all_elements(r == m) );
}
/*
* XprMatrix - XprVector
*/
template <class T>
void
TestXpr<T>::op_MVProd() {
matrix_type mr1(0);
vector_type vr(0), v;
tvmet::util::Gemm(m1, mOne, mr1);
tvmet::util::Gemv(mr1, v1, vr);
// XprMatrix * XprVector
v = (m1*mOne)*(v1*vOne);
CPPUNIT_ASSERT( all_elements(vr == v) );
}
#endif // TVMET_TEST_XPR_H
// Local Variables:
// mode:C++
// End: