blob: 0f473e3cb3a20c8fb18fc278780157186cd2813a [file]
#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();
}