3 #include "algo/ad/util.hpp"
5 namespace algo {
namespace qn {
namespace detail {
7 inline boost::numeric::ublas::vector<double>
9 const std::function<ad::dual<T> (
10 const boost::numeric::ublas::vector<ad::dual<T> >& x)>& f,
11 const boost::numeric::ublas::vector<ad::dual<T>>& x)
13 return f(x).getDerivative();
17 inline boost::numeric::ublas::vector<double>
19 const std::function<ad::dual<T> (
20 const boost::numeric::ublas::vector<ad::dual<T> >& x)>& f,
21 const boost::numeric::ublas::vector<double>& x)
24 typedef ublas::vector<double> infinitesimal_type;
25 typedef ad::dual<infinitesimal_type> dual_type;
27 ublas::vector<dual_type> dualX = ad::make_vector_dual(x);
29 return f(dualX).getDerivative();;
32 inline boost::numeric::ublas::vector<double>
34 const std::function<
double (
35 const boost::numeric::ublas::vector<double>& x)>& f,
36 const boost::numeric::ublas::vector<double>& x)
40 const double delta = 0.01;
41 const std::size_t size = x.size();
42 ublas::vector<double> differential(size);
44 for (std::size_t i = 0; i < size; ++i) {
45 const auto unitVector = ublas::unit_vector<double>(size, i);
46 const auto& shockedVector = unitVector * delta;
48 = (f(x + shockedVector) - f(x - shockedVector)) / (2 * delta);
Definition: ublas_matrix_expression_concept.hpp:5
Definition: ublas_unary_operator.hpp:13