1 // Ceres Solver - A fast non-linear least squares minimizer 2 // Copyright 2010, 2011, 2012 Google Inc. All rights reserved. 3 // http://code.google.com/p/ceres-solver/ 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: keir (at) google.com (Keir Mierle) 30 31 #ifndef CERES_INTERNAL_GRADIENT_CHECKING_COST_FUNCTION_H_ 32 #define CERES_INTERNAL_GRADIENT_CHECKING_COST_FUNCTION_H_ 33 34 #include <string> 35 36 #include "ceres/cost_function.h" 37 38 namespace ceres { 39 namespace internal { 40 41 class ProblemImpl; 42 43 // Creates a CostFunction that checks the jacobians that cost_function computes 44 // with finite differences. Bad results are logged; required precision is 45 // controlled by relative_precision and the numeric differentiation step size is 46 // controlled with relative_step_size. See solver.h for a better explanation of 47 // relative_step_size. Caller owns result. 48 // 49 // The condition enforced is that 50 // 51 // (J_actual(i, j) - J_numeric(i, j)) 52 // ------------------------------------ < relative_precision 53 // max(J_actual(i, j), J_numeric(i, j)) 54 // 55 // where J_actual(i, j) is the jacobian as computed by the supplied cost 56 // function (by the user) and J_numeric is the jacobian as computed by finite 57 // differences. 58 // 59 // Note: This is quite inefficient and is intended only for debugging. 60 CostFunction* CreateGradientCheckingCostFunction( 61 const CostFunction* cost_function, 62 double relative_step_size, 63 double relative_precision, 64 const string& extra_info); 65 66 // Create a new ProblemImpl object from the input problem_impl, where 67 // each CostFunctions in problem_impl are wrapped inside a 68 // GradientCheckingCostFunctions. This gives us a ProblemImpl object 69 // which checks its derivatives against estimates from numeric 70 // differentiation everytime a ResidualBlock is evaluated. 71 // 72 // relative_step_size and relative_precision are parameters to control 73 // the numeric differentiation and the relative tolerance between the 74 // jacobian computed by the CostFunctions in problem_impl and 75 // jacobians obtained by numerically differentiating them. For more 76 // details see the documentation for 77 // CreateGradientCheckingCostFunction above. 78 ProblemImpl* CreateGradientCheckingProblemImpl(ProblemImpl* problem_impl, 79 double relative_step_size, 80 double relative_precision); 81 82 } // namespace internal 83 } // namespace ceres 84 85 #endif // CERES_INTERNAL_GRADIENT_CHECKING_COST_FUNCTION_H_ 86