Files
eigen/tvmet-1.7.1/tests/t.cc
Benoit Jacob 3036eeca0a Starting Eigen 2 development. The current plan is to use the last
release of tvmet (inactive for 2 years and developer unreachable) as the
basis for eigen2, because it provides seemingly good expression template
mechanisms, we want that, and it would take years to reinvent that
wheel. We'll see. So this commit imports the last tvmet release.
2007-05-30 06:24:51 +00:00

415 lines
6.6 KiB
C++

#include <iostream>
#include <tvmet/Vector.h>
#include <tvmet/Matrix.h>
using std::cout;
using std::endl;
struct separator {
std::ostream& print_on(std::ostream& os) const {
for(std::size_t i = 0; i < 63; ++i) os << "-";
return os;
}
};
std::ostream& operator<<(std::ostream& os, const separator& s) {
return s.print_on(os);
}
template<class T1, class T2 = T1>
class TestBase
{
public:
typedef T1 value_type;
typedef T2 value_type2;
typedef tvmet::Vector<value_type, 3> vector_type;
typedef tvmet::Matrix<value_type, 3, 3> matrix_type;
typedef tvmet::Vector<value_type2, 3> vector_type2;
typedef tvmet::Matrix<value_type2, 3, 3> matrix_type2;
private:
vector_type v0;
matrix_type M0;
protected:
vector_type v1, v2, v3;
matrix_type M1, M2, M3;
protected:
TestBase()
{
v0 = 1,2,3;
M0 = 1,4,7,2,5,8,3,6,9;
reset();
}
~TestBase() { }
void reset()
{
v1 = v0; v2 = v0; v3 = v0;
M1 = M0; M2 = M0; M3 = M0;
}
public:
void show_v1(const std::string& op) {
cout << separator() << endl
<< op << " = "
<< v1 << endl
<< separator() << endl;
}
void show_v2(const std::string& op) {
cout << separator() << endl
<< op << " = "
<< v2 << endl
<< separator() << endl;
}
void show_v3(const std::string& op) {
cout << separator() << endl
<< op << " = "
<< v3 << endl
<< separator() << endl;
}
void show_v() {
cout << separator() << endl;
cout << "v1 = " << v1 << endl
<< "v2 = " << v2 << endl
<< "v3 = " << v3 << endl;
cout << separator() << endl;
}
void show_M1(const std::string& op) {
cout << separator() << endl
<< op << " = "
<< M1 << endl
<< separator() << endl;
}
void show_M2(const std::string& op) {
cout << separator() << endl
<< op << " = "
<< M2 << endl
<< separator() << endl;
}
void show_M3(const std::string& op) {
cout << separator() << endl
<< op << " = "
<< M3 << endl
<< separator() << endl;
}
void show_M() {
cout << separator() << endl;
cout << "M1 = " << M1 << endl
<< "M2 = " << M2 << endl
<< "M3 = " << M3 << endl;
cout << separator() << endl;
}
};
/*
* Vector
*/
class TestV : public TestBase<double>
{
public:
TestV() { }
public:
void case1() {
reset();
v1 = v2 + v2 + v3;
show_v1("v2 + v2 + v3");
}
void case2() {
reset();
v1 = sin( (v2 + v2) * v2 );
show_v1("sin( (v2 + v2) * v2 )");
}
void case3() {
reset();
v1 = (v2 + v2) * (v2 + v2);
show_v1("(v2 + v2) * (v2 + v2)");
}
void case4() {
reset();
v1 = (v2 + v2) * (v2 + v2) / 4;
show_v1("(v2 + v2) * (v2 + v2) / 4");
}
void case5() {
reset();
}
};
/*
* Matrix
*/
class TestM : public TestBase<double>
{
public:
TestM() { }
public:
void case1() {
reset();
M1 = M2 + M3;
show_M1("M2 + M3");
}
void case2() {
reset();
M1 = M2 + M2 + M2 + M2;
show_M1("M2 + M2 + M2 + M2");
}
void case3() {
reset();
/*
XXX: missing feature element_wise XprMatrix * Xprmatrix
M1 = ( M2 + M2 ) * ( M2 + M2 );
M1 = tvmet::element_wise::product( M2 + M2, M2 + M2 );
show_M1("empty");
*/
}
void case4() {
reset();
M1 = sin(M2 + M2); // UFUNC(XprMatrix)
show_M1("sin(M2 + M2)");
}
void case5() {
reset();
M1 = trans(M2); // = XprMatrix
show_M1("trans(M2)");
}
void case6() {
reset();
M1 = trans(M2) + M2; // XprMatrix + Matrix
show_M1("trans(M2) + M2");
}
void case7() {
reset();
M1 = M2 + trans(M2); // Matrix + XprMatrix
show_M1("M2 + trans(M2)");
}
void case8() {
reset();
/*
* WRONG results, should be:
* 120 264 408
* 144 324 504
* 168 384 600
* there seems to be a side effect!!
*/
M1 = prod((M2 + M2), (M2 + M2)); // XprMatrix * XprMatrix
show_M1("prod((M2 + M2), (M2 + M2))");
}
void case9() {
reset();
M1 = (M2 + M2) * (M2 + M2); // XprMatrix * XprMatrix
show_M1("(M2 + M2) * (M2 + M2)");
}
void case10() {
reset();
}
};
/*
* Matrix-Vector
*/
class TestMV : public TestBase<double>
{
public:
TestMV() { }
public:
void case1() {
reset();
v1 = M1 * v2;
show_v1("M1 * v2");
}
void case2() {
reset();
v1 = (M1 * v2) + v2;
show_v1("(M1 * v2) + v2");
}
void case3() {
reset();
v1 = (M1 * v2) + (M1 * v2);
show_v1("(M1 * v2) + (M1 * v2)");
}
void case4() {
reset();
v1 = (M1 * v2) * (M1 * v2); // element wise: XprVector * XprVector
show_v1("element_wise: (M1 * v2) * (M1 * v2)");
}
void case5() {
reset();
using namespace tvmet::element_wise;
v1 = (M1 * v2) / (M1 * v2); // element_wise: XprVector / XprVector
show_v1("element_wise: (M1 * v2) / (M1 * v2)");
}
void case6() {
reset();
v1 = prod(M1, v2);
show_v1("trans_prod(M1, v2)");
}
void case7() {
reset();
v1 = prod(M1, v2) + v2;// XprVector + Vector
show_v1("prod(M1, v2) + v2");
}
void case8() {
reset();
using namespace tvmet::element_wise;
v1 += prod(M1, v2) / v2;// element_wise: XprVector + Vector
show_v1("v1 += prod(M1, v2) / v2");
}
void case9() {
reset();
v1 = prod(M1, v2) + prod(M1, v2);// element wise: XprVector * XprVector
show_v1("prod(M1, v2) + prod(M1, v2)");
}
void case10() {
reset();
using namespace tvmet::element_wise;
v1 = prod(M1, v2) / prod(M1, v2);// element_wise: XprVector / XprVector
all_elements( v1 == 1 );
show_v1("prod(M1, v2) / prod(M1, v2)");
}
void case11() {
reset();
v1 = M1 * (v1+v1);
show_v1("M1 * (v1+v1)");
}
void case12() {
reset();
v1 = M1 * prod(M1, v2);
show_v1("M1 * prod(M1, v2)");
}
};
/*
* Main
*/
int main()
{
tvmet::Matrix<double, 3,3> MM;
MM = 1,2,3,4,5,6,7,8,9;
tvmet::Matrix<double, 3,3> MM2( MM );
TestV v;
TestM M;
TestMV Mv;
v.show_v();
M.show_M();
cout << "*****************************************************************" << endl;
#if 1
v.case1();
v.case2();
v.case3();
v.case4();
v.case5();
cout << "*****************************************************************" << endl;
#endif
#if 1
M.case1();
M.case2();
M.case3();
M.case4();
M.case5();
M.case6();
M.case7();
M.case8();
M.case9();
M.case10();
cout << "*****************************************************************" << endl;
#endif
#if 1
Mv.case1();
Mv.case2();
Mv.case3();
Mv.case4();
Mv.case5();
#endif
Mv.case6();
Mv.case7();
Mv.case8();
Mv.case9();
Mv.case10();
Mv.case11();
Mv.case12();
}