179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Ceres Solver - A fast non-linear least squares minimizer 279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Copyright 2014 Google Inc. All rights reserved. 379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// http://code.google.com/p/ceres-solver/ 479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// 579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Redistribution and use in source and binary forms, with or without 679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// modification, are permitted provided that the following conditions are met: 779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// 879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// * Redistributions of source code must retain the above copyright notice, 979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// this list of conditions and the following disclaimer. 1079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// * Redistributions in binary form must reproduce the above copyright notice, 1179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// this list of conditions and the following disclaimer in the documentation 1279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// and/or other materials provided with the distribution. 1379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// * Neither the name of Google Inc. nor the names of its contributors may be 1479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// used to endorse or promote products derived from this software without 1579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// specific prior written permission. 1679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// 1779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 2179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// POSSIBILITY OF SUCH DAMAGE. 2879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// 2979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Author: sameeragarwal@google.com (Sameer Agarwal) 3079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 3179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include <iostream> // NO LINT 3279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/callbacks.h" 3379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/program.h" 3479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/stringprintf.h" 3579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "glog/logging.h" 3679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 3779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandeznamespace ceres { 3879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandeznamespace internal { 3979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 4079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezStateUpdatingCallback::StateUpdatingCallback(Program* program, 4179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez double* parameters) 4279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez : program_(program), parameters_(parameters) {} 4379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 4479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezStateUpdatingCallback::~StateUpdatingCallback() {} 4579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 4679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCallbackReturnType StateUpdatingCallback::operator()( 4779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez const IterationSummary& summary) { 4879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez if (summary.step_is_successful) { 4979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez program_->StateVectorToParameterBlocks(parameters_); 5079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez program_->CopyParameterBlockStateToUserState(); 5179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez } 5279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez return SOLVER_CONTINUE; 5379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez} 5479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 5579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezLoggingCallback::LoggingCallback(const MinimizerType minimizer_type, 5679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez const bool log_to_stdout) 5779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez : minimizer_type(minimizer_type), 5879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez log_to_stdout_(log_to_stdout) {} 5979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 6079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezLoggingCallback::~LoggingCallback() {} 6179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 6279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezCallbackReturnType LoggingCallback::operator()( 6379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez const IterationSummary& summary) { 6479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez string output; 6579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez if (minimizer_type == LINE_SEARCH) { 6679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez const char* kReportRowFormat = 6779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez "% 4d: f:% 8e d:% 3.2e g:% 3.2e h:% 3.2e " 6879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez "s:% 3.2e e:% 3d it:% 3.2e tt:% 3.2e"; 6979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez output = StringPrintf(kReportRowFormat, 7079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.iteration, 7179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.cost, 7279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.cost_change, 7379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.gradient_max_norm, 7479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.step_norm, 7579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.step_size, 7679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.line_search_function_evaluations, 7779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.iteration_time_in_seconds, 7879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.cumulative_time_in_seconds); 7979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez } else if (minimizer_type == TRUST_REGION) { 8079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez if (summary.iteration == 0) { 8179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez output = "iter cost cost_change |gradient| |step| tr_ratio tr_radius ls_iter iter_time total_time\n"; 8279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez } 8379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez const char* kReportRowFormat = 8479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez "% 4d % 8e % 3.2e % 3.2e % 3.2e % 3.2e % 3.2e % 3d % 3.2e % 3.2e"; 8579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez output += StringPrintf(kReportRowFormat, 8679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.iteration, 8779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.cost, 8879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.cost_change, 8979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.gradient_max_norm, 9079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.step_norm, 9179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.relative_decrease, 9279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.trust_region_radius, 9379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.linear_solver_iterations, 9479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.iteration_time_in_seconds, 9579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez summary.cumulative_time_in_seconds); 9679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez } else { 9779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez LOG(FATAL) << "Unknown minimizer type."; 9879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez } 9979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 10079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez if (log_to_stdout_) { 10179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez cout << output << endl; 10279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez } else { 10379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez VLOG(1) << output; 10479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez } 10579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez return SOLVER_CONTINUE; 10679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez} 10779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 10879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez} // namespace internal 10979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez} // namespace ceres 110