From cbcfab4176b0577cc62e3cb77c3522cba90e2015 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Fri, 3 Jan 2025 13:09:25 -0500 Subject: [PATCH 1/4] serialize functions for Eigen::SparseVector --- gtsam/base/MatrixSerialization.h | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/gtsam/base/MatrixSerialization.h b/gtsam/base/MatrixSerialization.h index 11b6a417a..43c97097d 100644 --- a/gtsam/base/MatrixSerialization.h +++ b/gtsam/base/MatrixSerialization.h @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -87,6 +88,45 @@ void serialize(Archive& ar, gtsam::Matrix& m, const unsigned int version) { split_free(ar, m, version); } +/******************************************************************************/ +/// Customized functions for serializing Eigen::SparseVector +template +void save(Archive& ar, const Eigen::SparseVector<_Scalar, _Options, _Index>& m, + const unsigned int /*version*/) { + _Index size = m.size(); + + std::vector> data; + for (typename Eigen::SparseVector<_Scalar, _Options, _Index>::InnerIterator + it(m); + it; ++it) + data.push_back({it.index(), it.value()}); + + ar << BOOST_SERIALIZATION_NVP(size); + ar << BOOST_SERIALIZATION_NVP(data); +} + +template +void load(Archive& ar, Eigen::SparseVector<_Scalar, _Options, _Index>& m, + const unsigned int /*version*/) { + _Index size; + ar >> BOOST_SERIALIZATION_NVP(size); + m.resize(size); + + std::vector> data; + ar >> BOOST_SERIALIZATION_NVP(data); + + for (auto&& d : data) { + m.coeffRef(d.first) = d.second; + } +} + +template +void serialize(Archive& ar, Eigen::SparseVector<_Scalar, _Options, _Index>& m, + const unsigned int version) { + split_free(ar, m, version); +} +/******************************************************************************/ + } // namespace serialization } // namespace boost #endif From 5c4194e7cd800c8cd232f92a63dbd8e10b935340 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Fri, 3 Jan 2025 13:13:51 -0500 Subject: [PATCH 2/4] add serialization code to TableFactor --- gtsam/discrete/TableFactor.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gtsam/discrete/TableFactor.h b/gtsam/discrete/TableFactor.h index 5ddb4ab43..a2fdb4d32 100644 --- a/gtsam/discrete/TableFactor.h +++ b/gtsam/discrete/TableFactor.h @@ -31,6 +31,12 @@ #include #include +#if GTSAM_ENABLE_BOOST_SERIALIZATION +#include + +#include +#endif + namespace gtsam { class DiscreteConditional; @@ -342,6 +348,19 @@ class GTSAM_EXPORT TableFactor : public DiscreteFactor { double error(const HybridValues& values) const override; /// @} + + private: +#if GTSAM_ENABLE_BOOST_SERIALIZATION + /** Serialization function */ + friend class boost::serialization::access; + template + void serialize(ARCHIVE& ar, const unsigned int /*version*/) { + ar& BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base); + ar& BOOST_SERIALIZATION_NVP(sparse_table_); + ar& BOOST_SERIALIZATION_NVP(denominators_); + ar& BOOST_SERIALIZATION_NVP(sorted_dkeys_); + } +#endif }; // traits From ef2843c5b213e11463de8217e790a3e6e9cbbd25 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Fri, 3 Jan 2025 13:14:07 -0500 Subject: [PATCH 3/4] test for TableFactor serialization --- .../discrete/tests/testSerializationDiscrete.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/gtsam/discrete/tests/testSerializationDiscrete.cpp b/gtsam/discrete/tests/testSerializationDiscrete.cpp index df7df0b7e..9d15d0536 100644 --- a/gtsam/discrete/tests/testSerializationDiscrete.cpp +++ b/gtsam/discrete/tests/testSerializationDiscrete.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include using namespace std; @@ -32,6 +33,7 @@ BOOST_CLASS_EXPORT_GUID(Tree::Leaf, "gtsam_DecisionTreeStringInt_Leaf") BOOST_CLASS_EXPORT_GUID(Tree::Choice, "gtsam_DecisionTreeStringInt_Choice") BOOST_CLASS_EXPORT_GUID(DecisionTreeFactor, "gtsam_DecisionTreeFactor"); +BOOST_CLASS_EXPORT_GUID(TableFactor, "gtsam_TableFactor"); using ADT = AlgebraicDecisionTree; BOOST_CLASS_EXPORT_GUID(ADT, "gtsam_AlgebraicDecisionTree"); @@ -79,6 +81,19 @@ TEST(DiscreteSerialization, DecisionTreeFactor) { EXPECT(equalsBinary(f)); } +/* ************************************************************************* */ +// Check serialization for TableFactor +TEST(DiscreteSerialization, TableFactor) { + using namespace serializationTestHelpers; + + DiscreteKey A(Symbol('x', 1), 3); + TableFactor tf(A % "1/2/2"); + + EXPECT(equalsObj(tf)); + EXPECT(equalsXML(tf)); + EXPECT(equalsBinary(tf)); +} + /* ************************************************************************* */ // Check serialization for DiscreteConditional & DiscreteDistribution TEST(DiscreteSerialization, DiscreteConditional) { From 3718cb19edd21c718fe280c712a793031b6fd707 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Fri, 3 Jan 2025 13:35:13 -0500 Subject: [PATCH 4/4] use string based constructor --- gtsam/discrete/tests/testSerializationDiscrete.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/discrete/tests/testSerializationDiscrete.cpp b/gtsam/discrete/tests/testSerializationDiscrete.cpp index 9d15d0536..b118a00f6 100644 --- a/gtsam/discrete/tests/testSerializationDiscrete.cpp +++ b/gtsam/discrete/tests/testSerializationDiscrete.cpp @@ -87,7 +87,7 @@ TEST(DiscreteSerialization, TableFactor) { using namespace serializationTestHelpers; DiscreteKey A(Symbol('x', 1), 3); - TableFactor tf(A % "1/2/2"); + TableFactor tf(A, "1 2 2"); EXPECT(equalsObj(tf)); EXPECT(equalsXML(tf));