From cc3c0fcfeca05dc55881b048e3537728eee29bbe Mon Sep 17 00:00:00 2001 From: Sungtae An Date: Sun, 5 Oct 2014 17:38:09 -0400 Subject: [PATCH] add trace structure for reverse AD in TernaryExpression --- gtsam_unstable/nonlinear/Expression-inl.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/gtsam_unstable/nonlinear/Expression-inl.h b/gtsam_unstable/nonlinear/Expression-inl.h index 7d375e737..2b02e6991 100644 --- a/gtsam_unstable/nonlinear/Expression-inl.h +++ b/gtsam_unstable/nonlinear/Expression-inl.h @@ -533,6 +533,26 @@ public: return Augmented(t, H1, argument1.jacobians(), H2, argument2.jacobians(), H3, argument3.jacobians()); } + /// Trace structure for reverse AD + struct Trace: public JacobianTrace { + boost::shared_ptr > trace1; + boost::shared_ptr > trace2; + boost::shared_ptr > trace3; + Matrix H1, H2, H3; + /// Start the reverse AD process + virtual void reverseAD(JacobianMap& jacobians) const { + trace1->reverseAD(H1, jacobians); + trace2->reverseAD(H2, jacobians); + trace3->reverseAD(H3, jacobians); + } + /// Given df/dT, multiply in dT/dA and continue reverse AD process + virtual void reverseAD(const Matrix& H, JacobianMap& jacobians) const { + trace1->reverseAD(H * H1, jacobians); + trace2->reverseAD(H * H2, jacobians); + trace3->reverseAD(H * H3, jacobians); + } + }; + }; //----------------------------------------------------------------------------- }