Unary prints, but still-faults downstream
parent
05f78b6dca
commit
deed7b8018
|
|
@ -466,11 +466,11 @@ public:
|
||||||
/// Construct an execution trace for reverse AD
|
/// Construct an execution trace for reverse AD
|
||||||
virtual T traceExecution(const Values& values, ExecutionTrace<T>& trace,
|
virtual T traceExecution(const Values& values, ExecutionTrace<T>& trace,
|
||||||
void* raw) const {
|
void* raw) const {
|
||||||
// Record* record = new Record();
|
Record* record = new (raw) Record();
|
||||||
// p.setFunction(record);
|
trace.setFunction(record);
|
||||||
// A1 a = this->expressionA1_->traceExecution(values, record->trace1);
|
A1 a1 = this->expressionA1_->traceExecution(values, record->trace1,
|
||||||
// return function_(a, record->dTdA1);
|
record + 1);
|
||||||
return T();
|
return function_(a1, record->dTdA1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -692,13 +692,12 @@ public:
|
||||||
/// Construct an execution trace for reverse AD
|
/// Construct an execution trace for reverse AD
|
||||||
virtual T traceExecution(const Values& values, ExecutionTrace<T>& trace,
|
virtual T traceExecution(const Values& values, ExecutionTrace<T>& trace,
|
||||||
void* raw) const {
|
void* raw) const {
|
||||||
// Record* record = new Record();
|
Record* record = new (raw) Record();
|
||||||
// p.setFunction(record);
|
trace.setFunction(record);
|
||||||
// A1 a1 = this->expressionA1_->traceExecution(values, record->trace1);
|
A1 a1 = this->expressionA1_->traceExecution(values, record->trace1, raw);
|
||||||
// A2 a2 = this->expressionA2_->traceExecution(values, record->trace2);
|
A2 a2 = this->expressionA2_->traceExecution(values, record->trace2, raw);
|
||||||
// A3 a3 = this->expressionA3_->traceExecution(values, record->trace3);
|
A3 a3 = this->expressionA3_->traceExecution(values, record->trace3, raw);
|
||||||
// return function_(a1, a2, a3, record->dTdA1, record->dTdA2, record->dTdA3);
|
return function_(a1, a2, a3, record->dTdA1, record->dTdA2, record->dTdA3);
|
||||||
return T();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -131,12 +131,6 @@ TEST(ExpressionFactor, binary) {
|
||||||
values.insert(1, Cal3_S2());
|
values.insert(1, Cal3_S2());
|
||||||
values.insert(2, Point2(0, 0));
|
values.insert(2, Point2(0, 0));
|
||||||
|
|
||||||
// Expected Jacobians
|
|
||||||
Matrix25 expected25;
|
|
||||||
expected25 << 0, 0, 0, 1, 0, 0, 0, 0, 0, 1;
|
|
||||||
Matrix2 expected22;
|
|
||||||
expected22 << 1, 0, 0, 1;
|
|
||||||
|
|
||||||
// traceRaw will fill raw with [Trace<Point2> | Binary::Record]
|
// traceRaw will fill raw with [Trace<Point2> | Binary::Record]
|
||||||
EXPECT_LONGS_EQUAL(8, sizeof(double));
|
EXPECT_LONGS_EQUAL(8, sizeof(double));
|
||||||
EXPECT_LONGS_EQUAL(16, sizeof(ExecutionTrace<Point2>));
|
EXPECT_LONGS_EQUAL(16, sizeof(ExecutionTrace<Point2>));
|
||||||
|
|
@ -153,39 +147,69 @@ TEST(ExpressionFactor, binary) {
|
||||||
Point2 value = tester.binary_.traceExecution(values, trace, raw);
|
Point2 value = tester.binary_.traceExecution(values, trace, raw);
|
||||||
// trace.print();
|
// trace.print();
|
||||||
|
|
||||||
|
// Expected Jacobians
|
||||||
|
Matrix25 expected25;
|
||||||
|
expected25 << 0, 0, 0, 1, 0, 0, 0, 0, 0, 1;
|
||||||
|
Matrix2 expected22;
|
||||||
|
expected22 << 1, 0, 0, 1;
|
||||||
|
|
||||||
// Check matrices
|
// Check matrices
|
||||||
boost::optional<Binary::Record*> p = trace.record<Binary::Record>();
|
boost::optional<Binary::Record*> p = trace.record<Binary::Record>();
|
||||||
CHECK(p);
|
CHECK(p);
|
||||||
EXPECT( assert_equal(expected25, (Matrix)(*p)->dTdA1, 1e-9));
|
EXPECT( assert_equal(expected25, (Matrix)(*p)->dTdA1, 1e-9));
|
||||||
EXPECT( assert_equal(expected22, (Matrix)(*p)->dTdA2, 1e-9));
|
EXPECT( assert_equal(expected22, (Matrix)(*p)->dTdA2, 1e-9));
|
||||||
}
|
}
|
||||||
///* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
//// Unary(Binary(Leaf,Leaf))
|
// Unary(Binary(Leaf,Leaf))
|
||||||
//TEST(ExpressionFactor, shallow) {
|
TEST(ExpressionFactor, shallow) {
|
||||||
//
|
|
||||||
// // Create some values
|
// Create some values
|
||||||
// Values values;
|
Values values;
|
||||||
// values.insert(1, Pose3());
|
values.insert(1, Pose3());
|
||||||
// values.insert(2, Point3(0, 0, 1));
|
values.insert(2, Point3(0, 0, 1));
|
||||||
//
|
|
||||||
// // Create old-style factor to create expected value and derivatives
|
// Create old-style factor to create expected value and derivatives
|
||||||
// GenericProjectionFactor<Pose3, Point3> old(measured, model, 1, 2,
|
GenericProjectionFactor<Pose3, Point3> old(measured, model, 1, 2,
|
||||||
// boost::make_shared<Cal3_S2>());
|
boost::make_shared<Cal3_S2>());
|
||||||
// double expected_error = old.error(values);
|
double expected_error = old.error(values);
|
||||||
// GaussianFactor::shared_ptr expected = old.linearize(values);
|
GaussianFactor::shared_ptr expected = old.linearize(values);
|
||||||
//
|
|
||||||
// // Create leaves
|
// Create leaves
|
||||||
// Pose3_ x(1);
|
Pose3_ x_(1);
|
||||||
// Point3_ p(2);
|
Point3_ p_(2);
|
||||||
//
|
|
||||||
// // Concise version
|
// Construct expression, concise evrsion
|
||||||
// ExpressionFactor<Point2> f2(model, measured, project(transform_to(x, p)));
|
Point2_ expression = project(transform_to(x_, p_));
|
||||||
// EXPECT_DOUBLES_EQUAL(expected_error, f2.error(values), 1e-9);
|
|
||||||
// EXPECT_LONGS_EQUAL(2, f2.dim());
|
// traceExecution of shallow tree
|
||||||
// boost::shared_ptr<GaussianFactor> gf2 = f2.linearize(values);
|
typedef UnaryExpression<Point2, Point3> Unary;
|
||||||
// EXPECT( assert_equal(*expected, *gf2, 1e-9));
|
typedef BinaryExpression<Point3, Pose3, Point3> Binary;
|
||||||
//}
|
EXPECT_LONGS_EQUAL(80, sizeof(Unary::Record));
|
||||||
//
|
EXPECT_LONGS_EQUAL(272, sizeof(Binary::Record));
|
||||||
|
size_t size = sizeof(Unary::Record) + sizeof(Binary::Record);
|
||||||
|
LONGS_EQUAL(352, size);
|
||||||
|
char raw[size];
|
||||||
|
ExecutionTrace<Point2> trace;
|
||||||
|
Point2 value = expression.traceExecution(values, trace, raw);
|
||||||
|
trace.print();
|
||||||
|
|
||||||
|
// Expected Jacobians
|
||||||
|
Matrix23 expected23;
|
||||||
|
expected23 << 1, 0, 0, 0, 1, 0;
|
||||||
|
|
||||||
|
// Check matrices
|
||||||
|
boost::optional<Unary::Record*> p = trace.record<Unary::Record>();
|
||||||
|
CHECK(p);
|
||||||
|
EXPECT( assert_equal(expected23, (Matrix)(*p)->dTdA1, 1e-9));
|
||||||
|
|
||||||
|
// Linearization
|
||||||
|
ExpressionFactor<Point2> f2(model, measured, expression);
|
||||||
|
EXPECT_DOUBLES_EQUAL(expected_error, f2.error(values), 1e-9);
|
||||||
|
EXPECT_LONGS_EQUAL(2, f2.dim());
|
||||||
|
boost::shared_ptr<GaussianFactor> gf2 = f2.linearize(values);
|
||||||
|
EXPECT( assert_equal(*expected, *gf2, 1e-9));
|
||||||
|
}
|
||||||
|
|
||||||
///* ************************************************************************* */
|
///* ************************************************************************* */
|
||||||
//// Binary(Leaf,Unary(Binary(Leaf,Leaf)))
|
//// Binary(Leaf,Unary(Binary(Leaf,Leaf)))
|
||||||
//TEST(ExpressionFactor, tree) {
|
//TEST(ExpressionFactor, tree) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue