| 
					
				 | 
			
			
				@@ -117,8 +117,6 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   iteration_summary.step_norm = 0.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   iteration_summary.relative_decrease = 0.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   iteration_summary.trust_region_radius = strategy->Radius(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // TODO(sameeragarwal): Rename eta to linear_solver_accuracy or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // something similar across the board. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   iteration_summary.eta = options_.eta; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   iteration_summary.linear_solver_iterations = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   iteration_summary.step_solver_time_in_seconds = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -130,9 +128,9 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            residuals.data(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            gradient.data(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            jacobian)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    LOG_IF(WARNING, is_not_silent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        << "Terminating: Residual and Jacobian evaluation failed."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    summary->error = "Terminating: Residual and Jacobian evaluation failed."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     summary->termination_type = NUMERICAL_FAILURE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    LOG_IF(WARNING, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -156,12 +154,13 @@ 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->error = StringPrintf("Terminating: Gradient tolerance reached. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    "Relative gradient max norm: %e <= %e", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    (iteration_summary.gradient_max_norm / 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     initial_gradient_max_norm), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    options_.gradient_tolerance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     summary->termination_type = GRADIENT_TOLERANCE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    VLOG_IF(1, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -189,18 +188,18 @@ 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->error = "Terminating: Maximum number of iterations reached."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       summary->termination_type = NO_CONVERGENCE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      VLOG_IF(1, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       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->error = "Terminating: Maximum solver time reached."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       summary->termination_type = NO_CONVERGENCE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      VLOG_IF(1, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -237,14 +236,16 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     iteration_summary.step_is_valid = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     iteration_summary.step_is_successful = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    double model_cost_change = 0.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (strategy_summary.termination_type == FATAL_ERROR) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      summary->error = "Terminating. Linear solver encountered a fatal error."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      LOG_IF(WARNING, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      summary->error = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          "Terminating. Linear solver failed due to unrecoverable " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          "non-numeric causes. Please see the error log for clues. "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       summary->termination_type = NUMERICAL_FAILURE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      LOG_IF(WARNING, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    double model_cost_change = 0.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (strategy_summary.termination_type != FAILURE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // new_model_cost 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       //  = 1/2 [f + J * step]^2 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -278,8 +279,8 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "Terminating. Number of successive invalid steps more " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "than Solver::Options::max_num_consecutive_invalid_steps: %d", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             options_.max_num_consecutive_invalid_steps); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        LOG_IF(WARNING, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         summary->termination_type = NUMERICAL_FAILURE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOG_IF(WARNING, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -366,13 +367,14 @@ 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_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->error = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StringPrintf("Terminating. Parameter tolerance reached. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         "relative step_norm: %e <= %e.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         (iteration_summary.step_norm / 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          (x_norm + options_.parameter_tolerance)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         options_.parameter_tolerance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         summary->termination_type = PARAMETER_TOLERANCE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VLOG_IF(1, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -380,11 +382,13 @@ 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_IF(1, is_not_silent) << "Terminating. Function tolerance reached. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                  << "|cost_change|/cost: " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                  << fabs(iteration_summary.cost_change) / cost 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                  << " <= " << options_.function_tolerance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        summary->error = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StringPrintf("Terminating. Function tolerance reached. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         "|cost_change|/cost: %e <= %e", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         fabs(iteration_summary.cost_change) / cost, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         options_.function_tolerance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         summary->termination_type = FUNCTION_TOLERANCE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VLOG_IF(1, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -483,8 +487,8 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                jacobian)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         summary->error = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "Terminating: Residual and Jacobian evaluation failed."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        LOG_IF(WARNING, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         summary->termination_type = NUMERICAL_FAILURE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOG_IF(WARNING, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -492,12 +496,14 @@ void TrustRegionMinimizer::Minimize(const Minimizer::Options& options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       iteration_summary.gradient_norm = gradient.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->error = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StringPrintf("Terminating: Gradient tolerance reached. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         "Relative gradient max norm: %e <= %e", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         (iteration_summary.gradient_max_norm / 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          initial_gradient_max_norm), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         options_.gradient_tolerance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         summary->termination_type = GRADIENT_TOLERANCE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VLOG_IF(1, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -560,9 +566,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->error = "Termination. Minimum trust region radius reached."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       summary->termination_type = PARAMETER_TOLERANCE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      VLOG_IF(1, is_not_silent) << summary->error; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |