blob: f3ffd546ef70a942463d77d2733883f86dca11d3 [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// keir@google.com (Keir Mierle)
31
32#include "ceres/problem.h"
33
34#include <vector>
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080035
Austin Schuh70cc9552019-01-21 19:46:48 -080036#include "ceres/crs_matrix.h"
37#include "ceres/problem_impl.h"
38
39namespace ceres {
40
41using std::vector;
42
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080043Problem::Problem() : impl_(new internal::ProblemImpl) {}
Austin Schuh70cc9552019-01-21 19:46:48 -080044Problem::Problem(const Problem::Options& options)
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080045 : impl_(new internal::ProblemImpl(options)) {}
46// Not inline defaulted in declaration due to use of std::unique_ptr.
47Problem::Problem(Problem&&) = default;
48Problem& Problem::operator=(Problem&&) = default;
Austin Schuh70cc9552019-01-21 19:46:48 -080049Problem::~Problem() {}
50
51ResidualBlockId Problem::AddResidualBlock(
52 CostFunction* cost_function,
53 LossFunction* loss_function,
54 const vector<double*>& parameter_blocks) {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080055 return impl_->AddResidualBlock(cost_function,
56 loss_function,
57 parameter_blocks.data(),
58 static_cast<int>(parameter_blocks.size()));
Austin Schuh70cc9552019-01-21 19:46:48 -080059}
60
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080061ResidualBlockId Problem::AddResidualBlock(CostFunction* cost_function,
62 LossFunction* loss_function,
63 double* const* const parameter_blocks,
64 int num_parameter_blocks) {
65 return impl_->AddResidualBlock(
66 cost_function, loss_function, parameter_blocks, num_parameter_blocks);
Austin Schuh70cc9552019-01-21 19:46:48 -080067}
68
69void Problem::AddParameterBlock(double* values, int size) {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080070 impl_->AddParameterBlock(values, size);
Austin Schuh70cc9552019-01-21 19:46:48 -080071}
72
73void Problem::AddParameterBlock(double* values,
74 int size,
75 LocalParameterization* local_parameterization) {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080076 impl_->AddParameterBlock(values, size, local_parameterization);
Austin Schuh70cc9552019-01-21 19:46:48 -080077}
78
79void Problem::RemoveResidualBlock(ResidualBlockId residual_block) {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080080 impl_->RemoveResidualBlock(residual_block);
Austin Schuh70cc9552019-01-21 19:46:48 -080081}
82
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080083void Problem::RemoveParameterBlock(const double* values) {
84 impl_->RemoveParameterBlock(values);
Austin Schuh70cc9552019-01-21 19:46:48 -080085}
86
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080087void Problem::SetParameterBlockConstant(const double* values) {
88 impl_->SetParameterBlockConstant(values);
Austin Schuh70cc9552019-01-21 19:46:48 -080089}
90
91void Problem::SetParameterBlockVariable(double* values) {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080092 impl_->SetParameterBlockVariable(values);
Austin Schuh70cc9552019-01-21 19:46:48 -080093}
94
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080095bool Problem::IsParameterBlockConstant(const double* values) const {
96 return impl_->IsParameterBlockConstant(values);
Austin Schuh70cc9552019-01-21 19:46:48 -080097}
98
99void Problem::SetParameterization(
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800100 double* values, LocalParameterization* local_parameterization) {
101 impl_->SetParameterization(values, local_parameterization);
Austin Schuh70cc9552019-01-21 19:46:48 -0800102}
103
104const LocalParameterization* Problem::GetParameterization(
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800105 const double* values) const {
106 return impl_->GetParameterization(values);
Austin Schuh70cc9552019-01-21 19:46:48 -0800107}
108
109void Problem::SetParameterLowerBound(double* values,
110 int index,
111 double lower_bound) {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800112 impl_->SetParameterLowerBound(values, index, lower_bound);
Austin Schuh70cc9552019-01-21 19:46:48 -0800113}
114
115void Problem::SetParameterUpperBound(double* values,
116 int index,
117 double upper_bound) {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800118 impl_->SetParameterUpperBound(values, index, upper_bound);
Austin Schuh70cc9552019-01-21 19:46:48 -0800119}
120
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800121double Problem::GetParameterUpperBound(const double* values, int index) const {
122 return impl_->GetParameterUpperBound(values, index);
Austin Schuh70cc9552019-01-21 19:46:48 -0800123}
124
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800125double Problem::GetParameterLowerBound(const double* values, int index) const {
126 return impl_->GetParameterLowerBound(values, index);
Austin Schuh70cc9552019-01-21 19:46:48 -0800127}
128
129bool Problem::Evaluate(const EvaluateOptions& evaluate_options,
130 double* cost,
131 vector<double>* residuals,
132 vector<double>* gradient,
133 CRSMatrix* jacobian) {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800134 return impl_->Evaluate(evaluate_options, cost, residuals, gradient, jacobian);
Austin Schuh70cc9552019-01-21 19:46:48 -0800135}
136
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800137bool Problem::EvaluateResidualBlock(ResidualBlockId residual_block_id,
138 bool apply_loss_function,
139 double* cost,
140 double* residuals,
141 double** jacobians) const {
142 return impl_->EvaluateResidualBlock(residual_block_id,
143 apply_loss_function,
144 /* new_point = */ true,
145 cost,
146 residuals,
147 jacobians);
Austin Schuh70cc9552019-01-21 19:46:48 -0800148}
149
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800150bool Problem::EvaluateResidualBlockAssumingParametersUnchanged(
151 ResidualBlockId residual_block_id,
152 bool apply_loss_function,
153 double* cost,
154 double* residuals,
155 double** jacobians) const {
156 return impl_->EvaluateResidualBlock(residual_block_id,
157 apply_loss_function,
158 /* new_point = */ false,
159 cost,
160 residuals,
161 jacobians);
Austin Schuh70cc9552019-01-21 19:46:48 -0800162}
163
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800164int Problem::NumParameterBlocks() const { return impl_->NumParameterBlocks(); }
Austin Schuh70cc9552019-01-21 19:46:48 -0800165
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800166int Problem::NumParameters() const { return impl_->NumParameters(); }
167
168int Problem::NumResidualBlocks() const { return impl_->NumResidualBlocks(); }
169
170int Problem::NumResiduals() const { return impl_->NumResiduals(); }
Austin Schuh70cc9552019-01-21 19:46:48 -0800171
172int Problem::ParameterBlockSize(const double* parameter_block) const {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800173 return impl_->ParameterBlockSize(parameter_block);
Austin Schuh70cc9552019-01-21 19:46:48 -0800174}
175
176int Problem::ParameterBlockLocalSize(const double* parameter_block) const {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800177 return impl_->ParameterBlockLocalSize(parameter_block);
Austin Schuh70cc9552019-01-21 19:46:48 -0800178}
179
180bool Problem::HasParameterBlock(const double* values) const {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800181 return impl_->HasParameterBlock(values);
Austin Schuh70cc9552019-01-21 19:46:48 -0800182}
183
184void Problem::GetParameterBlocks(vector<double*>* parameter_blocks) const {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800185 impl_->GetParameterBlocks(parameter_blocks);
Austin Schuh70cc9552019-01-21 19:46:48 -0800186}
187
188void Problem::GetResidualBlocks(
189 vector<ResidualBlockId>* residual_blocks) const {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800190 impl_->GetResidualBlocks(residual_blocks);
Austin Schuh70cc9552019-01-21 19:46:48 -0800191}
192
193void Problem::GetParameterBlocksForResidualBlock(
194 const ResidualBlockId residual_block,
195 vector<double*>* parameter_blocks) const {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800196 impl_->GetParameterBlocksForResidualBlock(residual_block, parameter_blocks);
Austin Schuh70cc9552019-01-21 19:46:48 -0800197}
198
199const CostFunction* Problem::GetCostFunctionForResidualBlock(
200 const ResidualBlockId residual_block) const {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800201 return impl_->GetCostFunctionForResidualBlock(residual_block);
Austin Schuh70cc9552019-01-21 19:46:48 -0800202}
203
204const LossFunction* Problem::GetLossFunctionForResidualBlock(
205 const ResidualBlockId residual_block) const {
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800206 return impl_->GetLossFunctionForResidualBlock(residual_block);
Austin Schuh70cc9552019-01-21 19:46:48 -0800207}
208
209void Problem::GetResidualBlocksForParameterBlock(
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800210 const double* values, vector<ResidualBlockId>* residual_blocks) const {
211 impl_->GetResidualBlocksForParameterBlock(values, residual_blocks);
Austin Schuh70cc9552019-01-21 19:46:48 -0800212}
213
214} // namespace ceres