Made multiplyHessian into multiplyHessianAdd

release/4.3a0
Frank Dellaert 2013-10-27 14:58:51 +00:00
parent dd26bf996b
commit 7c3131b533
3 changed files with 20 additions and 12 deletions

View File

@ -247,11 +247,10 @@ namespace gtsam {
}
/* ************************************************************************* */
VectorValues GaussianFactorGraph::multiplyHessian(const VectorValues& x) const {
VectorValues y;
void GaussianFactorGraph::multiplyHessianAdd(double alpha,
const VectorValues& x, VectorValues& y) const {
BOOST_FOREACH(const GaussianFactor::shared_ptr& f, *this)
f->multiplyHessianAdd(1.0,x,y);
return y;
f->multiplyHessianAdd(alpha, x, y);
}
/* ************************************************************************* */

View File

@ -269,8 +269,9 @@ namespace gtsam {
///** return A*x */
Errors operator*(const VectorValues& x) const;
///** return A'A*x */
VectorValues multiplyHessian(const VectorValues& x) const;
///** y += alpha*A'A*x */
void multiplyHessianAdd(double alpha, const VectorValues& x,
VectorValues& y) const;
///** In-place version e <- A*x that overwrites e. */
void multiplyInPlace(const VectorValues& x, Errors& e) const;

View File

@ -142,8 +142,6 @@ TEST(GaussianFactorGraph, matrices) {
}
/* ************************************************************************* */
static Key X1=2,X2=0,L1=1;
static GaussianFactorGraph createSimpleGaussianFactorGraph() {
GaussianFactorGraph fg;
SharedDiagonal unit2 = noiseModel::Unit::Create(2);
@ -224,7 +222,7 @@ TEST(GaussianFactorGraph, eliminate_empty )
}
/* ************************************************************************* */
TEST( GaussianFactorGraph, multiplyHessian )
TEST( GaussianFactorGraph, multiplyHessianAdd )
{
GaussianFactorGraph A = createSimpleGaussianFactorGraph();
@ -238,8 +236,13 @@ TEST( GaussianFactorGraph, multiplyHessian )
expected.insert(1, (Vec(2) << 0, 0));
expected.insert(2, (Vec(2) << 950, 1050));
VectorValues actual = A.multiplyHessian(x);
VectorValues actual;
A.multiplyHessianAdd(1.0, x, actual);
EXPECT(assert_equal(expected, actual));
// now, do it with non-zero y
A.multiplyHessianAdd(1.0, x, actual);
EXPECT(assert_equal(2*expected, actual));
}
/* ************************************************************************* */
@ -251,7 +254,7 @@ static GaussianFactorGraph createGaussianFactorGraphWithHessianFactor() {
}
/* ************************************************************************* */
TEST( GaussianFactorGraph, multiplyHessian2 )
TEST( GaussianFactorGraph, multiplyHessianAdd2 )
{
GaussianFactorGraph A = createGaussianFactorGraphWithHessianFactor();
@ -266,8 +269,13 @@ TEST( GaussianFactorGraph, multiplyHessian2 )
expected.insert(1, (Vec(2) << 2900, 2900));
expected.insert(2, (Vec(2) << 6750, 6850));
VectorValues actual = A.multiplyHessian(x);
VectorValues actual;
A.multiplyHessianAdd(1.0, x, actual);
EXPECT(assert_equal(expected, actual));
// now, do it with non-zero y
A.multiplyHessianAdd(1.0, x, actual);
EXPECT(assert_equal(2*expected, actual));
}