123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- #ifndef CERES_INTERNAL_VISIBILITY_BASED_PRECONDITIONER_H_
- #define CERES_INTERNAL_VISIBILITY_BASED_PRECONDITIONER_H_
- #include <memory>
- #include <set>
- #include <unordered_map>
- #include <unordered_set>
- #include <utility>
- #include <vector>
- #include "ceres/block_structure.h"
- #include "ceres/graph.h"
- #include "ceres/linear_solver.h"
- #include "ceres/pair_hash.h"
- #include "ceres/preconditioner.h"
- #include "ceres/sparse_cholesky.h"
- namespace ceres::internal {
- class BlockRandomAccessSparseMatrix;
- class BlockSparseMatrix;
- struct CompressedRowBlockStructure;
- class SchurEliminatorBase;
- class CERES_NO_EXPORT VisibilityBasedPreconditioner
- : public BlockSparseMatrixPreconditioner {
- public:
-
-
-
-
-
-
- VisibilityBasedPreconditioner(const CompressedRowBlockStructure& bs,
- Preconditioner::Options options);
- VisibilityBasedPreconditioner(const VisibilityBasedPreconditioner&) = delete;
- void operator=(const VisibilityBasedPreconditioner&) = delete;
- ~VisibilityBasedPreconditioner() override;
-
- void RightMultiplyAndAccumulate(const double* x, double* y) const final;
- int num_rows() const final;
- friend class VisibilityBasedPreconditionerTest;
- private:
- bool UpdateImpl(const BlockSparseMatrix& A, const double* D) final;
- void ComputeClusterJacobiSparsity(const CompressedRowBlockStructure& bs);
- void ComputeClusterTridiagonalSparsity(const CompressedRowBlockStructure& bs);
- void InitStorage(const CompressedRowBlockStructure& bs);
- void InitEliminator(const CompressedRowBlockStructure& bs);
- LinearSolverTerminationType Factorize();
- void ScaleOffDiagonalCells();
- void ClusterCameras(const std::vector<std::set<int>>& visibility);
- void FlattenMembershipMap(const std::unordered_map<int, int>& membership_map,
- std::vector<int>* membership_vector) const;
- void ComputeClusterVisibility(
- const std::vector<std::set<int>>& visibility,
- std::vector<std::set<int>>* cluster_visibility) const;
- std::unique_ptr<WeightedGraph<int>> CreateClusterGraph(
- const std::vector<std::set<int>>& visibility) const;
- void ForestToClusterPairs(
- const WeightedGraph<int>& forest,
- std::unordered_set<std::pair<int, int>, pair_hash>* cluster_pairs) const;
- void ComputeBlockPairsInPreconditioner(const CompressedRowBlockStructure& bs);
- bool IsBlockPairInPreconditioner(int block1, int block2) const;
- bool IsBlockPairOffDiagonal(int block1, int block2) const;
- Preconditioner::Options options_;
-
- int num_blocks_;
- int num_clusters_;
-
- std::vector<Block> blocks_;
-
- std::vector<int> cluster_membership_;
-
-
-
- std::set<std::pair<int, int>> block_pairs_;
-
-
- std::unordered_set<std::pair<int, int>, pair_hash> cluster_pairs_;
- std::unique_ptr<SchurEliminatorBase> eliminator_;
-
- std::unique_ptr<BlockRandomAccessSparseMatrix> m_;
- std::unique_ptr<CompressedRowSparseMatrix> m_crs_;
- std::unique_ptr<SparseCholesky> sparse_cholesky_;
- };
- }
- #endif
|