cleaned code to log LM iterations
							parent
							
								
									9f499d2257
								
							
						
					
					
						commit
						e8a4767591
					
				| 
						 | 
				
			
			@ -192,6 +192,19 @@ GaussianFactorGraph::shared_ptr LevenbergMarquardtOptimizer::buildDampedSystem(
 | 
			
		|||
  return dampedPtr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
// Log current error/lambda to file
 | 
			
		||||
inline void LevenbergMarquardtOptimizer::writeLogFile(double currentError){
 | 
			
		||||
  if (!params_.logFile.empty()) {
 | 
			
		||||
    ofstream os(params_.logFile.c_str(), ios::app);
 | 
			
		||||
    boost::posix_time::ptime currentTime = boost::posix_time::microsec_clock::universal_time();
 | 
			
		||||
    os << /*inner iterations*/ state_.totalNumberInnerIterations << ","
 | 
			
		||||
        << 1e-6 * (currentTime - state_.startTime).total_microseconds() << ","
 | 
			
		||||
        << /*current error*/ currentError << "," << state_.lambda << ","
 | 
			
		||||
        << /*outer iterations*/ state_.iterations << endl;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
void LevenbergMarquardtOptimizer::iterate() {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -206,6 +219,9 @@ void LevenbergMarquardtOptimizer::iterate() {
 | 
			
		|||
    cout << "linearizing = " << endl;
 | 
			
		||||
  GaussianFactorGraph::shared_ptr linear = linearize();
 | 
			
		||||
 | 
			
		||||
  if(state_.totalNumberInnerIterations==0) // write initial error
 | 
			
		||||
    writeLogFile(state_.error);
 | 
			
		||||
 | 
			
		||||
  // Keep increasing lambda until we make make progress
 | 
			
		||||
  while (true) {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -288,36 +304,29 @@ void LevenbergMarquardtOptimizer::iterate() {
 | 
			
		|||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Log current error/lambda to file
 | 
			
		||||
    if (!params_.logFile.empty()) {
 | 
			
		||||
      ofstream os(params_.logFile.c_str(), ios::app);
 | 
			
		||||
      boost::posix_time::ptime currentTime = boost::posix_time::microsec_clock::universal_time();
 | 
			
		||||
      os << /*inner iterations*/ state_.totalNumberInnerIterations << ","
 | 
			
		||||
          << 1e-6 * (currentTime - state_.startTime).total_microseconds() << ","
 | 
			
		||||
          << /*current error*/ state_.error << "," << state_.lambda << ","
 | 
			
		||||
          << /*outer iterations*/ state_.iterations << endl;
 | 
			
		||||
    }
 | 
			
		||||
    ++state_.totalNumberInnerIterations;
 | 
			
		||||
 | 
			
		||||
    if (step_is_successful) { // we have successfully decreased the cost and we have good modelFidelity
 | 
			
		||||
      state_.values.swap(newValues);
 | 
			
		||||
      state_.error = newError;
 | 
			
		||||
      decreaseLambda(modelFidelity);
 | 
			
		||||
      writeLogFile(state_.error);
 | 
			
		||||
      break;
 | 
			
		||||
    } else if (!stopSearchingLambda) { // we failed to solved the system or we had no decrease in cost
 | 
			
		||||
      if (lmVerbosity >= LevenbergMarquardtParams::TRYLAMBDA)
 | 
			
		||||
        cout << "increasing lambda" << endl;
 | 
			
		||||
      increaseLambda();
 | 
			
		||||
      writeLogFile(state_.error);
 | 
			
		||||
 | 
			
		||||
      // check if lambda is too big
 | 
			
		||||
      if (state_.lambda >= params_.lambdaUpperBound) {
 | 
			
		||||
        if (nloVerbosity >= NonlinearOptimizerParams::TERMINATION)
 | 
			
		||||
          cout
 | 
			
		||||
              << "Warning:  Levenberg-Marquardt giving up because cannot decrease error with maximum lambda"
 | 
			
		||||
              << endl;
 | 
			
		||||
          cout << "Warning:  Levenberg-Marquardt giving up because "
 | 
			
		||||
              "cannot decrease error with maximum lambda" << endl;
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    } else { // the change in the cost is very small and it is not worth trying bigger lambdas
 | 
			
		||||
      writeLogFile(state_.error);
 | 
			
		||||
      if (lmVerbosity >= LevenbergMarquardtParams::TRYLAMBDA)
 | 
			
		||||
              cout << "Levenberg-Marquardt: stopping as relative cost reduction is small" << endl;
 | 
			
		||||
      break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,7 +113,6 @@ public:
 | 
			
		|||
  inline void setDiagonalDamping(bool flag) {
 | 
			
		||||
    diagonalDamping = flag;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  inline void setUseFixedLambdaFactor(bool flag) {
 | 
			
		||||
    useFixedLambdaFactor_ = flag;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -258,6 +257,8 @@ public:
 | 
			
		|||
  GaussianFactorGraph::shared_ptr buildDampedSystem(const GaussianFactorGraph& linear);
 | 
			
		||||
  friend class ::NonlinearOptimizerMoreOptimizationTest;
 | 
			
		||||
 | 
			
		||||
  void writeLogFile(double currentError);
 | 
			
		||||
 | 
			
		||||
  /// @}
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue