Improve logging in CompressedRowJacobianWriter on crash
Change-Id: Ib56955669279724e7f1dffd9a68b7b2b66b24a85
diff --git a/internal/ceres/compressed_row_jacobian_writer.cc b/internal/ceres/compressed_row_jacobian_writer.cc
index 64b6ac0..40977b7 100644
--- a/internal/ceres/compressed_row_jacobian_writer.cc
+++ b/internal/ceres/compressed_row_jacobian_writer.cc
@@ -46,6 +46,7 @@
using std::make_pair;
using std::pair;
using std::vector;
+using std::adjacent_find;
void CompressedRowJacobianWriter::PopulateJacobianRowAndColumnBlockVectors(
const Program* program, CompressedRowSparseMatrix* jacobian) {
@@ -140,12 +141,21 @@
// Sort the parameters by their position in the state vector.
sort(parameter_indices.begin(), parameter_indices.end());
- CHECK(unique(parameter_indices.begin(), parameter_indices.end()) ==
- parameter_indices.end())
- << "Ceres internal error: "
- << "Duplicate parameter blocks detected in a cost function. "
- << "This should never happen. Please report this to "
- << "the Ceres developers.";
+ if (adjacent_find(parameter_indices.begin(), parameter_indices.end()) !=
+ parameter_indices.end()) {
+ std::string parameter_block_description;
+ for (int j = 0; j < num_parameter_blocks; ++j) {
+ ParameterBlock* parameter_block = residual_block->parameter_blocks()[j];
+ parameter_block_description +=
+ parameter_block->ToString() + "\n";
+ }
+ LOG(FATAL) << "Ceres internal error: "
+ << "Duplicate parameter blocks detected in a cost function. "
+ << "This should never happen. Please report this to "
+ << "the Ceres developers.\n"
+ << "Residual Block: " << residual_block->ToString() << "\n"
+ << "Parameter Blocks: " << parameter_block_description;
+ }
// Update the row indices.
const int num_residuals = residual_block->NumResiduals();
diff --git a/internal/ceres/residual_block.h b/internal/ceres/residual_block.h
index 05e6d1f..a32f1c3 100644
--- a/internal/ceres/residual_block.h
+++ b/internal/ceres/residual_block.h
@@ -127,7 +127,7 @@
int index() const { return index_; }
void set_index(int index) { index_ = index; }
- std::string ToString() {
+ std::string ToString() const {
return StringPrintf("{residual block; index=%d}", index_);
}