Modified serialization of Vector and Matrix to support binary files

release/4.3a0
Stephen Williams 2013-05-08 13:23:50 +00:00
parent 07c4c95f18
commit bbf9bad6d7
2 changed files with 28 additions and 31 deletions

View File

@ -489,31 +489,28 @@ Eigen::Matrix<double, N, N> Cayley(const Eigen::Matrix<double, N, N>& A) {
} // namespace gtsam } // namespace gtsam
#include <boost/serialization/nvp.hpp> #include <boost/serialization/nvp.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/split_free.hpp> #include <boost/serialization/split_free.hpp>
namespace boost { namespace boost {
namespace serialization { namespace serialization {
// split version - sends sizes ahead // split version - sends sizes ahead
template<class Archive> template<class Archive>
void save(Archive & ar, const gtsam::Matrix & m, unsigned int version) { void save(Archive & ar, const gtsam::Matrix & m, unsigned int version) {
const int rows = m.rows(), cols = m.cols(), elements = rows * cols; const size_t rows = m.rows(), cols = m.cols();
std::vector<double> raw_data(elements); ar << BOOST_SERIALIZATION_NVP(rows);
std::copy(m.data(), m.data() + elements, raw_data.begin()); ar << BOOST_SERIALIZATION_NVP(cols);
ar << make_nvp("rows", rows); ar << make_nvp("data", make_array(m.data(), m.size()));
ar << make_nvp("cols", cols);
ar << make_nvp("data", raw_data);
} }
template<class Archive> template<class Archive>
void load(Archive & ar, gtsam::Matrix & m, unsigned int version) { void load(Archive & ar, gtsam::Matrix & m, unsigned int version) {
size_t rows, cols; size_t rows, cols;
std::vector<double> raw_data; ar >> BOOST_SERIALIZATION_NVP(rows);
ar >> make_nvp("rows", rows); ar >> BOOST_SERIALIZATION_NVP(cols);
ar >> make_nvp("cols", cols); m.resize(rows, cols);
ar >> make_nvp("data", raw_data); ar >> make_nvp("data", make_array(m.data(), m.size()));
m = gtsam::Matrix(rows, cols);
std::copy(raw_data.begin(), raw_data.end(), m.data());
} }
} // namespace serialization } // namespace serialization

View File

@ -351,29 +351,29 @@ GTSAM_EXPORT Vector concatVectors(size_t nrVectors, ...);
} // namespace gtsam } // namespace gtsam
#include <boost/serialization/nvp.hpp> #include <boost/serialization/nvp.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/split_free.hpp> #include <boost/serialization/split_free.hpp>
namespace boost { namespace boost {
namespace serialization { namespace serialization {
// split version - copies into an STL vector for serialization // split version - copies into an STL vector for serialization
template<class Archive> template<class Archive>
void save(Archive & ar, const gtsam::Vector & v, unsigned int version) void save(Archive & ar, const gtsam::Vector & v, unsigned int version) {
{ const size_t size = v.size();
const size_t n = v.size(); ar << BOOST_SERIALIZATION_NVP(size);
std::vector<double> raw_data(n); ar << make_nvp("data", make_array(v.data(), v.size()));
copy(v.data(), v.data()+n, raw_data.begin()); }
ar << make_nvp("data", raw_data);
}
template<class Archive>
void load(Archive & ar, gtsam::Vector & v, unsigned int version)
{
std::vector<double> raw_data;
ar >> make_nvp("data", raw_data);
v = gtsam::Vector_(raw_data);
}
} // namespace serialization template<class Archive>
void load(Archive & ar, gtsam::Vector & v, unsigned int version) {
size_t size;
ar >> BOOST_SERIALIZATION_NVP(size);
v.resize(size);
ar >> make_nvp("data", make_array(v.data(), v.size()));
}
} // namespace serialization
} // namespace boost } // namespace boost
BOOST_SERIALIZATION_SPLIT_FREE(gtsam::Vector) BOOST_SERIALIZATION_SPLIT_FREE(gtsam::Vector)