Move from Ordering to ParameterBlockOrdering.

Change-Id: I9320afff13ee62be407c725f42f41a18f537bcc1
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index e0e8afa..3d7d496 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -64,7 +64,6 @@
     local_parameterization.cc
     loss_function.cc
     normal_prior.cc
-    ordering.cc
     partitioned_matrix_view.cc
     polynomial_solver.cc
     problem.cc
@@ -234,7 +233,6 @@
   CERES_TEST(minimizer)
   CERES_TEST(normal_prior)
   CERES_TEST(numeric_diff_cost_function)
-  CERES_TEST(ordering)
   CERES_TEST(ordered_groups)
   CERES_TEST(parameter_block)
   CERES_TEST(partitioned_matrix_view)
diff --git a/internal/ceres/inner_iteration_minimizer.cc b/internal/ceres/inner_iteration_minimizer.cc
index 6a9b419..36748ef 100644
--- a/internal/ceres/inner_iteration_minimizer.cc
+++ b/internal/ceres/inner_iteration_minimizer.cc
@@ -35,7 +35,7 @@
 #include "ceres/evaluator.h"
 #include "ceres/linear_solver.h"
 #include "ceres/minimizer.h"
-#include "ceres/ordering.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/parameter_block.h"
 #include "ceres/problem_impl.h"
 #include "ceres/program.h"
