Preconditioner refactoring.
1. Added a Preconditioner interface.
2. SCHUR_JACOBI is now its own class and is independent of
SuiteSparse.
Change-Id: Id912ab19cf3736e61d1b90ddaf5bfba33e877ec4
diff --git a/internal/ceres/visibility_based_preconditioner_test.cc b/internal/ceres/visibility_based_preconditioner_test.cc
index 8c5378d..999024a 100644
--- a/internal/ceres/visibility_based_preconditioner_test.cc
+++ b/internal/ceres/visibility_based_preconditioner_test.cc
@@ -99,7 +99,11 @@
Vector rhs(schur_complement_->num_rows());
scoped_ptr<SchurEliminatorBase> eliminator;
- eliminator.reset(SchurEliminatorBase::Create(options_));
+ LinearSolver::Options eliminator_options;
+ eliminator_options.elimination_groups = options_.elimination_groups;
+ eliminator_options.num_threads = options_.num_threads;
+
+ eliminator.reset(SchurEliminatorBase::Create(eliminator_options));
eliminator->Init(num_eliminate_blocks_, bs);
eliminator->Eliminate(A_.get(), b_.get(), D_.get(),
schur_complement_.get(), rhs.data());
@@ -229,35 +233,14 @@
scoped_array<double> b_;
scoped_array<double> D_;
- LinearSolver::Options options_;
+ Preconditioner::Options options_;
scoped_ptr<VisibilityBasedPreconditioner> preconditioner_;
scoped_ptr<BlockRandomAccessDenseMatrix> schur_complement_;
};
#ifndef CERES_NO_PROTOCOL_BUFFERS
-TEST_F(VisibilityBasedPreconditionerTest, SchurJacobiStructure) {
- options_.preconditioner_type = SCHUR_JACOBI;
- preconditioner_.reset(
- new VisibilityBasedPreconditioner(*A_->block_structure(), options_));
- EXPECT_EQ(get_num_blocks(), num_camera_blocks_);
- EXPECT_EQ(get_num_clusters(), num_camera_blocks_);
- for (int i = 0; i < num_camera_blocks_; ++i) {
- for (int j = 0; j < num_camera_blocks_; ++j) {
- const string msg = StringPrintf("Camera pair: %d %d", i, j);
- SCOPED_TRACE(msg);
- if (i == j) {
- EXPECT_TRUE(IsBlockPairInPreconditioner(i, j));
- EXPECT_FALSE(IsBlockPairOffDiagonal(i, j));
- } else {
- EXPECT_FALSE(IsBlockPairInPreconditioner(i, j));
- EXPECT_TRUE(IsBlockPairOffDiagonal(i, j));
- }
- }
- }
-}
-
TEST_F(VisibilityBasedPreconditionerTest, OneClusterClusterJacobi) {
- options_.preconditioner_type = CLUSTER_JACOBI;
+ options_.type = CLUSTER_JACOBI;
preconditioner_.reset(
new VisibilityBasedPreconditioner(*A_->block_structure(), options_));
@@ -304,7 +287,7 @@
TEST_F(VisibilityBasedPreconditionerTest, ClusterJacobi) {
- options_.preconditioner_type = CLUSTER_JACOBI;
+ options_.type = CLUSTER_JACOBI;
preconditioner_.reset(
new VisibilityBasedPreconditioner(*A_->block_structure(), options_));
@@ -330,7 +313,7 @@
TEST_F(VisibilityBasedPreconditionerTest, ClusterTridiagonal) {
- options_.preconditioner_type = CLUSTER_TRIDIAGONAL;
+ options_.type = CLUSTER_TRIDIAGONAL;
preconditioner_.reset(
new VisibilityBasedPreconditioner(*A_->block_structure(), options_));
static const int kNumClusters = 3;