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) {