Skip to content

Commit

Permalink
Eigen3.3 compatibility
Browse files Browse the repository at this point in the history
- removed `bool` support in `linalg::add()`
- changed data type in `linalg::choleksy_solver()`
  • Loading branch information
OXPHOS committed Feb 26, 2017
1 parent c1d17d9 commit e2fc2d0
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 10 deletions.
29 changes: 22 additions & 7 deletions src/shogun/mathematics/linalg/LinalgBackendEigen.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,28 @@ class LinalgBackendEigen : public LinalgBackendBase
METHODNAME(floatmax_t, Container); \
METHODNAME(complex128_t, Container);

#define DEFINE_FOR_NUMERIC_PTYPE(METHODNAME, Container) \
METHODNAME(char, Container); \
METHODNAME(int8_t, Container); \
METHODNAME(uint8_t, Container); \
METHODNAME(int16_t, Container); \
METHODNAME(uint16_t, Container); \
METHODNAME(int32_t, Container); \
METHODNAME(uint32_t, Container); \
METHODNAME(int64_t, Container); \
METHODNAME(uint64_t, Container); \
METHODNAME(float32_t, Container); \
METHODNAME(float64_t, Container); \
METHODNAME(floatmax_t, Container);

/** Implementation of @see LinalgBackendBase::add */
#define BACKEND_GENERIC_IN_PLACE_ADD(Type, Container) \
virtual void add(Container<Type>& a, Container<Type>& b, Type alpha, Type beta, Container<Type>& result) const \
{ \
add_impl(a, b, alpha, beta, result); \
}
DEFINE_FOR_ALL_PTYPE(BACKEND_GENERIC_IN_PLACE_ADD, SGVector)
DEFINE_FOR_ALL_PTYPE(BACKEND_GENERIC_IN_PLACE_ADD, SGMatrix)
DEFINE_FOR_NUMERIC_PTYPE(BACKEND_GENERIC_IN_PLACE_ADD, SGVector)
DEFINE_FOR_NUMERIC_PTYPE(BACKEND_GENERIC_IN_PLACE_ADD, SGMatrix)
#undef BACKEND_GENERIC_IN_PLACE_ADD

/** Implementation of @see LinalgBackendBase::cholesky_factor */
Expand Down Expand Up @@ -355,14 +369,15 @@ class LinalgBackendEigen : public LinalgBackendBase

if (lower == false)
{
Eigen::TriangularView<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>,
Eigen::Upper> tlv(L_eig);
Eigen::TriangularView<Eigen::Map<typename SGMatrix<T>::EigenMatrixXt,
0, Eigen::Stride<0,0> >, Eigen::Upper> tlv(L_eig);

x_eig = (tlv.transpose()).solve(tlv.solve(b_eig));
}
else
{
Eigen::TriangularView<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>,
Eigen::Lower> tlv(L_eig);
Eigen::TriangularView<Eigen::Map<typename SGMatrix<T>::EigenMatrixXt,
0, Eigen::Stride<0,0> >, Eigen::Lower> tlv(L_eig);
x_eig = (tlv.transpose()).solve(tlv.solve(b_eig));
}

Expand Down Expand Up @@ -403,7 +418,7 @@ class LinalgBackendEigen : public LinalgBackendBase

result_eig = a_block.array() * b_block.array();
}

/** Eigen3 matrix * vector in-place product method */
template <typename T>
void matrix_prod_impl(SGMatrix<T>& a, SGVector<T>& b, SGVector<T>& result,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,7 @@ TEST(LinalgBackendEigen, SGMatrix_cholesky_llt_upper)
EXPECT_EQ(m.num_cols, U.num_cols);
}

// Temporarily disabled because Travis fails to calculate:
// Eigen::TriangularView.solve(vector)
TEST(LinalgBackendEigen, DISABLED_SGMatrix_cholesky_solver)
TEST(LinalgBackendEigen, SGMatrix_cholesky_solver)
{
const index_t size=2;
SGMatrix<float64_t> A(size, size);
Expand Down

0 comments on commit e2fc2d0

Please sign in to comment.