#include #include #include 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 TestBase { public: typedef T1 value_type; typedef T2 value_type2; typedef tvmet::Vector vector_type; typedef tvmet::Matrix matrix_type; typedef tvmet::Vector vector_type2; typedef tvmet::Matrix 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 { 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 { 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 { 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 MM; MM = 1,2,3,4,5,6,7,8,9; tvmet::Matrix 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(); }