@@ -58,7 +58,7 @@
                                    string* error) {
   program_.reset(new Program(outer_program));
 
-  Ordering ordering;
+  ParameterBlockOrdering ordering;
   int num_inner_iteration_parameter_blocks = 0;
 
   if (parameter_blocks_for_inner_iterations.size() == 0) {
@@ -79,9 +79,9 @@
     for (int i = 0; i < parameter_block_ordering.size(); ++i) {
       double* ptr = parameter_block_ordering[i]->mutable_user_state();
       if (i < num_inner_iteration_parameter_blocks) {
-        ordering.AddParameterBlockToGroup(ptr, 0);
+        ordering.AddElementToGroup(ptr, 0);
       } else {
-        ordering.AddParameterBlockToGroup(ptr, 1);
+        ordering.AddElementToGroup(ptr, 1);
       }
     }
   } else {
@@ -95,18 +95,18 @@
     for (int i = 0; i < parameter_blocks.size(); ++i) {
       double* ptr = parameter_blocks[i]->mutable_user_state();
       if (parameter_block_ptrs.count(ptr) != 0) {
-        ordering.AddParameterBlockToGroup(ptr, 0);
+        ordering.AddElementToGroup(ptr, 0);
       } else {
-        ordering.AddParameterBlockToGroup(ptr, 1);
+        ordering.AddElementToGroup(ptr, 1);
       }
     }
 
     num_inner_iteration_parameter_blocks = ordering.GroupSize(0);
     if (num_inner_iteration_parameter_blocks > 0) {
-      const map<int, set<double*> >& group_id_to_parameter_blocks =
-          ordering.group_id_to_parameter_blocks();
+      const map<int, set<double*> >& group_to_elements =
+          ordering.group_to_elements();
       if (!SolverImpl::IsParameterBlockSetIndependent(
-              group_id_to_parameter_blocks.begin()->second,
+              group_to_elements.begin()->second,
               program_->residual_blocks())) {
         *error = "The user provided parameter_blocks_for_inner_iterations "
             "does not form an independent set";
diff --git a/internal/ceres/ordering.cc b/internal/ceres/ordering.cc
deleted file mode 100644
index 4b3ec25..0000000
--- a/internal/ceres/ordering.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-//   this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-//   this list of conditions and the following disclaimer in the documentation
-//   and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-//   used to endorse or promote products derived from this software without
-//   specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#include <map>
-#include <set>
-#include "ceres/internal/port.h"
-#include "ceres/ordering.h"
-#include "glog/logging.h"
-
-namespace ceres {
-
-void Ordering::AddParameterBlockToGroup(double* parameter_block, int group_id) {
-  const map<double*, int>::const_iterator it =
-      parameter_block_to_group_id_.find(parameter_block);
-
-  if (it != parameter_block_to_group_id_.end()) {
-    group_id_to_parameter_blocks_[it->second].erase(parameter_block);
-    if (group_id_to_parameter_blocks_[it->second].size() == 0) {
-      group_id_to_parameter_blocks_.erase(it->second);
-    }
-  }
-
-  parameter_block_to_group_id_[parameter_block] = group_id;
-  group_id_to_parameter_blocks_[group_id].insert(parameter_block);
-}
-
-void Ordering::RemoveParameterBlock(double* parameter_block) {
-  const int current_group_id = GroupIdForParameterBlock(parameter_block);
-  group_id_to_parameter_blocks_[current_group_id].erase(parameter_block);
-  if (group_id_to_parameter_blocks_[current_group_id].size() == 0) {
-    group_id_to_parameter_blocks_.erase(current_group_id);
-  }
-
-  parameter_block_to_group_id_.erase(parameter_block);
-}
-
-int Ordering::GroupIdForParameterBlock(double* parameter_block) const {
-  const map<double*, int>::const_iterator it =
-      parameter_block_to_group_id_.find(parameter_block);
-  CHECK(it !=  parameter_block_to_group_id_.end())
-      << "Tried finding the group id of a parameter block unknown to "
-      << "the ordering: " << parameter_block;
-  return it->second;
-}
-
-bool Ordering::ContainsParameterBlock(double* parameter_block) const {
-  const map<double*, int>::const_iterator it =
-      parameter_block_to_group_id_.find(parameter_block);
-  return (it != parameter_block_to_group_id_.end());
-}
-
-int Ordering::NumParameterBlocks() const {
-  return parameter_block_to_group_id_.size();
-}
-
-int Ordering::NumGroups() const { return group_id_to_parameter_blocks_.size(); }
-
-int Ordering::GroupSize(int group_id) const {
-  map<int, set<double*> >::const_iterator it =
-      group_id_to_parameter_blocks_.find(group_id);
-  return (it ==  group_id_to_parameter_blocks_.end()) ? 0 : it->second.size();
-}
-
-const map<int, set<double*> >& Ordering::group_id_to_parameter_blocks() const {
-  return group_id_to_parameter_blocks_;
-}
-
-}  // namespace ceres
diff --git a/internal/ceres/ordering_test.cc b/internal/ceres/ordering_test.cc
deleted file mode 100644
index 9bd43b3..0000000
--- a/internal/ceres/ordering_test.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-//   this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-//   this list of conditions and the following disclaimer in the documentation
-//   and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-//   used to endorse or promote products derived from this software without
-//   specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#include "ceres/ordering.h"
-
-#include <cstddef>
-#include <vector>
-#include "gtest/gtest.h"
-#include "ceres/collections_port.h"
-
-namespace ceres {
-namespace internal {
-
-TEST(Ordering, EmptyOrderingBehavesCorrectly) {
-  Ordering ordering;
-  EXPECT_EQ(ordering.NumGroups(), 0);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 0);
-  EXPECT_EQ(ordering.GroupSize(1), 0);
-  double x;
-  EXPECT_DEATH_IF_SUPPORTED(ordering.GroupIdForParameterBlock(&x),
-                            "Tried finding");
-  EXPECT_DEATH_IF_SUPPORTED(ordering.RemoveParameterBlock(&x),
-                            "Tried finding");
-}
-
-TEST(Ordering, EverythingInOneGroup) {
-  Ordering ordering;
-  double x[3];
-  ordering.AddParameterBlockToGroup(x, 1);
-  ordering.AddParameterBlockToGroup(x + 1, 1);
-  ordering.AddParameterBlockToGroup(x + 2, 1);
-  ordering.AddParameterBlockToGroup(x, 1);
-
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 3);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-
-  ordering.RemoveParameterBlock(x);
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 2);
-  EXPECT_EQ(ordering.GroupSize(1), 2);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-
-  EXPECT_DEATH_IF_SUPPORTED(ordering.GroupIdForParameterBlock(x),
-                            "Tried finding");
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-}
-
-TEST(Ordering, StartInOneGroupAndThenSplit) {
-  Ordering ordering;
-  double x[3];
-  ordering.AddParameterBlockToGroup(x, 1);
-  ordering.AddParameterBlockToGroup(x + 1, 1);
-  ordering.AddParameterBlockToGroup(x + 2, 1);
-  ordering.AddParameterBlockToGroup(x, 1);
-
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 3);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-
-  ordering.AddParameterBlockToGroup(x, 5);
-  EXPECT_EQ(ordering.NumGroups(), 2);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 2);
-  EXPECT_EQ(ordering.GroupSize(5), 1);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 5);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-}
-
-TEST(Ordering, AddAndRemoveEveryThingFromOneGroup) {
-  Ordering ordering;
-  double x[3];
-  ordering.AddParameterBlockToGroup(x, 1);
-  ordering.AddParameterBlockToGroup(x + 1, 1);
-  ordering.AddParameterBlockToGroup(x + 2, 1);
-  ordering.AddParameterBlockToGroup(x, 1);
-
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 3);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 1);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 1);
-
-  ordering.AddParameterBlockToGroup(x, 5);
-  ordering.AddParameterBlockToGroup(x + 1, 5);
-  ordering.AddParameterBlockToGroup(x + 2, 5);
-  EXPECT_EQ(ordering.NumGroups(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 3);
-  EXPECT_EQ(ordering.GroupSize(1), 0);
-  EXPECT_EQ(ordering.GroupSize(5), 3);
-  EXPECT_EQ(ordering.GroupSize(0), 0);
-
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x), 5);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 1), 5);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(x + 2), 5);
-}
-
-}  // namespace internal
-}  // namespace ceres
diff --git a/internal/ceres/solver_impl.cc b/internal/ceres/solver_impl.cc
index 4f914fa..c052aeb 100644
--- a/internal/ceres/solver_impl.cc
+++ b/internal/ceres/solver_impl.cc
@@ -41,7 +41,7 @@
 #include "ceres/linear_solver.h"
 #include "ceres/map_util.h"
 #include "ceres/minimizer.h"
