diff --git a/.cproject b/.cproject
index 412359938..52c627f5c 100644
--- a/.cproject
+++ b/.cproject
@@ -600,6 +600,7 @@
make
+
tests/testBayesTree.run
true
false
@@ -607,6 +608,7 @@
make
+
testBinaryBayesNet.run
true
false
@@ -654,6 +656,7 @@
make
+
testSymbolicBayesNet.run
true
false
@@ -661,6 +664,7 @@
make
+
tests/testSymbolicFactor.run
true
false
@@ -668,6 +672,7 @@
make
+
testSymbolicFactorGraph.run
true
false
@@ -683,6 +688,7 @@
make
+
tests/testBayesTree
true
false
@@ -1114,6 +1120,7 @@
make
+
testErrors.run
true
false
@@ -1343,6 +1350,46 @@
true
true
+
+ make
+ -j5
+ testBTree.run
+ true
+ true
+ true
+
+
+ make
+ -j5
+ testDSF.run
+ true
+ true
+ true
+
+
+ make
+ -j5
+ testDSFMap.run
+ true
+ true
+ true
+
+
+ make
+ -j5
+ testDSFVector.run
+ true
+ true
+ true
+
+
+ make
+ -j5
+ testFixedVector.run
+ true
+ true
+ true
+
make
-j2
@@ -1425,7 +1472,6 @@
make
-
testSimulated2DOriented.run
true
false
@@ -1465,7 +1511,6 @@
make
-
testSimulated2D.run
true
false
@@ -1473,7 +1518,6 @@
make
-
testSimulated3D.run
true
false
@@ -1487,46 +1531,6 @@
true
true
-
- make
- -j5
- testBTree.run
- true
- true
- true
-
-
- make
- -j5
- testDSF.run
- true
- true
- true
-
-
- make
- -j5
- testDSFMap.run
- true
- true
- true
-
-
- make
- -j5
- testDSFVector.run
- true
- true
- true
-
-
- make
- -j5
- testFixedVector.run
- true
- true
- true
-
make
-j5
@@ -1784,6 +1788,7 @@
cpack
+
-G DEB
true
false
@@ -1791,6 +1796,7 @@
cpack
+
-G RPM
true
false
@@ -1798,6 +1804,7 @@
cpack
+
-G TGZ
true
false
@@ -1805,6 +1812,7 @@
cpack
+
--config CPackSourceConfig.cmake
true
false
@@ -2619,6 +2627,7 @@
make
+
testGraph.run
true
false
@@ -2626,6 +2635,7 @@
make
+
testJunctionTree.run
true
false
@@ -2633,6 +2643,7 @@
make
+
testSymbolicBayesNetB.run
true
false
@@ -2742,6 +2753,14 @@
true
true
+
+ make
+ -j5
+ testCallRecord.run
+ true
+ true
+ true
+
make
-j2
@@ -3152,7 +3171,6 @@
make
-
tests/testGaussianISAM2
true
false
diff --git a/gtsam_unstable/examples/Pose2SLAMExampleExpressions.cpp b/gtsam_unstable/examples/Pose2SLAMExampleExpressions.cpp
index 936c9957b..ac43fa428 100644
--- a/gtsam_unstable/examples/Pose2SLAMExampleExpressions.cpp
+++ b/gtsam_unstable/examples/Pose2SLAMExampleExpressions.cpp
@@ -10,7 +10,7 @@
* -------------------------------------------------------------------------- */
/**
- * @file Pose2SLAMExample.cpp
+ * @file Pose2SLAMExampleExpressions.cpp
* @brief Expressions version of Pose2SLAMExample.cpp
* @date Oct 2, 2014
* @author Frank Dellaert
diff --git a/gtsam_unstable/nonlinear/CallRecord.h b/gtsam_unstable/nonlinear/CallRecord.h
new file mode 100644
index 000000000..3806f1803
--- /dev/null
+++ b/gtsam_unstable/nonlinear/CallRecord.h
@@ -0,0 +1,190 @@
+/* ----------------------------------------------------------------------------
+
+ * GTSAM Copyright 2010, Georgia Tech Research Corporation,
+ * Atlanta, Georgia 30332-0415
+ * All Rights Reserved
+ * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
+
+ * See LICENSE for the license information
+
+ * -------------------------------------------------------------------------- */
+
+/**
+ * @file CallRecord.h
+ * @date November 21, 2014
+ * @author Frank Dellaert
+ * @author Paul Furgale
+ * @author Hannes Sommer
+ * @brief Internals for Expression.h, not for general consumption
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+#include
+
+namespace gtsam {
+
+class JacobianMap;
+// forward declaration
+
+//-----------------------------------------------------------------------------
+/**
+ * MaxVirtualStaticRows defines how many separate virtual reverseAD with specific
+ * static rows (1..MaxVirtualStaticRows) methods will be part of the CallRecord interface.
+ */
+const int MaxVirtualStaticRows = 4;
+
+namespace internal {
+
+/**
+ * ConvertToDynamicIf converts to a dense matrix with dynamic rows iff
+ * ConvertToDynamicRows (colums stay as they are) otherwise
+ * it just passes dense Eigen matrices through.
+ */
+template
+struct ConvertToDynamicRowsIf {
+ template
+ static Eigen::Matrix convert(
+ const Eigen::MatrixBase & x) {
+ return x;
+ }
+};
+
+template<>
+struct ConvertToDynamicRowsIf {
+ template
+ static const Eigen::Matrix & convert(
+ const Eigen::Matrix & x) {
+ return x;
+ }
+};
+
+/**
+ * Recursive definition of an interface having several purely
+ * virtual _reverseAD(const Eigen::Matrix &, JacobianMap&)
+ * with Rows in 1..MaxSupportedStaticRows
+ */
+template
+struct ReverseADInterface: ReverseADInterface {
+ using ReverseADInterface::_reverseAD;
+ virtual void _reverseAD(
+ const Eigen::Matrix & dFdT,
+ JacobianMap& jacobians) const = 0;
+};
+
+template
+struct ReverseADInterface<0, Cols> {
+ virtual void _reverseAD(
+ const Eigen::Matrix & dFdT,
+ JacobianMap& jacobians) const = 0;
+ virtual void _reverseAD(const Matrix & dFdT,
+ JacobianMap& jacobians) const = 0;
+};
+
+/**
+ * ReverseADImplementor is a utility class used by CallRecordImplementor to
+ * implementing the recursive ReverseADInterface interface.
+ */
+template
+struct ReverseADImplementor: ReverseADImplementor {
+private:
+ using ReverseADImplementor::_reverseAD;
+ virtual void _reverseAD(
+ const Eigen::Matrix & dFdT,
+ JacobianMap& jacobians) const {
+ static_cast(this)->reverseAD(dFdT, jacobians);
+ }
+ friend struct internal::ReverseADImplementor;
+};
+
+template
+struct ReverseADImplementor : virtual internal::ReverseADInterface<
+ MaxVirtualStaticRows, Cols> {
+private:
+ using internal::ReverseADInterface::_reverseAD;
+ const Derived & derived() const {
+ return static_cast(*this);
+ }
+ virtual void _reverseAD(
+ const Eigen::Matrix & dFdT,
+ JacobianMap& jacobians) const {
+ derived().reverseAD(dFdT, jacobians);
+ }
+ virtual void _reverseAD(const Matrix & dFdT, JacobianMap& jacobians) const {
+ derived().reverseAD(dFdT, jacobians);
+ }
+ friend struct internal::ReverseADImplementor;
+};
+
+} // namespace internal
+
+/**
+ * The CallRecord class stores the Jacobians of applying a function
+ * with respect to each of its arguments. It also stores an execution trace
+ * (defined below) for each of its arguments.
+ *
+ * It is implemented in the function-style ExpressionNode's nested Record class below.
+ */
+template
+struct CallRecord: virtual private internal::ReverseADInterface<
+ MaxVirtualStaticRows, Cols> {
+
+ inline void print(const std::string& indent) const {
+ _print(indent);
+ }
+
+ inline void startReverseAD(JacobianMap& jacobians) const {
+ _startReverseAD(jacobians);
+ }
+
+ template
+ inline void reverseAD(const Eigen::Matrix & dFdT,
+ JacobianMap& jacobians) const {
+ _reverseAD(
+ internal::ConvertToDynamicRowsIf<(Rows > MaxVirtualStaticRows)>::convert(
+ dFdT), jacobians);
+ }
+
+ inline void reverseAD(const Matrix & dFdT, JacobianMap& jacobians) const {
+ _reverseAD(dFdT, jacobians);
+ }
+
+ virtual ~CallRecord() {
+ }
+
+private:
+ virtual void _print(const std::string& indent) const = 0;
+ virtual void _startReverseAD(JacobianMap& jacobians) const = 0;
+ using internal::ReverseADInterface::_reverseAD;
+};
+
+namespace internal {
+/**
+ * The CallRecordImplementor implements the CallRecord interface for a Derived class by
+ * delegating to its corresponding (templated) non-virtual methods.
+ */
+template
+struct CallRecordImplementor: public CallRecord,
+ private ReverseADImplementor {
+private:
+ const Derived & derived() const {
+ return static_cast(*this);
+ }
+ virtual void _print(const std::string& indent) const {
+ derived().print(indent);
+ }
+ virtual void _startReverseAD(JacobianMap& jacobians) const {
+ derived().startReverseAD(jacobians);
+ }
+ template friend struct ReverseADImplementor;
+};
+
+} // namespace internal
+
+} // gtsam
diff --git a/gtsam_unstable/nonlinear/Expression-inl.h b/gtsam_unstable/nonlinear/Expression-inl.h
index 40fc54751..a98ab349f 100644
--- a/gtsam_unstable/nonlinear/Expression-inl.h
+++ b/gtsam_unstable/nonlinear/Expression-inl.h
@@ -19,29 +19,21 @@
#pragma once
+#include
#include
-#include
#include
#include
-#include
#include
#include
#include
// template meta-programming headers
-#include
-#include
-#include
-#include
#include
-#include
-#include
-#include
-#include
namespace MPL = boost::mpl::placeholders;
-#include // for placement new
+#include