fix for cityslam
parent
d55e72ae53
commit
fc66445be8
|
@ -31,6 +31,8 @@ check_PROGRAMS += tests/testGaussianFactor tests/testGaussianConditional
|
||||||
check_PROGRAMS += tests/testGaussianJunctionTree
|
check_PROGRAMS += tests/testGaussianJunctionTree
|
||||||
|
|
||||||
# Iterative Methods
|
# Iterative Methods
|
||||||
|
headers += iterative-inl.h
|
||||||
|
sources += iterative.cpp SubgraphPreconditioner.cpp
|
||||||
#headers += iterative-inl.h SubgraphSolver.h SubgraphSolver-inl.h
|
#headers += iterative-inl.h SubgraphSolver.h SubgraphSolver-inl.h
|
||||||
#sources += iterative.cpp BayesNetPreconditioner.cpp SubgraphPreconditioner.cpp
|
#sources += iterative.cpp BayesNetPreconditioner.cpp SubgraphPreconditioner.cpp
|
||||||
#check_PROGRAMS += tests/testBayesNetPreconditioner
|
#check_PROGRAMS += tests/testBayesNetPreconditioner
|
||||||
|
|
|
@ -64,9 +64,8 @@ namespace gtsam {
|
||||||
// Add A2 contribution
|
// Add A2 contribution
|
||||||
VectorValues x = this->x(y);
|
VectorValues x = this->x(y);
|
||||||
Errors e2 = Ab2_->errors(x);
|
Errors e2 = Ab2_->errors(x);
|
||||||
e.splice(e.end(), e2);
|
|
||||||
|
|
||||||
return 0.5 * dot(e, e);
|
return 0.5 * (dot(e, e) + dot(e2,e2));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
@ -136,19 +135,26 @@ namespace gtsam {
|
||||||
// Apply operator A', A'*e = [I inv(R1')*A2']*e = e1 + inv(R1')*A2'*e2
|
// Apply operator A', A'*e = [I inv(R1')*A2']*e = e1 + inv(R1')*A2'*e2
|
||||||
VectorValues SubgraphPreconditioner::operator^(const Errors& e) const {
|
VectorValues SubgraphPreconditioner::operator^(const Errors& e) const {
|
||||||
|
|
||||||
VectorValues y;
|
// VectorValues y;
|
||||||
|
//
|
||||||
|
// // Use BayesNet order to remove y contributions in order
|
||||||
|
// Errors::const_iterator it = e.begin();
|
||||||
|
// BOOST_FOREACH(GaussianConditional::shared_ptr cg, *Rc1_) {
|
||||||
|
// const Symbol& j = cg->key();
|
||||||
|
// const Vector& ej = *(it++);
|
||||||
|
// y.insert(j,ej);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // get A2 part
|
||||||
|
// transposeMultiplyAdd2(1.0,it,e.end(),y);
|
||||||
|
//
|
||||||
|
// return y;
|
||||||
|
|
||||||
// Use BayesNet order to remove y contributions in order
|
|
||||||
Errors::const_iterator it = e.begin();
|
Errors::const_iterator it = e.begin();
|
||||||
BOOST_FOREACH(GaussianConditional::shared_ptr cg, *Rc1_) {
|
VectorValues y = zero();
|
||||||
const Symbol& j = cg->key();
|
for ( int i = 0 ; i < y.size() ; ++i, ++it )
|
||||||
const Vector& ej = *(it++);
|
y[i] = *it ;
|
||||||
y.insert(j,ej);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get A2 part
|
|
||||||
transposeMultiplyAdd2(1.0,it,e.end(),y);
|
transposeMultiplyAdd2(1.0,it,e.end(),y);
|
||||||
|
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,15 +163,22 @@ namespace gtsam {
|
||||||
void SubgraphPreconditioner::transposeMultiplyAdd
|
void SubgraphPreconditioner::transposeMultiplyAdd
|
||||||
(double alpha, const Errors& e, VectorValues& y) const {
|
(double alpha, const Errors& e, VectorValues& y) const {
|
||||||
|
|
||||||
// Use BayesNet order to remove y contributions in order
|
// // Use BayesNet order to remove y contributions in order
|
||||||
Errors::const_iterator it = e.begin();
|
// Errors::const_iterator it = e.begin();
|
||||||
BOOST_FOREACH(GaussianConditional::shared_ptr cg, *Rc1_) {
|
// BOOST_FOREACH(GaussianConditional::shared_ptr cg, *Rc1_) {
|
||||||
const Symbol& j = cg->key();
|
// const Symbol& j = cg->key();
|
||||||
const Vector& ej = *(it++);
|
// const Vector& ej = *(it++);
|
||||||
axpy(alpha,ej,y[j]);
|
// axpy(alpha,ej,y[j]);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
// // get A2 part
|
||||||
|
// transposeMultiplyAdd2(alpha,it,e.end(),y);
|
||||||
|
|
||||||
// get A2 part
|
Errors::const_iterator it = e.begin();
|
||||||
|
for ( int i = 0 ; i < y.size() ; ++i, ++it ) {
|
||||||
|
const Vector& ei = *it;
|
||||||
|
axpy(alpha,ei,y[i]) ;
|
||||||
|
}
|
||||||
transposeMultiplyAdd2(alpha,it,e.end(),y);
|
transposeMultiplyAdd2(alpha,it,e.end(),y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,13 +55,13 @@ namespace gtsam {
|
||||||
*/
|
*/
|
||||||
SubgraphPreconditioner(sharedFG& Ab1, sharedFG& Ab2, sharedBayesNet& Rc1, sharedValues& xbar);
|
SubgraphPreconditioner(sharedFG& Ab1, sharedFG& Ab2, sharedBayesNet& Rc1, sharedValues& xbar);
|
||||||
|
|
||||||
std::pair<Matrix,Vector> Ab1(const Ordering& ordering) const { return Ab1_->matrix(ordering); }
|
// std::pair<Matrix,Vector> Ab1(const Ordering& ordering) const { return Ab1_->matrix(ordering); }
|
||||||
std::pair<Matrix,Vector> Ab2(const Ordering& ordering) const { return Ab2_->matrix(ordering); }
|
// std::pair<Matrix,Vector> Ab2(const Ordering& ordering) const { return Ab2_->matrix(ordering); }
|
||||||
Matrix A1(const Ordering& ordering) const { return Ab1_->sparse(ordering); }
|
// Matrix A1(const Ordering& ordering) const { return Ab1_->sparse(ordering); }
|
||||||
Matrix A2(const Ordering& ordering) const { return Ab2_->sparse(Ab1_->columnIndices(ordering)); }
|
// Matrix A2(const Ordering& ordering) const { return Ab2_->sparse(Ab1_->columnIndices(ordering)); }
|
||||||
Vector b1() const { return Ab1_->rhsVector(); }
|
// Vector b1() const { return Ab1_->rhsVector(); }
|
||||||
Vector b2() const { return Ab2_->rhsVector(); }
|
// Vector b2() const { return Ab2_->rhsVector(); }
|
||||||
VectorValues assembleValues(const Vector& v, const Ordering& ordering) const { return Ab1_->assembleValues(v, ordering); }
|
// VectorValues assembleValues(const Vector& v, const Ordering& ordering) const { return Ab1_->assembleValues(v, ordering); }
|
||||||
|
|
||||||
/* x = xbar + inv(R1)*y */
|
/* x = xbar + inv(R1)*y */
|
||||||
VectorValues x(const VectorValues& y) const;
|
VectorValues x(const VectorValues& y) const;
|
||||||
|
|
Loading…
Reference in New Issue