11d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// Ceres Solver - A fast non-linear least squares minimizer
21d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// Copyright 2013 Google Inc. All rights reserved.
31d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// http://code.google.com/p/ceres-solver/
41d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//
51d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// Redistribution and use in source and binary forms, with or without
61d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// modification, are permitted provided that the following conditions are met:
71d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//
81d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// * Redistributions of source code must retain the above copyright notice,
91d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//   this list of conditions and the following disclaimer.
101d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// * Redistributions in binary form must reproduce the above copyright notice,
111d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//   this list of conditions and the following disclaimer in the documentation
121d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//   and/or other materials provided with the distribution.
131d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// * Neither the name of Google Inc. nor the names of its contributors may be
141d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//   used to endorse or promote products derived from this software without
151d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//   specific prior written permission.
161d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//
171d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
181d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
191d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
201d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
211d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
221d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
231d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
241d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
251d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
261d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
271d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// POSSIBILITY OF SUCH DAMAGE.
281d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling//
291d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling// Author: sameeragarwal@google.com (Sameer Agarwal)
301d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
311d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "ceres/numeric_diff_functor.h"
321d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
331d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include <algorithm>
341d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include <cmath>
351d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include <string>
361d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include <vector>
371d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "ceres/autodiff_cost_function.h"
381d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "ceres/internal/scoped_ptr.h"
391d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "ceres/numeric_diff_test_utils.h"
401d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "ceres/test_util.h"
411d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "ceres/types.h"
421d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "glog/logging.h"
431d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "gtest/gtest.h"
441d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
451d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingnamespace ceres {
461d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberlingnamespace internal {
471d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
481d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, EasyCaseCentralDifferences) {
491d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  typedef NumericDiffFunctor<EasyFunctor, CENTRAL, 3, 5, 5>
501d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      NumericDiffEasyFunctor;
511d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
521d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  internal::scoped_ptr<CostFunction> cost_function;
531d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  EasyFunctor functor;
541d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
551d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  cost_function.reset(
561d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      new AutoDiffCostFunction<NumericDiffEasyFunctor, 3, 5, 5>(
571d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling          new NumericDiffEasyFunctor));
581d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
591d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL);
601d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
611d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  cost_function.reset(
621d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      new AutoDiffCostFunction<NumericDiffEasyFunctor, 3, 5, 5>(
631d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling          new NumericDiffEasyFunctor(new EasyFunctor)));
641d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL);
651d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling}
661d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
671d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, EasyCaseForwardDifferences) {
681d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  typedef NumericDiffFunctor<EasyFunctor, FORWARD, 3, 5, 5>
691d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      NumericDiffEasyFunctor;
701d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
711d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  internal::scoped_ptr<CostFunction> cost_function;
721d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  EasyFunctor functor;
731d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
741d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  cost_function.reset(
751d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      new AutoDiffCostFunction<NumericDiffEasyFunctor, 3, 5, 5>(
761d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling          new NumericDiffEasyFunctor));
771d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
781d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD);
791d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
801d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  cost_function.reset(
811d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      new AutoDiffCostFunction<NumericDiffEasyFunctor, 3, 5, 5>(
821d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling          new NumericDiffEasyFunctor(new EasyFunctor)));
831d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD);
841d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling}
851d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
861d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, TranscendentalCaseCentralDifferences) {
871d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  typedef NumericDiffFunctor<TranscendentalFunctor, CENTRAL, 2, 5, 5>
881d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      NumericDiffTranscendentalFunctor;
891d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
901d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  internal::scoped_ptr<CostFunction> cost_function;
911d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  TranscendentalFunctor functor;
921d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
931d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  cost_function.reset(
941d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      new AutoDiffCostFunction<NumericDiffTranscendentalFunctor, 2, 5, 5>(
951d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling          new NumericDiffTranscendentalFunctor));
961d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
971d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL);
981d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
991d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  cost_function.reset(
1001d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      new AutoDiffCostFunction<NumericDiffTranscendentalFunctor, 2, 5, 5>(
1011d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling          new NumericDiffTranscendentalFunctor(new TranscendentalFunctor)));
1021d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL);
1031d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling}
1041d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1051d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, TranscendentalCaseForwardDifferences) {
1061d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  typedef NumericDiffFunctor<TranscendentalFunctor, FORWARD, 2, 5, 5>
1071d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      NumericDiffTranscendentalFunctor;
1081d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1091d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  internal::scoped_ptr<CostFunction> cost_function;
1101d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  TranscendentalFunctor functor;
1111d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1121d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  cost_function.reset(
1131d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      new AutoDiffCostFunction<NumericDiffTranscendentalFunctor, 2, 5, 5>(
1141d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling          new NumericDiffTranscendentalFunctor));
1151d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1161d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD);
1171d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1181d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  cost_function.reset(
1191d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling      new AutoDiffCostFunction<NumericDiffTranscendentalFunctor, 2, 5, 5>(
1201d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling          new NumericDiffTranscendentalFunctor(new TranscendentalFunctor)));
1211d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling  functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD);
1221d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling}
1231d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling
1241d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling}  // namespace internal
1251d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling}  // namespace ceres
126