blob: 7d17d53eb0f502eb797509793cbfa82618187812 [file] [log] [blame]
Austin Schuh70cc9552019-01-21 19:46:48 -08001// Ceres Solver - A fast non-linear least squares minimizer
2// Copyright 2015 Google Inc. All rights reserved.
3// http://ceres-solver.org/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are met:
7//
8// * Redistributions of source code must retain the above copyright notice,
9// this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above copyright notice,
11// this list of conditions and the following disclaimer in the documentation
12// and/or other materials provided with the distribution.
13// * Neither the name of Google Inc. nor the names of its contributors may be
14// used to endorse or promote products derived from this software without
15// specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27// POSSIBILITY OF SUCH DAMAGE.
28//
29// Author: sameeragarwal@google.com (Sameer Agarwal)
30
31#ifndef CERES_INTERNAL_COORDINATE_DESCENT_MINIMIZER_H_
32#define CERES_INTERNAL_COORDINATE_DESCENT_MINIMIZER_H_
33
34#include <string>
35#include <vector>
36
37#include "ceres/context_impl.h"
38#include "ceres/evaluator.h"
39#include "ceres/minimizer.h"
40#include "ceres/problem_impl.h"
41#include "ceres/solver.h"
42
43namespace ceres {
44namespace internal {
45
46class Program;
47class LinearSolver;
48
49// Given a Program, and a ParameterBlockOrdering which partitions
50// (non-exhaustively) the Hessian matrix into independent sets,
51// perform coordinate descent on the parameter blocks in the
52// ordering. The independent set structure allows for all parameter
53// blocks in the same independent set to be optimized in parallel, and
54// the order of the independent set determines the order in which the
55// parameter block groups are optimized.
56//
57// The minimizer assumes that none of the parameter blocks in the
58// program are constant.
59class CoordinateDescentMinimizer : public Minimizer {
60 public:
61 explicit CoordinateDescentMinimizer(ContextImpl* context);
62
63 bool Init(const Program& program,
64 const ProblemImpl::ParameterMap& parameter_map,
65 const ParameterBlockOrdering& ordering,
66 std::string* error);
67
68 // Minimizer interface.
69 virtual ~CoordinateDescentMinimizer();
70
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080071 void Minimize(const Minimizer::Options& options,
72 double* parameters,
73 Solver::Summary* summary) final;
Austin Schuh70cc9552019-01-21 19:46:48 -080074
75 // Verify that each group in the ordering forms an independent set.
76 static bool IsOrderingValid(const Program& program,
77 const ParameterBlockOrdering& ordering,
78 std::string* message);
79
80 // Find a recursive decomposition of the Hessian matrix as a set
81 // of independent sets of decreasing size and invert it. This
82 // seems to work better in practice, i.e., Cameras before
83 // points.
84 static ParameterBlockOrdering* CreateOrdering(const Program& program);
85
86 private:
87 void Solve(Program* program,
88 LinearSolver* linear_solver,
89 double* parameters,
90 Solver::Summary* summary);
91
92 std::vector<ParameterBlock*> parameter_blocks_;
93 std::vector<std::vector<ResidualBlock*>> residual_blocks_;
94 // The optimization is performed in rounds. In each round all the
95 // parameter blocks that form one independent set are optimized in
96 // parallel. This array, marks the boundaries of the independent
97 // sets in parameter_blocks_.
98 std::vector<int> independent_set_offsets_;
99
100 Evaluator::Options evaluator_options_;
101
102 ContextImpl* context_;
103};
104
105} // namespace internal
106} // namespace ceres
107
108#endif // CERES_INTERNAL_COORDINATE_DESCENT_MINIMIZER_H_