Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 22 additions & 8 deletions python_numpy/python_numpy_base_simplification.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -732,26 +732,40 @@ struct RepeatMatrix<0, MATRIX_Type, Args...> {

template <std::size_t M, std::size_t N, typename MATRIX_Type,
std::size_t... Indices>
inline auto implement(const MATRIX_Type &matrix,
index_sequence_for_tile<Indices...>)
-> Tile_Type<M, N, MATRIX_Type> {
inline void calculate(Tile_Type<M, N, MATRIX_Type> &Concatenated,
const MATRIX_Type &matrix,
index_sequence_for_tile<Indices...>) {

return concatenate_block<M, N>((static_cast<void>(Indices), matrix)...);
update_block_concatenated_matrix<M, N>(
Concatenated, (static_cast<void>(Indices), matrix)...);
}

} // namespace TileOperation

template <std::size_t M, std::size_t N, typename MATRIX_Type>
inline auto concatenate_tile(const MATRIX_Type &matrix)
-> Tile_Type<M, N, MATRIX_Type> {
inline void
update_tile_concatenated_matrix(Tile_Type<M, N, MATRIX_Type> &Concatenated,
const MATRIX_Type &matrix) {

static_assert(M > 0, "M must be greater than 0.");
static_assert(N > 0, "N must be greater than 0.");

constexpr std::size_t TotalCount = M * N;

return TileOperation::implement<M, N>(
matrix, TileOperation::make_index_sequence_for_tile<TotalCount>{});
TileOperation::calculate<M, N>(
Concatenated, matrix,
TileOperation::make_index_sequence_for_tile<TotalCount>{});
}

template <std::size_t M, std::size_t N, typename MATRIX_Type>
inline auto concatenate_tile(const MATRIX_Type &matrix)
-> Tile_Type<M, N, MATRIX_Type> {

Tile_Type<M, N, MATRIX_Type> Concatenated;

update_tile_concatenated_matrix<M, N>(Concatenated, matrix);

return Concatenated;
}

} // namespace PythonNumpy
Expand Down
27 changes: 18 additions & 9 deletions python_numpy/python_numpy_linalg_cholesky.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,19 @@ template <typename A_Type> class LinalgSolverCholesky {
/* Type */
using _T = typename A_Type::Value_Type;

using _CholeskyTriangularRowIndices =
UpperTriangularRowIndices<A_Type::COLS, A_Type::COLS>;
using _CholeskyTriangularRowPointers =
UpperTriangularRowPointers<A_Type::COLS, A_Type::COLS>;

public:
/* Constructor */
LinalgSolverCholesky() {}
LinalgSolverCholesky()
: _cholesky_decomposed_matrix(),
_cholesky_decomposed_triangular(
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_upper()),
_zero_div_flag(false) {}

/* Copy Constructor */
LinalgSolverCholesky(const LinalgSolverCholesky<A_Type> &other)
Expand Down Expand Up @@ -151,14 +161,13 @@ template <typename A_Type> class LinalgSolverCholesky {
/* Variable */
Base::Matrix::Matrix<_T, A_Type::COLS, A_Type::COLS>
_cholesky_decomposed_matrix;
Base::Matrix::CompiledSparseMatrix<
_T, A_Type::COLS, A_Type::COLS,
UpperTriangularRowIndices<A_Type::COLS, A_Type::COLS>,
UpperTriangularRowPointers<A_Type::COLS, A_Type::COLS>>
_cholesky_decomposed_triangular =
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_upper();
bool _zero_div_flag = false;

Base::Matrix::CompiledSparseMatrix<_T, A_Type::COLS, A_Type::COLS,
_CholeskyTriangularRowIndices,
_CholeskyTriangularRowPointers>
_cholesky_decomposed_triangular;

bool _zero_div_flag;
};

/* make LinalgSolverCholesky */
Expand Down
10 changes: 5 additions & 5 deletions python_numpy/python_numpy_linalg_eig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ template <typename T, std::size_t M> class LinalgSolverEigRealDense {

public:
/* Constructor */
LinalgSolverEigRealDense() {}
LinalgSolverEigRealDense() : _Eigen_solver() {}

/* Copy Constructor */
LinalgSolverEigRealDense(const LinalgSolverEigRealDense<T, M> &other)
Expand Down Expand Up @@ -136,7 +136,7 @@ template <typename T, std::size_t M> class LinalgSolverEigRealDiag {

public:
/* Constructor */
LinalgSolverEigRealDiag() {}
LinalgSolverEigRealDiag() : _eigen_values() {}

/* Copy Constructor */
LinalgSolverEigRealDiag(const LinalgSolverEigRealDiag<T, M> &other)
Expand Down Expand Up @@ -208,7 +208,7 @@ class LinalgSolverEigRealSparse {

public:
/* Constructor */
LinalgSolverEigRealSparse() {}
LinalgSolverEigRealSparse() : _Eigen_solver() {}

/* Copy Constructor */
LinalgSolverEigRealSparse(
Expand Down Expand Up @@ -362,7 +362,7 @@ template <typename T, std::size_t M> class LinalgSolverEigDense {

public:
/* Constructor */
LinalgSolverEigDense() {}
LinalgSolverEigDense() : _Eigen_solver() {}

/* Copy Constructor */
LinalgSolverEigDense(const LinalgSolverEigDense<T, M> &other)
Expand Down Expand Up @@ -477,7 +477,7 @@ template <typename T, std::size_t M> class LinalgSolverEigDiag {

public:
/* Constructor */
LinalgSolverEigDiag() {}
LinalgSolverEigDiag() : _eigen_values() {}

/* Copy Constructor */
LinalgSolverEigDiag(const LinalgSolverEigDiag<T, M> &other)
Expand Down
60 changes: 42 additions & 18 deletions python_numpy/python_numpy_linalg_lu.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,23 +37,54 @@ template <typename A_Type> class LinalgSolverLU {
/* Type */
using _T = typename A_Type::Value_Type;

using _L_RowIndices =
Base::Matrix::LowerTriangularRowIndices<A_Type::COLS, A_Type::COLS>;
using _L_RowPointers =
Base::Matrix::LowerTriangularRowPointers<A_Type::COLS, A_Type::COLS>;

using _U_RowIndices =
Base::Matrix::UpperTriangularRowIndices<A_Type::COLS, A_Type::COLS>;
using _U_RowPointers =
Base::Matrix::UpperTriangularRowPointers<A_Type::COLS, A_Type::COLS>;

public:
/* Constructor */
template <
typename U = A_Type,
typename std::enable_if<Is_Dense_Matrix<U>::value>::type * = nullptr>
LinalgSolverLU() {
LinalgSolverLU()
: _LU_decomposer(),
_L_triangular(
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_lower()),
_U_triangular(
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_upper()) {
this->_LU_decomposer = Base::Matrix::LUDecomposition<_T, A_Type::COLS>();
}

template <typename U = A_Type,
typename std::enable_if<Is_Diag_Matrix<U>::value>::type * = nullptr>
LinalgSolverLU() {}
LinalgSolverLU()
: _LU_decomposer(),
_L_triangular(
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_lower()),
_U_triangular(
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_upper()) {}

template <
typename U = A_Type,
typename std::enable_if<Is_Sparse_Matrix<U>::value>::type * = nullptr>
LinalgSolverLU() {
LinalgSolverLU()
: _LU_decomposer(),
_L_triangular(
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_lower()),
_U_triangular(
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_upper()) {
this->_LU_decomposer = Base::Matrix::LUDecomposition<_T, A_Type::COLS>();
}

Expand Down Expand Up @@ -144,21 +175,14 @@ template <typename A_Type> class LinalgSolverLU {
private:
/* Variable */
Base::Matrix::LUDecomposition<_T, A_Type::COLS> _LU_decomposer;
Base::Matrix::CompiledSparseMatrix<
_T, A_Type::COLS, A_Type::COLS,
Base::Matrix::LowerTriangularRowIndices<A_Type::COLS, A_Type::COLS>,
Base::Matrix::LowerTriangularRowPointers<A_Type::COLS, A_Type::COLS>>
_L_triangular =
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_lower();

Base::Matrix::CompiledSparseMatrix<
_T, A_Type::COLS, A_Type::COLS,
Base::Matrix::UpperTriangularRowIndices<A_Type::COLS, A_Type::COLS>,
Base::Matrix::UpperTriangularRowPointers<A_Type::COLS, A_Type::COLS>>
_U_triangular =
Base::Matrix::TriangularSparse<_T, A_Type::COLS,
A_Type::COLS>::create_upper();

Base::Matrix::CompiledSparseMatrix<_T, A_Type::COLS, A_Type::COLS,
_L_RowIndices, _L_RowPointers>
_L_triangular;

Base::Matrix::CompiledSparseMatrix<_T, A_Type::COLS, A_Type::COLS,
_U_RowIndices, _U_RowPointers>
_U_triangular;
};

/* make LinalgSolverLU */
Expand Down
61 changes: 39 additions & 22 deletions python_numpy/python_numpy_linalg_qr.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,18 @@ template <typename T, std::size_t M, std::size_t N> class LinalgSolverQR {
static_assert(std::is_same<T, double>::value || std::is_same<T, float>::value,
"Value data type must be float or double.");

private:
/* Type */
using _R_TriangluarRowIndices = Base::Matrix::UpperTriangularRowIndices<M, N>;
using _R_TriangluarRowPointers =
Base::Matrix::UpperTriangularRowPointers<M, N>;

public:
/* Constructor */
LinalgSolverQR() {}
LinalgSolverQR()
: _QR_decomposer(),
_R_triangular(Base::Matrix::TriangularSparse<T, M, N>::create_upper()) {
}

/* Copy Constructor */
LinalgSolverQR(const LinalgSolverQR<T, M, N> &other)
Expand Down Expand Up @@ -56,19 +65,17 @@ template <typename T, std::size_t M, std::size_t N> class LinalgSolverQR {
}

/* Get Q, R */
inline auto get_R(void)
-> Matrix<DefSparse, T, M, N,
CreateSparseAvailableFromIndicesAndPointers<
N, Base::Matrix::UpperTriangularRowIndices<M, N>,
Base::Matrix::UpperTriangularRowPointers<M, N>>> const {
inline auto get_R(void) -> Matrix<
DefSparse, T, M, N,
CreateSparseAvailableFromIndicesAndPointers<
N, _R_TriangluarRowIndices, _R_TriangluarRowPointers>> const {

Base::Matrix::TriangularSparse<T, M, N>::set_values_upper(
this->_R_triangular, this->_QR_decomposer.get_R());

return Matrix<DefSparse, T, M, N,
CreateSparseAvailableFromIndicesAndPointers<
N, Base::Matrix::UpperTriangularRowIndices<M, N>,
Base::Matrix::UpperTriangularRowPointers<M, N>>>(
N, _R_TriangluarRowIndices, _R_TriangluarRowPointers>>(
this->_R_triangular);
}

Expand All @@ -91,16 +98,16 @@ template <typename T, std::size_t M, std::size_t N> class LinalgSolverQR {
private:
/* Properties */
Base::Matrix::QRDecomposition<T, M, N> _QR_decomposer;
Base::Matrix::CompiledSparseMatrix<
T, M, N, Base::Matrix::UpperTriangularRowIndices<M, N>,
Base::Matrix::UpperTriangularRowPointers<M, N>>
_R_triangular = Base::Matrix::TriangularSparse<T, M, N>::create_upper();

Base::Matrix::CompiledSparseMatrix<T, M, N, _R_TriangluarRowIndices,
_R_TriangluarRowPointers>
_R_triangular;
};

template <typename T, std::size_t M> class LinalgSolverQRDiag {
public:
/* Constructor */
LinalgSolverQRDiag() {}
LinalgSolverQRDiag() : _R() {}

/* Copy Constructor */
LinalgSolverQRDiag(const LinalgSolverQRDiag<T, M> &other) : _R(other._R) {}
Expand Down Expand Up @@ -141,6 +148,18 @@ template <typename T, std::size_t M> class LinalgSolverQRDiag {

template <typename T, std::size_t M, std::size_t N, typename SparseAvailable>
class LinalgSolverQRSparse {
public:
/* Type */
using Value_Type = T;
static_assert(std::is_same<T, double>::value || std::is_same<T, float>::value,
"Value data type must be float or double.");

private:
/* Type */
using _R_TriangluarRowIndices = Base::Matrix::UpperTriangularRowIndices<M, N>;
using _R_TriangluarRowPointers =
Base::Matrix::UpperTriangularRowPointers<M, N>;

public:
/* Constructor */
LinalgSolverQRSparse() {}
Expand Down Expand Up @@ -181,18 +200,17 @@ class LinalgSolverQRSparse {
this->_QR_decomposer.solve(A.matrix);
}

inline auto get_R(void)
-> Matrix<DefSparse, T, M, N,
CreateSparseAvailableFromIndicesAndPointers<
N, Base::Matrix::UpperTriangularRowIndices<M, N>,
Base::Matrix::UpperTriangularRowPointers<M, N>>> const {
inline auto get_R(void) -> Matrix<
DefSparse, T, M, N,
CreateSparseAvailableFromIndicesAndPointers<
N, _R_TriangluarRowIndices, _R_TriangluarRowPointers>> const {

Base::Matrix::TriangularSparse<T, M, N>::set_values_upper(
this->_R_triangular, this->_QR_decomposer.get_R());

return Base::Matrix::CompiledSparseMatrix<
T, M, N, Base::Matrix::UpperTriangularRowIndices<M, M>,
Base::Matrix::UpperTriangularRowPointers<M, N>>(this->_R_triangular);
_R_TriangluarRowPointers>(this->_R_triangular);
}

inline auto get_Q(void) -> Matrix<DefDense, T, M, M> const {
Expand All @@ -218,9 +236,8 @@ class LinalgSolverQRSparse {
Base::Matrix::RowPointersFromSparseAvailable<SparseAvailable>>
_QR_decomposer;

Base::Matrix::CompiledSparseMatrix<
T, M, N, Base::Matrix::UpperTriangularRowIndices<M, N>,
Base::Matrix::UpperTriangularRowPointers<M, N>>
Base::Matrix::CompiledSparseMatrix<T, M, N, _R_TriangluarRowIndices,
_R_TriangluarRowPointers>
_R_triangular = Base::Matrix::TriangularSparse<T, M, N>::create_upper();
};

Expand Down
Loading