5#ifndef __pinocchio_serialization_eigen_matrix_hpp__ 6#define __pinocchio_serialization_eigen_matrix_hpp__ 9#include "pinocchio/math/tensor.hpp" 11#include <boost/serialization/split_free.hpp> 12#include <boost/serialization/vector.hpp> 13#include <boost/serialization/array.hpp> 19#if defined PINOCCHIO_WITH_HPP_FCL 20 #include <hpp/fcl/config.hh> 21 #if !HPP_FCL_VERSION_AT_LEAST(3, 0, 0) 22 #define HPP_FCL_SKIP_EIGEN_BOOST_SERIALIZATION 23 #include <hpp/fcl/serialization/eigen.h> 28 #if __GNUC__ >= 7 && __cplusplus >= 201703L 31 namespace serialization
41 struct traits<boost::serialization::U>
57 #if __GNUC__ >= 7 && __cplusplus >= 201703L 60 namespace serialization
70 struct traits<boost::serialization::U>
85#if (defined(_MSVC_LANG) && _MSVC_LANG >= 201703) 90 class binary_iarchive;
100 struct traits<boost::archive::binary_iarchive>
108 struct traits<boost::archive::xml_iarchive>
116 struct traits<boost::archive::text_iarchive>
129 namespace serialization
142 const Eigen::Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> & m,
145 Eigen::DenseIndex rows(m.rows()), cols(m.cols());
146 if (Rows == Eigen::Dynamic)
147 ar & BOOST_SERIALIZATION_NVP(rows);
148 if (Cols == Eigen::Dynamic)
149 ar & BOOST_SERIALIZATION_NVP(cols);
150 ar & make_nvp(
"data", make_array(m.data(), (
size_t)m.size()));
163 Eigen::Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> & m,
166 Eigen::DenseIndex rows = Rows, cols = Cols;
167 if (Rows == Eigen::Dynamic)
168 ar >> BOOST_SERIALIZATION_NVP(rows);
169 if (Cols == Eigen::Dynamic)
170 ar >> BOOST_SERIALIZATION_NVP(cols);
171 m.resize(rows, cols);
172 ar >> make_nvp(
"data", make_array(m.data(), (
size_t)m.size()));
185 Eigen::Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> & m,
186 const unsigned int version)
188 split_free(ar, m, version);
191 template<
class Archive,
typename PlainObjectBase,
int MapOptions,
typename Str
ideType>
194 const Eigen::Map<PlainObjectBase, MapOptions, StrideType> & m,
197 Eigen::DenseIndex rows(m.rows()), cols(m.cols());
198 if (PlainObjectBase::RowsAtCompileTime == Eigen::Dynamic)
199 ar & BOOST_SERIALIZATION_NVP(rows);
200 if (PlainObjectBase::ColsAtCompileTime == Eigen::Dynamic)
201 ar & BOOST_SERIALIZATION_NVP(cols);
202 ar & make_nvp(
"data", make_array(m.data(), (
size_t)m.size()));
205 template<
class Archive,
typename PlainObjectBase,
int MapOptions,
typename Str
ideType>
208 Eigen::Map<PlainObjectBase, MapOptions, StrideType> & m,
211 Eigen::DenseIndex rows = PlainObjectBase::RowsAtCompileTime,
212 cols = PlainObjectBase::ColsAtCompileTime;
213 if (PlainObjectBase::RowsAtCompileTime == Eigen::Dynamic)
214 ar >> BOOST_SERIALIZATION_NVP(rows);
215 if (PlainObjectBase::ColsAtCompileTime == Eigen::Dynamic)
216 ar >> BOOST_SERIALIZATION_NVP(cols);
217 m.resize(rows, cols);
218 ar >> make_nvp(
"data", make_array(m.data(), (
size_t)m.size()));
221 template<
class Archive,
typename PlainObjectBase,
int MapOptions,
typename Str
ideType>
224 Eigen::Map<PlainObjectBase, MapOptions, StrideType> & m,
225 const unsigned int version)
227 split_free(ar, m, version);
230#if !defined(PINOCCHIO_WITH_EIGEN_TENSOR_MODULE) \ 231 && ((__cplusplus <= 199711L && EIGEN_COMP_MSVC < 1900) || defined(__CUDACC__) || defined(EIGEN_AVOID_STL_ARRAY)) 232 template<
class Archive,
typename _IndexType, std::
size_t _NumIndices>
234 Archive & ar,
const Eigen::array<_IndexType, _NumIndices> & a,
const unsigned int )
236 ar & make_nvp(
"array", make_array(&a.front(), _NumIndices));
239 template<
class Archive,
typename _IndexType, std::
size_t _NumIndices>
241 load(Archive & ar, Eigen::array<_IndexType, _NumIndices> & a,
const unsigned int )
243 ar >> make_nvp(
"array", make_array(&a.front(), _NumIndices));
246 template<
class Archive,
typename _IndexType, std::
size_t _NumIndices>
248 serialize(Archive & ar, Eigen::array<_IndexType, _NumIndices> & a,
const unsigned int version)
250 split_free(ar, a, version);
253 template<
class Archive,
class T, std::
size_t N>
254 void save(Archive & ar,
const std::array<T, N> & a,
const unsigned int version)
256 typedef std::array<T, N> Array;
257 serialize(ar,
const_cast<Array &
>(a), version);
260 template<
class Archive,
class T, std::
size_t N>
261 void load(Archive & ar, std::array<T, N> & a,
const unsigned int version)
263 serialize(ar, a, version);
267#ifdef PINOCCHIO_WITH_EIGEN_TENSOR_MODULE 269 template<
class Archive,
typename _IndexType,
int _NumIndices>
271 Archive & ar,
const Eigen::DSizes<_IndexType, _NumIndices> & ds,
const unsigned int version)
273 save(ar,
static_cast<const Eigen::array<_IndexType, _NumIndices> &
>(ds), version);
276 template<
class Archive,
typename _IndexType,
int _NumIndices>
277 void load(Archive & ar, Eigen::DSizes<_IndexType, _NumIndices> & ds,
const unsigned int version)
279 load(ar,
static_cast<Eigen::array<_IndexType, _NumIndices> &
>(ds), version);
282 template<
class Archive,
typename _IndexType,
int _NumIndices>
284 serialize(Archive & ar, Eigen::DSizes<_IndexType, _NumIndices> & ds,
const unsigned int version)
286 split_free(ar,
static_cast<Eigen::array<_IndexType, _NumIndices> &
>(ds), version);
291 template<
class Archive,
typename _Scalar,
int _NumIndices,
int _Options,
typename _IndexType>
294 const ::pinocchio::Tensor<_Scalar, _NumIndices, _Options, _IndexType> & t,
297 typedef ::pinocchio::Tensor<_Scalar, _NumIndices, _Options, _IndexType> Tensor;
298 const typename Tensor::Dimensions & dimensions = t.dimensions();
300 ar & BOOST_SERIALIZATION_NVP(dimensions);
301 ar & make_nvp(
"data", make_array(t.data(), (
size_t)t.size()));
304 template<
class Archive,
typename _Scalar,
int _NumIndices,
int _Options,
typename _IndexType>
307 ::pinocchio::Tensor<_Scalar, _NumIndices, _Options, _IndexType> & t,
310 typedef ::pinocchio::Tensor<_Scalar, _NumIndices, _Options, _IndexType> Tensor;
311 typename Tensor::Dimensions dimensions;
313 ar >> BOOST_SERIALIZATION_NVP(dimensions);
314 t.resize(dimensions);
316 ar >> make_nvp(
"data", make_array(t.data(), (
size_t)t.size()));
319 template<
class Archive,
typename _Scalar,
int _NumIndices,
int _Options,
typename _IndexType>
322 ::pinocchio::Tensor<_Scalar, _NumIndices, _Options, _IndexType> & t,
323 const unsigned int version)
325 split_free(ar, t, version);