Add Program::ToString() to aid debugging.
Change-Id: I0ab37ed2fe0947ca87a152919d4e7dc9b56dedc6
diff --git a/internal/ceres/program.cc b/internal/ceres/program.cc
index 4dfb3a1..04248e7 100644
--- a/internal/ceres/program.cc
+++ b/internal/ceres/program.cc
@@ -216,5 +216,16 @@
return max_residuals;
}
+string Program::ToString() const {
+ string ret = "Program dump\n";
+ ret += StringPrintf("Number of parameter blocks: %d\n", NumParameterBlocks());
+ ret += StringPrintf("Number of parameters: %d\n", NumParameters());
+ ret += "Parameters:\n";
+ for (int i = 0; i < parameter_blocks_.size(); ++i) {
+ ret += StringPrintf("%d: %s\n",
+ i, parameter_blocks_[i]->ToString().c_str());
+ }
+}
+
} // namespace internal
} // namespace ceres
diff --git a/internal/ceres/program.h b/internal/ceres/program.h
index 7ae7db9..5002b7e 100644
--- a/internal/ceres/program.h
+++ b/internal/ceres/program.h
@@ -31,6 +31,7 @@
#ifndef CERES_INTERNAL_PROGRAM_H_
#define CERES_INTERNAL_PROGRAM_H_
+#include <string>
#include <vector>
#include "ceres/internal/port.h"
@@ -110,6 +111,10 @@
int MaxParametersPerResidualBlock() const;
int MaxResidualsPerResidualBlock() const;
+ // A human-readable dump of the parameter blocks for debugging.
+ // TODO(keir): If necessary, also dump the residual blocks.
+ string ToString() const;
+
private:
// The Program does not own the ParameterBlock or ResidualBlock objects.
vector<ParameterBlock*> parameter_blocks_;