From b4fe033d12ca078ed09e2beb12babb4d4055dfe2 Mon Sep 17 00:00:00 2001 From: HannesSommer Date: Fri, 21 Nov 2014 22:36:45 +0100 Subject: [PATCH] added CallRecord unit test --- .../nonlinear/tests/testCallRecord.cpp | 114 +++++++++++++++++- 1 file changed, 112 insertions(+), 2 deletions(-) diff --git a/gtsam_unstable/nonlinear/tests/testCallRecord.cpp b/gtsam_unstable/nonlinear/tests/testCallRecord.cpp index ab7e62419..a4561b349 100644 --- a/gtsam_unstable/nonlinear/tests/testCallRecord.cpp +++ b/gtsam_unstable/nonlinear/tests/testCallRecord.cpp @@ -22,12 +22,55 @@ #include +#include +#include + using namespace std; using namespace gtsam; /* ************************************************************************* */ static const int Cols = 3; + +int dynamicIfAboveMax(int i){ + if(i > MaxVirtualStaticRows){ + return Eigen::Dynamic; + } + else return i; +} +struct CallConfig { + int compTimeRows; + int compTimeCols; + int runTimeRows; + int runTimeCols; + CallConfig() {} + CallConfig(int rows, int cols): + compTimeRows(dynamicIfAboveMax(rows)), + compTimeCols(cols), + runTimeRows(rows), + runTimeCols(cols) + { + } + CallConfig(int compTimeRows, int compTimeCols, int runTimeRows, int runTimeCols): + compTimeRows(compTimeRows), + compTimeCols(compTimeCols), + runTimeRows(runTimeRows), + runTimeCols(runTimeCols) + { + } + + bool equals(const CallConfig & c, double /*tol*/) const { + return + this->compTimeRows == c.compTimeRows && + this->compTimeCols == c.compTimeCols && + this->runTimeRows == c.runTimeRows && + this->runTimeCols == c.runTimeCols; + } + void print(const std::string & prefix) const { + std::cout << prefix << "{" << compTimeRows << ", " << compTimeCols << ", " << runTimeRows << ", " << runTimeCols << "}\n" ; + } +}; + struct Record: public internal::CallRecordImplementor { virtual ~Record() { } @@ -35,15 +78,82 @@ struct Record: public internal::CallRecordImplementor { } void startReverseAD(JacobianMap& jacobians) const { } + + mutable CallConfig cc; + private: template void reverseAD(const SomeMatrix & dFdT, JacobianMap& jacobians) const { + cc.compTimeRows = SomeMatrix::RowsAtCompileTime; + cc.compTimeCols = SomeMatrix::ColsAtCompileTime; + cc.runTimeRows = dFdT.rows(); + cc.runTimeCols = dFdT.cols(); } + + template + friend struct internal::ReverseADImplementor; }; +JacobianMap & NJM= *static_cast(NULL); + /* ************************************************************************* */ -// Construct -TEST(CallRecord, constant) { +typedef Eigen::Matrix DynRowMat; + +TEST(CallRecord, virtualReverseAdDispatching) { Record record; + { + const int Rows = 1; + record.CallRecord::reverseAD(Eigen::Matrix(), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Rows, Cols)))); + record.CallRecord::reverseAD(DynRowMat(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Cols, Rows, Cols)))); + record.CallRecord::reverseAD(Eigen::MatrixXd(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Eigen::Dynamic, Rows, Cols)))); + } + { + const int Rows = 2; + record.CallRecord::reverseAD(Eigen::Matrix(), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Rows, Cols)))); + record.CallRecord::reverseAD(DynRowMat(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Cols, Rows, Cols)))); + record.CallRecord::reverseAD(Eigen::MatrixXd(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Eigen::Dynamic, Rows, Cols)))); + } + { + const int Rows = 3; + record.CallRecord::reverseAD(Eigen::Matrix(), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Rows, Cols)))); + record.CallRecord::reverseAD(DynRowMat(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Cols, Rows, Cols)))); + record.CallRecord::reverseAD(Eigen::MatrixXd(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Eigen::Dynamic, Rows, Cols)))); + } + { + const int Rows = MaxVirtualStaticRows; + record.CallRecord::reverseAD(Eigen::Matrix(), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Rows, Cols)))); + record.CallRecord::reverseAD(DynRowMat(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Cols, Rows, Cols)))); + record.CallRecord::reverseAD(Eigen::MatrixXd(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Eigen::Dynamic, Rows, Cols)))); + } + { + const int Rows = MaxVirtualStaticRows + 1; + record.CallRecord::reverseAD(Eigen::Matrix(), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Rows, Cols)))); + record.CallRecord::reverseAD(DynRowMat(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Cols, Rows, Cols)))); + record.CallRecord::reverseAD(Eigen::MatrixXd(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Eigen::Dynamic, Rows, Cols)))); + } + { + const int Rows = MaxVirtualStaticRows + 2; + record.CallRecord::reverseAD(Eigen::Matrix(), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Rows, Cols)))); + record.CallRecord::reverseAD(DynRowMat(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Cols, Rows, Cols)))); + record.CallRecord::reverseAD(Eigen::MatrixXd(Rows, Cols), NJM); + EXPECT((assert_equal(record.cc, CallConfig(Eigen::Dynamic, Eigen::Dynamic, Rows, Cols)))); + } } /* ************************************************************************* */