So-Bogus
A c++ sparse block matrix library aimed at Second Order cone problems
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
EigenSerialization.hpp
1 /*
2  * This file is part of bogus, a C++ sparse block matrix library.
3  *
4  * Copyright 2013 Gilles Daviet <gdaviet@gmail.com>
5  *
6  * This Source Code Form is subject to the terms of the Mozilla Public
7  * License, v. 2.0. If a copy of the MPL was not distributed with this
8  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 */
10 
11 #ifndef BOGUS_EIGEN_SERIALIZATION_HPP
12 #define BOGUS_EIGEN_SERIALIZATION_HPP
13 
14 #include <Eigen/Core>
15 
16 #ifndef BOGUS_BLOCK_WITHOUT_EIGEN_SPARSE
17 #include "SparseHeader.hpp"
18 #endif
19 
20 namespace boost
21 {
22 namespace serialization
23 {
24 
25 template<typename Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
26 inline void load(
27  Archive & ar,
28  Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> & matrix,
29  const unsigned int file_version
30  )
31 {
32  (void) file_version ;
33  ar & make_array( matrix.data(), matrix.size() ) ;
34 }
35 
36 template<typename Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
37 inline void save(
38  Archive & ar,
39  const Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> & matrix,
40  const unsigned int file_version
41  )
42 {
43  (void) file_version ;
44  ar & make_array( matrix.data(), matrix.size() ) ;
45 }
46 
47 
48 template<typename Archive, typename _Scalar, int _Cols, int _Options, int _MaxRows, int _MaxCols>
49 inline void load(
50  Archive & ar,
51  Eigen::Matrix<_Scalar, Eigen::Dynamic, _Cols, _Options, _MaxRows, _MaxCols> & matrix,
52  const unsigned int file_version
53  )
54 {
55  (void) file_version ;
56  int rows ;
57  ar & rows ;
58  matrix.resize( rows, _Cols ) ;
59  ar & make_array( matrix.data(), matrix.size() ) ;
60 }
61 
62 template<typename Archive, typename _Scalar, int _Cols, int _Options, int _MaxRows, int _MaxCols>
63 inline void save(
64  Archive & ar,
65  const Eigen::Matrix<_Scalar, Eigen::Dynamic, _Cols, _Options, _MaxRows, _MaxCols> & matrix,
66  const unsigned int file_version
67  )
68 {
69  (void) file_version ;
70  int rows = matrix.rows() ;
71  ar & rows ;
72  ar & make_array( matrix.data(), matrix.size() ) ;
73 }
74 
75 
76 template<typename Archive, typename _Scalar, int _Rows, int _Options, int _MaxRows, int _MaxCols>
77 inline void load(
78  Archive & ar,
79  Eigen::Matrix<_Scalar, _Rows, Eigen::Dynamic, _Options, _MaxRows, _MaxCols> & matrix,
80  const unsigned int file_version
81  )
82 {
83  (void) file_version ;
84  int cols ;
85  ar & cols ;
86  matrix.resize( _Rows, cols ) ;
87  ar & make_array( matrix.data(), matrix.size() ) ;
88 }
89 
90 template<typename Archive, typename _Scalar, int _Rows, int _Options, int _MaxRows, int _MaxCols>
91 inline void save(
92  Archive & ar,
93  const Eigen::Matrix<_Scalar, _Rows, Eigen::Dynamic, _Options, _MaxRows, _MaxCols> & matrix,
94  const unsigned int file_version
95  )
96 {
97  (void) file_version ;
98  int cols = matrix.cols() ;
99  ar & cols ;
100  ar & make_array( matrix.data(), matrix.size() ) ;
101 }
102 
103 template<typename Archive, typename _Scalar, int _Options, int _MaxRows, int _MaxCols>
104 inline void load(
105  Archive & ar,
106  Eigen::Matrix<_Scalar, Eigen::Dynamic, Eigen::Dynamic, _Options, _MaxRows, _MaxCols> & matrix,
107  const unsigned int file_version
108  )
109 {
110  (void) file_version ;
111  int rows, cols ;
112  ar & rows ;
113  ar & cols ;
114  matrix.resize( rows, cols ) ;
115  ar & make_array( matrix.data(), matrix.size() ) ;
116 }
117 
118 template<typename Archive, typename _Scalar, int _Options, int _MaxRows, int _MaxCols>
119 inline void save(
120  Archive & ar,
121  const Eigen::Matrix<_Scalar, Eigen::Dynamic, Eigen::Dynamic, _Options, _MaxRows, _MaxCols> & matrix,
122  const unsigned int file_version
123  )
124 {
125  (void) file_version ;
126  int rows = matrix.rows(), cols = matrix.cols() ;
127  ar & rows ;
128  ar & cols ;
129  ar & make_array( matrix.data(), matrix.size() ) ;
130 }
131 
132 template<typename Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
133 inline void serialize(
134  Archive & ar,
135  Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> & matrix,
136  const unsigned int file_version
137  )
138 {
139  split_free( ar, matrix, file_version ) ;
140 }
141 
142 #ifdef BOGUS_WITH_EIGEN_STABLE_SPARSE_API
143 
144 template<typename Archive, typename _Scalar, int _Options, typename _Index >
145 inline void load(
146  Archive & ar,
147  Eigen::SparseMatrix<_Scalar, _Options, _Index> & matrix,
148  const unsigned int file_version
149  )
150 {
151  (void) file_version ;
152  _Index rows, cols ;
153  unsigned nnz ;
154  ar & rows ;
155  ar & cols ;
156  ar & nnz ;
157  matrix.resize( rows, cols ) ;
158  matrix.resizeNonZeros( nnz ) ;
159  ar & make_array( matrix.outerIndexPtr(), matrix.outerSize()+1 ) ;
160  ar & make_array( matrix.innerIndexPtr(), nnz ) ;
161  ar & make_array( matrix.valuePtr(), nnz ) ;
162 }
163 
164 template<typename Archive, typename _Scalar, int _Options, typename _Index >
165 inline void save(
166  Archive & ar,
167  const Eigen::SparseMatrix<_Scalar, _Options, _Index> & matrix,
168  const unsigned int file_version
169  )
170 {
171  (void) file_version ;
172  assert( matrix.isCompressed() ) ;
173 
174  _Index rows = matrix.rows(), cols = matrix.cols() ;
175  unsigned nnz = matrix.data().size() ;
176  ar & rows ;
177  ar & cols ;
178  ar & nnz ;
179  ar & make_array( matrix.outerIndexPtr(), matrix.outerSize()+1 ) ;
180  ar & make_array( matrix.innerIndexPtr(), nnz ) ;
181  ar & make_array( matrix.valuePtr(), nnz ) ;
182 }
183 
184 template<typename Archive, typename _Scalar, int _Options, typename _Index >
185 inline void serialize(
186  Archive & ar,
187  Eigen::SparseMatrix<_Scalar, _Options, _Index> & matrix,
188  const unsigned int file_version
189  )
190 {
191  split_free( ar, matrix, file_version ) ;
192 }
193 
194 #endif
195 
196 } // serialization
197 } // boost
198 
199 #endif