|  | @@ -81,6 +81,7 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |    double start_time = WallTimeInSeconds();
 | 
	
		
			
				|  |  |    double iteration_start_time =  start_time;
 | 
	
		
			
				|  |  |    Init(options);
 | 
	
		
			
				|  |  | +  const bool is_not_silent = !options.is_silent;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    summary->termination_type = NO_CONVERGENCE;
 | 
	
		
			
				|  |  |    summary->num_successful_steps = 0;
 | 
	
	
		
			
				|  | @@ -128,7 +129,8 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |                             residuals.data(),
 | 
	
		
			
				|  |  |                             gradient.data(),
 | 
	
		
			
				|  |  |                             jacobian)) {
 | 
	
		
			
				|  |  | -    LOG(WARNING) << "Terminating: Residual and Jacobian evaluation failed.";
 | 
	
		
			
				|  |  | +    LOG_IF(WARNING, is_not_silent)
 | 
	
		
			
				|  |  | +        << "Terminating: Residual and Jacobian evaluation failed.";
 | 
	
		
			
				|  |  |      summary->termination_type = NUMERICAL_FAILURE;
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -152,11 +154,12 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |        options_.gradient_tolerance * initial_gradient_max_norm;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (iteration_summary.gradient_max_norm <= absolute_gradient_tolerance) {
 | 
	
		
			
				|  |  | +    VLOG_IF(1, is_not_silent) << "Terminating: Gradient tolerance reached."
 | 
	
		
			
				|  |  | +                              << "Relative gradient max norm: "
 | 
	
		
			
				|  |  | +                              << (iteration_summary.gradient_max_norm /
 | 
	
		
			
				|  |  | +                                  initial_gradient_max_norm)
 | 
	
		
			
				|  |  | +                              << " <= " << options_.gradient_tolerance;
 | 
	
		
			
				|  |  |      summary->termination_type = GRADIENT_TOLERANCE;
 | 
	
		
			
				|  |  | -    VLOG(1) << "Terminating: Gradient tolerance reached."
 | 
	
		
			
				|  |  | -            << "Relative gradient max norm: "
 | 
	
		
			
				|  |  | -            << iteration_summary.gradient_max_norm / initial_gradient_max_norm
 | 
	
		
			
				|  |  | -            << " <= " << options_.gradient_tolerance;
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -184,17 +187,19 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      iteration_start_time = WallTimeInSeconds();
 | 
	
		
			
				|  |  |      if (iteration_summary.iteration >= options_.max_num_iterations) {
 | 
	
		
			
				|  |  | +      VLOG_IF(1, is_not_silent)
 | 
	
		
			
				|  |  | +          << "Terminating: Maximum number of iterations reached.";
 | 
	
		
			
				|  |  |        summary->termination_type = NO_CONVERGENCE;
 | 
	
		
			
				|  |  | -      VLOG(1) << "Terminating: Maximum number of iterations reached.";
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      const double total_solver_time = iteration_start_time - start_time +
 | 
	
		
			
				|  |  |          summary->preprocessor_time_in_seconds;
 | 
	
		
			
				|  |  |      if (total_solver_time >= options_.max_solver_time_in_seconds) {
 | 
	
		
			
				|  |  | +      VLOG_IF(1, is_not_silent)
 | 
	
		
			
				|  |  | +          << "Terminating: Maximum solver time reached.";
 | 
	
		
			
				|  |  |        summary->termination_type = NO_CONVERGENCE;
 | 
	
		
			
				|  |  | -      VLOG(1) << "Terminating: Maximum solver time reached.";
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      const double strategy_start_time = WallTimeInSeconds();
 | 
	
	
		
			
				|  | @@ -245,9 +250,10 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |            - model_residuals.dot(residuals + model_residuals / 2.0);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (model_cost_change < 0.0) {
 | 
	
		
			
				|  |  | -        VLOG(1) << "Invalid step: current_cost: " << cost
 | 
	
		
			
				|  |  | -                << " absolute difference " << model_cost_change
 | 
	
		
			
				|  |  | -                << " relative difference " << (model_cost_change / cost);
 | 
	
		
			
				|  |  | +        VLOG_IF(1, is_not_silent)
 | 
	
		
			
				|  |  | +            << "Invalid step: current_cost: " << cost
 | 
	
		
			
				|  |  | +            << " absolute difference " << model_cost_change
 | 
	
		
			
				|  |  | +            << " relative difference " << (model_cost_change / cost);
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  |          iteration_summary.step_is_valid = true;
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -259,13 +265,12 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |        // NUMERICAL_FAILURE if this limit is exceeded.
 | 
	
		
			
				|  |  |        if (++num_consecutive_invalid_steps >=
 | 
	
		
			
				|  |  |            options_.max_num_consecutive_invalid_steps) {
 | 
	
		
			
				|  |  | -        summary->termination_type = NUMERICAL_FAILURE;
 | 
	
		
			
				|  |  |          summary->error = StringPrintf(
 | 
	
		
			
				|  |  |              "Terminating. Number of successive invalid steps more "
 | 
	
		
			
				|  |  |              "than Solver::Options::max_num_consecutive_invalid_steps: %d",
 | 
	
		
			
				|  |  |              options_.max_num_consecutive_invalid_steps);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        LOG(WARNING) << summary->error;
 | 
	
		
			
				|  |  | +        LOG_IF(WARNING, is_not_silent) << summary->error;
 | 
	
		
			
				|  |  | +        summary->termination_type = NUMERICAL_FAILURE;
 | 
	
		
			
				|  |  |          return;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -314,30 +319,30 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |            if (!evaluator->Evaluate(inner_iteration_x.data(),
 | 
	
		
			
				|  |  |                                     &new_cost,
 | 
	
		
			
				|  |  |                                     NULL, NULL, NULL)) {
 | 
	
		
			
				|  |  | -            VLOG(2) << "Inner iteration failed.";
 | 
	
		
			
				|  |  | +            VLOG_IF(2, is_not_silent) << "Inner iteration failed.";
 | 
	
		
			
				|  |  |              new_cost = x_plus_delta_cost;
 | 
	
		
			
				|  |  |            } else {
 | 
	
		
			
				|  |  |              x_plus_delta = inner_iteration_x;
 | 
	
		
			
				|  |  |              // Boost the model_cost_change, since the inner iteration
 | 
	
		
			
				|  |  |              // improvements are not accounted for by the trust region.
 | 
	
		
			
				|  |  |              model_cost_change +=  x_plus_delta_cost - new_cost;
 | 
	
		
			
				|  |  | -            VLOG(2) << "Inner iteration succeeded; current cost: " << cost
 | 
	
		
			
				|  |  | -                    << " x_plus_delta_cost: " << x_plus_delta_cost
 | 
	
		
			
				|  |  | -                    << " new_cost: " << new_cost;
 | 
	
		
			
				|  |  | -            const double inner_iteration_relative_progress =
 | 
	
		
			
				|  |  | -                1.0 - new_cost / x_plus_delta_cost;
 | 
	
		
			
				|  |  | -            inner_iterations_are_enabled =
 | 
	
		
			
				|  |  | -                (inner_iteration_relative_progress >
 | 
	
		
			
				|  |  | -                 options.inner_iteration_tolerance);
 | 
	
		
			
				|  |  | +            VLOG_IF(2, is_not_silent)
 | 
	
		
			
				|  |  | +                << "Inner iteration succeeded; Current cost: " << cost
 | 
	
		
			
				|  |  | +                << " Trust region step cost: " << x_plus_delta_cost
 | 
	
		
			
				|  |  | +                << " Inner iteration cost: " << new_cost;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              inner_iterations_were_useful = new_cost < cost;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            const double inner_iteration_relative_progress =
 | 
	
		
			
				|  |  | +                1.0 - new_cost / x_plus_delta_cost;
 | 
	
		
			
				|  |  |              // Disable inner iterations once the relative improvement
 | 
	
		
			
				|  |  |              // drops below tolerance.
 | 
	
		
			
				|  |  | -            if (!inner_iterations_are_enabled) {
 | 
	
		
			
				|  |  | -              VLOG(2) << "Disabling inner iterations. Progress : "
 | 
	
		
			
				|  |  | -                      << inner_iteration_relative_progress;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +            inner_iterations_are_enabled =
 | 
	
		
			
				|  |  | +                (inner_iteration_relative_progress >
 | 
	
		
			
				|  |  | +                 options.inner_iteration_tolerance);
 | 
	
		
			
				|  |  | +            VLOG_IF(2, is_not_silent && !inner_iterations_are_enabled)
 | 
	
		
			
				|  |  | +                << "Disabling inner iterations. Progress : "
 | 
	
		
			
				|  |  | +                << inner_iteration_relative_progress;
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |            summary->inner_iteration_time_in_seconds +=
 | 
	
		
			
				|  |  |                WallTimeInSeconds() - inner_iteration_start_time;
 | 
	
	
		
			
				|  | @@ -350,11 +355,12 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |        const double step_size_tolerance =  options_.parameter_tolerance *
 | 
	
		
			
				|  |  |            (x_norm + options_.parameter_tolerance);
 | 
	
		
			
				|  |  |        if (iteration_summary.step_norm <= step_size_tolerance) {
 | 
	
		
			
				|  |  | -        VLOG(1) << "Terminating. Parameter tolerance reached. "
 | 
	
		
			
				|  |  | -                << "relative step_norm: "
 | 
	
		
			
				|  |  | -                << iteration_summary.step_norm /
 | 
	
		
			
				|  |  | -            (x_norm + options_.parameter_tolerance)
 | 
	
		
			
				|  |  | -                << " <= " << options_.parameter_tolerance;
 | 
	
		
			
				|  |  | +        VLOG_IF(1, is_not_silent)
 | 
	
		
			
				|  |  | +            << "Terminating. Parameter tolerance reached. "
 | 
	
		
			
				|  |  | +            << "relative step_norm: "
 | 
	
		
			
				|  |  | +            << (iteration_summary.step_norm /
 | 
	
		
			
				|  |  | +                (x_norm + options_.parameter_tolerance))
 | 
	
		
			
				|  |  | +            << " <= " << options_.parameter_tolerance;
 | 
	
		
			
				|  |  |          summary->termination_type = PARAMETER_TOLERANCE;
 | 
	
		
			
				|  |  |          return;
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -363,10 +369,10 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |        const double absolute_function_tolerance =
 | 
	
		
			
				|  |  |            options_.function_tolerance * cost;
 | 
	
		
			
				|  |  |        if (fabs(iteration_summary.cost_change) < absolute_function_tolerance) {
 | 
	
		
			
				|  |  | -        VLOG(1) << "Terminating. Function tolerance reached. "
 | 
	
		
			
				|  |  | -                << "|cost_change|/cost: "
 | 
	
		
			
				|  |  | -                << fabs(iteration_summary.cost_change) / cost
 | 
	
		
			
				|  |  | -                << " <= " << options_.function_tolerance;
 | 
	
		
			
				|  |  | +        VLOG_IF(1, is_not_silent) << "Terminating. Function tolerance reached. "
 | 
	
		
			
				|  |  | +                                  << "|cost_change|/cost: "
 | 
	
		
			
				|  |  | +                                  << fabs(iteration_summary.cost_change) / cost
 | 
	
		
			
				|  |  | +                                  << " <= " << options_.function_tolerance;
 | 
	
		
			
				|  |  |          summary->termination_type = FUNCTION_TOLERANCE;
 | 
	
		
			
				|  |  |          return;
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -441,10 +447,12 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |          if (!inner_iterations_were_useful &&
 | 
	
		
			
				|  |  |              relative_decrease <= options_.min_relative_decrease) {
 | 
	
		
			
				|  |  |            iteration_summary.step_is_nonmonotonic = true;
 | 
	
		
			
				|  |  | -          VLOG(2) << "Non-monotonic step! "
 | 
	
		
			
				|  |  | -                  << " relative_decrease: " << relative_decrease
 | 
	
		
			
				|  |  | -                  << " historical_relative_decrease: "
 | 
	
		
			
				|  |  | -                  << historical_relative_decrease;
 | 
	
		
			
				|  |  | +          VLOG_IF(2, is_not_silent)
 | 
	
		
			
				|  |  | +              << "Non-monotonic step! "
 | 
	
		
			
				|  |  | +              << " relative_decrease: "
 | 
	
		
			
				|  |  | +              << relative_decrease
 | 
	
		
			
				|  |  | +              << " historical_relative_decrease: "
 | 
	
		
			
				|  |  | +              << historical_relative_decrease;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -462,22 +470,22 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |                                 residuals.data(),
 | 
	
		
			
				|  |  |                                 gradient.data(),
 | 
	
		
			
				|  |  |                                 jacobian)) {
 | 
	
		
			
				|  |  | -        summary->termination_type = NUMERICAL_FAILURE;
 | 
	
		
			
				|  |  |          summary->error =
 | 
	
		
			
				|  |  |              "Terminating: Residual and Jacobian evaluation failed.";
 | 
	
		
			
				|  |  | -        LOG(WARNING) << summary->error;
 | 
	
		
			
				|  |  | +        LOG_IF(WARNING, is_not_silent) << summary->error;
 | 
	
		
			
				|  |  | +        summary->termination_type = NUMERICAL_FAILURE;
 | 
	
		
			
				|  |  |          return;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        iteration_summary.gradient_max_norm = gradient.lpNorm<Eigen::Infinity>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (iteration_summary.gradient_max_norm <= absolute_gradient_tolerance) {
 | 
	
		
			
				|  |  | +        VLOG_IF(1, is_not_silent) << "Terminating: Gradient tolerance reached."
 | 
	
		
			
				|  |  | +                                  << "Relative gradient max norm: "
 | 
	
		
			
				|  |  | +                                  << (iteration_summary.gradient_max_norm /
 | 
	
		
			
				|  |  | +                                      initial_gradient_max_norm)
 | 
	
		
			
				|  |  | +                                  << " <= " << options_.gradient_tolerance;
 | 
	
		
			
				|  |  |          summary->termination_type = GRADIENT_TOLERANCE;
 | 
	
		
			
				|  |  | -        VLOG(1) << "Terminating: Gradient tolerance reached."
 | 
	
		
			
				|  |  | -                << "Relative gradient max norm: "
 | 
	
		
			
				|  |  | -                << (iteration_summary.gradient_max_norm /
 | 
	
		
			
				|  |  | -                    initial_gradient_max_norm)
 | 
	
		
			
				|  |  | -                << " <= " << options_.gradient_tolerance;
 | 
	
		
			
				|  |  |          return;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -505,7 +513,8 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |          if (cost > candidate_cost) {
 | 
	
		
			
				|  |  |            // The current iterate is has a higher cost than the
 | 
	
		
			
				|  |  |            // candidate iterate. Set the candidate to this point.
 | 
	
		
			
				|  |  | -          VLOG(2) << "Updating the candidate iterate to the current point.";
 | 
	
		
			
				|  |  | +          VLOG_IF(2, is_not_silent)
 | 
	
		
			
				|  |  | +              << "Updating the candidate iterate to the current point.";
 | 
	
		
			
				|  |  |            candidate_cost = cost;
 | 
	
		
			
				|  |  |            accumulated_candidate_model_cost_change = 0.0;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -519,7 +528,8 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |          // iterate.
 | 
	
		
			
				|  |  |          if (num_consecutive_nonmonotonic_steps ==
 | 
	
		
			
				|  |  |              options.max_consecutive_nonmonotonic_steps) {
 | 
	
		
			
				|  |  | -          VLOG(2) << "Resetting the reference point to the candidate point";
 | 
	
		
			
				|  |  | +          VLOG_IF(2, is_not_silent)
 | 
	
		
			
				|  |  | +              << "Resetting the reference point to the candidate point";
 | 
	
		
			
				|  |  |            reference_cost = candidate_cost;
 | 
	
		
			
				|  |  |            accumulated_reference_model_cost_change =
 | 
	
		
			
				|  |  |                accumulated_candidate_model_cost_change;
 | 
	
	
		
			
				|  | @@ -538,8 +548,9 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
 | 
	
		
			
				|  |  |      iteration_summary.trust_region_radius = strategy->Radius();
 | 
	
		
			
				|  |  |      if (iteration_summary.trust_region_radius <
 | 
	
		
			
				|  |  |          options_.min_trust_region_radius) {
 | 
	
		
			
				|  |  | +      VLOG_IF(1, is_not_silent)
 | 
	
		
			
				|  |  | +          << "Termination. Minimum trust region radius reached.";
 | 
	
		
			
				|  |  |        summary->termination_type = PARAMETER_TOLERANCE;
 | 
	
		
			
				|  |  | -      VLOG(1) << "Termination. Minimum trust region radius reached.";
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |