Tenncor
operator.hpp
Go to the documentation of this file.
1 
10 #include "eteq/eigen.hpp"
11 #include "eteq/coord.hpp"
12 #include "eteq/random.hpp"
13 
14 #ifndef ETEQ_OPERATOR_HPP
15 #define ETEQ_OPERATOR_HPP
16 
17 namespace eteq
18 {
19 
20 static inline bool is_2d (teq::Shape shape)
21 {
22  return std::all_of(shape.begin() + 2, shape.end(),
23  [](teq::DimT dim) { return 1 == dim; });
24 }
25 
27 template <typename T>
28 struct OpArg final
29 {
30  OpArg (T* data, teq::Shape shape, CoordMap* coorder) :
31  data_(data), shape_(shape), coorder_(coorder) {}
32 
34  T* data_;
35 
38 
40  CoordMap* coorder_ = nullptr;
41 };
42 
44 template <typename OP, size_t N, typename T>
45 using ReduceOutT = Eigen::TensorReductionOp<OP,
46  const std::array<teq::RankT,N>,const TensMapT<T>>;
47 
48 namespace internal
49 {
50 
52 template <size_t N>
53 inline std::array<teq::RankT,N> dim_copy (std::vector<teq::RankT> d)
54 {
55  std::array<teq::RankT,N> out;
56  auto it = d.begin();
57  std::copy(it, it + N, out.begin());
58  return out;
59 }
60 
61 #define _ETEQ_INTERNAL_V2A_CASE(N, PROCESS, RED)\
62 case N: return make_eigentensor<T,ReduceOutT<RED,N,T>,TensMapT<T>>(\
63 shape_convert(outshape), [vdims](TensMapT<T>& in) {\
64 return in.PROCESS(::eteq::internal::dim_copy<N>(vdims)); },\
65 make_tensmap(in.data_, in.shape_));
66 
67 #define _ETEQ_INTERNAL_V2A(PROCESS, RED) {\
68  assert(nullptr != in.coorder_);\
69  teq::CoordT coord;\
70  in.coorder_->forward(coord.begin(), coord.begin());\
71  std::vector<teq::RankT> vdims;\
72  std::copy_if(coord.begin(), coord.end(), std::back_inserter(vdims),\
73  [](teq::RankT d) { return d < teq::rank_cap; });\
74  switch (vdims.size()) {\
75  _ETEQ_INTERNAL_V2A_CASE(0, PROCESS, RED)\
76  _ETEQ_INTERNAL_V2A_CASE(1, PROCESS, RED)\
77  _ETEQ_INTERNAL_V2A_CASE(2, PROCESS, RED)\
78  _ETEQ_INTERNAL_V2A_CASE(3, PROCESS, RED)\
79  _ETEQ_INTERNAL_V2A_CASE(4, PROCESS, RED)\
80  _ETEQ_INTERNAL_V2A_CASE(5, PROCESS, RED)\
81  _ETEQ_INTERNAL_V2A_CASE(6, PROCESS, RED)\
82  _ETEQ_INTERNAL_V2A_CASE(7, PROCESS, RED)\
83  default: break;\
84  } return make_eigentensor<T,ReduceOutT<RED,8,T>,TensMapT<T>>(\
85  shape_convert(outshape), [vdims](TensMapT<T>& in) {\
86  return in.PROCESS(::eteq::internal::dim_copy<8>(vdims));\
87  }, make_tensmap(in.data_, in.shape_));\
88 }
89 
90 }
91 
93 template <typename T>
95 _ETEQ_INTERNAL_V2A(sum, Eigen::internal::SumReducer<T>)
96 
97 template <typename T>
99 EigenptrT<T> reduce_prod (teq::Shape& outshape, const OpArg<T>& in)
100 _ETEQ_INTERNAL_V2A(prod, Eigen::internal::ProdReducer<T>)
101 
102 template <typename T>
104 EigenptrT<T> reduce_min (teq::Shape& outshape, const OpArg<T>& in)
105 _ETEQ_INTERNAL_V2A(minimum, Eigen::internal::MinReducer<T>)
106 
107 template <typename T>
109 EigenptrT<T> reduce_max (teq::Shape& outshape, const OpArg<T>& in)
110 _ETEQ_INTERNAL_V2A(maximum, Eigen::internal::MaxReducer<T>)
111 
112 template <typename T>
114 EigenptrT<T> extend (teq::Shape& outshape, const OpArg<T>& in)
115 {
116  assert(nullptr != in.coorder_);
117  teq::CoordT coord;
118  in.coorder_->forward(coord.begin(), coord.begin());
119  return make_eigentensor<T,Eigen::TensorBroadcastingOp<
120  const teq::CoordT,const TensMapT<T>>,TensMapT<T>>(
121  shape_convert(outshape),
122  [coord](TensMapT<T>& in)
123  {
124  return in.broadcast(coord);
125  }, make_tensmap(in.data_, in.shape_));
126 }
127 
129 template <typename T>
130 EigenptrT<T> permute (teq::Shape& outshape, const OpArg<T>& in)
131 {
132  assert(nullptr != in.coorder_);
133  teq::CoordT reorder;
134  in.coorder_->forward(reorder.begin(), reorder.begin());
135  if (is_2d(outshape) && reorder[0] == 1 && reorder[1] == 0)
136  {
137  // use matrix when possible
138  return make_eigenmatrix<T,Eigen::Transpose<MatMapT<T>>,
139  MatMapT<T>>(
140  shape_convert(outshape),
141  [](MatMapT<T>& in)
142  {
143  return in.transpose();
144  }, make_matmap(in.data_, in.shape_));
145  }
146  return make_eigentensor<T,Eigen::TensorShufflingOp<
148  shape_convert(outshape),
149  [reorder](TensMapT<T>& in)
150  {
151  return in.shuffle(reorder);
152  }, make_tensmap(in.data_, in.shape_));
153 }
154 
156 template <typename T>
157 EigenptrT<T> slice (teq::Shape& outshape, const OpArg<T>& in)
158 {
159  assert(nullptr != in.coorder_);
160  teq::CoordT slicing;
161  in.coorder_->forward(slicing.begin(), slicing.begin());
162  teq::ShapeT offset;
163  teq::ShapeT extent;
164  std::fill(offset.begin(), offset.end(), 0);
165  std::copy(in.shape_.begin(), in.shape_.end(), extent.begin());
166  teq::RankT dimension = slicing[2];
167  offset[dimension] = slicing[0];
168  extent[dimension] = slicing[1];
169  return make_eigentensor<T,Eigen::TensorSlicingOp<
170  const teq::ShapeT, const teq::ShapeT,
172  >,
173  TensMapT<T>>(
174  shape_convert(outshape),
175  [&offset, &extent](TensMapT<T>& in)
176  {
177  return in.slice(offset, extent);
178  }, make_tensmap(in.data_, in.shape_));
179 }
180 
182 template <typename T>
183 EigenptrT<T> pad (teq::Shape& outshape, const OpArg<T>& in)
184 {
185  assert(nullptr != in.coorder_);
186  teq::CoordT padding;
187  in.coorder_->forward(padding.begin(), padding.begin());
188  std::array<std::pair<teq::DimT,teq::DimT>,teq::rank_cap> paddings;
189  for (teq::RankT i = 0; i < teq::rank_cap; ++i)
190  {
191  paddings[i] = std::make_pair(0, 0);
192  }
193  paddings[padding[2]] = std::make_pair(padding[0], padding[1]);
194  return make_eigentensor<T,Eigen::TensorPaddingOp<
195  const std::array<std::pair<teq::DimT,teq::DimT>,teq::rank_cap>,
196  const TensMapT<T>
197  >,
198  TensMapT<T>>(
199  shape_convert(outshape),
200  [&paddings](TensMapT<T>& in)
201  {
202  return in.pad(paddings);
203  }, make_tensmap(in.data_, in.shape_));
204 }
205 
207 template <typename T>
208 EigenptrT<T> stride (teq::Shape& outshape, const OpArg<T>& in)
209 {
210  assert(nullptr != in.coorder_);
211  teq::CoordT incrs_tmp;
212  in.coorder_->forward(incrs_tmp.begin(), incrs_tmp.end());
213  Eigen::array<Eigen::DenseIndex,teq::rank_cap> incrs;
214  std::copy(incrs_tmp.begin(), incrs_tmp.end(), incrs.begin());
215  return make_eigentensor<T,Eigen::TensorStridingOp<
216  const Eigen::array<Eigen::DenseIndex,teq::rank_cap>,
218  >,
219  TensMapT<T>>(
220  shape_convert(outshape),
221  [&incrs](TensMapT<T>& in)
222  {
223  return in.stride(incrs);
224  }, make_tensmap(in.data_, in.shape_));
225 }
226 
229 template <typename T>
230 EigenptrT<T> abs (teq::Shape& outshape, const OpArg<T>& in)
231 {
232  if (is_2d(outshape))
233  {
234  // use matrix when possible
235  return make_eigenmatrix<T,Eigen::CwiseUnaryOp<
236  Eigen::internal::scalar_abs_op<T>,const MatMapT<T>>,
237  MatMapT<T>>(shape_convert(outshape),
238  [](MatMapT<T>& in)
239  {
240  return in.cwiseAbs();
241  }, make_matmap(in.data_, in.shape_));
242  }
243  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
244  Eigen::internal::scalar_abs_op<T>,const TensMapT<T>>,
245  TensMapT<T>>(shape_convert(outshape),
246  [](TensMapT<T>& in)
247  {
248  return in.abs();
249  }, make_tensmap(in.data_, in.shape_));
250 }
251 
254 template <typename T>
255 EigenptrT<T> neg (teq::Shape& outshape, const OpArg<T>& in)
256 {
257  if (is_2d(outshape))
258  {
259  // use matrix when possible
260  return make_eigenmatrix<T,Eigen::CwiseUnaryOp<
261  Eigen::internal::scalar_opposite_op<T>,const MatMapT<T>>,
262  MatMapT<T>>(shape_convert(outshape),
263  [](MatMapT<T>& in)
264  {
265  return -in;
266  }, make_matmap(in.data_, in.shape_));
267  }
268  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
269  Eigen::internal::scalar_opposite_op<T>,const TensMapT<T>>,
270  TensMapT<T>>(shape_convert(outshape),
271  [](TensMapT<T>& in)
272  {
273  return -in;
274  }, make_tensmap(in.data_, in.shape_));
275 }
276 
279 template <typename T>
280 EigenptrT<T> sin (teq::Shape& outshape, const OpArg<T>& in)
281 {
282 #ifdef __cpp_if_constexpr
283  if constexpr(!std::is_integral<T>::value)
284  {
285  if (is_2d(outshape))
286  {
287  // use matrix when possible
288  return make_eigenmatrix<T,
289  typename Eigen::ArrayWrapper<MatMapT<T>>::SinReturnType,
290  MatMapT<T>>(shape_convert(outshape),
291  [](MatMapT<T>& in)
292  {
293  return in.array().sin();
294  }, make_matmap(in.data_, in.shape_));
295  }
296  }
297 #endif
298  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
299  std::function<T(const T&)>,const TensMapT<T>>,
300  TensMapT<T>>(shape_convert(outshape),
301  [](TensMapT<T>& in)
302  {
303  return in.unaryExpr(std::function<T(const T&)>(
304  [](const T& a) -> T
305  {
306  return std::sin(a);
307  }));
308  }, make_tensmap(in.data_, in.shape_));
309 }
310 
313 template <typename T>
314 EigenptrT<T> cos (teq::Shape& outshape, const OpArg<T>& in)
315 {
316 #ifdef __cpp_if_constexpr
317  if constexpr(!std::is_integral<T>::value)
318  {
319  if (is_2d(outshape))
320  {
321  // use matrix when possible
322  return make_eigenmatrix<T,
323  typename Eigen::ArrayWrapper<MatMapT<T>>::CosReturnType,
324  MatMapT<T>>(shape_convert(outshape),
325  [](MatMapT<T>& in)
326  {
327  return in.array().cos();
328  }, make_matmap(in.data_, in.shape_));
329  }
330  }
331 #endif
332  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
333  std::function<T(const T&)>,const TensMapT<T>>,
334  TensMapT<T>>(shape_convert(outshape),
335  [](TensMapT<T>& in)
336  {
337  return in.unaryExpr(std::function<T(const T&)>(
338  [](const T& a) -> T
339  {
340  return std::cos(a);
341  }));
342  }, make_tensmap(in.data_, in.shape_));
343 }
344 
347 template <typename T>
348 EigenptrT<T> tan (teq::Shape& outshape, const OpArg<T>& in)
349 {
350  if (is_2d(outshape))
351  {
352  // use matrix when possible
353  return make_eigenmatrix<T,
354  typename Eigen::ArrayWrapper<MatMapT<T>>::TanReturnType,
355  MatMapT<T>>(shape_convert(outshape),
356  [](MatMapT<T>& in)
357  {
358  return in.array().tan();
359  }, make_matmap(in.data_, in.shape_));
360  }
361  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
362  std::function<T(const T&)>,const TensMapT<T>>,
363  TensMapT<T>>(shape_convert(outshape),
364  [](TensMapT<T>& in)
365  {
366  return in.unaryExpr(std::function<T(const T&)>(
367  [](const T& a) -> T
368  {
369  return std::tan(a);
370  }));
371  }, make_tensmap(in.data_, in.shape_));
372 }
373 
376 template <typename T>
377 EigenptrT<T> exp (teq::Shape& outshape, const OpArg<T>& in)
378 {
379  if (is_2d(outshape))
380  {
381  // use matrix when possible
382  return make_eigenmatrix<T,
383  typename Eigen::ArrayWrapper<MatMapT<T>>::ExpReturnType,
384  MatMapT<T>>(shape_convert(outshape),
385  [](MatMapT<T>& in)
386  {
387  return in.array().exp();
388  }, make_matmap(in.data_, in.shape_));
389  }
390  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
391  Eigen::internal::scalar_exp_op<T>,const TensMapT<T>>,
392  TensMapT<T>>(shape_convert(outshape),
393  [](TensMapT<T>& in)
394  {
395  return in.exp();
396  }, make_tensmap(in.data_, in.shape_));
397 }
398 
401 template <typename T>
402 EigenptrT<T> log (teq::Shape& outshape, const OpArg<T>& in)
403 {
404  if (is_2d(outshape))
405  {
406  // use matrix when possible
407  return make_eigenmatrix<T,
408  typename Eigen::ArrayWrapper<MatMapT<T>>::LogReturnType,
409  MatMapT<T>>(shape_convert(outshape),
410  [](MatMapT<T>& in)
411  {
412  return in.array().log();
413  }, make_matmap(in.data_, in.shape_));
414  }
415  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
416  Eigen::internal::scalar_log_op<T>,const TensMapT<T>>,
417  TensMapT<T>>(shape_convert(outshape),
418  [](TensMapT<T>& in)
419  {
420  return in.log();
421  }, make_tensmap(in.data_, in.shape_));
422 }
423 
426 template <typename T>
427 EigenptrT<T> sqrt (teq::Shape& outshape, const OpArg<T>& in)
428 {
429  if (is_2d(outshape))
430  {
431  // use matrix when possible
432  return make_eigenmatrix<T,Eigen::CwiseUnaryOp<
433  Eigen::internal::scalar_sqrt_op<T>,const MatMapT<T>>,
434  MatMapT<T>>(shape_convert(outshape),
435  [](MatMapT<T>& in)
436  {
437  return in.cwiseSqrt();
438  }, make_matmap(in.data_, in.shape_));
439  }
440  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
441  Eigen::internal::scalar_sqrt_op<T>,const TensMapT<T>>,
442  TensMapT<T>>(shape_convert(outshape),
443  [](TensMapT<T>& in)
444  {
445  return in.sqrt();
446  }, make_tensmap(in.data_, in.shape_));
447 }
448 
451 template <typename T>
452 EigenptrT<T> round (teq::Shape& outshape, const OpArg<T>& in)
453 {
454  if (is_2d(outshape))
455  {
456  // use matrix when possible
457  return make_eigenmatrix<T,
458  typename Eigen::ArrayWrapper<MatMapT<T>>::RoundReturnType,
459  MatMapT<T>>(shape_convert(outshape),
460  [](MatMapT<T>& in)
461  {
462  return in.array().round();
463  }, make_matmap(in.data_, in.shape_));
464  }
465  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
466  Eigen::internal::scalar_round_op<T>,const TensMapT<T>>,
467  TensMapT<T>>(shape_convert(outshape),
468  [](TensMapT<T>& in)
469  {
470  return in.round();
471  }, make_tensmap(in.data_, in.shape_));
472 }
473 
474 template <typename T>
475 EigenptrT<T> sigmoid (teq::Shape& outshape, const OpArg<T>& in)
476 {
477  if (is_2d(outshape))
478  {
479  // use matrix when possible
480  return make_eigenmatrix<T,Eigen::CwiseUnaryOp<
481  Eigen::internal::scalar_sigmoid_op<T>,const MatMapT<T>>,
482  MatMapT<T>>(shape_convert(outshape),
483  [](MatMapT<T>& in)
484  {
485  return in.unaryExpr(Eigen::internal::scalar_sigmoid_op<T>());
486  }, make_matmap(in.data_, in.shape_));
487  }
488  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
489  Eigen::internal::scalar_sigmoid_op<T>,const TensMapT<T>>,
490  TensMapT<T>>(shape_convert(outshape),
491  [](TensMapT<T>& in)
492  {
493  return in.sigmoid();
494  }, make_tensmap(in.data_, in.shape_));
495 }
496 
497 template <typename T>
499 {
500  if (is_2d(outshape))
501  {
502  // use matrix when possible
503  return make_eigenmatrix<T,
504  Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<T>,
505  const Eigen::CwiseUnaryOp<Eigen::internal::scalar_sigmoid_op<T>,
506  const MatMapT<T>>,
507  const Eigen::CwiseUnaryOp<Eigen::internal::bind1st_op<
508  Eigen::internal::scalar_difference_op<T>>,
509  const Eigen::CwiseUnaryOp<Eigen::internal::scalar_sigmoid_op<T>,
510  const MatMapT<T>>>>,
511  MatMapT<T>>(shape_convert(outshape),
512  [](MatMapT<T>& in)
513  {
514  auto out = in.unaryExpr(Eigen::internal::scalar_sigmoid_op<T>());
515  return out.cwiseProduct(out.unaryExpr(
516  Eigen::internal::bind1st_op<Eigen::internal::scalar_difference_op<T>>(1)));
517  }, make_matmap(in.data_, in.shape_));
518  }
519  return make_eigentensor<T,
520  Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_product_op<T>,
521  const Eigen::TensorCwiseUnaryOp<Eigen::internal::scalar_sigmoid_op<T>,
522  const TensMapT<T>>,
523  const Eigen::TensorCwiseUnaryOp<Eigen::internal::bind1st_op<
524  Eigen::internal::scalar_difference_op<T>>,
525  const Eigen::TensorCwiseUnaryOp<Eigen::internal::scalar_sigmoid_op<T>,
526  const TensMapT<T>>>>,
527  TensMapT<T>>(shape_convert(outshape),
528  [](TensMapT<T>& in)
529  {
530  auto out = in.sigmoid();
531  return out * (1 - out);
532  }, make_tensmap(in.data_, in.shape_));
533 }
534 
535 template <typename T>
536 EigenptrT<T> tanh (teq::Shape& outshape, const OpArg<T>& in)
537 {
538  if (is_2d(outshape))
539  {
540  // use matrix when possible
541  return make_eigenmatrix<T,Eigen::CwiseUnaryOp<
542  Eigen::internal::scalar_tanh_op<T>,const MatMapT<T>>,
543  MatMapT<T>>(shape_convert(outshape),
544  [](MatMapT<T>& in)
545  {
546  return in.unaryExpr(Eigen::internal::scalar_tanh_op<T>());
547  }, make_matmap(in.data_, in.shape_));
548  }
549  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
550  Eigen::internal::scalar_tanh_op<T>,const TensMapT<T>>,
551  TensMapT<T>>(shape_convert(outshape),
552  [](TensMapT<T>& in)
553  {
554  return in.tanh();
555  }, make_tensmap(in.data_, in.shape_));
556 }
557 
558 template <typename T>
559 EigenptrT<T> square (teq::Shape& outshape, const OpArg<T>& in)
560 {
561  if (is_2d(outshape))
562  {
563  // use matrix when possible
564  return make_eigenmatrix<T,Eigen::CwiseUnaryOp<
565  Eigen::internal::scalar_square_op<T>,const MatMapT<T>>,
566  MatMapT<T>>(shape_convert(outshape),
567  [](MatMapT<T>& in)
568  {
569  return in.unaryExpr(Eigen::internal::scalar_square_op<T>());
570  }, make_matmap(in.data_, in.shape_));
571  }
572  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
573  Eigen::internal::scalar_square_op<T>,const TensMapT<T>>,
574  TensMapT<T>>(shape_convert(outshape),
575  [](TensMapT<T>& in)
576  {
577  return in.square();
578  }, make_tensmap(in.data_, in.shape_));
579 }
580 
581 template <typename T>
582 EigenptrT<T> cube (teq::Shape& outshape, const OpArg<T>& in)
583 {
584  if (is_2d(outshape))
585  {
586  // use matrix when possible
587  return make_eigenmatrix<T,Eigen::CwiseUnaryOp<
588  Eigen::internal::scalar_cube_op<T>,const MatMapT<T>>,
589  MatMapT<T>>(shape_convert(outshape),
590  [](MatMapT<T>& in)
591  {
592  return in.unaryExpr(Eigen::internal::scalar_cube_op<T>());
593  }, make_matmap(in.data_, in.shape_));
594  }
595  return make_eigentensor<T,Eigen::TensorCwiseUnaryOp<
596  Eigen::internal::scalar_cube_op<T>,const TensMapT<T>>,
597  TensMapT<T>>(shape_convert(outshape),
598  [](TensMapT<T>& in)
599  {
600  return in.cube();
601  }, make_tensmap(in.data_, in.shape_));
602 }
603 
607 template <typename T>
608 EigenptrT<T> pow (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
609 {
610  if (is_2d(outshape))
611  {
612  // use matrix when possible
613  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
614  std::function<T(const T&,const T&)>,
615  const MatMapT<T>,const MatMapT<T>>,
616  std::vector<MatMapT<T>>>(shape_convert(outshape),
617  [](std::vector<MatMapT<T>>& args)
618  {
619  return args[0].binaryExpr(args[1],
620  std::function<T(const T&,const T&)>(
621  [](const T& a, const T& b) -> T
622  {
623  return std::pow(a, b);
624  }));
625  }, {
626  make_matmap(a.data_, a.shape_),
627  make_matmap(b.data_, b.shape_)});
628  }
629  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
630  std::function<T(const T&,const T&)>,
631  const TensMapT<T>,const TensMapT<T>>,
632  std::vector<TensMapT<T>>>(shape_convert(outshape),
633  [](std::vector<TensMapT<T>>& args)
634  {
635  return args[0].binaryExpr(args[1],
636  std::function<T(const T&,const T&)>(
637  [](const T& a, const T& b) -> T
638  {
639  return std::pow(a, b);
640  }));
641  }, {
642  make_tensmap(a.data_, a.shape_),
643  make_tensmap(b.data_, b.shape_)});
644 }
645 
646 template <typename T>
647 EigenptrT<T> add (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
648 {
649  if (is_2d(outshape))
650  {
651  // use matrix when possible
652  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
653  Eigen::internal::scalar_sum_op<T>,
654  const MatMapT<T>,const MatMapT<T>>,
655  std::vector<MatMapT<T>>>(shape_convert(outshape),
656  [](std::vector<MatMapT<T>>& args)
657  {
658  return args[0] + args[1];
659  }, {
660  make_matmap(a.data_, a.shape_),
661  make_matmap(b.data_, b.shape_)});
662  }
663  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
664  Eigen::internal::scalar_sum_op<T>,
665  const TensMapT<T>,const TensMapT<T>>,
666  std::vector<TensMapT<T>>>(shape_convert(outshape),
667  [](std::vector<TensMapT<T>>& args)
668  {
669  return args[0] + args[1];
670  }, {
671  make_tensmap(a.data_, a.shape_),
672  make_tensmap(b.data_, b.shape_)});
673 }
674 
678 template <typename T>
679 EigenptrT<T> sub (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
680 {
681  if (is_2d(outshape))
682  {
683  // use matrix when possible
684  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
685  Eigen::internal::scalar_difference_op<T>,
686  const MatMapT<T>,const MatMapT<T>>,
687  std::vector<MatMapT<T>>>(shape_convert(outshape),
688  [](std::vector<MatMapT<T>>& args)
689  {
690  return args[0] - args[1];
691  }, {
692  make_matmap(a.data_, a.shape_),
693  make_matmap(b.data_, b.shape_)});
694  }
695  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
696  Eigen::internal::scalar_difference_op<T>,
697  const TensMapT<T>,const TensMapT<T>>,
698  std::vector<TensMapT<T>>>(shape_convert(outshape),
699  [](std::vector<TensMapT<T>>& args)
700  {
701  return args[0] - args[1];
702  }, {
703  make_tensmap(a.data_, a.shape_),
704  make_tensmap(b.data_, b.shape_)});
705 }
706 
707 template <typename T>
708 EigenptrT<T> mul (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
709 {
710  if (is_2d(outshape))
711  {
712  // use matrix when possible
713  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
714  Eigen::internal::scalar_product_op<T>,
715  const MatMapT<T>,const MatMapT<T>>,
716  std::vector<MatMapT<T>>>(shape_convert(outshape),
717  [](std::vector<MatMapT<T>>& args)
718  {
719  return args[0].cwiseProduct(args[1]);
720  }, {
721  make_matmap(a.data_, a.shape_),
722  make_matmap(b.data_, b.shape_)});
723  }
724  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
725  Eigen::internal::scalar_product_op<T>,
726  const TensMapT<T>,const TensMapT<T>>,
727  std::vector<TensMapT<T>>>(shape_convert(outshape),
728  [](std::vector<TensMapT<T>>& args)
729  {
730  return args[0] * args[1];
731  }, {
732  make_tensmap(a.data_, a.shape_),
733  make_tensmap(b.data_, b.shape_)});
734 }
735 
739 template <typename T>
740 EigenptrT<T> div (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
741 {
742  if (is_2d(outshape))
743  {
744  // use matrix when possible
745  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
746  Eigen::internal::scalar_quotient_op<T>,
747  const MatMapT<T>,const MatMapT<T>>,
748  std::vector<MatMapT<T>>>(shape_convert(outshape),
749  [](std::vector<MatMapT<T>>& args)
750  {
751  return args[0].cwiseQuotient(args[1]);
752  }, {
753  make_matmap(a.data_, a.shape_),
754  make_matmap(b.data_, b.shape_)});
755  }
756  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
757  Eigen::internal::scalar_quotient_op<T>,
758  const TensMapT<T>,const TensMapT<T>>,
759  std::vector<TensMapT<T>>>(shape_convert(outshape),
760  [](std::vector<TensMapT<T>>& args)
761  {
762  return args[0] / args[1];
763  }, {
764  make_tensmap(a.data_, a.shape_),
765  make_tensmap(b.data_, b.shape_)});
766 }
767 
771 template <typename T>
772 EigenptrT<T> eq (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
773 {
774  if (is_2d(outshape))
775  {
776  // use matrix when possible
777  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
778  std::function<T(const T&,const T&)>,
779  const MatMapT<T>,const MatMapT<T>>,
780  std::vector<MatMapT<T>>>(shape_convert(outshape),
781  [](std::vector<MatMapT<T>>& args)
782  {
783  return args[0].binaryExpr(args[1],
784  std::function<T(const T&,const T&)>(
785  [](const T& a, const T& b) -> T
786  {
787  return a == b;
788  }));
789  }, {
790  make_matmap(a.data_, a.shape_),
791  make_matmap(b.data_, b.shape_)});
792  }
793  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
794  std::function<T(const T&,const T&)>,
795  const TensMapT<T>,const TensMapT<T>>,
796  std::vector<TensMapT<T>>>(shape_convert(outshape),
797  [](std::vector<TensMapT<T>>& args)
798  {
799  return args[0].binaryExpr(args[1],
800  std::function<T(const T&,const T&)>(
801  [](const T& a, const T& b) -> T
802  {
803  return a == b;
804  }));
805  }, {
806  make_tensmap(a.data_, a.shape_),
807  make_tensmap(b.data_, b.shape_)});
808 }
809 
813 template <typename T>
814 EigenptrT<T> neq (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
815 {
816  if (is_2d(outshape))
817  {
818  // use matrix when possible
819  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
820  std::function<T(const T&,const T&)>,
821  const MatMapT<T>,const MatMapT<T>>,
822  std::vector<MatMapT<T>>>(shape_convert(outshape),
823  [](std::vector<MatMapT<T>>& args)
824  {
825  return args[0].binaryExpr(args[1],
826  std::function<T(const T&,const T&)>(
827  [](const T& a, const T& b) -> T
828  {
829  return a != b;
830  }));
831  }, {
832  make_matmap(a.data_, a.shape_),
833  make_matmap(b.data_, b.shape_)});
834  }
835  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
836  std::function<T(const T&,const T&)>,
837  const TensMapT<T>,const TensMapT<T>>,
838  std::vector<TensMapT<T>>>(shape_convert(outshape),
839  [](std::vector<TensMapT<T>>& args)
840  {
841  return args[0].binaryExpr(args[1],
842  std::function<T(const T&,const T&)>(
843  [](const T& a, const T& b) -> T
844  {
845  return a != b;
846  }));
847  }, {
848  make_tensmap(a.data_, a.shape_),
849  make_tensmap(b.data_, b.shape_)});
850 }
851 
855 template <typename T>
856 EigenptrT<T> lt (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
857 {
858  if (is_2d(outshape))
859  {
860  // use matrix when possible
861  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
862  std::function<T(const T&,const T&)>,
863  const MatMapT<T>,const MatMapT<T>>,
864  std::vector<MatMapT<T>>>(shape_convert(outshape),
865  [](std::vector<MatMapT<T>>& args)
866  {
867  return args[0].binaryExpr(args[1],
868  std::function<T(const T&,const T&)>(
869  [](const T& a, const T& b) -> T
870  {
871  return a < b;
872  }));
873  }, {
874  make_matmap(a.data_, a.shape_),
875  make_matmap(b.data_, b.shape_)});
876  }
877  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
878  std::function<T(const T&,const T&)>,
879  const TensMapT<T>,const TensMapT<T>>,
880  std::vector<TensMapT<T>>>(shape_convert(outshape),
881  [](std::vector<TensMapT<T>>& args)
882  {
883  return args[0].binaryExpr(args[1],
884  std::function<T(const T&,const T&)>(
885  [](const T& a, const T& b) -> T
886  {
887  return a < b;
888  }));
889  }, {
890  make_tensmap(a.data_, a.shape_),
891  make_tensmap(b.data_, b.shape_)});
892 }
893 
897 template <typename T>
898 EigenptrT<T> gt (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
899 {
900  if (is_2d(outshape))
901  {
902  // use matrix when possible
903  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
904  std::function<T(const T&,const T&)>,
905  const MatMapT<T>,const MatMapT<T>>,
906  std::vector<MatMapT<T>>>(shape_convert(outshape),
907  [](std::vector<MatMapT<T>>& args)
908  {
909  return args[0].binaryExpr(args[1],
910  std::function<T(const T&,const T&)>(
911  [](const T& a, const T& b) -> T
912  {
913  return a > b;
914  }));
915  }, {
916  make_matmap(a.data_, a.shape_),
917  make_matmap(b.data_, b.shape_)});
918  }
919  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
920  std::function<T(const T&,const T&)>,
921  const TensMapT<T>,const TensMapT<T>>,
922  std::vector<TensMapT<T>>>(shape_convert(outshape),
923  [](std::vector<TensMapT<T>>& args)
924  {
925  return args[0].binaryExpr(args[1],
926  std::function<T(const T&,const T&)>(
927  [](const T& a, const T& b) -> T
928  {
929  return a > b;
930  }));
931  }, {
932  make_tensmap(a.data_, a.shape_),
933  make_tensmap(b.data_, b.shape_)});
934 }
935 
938 template <typename T>
939 EigenptrT<T> min (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
940 {
941  if (is_2d(outshape))
942  {
943  // use matrix when possible
944  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
945  Eigen::internal::scalar_min_op<T,T>,
946  const MatMapT<T>,const MatMapT<T>>,
947  std::vector<MatMapT<T>>>(shape_convert(outshape),
948  [](std::vector<MatMapT<T>>& args)
949  {
950  return args[0].cwiseMin(args[1]);
951  }, {
952  make_matmap(a.data_, a.shape_),
953  make_matmap(b.data_, b.shape_)});
954  }
955  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
956  Eigen::internal::scalar_min_op<T>,
957  const TensMapT<T>,const TensMapT<T>>,
958  std::vector<TensMapT<T>>>(shape_convert(outshape),
959  [](std::vector<TensMapT<T>>& args)
960  {
961  return args[0].cwiseMin(args[1]);
962  }, {
963  make_tensmap(a.data_, a.shape_),
964  make_tensmap(b.data_, b.shape_)});
965 }
966 
969 template <typename T>
970 EigenptrT<T> max (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
971 {
972  if (is_2d(outshape))
973  {
974  // use matrix when possible
975  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
976  Eigen::internal::scalar_max_op<T,T>,
977  const MatMapT<T>,const MatMapT<T>>,
978  std::vector<MatMapT<T>>>(shape_convert(outshape),
979  [](std::vector<MatMapT<T>>& args)
980  {
981  return args[0].cwiseMax(args[1]);
982  }, {
983  make_matmap(a.data_, a.shape_),
984  make_matmap(b.data_, b.shape_)});
985  }
986  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
987  Eigen::internal::scalar_max_op<T>,
988  const TensMapT<T>,const TensMapT<T>>,
989  std::vector<TensMapT<T>>>(shape_convert(outshape),
990  [](std::vector<TensMapT<T>>& args)
991  {
992  return args[0].cwiseMax(args[1]);
993  }, {
994  make_tensmap(a.data_, a.shape_),
995  make_tensmap(b.data_, b.shape_)});
996 }
997 
1001 template <typename T>
1002 EigenptrT<T> rand_uniform (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
1003 {
1004  if (is_2d(outshape))
1005  {
1006  // use matrix when possible
1007  return make_eigenmatrix<T,Eigen::CwiseBinaryOp<
1008  std::function<T(const T&,const T&)>,
1009  const MatMapT<T>,const MatMapT<T>>,
1010  std::vector<MatMapT<T>>>(shape_convert(outshape),
1011  [](std::vector<MatMapT<T>>& args)
1012  {
1013  return args[0].binaryExpr(args[1],
1014  std::function<T(const T&,const T&)>(unif<T>));
1015  }, {
1016  make_matmap(a.data_, a.shape_),
1017  make_matmap(b.data_, b.shape_)});
1018  }
1019  return make_eigentensor<T,Eigen::TensorCwiseBinaryOp<
1020  std::function<T(const T&,const T&)>,
1021  const TensMapT<T>,const TensMapT<T>>,
1022  std::vector<TensMapT<T>>>(shape_convert(outshape),
1023  [](std::vector<TensMapT<T>>& args)
1024  {
1025  return args[0].binaryExpr(args[1],
1026  std::function<T(const T&,const T&)>(unif<T>));
1027  }, {
1028  make_tensmap(a.data_, a.shape_),
1029  make_tensmap(b.data_, b.shape_)});
1030 }
1031 
1035 template <typename T>
1037  const OpArg<T>& condition,
1038  const OpArg<T>& then, const OpArg<T>& otherwise)
1039 {
1040  if (is_2d(outshape))
1041  {
1042  // use matrix when possible
1043  return make_eigenmatrix<T,
1044  Eigen::Select<MatMapT<T>,MatMapT<T>,MatMapT<T>>,
1045  std::vector<MatMapT<T>>>(shape_convert(outshape),
1046  [](std::vector<MatMapT<T>>& args) -> Eigen::Select<MatMapT<T>,MatMapT<T>,MatMapT<T>>
1047  {
1048  return args[0].select(args[1], args[2]);
1049  }, {
1050  make_matmap(condition.data_, condition.shape_),
1051  make_matmap(then.data_, then.shape_),
1052  make_matmap(otherwise.data_, otherwise.shape_)});
1053  }
1054  return make_eigentensor<T,
1055  Eigen::TensorSelectOp<const TensMapT<T>,
1056  const TensMapT<T>,const TensMapT<T>>,
1057  std::vector<TensMapT<T>>>(shape_convert(outshape),
1058  [](std::vector<TensMapT<T>>& args) -> Eigen::TensorSelectOp<const TensMapT<T>,const TensMapT<T>,const TensMapT<T>>
1059  {
1060  return args[0].select(args[1], args[2]);
1061  }, {
1062  make_tensmap(condition.data_, condition.shape_),
1063  make_tensmap(then.data_, then.shape_),
1064  make_tensmap(otherwise.data_, otherwise.shape_)});
1065 }
1066 
1069 template <typename T>
1070 EigenptrT<T> matmul (teq::Shape& outshape, const OpArg<T>& a, const OpArg<T>& b)
1071 {
1072  assert(is_2d(outshape));
1073  return make_eigenmatrix<T,Eigen::Product<MatMapT<T>,MatMapT<T>>,
1074  std::vector<MatMapT<T>>>(shape_convert(outshape),
1075  [](std::vector<MatMapT<T>>& args)
1076  {
1077  return args[0] * args[1];
1078  }, {
1079  make_matmap(a.data_, a.shape_),
1080  make_matmap(b.data_, b.shape_)});
1081 }
1082 
1084 template <typename T>
1085 EigenptrT<T> convolution (teq::Shape& outshape, const OpArg<T>& input, const OpArg<T>& kernel)
1086 {
1087  assert(nullptr != kernel.coorder_);
1088  teq::CoordT kernel_dims;
1089  kernel.coorder_->forward(kernel_dims.begin(), kernel_dims.begin());
1090  teq::ShapeT dims;
1091  std::copy(kernel_dims.begin(), kernel_dims.end(), dims.begin());
1092 
1093  return make_eigentensor<T,Eigen::TensorConvolutionOp<
1094  const teq::ShapeT,
1095  const TensMapT<T>,const TensMapT<T>>,
1096  std::vector<TensMapT<T>>>(shape_convert(outshape),
1097  [&](std::vector<TensMapT<T>>& args)
1098  {
1099  return args[0].convolve(args[1], dims);
1100  }, {
1101  make_tensmap(input.data_, input.shape_),
1102  make_tensmap(kernel.data_, kernel.shape_)});
1103 }
1104 
1106 template <typename T>
1108  const OpArg<T>& kernel, const OpArg<T>& super_composite)
1109 {
1110  return make_eigentensor<T,
1111  Eigen::TensorReductionOp<Eigen::internal::SumReducer<T>,
1112  const teq::ShapeT,
1113  const Eigen::TensorCwiseBinaryOp<
1114  Eigen::internal::scalar_product_op<T,T>,
1115  const Eigen::TensorBroadcastingOp<
1116  const std::array<teq::DimT,teq::rank_cap+1>,
1117  const Eigen::TensorReshapingOp<
1118  const std::array<teq::DimT,teq::rank_cap+1>,
1119  Eigen::TensorReverseOp<
1120  const std::array<bool,teq::rank_cap>,
1121  TensMapT<T>
1122  >
1123  >
1124  >,
1125  const Eigen::TensorPatchOp<
1126  const teq::ShapeT,
1127  const Eigen::TensorPaddingOp<
1128  const std::array<std::pair<int,int>,teq::rank_cap>,
1129  const TensMapT<T>
1130  >
1131  >
1132  >
1133  >,
1134  std::vector<TensMapT<T>>>(shape_convert(imageshape),
1135  [&](std::vector<TensMapT<T>>& args)
1136  {
1137  auto& outshape = super_composite.shape_;
1138 
1139  teq::ShapeT patch_dims;
1140  std::copy(outshape.begin(), outshape.end(), patch_dims.begin());
1141  Eigen::array<std::pair<int,int>,teq::rank_cap> paddings;
1142  for (teq::RankT i = 0; i < teq::rank_cap; ++i)
1143  {
1144  int paddsize = outshape.at(i) - 1;
1145  paddings[i] = std::make_pair(paddsize, paddsize);
1146  }
1147  auto patched = args[0].pad(paddings)
1148  .extract_patches(patch_dims);
1149 
1150  std::array<bool,teq::rank_cap> revflags;
1151  std::fill(revflags.begin(), revflags.end(), true);
1152  std::array<teq::DimT,teq::rank_cap+1> pshape;
1153  std::copy(outshape.begin(), outshape.end(), pshape.begin());
1154  pshape[teq::rank_cap] = 1;
1155  std::array<teq::DimT,teq::rank_cap+1> expansion;
1156  std::fill(expansion.begin(), expansion.end(), 1);
1157  expansion[teq::rank_cap] = imageshape.n_elems();
1158  auto partial = args[1]
1159  .reverse(revflags)
1160  .reshape(pshape)
1161  .broadcast(expansion) * patched;
1162 
1163  teq::ShapeT shapespace;
1164  std::iota(shapespace.begin(), shapespace.end(), 0);
1165  return partial.sum(shapespace);
1166  }, {
1167  make_tensmap(kernel.data_, kernel.shape_),
1168  make_tensmap(super_composite.data_, super_composite.shape_)});
1169 }
1170 
1172 template <typename T>
1174  const OpArg<T>& image, const OpArg<T>& super_composite)
1175 {
1176  return make_eigentensor<T,
1177  Eigen::TensorReductionOp<Eigen::internal::SumReducer<T>,
1178  const teq::ShapeT,
1179  const Eigen::TensorCwiseBinaryOp<
1180  Eigen::internal::scalar_product_op<T,T>,
1181  const Eigen::TensorBroadcastingOp<
1182  const std::array<teq::DimT,teq::rank_cap+1>,
1183  const Eigen::TensorReshapingOp<
1184  const std::array<teq::DimT,teq::rank_cap+1>,
1185  TensMapT<T>
1186  >
1187  >,
1188  const Eigen::TensorPatchOp<
1189  const teq::ShapeT,
1190  const TensMapT<T>
1191  >
1192  >
1193  >,
1194  std::vector<TensMapT<T>>>(shape_convert(kernelshape),
1195  [&](std::vector<TensMapT<T>>& args)
1196  {
1197  auto& outshape = super_composite.shape_;
1198 
1199  teq::ShapeT patch_dims;
1200  std::copy(outshape.begin(), outshape.end(), patch_dims.begin());
1201  auto patched = args[0].extract_patches(patch_dims);
1202 
1203  std::array<teq::DimT,teq::rank_cap+1> pshape;
1204  std::copy(outshape.begin(), outshape.end(), pshape.begin());
1205  pshape[teq::rank_cap] = 1;
1206  std::array<teq::DimT,teq::rank_cap+1> expansion;
1207  std::fill(expansion.begin(), expansion.end(), 1);
1208  expansion[teq::rank_cap] = kernelshape.n_elems();
1209  auto partial = args[1]
1210  .reshape(pshape)
1211  .broadcast(expansion) * patched;
1212 
1213  teq::ShapeT shapespace;
1214  std::iota(shapespace.begin(), shapespace.end(), 0);
1215  return partial.sum(shapespace);
1216  }, {
1217  make_tensmap(image.data_, image.shape_),
1218  make_tensmap(super_composite.data_, super_composite.shape_)});
1219 }
1220 
1221 }
1222 
1223 #endif // ETEQ_OPERATOR_HPP
std::array< CDimT, rank_cap > CoordT
Definition: shape.hpp:56
EigenptrT< T > gt(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:898
const RankT rank_cap
Number of dimsensions in a shape/coordinate.
Definition: shape.hpp:47
args
Definition: csv_to_png.py:105
EigenptrT< T > round(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:452
EigenptrT< T > sin(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:280
teq::Shape shape_
Shape of the data.
Definition: operator.hpp:37
CoordptrT extend(teq::RankT rank, std::vector< teq::DimT > ext)
Return CoordMap wrapper of extension parameters.
EigenptrT< T > tan(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:348
EigenptrT< T > square(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:559
EigenptrT< T > add(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:647
Eigen::TensorMap< TensorT< T > > TensMapT
Eigen Tensor Map (reference)
Definition: eigen.hpp:39
Definition: constant.hpp:17
EigenptrT< T > convolution_image_grad(teq::Shape &imageshape, const OpArg< T > &kernel, const OpArg< T > &super_composite)
Applies the gradient of convolution with respect to image.
Definition: operator.hpp:1107
TensMapT< T > make_tensmap(T *data, const teq::Shape &shape)
Return Eigen Tensor given raw data and teq Shape.
Definition: eigen.hpp:201
EigenptrT< T > neq(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:814
EigenptrT< T > sqrt(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:427
uint8_t RankT
Type used for shape rank.
Definition: shape.hpp:23
OpArg(T *data, teq::Shape shape, CoordMap *coorder)
Definition: operator.hpp:30
Definition: shape.hpp:62
T * data_
Raw data argument.
Definition: operator.hpp:34
EigenptrT< T > max(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:970
EigenptrT< T > div(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:740
EigenptrT< T > make_eigentensor(DimensionsT dims, std::function< EigenSource(EigenArgs &)> make_base, EigenArgs args)
Definition: eigen.hpp:160
EigenptrT< T > stride(teq::Shape &outshape, const OpArg< T > &in)
Return Eigen data object representing strided view of in.
Definition: operator.hpp:208
Eigen::Map< MatrixT< T > > MatMapT
Eigen Matrix Map (reference)
Definition: eigen.hpp:31
std::shared_ptr< iEigen< T > > EigenptrT
Smart point of generic Eigen data object.
Definition: eigen.hpp:94
CoordMap * coorder_
Transformation argument, null denotes no argument.
Definition: operator.hpp:40
EigenptrT< T > cube(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:582
Eigen::TensorReductionOp< OP, const std::array< teq::RankT, N >, const TensMapT< T > > ReduceOutT
Generic Eigen reduction operator.
Definition: operator.hpp:46
EigenptrT< T > eq(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:772
EigenptrT< T > select(teq::Shape &outshape, const OpArg< T > &condition, const OpArg< T > &then, const OpArg< T > &otherwise)
Definition: operator.hpp:1036
Eigen transformation wrapper implementation of iCoordMap.
Definition: coord.hpp:18
EigenptrT< T > sigmoid_grad(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:498
EigenptrT< T > sigmoid(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:475
EigenptrT< T > abs(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:230
void forward(teq::CoordT::iterator out, teq::CoordT::const_iterator in) const override
Implementation of iCoordMap.
Definition: coord.hpp:30
EigenptrT< T > sub(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:679
CoordptrT permute(std::vector< teq::RankT > dims)
Return CoordMap wrapper of permute indices.
EigenptrT< T > slice(teq::Shape &outshape, const OpArg< T > &in)
Return Eigen data object representing data slicing of dimensions.
Definition: operator.hpp:157
EigenptrT< T > exp(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:377
EigenptrT< T > tanh(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:536
std::array< teq::RankT, N > dim_copy(std::vector< teq::RankT > d)
Return array of input vector.
Definition: operator.hpp:53
uint16_t DimT
Type used for shape dimension.
Definition: shape.hpp:31
Raw data, shape, and transformation argument struct.
Definition: operator.hpp:28
EigenptrT< T > convolution_kernel_grad(teq::Shape &kernelshape, const OpArg< T > &image, const OpArg< T > &super_composite)
Applies the gradient of convolution with respect to kernel.
Definition: operator.hpp:1173
EigenptrT< T > pad(teq::Shape &outshape, const OpArg< T > &in)
Return Eigen data object representing data zero padding.
Definition: operator.hpp:183
EigenptrT< T > cos(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:314
EigenptrT< T > log(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:402
std::array< DimT, rank_cap > ShapeT
Array type used to hold dimension info in Shape.
Definition: shape.hpp:50
EigenptrT< T > reduce_sum(teq::Shape &outshape, const OpArg< T > &in) template< typename T > EigenptrT< T > reduce_prod(teq
Return Eigen data object representing reduction where aggregation is sum.
Definition: operator.hpp:94
EigenptrT< T > min(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:939
static bool is_2d(teq::Shape shape)
Definition: operator.hpp:20
EigenptrT< T > lt(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:856
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
EigenptrT< T > convolution(teq::Shape &outshape, const OpArg< T > &input, const OpArg< T > &kernel)
Apply convolution of kernel across input.
Definition: operator.hpp:1085
EigenptrT< T > mul(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:708
#define _ETEQ_INTERNAL_V2A(PROCESS, RED)
Definition: operator.hpp:67
NElemT n_elems(void) const
Return the total number of elements represented by the shape.
Definition: shape.hpp:118
EigenptrT< T > rand_uniform(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:1002
EigenptrT< T > neg(teq::Shape &outshape, const OpArg< T > &in)
Definition: operator.hpp:255
DimensionsT shape_convert(teq::Shape shape)
Return Eigen shape of teq Shape.
EigenptrT< T > pow(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:608
EigenptrT< T > matmul(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:1070