Pay attention to condition number in covariance estimation.
1. Sparse covariance estimation now uses cholmod_rcond to
detect singular Jacobians.
2. Dense covariance estimation now uses relative magnitude
of singular/eigen values to compute the pseudoinverse.
3. Truncation logic is now unified with Solver::Options::null_space_rank.
Change-Id: I095bd737510c836b4251255926190a7f31d64bce
diff --git a/internal/ceres/covariance_test.cc b/internal/ceres/covariance_test.cc
index b74efda..05fb234 100644
--- a/internal/ceres/covariance_test.cc
+++ b/internal/ceres/covariance_test.cc
@@ -532,15 +532,24 @@
-1.6076e-02, 1.2549e-02, -3.3329e-04, -6.6659e-04, -9.9988e-04, 3.9539e-02
};
- Covariance::Options options;
- options.use_dense_linear_algebra = true;
- options.null_space_rank = 1;
- ComputeAndCompareCovarianceBlocks(options, expected_covariance);
- options.use_dense_linear_algebra = true;
- options.null_space_rank = 0;
- options.min_singular_value_threshold = sqrt(3.5);
- ComputeAndCompareCovarianceBlocks(options, expected_covariance);
+ {
+ Covariance::Options options;
+ options.use_dense_linear_algebra = true;
+ // Force dropping of the smallest eigenvector.
+ options.null_space_rank = 1;
+ ComputeAndCompareCovarianceBlocks(options, expected_covariance);
+ }
+
+ {
+ Covariance::Options options;
+ options.use_dense_linear_algebra = true;
+ // Force dropping of the smallest eigenvector via the ratio but
+ // automatic truncation.
+ options.min_reciprocal_condition_number = 0.044494;
+ options.null_space_rank = -1;
+ ComputeAndCompareCovarianceBlocks(options, expected_covariance);
+ }
}
class RankDeficientCovarianceTest : public CovarianceTest {
@@ -598,7 +607,7 @@
}
};
-TEST_F(RankDeficientCovarianceTest, MinSingularValueTolerance) {
+TEST_F(RankDeficientCovarianceTest, AutomaticTruncation) {
// J
//
// 1 0 0 0 0 0
@@ -631,15 +640,7 @@
Covariance::Options options;
options.use_dense_linear_algebra = true;
- ComputeAndCompareCovarianceBlocks(options, expected_covariance);
-
- options.null_space_rank = 1;
- ComputeAndCompareCovarianceBlocks(options, expected_covariance);
-
- options.null_space_rank = 2;
- ComputeAndCompareCovarianceBlocks(options, expected_covariance);
-
- options.null_space_rank = 3;
+ options.null_space_rank = -1;
ComputeAndCompareCovarianceBlocks(options, expected_covariance);
}