-#include "ceres/ordering.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/parameter_block.h"
 #include "ceres/problem.h"
 #include "ceres/problem_impl.h"
@@ -260,15 +260,15 @@
       LOG(WARNING) << summary->error;
       return;
     }
-    options.ordering = new Ordering(*original_options.ordering);
+    options.ordering = new ParameterBlockOrdering(*original_options.ordering);
   } else {
-    options.ordering = new Ordering;
+    options.ordering = new ParameterBlockOrdering;
     const ProblemImpl::ParameterMap& parameter_map =
         problem_impl->parameter_map();
     for (ProblemImpl::ParameterMap::const_iterator it = parameter_map.begin();
          it != parameter_map.end();
          ++it) {
-      options.ordering->AddParameterBlockToGroup(it->first, 0);
+      options.ordering->AddElementToGroup(it->first, 0);
     }
   }
 
@@ -334,7 +334,7 @@
   // Only Schur types require the lexicographic reordering.
   if (IsSchurType(options.linear_solver_type)) {
     const int num_eliminate_blocks =
-        options.ordering->group_id_to_parameter_blocks().begin()->second.size();
+        options.ordering->group_to_elements().begin()->second.size();
     if (!LexicographicallyOrderResidualBlocks(num_eliminate_blocks,
                                               reduced_program.get(),
                                               &summary->error)) {
@@ -415,7 +415,7 @@
 bool SolverImpl::IsOrderingValid(const Solver::Options& options,
                                  const ProblemImpl* problem_impl,
                                  string* error) {
-  if (options.ordering->NumParameterBlocks() !=
+  if (options.ordering->NumElements() !=
       problem_impl->NumParameterBlocks()) {
       *error = "Number of parameter blocks in user supplied ordering "
           "does not match the number of parameter blocks in the problem";
@@ -428,8 +428,7 @@
   for (vector<ParameterBlock*>::const_iterator it = parameter_blocks.begin();
        it != parameter_blocks.end();
        ++it) {
-    if (!options.ordering->ContainsParameterBlock(
-            const_cast<double*>((*it)->user_state()))) {
+    if (!options.ordering->IsMember(const_cast<double*>((*it)->user_state()))) {
       *error = "Problem contains a parameter block that is not in "
           "the user specified ordering.";
       return false;
@@ -439,7 +438,7 @@
   if (IsSchurType(options.linear_solver_type) &&
       options.ordering->NumGroups() > 1) {
     const set<double*>& e_blocks  =
-        options.ordering->group_id_to_parameter_blocks().begin()->second;
+        options.ordering->group_to_elements().begin()->second;
     if (!IsParameterBlockSetIndependent(e_blocks, residual_blocks)) {
       *error = "The user requested the use of a Schur type solver. "
           "But the first elimination group in the ordering is not an "
@@ -478,7 +477,7 @@
 // Strips varying parameters and residuals, maintaining order, and updating
 // num_eliminate_blocks.
 bool SolverImpl::RemoveFixedBlocksFromProgram(Program* program,
-                                              Ordering* ordering,
+                                              ParameterBlockOrdering* ordering,
                                               double* fixed_cost,
                                               string* error) {
   vector<ParameterBlock*>* parameter_blocks =
@@ -547,7 +546,7 @@
       if (parameter_block->index() == 1) {
         (*parameter_blocks)[j++] = parameter_block;
       } else {
-        ordering->RemoveParameterBlock(parameter_block->mutable_user_state());
+        ordering->Remove(parameter_block->mutable_user_state());
       }
     }
     parameter_blocks->resize(j);
@@ -568,10 +567,10 @@
   CHECK_NOTNULL(options->ordering);
   Program* original_program = problem_impl->mutable_program();
   scoped_ptr<Program> transformed_program(new Program(*original_program));
-  Ordering* ordering = options->ordering;
+  ParameterBlockOrdering* ordering = options->ordering;
 
   const int min_group_id =
-      ordering->group_id_to_parameter_blocks().begin()->first;
+      ordering->group_to_elements().begin()->first;
   const int original_num_groups = ordering->NumGroups();
 
   if (!RemoveFixedBlocksFromProgram(transformed_program.get(),
@@ -603,7 +602,7 @@
         << "to the developers.";
 
     for (int i = 0; i < schur_ordering.size(); ++i) {
-      ordering->AddParameterBlockToGroup(schur_ordering[i]->mutable_user_state(),
+      ordering->AddElementToGroup(schur_ordering[i]->mutable_user_state(),
                                          (i < num_eliminate_blocks) ? 0 : 1);
     }
   }
@@ -764,7 +763,7 @@
 
   linear_solver_options.use_block_amd = options->use_block_amd;
   const map<int, set<double*> >& groups =
-      options->ordering->group_id_to_parameter_blocks();
+      options->ordering->group_to_elements();
   for (map<int, set<double*> >::const_iterator it = groups.begin();
        it != groups.end();
        ++it) {
@@ -783,15 +782,15 @@
 }
 
 bool SolverImpl::ApplyUserOrdering(const ProblemImpl::ParameterMap& parameter_map,
-                                   const Ordering* ordering,
+                                   const ParameterBlockOrdering* ordering,
                                    Program* program,
                                    string* error) {
-  if (ordering->NumParameterBlocks() != program->NumParameterBlocks()) {
+  if (ordering->NumElements() != program->NumParameterBlocks()) {
     *error = StringPrintf("User specified ordering does not have the same "
                           "number of parameters as the problem. The problem"
                           "has %d blocks while the ordering has %d blocks.",
                           program->NumParameterBlocks(),
-                          ordering->NumParameterBlocks());
+                          ordering->NumElements());
     return false;
   }
 
@@ -800,7 +799,7 @@
   parameter_blocks->clear();
 
   const map<int, set<double*> >& groups =
-      ordering->group_id_to_parameter_blocks();
+      ordering->group_to_elements();
 
   for (map<int, set<double*> >::const_iterator group_it = groups.begin();
        group_it != groups.end();
@@ -934,7 +933,7 @@
   evaluator_options.num_eliminate_blocks =
       (options.ordering->NumGroups() > 0 &&
        IsSchurType(options.linear_solver_type))
-      ? options.ordering->group_id_to_parameter_blocks().begin()->second.size()
+      ? options.ordering->group_to_elements().begin()->second.size()
       : 0;
   evaluator_options.num_threads = options.num_threads;
   return Evaluator::Create(evaluator_options, program, error);
diff --git a/internal/ceres/solver_impl.h b/internal/ceres/solver_impl.h
index eb81696..140de95 100644
--- a/internal/ceres/solver_impl.h
+++ b/internal/ceres/solver_impl.h
@@ -34,12 +34,11 @@
 #include <string>
 #include <vector>
 #include "ceres/internal/port.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/solver.h"
 #include "ceres/problem_impl.h"
 
 namespace ceres {
-class Ordering;
-
 namespace internal {
 
 class Evaluator;
@@ -79,7 +78,7 @@
   // return value of true indicates success and false indicates an
   // error was encountered whose cause is logged to LOG(ERROR).
   static bool ApplyUserOrdering(const ProblemImpl::ParameterMap& parameter_map,
-                                const Ordering* ordering,
+                                const ParameterBlockOrdering* ordering,
                                 Program* program,
                                 string* error);
 
@@ -116,7 +115,7 @@
   // NULL, the residual blocks that are removed are evaluated and the
   // sum of their cost is returned in fixed_cost.
   static bool RemoveFixedBlocksFromProgram(Program* program,
-                                           Ordering* ordering,
+                                           ParameterBlockOrdering* ordering,
                                            double* fixed_cost,
                                            string* error);
 
diff --git a/internal/ceres/solver_impl_test.cc b/internal/ceres/solver_impl_test.cc
index 3148024..5f4a82c 100644
--- a/internal/ceres/solver_impl_test.cc
+++ b/internal/ceres/solver_impl_test.cc
@@ -31,7 +31,7 @@
 #include "gtest/gtest.h"
 #include "ceres/autodiff_cost_function.h"
 #include "ceres/linear_solver.h"
-#include "ceres/ordering.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/parameter_block.h"
 #include "ceres/problem_impl.h"
 #include "ceres/program.h"
@@ -88,10 +88,10 @@
 
   string error;
   {
-    Ordering ordering;
-    ordering.AddParameterBlockToGroup(&x, 0);
-    ordering.AddParameterBlockToGroup(&y, 0);
-    ordering.AddParameterBlockToGroup(&z, 0);
+    ParameterBlockOrdering ordering;
+    ordering.AddElementToGroup(&x, 0);
+    ordering.AddElementToGroup(&y, 0);
+    ordering.AddElementToGroup(&z, 0);
 
     Program program(*problem.mutable_program());
     EXPECT_TRUE(SolverImpl::RemoveFixedBlocksFromProgram(&program,
@@ -100,7 +100,7 @@
                                                          &error));
     EXPECT_EQ(program.NumParameterBlocks(), 3);
     EXPECT_EQ(program.NumResidualBlocks(), 3);
-    EXPECT_EQ(ordering.NumParameterBlocks(), 3);
+    EXPECT_EQ(ordering.NumElements(), 3);
   }
 }
 
@@ -112,8 +112,8 @@
   problem.AddResidualBlock(new UnaryCostFunction(), NULL, &x);
   problem.SetParameterBlockConstant(&x);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
 
   Program program(problem.program());
   string error;
@@ -123,7 +123,7 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 0);
   EXPECT_EQ(program.NumResidualBlocks(), 0);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 0);
+  EXPECT_EQ(ordering.NumElements(), 0);
 }
 
 TEST(SolverImpl, RemoveFixedBlocksNoResidualBlocks) {
@@ -136,10 +136,10 @@
   problem.AddParameterBlock(&y, 1);
   problem.AddParameterBlock(&z, 1);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 0);
-  ordering.AddParameterBlockToGroup(&z, 0);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 0);
+  ordering.AddElementToGroup(&z, 0);
 
 
   Program program(problem.program());
@@ -150,7 +150,7 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 0);
   EXPECT_EQ(program.NumResidualBlocks(), 0);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 0);
+  EXPECT_EQ(ordering.NumElements(), 0);
 }
 
 TEST(SolverImpl, RemoveFixedBlocksOneParameterBlockConstant) {
@@ -163,10 +163,10 @@
   problem.AddParameterBlock(&y, 1);
   problem.AddParameterBlock(&z, 1);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 0);
-  ordering.AddParameterBlockToGroup(&z, 0);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 0);
+  ordering.AddElementToGroup(&z, 0);
 
   problem.AddResidualBlock(new UnaryCostFunction(), NULL, &x);
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &y);
@@ -181,7 +181,7 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 1);
   EXPECT_EQ(program.NumResidualBlocks(), 1);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 1);
+  EXPECT_EQ(ordering.NumElements(), 1);
 }
 
 TEST(SolverImpl, RemoveFixedBlocksNumEliminateBlocks) {
@@ -198,10 +198,10 @@
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &y);
   problem.SetParameterBlockConstant(&x);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 0);
-  ordering.AddParameterBlockToGroup(&z, 1);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 0);
+  ordering.AddElementToGroup(&z, 1);
 
   Program program(problem.program());
   string error;
@@ -211,9 +211,9 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 2);
   EXPECT_EQ(program.NumResidualBlocks(), 2);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 2);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(&y), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(&z), 1);
