Going forwards, we default to reverse :-)
parent
4d1eb05c7d
commit
107bcd8bb4
|
@ -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 {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue