Remove NumericDiffFunctor.
Its API was broken, and its implementation was an unnecessary
layer of abstraction over CostFunctionToFunctor.
Change-Id: I18fc261fc6a3620b51a9eeb4dde0af03d753af69
diff --git a/docs/source/modeling.rst b/docs/source/modeling.rst
index 5bbd441..4b333c4 100644
--- a/docs/source/modeling.rst
+++ b/docs/source/modeling.rst
@@ -567,105 +567,15 @@
As a rule of thumb, try using :class:`NumericDiffCostFunction` before
you use :class:`DynamicNumericDiffCostFunction`.
-
-:class:`NumericDiffFunctor`
----------------------------
-
-.. class:: NumericDiffFunctor
-
- Sometimes parts of a cost function can be differentiated
- automatically or analytically but others require numeric
- differentiation. :class:`NumericDiffFunctor` is a wrapper class
- that takes a variadic functor evaluating a function, numerically
- differentiates it and makes it available as a templated functor so
- that it can be easily used as part of Ceres' automatic
- differentiation framework.
-
- For example, let us assume that
-
- .. code-block:: c++
-
- struct IntrinsicProjection
- IntrinsicProjection(const double* observations);
- bool operator()(const double* calibration,
- const double* point,
- double* residuals);
- };
-
- is a functor that implements the projection of a point in its local
- coordinate system onto its image plane and subtracts it from the
- observed point projection.
-
- Now we would like to compose the action of this functor with the
- action of camera extrinsics, i.e., rotation and translation, which
- is given by the following templated function
-
- .. code-block:: c++
-
- template<typename T>
- void RotateAndTranslatePoint(const T* rotation,
- const T* translation,
- const T* point,
- T* result);
-
- To compose the extrinsics and intrinsics, we can construct a
- ``CameraProjection`` functor as follows.
-
- .. code-block:: c++
-
- struct CameraProjection {
- typedef NumericDiffFunctor<IntrinsicProjection, CENTRAL, 2, 5, 3>
- IntrinsicProjectionFunctor;
-
- CameraProjection(double* observation) {
- intrinsic_projection_.reset(
- new IntrinsicProjectionFunctor(observation)) {
- }
-
- template <typename T>
- bool operator()(const T* rotation,
- const T* translation,
- const T* intrinsics,
- const T* point,
- T* residuals) const {
- T transformed_point[3];
- RotateAndTranslatePoint(rotation, translation, point, transformed_point);
- return (*intrinsic_projection_)(intrinsics, transformed_point, residual);
- }
-
- private:
- scoped_ptr<IntrinsicProjectionFunctor> intrinsic_projection_;
- };
-
- Here, we made the choice of using ``CENTRAL`` differences to compute
- the jacobian of ``IntrinsicProjection``.
-
- Now, we are ready to construct an automatically differentiated cost
- function as
-
- .. code-block:: c++
-
- CostFunction* cost_function =
- new AutoDiffCostFunction<CameraProjection, 2, 3, 3, 5>(
- new CameraProjection(observations));
-
- ``cost_function`` now seamlessly integrates automatic
- differentiation of ``RotateAndTranslatePoint`` with a numerically
- differentiated version of ``IntrinsicProjection``.
-
-
:class:`CostFunctionToFunctor`
------------------------------
.. class:: CostFunctionToFunctor
- Just like :class:`NumericDiffFunctor` allows numeric
- differentiation to be mixed with automatic differentiation,
- :class:`CostFunctionToFunctor` provides an even more general
- mechanism. :class:`CostFunctionToFunctor` is an adapter class that
- allows users to use :class:`CostFunction` objects in templated
- functors which are to be used for automatic differentiation. This
- allows the user to seamlessly mix analytic, numeric and automatic
+ :class:`CostFunctionToFunctor` is an adapter class that allows
+ users to use :class:`CostFunction` objects in templated functors
+ which are to be used for automatic differentiation. This allows
+ the user to seamlessly mix analytic, numeric and automatic
differentiation.
For example, let us assume that
@@ -704,10 +614,10 @@
.. code-block:: c++
struct CameraProjection {
- CameraProjection(double* observation) {
- intrinsic_projection_.reset(
- new CostFunctionToFunctor<2, 5, 3>(new IntrinsicProjection(observation_)));
+ CameraProjection(double* observation)
+ : intrinsic_projection_(new IntrinsicProjection(observation_)) {
}
+
template <typename T>
bool operator()(const T* rotation,
const T* translation,
@@ -719,14 +629,71 @@
// Note that we call intrinsic_projection_, just like it was
// any other templated functor.
- return (*intrinsic_projection_)(intrinsics, transformed_point, residual);
+ return intrinsic_projection_(intrinsics, transformed_point, residual);
}
private:
- scoped_ptr<CostFunctionToFunctor<2,5,3> > intrinsic_projection_;
+ CostFunctionToFunctor<2,5,3> intrinsic_projection_;
};
+ In the above example, we assumed that ``IntrinsicProjection`` is a
+ ``CostFunction`` capable of evaluating its value and its
+ derivatives. Suppose, if that were not the case and
+ ``IntrinsicProjection`` was defined as follows:
+
+ .. code-block:: c++
+
+ struct IntrinsicProjection
+ IntrinsicProjection(const double* observations) {
+ observations_[0] = observations[0];
+ observations_[1] = observations[1];
+ }
+
+ bool operator()(const double* calibration,
+ const double* point,
+ double* residuals) {
+ double projection[2];
+ ThirdPartyProjectionFunction(calibration, point, projection);
+ residuals[0] = observations_[0] - projection[0];
+ residuals[1] = observations_[1] - projection[1];
+ return true;
+ }
+ double observations_[2];
+ };
+
+
+ Here ``ThirdPartyProjectionFunction`` is some third party library
+ function that we have no control over. So this function can compute
+ its value and we would like to use numeric differentiation to
+ compute its derivatives. In this case we can use a combination of
+ ``NumericDiffCostFunction`` and ``CostFunctionToFunctor`` to get the
+ job done.
+
+ .. code-block:: c++
+
+ struct CameraProjection {
+ CameraProjection(double* observation)
+ intrinsic_projection_(
+ new NumericDiffCostFunction<IntrinsicProjection, CENTRAL, 2, 5, 3>(
+ new IntrinsicProjection(observations)) {
+ }
+
+ template <typename T>
+ bool operator()(const T* rotation,
+ const T* translation,
+ const T* intrinsics,
+ const T* point,
+ T* residuals) const {
+ T transformed_point[3];
+ RotateAndTranslatePoint(rotation, translation, point, transformed_point);
+ return intrinsic_projection_(intrinsics, transformed_point, residual);
+ }
+
+ private:
+ CostFunctionToFunctor<2,5,3> intrinsic_projection_;
+ };
+
:class:`ConditionedCostFunction`
--------------------------------
diff --git a/docs/source/version_history.rst b/docs/source/version_history.rst
index 8853fb7..cbbad65 100644
--- a/docs/source/version_history.rst
+++ b/docs/source/version_history.rst
@@ -16,6 +16,10 @@
Backward Incompatible API Changes
---------------------------------
+#. ``NumericDiffFunctor`` has been removed. It's API was broken, and
+ the implementation was an unnecessary layer of abstraction over
+ ``CostFunctionToFunctor``.
+
#. ``Solver::Options::solver_log`` has been removed. If needed this
iteration callback can easily be implemented in user code.
diff --git a/include/ceres/numeric_diff_functor.h b/include/ceres/numeric_diff_functor.h
deleted file mode 100644
index a29eb97..0000000
--- a/include/ceres/numeric_diff_functor.h
+++ /dev/null
@@ -1,351 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-//
-// A wrapper class that takes a variadic functor evaluating a
-// function, numerically differentiates it and makes it available as a
-// templated functor so that it can be easily used as part of Ceres'
-// automatic differentiation framework.
-//
-// For example:
-//
-// For example, let us assume that
-//
-// struct IntrinsicProjection
-// IntrinsicProjection(const double* observations);
-// bool operator()(const double* calibration,
-// const double* point,
-// double* residuals);
-// };
-//
-// is a functor that implements the projection of a point in its local
-// coordinate system onto its image plane and subtracts it from the
-// observed point projection.
-//
-// Now we would like to compose the action of this functor with the
-// action of camera extrinsics, i.e., rotation and translation, which
-// is given by the following templated function
-//
-// template<typename T>
-// void RotateAndTranslatePoint(const T* rotation,
-// const T* translation,
-// const T* point,
-// T* result);
-//
-// To compose the extrinsics and intrinsics, we can construct a
-// CameraProjection functor as follows.
-//
-// struct CameraProjection {
-// typedef NumericDiffFunctor<IntrinsicProjection, CENTRAL, 2, 5, 3>
-// IntrinsicProjectionFunctor;
-//
-// CameraProjection(double* observation) {
-// intrinsic_projection_.reset(
-// new IntrinsicProjectionFunctor(observation)) {
-// }
-//
-// template <typename T>
-// bool operator()(const T* rotation,
-// const T* translation,
-// const T* intrinsics,
-// const T* point,
-// T* residuals) const {
-// T transformed_point[3];
-// RotateAndTranslatePoint(rotation, translation, point, transformed_point);
-// return (*intrinsic_projection_)(intrinsics, transformed_point, residual);
-// }
-//
-// private:
-// scoped_ptr<IntrinsicProjectionFunctor> intrinsic_projection_;
-// };
-//
-// Here, we made the choice of using CENTRAL differences to compute
-// the jacobian of IntrinsicProjection.
-//
-// Now, we are ready to construct an automatically differentiated cost
-// function as
-//
-// CostFunction* cost_function =
-// new AutoDiffCostFunction<CameraProjection, 2, 3, 3, 5>(
-// new CameraProjection(observations));
-//
-// cost_function now seamlessly integrates automatic differentiation
-// of RotateAndTranslatePoint with a numerically differentiated
-// version of IntrinsicProjection.
-
-#ifndef CERES_PUBLIC_NUMERIC_DIFF_FUNCTOR_H_
-#define CERES_PUBLIC_NUMERIC_DIFF_FUNCTOR_H_
-
-#include "ceres/numeric_diff_cost_function.h"
-#include "ceres/types.h"
-#include "ceres/cost_function_to_functor.h"
-
-namespace ceres {
-
-template<typename Functor,
- NumericDiffMethod kMethod = CENTRAL,
- int kNumResiduals = 0,
- int N0 = 0, int N1 = 0 , int N2 = 0, int N3 = 0, int N4 = 0,
- int N5 = 0, int N6 = 0 , int N7 = 0, int N8 = 0, int N9 = 0>
-class NumericDiffFunctor {
- public:
- // relative_step_size controls the step size used by the numeric
- // differentiation process.
- explicit NumericDiffFunctor(double relative_step_size = 1e-6)
- : functor_(
- new NumericDiffCostFunction<Functor,
- kMethod,
- kNumResiduals,
- N0, N1, N2, N3, N4,
- N5, N6, N7, N8, N9>(new Functor,
- TAKE_OWNERSHIP,
- kNumResiduals,
- relative_step_size)) {
- }
-
- NumericDiffFunctor(Functor* functor, double relative_step_size = 1e-6)
- : functor_(new NumericDiffCostFunction<Functor,
- kMethod,
- kNumResiduals,
- N0, N1, N2, N3, N4,
- N5, N6, N7, N8, N9>(
- functor,
- TAKE_OWNERSHIP,
- kNumResiduals,
- relative_step_size)) {
- }
-
- bool operator()(const double* x0, double* residuals) const {
- return functor_(x0, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- double* residuals) const {
- return functor_(x0, x1, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- double* residuals) const {
- return functor_(x0, x1, x2, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- double* residuals) const {
- return functor_(x0, x1, x2, x3, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- double* residuals) const {
- return functor_(x0, x1, x2, x3, x4, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- double* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- const double* x6,
- double* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, x6, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- const double* x6,
- const double* x7,
- double* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, x6, x7, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- const double* x6,
- const double* x7,
- const double* x8,
- double* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, x6, x7, x8, residuals);
- }
-
- bool operator()(const double* x0,
- const double* x1,
- const double* x2,
- const double* x3,
- const double* x4,
- const double* x5,
- const double* x6,
- const double* x7,
- const double* x8,
- const double* x9,
- double* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0, T* residuals) const {
- return functor_(x0, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- T* residuals) const {
- return functor_(x0, x1, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- const T* x2,
- T* residuals) const {
- return functor_(x0, x1, x2, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- const T* x2,
- const T* x3,
- T* residuals) const {
- return functor_(x0, x1, x2, x3, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- const T* x2,
- const T* x3,
- const T* x4,
- T* residuals) const {
- return functor_(x0, x1, x2, x3, x4, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- const T* x2,
- const T* x3,
- const T* x4,
- const T* x5,
- T* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- const T* x2,
- const T* x3,
- const T* x4,
- const T* x5,
- const T* x6,
- T* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, x6, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- const T* x2,
- const T* x3,
- const T* x4,
- const T* x5,
- const T* x6,
- const T* x7,
- T* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, x6, x7, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- const T* x2,
- const T* x3,
- const T* x4,
- const T* x5,
- const T* x6,
- const T* x7,
- const T* x8,
- T* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, x6, x7, x8, residuals);
- }
-
- template <typename T>
- bool operator()(const T* x0,
- const T* x1,
- const T* x2,
- const T* x3,
- const T* x4,
- const T* x5,
- const T* x6,
- const T* x7,
- const T* x8,
- const T* x9,
- T* residuals) const {
- return functor_(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, residuals);
- }
-
-
- private:
- CostFunctionToFunctor<kNumResiduals,
- N0, N1, N2, N3, N4,
- N5, N6, N7, N8, N9> functor_;
-};
-
-} // namespace ceres
-
-#endif // CERES_PUBLIC_NUMERIC_DIFF_FUNCTOR_H_
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index 85b4906..ec9dee3 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -263,7 +263,6 @@
CERES_TEST(minimizer)
CERES_TEST(normal_prior)
CERES_TEST(numeric_diff_cost_function)
- CERES_TEST(numeric_diff_functor)
CERES_TEST(ordered_groups)
CERES_TEST(parameter_block)
CERES_TEST(parameter_block_ordering)
diff --git a/internal/ceres/numeric_diff_functor_test.cc b/internal/ceres/numeric_diff_functor_test.cc
deleted file mode 100644
index acd7ff9..0000000
--- a/internal/ceres/numeric_diff_functor_test.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2013 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-// used to endorse or promote products derived from this software without
-// specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: sameeragarwal@google.com (Sameer Agarwal)
-
-#include "ceres/numeric_diff_functor.h"
-
-#include <algorithm>
-#include <cmath>
-#include <string>
-#include <vector>
-#include "ceres/autodiff_cost_function.h"
-#include "ceres/internal/scoped_ptr.h"
-#include "ceres/numeric_diff_test_utils.h"
-#include "ceres/test_util.h"
-#include "ceres/types.h"
-#include "glog/logging.h"
-#include "gtest/gtest.h"
-
-namespace ceres {
-namespace internal {
-
-TEST(NumericDiffCostFunction, EasyCaseCentralDifferences) {
- typedef NumericDiffFunctor<EasyFunctor, CENTRAL, 3, 5, 5>
- NumericDiffEasyFunctor;
-
- internal::scoped_ptr<CostFunction> cost_function;
- EasyFunctor functor;
-
- cost_function.reset(
- new AutoDiffCostFunction<NumericDiffEasyFunctor, 3, 5, 5>(
- new NumericDiffEasyFunctor));
-
- functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL);
-
- cost_function.reset(
- new AutoDiffCostFunction<NumericDiffEasyFunctor, 3, 5, 5>(
- new NumericDiffEasyFunctor(new EasyFunctor)));
- functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL);
-}
-
-TEST(NumericDiffCostFunction, EasyCaseForwardDifferences) {
- typedef NumericDiffFunctor<EasyFunctor, FORWARD, 3, 5, 5>
- NumericDiffEasyFunctor;
-
- internal::scoped_ptr<CostFunction> cost_function;
- EasyFunctor functor;
-
- cost_function.reset(
- new AutoDiffCostFunction<NumericDiffEasyFunctor, 3, 5, 5>(
- new NumericDiffEasyFunctor));
-
- functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD);
-
- cost_function.reset(
- new AutoDiffCostFunction<NumericDiffEasyFunctor, 3, 5, 5>(
- new NumericDiffEasyFunctor(new EasyFunctor)));
- functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD);
-}
-
-TEST(NumericDiffCostFunction, TranscendentalCaseCentralDifferences) {
- typedef NumericDiffFunctor<TranscendentalFunctor, CENTRAL, 2, 5, 5>
- NumericDiffTranscendentalFunctor;
-
- internal::scoped_ptr<CostFunction> cost_function;
- TranscendentalFunctor functor;
-
- cost_function.reset(
- new AutoDiffCostFunction<NumericDiffTranscendentalFunctor, 2, 5, 5>(
- new NumericDiffTranscendentalFunctor));
-
- functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL);
-
- cost_function.reset(
- new AutoDiffCostFunction<NumericDiffTranscendentalFunctor, 2, 5, 5>(
- new NumericDiffTranscendentalFunctor(new TranscendentalFunctor)));
- functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, CENTRAL);
-}
-
-TEST(NumericDiffCostFunction, TranscendentalCaseForwardDifferences) {
- typedef NumericDiffFunctor<TranscendentalFunctor, FORWARD, 2, 5, 5>
- NumericDiffTranscendentalFunctor;
-
- internal::scoped_ptr<CostFunction> cost_function;
- TranscendentalFunctor functor;
-
- cost_function.reset(
- new AutoDiffCostFunction<NumericDiffTranscendentalFunctor, 2, 5, 5>(
- new NumericDiffTranscendentalFunctor));
-
- functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD);
-
- cost_function.reset(
- new AutoDiffCostFunction<NumericDiffTranscendentalFunctor, 2, 5, 5>(
- new NumericDiffTranscendentalFunctor(new TranscendentalFunctor)));
- functor.ExpectCostFunctionEvaluationIsNearlyCorrect(*cost_function, FORWARD);
-}
-
-} // namespace internal
-} // namespace ceres