+  EXPECT_EQ(ordering.NumElements(), 2);
+  EXPECT_EQ(ordering.GroupId(&y), 0);
+  EXPECT_EQ(ordering.GroupId(&z), 1);
 }
 
 TEST(SolverImpl, RemoveFixedBlocksFixedCost) {
@@ -230,10 +230,10 @@
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &y);
   problem.SetParameterBlockConstant(&x);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 0);
-  ordering.AddParameterBlockToGroup(&z, 1);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 0);
+  ordering.AddElementToGroup(&z, 1);
 
   double fixed_cost = 0.0;
   Program program(problem.program());
@@ -250,9 +250,9 @@
                                                        &error));
   EXPECT_EQ(program.NumParameterBlocks(), 2);
   EXPECT_EQ(program.NumResidualBlocks(), 2);
-  EXPECT_EQ(ordering.NumParameterBlocks(), 2);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(&y), 0);
-  EXPECT_EQ(ordering.GroupIdForParameterBlock(&z), 1);
+  EXPECT_EQ(ordering.NumElements(), 2);
+  EXPECT_EQ(ordering.GroupId(&y), 0);
+  EXPECT_EQ(ordering.GroupId(&z), 1);
   EXPECT_DOUBLE_EQ(fixed_cost, expected_fixed_cost);
 }
 
