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#include "ceres/numeric_diff_cost_function.h" 320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <algorithm> 340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <cmath> 350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string> 360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <vector> 370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/internal/macros.h" 380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/internal/scoped_ptr.h" 391d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling#include "ceres/numeric_diff_test_utils.h" 400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/test_util.h" 410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ceres/types.h" 420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "glog/logging.h" 430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "gtest/gtest.h" 440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace ceres { 460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 481d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, EasyCaseFunctorCentralDifferences) { 491d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling internal::scoped_ptr<CostFunction> cost_function; 501d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling cost_function.reset( 511d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new NumericDiffCostFunction<EasyFunctor, 520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CENTRAL, 530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3, /* number of residuals */ 540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5, /* size of x1 */ 550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5 /* size of x2 */>( 561d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new EasyFunctor)); 571d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling EasyFunctor functor; 581d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL); 591d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling} 600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 611d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, EasyCaseFunctorForwardDifferences) { 621d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling internal::scoped_ptr<CostFunction> cost_function; 631d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling cost_function.reset( 641d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new NumericDiffCostFunction<EasyFunctor, 650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FORWARD, 660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3, /* number of residuals */ 670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5, /* size of x1 */ 680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5 /* size of x2 */>( 691d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new EasyFunctor)); 701d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling EasyFunctor functor; 711d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD); 720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 741d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, EasyCaseCostFunctionCentralDifferences) { 751d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling internal::scoped_ptr<CostFunction> cost_function; 761d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling cost_function.reset( 771d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new NumericDiffCostFunction<EasyCostFunction, 781d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling CENTRAL, 791d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 3, /* number of residuals */ 801d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 5, /* size of x1 */ 811d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 5 /* size of x2 */>( 821d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new EasyCostFunction, TAKE_OWNERSHIP)); 831d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling EasyFunctor functor; 841d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL); 851d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling} 860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 871d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, EasyCaseCostFunctionForwardDifferences) { 881d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling internal::scoped_ptr<CostFunction> cost_function; 891d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling cost_function.reset( 901d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new NumericDiffCostFunction<EasyCostFunction, 911d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling FORWARD, 921d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 3, /* number of residuals */ 931d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 5, /* size of x1 */ 941d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 5 /* size of x2 */>( 951d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new EasyCostFunction, TAKE_OWNERSHIP)); 961d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling EasyFunctor functor; 971d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD); 981d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling} 990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1001d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, TranscendentalCaseFunctorCentralDifferences) { 1011d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling internal::scoped_ptr<CostFunction> cost_function; 1021d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling cost_function.reset( 1031d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new NumericDiffCostFunction<TranscendentalFunctor, 1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CENTRAL, 1050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2, /* number of residuals */ 1060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5, /* size of x1 */ 1070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5 /* size of x2 */>( 1081d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new TranscendentalFunctor)); 1091d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling TranscendentalFunctor functor; 1101d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL); 1111d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling} 1120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1131d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, TranscendentalCaseFunctorForwardDifferences) { 1141d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling internal::scoped_ptr<CostFunction> cost_function; 1151d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling cost_function.reset( 1161d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new NumericDiffCostFunction<TranscendentalFunctor, 1170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FORWARD, 1180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2, /* number of residuals */ 1190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5, /* size of x1 */ 1200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5 /* size of x2 */>( 1211d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new TranscendentalFunctor)); 1221d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling TranscendentalFunctor functor; 1231d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD); 1241d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling} 1250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1261d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, TranscendentalCaseCostFunctionCentralDifferences) { 1271d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling internal::scoped_ptr<CostFunction> cost_function; 1281d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling cost_function.reset( 1291d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new NumericDiffCostFunction<TranscendentalCostFunction, 1301d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling CENTRAL, 1311d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 2, /* number of residuals */ 1321d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 5, /* size of x1 */ 1331d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 5 /* size of x2 */>( 1341d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new TranscendentalCostFunction, TAKE_OWNERSHIP)); 1351d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling TranscendentalFunctor functor; 1361d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL); 1370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 1380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1391d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha HaeberlingTEST(NumericDiffCostFunction, TranscendentalCaseCostFunctionForwardDifferences) { 1401d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling internal::scoped_ptr<CostFunction> cost_function; 1411d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling cost_function.reset( 1421d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new NumericDiffCostFunction<TranscendentalCostFunction, 1431d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling FORWARD, 1441d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 2, /* number of residuals */ 1451d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 5, /* size of x1 */ 1461d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 5 /* size of x2 */>( 1471d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling new TranscendentalCostFunction, TAKE_OWNERSHIP)); 1481d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling TranscendentalFunctor functor; 1491d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD); 1501d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling} 1510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate<int num_rows, int num_cols> 1530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass SizeTestingCostFunction : public SizedCostFunction<num_rows, num_cols> { 1540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 1550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual bool Evaluate(double const* const* parameters, 1560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double* residuals, 1570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double** jacobians) const { 1580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 1590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 1600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 1610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// As described in 1630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// http://forum.kde.org/viewtopic.php?f=74&t=98536#p210774 1640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Eigen3 has restrictions on the Row/Column major storage of vectors, 1650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// depending on their dimensions. This test ensures that the correct 1660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// templates are instantiated for various shapes of the Jacobian 1670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// matrix. 1680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTEST(NumericDiffCostFunction, EigenRowMajorColMajorTest) { 1690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong scoped_ptr<CostFunction> cost_function; 1700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cost_function.reset( 1710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new NumericDiffCostFunction<SizeTestingCostFunction<1,1>, CENTRAL, 1, 1>( 1720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new SizeTestingCostFunction<1,1>, ceres::TAKE_OWNERSHIP)); 1730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cost_function.reset( 1750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new NumericDiffCostFunction<SizeTestingCostFunction<2,1>, CENTRAL, 2, 1>( 1760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new SizeTestingCostFunction<2,1>, ceres::TAKE_OWNERSHIP)); 1770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cost_function.reset( 1790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new NumericDiffCostFunction<SizeTestingCostFunction<1,2>, CENTRAL, 1, 2>( 1800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new SizeTestingCostFunction<1,2>, ceres::TAKE_OWNERSHIP)); 1810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cost_function.reset( 1830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new NumericDiffCostFunction<SizeTestingCostFunction<2,2>, CENTRAL, 2, 2>( 1840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new SizeTestingCostFunction<2,2>, ceres::TAKE_OWNERSHIP)); 1850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 1860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezTEST(NumericDiffCostFunction, EasyCaseFunctorCentralDifferencesAndDynamicNumResiduals) { 18879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez internal::scoped_ptr<CostFunction> cost_function; 18979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez cost_function.reset( 19079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez new NumericDiffCostFunction<EasyFunctor, 19179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez CENTRAL, 19279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez ceres::DYNAMIC, 19379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 5, /* size of x1 */ 19479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 5 /* size of x2 */>( 19579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez new EasyFunctor, TAKE_OWNERSHIP, 3)); 19679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez EasyFunctor functor; 19779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL); 19879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez} 19979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 2000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 2010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace ceres 202