Switch to pointers - nice improvement

release/4.3a0
dellaert 2014-10-07 18:11:12 +02:00
parent 982dc29d2f
commit 3c1c9c6d12
2 changed files with 23 additions and 10 deletions

View File

@ -136,13 +136,15 @@ public:
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
struct JacobianTrace { struct JacobianTrace {
virtual ~JacobianTrace() {
}
virtual void reverseAD(JacobianMap& jacobians) const = 0; virtual void reverseAD(JacobianMap& jacobians) const = 0;
virtual void reverseAD(const Matrix& dFdT, JacobianMap& jacobians) const = 0; virtual void reverseAD(const Matrix& dFdT, JacobianMap& jacobians) const = 0;
// template<class JacobianFT> // template<class JacobianFT>
// void reverseAD(const JacobianFT& dFdT, JacobianMap& jacobians) const { // void reverseAD(const JacobianFT& dFdT, JacobianMap& jacobians) const {
}; };
typedef boost::shared_ptr<JacobianTrace> TracePtr; typedef JacobianTrace* TracePtr;
//template <class Derived> //template <class Derived>
//struct TypedTrace { //struct TypedTrace {
@ -235,7 +237,7 @@ public:
/// Construct an execution trace for reverse AD /// Construct an execution trace for reverse AD
virtual std::pair<T, TracePtr> traceExecution(const Values& values) const { virtual std::pair<T, TracePtr> traceExecution(const Values& values) const {
boost::shared_ptr<Trace> trace = boost::make_shared<Trace>(); Trace* trace = new Trace();
return std::make_pair(constant_, trace); return std::make_pair(constant_, trace);
} }
}; };
@ -298,7 +300,7 @@ public:
/// Construct an execution trace for reverse AD /// Construct an execution trace for reverse AD
virtual std::pair<T, TracePtr> traceExecution(const Values& values) const { virtual std::pair<T, TracePtr> traceExecution(const Values& values) const {
boost::shared_ptr<Trace> trace = boost::make_shared<Trace>(); Trace* trace = new Trace();
trace->key = key_; trace->key = key_;
return std::make_pair(values.at<T>(key_), trace); return std::make_pair(values.at<T>(key_), trace);
} }
@ -357,6 +359,9 @@ public:
struct Trace: public JacobianTrace { struct Trace: public JacobianTrace {
TracePtr trace; TracePtr trace;
JacobianTA dTdA; JacobianTA dTdA;
virtual ~Trace() {
delete trace;
}
/// Start the reverse AD process /// Start the reverse AD process
virtual void reverseAD(JacobianMap& jacobians) const { virtual void reverseAD(JacobianMap& jacobians) const {
trace->reverseAD(dTdA, jacobians); trace->reverseAD(dTdA, jacobians);
@ -370,9 +375,9 @@ public:
/// Construct an execution trace for reverse AD /// Construct an execution trace for reverse AD
virtual std::pair<T, TracePtr> traceExecution(const Values& values) const { virtual std::pair<T, TracePtr> traceExecution(const Values& values) const {
A a; A a;
boost::shared_ptr<Trace> trace = boost::make_shared<Trace>(); Trace* trace = new Trace();
boost::tie(a, trace->trace) = this->expressionA_->traceExecution(values); boost::tie(a, trace->trace) = this->expressionA_->traceExecution(values);
return std::make_pair(function_(a, trace->dTdA),trace); return std::make_pair(function_(a, trace->dTdA), trace);
} }
}; };
@ -443,6 +448,10 @@ public:
TracePtr trace1, trace2; TracePtr trace1, trace2;
JacobianTA1 dTdA1; JacobianTA1 dTdA1;
JacobianTA2 dTdA2; JacobianTA2 dTdA2;
virtual ~Trace() {
delete trace1;
delete trace2;
}
/// Start the reverse AD process /// Start the reverse AD process
virtual void reverseAD(JacobianMap& jacobians) const { virtual void reverseAD(JacobianMap& jacobians) const {
trace1->reverseAD(dTdA1, jacobians); trace1->reverseAD(dTdA1, jacobians);
@ -459,7 +468,7 @@ public:
virtual std::pair<T, TracePtr> traceExecution(const Values& values) const { virtual std::pair<T, TracePtr> traceExecution(const Values& values) const {
A1 a1; A1 a1;
A2 a2; A2 a2;
boost::shared_ptr<Trace> trace = boost::make_shared<Trace>(); Trace* trace = new Trace();
boost::tie(a1, trace->trace1) = this->expressionA1_->traceExecution(values); boost::tie(a1, trace->trace1) = this->expressionA1_->traceExecution(values);
boost::tie(a2, trace->trace2) = this->expressionA2_->traceExecution(values); boost::tie(a2, trace->trace2) = this->expressionA2_->traceExecution(values);
return std::make_pair(function_(a1, a2, trace->dTdA1, trace->dTdA2), trace); return std::make_pair(function_(a1, a2, trace->dTdA1, trace->dTdA2), trace);
@ -543,12 +552,15 @@ public:
/// Trace structure for reverse AD /// Trace structure for reverse AD
struct Trace: public JacobianTrace { struct Trace: public JacobianTrace {
TracePtr trace1; TracePtr trace1, trace2, trace3;
TracePtr trace2;
TracePtr trace3;
JacobianTA1 dTdA1; JacobianTA1 dTdA1;
JacobianTA2 dTdA2; JacobianTA2 dTdA2;
JacobianTA3 dTdA3; JacobianTA3 dTdA3;
virtual ~Trace() {
delete trace1;
delete trace2;
delete trace3;
}
/// Start the reverse AD process /// Start the reverse AD process
virtual void reverseAD(JacobianMap& jacobians) const { virtual void reverseAD(JacobianMap& jacobians) const {
trace1->reverseAD(dTdA1, jacobians); trace1->reverseAD(dTdA1, jacobians);
@ -568,7 +580,7 @@ public:
A1 a1; A1 a1;
A2 a2; A2 a2;
A3 a3; A3 a3;
boost::shared_ptr<Trace> trace = boost::make_shared<Trace>(); Trace* trace = new Trace();
boost::tie(a1, trace->trace1) = this->expressionA1_->traceExecution(values); boost::tie(a1, trace->trace1) = this->expressionA1_->traceExecution(values);
boost::tie(a2, trace->trace2) = this->expressionA2_->traceExecution(values); boost::tie(a2, trace->trace2) = this->expressionA2_->traceExecution(values);
boost::tie(a3, trace->trace3) = this->expressionA3_->traceExecution(values); boost::tie(a3, trace->trace3) = this->expressionA3_->traceExecution(values);

View File

@ -122,6 +122,7 @@ public:
boost::tie(value,trace) = root_->traceExecution(values); boost::tie(value,trace) = root_->traceExecution(values);
Augmented<T> augmented(value); Augmented<T> augmented(value);
trace->reverseAD(augmented.jacobians()); trace->reverseAD(augmented.jacobians());
delete trace;
return augmented; return augmented;
#else #else
return root_->forward(values); return root_->forward(values);