diff --git a/gtsam/base/blockMatrices.h b/gtsam/base/blockMatrices.h index c5e0de43f..8bf8876a2 100644 --- a/gtsam/base/blockMatrices.h +++ b/gtsam/base/blockMatrices.h @@ -227,7 +227,7 @@ public: assertInvariants(); size_t actualBlock = block + blockStart_; checkBlock(actualBlock); - return variableColOffsets_[actualBlock] - variableColOffsets_[blockStart_]; + return variableColOffsets_[actualBlock]; } size_t& rowStart() { return rowStart_; } @@ -484,7 +484,7 @@ public: assertInvariants(); size_t actualBlock = block + blockStart_; checkBlock(actualBlock); - return variableColOffsets_[actualBlock] - variableColOffsets_[blockStart_]; + return variableColOffsets_[actualBlock]; } size_t& blockStart() { return blockStart_; } diff --git a/gtsam/linear/HessianFactor.cpp b/gtsam/linear/HessianFactor.cpp index 1bc021689..242b14a6a 100644 --- a/gtsam/linear/HessianFactor.cpp +++ b/gtsam/linear/HessianFactor.cpp @@ -41,6 +41,9 @@ #include #include +#include +#include + #include using namespace std; @@ -236,6 +239,11 @@ void HessianFactor::updateATA(const HessianFactor& update, const Scatter& scatte } toc(1, "slots"); + if(debug) { + this->print("Updating this: "); + update.print("with: "); + } + // Apply updates to the upper triangle tic(2, "update"); assert(this->info_.nBlocks() - 1 == scatter.size()); @@ -246,19 +254,33 @@ void HessianFactor::updateATA(const HessianFactor& update, const Scatter& scatte if(slot2 > slot1) { if(debug) cout << "Updating (" << slot1 << "," << slot2 << ") from (" << j1 << "," << j2 << ")" << endl; - ublas::noalias(this->info_(slot1, slot2)) += update.info_(j1,j2); +// ublas::noalias(this->info_(slot1, slot2)) += update.info_(j1,j2); + Eigen::Map(&matrix_(0,0), matrix_.size1(), matrix_.size2()).block( + info_.offset(slot1), info_.offset(slot2), info_(slot1,slot2).size1(), info_(slot1,slot2).size2()) += + Eigen::Map(&update.matrix_(0,0), update.matrix_.size1(), update.matrix_.size2()).block( + update.info_.offset(j1), update.info_.offset(j2), update.info_(j1,j2).size1(), update.info_(j1,j2).size2()); } else if(slot1 > slot2) { if(debug) cout << "Updating (" << slot2 << "," << slot1 << ") from (" << j1 << "," << j2 << ")" << endl; - ublas::noalias(this->info_(slot2, slot1)) += ublas::trans(update.info_(j1,j2)); +// ublas::noalias(this->info_(slot2, slot1)) += ublas::trans(update.info_(j1,j2)); + Eigen::Map(&matrix_(0,0), matrix_.size1(), matrix_.size2()).block( + info_.offset(slot2), info_.offset(slot1), info_(slot2,slot1).size1(), info_(slot2,slot1).size2()) += + Eigen::Map(&update.matrix_(0,0), update.matrix_.size1(), update.matrix_.size2()).block( + update.info_.offset(j1), update.info_.offset(j2), update.info_(j1,j2).size1(), update.info_(j1,j2).size2()).transpose(); } else { if(debug) cout << "Updating (" << slot1 << "," << slot2 << ") from (" << j1 << "," << j2 << ")" << endl; - Block thisBlock(this->info_(slot1, slot2)); - constBlock updateBlock(update.info_(j1,j2)); - ublas::noalias(ublas::symmetric_adaptor(thisBlock)) += - ublas::symmetric_adaptor(updateBlock); +// Block thisBlock(this->info_(slot1, slot2)); +// constBlock updateBlock(update.info_(j1,j2)); +// ublas::noalias(ublas::symmetric_adaptor(thisBlock)) += +// ublas::symmetric_adaptor(updateBlock); + Eigen::Map(&matrix_(0,0), matrix_.size1(), matrix_.size2()).block( + info_.offset(slot1), info_.offset(slot2), info_(slot1,slot2).size1(), info_(slot1,slot2).size2()).triangularView() += + Eigen::Map(&update.matrix_(0,0), update.matrix_.size1(), update.matrix_.size2()).block( + update.info_.offset(j1), update.info_.offset(j2), update.info_(j1,j2).size1(), update.info_(j1,j2).size2()); } + if(debug) cout << "Updating block " << slot1 << "," << slot2 << " from block " << j1 << "," << j2 << "\n"; + if(debug) this->print(); } } toc(2, "update"); diff --git a/gtsam/linear/JacobianFactor.cpp b/gtsam/linear/JacobianFactor.cpp index bf3f193cd..2bce79f2c 100644 --- a/gtsam/linear/JacobianFactor.cpp +++ b/gtsam/linear/JacobianFactor.cpp @@ -478,7 +478,7 @@ namespace gtsam { firstNonzeroBlocks_.resize(this->size1()); for(size_t row=0; row::sharedClique rootClique = junctionTree.eliminate(); diff --git a/gtsam/linear/tests/testHessianFactor.cpp b/gtsam/linear/tests/testHessianFactor.cpp index 69ca0f92b..9206d300a 100644 --- a/gtsam/linear/tests/testHessianFactor.cpp +++ b/gtsam/linear/tests/testHessianFactor.cpp @@ -16,6 +16,7 @@ * @created Dec 15, 2010 */ +#include #include #include #include @@ -207,6 +208,7 @@ TEST(GaussianFactor, eliminate2 ) /* ************************************************************************* */ TEST_UNSAFE(GaussianFactor, eliminateUnsorted) { + JacobianFactor::shared_ptr factor1( new JacobianFactor(0, Matrix_(3,3,