Going forwards, we default to reverse :-)
parent
4d1eb05c7d
commit
107bcd8bb4
|
@ -109,10 +109,8 @@ public:
|
|||
}
|
||||
|
||||
/// Return value and derivatives, forward AD version
|
||||
T forward(const Values& values, JacobianMap& jacobians) const {
|
||||
Augmented<T> augmented = root_->forward(values);
|
||||
jacobians = augmented.jacobians();
|
||||
return augmented.value();
|
||||
Augmented<T> forward(const Values& values) const {
|
||||
return root_->forward(values);
|
||||
}
|
||||
|
||||
// Return size needed for memory buffer in traceExecution
|
||||
|
@ -143,11 +141,7 @@ public:
|
|||
|
||||
/// Return value and derivatives
|
||||
T value(const Values& values, JacobianMap& jacobians) const {
|
||||
#ifdef EXPRESSION_FORWARD_AD
|
||||
return forward(values, jacobians);
|
||||
#else
|
||||
return reverse(values, jacobians);
|
||||
#endif
|
||||
}
|
||||
|
||||
const boost::shared_ptr<ExpressionNode<T> >& root() const {
|
||||
|
|
|
@ -61,10 +61,9 @@ TEST(Expression, leaf) {
|
|||
JacobianMap expected;
|
||||
expected[100] = eye(3);
|
||||
|
||||
JacobianMap actualMap1;
|
||||
Rot3 actual1 = R.forward(values, actualMap1);
|
||||
EXPECT(assert_equal(someR, actual1));
|
||||
EXPECT(actualMap1 == expected);
|
||||
Augmented<Rot3> actual1 = R.forward(values);
|
||||
EXPECT(assert_equal(someR, actual1.value()));
|
||||
EXPECT(actual1.jacobians() == expected);
|
||||
|
||||
JacobianMap actualMap2;
|
||||
Rot3 actual2 = R.reverse(values, actualMap2);
|
||||
|
@ -126,16 +125,6 @@ TEST(Expression, keys_tree) {
|
|||
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) {
|
||||
|
||||
|
|
|
@ -260,6 +260,15 @@ TEST(ExpressionFactor, tree) {
|
|||
Point2_ xy_hat(PinholeCamera<Cal3_S2>::project_to_camera, p_cam);
|
||||
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
|
||||
ExpressionFactor<Point2> f(model, measured, uv_hat);
|
||||
EXPECT_DOUBLES_EQUAL(expected_error, f.error(values), 1e-9);
|
||||
|
|
Loading…
Reference in New Issue