1 #ifndef EIGEN_ACCELERATESUPPORT_H
2 #define EIGEN_ACCELERATESUPPORT_H
4 #include <Accelerate/Accelerate.h>
6 #include <Eigen/Sparse>
10 template <
typename MatrixType_,
int UpLo_, SparseFactorization_t Solver_,
bool EnforceSquare_>
24 template <
typename MatrixType,
int UpLo = Lower>
38 template <
typename MatrixType,
int UpLo = Lower>
52 template <
typename MatrixType,
int UpLo = Lower>
67 template <
typename MatrixType,
int UpLo = Lower>
81 template <
typename MatrixType,
int UpLo = Lower>
94 template <
typename MatrixType>
107 template <
typename MatrixType>
111 template <
typename T>
122 template <
typename DenseVecT,
typename DenseMatT,
typename SparseMatT,
typename NumFactT>
135 template <
typename Scalar>
140 SparseOpaqueFactorization_Double> {};
144 :
SparseTypesTraitBase<DenseVector_Float, DenseMatrix_Float, SparseMatrix_Float, SparseOpaqueFactorization_Float> {
149 template <
typename MatrixType_,
int UpLo_, SparseFactorization_t Solver_,
bool EnforceSquare_>
176 auto check_flag_set = [](
int value,
int flag) {
return ((
value & flag) == flag); };
180 m_triType = (UpLo_ &
Lower) ? SparseLowerTriangle : SparseUpperTriangle;
181 }
else if (check_flag_set(UpLo_,
UnitLower)) {
184 }
else if (check_flag_set(UpLo_,
UnitUpper)) {
193 }
else if (check_flag_set(UpLo_,
Lower)) {
196 }
else if (check_flag_set(UpLo_,
Upper)) {
201 m_triType = (UpLo_ &
Lower) ? SparseLowerTriangle : SparseUpperTriangle;
225 template <
typename Rhs,
typename Dest>
232 template <
typename T>
234 const Index nColumnsStarts =
a.cols() + 1;
236 columnStarts.resize(nColumnsStarts);
238 for (
Index i = 0;
i < nColumnsStarts;
i++) columnStarts[
i] =
a.outerIndexPtr()[
i];
240 SparseAttributes_t attributes{};
241 attributes.transpose =
false;
245 SparseMatrixStructure structure{};
246 structure.attributes = attributes;
247 structure.rowCount =
static_cast<int>(
a.rows());
248 structure.columnCount =
static_cast<int>(
a.cols());
249 structure.blockSize = 1;
250 structure.columnStarts = columnStarts.data();
251 structure.rowIndices =
const_cast<int*
>(
a.innerIndexPtr());
253 A.structure = structure;
254 A.
data =
const_cast<T*
>(
a.valuePtr());
260 SparseSymbolicFactorOptions opts{};
261 opts.control = SparseDefaultControl;
263 opts.order =
nullptr;
264 opts.ignoreRowsAndColumns =
nullptr;
265 opts.malloc = malloc;
267 opts.reportError =
nullptr;
279 SparseStatus_t status = SparseStatusReleased;
298 case SparseFactorizationFailed:
299 case SparseMatrixIsSingular:
302 case SparseInternalError:
303 case SparseParameterError:
304 case SparseStatusReleased:
321 template <
typename MatrixType_,
int UpLo_, SparseFactorization_t Solver_,
bool EnforceSquare_>
329 std::vector<long> columnStarts;
331 buildAccelSparseMatrix(
a,
A, columnStarts);
335 if (m_symbolicFactorization) doFactorization(
A);
337 m_isInitialized =
true;
346 template <
typename MatrixType_,
int UpLo_, SparseFactorization_t Solver_,
bool EnforceSquare_>
354 std::vector<long> columnStarts;
356 buildAccelSparseMatrix(
a,
A, columnStarts);
360 m_isInitialized =
true;
370 template <
typename MatrixType_,
int UpLo_, SparseFactorization_t Solver_,
bool EnforceSquare_>
372 eigen_assert(m_symbolicFactorization &&
"You must first call analyzePattern()");
378 std::vector<long> columnStarts;
380 buildAccelSparseMatrix(
a,
A, columnStarts);
385 template <
typename MatrixType_,
int UpLo_, SparseFactorization_t Solver_,
bool EnforceSquare_>
386 template <
typename Rhs,
typename Dest>
389 if (!m_numericFactorization) {
397 SparseStatus_t status = SparseStatusOK;
403 xmat.attributes = SparseAttributes_t();
404 xmat.columnCount =
static_cast<int>(
x.cols());
405 xmat.rowCount =
static_cast<int>(
x.rows());
406 xmat.columnStride = xmat.rowCount;
410 bmat.attributes = SparseAttributes_t();
411 bmat.columnCount =
static_cast<int>(
b.cols());
412 bmat.rowCount =
static_cast<int>(
b.rows());
413 bmat.columnStride = bmat.rowCount;
416 SparseSolve(*m_numericFactorization, bmat, xmat);
418 updateInfoStatus(status);
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define eigen_assert(x)
Definition: Macros.h:910
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Definition: AccelerateSupport.h:150
typename internal::SparseTypesTrait< Scalar >::SymbolicFactorizationDeleter SymbolicFactorizationDeleter
Definition: AccelerateSupport.h:170
MatrixType::StorageIndex StorageIndex
Definition: AccelerateSupport.h:161
@ UpLo
Definition: AccelerateSupport.h:163
typename internal::SparseTypesTrait< Scalar >::SymbolicFactorization SymbolicFactorization
Definition: AccelerateSupport.h:168
Index cols() const
Definition: AccelerateSupport.h:211
Index m_nRows
Definition: AccelerateSupport.h:312
std::unique_ptr< SymbolicFactorization, SymbolicFactorizationDeleter > m_symbolicFactorization
Definition: AccelerateSupport.h:313
SparseOrder_t m_order
Definition: AccelerateSupport.h:317
@ ColsAtCompileTime
Definition: AccelerateSupport.h:162
@ MaxColsAtCompileTime
Definition: AccelerateSupport.h:162
Index rows() const
Definition: AccelerateSupport.h:212
SparseKind_t m_sparseKind
Definition: AccelerateSupport.h:315
void analyzePattern(const MatrixType &matrix)
Definition: AccelerateSupport.h:347
ComputationInfo info() const
Definition: AccelerateSupport.h:214
std::unique_ptr< NumericFactorization, NumericFactorizationDeleter > m_numericFactorization
Definition: AccelerateSupport.h:314
void doFactorization(AccelSparseMatrix &A)
Definition: AccelerateSupport.h:278
~AccelerateImpl()
Definition: AccelerateSupport.h:209
MatrixType_ MatrixType
Definition: AccelerateSupport.h:159
typename internal::SparseTypesTrait< Scalar >::AccelDenseVector AccelDenseVector
Definition: AccelerateSupport.h:165
void factorize(const MatrixType &matrix)
Definition: AccelerateSupport.h:371
typename internal::SparseTypesTrait< Scalar >::AccelSparseMatrix AccelSparseMatrix
Definition: AccelerateSupport.h:167
typename internal::SparseTypesTrait< Scalar >::NumericFactorizationDeleter NumericFactorizationDeleter
Definition: AccelerateSupport.h:171
void doAnalysis(AccelSparseMatrix &A)
Definition: AccelerateSupport.h:257
AccelerateImpl()
Definition: AccelerateSupport.h:173
typename internal::SparseTypesTrait< Scalar >::AccelDenseMatrix AccelDenseMatrix
Definition: AccelerateSupport.h:166
ComputationInfo m_info
Definition: AccelerateSupport.h:311
MatrixType::Scalar Scalar
Definition: AccelerateSupport.h:160
SparseTriangle_t m_triType
Definition: AccelerateSupport.h:316
AccelerateImpl(const MatrixType &matrix)
Definition: AccelerateSupport.h:207
void setOrder(SparseOrder_t order)
Definition: AccelerateSupport.h:229
bool m_isInitialized
Definition: SparseSolverBase.h:110
typename internal::SparseTypesTrait< Scalar >::NumericFactorization NumericFactorization
Definition: AccelerateSupport.h:169
void buildAccelSparseMatrix(const SparseMatrix< T > &a, AccelSparseMatrix &A, std::vector< long > &columnStarts)
Definition: AccelerateSupport.h:233
void compute(const MatrixType &matrix)
Definition: AccelerateSupport.h:322
Index m_nCols
Definition: AccelerateSupport.h:312
void _solve_impl(const MatrixBase< Rhs > &b, MatrixBase< Dest > &dest) const
Definition: AccelerateSupport.h:387
void updateInfoStatus(SparseStatus_t status) const
Definition: AccelerateSupport.h:293
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
constexpr EIGEN_DEVICE_FUNC const Scalar * data() const
Definition: PlainObjectBase.h:273
A versatible sparse matrix representation.
Definition: SparseMatrix.h:121
A base class for sparse solvers.
Definition: SparseSolverBase.h:67
void _solve_impl(const SparseMatrixBase< Rhs > &b, SparseMatrixBase< Dest > &dest) const
Definition: SparseSolverBase.h:104
bool m_isInitialized
Definition: SparseSolverBase.h:110
Derived & derived()
Definition: SparseSolverBase.h:76
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
ComputationInfo
Definition: Constants.h:438
@ StrictlyLower
Definition: Constants.h:223
@ StrictlyUpper
Definition: Constants.h:225
@ UnitLower
Definition: Constants.h:219
@ Symmetric
Definition: Constants.h:229
@ UnitUpper
Definition: Constants.h:221
@ Lower
Definition: Constants.h:211
@ Upper
Definition: Constants.h:213
@ NumericalIssue
Definition: Constants.h:442
@ InvalidInput
Definition: Constants.h:447
@ Success
Definition: Constants.h:440
const Scalar * a
Definition: level2_cplx_impl.h:32
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
squared absolute value
Definition: GlobalFunctions.h:87
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
Definition: AccelerateSupport.h:112
void operator()(T *sym)
Definition: AccelerateSupport.h:113
Definition: AccelerateSupport.h:123
DenseVecT AccelDenseVector
Definition: AccelerateSupport.h:124
SparseOpaqueSymbolicFactorization SymbolicFactorization
Definition: AccelerateSupport.h:128
DenseMatT AccelDenseMatrix
Definition: AccelerateSupport.h:125
AccelFactorizationDeleter< NumericFactorization > NumericFactorizationDeleter
Definition: AccelerateSupport.h:132
NumFactT NumericFactorization
Definition: AccelerateSupport.h:129
AccelFactorizationDeleter< SymbolicFactorization > SymbolicFactorizationDeleter
Definition: AccelerateSupport.h:131
SparseMatT AccelSparseMatrix
Definition: AccelerateSupport.h:126
Definition: AccelerateSupport.h:136