Don't assume program state is user state
The SolverImpl::Solve() method incorrectly assumed that the
state pointers inside the parameter blocks always pointed to
the user state at the start of the method. That is not true.
Change-Id: I73f8eeda453422c99e09d71a3cd0bfa92dd45742
diff --git a/internal/ceres/program.cc b/internal/ceres/program.cc
index 444b102..529e4a3 100644
--- a/internal/ceres/program.cc
+++ b/internal/ceres/program.cc
@@ -86,11 +86,19 @@
void Program::CopyParameterBlockStateToUserState() {
for (int i = 0; i < parameter_blocks_.size(); ++i) {
- parameter_blocks_[i]->GetState(
- parameter_blocks_[i]->mutable_user_state());
+ parameter_blocks_[i]->GetState(parameter_blocks_[i]->mutable_user_state());
}
}
+bool Program::CopyUserStateToParameterBlocks() {
+ for (int i = 0; i < parameter_blocks_.size(); ++i) {
+ if (!parameter_blocks_[i]->SetState(parameter_blocks_[i]->user_state())) {
+ return false;
+ }
+ }
+ return true;
+}
+
bool Program::Plus(const double* state,
const double* delta,
double* state_plus_delta) const {