@@ -273,10 +273,10 @@
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &y);
   problem.AddResidualBlock(new UnaryCostFunction(), NULL, &y);
 
-  Ordering* ordering = new Ordering;
-  ordering->AddParameterBlockToGroup(&x, 0);
-  ordering->AddParameterBlockToGroup(&y, 0);
-  ordering->AddParameterBlockToGroup(&z, 1);
+  ParameterBlockOrdering* ordering = new ParameterBlockOrdering;
+  ordering->AddElementToGroup(&x, 0);
+  ordering->AddElementToGroup(&y, 0);
+  ordering->AddElementToGroup(&z, 1);
 
   Solver::Options options;
   options.linear_solver_type = DENSE_SCHUR;
@@ -335,10 +335,10 @@
   problem.AddResidualBlock(new BinaryCostFunction(), NULL, &x, &z);  // 6 x
   problem.AddResidualBlock(new UnaryCostFunction(), NULL, &y);       // 7
 
-  Ordering* ordering = new Ordering;
-  ordering->AddParameterBlockToGroup(&x, 0);
-  ordering->AddParameterBlockToGroup(&z, 0);
-  ordering->AddParameterBlockToGroup(&y, 1);
+  ParameterBlockOrdering* ordering = new ParameterBlockOrdering;
+  ordering->AddElementToGroup(&x, 0);
+  ordering->AddElementToGroup(&z, 0);
+  ordering->AddElementToGroup(&y, 1);
 
   Solver::Options options;
   options.linear_solver_type = DENSE_SCHUR;
