MachineIntelligenceCore:Algorithms
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
MatrixArray.hpp
Go to the documentation of this file.
1 
21 #ifndef __MATRIXARRAY_H__
22 #define __MATRIXARRAY_H__
23 
24 #include <types/MatrixTypes.hpp>
25 #include <string>
26 #include <map>
27 #include <stdio.h>
28 #include <exception>
29 
30 
31 // Forward declaration of class boost::serialization::access
32 namespace boost {
33 namespace serialization {
34 class access;
35 }//: serialization
36 }//: access
37 
38 namespace mic {
39 namespace types {
40 
41 
72 template<typename T>
73 class MatrixArray {
74 public:
75 
79  MatrixArray() = default;
80 
85  MatrixArray(std::string name_) : array_name ( name_ ) {
86  }
87 
88 
94  MatrixArray ( std::string name_, std::initializer_list<std::tuple<std::string, size_t, size_t> > args_) : array_name ( name_ ) {
95 
96  add ( args_ );
97 
98  }
99 
100  MatrixArray ( const MatrixArray& other ) {
101  // Copy name.
102  array_name = other.array_name;
103 
104  keys_map.clear();
105  matrices.clear();
106  // Copy data.
107  for (auto& i: other.keys_map) {
108  std::string tmp_name = i.first;
109  mic::types::MatrixPtr<T> tmp_mat_ptr = other.matrices[i.second];
110 
111  // Add tuple to array.
112  keys_map[ tmp_name ] = matrices.size();
113  matrices.push_back ( std::make_shared<mic::types::Matrix<T> > (mic::types::Matrix<T> (*tmp_mat_ptr) ) );
114  }//: for
115 
116  }
117 
118  MatrixArray& operator= ( const MatrixArray& other ) {
119  // Copy name.
120  array_name = other.array_name;
121 
122  keys_map.clear();
123  matrices.clear();
124  // Copy data.
125  for (auto& i: other.keys_map) {
126  std::string tmp_name = i.first;
127  mic::types::MatrixPtr<T> tmp_mat_ptr = other.matrices[i.second];
128 
129  // Add tuple to array.
130  keys_map[ tmp_name ] = matrices.size();
131  matrices.push_back ( std::make_shared<mic::types::Matrix<T> > (mic::types::Matrix<T> (*tmp_mat_ptr) ) );
132  }//: for
133 
134  return *this;
135  }
136 
141  void add ( std::initializer_list<std::tuple<std::string, size_t, size_t> > params_ ) {
142  for ( auto i : params_ ) {
143  keys_map[std::get<0> ( i )] = matrices.size();
144  matrices.push_back ( std::make_shared<mic::types::Matrix<T> > ( mic::types::Matrix<T> ( std::get<1> ( i ), std::get<2> ( i ) ) ) );
145  }//: for
146  }
147 
152  void add ( std::tuple<std::string, size_t, size_t> param_ ) {
153  keys_map[std::get<0> ( param_ )] = matrices.size();
154  matrices.push_back ( std::make_shared<mic::types::Matrix<T> > ( mic::types::Matrix<T> ( std::get<1> ( param_ ), std::get<2> ( param_ ) ) ) );
155  }
156 
163  void add ( std::string name_, size_t input_, size_t output_) {
164  keys_map[name_] = matrices.size();
165  matrices.push_back ( std::make_shared<mic::types::Matrix<T> > ( mic::types::Matrix<T> ( input_, output_ ) ) );
166  }
167 
173  void add ( std::string name_, std::shared_ptr<mic::types::Matrix<T> > matrix_ptr_) {
174  keys_map[name_] = matrices.size();
175  matrices.push_back ( matrix_ptr_);
176  }
177 
184  if (number_ >= matrices.size())
185  throw std::range_error("MatrixArray " + array_name + " size is smaller than: " + std::to_string(number_));
186 
187  return matrices[number_];
188  }
189 
194  inline bool keyExists(char key_) {
195  return (keys_map.find ( std::to_string(key_) ) == keys_map.end());
196  }
197 
202  inline bool keyExists(std::string key_) {
203  return keys_map.find ( key_ ) != keys_map.end();
204  }
205 
206 
213  if ( !keyExists(key_) )
214  throw std::range_error("MatrixArray " + array_name + " does not have a key " + key_);
215 
216  return ( *this ) [std::string ( 1, key_ )];
217  }
218 
224  mic::types::MatrixPtr<T>& operator[] ( std::string key_ ) {
225  if ( !keyExists(key_) )
226  throw std::range_error("MatrixArray " + array_name + " does not have a key " + key_);
227 
228  return matrices[keys_map[key_]];
229  }
230 
236  friend std::ostream& operator<<(std::ostream& os_, const MatrixArray& obj_) {
237  // Display name
238  os_ << "[" << obj_.array_name << "]:\n";
239  for (auto& i: obj_.keys_map) {
240  // Display elements.
241  os_ << "(" << i.second << ") [" << i.first << "]:\n";
242  os_ << (*obj_.matrices[i.second]) << std::endl;
243  }
244  return os_;
245  }
246 
250  void setZero() {
251 
252  for ( size_t i = 0; i < matrices.size(); i++ )
253  matrices[i]->setZero();
254  }
255 
259  std::string name() {
260  return array_name;
261  }
262 
266  std::map<std::string, size_t> keys() {
267  return keys_map;
268  }
269 
273  size_t size() {
274  return matrices.size();
275  }
276 
277 protected:
279  std::string array_name;
280 
282  std::vector<mic::types::MatrixPtr<T> > matrices;
283 
284 
286  std::map<std::string, size_t> keys_map;
287 
288 private:
289  // Friend class - required for using boost serialization.
291 
297  template<class Archive>
298  void save(Archive & ar, const unsigned int version) const {
299  // Serialize name and size.
300  ar & array_name;
301  size_t size = matrices.size();
302  ar & size;
303  // Serialize elements.
304  for (auto& i: keys_map) {
305  ar & i.first;
306  ar & (*matrices[i.second]);
307  }//: for
308  }
309 
315  template<class Archive>
316  void load(Archive & ar, const unsigned int version) {
317  // Deserialize name and size.
318  ar & array_name;
319  size_t size;
320  ar & size;
321  // Deserialize elements.
322  for (size_t i=0; i < size; i++) {
323  std::string tmp_name;
324  ar & tmp_name;
325  mic::types::Matrix<T> tmp_mat;
326  ar & tmp_mat;
327  // Add tuple to array.
328  keys_map[ tmp_name ] = matrices.size();
329  matrices.push_back ( std::make_shared<mic::types::Matrix<T> > (mic::types::Matrix<T> (tmp_mat) ) );
330 
331  }//: for
332 
333  }
334 
335  // The serialization must be splited as load requires to allocate the memory.
336  BOOST_SERIALIZATION_SPLIT_MEMBER()
337 
338 };
339 
340 }//: namespace types
341 }//: namespace mic
342 
343 // Just in the case that something important will change in the MatrixArray class - set version.
344 BOOST_CLASS_VERSION(mic::types::MatrixArray<bool>, 1)
345 BOOST_CLASS_VERSION(mic::types::MatrixArray<short>, 1)
346 BOOST_CLASS_VERSION(mic::types::MatrixArray<int>, 1)
347 BOOST_CLASS_VERSION(mic::types::MatrixArray<long>, 1)
348 BOOST_CLASS_VERSION(mic::types::MatrixArray<float>, 1)
349 BOOST_CLASS_VERSION(mic::types::MatrixArray<double>, 1)
350 
351 
352 
353 #endif /*__MATRIXARRAY_H__*/
void save(Archive &ar, const unsigned int version) const
void load(Archive &ar, const unsigned int version)
void add(std::string name_, std::shared_ptr< mic::types::Matrix< T > > matrix_ptr_)
MatrixArray(const MatrixArray &other)
Contains definition of basic matrix datatypes derived from Eigen.
std::string array_name
Name of the given vector of matrices.
std::vector< mic::types::MatrixPtr< T > > matrices
Vector of matrices.
MatrixArray(std::string name_)
Definition: MatrixArray.hpp:85
MatrixArray(std::string name_, std::initializer_list< std::tuple< std::string, size_t, size_t > > args_)
Definition: MatrixArray.hpp:94
std::map< std::string, size_t > keys_map
Vector of names of consecutive matrices in the array.
void add(std::tuple< std::string, size_t, size_t > param_)
A dynamic array of matrices. It's just what it looks like - std::vector<Matrix>; elements are are acc...
Definition: MatrixArray.hpp:73
friend class boost::serialization::access
bool keyExists(char key_)
bool keyExists(std::string key_)
typename std::shared_ptr< mic::types::Matrix< T > > MatrixPtr
Typedef for a shared pointer to template-typed dynamic matrices.
Definition: Matrix.hpp:479
std::map< std::string, size_t > keys()
friend std::ostream & operator<<(std::ostream &os_, const MatrixArray &obj_)
MatrixArray & operator=(const MatrixArray &other)
mic::types::MatrixPtr< T > & operator[](size_t number_)
Template-typed Matrix of dynamic size. Uses OpenBLAS if found by CMAKE - overloaded, specializations of * operator for types: float, double.
Definition: Matrix.hpp:64
void add(std::initializer_list< std::tuple< std::string, size_t, size_t > > params_)
void add(std::string name_, size_t input_, size_t output_)