Use absl::btree_map instead of std::map Change-Id: Iece280a6cb0f37fa0bc572046b9d7f79ca825ebc
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt index 4c501a5..1355a38 100644 --- a/internal/ceres/CMakeLists.txt +++ b/internal/ceres/CMakeLists.txt
@@ -49,6 +49,7 @@ list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES absl::time) list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES absl::flat_hash_map) list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES absl::flat_hash_set) +list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES absl::btree) list(APPEND CERES_LIBRARY_PUBLIC_DEPENDENCIES absl::log) list(APPEND CERES_LIBRARY_PUBLIC_DEPENDENCIES absl::check)
diff --git a/internal/ceres/block_random_access_sparse_matrix.cc b/internal/ceres/block_random_access_sparse_matrix.cc index 6694d06..4d12044 100644 --- a/internal/ceres/block_random_access_sparse_matrix.cc +++ b/internal/ceres/block_random_access_sparse_matrix.cc
@@ -32,10 +32,10 @@ #include <algorithm> #include <memory> -#include <set> #include <utility> #include <vector> +#include "absl/container/btree_set.h" #include "absl/log/check.h" #include "absl/log/log.h" #include "ceres/internal/export.h" @@ -47,7 +47,7 @@ BlockRandomAccessSparseMatrix::BlockRandomAccessSparseMatrix( const std::vector<Block>& blocks, - const std::set<std::pair<int, int>>& block_pairs, + const absl::btree_set<std::pair<int, int>>& block_pairs, ContextImpl* context, int num_threads) : blocks_(blocks), context_(context), num_threads_(num_threads) {
diff --git a/internal/ceres/block_random_access_sparse_matrix.h b/internal/ceres/block_random_access_sparse_matrix.h index 5121832..b4bfe44 100644 --- a/internal/ceres/block_random_access_sparse_matrix.h +++ b/internal/ceres/block_random_access_sparse_matrix.h
@@ -33,11 +33,11 @@ #include <cstdint> #include <memory> -#include <set> #include <unordered_map> #include <utility> #include <vector> +#include "absl/container/btree_set.h" #include "ceres/block_random_access_matrix.h" #include "ceres/block_sparse_matrix.h" #include "ceres/block_structure.h" @@ -61,7 +61,7 @@ // of this matrix. BlockRandomAccessSparseMatrix( const std::vector<Block>& blocks, - const std::set<std::pair<int, int>>& block_pairs, + const absl::btree_set<std::pair<int, int>>& block_pairs, ContextImpl* context, int num_threads);
diff --git a/internal/ceres/block_random_access_sparse_matrix_test.cc b/internal/ceres/block_random_access_sparse_matrix_test.cc index 3740682..23f2527 100644 --- a/internal/ceres/block_random_access_sparse_matrix_test.cc +++ b/internal/ceres/block_random_access_sparse_matrix_test.cc
@@ -32,10 +32,10 @@ #include <limits> #include <memory> -#include <set> #include <utility> #include <vector> +#include "absl/container/btree_set.h" #include "ceres/internal/eigen.h" #include "gtest/gtest.h" @@ -50,7 +50,7 @@ blocks.emplace_back(5, 7); constexpr int num_rows = 3 + 4 + 5; - std::set<std::pair<int, int>> block_pairs; + absl::btree_set<std::pair<int, int>> block_pairs; int num_nonzeros = 0; block_pairs.emplace(0, 0); num_nonzeros += blocks[0].size * blocks[0].size; @@ -136,7 +136,7 @@ void SetUp() final { std::vector<Block> blocks; blocks.emplace_back(1, 0); - std::set<std::pair<int, int>> block_pairs; + absl::btree_set<std::pair<int, int>> block_pairs; block_pairs.emplace(0, 0); m_ = std::make_unique<BlockRandomAccessSparseMatrix>( blocks, block_pairs, &context_, 1);
diff --git a/internal/ceres/covariance_impl.h b/internal/ceres/covariance_impl.h index 9ff7982..cb35029 100644 --- a/internal/ceres/covariance_impl.h +++ b/internal/ceres/covariance_impl.h
@@ -31,12 +31,12 @@ #ifndef CERES_INTERNAL_COVARIANCE_IMPL_H_ #define CERES_INTERNAL_COVARIANCE_IMPL_H_ -#include <map> #include <memory> -#include <set> #include <utility> #include <vector> +#include "absl/container/btree_map.h" +#include "absl/container/btree_set.h" #include "ceres/covariance.h" #include "ceres/internal/disable_warnings.h" #include "ceres/internal/export.h" @@ -90,8 +90,8 @@ Problem::EvaluateOptions evaluate_options_; bool is_computed_; bool is_valid_; - std::map<const double*, int> parameter_block_to_row_index_; - std::set<const double*> constant_parameter_blocks_; + absl::btree_map<const double*, int> parameter_block_to_row_index_; + absl::btree_set<const double*> constant_parameter_blocks_; std::unique_ptr<CompressedRowSparseMatrix> covariance_matrix_; };
diff --git a/internal/ceres/problem_impl.cc b/internal/ceres/problem_impl.cc index b60a7cf..fb6f254 100644 --- a/internal/ceres/problem_impl.cc +++ b/internal/ceres/problem_impl.cc
@@ -36,7 +36,6 @@ #include <cstdint> #include <iterator> #include <memory> -#include <set> #include <string> #include <utility> #include <vector> @@ -87,7 +86,7 @@ template <typename KeyType> void DecrementValueOrDeleteKey(const KeyType key, - std::map<KeyType, int>* container) { + absl::btree_map<KeyType, int>* container) { auto it = container->find(key); if (it->second == 1) { delete key;
diff --git a/internal/ceres/problem_impl.h b/internal/ceres/problem_impl.h index f5bf4d0..0932468 100644 --- a/internal/ceres/problem_impl.h +++ b/internal/ceres/problem_impl.h
@@ -44,6 +44,7 @@ #include <memory> #include <vector> +#include "absl/container/btree_map.h" #include "absl/container/flat_hash_set.h" #include "absl/log/check.h" #include "ceres/context_impl.h" @@ -68,10 +69,10 @@ class CERES_NO_EXPORT ProblemImpl { public: - using ParameterMap = std::map<double*, ParameterBlock*>; + using ParameterMap = absl::btree_map<double*, ParameterBlock*>; using ResidualBlockSet = absl::flat_hash_set<ResidualBlock*>; - using CostFunctionRefCount = std::map<CostFunction*, int>; - using LossFunctionRefCount = std::map<LossFunction*, int>; + using CostFunctionRefCount = absl::btree_map<CostFunction*, int>; + using LossFunctionRefCount = absl::btree_map<LossFunction*, int>; ProblemImpl(); explicit ProblemImpl(const Problem::Options& options);
diff --git a/internal/ceres/schur_complement_solver.cc b/internal/ceres/schur_complement_solver.cc index ce0af45..4a2fbba 100644 --- a/internal/ceres/schur_complement_solver.cc +++ b/internal/ceres/schur_complement_solver.cc
@@ -33,12 +33,12 @@ #include <algorithm> #include <ctime> #include <memory> -#include <set> #include <utility> #include <vector> #include "Eigen/Dense" #include "Eigen/SparseCore" +#include "absl/container/btree_set.h" #include "absl/log/check.h" #include "ceres/block_random_access_dense_matrix.h" #include "ceres/block_random_access_matrix.h" @@ -229,7 +229,7 @@ blocks_ = Tail(bs->cols, num_col_blocks - num_eliminate_blocks); - std::set<std::pair<int, int>> block_pairs; + absl::btree_set<std::pair<int, int>> block_pairs; for (int i = 0; i < blocks_.size(); ++i) { block_pairs.emplace(i, i); }
diff --git a/internal/ceres/schur_eliminator.h b/internal/ceres/schur_eliminator.h index 77bca54..8fd396d 100644 --- a/internal/ceres/schur_eliminator.h +++ b/internal/ceres/schur_eliminator.h
@@ -31,12 +31,12 @@ #ifndef CERES_INTERNAL_SCHUR_ELIMINATOR_H_ #define CERES_INTERNAL_SCHUR_ELIMINATOR_H_ -#include <map> #include <memory> #include <mutex> #include <vector> #include "Eigen/Dense" +#include "absl/container/btree_map.h" #include "absl/log/check.h" #include "ceres/block_random_access_matrix.h" #include "ceres/block_sparse_matrix.h" @@ -274,7 +274,7 @@ // buffer_layout[z1] = 0 // buffer_layout[z5] = y1 * z1 // buffer_layout[z2] = y1 * z1 + y1 * z5 - using BufferLayoutType = std::map<int, int>; + using BufferLayoutType = absl::btree_map<int, int>; struct Chunk { explicit Chunk(int start) : size(0), start(start) {} int size;
diff --git a/internal/ceres/visibility.cc b/internal/ceres/visibility.cc index ca0853f..38fc6d9 100644 --- a/internal/ceres/visibility.cc +++ b/internal/ceres/visibility.cc
@@ -34,10 +34,10 @@ #include <cmath> #include <ctime> #include <memory> -#include <set> #include <utility> #include <vector> +#include "absl/container/btree_set.h" #include "absl/log/check.h" #include "absl/log/log.h" #include "ceres/block_structure.h" @@ -47,7 +47,7 @@ void ComputeVisibility(const CompressedRowBlockStructure& block_structure, const int num_eliminate_blocks, - std::vector<std::set<int>>* visibility) { + std::vector<absl::btree_set<int>>* visibility) { CHECK(visibility != nullptr); // Clear the visibility vector and resize it to hold a @@ -73,7 +73,7 @@ } std::unique_ptr<WeightedGraph<int>> CreateSchurComplementGraph( - const std::vector<std::set<int>>& visibility) { + const std::vector<absl::btree_set<int>>& visibility) { const time_t start_time = time(nullptr); // Compute the number of e_blocks/point blocks. Since the visibility // set for each e_block/camera contains the set of e_blocks/points @@ -90,9 +90,9 @@ // cameras. However, to compute the sparsity structure of the Schur // Complement efficiently, its better to have the point->camera // mapping. - std::vector<std::set<int>> inverse_visibility(num_points); + std::vector<absl::btree_set<int>> inverse_visibility(num_points); for (int i = 0; i < visibility.size(); i++) { - const std::set<int>& visibility_set = visibility[i]; + const absl::btree_set<int>& visibility_set = visibility[i]; for (int v : visibility_set) { inverse_visibility[v].insert(i); }
diff --git a/internal/ceres/visibility.h b/internal/ceres/visibility.h index 2e5f4fc..c93f5f8 100644 --- a/internal/ceres/visibility.h +++ b/internal/ceres/visibility.h
@@ -36,9 +36,9 @@ #define CERES_INTERNAL_VISIBILITY_H_ #include <memory> -#include <set> #include <vector> +#include "absl/container/btree_set.h" #include "ceres/graph.h" #include "ceres/internal/disable_warnings.h" #include "ceres/internal/export.h" @@ -58,7 +58,7 @@ CERES_NO_EXPORT void ComputeVisibility( const CompressedRowBlockStructure& block_structure, int num_eliminate_blocks, - std::vector<std::set<int>>* visibility); + std::vector<absl::btree_set<int>>* visibility); // Given f_block visibility as computed by the ComputeVisibility // function above, construct and return a graph whose vertices are @@ -74,7 +74,7 @@ // Caller acquires ownership of the returned WeightedGraph pointer // (heap-allocated). CERES_NO_EXPORT std::unique_ptr<WeightedGraph<int>> CreateSchurComplementGraph( - const std::vector<std::set<int>>& visibility); + const std::vector<absl::btree_set<int>>& visibility); } // namespace ceres::internal
diff --git a/internal/ceres/visibility_based_preconditioner.cc b/internal/ceres/visibility_based_preconditioner.cc index 0062e1a..f245da9 100644 --- a/internal/ceres/visibility_based_preconditioner.cc +++ b/internal/ceres/visibility_based_preconditioner.cc
@@ -34,12 +34,12 @@ #include <functional> #include <iterator> #include <memory> -#include <set> #include <string> #include <utility> #include <vector> #include "Eigen/Dense" +#include "absl/container/btree_set.h" #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" #include "absl/log/check.h" @@ -121,7 +121,7 @@ // preconditioner matrix. void VisibilityBasedPreconditioner::ComputeClusterJacobiSparsity( const CompressedRowBlockStructure& bs) { - std::vector<std::set<int>> visibility; + std::vector<absl::btree_set<int>> visibility; ComputeVisibility(bs, options_.elimination_groups[0], &visibility); CHECK_EQ(num_blocks_, visibility.size()); ClusterCameras(visibility); @@ -139,7 +139,7 @@ // of edges in this forest are the cluster pairs. void VisibilityBasedPreconditioner::ComputeClusterTridiagonalSparsity( const CompressedRowBlockStructure& bs) { - std::vector<std::set<int>> visibility; + std::vector<absl::btree_set<int>> visibility; ComputeVisibility(bs, options_.elimination_groups[0], &visibility); CHECK_EQ(num_blocks_, visibility.size()); ClusterCameras(visibility); @@ -148,7 +148,7 @@ // edges are the number of 3D points/e_blocks visible in both the // clusters at the ends of the edge. Return an approximate degree-2 // maximum spanning forest of this graph. - std::vector<std::set<int>> cluster_visibility; + std::vector<absl::btree_set<int>> cluster_visibility; ComputeClusterVisibility(visibility, &cluster_visibility); auto cluster_graph = CreateClusterGraph(cluster_visibility); CHECK(cluster_graph != nullptr); @@ -172,7 +172,7 @@ // The cluster_membership_ vector is updated to indicate cluster // memberships for each camera block. void VisibilityBasedPreconditioner::ClusterCameras( - const std::vector<std::set<int>>& visibility) { + const std::vector<absl::btree_set<int>>& visibility) { auto schur_complement_graph = CreateSchurComplementGraph(visibility); CHECK(schur_complement_graph != nullptr); @@ -253,7 +253,7 @@ break; } - std::set<int> f_blocks; + absl::btree_set<int> f_blocks; for (; r < num_row_blocks; ++r) { const CompressedRow& row = bs.rows[r]; if (row.cells.front().block_id != e_block_id) { @@ -481,8 +481,8 @@ // of all its cameras. In other words, the set of points visible to // any camera in the cluster. void VisibilityBasedPreconditioner::ComputeClusterVisibility( - const std::vector<std::set<int>>& visibility, - std::vector<std::set<int>>* cluster_visibility) const { + const std::vector<absl::btree_set<int>>& visibility, + std::vector<absl::btree_set<int>>* cluster_visibility) const { CHECK(cluster_visibility != nullptr); cluster_visibility->resize(0); cluster_visibility->resize(num_clusters_); @@ -498,7 +498,7 @@ // vertices. std::unique_ptr<WeightedGraph<int>> VisibilityBasedPreconditioner::CreateClusterGraph( - const std::vector<std::set<int>>& cluster_visibility) const { + const std::vector<absl::btree_set<int>>& cluster_visibility) const { auto cluster_graph = std::make_unique<WeightedGraph<int>>(); for (int i = 0; i < num_clusters_; ++i) { @@ -506,10 +506,10 @@ } for (int i = 0; i < num_clusters_; ++i) { - const std::set<int>& cluster_i = cluster_visibility[i]; + const absl::btree_set<int>& cluster_i = cluster_visibility[i]; for (int j = i + 1; j < num_clusters_; ++j) { std::vector<int> intersection; - const std::set<int>& cluster_j = cluster_visibility[j]; + const absl::btree_set<int>& cluster_j = cluster_visibility[j]; std::set_intersection(cluster_i.begin(), cluster_i.end(), cluster_j.begin(),
diff --git a/internal/ceres/visibility_based_preconditioner.h b/internal/ceres/visibility_based_preconditioner.h index 68827b3..159cc69 100644 --- a/internal/ceres/visibility_based_preconditioner.h +++ b/internal/ceres/visibility_based_preconditioner.h
@@ -49,10 +49,10 @@ #define CERES_INTERNAL_VISIBILITY_BASED_PRECONDITIONER_H_ #include <memory> -#include <set> #include <utility> #include <vector> +#include "absl/container/btree_set.h" #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" #include "ceres/block_structure.h" @@ -154,14 +154,14 @@ LinearSolverTerminationType Factorize(); void ScaleOffDiagonalCells(); - void ClusterCameras(const std::vector<std::set<int>>& visibility); + void ClusterCameras(const std::vector<absl::btree_set<int>>& visibility); void FlattenMembershipMap(const absl::flat_hash_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; + const std::vector<absl::btree_set<int>>& visibility, + std::vector<absl::btree_set<int>>* cluster_visibility) const; std::unique_ptr<WeightedGraph<int>> CreateClusterGraph( - const std::vector<std::set<int>>& visibility) const; + const std::vector<absl::btree_set<int>>& visibility) const; void ForestToClusterPairs( const WeightedGraph<int>& forest, absl::flat_hash_set<std::pair<int, int>>* cluster_pairs) const; @@ -184,7 +184,7 @@ // Non-zero camera pairs from the schur complement matrix that are // present in the preconditioner, sorted by row (first element of // each pair), then column (second). - std::set<std::pair<int, int>> block_pairs_; + absl::btree_set<std::pair<int, int>> block_pairs_; // Set of cluster pairs (including self pairs (i,i)) in the // preconditioner.
diff --git a/internal/ceres/visibility_test.cc b/internal/ceres/visibility_test.cc index 871ab56..819c5ee 100644 --- a/internal/ceres/visibility_test.cc +++ b/internal/ceres/visibility_test.cc
@@ -32,9 +32,9 @@ #include "ceres/visibility.h" #include <memory> -#include <set> #include <vector> +#include "absl/container/btree_set.h" #include "ceres/block_structure.h" #include "ceres/graph.h" #include "gtest/gtest.h" @@ -94,7 +94,7 @@ } bs.cols.resize(num_cols); - std::vector<std::set<int>> visibility; + std::vector<absl::btree_set<int>> visibility; ComputeVisibility(bs, num_eliminate_blocks, &visibility); ASSERT_EQ(visibility.size(), num_cols - num_eliminate_blocks); for (const auto& visible : visibility) { @@ -169,7 +169,7 @@ } bs.cols.resize(num_cols); - std::vector<std::set<int>> visibility; + std::vector<absl::btree_set<int>> visibility; ComputeVisibility(bs, num_eliminate_blocks, &visibility); ASSERT_EQ(visibility.size(), num_cols - num_eliminate_blocks); for (const auto& visible : visibility) {