Blame internal/ceres/minimizer.h

Packit ea1746
// Ceres Solver - A fast non-linear least squares minimizer
Packit ea1746
// Copyright 2015 Google Inc. All rights reserved.
Packit ea1746
// http://ceres-solver.org/
Packit ea1746
//
Packit ea1746
// Redistribution and use in source and binary forms, with or without
Packit ea1746
// modification, are permitted provided that the following conditions are met:
Packit ea1746
//
Packit ea1746
// * Redistributions of source code must retain the above copyright notice,
Packit ea1746
//   this list of conditions and the following disclaimer.
Packit ea1746
// * Redistributions in binary form must reproduce the above copyright notice,
Packit ea1746
//   this list of conditions and the following disclaimer in the documentation
Packit ea1746
//   and/or other materials provided with the distribution.
Packit ea1746
// * Neither the name of Google Inc. nor the names of its contributors may be
Packit ea1746
//   used to endorse or promote products derived from this software without
Packit ea1746
//   specific prior written permission.
Packit ea1746
//
Packit ea1746
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit ea1746
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit ea1746
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit ea1746
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
Packit ea1746
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Packit ea1746
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Packit ea1746
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Packit ea1746
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
Packit ea1746
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Packit ea1746
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit ea1746
// POSSIBILITY OF SUCH DAMAGE.
Packit ea1746
//
Packit ea1746
// Author: sameeragarwal@google.com (Sameer Agarwal)
Packit ea1746
Packit ea1746
#ifndef CERES_INTERNAL_MINIMIZER_H_
Packit ea1746
#define CERES_INTERNAL_MINIMIZER_H_
Packit ea1746
Packit ea1746
#include <string>
Packit ea1746
#include <vector>
Packit ea1746
#include "ceres/internal/port.h"
Packit ea1746
#include "ceres/iteration_callback.h"
Packit ea1746
#include "ceres/solver.h"
Packit ea1746
Packit ea1746
namespace ceres {
Packit ea1746
namespace internal {
Packit ea1746
Packit ea1746
class Evaluator;
Packit ea1746
class SparseMatrix;
Packit ea1746
class TrustRegionStrategy;
Packit ea1746
class CoordinateDescentMinimizer;
Packit ea1746
class LinearSolver;
Packit ea1746
Packit ea1746
// Interface for non-linear least squares solvers.
Packit ea1746
class Minimizer {
Packit ea1746
 public:
Packit ea1746
  // Options struct to control the behaviour of the Minimizer. Please
Packit ea1746
  // see solver.h for detailed information about the meaning and
Packit ea1746
  // default values of each of these parameters.
Packit ea1746
  struct Options {
Packit ea1746
    Options() {
Packit ea1746
      Init(Solver::Options());
Packit ea1746
    }
Packit ea1746
Packit ea1746
    explicit Options(const Solver::Options& options) {
Packit ea1746
      Init(options);
Packit ea1746
    }
Packit ea1746
Packit ea1746
    void Init(const Solver::Options& options) {
Packit ea1746
      num_threads = options.num_threads;
Packit ea1746
      max_num_iterations = options.max_num_iterations;
Packit ea1746
      max_solver_time_in_seconds = options.max_solver_time_in_seconds;
Packit ea1746
      max_step_solver_retries = 5;
Packit ea1746
      gradient_tolerance = options.gradient_tolerance;
Packit ea1746
      parameter_tolerance = options.parameter_tolerance;
Packit ea1746
      function_tolerance = options.function_tolerance;
Packit ea1746
      min_relative_decrease = options.min_relative_decrease;
Packit ea1746
      eta = options.eta;
Packit ea1746
      jacobi_scaling = options.jacobi_scaling;
Packit ea1746
      use_nonmonotonic_steps = options.use_nonmonotonic_steps;
Packit ea1746
      max_consecutive_nonmonotonic_steps =
Packit ea1746
          options.max_consecutive_nonmonotonic_steps;
Packit ea1746
      trust_region_problem_dump_directory =
Packit ea1746
          options.trust_region_problem_dump_directory;
Packit ea1746
      trust_region_minimizer_iterations_to_dump =
Packit ea1746
          options.trust_region_minimizer_iterations_to_dump;
Packit ea1746
      trust_region_problem_dump_format_type =
Packit ea1746
          options.trust_region_problem_dump_format_type;
Packit ea1746
      max_num_consecutive_invalid_steps =
Packit ea1746
          options.max_num_consecutive_invalid_steps;
Packit ea1746
      min_trust_region_radius = options.min_trust_region_radius;
Packit ea1746
      line_search_direction_type = options.line_search_direction_type;
Packit ea1746
      line_search_type = options.line_search_type;
Packit ea1746
      nonlinear_conjugate_gradient_type =
Packit ea1746
          options.nonlinear_conjugate_gradient_type;
Packit ea1746
      max_lbfgs_rank = options.max_lbfgs_rank;
Packit ea1746
      use_approximate_eigenvalue_bfgs_scaling =
Packit ea1746
          options.use_approximate_eigenvalue_bfgs_scaling;
Packit ea1746
      line_search_interpolation_type =
Packit ea1746
          options.line_search_interpolation_type;
Packit ea1746
      min_line_search_step_size = options.min_line_search_step_size;
Packit ea1746
      line_search_sufficient_function_decrease =
Packit ea1746
          options.line_search_sufficient_function_decrease;
Packit ea1746
      max_line_search_step_contraction =
Packit ea1746
          options.max_line_search_step_contraction;
Packit ea1746
      min_line_search_step_contraction =
Packit ea1746
          options.min_line_search_step_contraction;
Packit ea1746
      max_num_line_search_step_size_iterations =
Packit ea1746
          options.max_num_line_search_step_size_iterations;
Packit ea1746
      max_num_line_search_direction_restarts =
Packit ea1746
          options.max_num_line_search_direction_restarts;
Packit ea1746
      line_search_sufficient_curvature_decrease =
Packit ea1746
          options.line_search_sufficient_curvature_decrease;
Packit ea1746
      max_line_search_step_expansion =
Packit ea1746
          options.max_line_search_step_expansion;
Packit ea1746
      inner_iteration_tolerance = options.inner_iteration_tolerance;
Packit ea1746
      is_silent = (options.logging_type == SILENT);
Packit ea1746
      is_constrained = false;
Packit ea1746
      callbacks = options.callbacks;
Packit ea1746
    }
Packit ea1746
Packit ea1746
    int max_num_iterations;
Packit ea1746
    double max_solver_time_in_seconds;
Packit ea1746
    int num_threads;
Packit ea1746
Packit ea1746
    // Number of times the linear solver should be retried in case of
Packit ea1746
    // numerical failure. The retries are done by exponentially scaling up
Packit ea1746
    // mu at each retry. This leads to stronger and stronger
Packit ea1746
    // regularization making the linear least squares problem better
Packit ea1746
    // conditioned at each retry.
Packit ea1746
    int max_step_solver_retries;
Packit ea1746
    double gradient_tolerance;
Packit ea1746
    double parameter_tolerance;
Packit ea1746
    double function_tolerance;
Packit ea1746
    double min_relative_decrease;
Packit ea1746
    double eta;
Packit ea1746
    bool jacobi_scaling;
Packit ea1746
    bool use_nonmonotonic_steps;
Packit ea1746
    int max_consecutive_nonmonotonic_steps;
Packit ea1746
    std::vector<int> trust_region_minimizer_iterations_to_dump;
Packit ea1746
    DumpFormatType trust_region_problem_dump_format_type;
Packit ea1746
    std::string trust_region_problem_dump_directory;
Packit ea1746
    int max_num_consecutive_invalid_steps;
Packit ea1746
    double min_trust_region_radius;
Packit ea1746
    LineSearchDirectionType line_search_direction_type;
Packit ea1746
    LineSearchType line_search_type;
Packit ea1746
    NonlinearConjugateGradientType nonlinear_conjugate_gradient_type;
Packit ea1746
    int max_lbfgs_rank;
Packit ea1746
    bool use_approximate_eigenvalue_bfgs_scaling;
Packit ea1746
    LineSearchInterpolationType line_search_interpolation_type;
Packit ea1746
    double min_line_search_step_size;
Packit ea1746
    double line_search_sufficient_function_decrease;
Packit ea1746
    double max_line_search_step_contraction;
Packit ea1746
    double min_line_search_step_contraction;
Packit ea1746
    int max_num_line_search_step_size_iterations;
Packit ea1746
    int max_num_line_search_direction_restarts;
Packit ea1746
    double line_search_sufficient_curvature_decrease;
Packit ea1746
    double max_line_search_step_expansion;
Packit ea1746
    double inner_iteration_tolerance;
Packit ea1746
Packit ea1746
    // If true, then all logging is disabled.
Packit ea1746
    bool is_silent;
Packit ea1746
Packit ea1746
    // Use a bounds constrained optimization algorithm.
Packit ea1746
    bool is_constrained;
Packit ea1746
Packit ea1746
    // List of callbacks that are executed by the Minimizer at the end
Packit ea1746
    // of each iteration.
Packit ea1746
    //
Packit ea1746
    // The Options struct does not own these pointers.
Packit ea1746
    std::vector<IterationCallback*> callbacks;
Packit ea1746
Packit ea1746
    // Object responsible for evaluating the cost, residuals and
Packit ea1746
    // Jacobian matrix.
Packit ea1746
    shared_ptr<Evaluator> evaluator;
Packit ea1746
Packit ea1746
    // Object responsible for actually computing the trust region
Packit ea1746
    // step, and sizing the trust region radius.
Packit ea1746
    shared_ptr<TrustRegionStrategy> trust_region_strategy;
Packit ea1746
Packit ea1746
    // Object holding the Jacobian matrix. It is assumed that the
Packit ea1746
    // sparsity structure of the matrix has already been initialized
Packit ea1746
    // and will remain constant for the life time of the
Packit ea1746
    // optimization.
Packit ea1746
    shared_ptr<SparseMatrix> jacobian;
Packit ea1746
Packit ea1746
    shared_ptr<CoordinateDescentMinimizer> inner_iteration_minimizer;
Packit ea1746
  };
Packit ea1746
Packit ea1746
  static Minimizer* Create(MinimizerType minimizer_type);
Packit ea1746
  static bool RunCallbacks(const Options& options,
Packit ea1746
                           const IterationSummary& iteration_summary,
Packit ea1746
                           Solver::Summary* summary);
Packit ea1746
Packit ea1746
  virtual ~Minimizer();
Packit ea1746
  // Note: The minimizer is expected to update the state of the
Packit ea1746
  // parameters array every iteration. This is required for the
Packit ea1746
  // StateUpdatingCallback to work.
Packit ea1746
  virtual void Minimize(const Options& options,
Packit ea1746
                        double* parameters,
Packit ea1746
                        Solver::Summary* summary) = 0;
Packit ea1746
};
Packit ea1746
Packit ea1746
}  // namespace internal
Packit ea1746
}  // namespace ceres
Packit ea1746
Packit ea1746
#endif  // CERES_INTERNAL_MINIMIZER_H_