Tenncor
eigen.hpp
Go to the documentation of this file.
1 
9 #include "Eigen/Core"
10 #include "unsupported/Eigen/CXX11/Tensor"
11 
12 #include "teq/shape.hpp"
13 
14 #include "eteq/generated/dtype.hpp"
15 
16 #ifndef ETEQ_EIGEN_HPP
17 #define ETEQ_EIGEN_HPP
18 
19 namespace eteq
20 {
21 
23 using DimensionsT = std::array<Eigen::Index,8>;
24 
26 template <typename T>
27 using MatrixT = Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor>;
28 
30 template <typename T>
31 using MatMapT = Eigen::Map<MatrixT<T>>;
32 
34 template <typename T>
35 using TensorT = Eigen::Tensor<T,8>;
36 
38 template <typename T>
39 using TensMapT = Eigen::TensorMap<TensorT<T>>;
40 
42 template <typename T>
44 {
45  return MatMapT<T>(tens.data(),
46  tens.dimension(1), tens.dimension(0));
47 }
48 
50 template <typename T>
52 {
53  return MatMapT<T>(mat.data(), mat.rows(), mat.cols());
54 }
55 
57 template <typename T>
59 {
60  return MatMapT<T>(tens.data(),
61  tens.dimension(1), tens.dimension(0));
62 }
63 
65 template <typename T>
67 {
68  return TensMapT<T>(mat.data(),
69  mat.cols(), mat.rows(), 1,1,1,1,1,1);
70 }
71 
73 template <typename T>
75 {
76  return TensMapT<T>(tens.data(), tens.dimensions());
77 }
78 
80 template <typename T>
81 struct iEigen
82 {
83  virtual ~iEigen (void) = default;
84 
86  virtual void assign (void) = 0;
87 
89  virtual T* get_ptr (void) = 0;
90 };
91 
93 template <typename T>
94 using EigenptrT = std::shared_ptr<iEigen<T>>;
95 
97 template <typename T, typename EigenSource, typename EigenArgs>
98 struct EigenTensOp final : public iEigen<T>
99 {
101  std::function<EigenSource(EigenArgs&)> make_base, EigenArgs args) :
102  args_(args), tensorbase_(make_base(args_)), data_(dims) {}
103 
105  void assign (void) override
106  {
107  data_ = tensorbase_.reshape(data_.dimensions());
108  }
109 
111  T* get_ptr (void) override
112  {
113  return data_.data();
114  }
115 
117  EigenArgs args_;
118 
120  EigenSource tensorbase_;
121 
124 };
125 
127 template <typename T, typename EigenSource, typename EigenArgs>
128 struct EigenMatOp final : public iEigen<T>
129 {
131  std::function<EigenSource(EigenArgs&)> make_base, EigenArgs args) :
132  args_(args), matrixbase_(make_base(args_)),
133  data_(dims.at(1), dims.at(0)) {}
134 
136  void assign (void) override
137  {
138  data_ = matrixbase_;
139  }
140 
142  T* get_ptr (void) override
143  {
144  return data_.data();
145  }
146 
148  EigenArgs args_;
149 
151  EigenSource matrixbase_;
152 
155 };
156 
159 template <typename T, typename EigenSource, typename EigenArgs>
161  std::function<EigenSource(EigenArgs&)> make_base, EigenArgs args)
162 {
163  return std::make_shared<EigenTensOp<T,EigenSource,EigenArgs>>(
164  dims, make_base, args);
165 }
166 
169 template <typename T, typename EigenSource, typename EigenArgs>
171  std::function<EigenSource(EigenArgs&)> make_base, EigenArgs args)
172 {
173  return std::make_shared<EigenMatOp<T,EigenSource,EigenArgs>>(
174  dims, make_base, args);
175 }
176 
178 template <typename T>
179 inline TensorT<T> make_tensor (const teq::Shape& shape)
180 {
181  std::array<Eigen::Index,teq::rank_cap> slist;
182  std::copy(shape.begin(), shape.end(), slist.begin());
183  TensorT<T> out(slist);
184  out.setZero();
185  return out;
186 }
187 
189 template <typename T>
190 inline MatMapT<T> make_matmap (T* data, const teq::Shape& shape)
191 {
192  if (nullptr == data)
193  {
194  logs::fatal("cannot get matmap from nullptr");
195  }
196  return MatMapT<T>(data, shape.at(1), shape.at(0));
197 }
198 
200 template <typename T>
201 inline TensMapT<T> make_tensmap (T* data, const teq::Shape& shape)
202 {
203  std::array<Eigen::Index,teq::rank_cap> slist;
204  std::copy(shape.begin(), shape.end(), slist.begin());
205  if (nullptr == data)
206  {
207  logs::fatal("cannot get tensmap from nullptr");
208  }
209  return TensMapT<T>(data, slist);
210 }
211 
213 template <typename T>
215 {
216  auto slist = tens.dimensions();
217  return teq::Shape(std::vector<teq::DimT>(slist.begin(), slist.end()));
218 }
219 
221 template <typename T>
223 {
224  auto slist = tens.dimensions();
225  return teq::Shape(std::vector<teq::DimT>(slist.begin(), slist.end()));
226 }
227 
230 
231 }
232 
233 #endif // ETEQ_EIGEN_HPP
TensorT< T > data_
Output tensor data object.
Definition: eigen.hpp:123
teq::Shape get_shape(const TensorT< T > &tens)
Return the teq Shape representation of Eigen Tensor.
Definition: eigen.hpp:214
args
Definition: csv_to_png.py:105
Interface of generic Eigen data wrapper.
Definition: eigen.hpp:81
T * get_ptr(void) override
Implementation of iEigen<T>
Definition: eigen.hpp:111
virtual void assign(void)=0
Apply the assignment.
MatMapT< T > mat_to_matmap(MatrixT< T > &mat)
Return Map of Matrix.
Definition: eigen.hpp:51
Eigen::TensorMap< TensorT< T > > TensMapT
Eigen Tensor Map (reference)
Definition: eigen.hpp:39
Definition: constant.hpp:17
TensMapT< T > make_tensmap(T *data, const teq::Shape &shape)
Return Eigen Tensor given raw data and teq Shape.
Definition: eigen.hpp:201
Definition: shape.hpp:62
MatMapT< T > tens_to_matmap(TensorT< T > &tens)
Return Matrix Map given Tensor.
Definition: eigen.hpp:43
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > MatrixT
Eigen Matrix.
Definition: eigen.hpp:27
EigenMatOp(DimensionsT dims, std::function< EigenSource(EigenArgs &)> make_base, EigenArgs args)
Definition: eigen.hpp:130
EigenptrT< T > make_eigentensor(DimensionsT dims, std::function< EigenSource(EigenArgs &)> make_base, EigenArgs args)
Definition: eigen.hpp:160
Eigen::Map< MatrixT< T > > MatMapT
Eigen Matrix Map (reference)
Definition: eigen.hpp:31
T * get_ptr(void) override
Implementation of iEigen<T>
Definition: eigen.hpp:142
std::shared_ptr< iEigen< T > > EigenptrT
Smart point of generic Eigen data object.
Definition: eigen.hpp:94
EigenSource matrixbase_
Matrix operator.
Definition: eigen.hpp:151
EigenArgs args_
Matrix operator arguments.
Definition: eigen.hpp:148
Implementation of iEigen that assigns Tensor operator to Tensor object.
Definition: eigen.hpp:98
Implementation of iEigen that assigns Matrix operator to Matrix object.
Definition: eigen.hpp:128
MatMapT< T > tensmap_to_matmap(TensMapT< T > &tens)
Return Matrix Map of Tensor Map.
Definition: eigen.hpp:58
virtual ~iEigen(void)=default
EigenTensOp(DimensionsT dims, std::function< EigenSource(EigenArgs &)> make_base, EigenArgs args)
Definition: eigen.hpp:100
void assign(void) override
Implementation of iEigen<T>
Definition: eigen.hpp:105
TensorT< T > make_tensor(const teq::Shape &shape)
Return Eigen Tensor filled with 0s given teq Shape.
Definition: eigen.hpp:179
TensMapT< T > tens_to_tensmap(TensorT< T > &tens)
Return Tensor Map of Tensor.
Definition: eigen.hpp:74
EigenArgs args_
Tensor operator arguments.
Definition: eigen.hpp:117
Eigen::Tensor< T, 8 > TensorT
Eigen Tensor.
Definition: eigen.hpp:35
MatrixT< T > data_
Output matrix data object.
Definition: eigen.hpp:154
virtual T * get_ptr(void)=0
Return Eigen object output.
MatMapT< T > make_matmap(T *data, const teq::Shape &shape)
Return Eigen Matrix given raw data and teq Shape.
Definition: eigen.hpp:190
EigenptrT< T > make_eigenmatrix(DimensionsT dims, std::function< EigenSource(EigenArgs &)> make_base, EigenArgs args)
Definition: eigen.hpp:170
iterator end(void)
Return end iterator of internal array.
Definition: shape.hpp:162
iterator begin(void)
Return begin iterator of internal array.
Definition: shape.hpp:156
std::array< Eigen::Index, 8 > DimensionsT
Eigen shape.
Definition: eigen.hpp:23
void assign(void) override
Implementation of iEigen<T>
Definition: eigen.hpp:136
DimT at(RankT idx) const
Return DimT element at idx for any index in range [0:rank_cap)
Definition: shape.hpp:108
EigenSource tensorbase_
Tensor operator.
Definition: eigen.hpp:120
TensMapT< T > mat_to_tensmap(MatrixT< T > &mat)
Return Tensor Map of Matrix.
Definition: eigen.hpp:66
DimensionsT shape_convert(teq::Shape shape)
Return Eigen shape of teq Shape.