Going forwards, we default to reverse :-)

release/4.3a0
dellaert 2014-10-12 22:04:40 +02:00
parent 4d1eb05c7d
commit 107bcd8bb4
3 changed files with 14 additions and 22 deletions

View File

@ -109,10 +109,8 @@ public:
} }
/// Return value and derivatives, forward AD version /// Return value and derivatives, forward AD version
T forward(const Values& values, JacobianMap& jacobians) const { Augmented<T> forward(const Values& values) const {
Augmented<T> augmented = root_->forward(values); return root_->forward(values);
jacobians = augmented.jacobians();
return augmented.value();
} }
// Return size needed for memory buffer in traceExecution // Return size needed for memory buffer in traceExecution
@ -143,11 +141,7 @@ public:
/// Return value and derivatives /// Return value and derivatives
T value(const Values& values, JacobianMap& jacobians) const { T value(const Values& values, JacobianMap& jacobians) const {
#ifdef EXPRESSION_FORWARD_AD
return forward(values, jacobians);
#else
return reverse(values, jacobians); return reverse(values, jacobians);
#endif
} }
const boost::shared_ptr<ExpressionNode<T> >& root() const { const boost::shared_ptr<ExpressionNode<T> >& root() const {

View File

@ -61,10 +61,9 @@ TEST(Expression, leaf) {
JacobianMap expected; JacobianMap expected;
expected[100] = eye(3); expected[100] = eye(3);
JacobianMap actualMap1; Augmented<Rot3> actual1 = R.forward(values);
Rot3 actual1 = R.forward(values, actualMap1); EXPECT(assert_equal(someR, actual1.value()));
EXPECT(assert_equal(someR, actual1)); EXPECT(actual1.jacobians() == expected);
EXPECT(actualMap1 == expected);
JacobianMap actualMap2; JacobianMap actualMap2;
Rot3 actual2 = R.reverse(values, actualMap2); Rot3 actual2 = R.reverse(values, actualMap2);
@ -126,16 +125,6 @@ TEST(Expression, keys_tree) {
EXPECT(expectedKeys == tree::uv_hat.keys()); EXPECT(expectedKeys == tree::uv_hat.keys());
} }
/* ************************************************************************* */ /* ************************************************************************* */
// keys
TEST(Expression, block_tree) {
// // Check VerticalBlockMatrix
// size_t dimensions[3] = { 6, 3, 5 };
// Matrix matrix(2, 14);
// VerticalBlockMatrix expected(dimensions, matrix), actual =
// tree::uv_hat.verticalBlockMatrix();
// EXPECT( assert_equal(expected, *jf, 1e-9));
}
/* ************************************************************************* */
TEST(Expression, compose1) { TEST(Expression, compose1) {

View File

@ -260,6 +260,15 @@ TEST(ExpressionFactor, tree) {
Point2_ xy_hat(PinholeCamera<Cal3_S2>::project_to_camera, p_cam); Point2_ xy_hat(PinholeCamera<Cal3_S2>::project_to_camera, p_cam);
Point2_ uv_hat(K, &Cal3_S2::uncalibrate, xy_hat); Point2_ uv_hat(K, &Cal3_S2::uncalibrate, xy_hat);
// Compare reverse and forward
{
JacobianMap expectedMap; // via reverse
Point2 expectedValue = uv_hat.reverse(values, expectedMap);
Augmented<Point2> actual = uv_hat.forward(values);
EXPECT(assert_equal(expectedValue, actual.value()));
EXPECT(actual.jacobians() == expectedMap);
}
// Create factor and check value, dimension, linearization // Create factor and check value, dimension, linearization
ExpressionFactor<Point2> f(model, measured, uv_hat); ExpressionFactor<Point2> f(model, measured, uv_hat);
EXPECT_DOUBLES_EQUAL(expected_error, f.error(values), 1e-9); EXPECT_DOUBLES_EQUAL(expected_error, f.error(values), 1e-9);