Recursion done

release/4.3a0
dellaert 2014-10-10 12:31:40 +02:00
parent 40fc6f5c03
commit f8468bd596
2 changed files with 9 additions and 3 deletions

View File

@ -120,10 +120,13 @@ struct JacobianTrace {
/// Make sure destructor is virtual
virtual ~JacobianTrace() {
}
virtual void startReverseAD(JacobianMap& jacobians) const = 0;
virtual void reverseAD(const Matrix& dFdT, JacobianMap& jacobians) const = 0;
virtual void startReverseAD(JacobianMap& jacobians) const {
}
virtual void reverseAD(const Matrix& dFdT, JacobianMap& jacobians) const {
}
virtual void reverseAD2(const Jacobian2T& dFdT,
JacobianMap& jacobians) const = 0;
JacobianMap& jacobians) const {
}
};
/// Primary template calls the generic Matrix reverseAD pipeline

View File

@ -339,15 +339,18 @@ struct Trace: More {
/// Start the reverse AD process
virtual void startReverseAD(JacobianMap& jacobians) const {
More::startReverseAD(jacobians);
Select<T::dimension, A>::reverseAD(trace, dTdA, jacobians);
}
/// Given df/dT, multiply in dT/dA and continue reverse AD process
virtual void reverseAD(const Matrix& dFdT, JacobianMap& jacobians) const {
More::reverseAD(dFdT, jacobians);
trace.reverseAD(dFdT * dTdA, jacobians);
}
/// Version specialized to 2-dimensional output
virtual void reverseAD2(const Jacobian2T& dFdT,
JacobianMap& jacobians) const {
More::reverseAD2(dFdT, jacobians);
trace.reverseAD2(dFdT * dTdA, jacobians);
}
};