From 42538c025249ed9d1481dd81e0e32060f69a3c25 Mon Sep 17 00:00:00 2001 From: Luca Carlone Date: Thu, 24 Oct 2013 23:12:18 +0000 Subject: [PATCH] unit tested multiplyHessian in HessianFactor --- .cproject | 382 +++++++++--------- gtsam/linear/HessianFactor.cpp | 27 +- .../testGaussianFactorGraphUnordered.cpp | 54 +-- 3 files changed, 240 insertions(+), 223 deletions(-) diff --git a/.cproject b/.cproject index 4f449ae92..cf0ec25f8 100644 --- a/.cproject +++ b/.cproject @@ -315,14 +315,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -349,6 +341,7 @@ make + tests/testBayesTree.run true false @@ -356,6 +349,7 @@ make + testBinaryBayesNet.run true false @@ -403,6 +397,7 @@ make + testSymbolicBayesNet.run true false @@ -410,6 +405,7 @@ make + tests/testSymbolicFactor.run true false @@ -417,6 +413,7 @@ make + testSymbolicFactorGraph.run true false @@ -432,11 +429,20 @@ make + tests/testBayesTree true false true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j5 @@ -525,22 +531,6 @@ false true - - make - -j2 - all - true - true - true - - - make - -j2 - clean - true - true - true - make -j2 @@ -557,6 +547,22 @@ true true + + make + -j2 + all + true + true + true + + + make + -j2 + clean + true + true + true + make -j2 @@ -581,42 +587,26 @@ true true - + make - -j5 - testValues.run + -j2 + all true true true - + make - -j5 - testOrdering.run + -j2 + check true true true - + make - -j5 - testKey.run - true - true - true - - - make - -j5 - testLinearContainerFactor.run - true - true - true - - - make - -j6 -j8 - testWhiteNoiseFactor.run + -j2 + clean true true true @@ -669,26 +659,42 @@ true true - + make - -j2 - all + -j5 + testValues.run true true true - + make - -j2 - check + -j5 + testOrdering.run true true true - + make - -j2 - clean + -j5 + testKey.run + true + true + true + + + make + -j5 + testLinearContainerFactor.run + true + true + true + + + make + -j6 -j8 + testWhiteNoiseFactor.run true true true @@ -1087,6 +1093,7 @@ make + testGraph.run true false @@ -1094,6 +1101,7 @@ make + testJunctionTree.run true false @@ -1101,6 +1109,7 @@ make + testSymbolicBayesNetB.run true false @@ -1268,6 +1277,7 @@ make + testErrors.run true false @@ -1313,14 +1323,6 @@ true true - - make - -j2 - testGaussianFactor.run - true - true - true - make -j2 @@ -1401,6 +1403,14 @@ true true + + make + -j2 + testGaussianFactor.run + true + true + true + make -j2 @@ -1707,7 +1717,6 @@ make - testSimulated2DOriented.run true false @@ -1747,7 +1756,6 @@ make - testSimulated2D.run true false @@ -1755,7 +1763,6 @@ make - testSimulated3D.run true false @@ -1817,14 +1824,6 @@ true true - - make - -j5 - testGaussianFactorGraph.run - true - true - true - make -j5 @@ -1865,6 +1864,14 @@ true true + + make + -j5 + testGaussianFactorGraphUnordered.run + true + true + true + make -j2 @@ -2027,7 +2034,6 @@ make - tests/testGaussianISAM2 true false @@ -2049,102 +2055,6 @@ true true - - make - -j2 - testRot3.run - true - true - true - - - make - -j2 - testRot2.run - true - true - true - - - make - -j2 - testPose3.run - true - true - true - - - make - -j2 - timeRot3.run - true - true - true - - - make - -j2 - testPose2.run - true - true - true - - - make - -j2 - testCal3_S2.run - true - true - true - - - make - -j2 - testSimpleCamera.run - true - true - true - - - make - -j2 - testHomography2.run - true - true - true - - - make - -j2 - testCalibratedCamera.run - true - true - true - - - make - -j2 - check - true - true - true - - - make - -j2 - clean - true - true - true - - - make - -j2 - testPoint2.run - true - true - true - make -j3 @@ -2346,6 +2256,7 @@ cpack + -G DEB true false @@ -2353,6 +2264,7 @@ cpack + -G RPM true false @@ -2360,6 +2272,7 @@ cpack + -G TGZ true false @@ -2367,6 +2280,7 @@ cpack + --config CPackSourceConfig.cmake true false @@ -2532,34 +2446,98 @@ true true - + make - -j5 - testSpirit.run + -j2 + testRot3.run true true true - + make - -j5 - testWrap.run + -j2 + testRot2.run true true true - + make - -j5 - check.wrap + -j2 + testPose3.run true true true - + make - -j5 - wrap + -j2 + timeRot3.run + true + true + true + + + make + -j2 + testPose2.run + true + true + true + + + make + -j2 + testCal3_S2.run + true + true + true + + + make + -j2 + testSimpleCamera.run + true + true + true + + + make + -j2 + testHomography2.run + true + true + true + + + make + -j2 + testCalibratedCamera.run + true + true + true + + + make + -j2 + check + true + true + true + + + make + -j2 + clean + true + true + true + + + make + -j2 + testPoint2.run true true true @@ -2603,6 +2581,38 @@ false true + + make + -j5 + testSpirit.run + true + true + true + + + make + -j5 + testWrap.run + true + true + true + + + make + -j5 + check.wrap + true + true + true + + + make + -j5 + wrap + true + true + true + diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index af991231e..459c12f76 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -503,18 +503,25 @@ GaussianFactor::shared_ptr HessianFactor::negate() const void HessianFactor::multiplyHessianAdd(double alpha, const VectorValues& x, VectorValues& y) { - for(size_t posRow=0; posRow yi = y.tryInsert(keys_[posRow], Vector()); - if(yi.second) - yi.first->second = Vector::Zero(getDim(begin() + posRow)); + std::cout << "size() " << size() << std::endl; - for(size_t posCol=0; posCol it = y.tryInsert(keys_[i], Vector()); + Vector& yi = it.first->second; + if (it.second) { + // if the value does not exist we initialize it + yi = Vector::Zero(getDim(begin() + i)); + } + + for (size_t j = 0; j < size(); ++j) { // loops over the columns + Vector xj = x.at(keys_[j]); + // yi.at(keys_[i])// this is what we have to update + // xj is the input vector // we should select the blocks we need in (A'A) - Matrix Hij = info(begin()+posRow, begin()+posCol); - gtsam::transposeMultiplyAdd(alpha, Hij, X, yi.first->second); + if (i <= j) + yi += alpha * info(begin() + i, begin() + j) * xj; + else + yi += alpha * info(begin() + j, begin() + i).transpose() * xj; } } } diff --git a/gtsam/linear/tests/testGaussianFactorGraphUnordered.cpp b/gtsam/linear/tests/testGaussianFactorGraphUnordered.cpp index 79331611e..1ba31dec1 100644 --- a/gtsam/linear/tests/testGaussianFactorGraphUnordered.cpp +++ b/gtsam/linear/tests/testGaussianFactorGraphUnordered.cpp @@ -158,15 +158,6 @@ static GaussianFactorGraph createSimpleGaussianFactorGraph() { return fg; } - -/* ************************************************************************* */ -static GaussianFactorGraph createGaussianFactorGraphWithHessianFactor() { - GaussianFactorGraph fg = createSimpleGaussianFactorGraph(); - fg += HessianFactor(1, 2, 100*ones(2,2), 200*ones(2,2), (Vec(2) << 0.0, 1.0), - 400*ones(2,2), (Vec(2) << 1.0, 1.0), 0.0); - return fg; -} - /* ************************************************************************* */ TEST( GaussianFactorGraph, gradient ) { @@ -252,24 +243,33 @@ TEST( GaussianFactorGraph, multiplyHessian ) } /* ************************************************************************* */ -//TEST( GaussianFactorGraph, multiplyHessian2 ) -//{ -// GaussianFactorGraph A = createGaussianFactorGraphWithHessianFactor(); -// -// VectorValues x = map_list_of -// (0, (Vec(2) << 1,2)) -// (1, (Vec(2) << 3,4)) -// (2, (Vec(2) << 5,6)); -// -// // expected from matlab: -450 -450 2900 2900 6750 6850 -// VectorValues expected; -// expected.insert(0, (Vec(2) << -450, -450)); -// expected.insert(1, (Vec(2) << 2900, 2900)); -// expected.insert(2, (Vec(2) << 6750, 6850)); -// -// VectorValues actual = A.multiplyHessian(x); -// EXPECT(assert_equal(expected, actual)); -//} +static GaussianFactorGraph createGaussianFactorGraphWithHessianFactor() { + GaussianFactorGraph fg = createSimpleGaussianFactorGraph(); + fg += HessianFactor(1, 2, 100*ones(2,2), 200*ones(2,2), (Vec(2) << 0.0, 1.0), + 400*ones(2,2), (Vec(2) << 1.0, 1.0), 0.0); + return fg; +} + +/* ************************************************************************* */ +TEST( GaussianFactorGraph, multiplyHessian2 ) +{ + GaussianFactorGraph A = createGaussianFactorGraphWithHessianFactor(); + + VectorValues x = map_list_of + (0, (Vec(2) << 1,2)) + (1, (Vec(2) << 3,4)) + (2, (Vec(2) << 5,6)); + + // expected from matlab: -450 -450 2900 2900 6750 6850 + VectorValues expected; + expected.insert(0, (Vec(2) << -450, -450)); + expected.insert(1, (Vec(2) << 2900, 2900)); + expected.insert(2, (Vec(2) << 6750, 6850)); + + VectorValues actual = A.multiplyHessian(x); + EXPECT(assert_equal(expected, actual)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr);}