problem_impl.h revision 0ae28bd5885b5daa526898fcf7c323dc2c3e1963
10ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Ceres Solver - A fast non-linear least squares minimizer
20ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
30ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// http://code.google.com/p/ceres-solver/
40ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
50ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without
60ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are met:
70ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
80ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright notice,
90ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   this list of conditions and the following disclaimer.
100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above copyright notice,
110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   this list of conditions and the following disclaimer in the documentation
120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   and/or other materials provided with the distribution.
130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its contributors may be
140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   used to endorse or promote products derived from this software without
150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//   specific prior written permission.
160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// POSSIBILITY OF SUCH DAMAGE.
280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: keir@google.com (Keir Mierle)
300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//
310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This is the implementation of the public Problem API. The pointer to
320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// implementation (PIMPL) idiom makes it possible for Ceres internal code to
330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// refer to the private data members without needing to exposing it to the
340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// world. An alternative to PIMPL is to have a factory which returns instances
350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of a virtual base class; while that approach would work, it requires clients
360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to always put a Problem object into a scoped pointer; this needlessly muddies
370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// client code for little benefit. Therefore, the PIMPL comprise was chosen.
380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifndef CERES_PUBLIC_PROBLEM_IMPL_H_
400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define CERES_PUBLIC_PROBLEM_IMPL_H_
410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <map>
430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <vector>
440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/internal/macros.h"
460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/internal/port.h"
470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/internal/scoped_ptr.h"
480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/problem.h"
490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/types.h"
500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace ceres {
520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass CostFunction;
540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass LossFunction;
550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass LocalParameterization;
560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal {
580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass Program;
600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass ResidualBlock;
610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass ProblemImpl {
630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public:
640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  typedef map<double*, ParameterBlock*> ParameterMap;
650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ProblemImpl();
670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  explicit ProblemImpl(const Problem::Options& options);
680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ~ProblemImpl();
700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // See the public problem.h file for description of these methods.
720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   const vector<double*>& parameter_blocks);
750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0);
780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1);
810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1, double* x2);
840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1, double* x2,
870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x3);
880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1, double* x2,
910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x3, double* x4);
920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1, double* x2,
950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x3, double* x4, double* x5);
960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1, double* x2,
990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x3, double* x4, double* x5,
1000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x6);
1010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
1020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
1030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1, double* x2,
1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x3, double* x4, double* x5,
1050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x6, double* x7);
1060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
1070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
1080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1, double* x2,
1090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x3, double* x4, double* x5,
1100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x6, double* x7, double* x8);
1110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  ResidualBlockId AddResidualBlock(CostFunction* cost_function,
1120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   LossFunction* loss_function,
1130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x0, double* x1, double* x2,
1140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x3, double* x4, double* x5,
1150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x6, double* x7, double* x8,
1160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                                   double* x9);
1170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  void AddParameterBlock(double* values, int size);
1180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  void AddParameterBlock(double* values,
1190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                         int size,
1200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                         LocalParameterization* local_parameterization);
1210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  void SetParameterBlockConstant(double* values);
1220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  void SetParameterBlockVariable(double* values);
1230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  void SetParameterization(double* values,
1240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong                           LocalParameterization* local_parameterization);
1250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  int NumParameterBlocks() const;
1260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  int NumParameters() const;
1270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  int NumResidualBlocks() const;
1280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  int NumResiduals() const;
1290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  const Program& program() const { return *program_; }
1310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  Program* mutable_program() { return program_.get(); }
1320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  const ParameterMap& parameter_map() const { return parameter_block_map_; }
1340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private:
1360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  const Problem::Options options_;
1370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  // The mapping from user pointers to parameter blocks.
1390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  map<double*, ParameterBlock*> parameter_block_map_;
1400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  internal::scoped_ptr<internal::Program> program_;
1420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong  CERES_DISALLOW_COPY_AND_ASSIGN(ProblemImpl);
1430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong};
1440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}  // namespace internal
1460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}  // namespace ceres
1470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong
1480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif  // CERES_PUBLIC_PROBLEM_IMPL_H_
149