@@ -396,9 +396,9 @@
   problem.AddParameterBlock(&y, 1);
   problem.AddParameterBlock(&z, 1);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 1);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 1);
 
   Program program(problem.program());
   string error;
@@ -418,10 +418,10 @@
   problem.AddParameterBlock(&y, 1);
   problem.AddParameterBlock(&z, 1);
 
-  Ordering ordering;
-  ordering.AddParameterBlockToGroup(&x, 0);
-  ordering.AddParameterBlockToGroup(&y, 2);
-  ordering.AddParameterBlockToGroup(&z, 1);
+  ParameterBlockOrdering ordering;
+  ordering.AddElementToGroup(&x, 0);
+  ordering.AddElementToGroup(&y, 2);
+  ordering.AddElementToGroup(&z, 1);
 
   Program* program = problem.mutable_program();
   string error;
@@ -452,7 +452,7 @@
   options.linear_solver_type = DENSE_QR;
   options.linear_solver_max_num_iterations = -1;
   // CreateLinearSolver assumes a non-empty ordering.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
             static_cast<LinearSolver*>(NULL));
@@ -463,7 +463,7 @@
   options.linear_solver_type = DENSE_QR;
   options.linear_solver_min_num_iterations = -1;
   // CreateLinearSolver assumes a non-empty ordering.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
             static_cast<LinearSolver*>(NULL));
