3 #ifndef CAFFE2_OPERATORS_UTILS_EIGEN_H_ 4 #define CAFFE2_OPERATORS_UTILS_EIGEN_H_ 9 #include "caffe2/core/logging.h" 15 using EigenMatrixMap =
16 Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>;
19 Eigen::Map<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>>;
21 using EigenVectorMap = Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, 1>>;
23 using EigenVectorArrayMap = Eigen::Map<Eigen::Array<T, Eigen::Dynamic, 1>>;
25 using ConstEigenMatrixMap =
26 Eigen::Map<const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>;
28 using ConstEigenArrayMap =
29 Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>>;
31 using ConstEigenVectorMap =
32 Eigen::Map<const Eigen::Matrix<T, Eigen::Dynamic, 1>>;
34 using ConstEigenVectorArrayMap =
35 Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, 1>>;
37 using EigenOuterStride = Eigen::OuterStride<Eigen::Dynamic>;
38 using EigenInnerStride = Eigen::InnerStride<Eigen::Dynamic>;
39 using EigenStride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>;
41 using EigenOuterStridedMatrixMap = Eigen::
42 Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenOuterStride>;
44 using EigenOuterStridedArrayMap = Eigen::
45 Map<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenOuterStride>;
47 using ConstEigenOuterStridedMatrixMap = Eigen::Map<
48 const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>,
52 using ConstEigenOuterStridedArrayMap = Eigen::Map<
53 const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>,
57 using EigenStridedMatrixMap = Eigen::
58 Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenStride>;
60 using EigenStridedArrayMap =
61 Eigen::Map<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenStride>;
63 using ConstEigenStridedMatrixMap = Eigen::
64 Map<const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenStride>;
66 using ConstEigenStridedArrayMap = Eigen::
67 Map<const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>, 0, EigenStride>;
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>;
79 using EArrXXt = Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>;
80 using EArrXXf = Eigen::ArrayXXf;
85 Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
86 using ERArrXXf = ERArrXXt<float>;
90 using EVecXt = Eigen::Matrix<T, Eigen::Dynamic, 1>;
91 using EVecXd = Eigen::VectorXd;
92 using EVecXf = Eigen::VectorXf;
95 using ERVecXd = Eigen::RowVectorXd;
96 using ERVecXf = Eigen::RowVectorXf;
100 using EMatXt = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
101 using EMatXd = Eigen::MatrixXd;
102 using EMatXf = Eigen::MatrixXf;
105 template <
typename T>
107 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
108 using ERMatXd = ERMatXt<double>;
109 using ERMatXf = ERMatXt<float>;
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())};
117 template <
typename T>
118 Eigen::Map<EArrXt<T>> AsEArrXt(std::vector<T>& arr) {
119 return {arr.data(),
static_cast<int>(arr.size())};
123 template <
class Derived,
class Derived1,
class Derived2>
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);
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]];
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);
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));
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());
165 for (
int i = 0; i < row_indices.size(); i++) {
166 DCHECK_LT(row_indices[i], array2d.size());
168 array2d.row(row_indices[i]).template cast<typename Derived2::Scalar>();
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++) {
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...