Added negate() and clone() to GaussianFactorGraph
parent
199505db5f
commit
e3208a1f8e
3
gtsam.h
3
gtsam.h
|
@ -1269,6 +1269,9 @@ class GaussianFactorGraph {
|
||||||
double error(const gtsam::VectorValues& c) const;
|
double error(const gtsam::VectorValues& c) const;
|
||||||
double probPrime(const gtsam::VectorValues& c) const;
|
double probPrime(const gtsam::VectorValues& c) const;
|
||||||
|
|
||||||
|
gtsam::GaussianFactorGraph clone() const;
|
||||||
|
gtsam::GaussianFactorGraph negate() const;
|
||||||
|
|
||||||
// Optimizing and linear algebra
|
// Optimizing and linear algebra
|
||||||
gtsam::VectorValues optimize() const;
|
gtsam::VectorValues optimize() const;
|
||||||
gtsam::VectorValues optimize(const gtsam::Ordering& ordering) const;
|
gtsam::VectorValues optimize(const gtsam::Ordering& ordering) const;
|
||||||
|
|
|
@ -54,6 +54,30 @@ namespace gtsam {
|
||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
GaussianFactorGraph GaussianFactorGraph::clone() const {
|
||||||
|
GaussianFactorGraph result;
|
||||||
|
BOOST_FOREACH(const sharedFactor& f, *this) {
|
||||||
|
if (f)
|
||||||
|
result.push_back(f->clone());
|
||||||
|
else
|
||||||
|
result.push_back(sharedFactor()); // Passes on null factors so indices remain valid
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
GaussianFactorGraph GaussianFactorGraph::negate() const {
|
||||||
|
GaussianFactorGraph result;
|
||||||
|
BOOST_FOREACH(const sharedFactor& f, *this) {
|
||||||
|
if (f)
|
||||||
|
result.push_back(f->negate());
|
||||||
|
else
|
||||||
|
result.push_back(sharedFactor()); // Passes on null factors so indices remain valid
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
std::vector<boost::tuple<size_t, size_t, double> > GaussianFactorGraph::sparseJacobian() const {
|
std::vector<boost::tuple<size_t, size_t, double> > GaussianFactorGraph::sparseJacobian() const {
|
||||||
// First find dimensions of each variable
|
// First find dimensions of each variable
|
||||||
|
|
|
@ -148,6 +148,21 @@ namespace gtsam {
|
||||||
return exp(-0.5 * error(c));
|
return exp(-0.5 * error(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clone() performs a deep-copy of the graph, including all of the factors.
|
||||||
|
* Cloning preserves null factors so indices for the original graph are still
|
||||||
|
* valid for the cloned graph.
|
||||||
|
*/
|
||||||
|
GaussianFactorGraph clone() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the negation of all factors in this graph - corresponds to antifactors.
|
||||||
|
* Will convert all factors to HessianFactors due to negation of information.
|
||||||
|
* Cloning preserves null factors so indices for the original graph are still
|
||||||
|
* valid for the cloned graph.
|
||||||
|
*/
|
||||||
|
GaussianFactorGraph negate() const;
|
||||||
|
|
||||||
///@name Linear Algebra
|
///@name Linear Algebra
|
||||||
///@{
|
///@{
|
||||||
|
|
||||||
|
|
|
@ -322,6 +322,37 @@ TEST( GaussianFactorGraph, gradientAtZero )
|
||||||
EXPECT(assert_equal(expected, actual));
|
EXPECT(assert_equal(expected, actual));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( GaussianFactorGraph, clone ) {
|
||||||
|
GaussianFactorGraph init_graph = createGaussianFactorGraphWithHessianFactor();
|
||||||
|
init_graph.push_back(GaussianFactor::shared_ptr()); /// Add null factor
|
||||||
|
GaussianFactorGraph exp_graph = createGaussianFactorGraphWithHessianFactor(); // Created separately
|
||||||
|
exp_graph.push_back(GaussianFactor::shared_ptr()); /// Add null factor
|
||||||
|
GaussianFactorGraph actCloned = init_graph.clone();
|
||||||
|
EXPECT(assert_equal(init_graph, actCloned)); // Same as the original version
|
||||||
|
|
||||||
|
// Apply an in-place change to init_graph and compare
|
||||||
|
JacobianFactor::shared_ptr jacFactor0 = boost::dynamic_pointer_cast<JacobianFactor>(init_graph.at(0));
|
||||||
|
CHECK(jacFactor0);
|
||||||
|
jacFactor0->getA(jacFactor0->begin()) *= 7.;
|
||||||
|
EXPECT(assert_inequal(init_graph, exp_graph));
|
||||||
|
EXPECT(assert_equal(exp_graph, actCloned));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( GaussianFactorGraph, negate ) {
|
||||||
|
GaussianFactorGraph init_graph = createGaussianFactorGraphWithHessianFactor();
|
||||||
|
init_graph.push_back(GaussianFactor::shared_ptr()); /// Add null factor
|
||||||
|
GaussianFactorGraph actNegation = init_graph.negate();
|
||||||
|
GaussianFactorGraph expNegation;
|
||||||
|
expNegation.push_back(init_graph.at(0)->negate());
|
||||||
|
expNegation.push_back(init_graph.at(1)->negate());
|
||||||
|
expNegation.push_back(init_graph.at(2)->negate());
|
||||||
|
expNegation.push_back(init_graph.at(3)->negate());
|
||||||
|
expNegation.push_back(init_graph.at(4)->negate());
|
||||||
|
expNegation.push_back(GaussianFactor::shared_ptr());
|
||||||
|
EXPECT(assert_equal(expNegation, actNegation));
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
|
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
|
||||||
|
|
Loading…
Reference in New Issue