31 #ifndef EIGEN_SERIALIZATION_HPP 32 #define EIGEN_SERIALIZATION_HPP 34 #include <core/storage/serialization/serialization_includes.hpp> 35 #include <core/logging/assertions.hpp> 41 #define _EIGEN_TEMPLATE_ARGS(prefix) \ 42 typename prefix##Scalar, \ 43 int prefix##Rows, int prefix##Cols, \ 44 int prefix##Options, int prefix##MaxRows, int prefix##MaxCols 46 #define _EIGEN_TEMPLATE_ARG_DEF(prefix) \ 48 prefix##Rows, prefix##Cols, \ 49 prefix##Options, prefix##MaxRows, prefix##MaxCols 58 template<_EIGEN_TEMPLATE_ARGS(_)>
class Matrix;
60 template<_EIGEN_TEMPLATE_ARGS(_)>
class Array;
62 template <
typename _Scalar,
int _Flags,
typename _Index>
class SparseVector;
65 namespace turi {
namespace archive_detail {
70 template <
typename InArcType,
71 template <_EIGEN_TEMPLATE_ARGS(__)>
class EigenContainer,
72 _EIGEN_TEMPLATE_ARGS(_)>
73 void eigen_serialize_impl(InArcType& arc,
const EigenContainer<_EIGEN_TEMPLATE_ARG_DEF(_)>& X) {
89 typedef typename EigenContainer<_EIGEN_TEMPLATE_ARG_DEF(_)>::Index index_type;
91 const index_type rows = X.rows();
92 const index_type cols = X.cols();
96 turi::serialize(arc, X.data(), rows*cols*
sizeof(_Scalar));
102 template <
typename InArcType,
103 template <_EIGEN_TEMPLATE_ARGS(__)>
class EigenContainer,
104 _EIGEN_TEMPLATE_ARGS(_)>
105 void eigen_deserialize_impl(InArcType& arc, EigenContainer<_EIGEN_TEMPLATE_ARG_DEF(_)>& X) {
133 typedef typename EigenContainer<_EIGEN_TEMPLATE_ARG_DEF(_)>::Index index_type;
135 index_type rows, cols;
140 turi::deserialize(arc, X.data(), rows*cols*
sizeof(_Scalar));
148 template <
typename InArcType, _EIGEN_TEMPLATE_ARGS(_)>
149 struct deserialize_impl<InArcType,
Eigen::Matrix<_EIGEN_TEMPLATE_ARG_DEF(_)>, false> {
151 static void exec(InArcType& arc, Eigen::Matrix<_EIGEN_TEMPLATE_ARG_DEF(_)>& X) {
152 eigen_deserialize_impl(arc, X);
156 template <
typename OutArcType, _EIGEN_TEMPLATE_ARGS(_)>
157 struct serialize_impl<OutArcType,
Eigen::Matrix<_EIGEN_TEMPLATE_ARG_DEF(_)>, false> {
159 static void exec(OutArcType& arc,
const Eigen::Matrix<_EIGEN_TEMPLATE_ARG_DEF(_)>& X) {
160 eigen_serialize_impl(arc, X);
168 template <
typename InArcType, _EIGEN_TEMPLATE_ARGS(_)>
169 struct deserialize_impl<InArcType,
Eigen::Array<_EIGEN_TEMPLATE_ARG_DEF(_)>, false> {
171 static void exec(InArcType& arc, Eigen::Array<_EIGEN_TEMPLATE_ARG_DEF(_)>& X) {
172 eigen_deserialize_impl(arc, X);
176 template <
typename OutArcType, _EIGEN_TEMPLATE_ARGS(_)>
177 struct serialize_impl<OutArcType,
Eigen::Array<_EIGEN_TEMPLATE_ARG_DEF(_)>, false> {
179 static void exec(OutArcType& arc,
const Eigen::Array<_EIGEN_TEMPLATE_ARG_DEF(_)>& X) {
180 eigen_serialize_impl(arc, X);
188 template <
typename InArcType,
typename _Scalar,
int _Flags,
typename _Index>
189 struct deserialize_impl<InArcType,
Eigen::SparseVector<_Scalar, _Flags, _Index>, false> {
191 static void exec(InArcType& arc, Eigen::SparseVector<_Scalar, _Flags, _Index>& vec) {
195 ASSERT_EQ(version, 1);
197 size_t _size, _nnz, index;
206 for(
size_t i = 0; i < _nnz; i++) {
209 vec.coeffRef(index) = value;
214 template <
typename OutArcType,
typename _Scalar,
int _Flags,
typename _Index>
215 struct serialize_impl<OutArcType,
Eigen::SparseVector<_Scalar, _Flags, _Index>, false> {
217 static void exec(OutArcType& arc,
const Eigen::SparseVector<_Scalar, _Flags, _Index>& vec) {
222 arc << (size_t)vec.size() << (size_t)vec.nonZeros();
224 for (
typename Eigen::SparseVector<_Scalar, _Flags, _Index>::InnerIterator i(vec); i; ++i) {
225 arc << (size_t)i.index() << (double)i.value();
232 #undef _EIGEN_TEMPLATE_ARGS 233 #undef _EIGEN_TEMPLATE_ARG_DEF