29 #ifndef __Serialization_H
30 #define __Serialization_H 1
32 #include <boost/multi_array.hpp>
33 #include <boost/serialization/split_free.hpp>
34 #include <boost/serialization/shared_ptr.hpp>
40 namespace serialization
42 template<
class Archive>
43 void load( Archive & ar,
44 boost::multi_array<double,2> & t,
45 const unsigned int file_version )
47 typedef boost::multi_array<double,2> multi_array_;
48 typedef typename multi_array_::size_type size_;
50 ar >> BOOST_SERIALIZATION_NVP( n0 );
52 ar >> BOOST_SERIALIZATION_NVP( n1 );
53 t.resize( boost::extents[n0][n1] );
54 ar >> make_array( t.data(), t.num_elements() );
56 template<
typename Archive>
57 void save( Archive & ar,
58 const boost::multi_array<double,2> & t,
59 const unsigned int file_version )
61 typedef boost::multi_array<double,2> multi_array_;
62 typedef typename multi_array_::size_type size_;
63 size_ n0 = ( t.shape()[0] );
64 ar << BOOST_SERIALIZATION_NVP( n0 );
65 size_ n1 = ( t.shape()[1] );
66 ar << BOOST_SERIALIZATION_NVP( n1 );
67 ar << boost::serialization::make_array( t.data(),
70 template<
class Archive>
71 void serialize( Archive & ar,
72 boost::multi_array<double,2>& t,
73 const unsigned int file_version )
75 split_free( ar, t, file_version );
80 template<
class Archive>
81 void load( Archive & ar,
82 boost::multi_array<double,3> & t,
83 const unsigned int file_version )
85 typedef boost::multi_array<double,3> multi_array_;
86 typedef typename multi_array_::size_type size_;
88 ar >> BOOST_SERIALIZATION_NVP( n0 );
90 ar >> BOOST_SERIALIZATION_NVP( n1 );
92 ar >> BOOST_SERIALIZATION_NVP( n2 );
93 t.resize( boost::extents[n0][n1][n2] );
94 ar >> make_array( t.data(), t.num_elements() );
96 template<
typename Archive>
97 void save( Archive & ar,
98 const boost::multi_array<double,3> & t,
99 const unsigned int file_version )
101 typedef boost::multi_array<double,3> multi_array_;
102 typedef typename multi_array_::size_type size_;
103 size_ n0 = ( t.shape()[0] );
104 ar << BOOST_SERIALIZATION_NVP( n0 );
105 size_ n1 = ( t.shape()[1] );
106 ar << BOOST_SERIALIZATION_NVP( n1 );
107 size_ n2 = ( t.shape()[2] );
108 ar << BOOST_SERIALIZATION_NVP( n2 );
109 ar << boost::serialization::make_array( t.data(),
112 template<
class Archive>
113 void serialize( Archive & ar,
114 boost::multi_array<double,3>& t,
115 const unsigned int file_version )
117 split_free( ar, t, file_version );
121 template<
class Archive>
122 void load( Archive & ar,
123 boost::multi_array<double,4> & t,
124 const unsigned int file_version )
126 typedef boost::multi_array<double,4> multi_array_;
127 typedef typename multi_array_::size_type size_;
129 ar >> BOOST_SERIALIZATION_NVP( n0 );
131 ar >> BOOST_SERIALIZATION_NVP( n1 );
133 ar >> BOOST_SERIALIZATION_NVP( n2 );
135 ar >> BOOST_SERIALIZATION_NVP( n3 );
136 t.resize( boost::extents[n0][n1][n2][n3] );
137 ar >> make_array( t.data(), t.num_elements() );
139 template<
typename Archive>
140 void save( Archive & ar,
141 const boost::multi_array<double,4> & t,
142 const unsigned int file_version )
144 typedef boost::multi_array<double,4> multi_array_;
145 typedef typename multi_array_::size_type size_;
146 size_ n0 = ( t.shape()[0] );
147 ar << BOOST_SERIALIZATION_NVP( n0 );
148 size_ n1 = ( t.shape()[1] );
149 ar << BOOST_SERIALIZATION_NVP( n1 );
150 size_ n2 = ( t.shape()[2] );
151 ar << BOOST_SERIALIZATION_NVP( n2 );
152 size_ n3 = ( t.shape()[3] );
153 ar << BOOST_SERIALIZATION_NVP( n3 );
154 ar << boost::serialization::make_array( t.data(),
157 template<
class Archive>
158 void serialize( Archive & ar,
159 boost::multi_array<double,4>& t,
160 const unsigned int file_version )
162 split_free( ar, t, file_version );
169 template<
class Archive>
170 void load( Archive & ar,
172 const unsigned int file_version )
175 ar >> BOOST_SERIALIZATION_NVP( n0 );
177 ar >> BOOST_SERIALIZATION_NVP( n1 );
179 ar >> make_array( t.data(), t.rows()*t.cols() );
181 template<
typename Archive>
182 void save( Archive & ar,
183 const Eigen::MatrixXd & t,
184 const unsigned int file_version )
187 ar << BOOST_SERIALIZATION_NVP( n0 );
189 ar << BOOST_SERIALIZATION_NVP( n1 );
190 ar << boost::serialization::make_array( t.data(),
193 template<
class Archive>
194 void serialize( Archive & ar,
196 const unsigned int file_version )
198 split_free( ar, t, file_version );
204 template<
class Archive>
205 void load( Archive & ar,
207 const unsigned int file_version )
210 ar >> BOOST_SERIALIZATION_NVP( n0 );
212 ar >> make_array( t.data(), t.size() );
214 template<
typename Archive>
215 void save( Archive & ar,
216 const Eigen::VectorXd & t,
217 const unsigned int file_version )
220 ar << BOOST_SERIALIZATION_NVP( n0 );
221 ar << boost::serialization::make_array( t.data(),
224 template<
class Archive>
225 void serialize( Archive & ar,
227 const unsigned int file_version )
229 split_free( ar, t, file_version );
236 template<
int N,
int M,
class Archive>
237 void load( Archive & ar,
238 Eigen::Matrix<double,N,M> & t,
239 const unsigned int file_version )
242 ar >> BOOST_SERIALIZATION_NVP( n0 );
244 ar >> BOOST_SERIALIZATION_NVP( n1 );
245 ar >> make_array( t.data(), n0*n1 );
247 template<
int N,
int M,
typename Archive>
248 void save( Archive & ar,
249 const Eigen::Matrix<double,N,M> & t,
250 const unsigned int file_version )
254 ar << BOOST_SERIALIZATION_NVP( n0 );
255 ar << BOOST_SERIALIZATION_NVP( n1 );
256 ar << boost::serialization::make_array( t.data(), n0*n1 );
258 template<
int N,
int M,
class Archive>
259 void serialize( Archive & ar,
260 Eigen::Matrix<double,N,M>& t,
261 const unsigned int file_version )
263 split_free( ar, t, file_version );
267 template<
class Archive>
268 void load( Archive & ar,
269 boost::multi_array<Eigen::MatrixXd,2> & t,
270 const unsigned int file_version )
272 typedef boost::multi_array<Eigen::MatrixXd,2> multi_array_;
273 typedef typename multi_array_::size_type size_;
275 ar >> BOOST_SERIALIZATION_NVP( n0 );
277 ar >> BOOST_SERIALIZATION_NVP( n1 );
278 t.resize( boost::extents[n0][n1] );
279 ar >> make_array( t.data(), t.num_elements() );
281 template<
typename Archive>
282 void save( Archive & ar,
283 const boost::multi_array<Eigen::MatrixXd,2> & t,
284 const unsigned int file_version )
286 typedef boost::multi_array<Eigen::MatrixXd,2> multi_array_;
287 typedef typename multi_array_::size_type size_;
288 size_ n0 = ( t.shape()[0] );
289 ar << BOOST_SERIALIZATION_NVP( n0 );
290 size_ n1 = ( t.shape()[1] );
291 ar << BOOST_SERIALIZATION_NVP( n1 );
292 ar << boost::serialization::make_array( t.data(),
295 template<
class Archive>
296 void serialize( Archive & ar,
297 boost::multi_array<Eigen::MatrixXd,2>& t,
298 const unsigned int file_version )
300 split_free( ar, t, file_version );
303 template<
class Archive>
304 void load( Archive & ar,
305 boost::multi_array<Eigen::VectorXd,2> & t,
306 const unsigned int file_version )
308 typedef boost::multi_array<Eigen::VectorXd,2> multi_array_;
309 typedef typename multi_array_::size_type size_;
311 ar >> BOOST_SERIALIZATION_NVP( n0 );
313 ar >> BOOST_SERIALIZATION_NVP( n1 );
314 t.resize( boost::extents[n0][n1] );
315 ar >> make_array( t.data(), t.num_elements() );
317 template<
typename Archive>
318 void save( Archive & ar,
319 const boost::multi_array<Eigen::VectorXd,2> & t,
320 const unsigned int file_version )
322 typedef boost::multi_array<Eigen::VectorXd,2> multi_array_;
323 typedef typename multi_array_::size_type size_;
324 size_ n0 = ( t.shape()[0] );
325 ar << BOOST_SERIALIZATION_NVP( n0 );
326 size_ n1 = ( t.shape()[1] );
327 ar << BOOST_SERIALIZATION_NVP( n1 );
328 ar << boost::serialization::make_array( t.data(),
331 template<
class Archive>
332 void serialize( Archive & ar,
333 boost::multi_array<Eigen::VectorXd,2>& t,
334 const unsigned int file_version )
336 split_free( ar, t, file_version );
344 template<
typename T1,
typename T2,
class Archive>
345 void load( Archive & ar,
346 boost::tuple<T1,T2> & t,
347 const unsigned int file_version )
350 ar >> BOOST_SERIALIZATION_NVP( x );
352 ar >> BOOST_SERIALIZATION_NVP( y );
353 t = boost::make_tuple( x,y );
355 template<
typename T1,
typename T2,
typename Archive>
356 void save( Archive & ar,
357 boost::tuple<T1,T2>
const& t,
358 const unsigned int file_version )
362 boost::tie( x,y ) = t;
363 ar << BOOST_SERIALIZATION_NVP( x );
364 ar << BOOST_SERIALIZATION_NVP( y );
366 template<
typename T1,
typename T2,
class Archive>
367 void serialize( Archive & ar,
368 boost::tuple<T1,T2> & t,
369 const unsigned int file_version )
371 split_free( ar, t, file_version );
380 template<
typename T1,
typename T2,
typename T3,
class Archive>
381 void load( Archive & ar,
382 boost::tuple<T1,T2,T3> & t,
383 const unsigned int file_version )
386 ar >> BOOST_SERIALIZATION_NVP( x );
388 ar >> BOOST_SERIALIZATION_NVP( y );
390 ar >> BOOST_SERIALIZATION_NVP( z );
391 t = boost::make_tuple( x,y,z );
393 template<
typename T1,
typename T2,
typename T3,
typename Archive>
394 void save( Archive & ar,
395 boost::tuple<T1,T2,T3>
const& t,
396 const unsigned int file_version )
401 boost::tie( x,y,z ) = t;
402 ar << BOOST_SERIALIZATION_NVP( x );
403 ar << BOOST_SERIALIZATION_NVP( y );
404 ar << BOOST_SERIALIZATION_NVP( z );
407 template<
typename T1,
typename T2,
typename T3,
class Archive>
408 void serialize( Archive & ar,
409 boost::tuple<T1,T2,T3> & t,
410 const unsigned int file_version )
412 split_free( ar, t, file_version );
419 template<
typename T1,
typename T2,
typename T3,
typename T4,
class Archive>
420 void load( Archive & ar,
421 boost::tuple<T1,T2,T3,T4> & t,
422 const unsigned int file_version )
425 ar >> BOOST_SERIALIZATION_NVP( x1 );
427 ar >> BOOST_SERIALIZATION_NVP( x2 );
429 ar >> BOOST_SERIALIZATION_NVP( x3 );
431 ar >> BOOST_SERIALIZATION_NVP( x4 );
432 t = boost::make_tuple( x1,x2,x3,x4 );
434 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename Archive>
435 void save( Archive & ar,
436 boost::tuple<T1,T2,T3,T4>
const& t,
437 const unsigned int file_version )
443 boost::tie( x1,x2,x3,x4 ) = t;
444 ar << BOOST_SERIALIZATION_NVP( x1 );
445 ar << BOOST_SERIALIZATION_NVP( x2 );
446 ar << BOOST_SERIALIZATION_NVP( x3 );
447 ar << BOOST_SERIALIZATION_NVP( x4 );
450 template<
typename T1,
typename T2,
typename T3,
typename T4,
class Archive>
451 void serialize( Archive & ar,
452 boost::tuple<T1,T2,T3,T4> & t,
453 const unsigned int file_version )
455 split_free( ar, t, file_version );