// Copyright 2004-present Facebook. All Rights Reserved. #ifndef CAFFE2_OPERATORS_UTILS_EIGEN_H_ #define CAFFE2_OPERATORS_UTILS_EIGEN_H_ #include "Eigen/Core" #include "Eigen/Dense" #include "caffe2/core/logging.h" namespace caffe2 { // Common Eigen types that we will often use template using EigenMatrixMap = Eigen::Map>; template using EigenArrayMap = Eigen::Map>; template using EigenVectorMap = Eigen::Map>; template using EigenVectorArrayMap = Eigen::Map>; template using ConstEigenMatrixMap = Eigen::Map>; template using ConstEigenArrayMap = Eigen::Map>; template using ConstEigenVectorMap = Eigen::Map>; template using ConstEigenVectorArrayMap = Eigen::Map>; using EigenOuterStride = Eigen::OuterStride; using EigenInnerStride = Eigen::InnerStride; using EigenStride = Eigen::Stride; template using EigenOuterStridedMatrixMap = Eigen:: Map, 0, EigenOuterStride>; template using EigenOuterStridedArrayMap = Eigen:: Map, 0, EigenOuterStride>; template using ConstEigenOuterStridedMatrixMap = Eigen::Map< const Eigen::Matrix, 0, EigenOuterStride>; template using ConstEigenOuterStridedArrayMap = Eigen::Map< const Eigen::Array, 0, EigenOuterStride>; template using EigenStridedMatrixMap = Eigen:: Map, 0, EigenStride>; template using EigenStridedArrayMap = Eigen::Map, 0, EigenStride>; template using ConstEigenStridedMatrixMap = Eigen:: Map, 0, EigenStride>; template using ConstEigenStridedArrayMap = Eigen:: Map, 0, EigenStride>; // 1-d array template using EArrXt = Eigen::Array; using EArrXf = Eigen::ArrayXf; using EArrXd = Eigen::ArrayXd; using EArrXi = Eigen::ArrayXi; using EArrXb = EArrXt; // 2-d array, column major template using EArrXXt = Eigen::Array; using EArrXXf = Eigen::ArrayXXf; // 2-d array, row major template using ERArrXXt = Eigen::Array; using ERArrXXf = ERArrXXt; // 1-d vector template using EVecXt = Eigen::Matrix; using EVecXd = Eigen::VectorXd; using EVecXf = Eigen::VectorXf; // 1-d row vector using ERVecXd = Eigen::RowVectorXd; using ERVecXf = Eigen::RowVectorXf; // 2-d matrix, column major template using EMatXt = Eigen::Matrix; using EMatXd = Eigen::MatrixXd; using EMatXf = Eigen::MatrixXf; // 2-d matrix, row major template using ERMatXt = Eigen::Matrix; using ERMatXd = ERMatXt; using ERMatXf = ERMatXt; namespace utils { template Eigen::Map> AsEArrXt(const std::vector& arr) { return {arr.data(), static_cast(arr.size())}; } template Eigen::Map> AsEArrXt(std::vector& arr) { return {arr.data(), static_cast(arr.size())}; } // return a sub array of 'array' based on indices 'indices' template void GetSubArray( const Eigen::ArrayBase& array, const Eigen::ArrayBase& indices, Eigen::ArrayBase* out_array) { CAFFE_ENFORCE_EQ(array.cols(), 1); // using T = typename Derived::Scalar; out_array->derived().resize(indices.size()); for (int i = 0; i < indices.size(); i++) { DCHECK_LT(indices[i], array.size()); (*out_array)[i] = array[indices[i]]; } } // return a sub array of 'array' based on indices 'indices' template EArrXt GetSubArray( const Eigen::ArrayBase& array, const Eigen::ArrayBase& indices) { using T = typename Derived::Scalar; EArrXt ret(indices.size()); GetSubArray(array, indices, &ret); return ret; } // return a sub array of 'array' based on indices 'indices' template EArrXt GetSubArray( const Eigen::ArrayBase& array, const std::vector& indices) { return GetSubArray(array, AsEArrXt(indices)); } // return 2d sub array of 'array' based on row indices 'row_indices' template void GetSubArrayRows( const Eigen::ArrayBase& array2d, const Eigen::ArrayBase& row_indices, Eigen::ArrayBase* out_array) { out_array->derived().resize(row_indices.size(), array2d.cols()); for (int i = 0; i < row_indices.size(); i++) { DCHECK_LT(row_indices[i], array2d.size()); out_array->row(i) = array2d.row(row_indices[i]).template cast(); } } // return indices of 1d array for elements evaluated to true template std::vector GetArrayIndices(const Eigen::ArrayBase& array) { std::vector ret; for (int i = 0; i < array.size(); i++) { if (array[i]) { ret.push_back(i); } } return ret; } } // namespace utils } // namespace caffe2 #endif