diff --git a/gtsam/base/ChartValue.h b/gtsam/base/ChartValue.h index a672d29ee..2f7cd5813 100644 --- a/gtsam/base/ChartValue.h +++ b/gtsam/base/ChartValue.h @@ -147,6 +147,24 @@ protected: private: /// Fake Tag struct for singleton pool allocator. In fact, it is never used! struct PoolTag { }; + +private: + + /// @} + /// @name Advanced Interface + /// @{ + + /** Serialization function */ + friend class boost::serialization::access; + template + void serialize(ARCHIVE & ar, const unsigned int version) { + ar & boost::serialization::make_nvp("value", GenericValue::value()); + // todo: implement a serialization for charts + //ar & boost::serialization::make_nvp("Chart", boost::serialization::base_object(*this)); + } + + /// @} + }; namespace traits { diff --git a/gtsam/base/GenericValue.h b/gtsam/base/GenericValue.h index 291bdd8f9..a4446d53c 100644 --- a/gtsam/base/GenericValue.h +++ b/gtsam/base/GenericValue.h @@ -61,6 +61,11 @@ public: return traits::equals(this->value_, genericValue2.value_, tol); } + // non virtual equals function + bool equals(const GenericValue &other, double tol = 1e-9) const { + return traits::equals(this->value(),other.value(),tol); + } + virtual void print(const std::string& str) const { traits::print(value_,str); } diff --git a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp index ee2f0d793..87c75dd5e 100644 --- a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp +++ b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp @@ -41,6 +41,8 @@ BOOST_CLASS_EXPORT(gtsam::PinholeCamera) BOOST_CLASS_EXPORT(gtsam::PinholeCamera) BOOST_CLASS_EXPORT(gtsam::PinholeCamera) +BOOST_CLASS_EXPORT(gtsam::ChartValue); + /* ************************************************************************* */ typedef PinholeCamera PinholeCal3S2; typedef PinholeCamera PinholeCal3DS2; @@ -56,12 +58,27 @@ static Cal3DS2 cal2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); static Cal3Bundler cal3(1.0, 2.0, 3.0); TEST (Serialization, TemplatedValues) { + std::cout << __LINE__ << std::endl; + EXPECT(equalsObj(pt3)); + std::cout << __LINE__ << std::endl; + ChartValue chv1(pt3); + std::cout << __LINE__ << std::endl; + EXPECT(equalsObj(chv1)); + std::cout << __LINE__ << std::endl; + PinholeCal3S2 pc(pose3,cal1); + EXPECT(equalsObj(pc)); + std::cout << __LINE__ << std::endl; Values values; + values.insert(1,pt3); + std::cout << __LINE__ << std::endl; + EXPECT(equalsObj(values)); + std::cout << __LINE__ << std::endl; values.insert(Symbol('a',0), PinholeCal3S2(pose3, cal1)); values.insert(Symbol('s',5), PinholeCal3DS2(pose3, cal2)); values.insert(Symbol('d',47), PinholeCal3Bundler(pose3, cal3)); values.insert(Symbol('a',5), PinholeCal3S2(pose3, cal1)); EXPECT(equalsObj(values)); + std::cout << __LINE__ << std::endl; EXPECT(equalsXML(values)); EXPECT(equalsBinary(values)); }