Caffe2 - C++ API
A deep learning, cross platform ML framework
eigen_utils.h
1 // Copyright 2004-present Facebook. All Rights Reserved.
2 
3 #ifndef CAFFE2_OPERATORS_UTILS_EIGEN_H_
4 #define CAFFE2_OPERATORS_UTILS_EIGEN_H_
5 
6 #include "Eigen/Core"
7 #include "Eigen/Dense"
8 
9 #include "caffe2/core/logging.h"
10 
11 namespace caffe2 {
12 
13 // Common Eigen types that we will often use
14 template <typename T>
15 using EigenMatrixMap =
16  Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>;
17 template <typename T>
18 using EigenArrayMap =
19  Eigen::Map<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>>;
20 template <typename T>
21 using EigenVectorMap = Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, 1>>;
22 template <typename T>
23 using EigenVectorArrayMap = Eigen::Map<Eigen::Array<T, Eigen::Dynamic, 1>>;
24 template <typename T>
25 using ConstEigenMatrixMap =
26  Eigen::Map<const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>;
27 template <typename T>
28 using ConstEigenArrayMap =
29  Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>>;
30 template <typename T>
31 using ConstEigenVectorMap =
32  Eigen::Map<const Eigen::Matrix<T, Eigen::Dynamic, 1>>;
33 template <typename T>
34 using ConstEigenVectorArrayMap =
35  Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, 1>>;
36 
37 using EigenOuterStride = Eigen::OuterStride<Eigen::Dynamic>;
38 using EigenInnerStride = Eigen::InnerStride<Eigen::Dynamic>;
39 using EigenStride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>;
40 template <typename T>
41 using EigenOuterStridedMatrixMap = Eigen::
42  Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenOuterStride>;
43 template <typename T>
44 using EigenOuterStridedArrayMap = Eigen::
45  Map<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenOuterStride>;
46 template <typename T>
47 using ConstEigenOuterStridedMatrixMap = Eigen::Map<
48  const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>,
49  0,
50  EigenOuterStride>;
51 template <typename T>
52 using ConstEigenOuterStridedArrayMap = Eigen::Map<
53  const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>,
54  0,
55  EigenOuterStride>;
56 template <typename T>
57 using EigenStridedMatrixMap = Eigen::
58  Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenStride>;
59 template <typename T>
60 using EigenStridedArrayMap =
61  Eigen::Map<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenStride>;
62 template <typename T>
63 using ConstEigenStridedMatrixMap = Eigen::
64  Map<const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenStride>;
65 template <typename T>
66 using ConstEigenStridedArrayMap = Eigen::
67  Map<const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenStride>;
68 
69 // 1-d array
70 template <typename T>
71 using EArrXt = Eigen::Array<T, Eigen::Dynamic, 1>;
72 using EArrXf = Eigen::ArrayXf;
73 using EArrXd = Eigen::ArrayXd;
74 using EArrXi = Eigen::ArrayXi;
75 using EArrXb = EArrXt<bool>;
76 
77 // 2-d array, column major
78 template <typename T>
79 using EArrXXt = Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>;
80 using EArrXXf = Eigen::ArrayXXf;
81 
82 // 2-d array, row major
83 template <typename T>
84 using ERArrXXt =
85  Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
86 using ERArrXXf = ERArrXXt<float>;
87 
88 // 1-d vector
89 template <typename T>
90 using EVecXt = Eigen::Matrix<T, Eigen::Dynamic, 1>;
91 using EVecXd = Eigen::VectorXd;
92 using EVecXf = Eigen::VectorXf;
93 
94 // 1-d row vector
95 using ERVecXd = Eigen::RowVectorXd;
96 using ERVecXf = Eigen::RowVectorXf;
97 
98 // 2-d matrix, column major
99 template <typename T>
100 using EMatXt = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
101 using EMatXd = Eigen::MatrixXd;
102 using EMatXf = Eigen::MatrixXf;
103 
104 // 2-d matrix, row major
105 template <typename T>
106 using ERMatXt =
107  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
108 using ERMatXd = ERMatXt<double>;
109 using ERMatXf = ERMatXt<float>;
110 
111 namespace utils {
112 
113 template <typename T>
114 Eigen::Map<const EArrXt<T>> AsEArrXt(const std::vector<T>& arr) {
115  return {arr.data(), static_cast<int>(arr.size())};
116 }
117 template <typename T>
118 Eigen::Map<EArrXt<T>> AsEArrXt(std::vector<T>& arr) {
119  return {arr.data(), static_cast<int>(arr.size())};
120 }
121 
122 // return a sub array of 'array' based on indices 'indices'
123 template <class Derived, class Derived1, class Derived2>
124 void GetSubArray(
125  const Eigen::ArrayBase<Derived>& array,
126  const Eigen::ArrayBase<Derived1>& indices,
127  Eigen::ArrayBase<Derived2>* out_array) {
128  CAFFE_ENFORCE_EQ(array.cols(), 1);
129  // using T = typename Derived::Scalar;
130 
131  out_array->derived().resize(indices.size());
132  for (int i = 0; i < indices.size(); i++) {
133  DCHECK_LT(indices[i], array.size());
134  (*out_array)[i] = array[indices[i]];
135  }
136 }
137 
138 // return a sub array of 'array' based on indices 'indices'
139 template <class Derived, class Derived1>
140 EArrXt<typename Derived::Scalar> GetSubArray(
141  const Eigen::ArrayBase<Derived>& array,
142  const Eigen::ArrayBase<Derived1>& indices) {
143  using T = typename Derived::Scalar;
144  EArrXt<T> ret(indices.size());
145  GetSubArray(array, indices, &ret);
146  return ret;
147 }
148 
149 // return a sub array of 'array' based on indices 'indices'
150 template <class Derived>
151 EArrXt<typename Derived::Scalar> GetSubArray(
152  const Eigen::ArrayBase<Derived>& array,
153  const std::vector<int>& indices) {
154  return GetSubArray(array, AsEArrXt(indices));
155 }
156 
157 // return 2d sub array of 'array' based on row indices 'row_indices'
158 template <class Derived, class Derived1, class Derived2>
159 void GetSubArrayRows(
160  const Eigen::ArrayBase<Derived>& array2d,
161  const Eigen::ArrayBase<Derived1>& row_indices,
162  Eigen::ArrayBase<Derived2>* out_array) {
163  out_array->derived().resize(row_indices.size(), array2d.cols());
164 
165  for (int i = 0; i < row_indices.size(); i++) {
166  DCHECK_LT(row_indices[i], array2d.size());
167  out_array->row(i) =
168  array2d.row(row_indices[i]).template cast<typename Derived2::Scalar>();
169  }
170 }
171 
172 // return indices of 1d array for elements evaluated to true
173 template <class Derived>
174 std::vector<int> GetArrayIndices(const Eigen::ArrayBase<Derived>& array) {
175  std::vector<int> ret;
176  for (int i = 0; i < array.size(); i++) {
177  if (array[i]) {
178  ret.push_back(i);
179  }
180  }
181  return ret;
182 }
183 
184 } // namespace utils
185 } // namespace caffe2
186 
187 #endif
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...
Definition: blob.h:13