diff --git a/test/gtest_state_composite.cpp b/test/gtest_state_composite.cpp index abda2f373f2e0d951b8206518711a5efe6e3505e..16717f2e087ccfef93833ef3c3dd04f07b72e277 100644 --- a/test/gtest_state_composite.cpp +++ b/test/gtest_state_composite.cpp @@ -9,6 +9,7 @@ #include "core/utils/utils_gtest.h" #include "core/utils/logging.h" +#include "core/common/wolf.h" #include "core/state_block/state_composite.h" using namespace wolf; @@ -44,9 +45,6 @@ using namespace std; TEST(StateComposite, operatorStream) { StateComposite x; - unsigned int psize, osize; - psize = 2; - osize = 3; x.emplace("P", Vector2d(1,1)); x.emplace("O", Vector3d(2,2,2)); @@ -54,6 +52,7 @@ TEST(StateComposite, operatorStream) WOLF_DEBUG("x = " , x); } + TEST(MatrixComposite, emplace_operatorStream) { MatrixComposite M; @@ -83,6 +82,58 @@ TEST(MatrixComposite, emplace_operatorStream) WOLF_DEBUG("M = " , M); } +TEST(MatrixComposite, operatorParenthesis) +{ + MatrixComposite M; + + unsigned int psize, osize; + psize = 2; + osize = 3; + + MatrixXd Mpp(psize,psize), Mpo(psize, osize), Mop(osize,psize), Moo(osize,osize); + + Mpp.setOnes(); + Mpo.setOnes(); Mpo *= 2; + Mop.setOnes(); Mop *= 3; + Moo.setOnes(); Moo *= 4; + + M.emplace("P", "P", Mpp); + ASSERT_MATRIX_APPROX( M("P", "P"), Mpp, 1e-20); + + M.emplace("P", "O", Mpo); + ASSERT_MATRIX_APPROX( M("P", "O"), Mpo, 1e-20); + + // return default empty matrix if block not present + MatrixXd N = M("O", "O"); + ASSERT_EQ(N.rows(), 0); + ASSERT_EQ(N.cols(), 0); +} + +TEST(MatrixComposite, operatorAt) +{ + MatrixComposite M; + + unsigned int psize, osize; + psize = 2; + osize = 3; + + MatrixXd Mpp(psize,psize), Mpo(psize, osize), Mop(osize,psize), Moo(osize,osize); + + Mpp.setOnes(); + Mpo.setOnes(); Mpo *= 2; + Mop.setOnes(); Mop *= 3; + Moo.setOnes(); Moo *= 4; + + M.emplace("P", "P", Mpp); + ASSERT_MATRIX_APPROX( M.at("P", "P"), Mpp, 1e-20); + + M.emplace("P", "O", Mpo); + ASSERT_MATRIX_APPROX( M.at("P", "O"), Mpo, 1e-20); + + // error if block not present + ASSERT_DEATH(MatrixXd N = M.at("O", "O"), ""); +} + TEST(MatrixComposite, productVector) { unsigned int psize, osize; @@ -115,6 +166,21 @@ TEST(MatrixComposite, productVector) WOLF_DEBUG("y = M * x = " , y); + /* M * x = y + * p o + * p [1 1 2 2 2] p [1] p [14] + * [1 1 2 2 2] [1] [14] + * [3 3 4 4 4] * [2] = [30] + * o [3 3 4 4 4] o [2] o [30] + * [3 3 4 4 4] [2] [30] + */ + + Vector2d yp(14,14); + Vector3d yo(30,30,30); + + ASSERT_MATRIX_APPROX(y.at("P"), yp, 1e-20); + ASSERT_MATRIX_APPROX(y.at("O"), yo, 1e-20); + } TEST(MatrixComposite, productMatrix) @@ -156,6 +222,13 @@ TEST(MatrixComposite, productMatrix) WOLF_DEBUG("MN = M * N = " , MN); + /* M * N = MN + * p o o v o v + * p [1 1 2] p [3 4 4] p [ 8 12 12] + * [1 1 2] * [3 4 4] = [ 8 12 12] + * o [3 3 4] o [1 2 2] o [22 32 32] + */ + MatrixXd MNpo(MatrixXd::Ones(psize,osize) * 8); MatrixXd MNpv(MatrixXd::Ones(psize,vsize) * 12); MatrixXd MNoo(MatrixXd::Ones(osize,osize) * 22);