@@ -474,7 +474,7 @@
   options.linear_solver_type = DENSE_QR;
   options.linear_solver_min_num_iterations = 10;
   options.linear_solver_max_num_iterations = 5;
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
             static_cast<LinearSolver*>(NULL));
@@ -486,11 +486,11 @@
   options.num_linear_solver_threads = 2;
   // The Schur type solvers can only be created with the Ordering
   // contains at least one elimination group.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   double x;
   double y;
-  options.ordering->AddParameterBlockToGroup(&x, 0);
-  options.ordering->AddParameterBlockToGroup(&y, 0);
+  options.ordering->AddElementToGroup(&x, 0);
+  options.ordering->AddElementToGroup(&y, 0);
 
   string error;
   scoped_ptr<LinearSolver> solver(
@@ -504,7 +504,7 @@
   Solver::Options options;
   options.trust_region_strategy_type = DOGLEG;
   // CreateLinearSolver assumes a non-empty ordering.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   options.linear_solver_type = ITERATIVE_SCHUR;
   EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
@@ -520,7 +520,7 @@
   scoped_ptr<LinearSolver> solver;
   options.linear_solver_type = DENSE_QR;
   // CreateLinearSolver assumes a non-empty ordering.
-  options.ordering = new Ordering;
+  options.ordering = new ParameterBlockOrdering;
   string error;
   solver.reset(SolverImpl::CreateLinearSolver(&options, &error));
   EXPECT_EQ(options.linear_solver_type, DENSE_QR);
@@ -549,8 +549,8 @@
 
   double x;
   double y;
-  options.ordering->AddParameterBlockToGroup(&x, 0);
-  options.ordering->AddParameterBlockToGroup(&y, 0);
+  options.ordering->AddElementToGroup(&x, 0);
+  options.ordering->AddElementToGroup(&y, 0);
 
   options.linear_solver_type = DENSE_SCHUR;
   solver.reset(SolverImpl::CreateLinearSolver(&options, &error));
diff --git a/internal/ceres/system_test.cc b/internal/ceres/system_test.cc
index 4d78de7..8f1722a 100644
--- a/internal/ceres/system_test.cc
+++ b/internal/ceres/system_test.cc
@@ -44,7 +44,7 @@
 #include <string>
 
 #include "ceres/autodiff_cost_function.h"
-#include "ceres/ordering.h"
+#include "ceres/ordered_groups.h"
 #include "ceres/problem.h"
 #include "ceres/rotation.h"
 #include "ceres/solver.h"
@@ -387,15 +387,15 @@
       problem_.AddResidualBlock(cost_function, NULL, camera, point);
     }
 
-    options_.ordering = new Ordering;
+    options_.ordering = new ParameterBlockOrdering;
 
     // The points come before the cameras.
     for (int i = 0; i < num_points_; ++i) {
-      options_.ordering->AddParameterBlockToGroup(points + 3 * i, 0);
+      options_.ordering->AddElementToGroup(points + 3 * i, 0);
     }
 
     for (int i = 0; i < num_cameras_; ++i) {
-      options_.ordering->AddParameterBlockToGroup(cameras + 9 * i, 1);
+      options_.ordering->AddElementToGroup(cameras + 9 * i, 1);
     }
 
     options_.max_num_iterations = 25;