123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #ifndef CERES_INTERNAL_ACCELERATE_SPARSE_H_
- #define CERES_INTERNAL_ACCELERATE_SPARSE_H_
- #include "ceres/internal/config.h"
- #ifndef CERES_NO_ACCELERATE_SPARSE
- #include <memory>
- #include <string>
- #include <vector>
- #include "Accelerate.h"
- #include "ceres/linear_solver.h"
- #include "ceres/sparse_cholesky.h"
- namespace ceres {
- namespace internal {
- class CompressedRowSparseMatrix;
- class TripletSparseMatrix;
- template <typename Scalar>
- struct SparseTypesTrait {};
- template <>
- struct SparseTypesTrait<double> {
- using DenseVector = DenseVector_Double;
- using SparseMatrix = SparseMatrix_Double;
- using SymbolicFactorization = SparseOpaqueSymbolicFactorization;
- using NumericFactorization = SparseOpaqueFactorization_Double;
- };
- template <>
- struct SparseTypesTrait<float> {
- using DenseVector = DenseVector_Float;
- using SparseMatrix = SparseMatrix_Float;
- using SymbolicFactorization = SparseOpaqueSymbolicFactorization;
- using NumericFactorization = SparseOpaqueFactorization_Float;
- };
- template <typename Scalar>
- class AccelerateSparse {
- public:
- using DenseVector = typename SparseTypesTrait<Scalar>::DenseVector;
-
- using ASSparseMatrix = typename SparseTypesTrait<Scalar>::SparseMatrix;
- using SymbolicFactorization =
- typename SparseTypesTrait<Scalar>::SymbolicFactorization;
- using NumericFactorization =
- typename SparseTypesTrait<Scalar>::NumericFactorization;
-
-
- void Solve(NumericFactorization* numeric_factor,
- DenseVector* rhs_and_solution);
-
-
-
-
- ASSparseMatrix CreateSparseMatrixTransposeView(CompressedRowSparseMatrix* A);
-
- SymbolicFactorization AnalyzeCholesky(OrderingType ordering_type,
- ASSparseMatrix* A);
-
-
- NumericFactorization Cholesky(ASSparseMatrix* A,
- SymbolicFactorization* symbolic_factor);
-
-
- void Cholesky(ASSparseMatrix* A, NumericFactorization* numeric_factor);
- private:
- std::vector<long> column_starts_;
- std::vector<uint8_t> solve_workspace_;
- std::vector<uint8_t> factorization_workspace_;
-
- Eigen::Matrix<Scalar, Eigen::Dynamic, 1> values_;
- };
- template <typename Scalar>
- class AppleAccelerateCholesky final : public SparseCholesky {
- public:
-
- static std::unique_ptr<SparseCholesky> Create(OrderingType ordering_type);
-
- virtual ~AppleAccelerateCholesky();
- CompressedRowSparseMatrix::StorageType StorageType() const;
- LinearSolverTerminationType Factorize(CompressedRowSparseMatrix* lhs,
- std::string* message) final;
- LinearSolverTerminationType Solve(const double* rhs,
- double* solution,
- std::string* message) final;
- private:
- AppleAccelerateCholesky(const OrderingType ordering_type);
- void FreeSymbolicFactorization();
- void FreeNumericFactorization();
- const OrderingType ordering_type_;
- AccelerateSparse<Scalar> as_;
- std::unique_ptr<typename AccelerateSparse<Scalar>::SymbolicFactorization>
- symbolic_factor_;
- std::unique_ptr<typename AccelerateSparse<Scalar>::NumericFactorization>
- numeric_factor_;
-
- Eigen::Matrix<Scalar, Eigen::Dynamic, 1> scalar_rhs_and_solution_;
- };
- }
- }
- #endif
- #endif
|