8#include <kernel/analytic/function.hpp> 
   36        static constexpr bool have = 
true;
 
   40        explicit LambdaHelper(F_&& f_) : f(std::forward<F_>(f_)) {}
 
   47      struct LambdaHelper<void>
 
   52        static constexpr bool have = 
false;
 
   88      template<
typename LambdaSet_, 
int dim_, 
typename DT_, 
typename VT_, 
typename GT_, 
bool have_grad_>
 
   89      class LambdaGradHelper
 
   93        LambdaSet_& lambda_set;
 
   95        explicit LambdaGradHelper(LambdaSet_& lambda_set_, DT_, 
int) :
 
   96          lambda_set(lambda_set_)
 
  101        void eval_grad(Tiny::Vector<DT_, 1>& grad, 
const Tiny::Vector<DT_, 1>& p)
 
  103          grad[0] = lambda_set.dx.f(p[0]);
 
  107        void eval_grad(Tiny::Vector<DT_, 2>& grad, 
const Tiny::Vector<DT_, 2>& p)
 
  109          grad[0] = lambda_set.dx.f(p[0], p[1]);
 
  110          grad[1] = lambda_set.dy.f(p[0], p[1]);
 
  114        void eval_grad(Tiny::Vector<DT_, 3>& grad, 
const Tiny::Vector<DT_, 3>& p)
 
  116          grad[0] = lambda_set.dx.f(p[0], p[1], p[2]);
 
  117          grad[1] = lambda_set.dy.f(p[0], p[1], p[2]);
 
  118          grad[2] = lambda_set.dz.f(p[0], p[1], p[2]);
 
  122        void eval_grad(Tiny::Matrix<DT_, 2, 2>& grad, 
const Tiny::Vector<DT_, 2>& p)
 
  124          grad[0][0] = lambda_set.dx1.f(p[0], p[1]);
 
  125          grad[0][1] = lambda_set.dy1.f(p[0], p[1]);
 
  126          grad[1][0] = lambda_set.dx2.f(p[0], p[1]);
 
  127          grad[1][1] = lambda_set.dy2.f(p[0], p[1]);
 
  131        void eval_grad(Tiny::Matrix<DT_, 3, 3>& grad, 
const Tiny::Vector<DT_, 3>& p)
 
  133          grad[0][0] = lambda_set.dx1.f(p[0], p[1], p[2]);
 
  134          grad[0][1] = lambda_set.dy1.f(p[0], p[1], p[2]);
 
  135          grad[0][2] = lambda_set.dz1.f(p[0], p[1], p[2]);
 
  136          grad[1][0] = lambda_set.dx2.f(p[0], p[1], p[2]);
 
  137          grad[1][1] = lambda_set.dy2.f(p[0], p[1], p[2]);
 
  138          grad[1][2] = lambda_set.dz2.f(p[0], p[1], p[2]);
 
  139          grad[2][0] = lambda_set.dx3.f(p[0], p[1], p[2]);
 
  140          grad[2][1] = lambda_set.dy3.f(p[0], p[1], p[2]);
 
  141          grad[2][2] = lambda_set.dz3.f(p[0], p[1], p[2]);
 
  154      template<
typename LambdaSet_, 
int dim_, 
typename DT_, 
typename VT_, 
typename GT_>
 
  155      class LambdaGradHelper<LambdaSet_, dim_, DT_, VT_, GT_, false>
 
  159        LambdaSet_& lambda_set;
 
  163        const std::size_t max_steps;
 
  165        explicit LambdaGradHelper(LambdaSet_& lambda_set_, DT_ initial_h_, 
int max_steps_) :
 
  166          lambda_set(lambda_set_),
 
  167          initial_h(initial_h_),
 
  168          max_steps(std::size_t(max_steps_))
 
  173        void eval_grad(GT_& grad, 
const Tiny::Vector<DT_, dim_>& point)
 
  176          Tiny::Vector<DT_, dim_> v(point);
 
  179          std::vector<GT_> gradex(max_steps);
 
  185          eval_grad_diff_quot(gradex[0], v, h);
 
  188          const std::size_t n(gradex.size()-1);
 
  189          DT_ def(Math::huge<DT_>());
 
  190          for(std::size_t i(0); i < n; ++i)
 
  193            eval_grad_diff_quot(gradex[i+1], v, h *= DT_(0.5));
 
  199            for(std::size_t k(i); k > std::size_t(0); --k)
 
  202              (gradex[k] -= q*gradex[k+1]) *= DT_(1) / (DT_(1) - q);
 
  206            DT_ d = def_norm_sqr(gradex[1], gradex[0]);
 
  218            (gradex[0] -= q*gradex[1]) *= DT_(1) / (DT_(1) - q);
 
  222          grad = gradex.front();
 
  226        template<
int n_, 
int s_>
 
  227        static DT_ def_norm_sqr(
const Tiny::Vector<DT_, n_, s_>& x, 
const Tiny::Vector<DT_, n_, s_>& y)
 
  229          return (x - y).norm_euclid_sqr();
 
  233        template<
int m_, 
int n_, 
int sm_, 
int sn_>
 
  234        static DT_ def_norm_sqr(
 
  235          const Tiny::Matrix<DT_, m_, n_, sm_, sn_>& x,
 
  236          const Tiny::Matrix<DT_, m_, n_, sm_, sn_>& y)
 
  238          return (x - y).norm_hessian_sqr();
 
  242        static void set_diff_quot(Tiny::Vector<DT_, dim_>& x, 
int i, 
const VT_& vr, 
const VT_& vl, 
const DT_ denom)
 
  244          x[i] = denom * (vr - vl);
 
  248        static void set_diff_quot(Tiny::Matrix<DT_, dim_, dim_>& x, 
int i, 
const VT_& vr, 
const VT_& vl, 
const DT_ denom)
 
  250          for(
int k(0); k < dim_; ++k)
 
  251            x[k][i] = denom * (vr[k] - vl[k]);
 
  255        void eval_grad_diff_quot(GT_& x, Tiny::Vector<DT_, dim_>& v, 
const DT_ h)
 
  258          const DT_ denom = DT_(1) / (DT_(2) * h);
 
  262          for(
int i(0); i < dim_; ++i)
 
  269            vr = lambda_set.eval_value(v);
 
  273            vl = lambda_set.eval_value(v);
 
  276            set_diff_quot(x, i, vr, vl, denom);
 
  315      template<
typename LambdaSet_, 
int dim_, 
typename DT_, 
typename VT_, 
typename HT_, 
bool have_hess_>
 
  316      class LambdaHessHelper
 
  320        LambdaSet_& lambda_set;
 
  322        explicit LambdaHessHelper(LambdaSet_& lambda_set_, DT_, 
int) :
 
  323          lambda_set(lambda_set_)
 
  328        void eval_hess(Tiny::Matrix<DT_, 1, 1>& hess, 
const Tiny::Vector<DT_, 1>& p)
 
  330          hess[0][0] = lambda_set.dxx.f(p[0]);
 
  334        void eval_hess(Tiny::Matrix<DT_, 2, 2>& hess, 
const Tiny::Vector<DT_, 2>& p)
 
  336          hess[0][0] = lambda_set.dxx.f(p[0], p[1]);
 
  337          hess[1][1] = lambda_set.dyy.f(p[0], p[1]);
 
  338          hess[0][1] = 
hess[1][0] = lambda_set.dxy.f(p[0], p[1]);
 
  342        void eval_hess(Tiny::Matrix<DT_, 3, 3>& hess, 
const Tiny::Vector<DT_, 3>& p)
 
  344          hess[0][0] = lambda_set.dxx.f(p[0], p[1], p[2]);
 
  345          hess[1][1] = lambda_set.dyy.f(p[0], p[1], p[2]);
 
  346          hess[2][2] = lambda_set.dzz.f(p[0], p[1], p[2]);
 
  347          hess[0][1] = 
hess[1][0] = lambda_set.dxy.f(p[0], p[1], p[2]);
 
  348          hess[1][2] = 
hess[2][1] = lambda_set.dyz.f(p[0], p[1], p[2]);
 
  349          hess[2][0] = 
hess[0][2] = lambda_set.dzx.f(p[0], p[1], p[2]);
 
  353        void eval_hess(Tiny::Tensor3<DT_, 2, 2, 2>& hess, 
const Tiny::Vector<DT_, 2>& p)
 
  355          hess[0][0][0] = lambda_set.dxx1.f(p[0], p[1]);
 
  356          hess[0][1][1] = lambda_set.dyy1.f(p[0], p[1]);
 
  357          hess[0][0][1] = 
hess[0][1][0] = lambda_set.dxy1.f(p[0], p[1]);
 
  358          hess[1][0][0] = lambda_set.dxx2.f(p[0], p[1]);
 
  359          hess[1][1][1] = lambda_set.dyy2.f(p[0], p[1]);
 
  360          hess[1][0][1] = 
hess[1][1][0] = lambda_set.dxy2.f(p[0], p[1]);
 
  364        void eval_hess(Tiny::Tensor3<DT_, 3, 3, 3>& hess, 
const Tiny::Vector<DT_, 3>& p)
 
  366          hess[0][0][0] = lambda_set.dxx1.f(p[0], p[1], p[2]);
 
  367          hess[0][1][1] = lambda_set.dyy1.f(p[0], p[1], p[2]);
 
  368          hess[0][2][2] = lambda_set.dzz1.f(p[0], p[1], p[2]);
 
  369          hess[0][0][1] = 
hess[0][1][0] = lambda_set.dxy1.f(p[0], p[1], p[2]);
 
  370          hess[0][1][2] = 
hess[0][2][1] = lambda_set.dyz1.f(p[0], p[1], p[2]);
 
  371          hess[0][2][0] = 
hess[0][0][2] = lambda_set.dzx1.f(p[0], p[1], p[2]);
 
  372          hess[1][0][0] = lambda_set.dxx2.f(p[0], p[1], p[2]);
 
  373          hess[1][1][1] = lambda_set.dyy2.f(p[0], p[1], p[2]);
 
  374          hess[1][2][2] = lambda_set.dzz2.f(p[0], p[1], p[2]);
 
  375          hess[1][0][1] = 
hess[1][1][0] = lambda_set.dxy2.f(p[0], p[1], p[2]);
 
  376          hess[1][1][2] = 
hess[1][2][1] = lambda_set.dyz2.f(p[0], p[1], p[2]);
 
  377          hess[1][2][0] = 
hess[1][0][2] = lambda_set.dzx2.f(p[0], p[1], p[2]);
 
  378          hess[2][0][0] = lambda_set.dxx3.f(p[0], p[1], p[2]);
 
  379          hess[2][1][1] = lambda_set.dyy3.f(p[0], p[1], p[2]);
 
  380          hess[2][2][2] = lambda_set.dzz3.f(p[0], p[1], p[2]);
 
  381          hess[2][0][1] = 
hess[2][1][0] = lambda_set.dxy3.f(p[0], p[1], p[2]);
 
  382          hess[2][1][2] = 
hess[2][2][1] = lambda_set.dyz3.f(p[0], p[1], p[2]);
 
  383          hess[2][2][0] = 
hess[2][0][2] = lambda_set.dzx3.f(p[0], p[1], p[2]);
 
  396      template<
typename LambdaSet_, 
int dim_, 
typename DT_, 
typename VT_, 
typename HT_>
 
  397      class LambdaHessHelper<LambdaSet_, dim_, DT_, VT_, HT_, false>
 
  400        LambdaSet_& lambda_set;
 
  402        const std::size_t max_steps;
 
  404        explicit LambdaHessHelper(LambdaSet_& lambda_set_, DT_ initial_h_, 
int max_steps_) :
 
  405          lambda_set(lambda_set_),
 
  406          initial_h(initial_h_),
 
  407          max_steps(std::size_t(max_steps_))
 
  411        void eval_hess(HT_& hess, 
const Tiny::Vector<DT_, dim_>& point)
 
  414          Tiny::Vector<DT_, dim_> v(point);
 
  417          std::vector<HT_> hessex(max_steps);
 
  423          eval_hess_diff_quot(hessex[0], v, h);
 
  426          const std::size_t n(hessex.size()-1);
 
  427          DT_ def(Math::huge<DT_>());
 
  428          for(std::size_t i(0); i < n; ++i)
 
  431            eval_hess_diff_quot(hessex[i+1], v, h *= DT_(0.5));
 
  437            for(std::size_t k(i); k > std::size_t(0); --k)
 
  440              (hessex[k] -= q*hessex[k+1]) *= DT_(1) / (DT_(1) - q);
 
  444            DT_ d = def_norm_sqr(hessex[1], hessex[0]);
 
  456            (hessex[0] -= q*hessex[1]) *= DT_(1) / (DT_(1) - q);
 
  460          hess = hessex.front();
 
  464        template<
int m_, 
int n_, 
int sm_, 
int sn_>
 
  465        static DT_ def_norm_sqr(
 
  466          const Tiny::Matrix<DT_, m_, n_, sm_, sn_>& x,
 
  467          const Tiny::Matrix<DT_, m_, n_, sm_, sn_>& y)
 
  469          return (x - y).norm_hessian_sqr();
 
  473        template<
int l_, 
int m_, 
int n_, 
int sl_, 
int sm_, 
int sn_>
 
  474        static DT_ def_norm_sqr(
 
  475          const Tiny::Tensor3<DT_, l_, m_, n_, sl_, sm_, sn_>& x,
 
  476          const Tiny::Tensor3<DT_, l_, m_, n_, sl_, sm_, sn_>& y)
 
  479          for(
int i(0); i < l_; ++i)
 
  481            for(
int j(0); j < m_; ++j)
 
  483              for(
int k(0); k < n_; ++k)
 
  485                r += Math::sqr(x(i,j,k) - y(i,j,k));
 
  493        static void set_diff_quot(Tiny::Matrix<DT_, dim_, dim_>& x, 
int i, 
const VT_& vr, 
const VT_& vl,  
const VT_& vc, 
const DT_ denom)
 
  495          x[i][i] = denom * (vr + vl - DT_(2)*vc);
 
  499        static void set_diff_quot(Tiny::Matrix<DT_, dim_, dim_>& x, 
int i, 
int j, 
const VT_& vne, 
const VT_& vsw, 
const VT_& vnw, 
const VT_& vse, 
const DT_ denom)
 
  501          x[i][j] = x[j][i] = denom * ((vne + vsw) - (vnw + vse));
 
  505        static void set_diff_quot(Tiny::Tensor3<DT_, dim_, dim_, dim_>& x, 
int i, 
const VT_& vr, 
const VT_& vl,  
const VT_& vc, 
const DT_ denom)
 
  507          for(
int k(0); k < dim_; ++k)
 
  508            x[k][i][i] = denom * (vr[k] + vl[k] - DT_(2)*vc[k]);
 
  512        static void set_diff_quot(Tiny::Tensor3<DT_, dim_, dim_, dim_>& x, 
int i, 
int j, 
const VT_& vne, 
const VT_& vsw, 
const VT_& vnw, 
const VT_& vse, 
const DT_ denom)
 
  514          for(
int k(0); k < dim_; ++k)
 
  515            x[k][i][j] = x[k][j][i] = denom * ((vne[k] + vsw[k]) - (vnw[k] + vse[k]));
 
  519        void eval_hess_diff_quot(HT_& x, Tiny::Vector<DT_, dim_>& v, 
const DT_ h)
 
  522          const DT_ denom1 = DT_(1) / (h * h);
 
  523          const DT_ denom2 = DT_(1) / (DT_(4) * h * h);
 
  524          VT_ vc, vr, vl, vne, vnw, vse, vsw;
 
  527          vc = lambda_set.eval_value(v);
 
  530          for(
int i(0); i < dim_; ++i)
 
  537            vr = lambda_set.eval_value(v);
 
  541            vl = lambda_set.eval_value(v);
 
  544            set_diff_quot(x, i, vr, vl, vc, denom1);
 
  547            for(
int j(i+1); j < dim_; ++j)
 
  556              vne = lambda_set.eval_value(v);
 
  561              vnw = lambda_set.eval_value(v);
 
  566              vse = lambda_set.eval_value(v);
 
  571              vsw = lambda_set.eval_value(v);
 
  574              set_diff_quot(x, i, j, vne, vsw, vnw, vse, denom2);
 
  607      template<
typename LambdaSet_, 
typename Traits_, 
bool have_grad, 
bool have_hess>
 
  608      class LambdaFunctionEvaluator :
 
  609        public Analytic::Function::Evaluator<Traits_>
 
  612        static constexpr int domain_dim = Traits_::domain_dim;
 
  613        typedef typename Traits_::DataType DataType;
 
  614        typedef typename Traits_::PointType PointType;
 
  615        typedef typename Traits_::ValueType ValueType;
 
  616        typedef typename Traits_::GradientType GradientType;
 
  617        typedef typename Traits_::HessianType HessianType;
 
  620        LambdaSet_ lambda_set;
 
  623        Intern::LambdaGradHelper<LambdaSet_, domain_dim, DataType, ValueType, GradientType, have_grad> grad_helper;
 
  626        Intern::LambdaHessHelper<LambdaSet_, domain_dim, DataType, ValueType, HessianType, have_hess> hess_helper;
 
  629        template<
typename LambdaFunction_>
 
  630        explicit LambdaFunctionEvaluator(
const LambdaFunction_& function) :
 
  631          lambda_set(function.lambda_set),
 
  632          grad_helper(lambda_set, DataType(function.initial_h_grad), function.max_steps_grad),
 
  633          hess_helper(lambda_set, DataType(function.initial_h_hess), function.max_steps_hess)
 
  638        ValueType 
value(
const PointType& point)
 
  640          return lambda_set.eval_value(point);
 
  644        GradientType gradient(
const PointType& point)
 
  647          grad_helper.eval_grad(grad, point);
 
  652        HessianType hessian(
const PointType& point)
 
  655          hess_helper.eval_hess(hess, point);
 
  672    template<
typename LambdaValue_, 
typename LambdaDx_ = 
void, 
typename LambdaDxx_ = 
void>
 
  683      static constexpr bool have_value =  Intern::LambdaHelper<LambdaValue_>::have;
 
  685      static constexpr bool have_grad = Intern::LambdaHelper<LambdaDx_>::have;
 
  687      static constexpr bool have_hess = Intern::LambdaHelper<LambdaDxx_>::have;
 
  690      static_assert(
have_value, 
"LambdaScalarFunction1D needs at least the function value formula");
 
  710        Intern::LambdaHelper<LambdaValue_> 
value;
 
  712        Intern::LambdaHelper<LambdaDx_> 
dx;
 
  714        Intern::LambdaHelper<LambdaDxx_> 
dxx;
 
  716        const Intern::LambdaHelper<void> 
dy;
 
  718        const Intern::LambdaHelper<void> 
dz;
 
  720        const Intern::LambdaHelper<void> 
dyy;
 
  722        const Intern::LambdaHelper<void> 
dzz;
 
  724        const Intern::LambdaHelper<void> 
dxy;
 
  726        const Intern::LambdaHelper<void> 
dyz;
 
  728        const Intern::LambdaHelper<void> 
dzx;
 
  732          value(std::forward<LambdaValue_>(value_))
 
  737        template<
typename LDx_>
 
  739          value(std::forward<LambdaValue_>(value_)),
 
  740          dx(std::forward<LDx_>(dx_))
 
  745        template<
typename LDx_, 
typename LDxx_>
 
  746        explicit LambdaSet(LambdaValue_&& value_, LDx_&& dx_, LDxx_&& dxx_) :
 
  747          value(std::forward<LambdaValue_>(value_)),
 
  748          dx(std::forward<LDx_>(dx_)),
 
  749          dxx(std::forward<LDxx_>(dxx_))
 
  754        template<
typename DT_>
 
  757          return value.f(v[0]);
 
  765      template<
typename Traits_>
 
  766      using Evaluator = Intern::LambdaFunctionEvaluator<LambdaSet, Traits_, have_grad, have_hess>;
 
  783      template<
typename... Lambdas_>
 
  785        lambda_set(std::forward<Lambdas_>(lambdas)...)
 
  801    template<
typename LambdaValue_>
 
  821    template<
typename LambdaValue_, 
typename LambdaDx_>
 
  825        std::forward<LambdaValue_>(
value), std::forward<LambdaDx_>(dx));
 
  845    template<
typename LambdaValue_, 
typename LambdaDx_, 
typename LambdaDxx_>
 
  847      LambdaValue_&& 
value, LambdaDx_&& dx, LambdaDxx_&& dxx)
 
  850        std::forward<LambdaValue_>(
value), std::forward<LambdaDx_>(dx), std::forward<LambdaDxx_>(dxx));
 
  863    template<
typename LambdaValue_,
 
  864      typename LambdaDx_ = void, 
typename LambdaDy_ = void,
 
  865      typename LambdaDxx_ = void, 
typename LambdaDyy_ = void, 
typename LambdaDxy_ = 
void>
 
  876      static constexpr bool have_value =  Intern::LambdaHelper<LambdaValue_>::have;
 
  879        Intern::LambdaHelper<LambdaDx_>::have &&
 
  880        Intern::LambdaHelper<LambdaDy_>::have;
 
  883        Intern::LambdaHelper<LambdaDxx_>::have &&
 
  884        Intern::LambdaHelper<LambdaDyy_>::have &&
 
  885        Intern::LambdaHelper<LambdaDxy_>::have;
 
  888      static_assert(
have_value, 
"LambdaScalarFunction2D needs at least the function value formula");
 
  908        Intern::LambdaHelper<LambdaValue_> 
value;
 
  910        Intern::LambdaHelper<LambdaDx_> 
dx;
 
  912        Intern::LambdaHelper<LambdaDy_> 
dy;
 
  914        Intern::LambdaHelper<LambdaDxx_> 
dxx;
 
  916        Intern::LambdaHelper<LambdaDyy_> 
dyy;
 
  918        Intern::LambdaHelper<LambdaDxy_> 
dxy;
 
  920        const Intern::LambdaHelper<void> 
dz;
 
  922        const Intern::LambdaHelper<void> 
dzz;
 
  924        const Intern::LambdaHelper<void> 
dyz;
 
  926        const Intern::LambdaHelper<void> 
dzx;
 
  930          value(std::forward<LambdaValue_>(value_))
 
  935        template<
typename LDx_, 
typename LDy_>
 
  936        explicit LambdaSet(LambdaValue_&& value_, LDx_&& dx_, LDy_&& dy_) :
 
  937          value(std::forward<LambdaValue_>(value_)),
 
  938          dx(std::forward<LDx_>(dx_)),
 
  939          dy(std::forward<LDy_>(dy_))
 
  944        template<
typename LDx_, 
typename LDy_, 
typename LDxx_, 
typename LDyy_, 
typename LDxy_>
 
  945        explicit LambdaSet(LambdaValue_&& value_, LDx_&& dx_, LDy_&& dy_, LDxx_&& dxx_, LDyy_&& dyy_, LDxy_&& dxy_) :
 
  946          value(std::forward<LambdaValue_>(value_)),
 
  947          dx(std::forward<LDx_>(dx_)),
 
  948          dy(std::forward<LDy_>(dy_)),
 
  949          dxx(std::forward<LDxx_>(dxx_)),
 
  950          dyy(std::forward<LDyy_>(dyy_)),
 
  951          dxy(std::forward<LDxy_>(dxy_))
 
  956        template<
typename DT_>
 
  959          return value.f(v[0], v[1]);
 
  967      template<
typename Traits_>
 
  968      using Evaluator = Intern::LambdaFunctionEvaluator<LambdaSet, Traits_, have_grad, have_hess>;
 
  985      template<
typename... Lambdas_>
 
  987        lambda_set(std::forward<Lambdas_>(lambdas)...)
 
 1003    template<
typename LambdaValue_>
 
 1023    template<
typename LambdaValue_, 
typename LambdaDx_, 
typename LambdaDy_>
 
 1025      LambdaValue_&& 
value, LambdaDx_&& dx, LambdaDy_&& dy)
 
 1028        std::forward<LambdaValue_>(
value), std::forward<LambdaDx_>(dx), std::forward<LambdaDy_>(dy));
 
 1048    template<
typename LambdaValue_, 
typename LambdaDx_, 
typename LambdaDy_,
 
 1049      typename LambdaDxx_, 
typename LambdaDyy_, 
typename LambdaDxy_>
 
 1051      LambdaValue_&& 
value, LambdaDx_&& dx, LambdaDy_&& dy, LambdaDxx_&& dxx, LambdaDyy_&& dyy, LambdaDxy_&& dxy)
 
 1054        std::forward<LambdaValue_>(
value), std::forward<LambdaDx_>(dx), std::forward<LambdaDy_>(dy),
 
 1055        std::forward<LambdaDxx_>(dxx), std::forward<LambdaDyy_>(dyy),std::forward<LambdaDxy_>(dxy));
 
 1068    template<
typename LambdaValue_,
 
 1069      typename LambdaDx_ = void, 
typename LambdaDy_ = void, 
typename LambdaDz_ = void,
 
 1070      typename LambdaDxx_ = void, 
typename LambdaDyy_ = void, 
typename LambdaDzz_ = void,
 
 1071      typename LambdaDxy_ = void, 
typename LambdaDyz_ = void, 
typename LambdaDzx_ = 
void>
 
 1082      static constexpr bool have_value =  Intern::LambdaHelper<LambdaValue_>::have;
 
 1085        Intern::LambdaHelper<LambdaDx_>::have &&
 
 1086        Intern::LambdaHelper<LambdaDy_>::have &&
 
 1087        Intern::LambdaHelper<LambdaDz_>::have;
 
 1090        Intern::LambdaHelper<LambdaDxx_>::have &&
 
 1091        Intern::LambdaHelper<LambdaDyy_>::have &&
 
 1092        Intern::LambdaHelper<LambdaDzz_>::have &&
 
 1093        Intern::LambdaHelper<LambdaDxy_>::have &&
 
 1094        Intern::LambdaHelper<LambdaDyz_>::have &&
 
 1095        Intern::LambdaHelper<LambdaDzx_>::have;
 
 1098      static_assert(
have_value, 
"LambdaScalarFunction3D needs at least the function value formula");
 
 1118        Intern::LambdaHelper<LambdaValue_> 
value;
 
 1120        Intern::LambdaHelper<LambdaDx_> 
dx;
 
 1122        Intern::LambdaHelper<LambdaDy_> 
dy;
 
 1124        Intern::LambdaHelper<LambdaDz_> 
dz;
 
 1126        Intern::LambdaHelper<LambdaDxx_> 
dxx;
 
 1128        Intern::LambdaHelper<LambdaDyy_> 
dyy;
 
 1130        Intern::LambdaHelper<LambdaDzz_> 
dzz;
 
 1132        Intern::LambdaHelper<LambdaDxy_> 
dxy;
 
 1134        Intern::LambdaHelper<LambdaDyz_> 
dyz;
 
 1136        Intern::LambdaHelper<LambdaDzx_> 
dzx;
 
 1140          value(std::forward<LambdaValue_>(value_))
 
 1145        template<
typename LDx_, 
typename LDy_, 
typename LDz_>
 
 1146        explicit LambdaSet(LambdaValue_&& value_, LDx_&& dx_, LDy_&& dy_, LDz_&& dz_) :
 
 1147          value(std::forward<LambdaValue_>(value_)),
 
 1148          dx(std::forward<LDx_>(dx_)),
 
 1149          dy(std::forward<LDy_>(dy_)),
 
 1150          dz(std::forward<LDz_>(dz_))
 
 1155        template<
typename LDx_, 
typename LDy_, 
typename LDz_,
 
 1156          typename LDxx_, 
typename LDyy_, 
typename LDzz_, 
typename LDxy_, 
typename LDyz_, 
typename LDzx_>
 
 1157        explicit LambdaSet(LambdaValue_&& value_, LDx_&& dx_, LDy_&& dy_, LDz_&& dz_,
 
 1158          LDxx_&& dxx_, LDyy_&& dyy_, LDzz_&& dzz_, LDxy_&& dxy_, LDyz_&& dyz_, LDzx_&& dzx_) :
 
 1159          value(std::forward<LambdaValue_>(value_)),
 
 1160          dx(std::forward<LDx_>(dx_)),
 
 1161          dy(std::forward<LDy_>(dy_)),
 
 1162          dz(std::forward<LDz_>(dz_)),
 
 1163          dxx(std::forward<LDxx_>(dxx_)),
 
 1164          dyy(std::forward<LDyy_>(dyy_)),
 
 1165          dzz(std::forward<LDzz_>(dzz_)),
 
 1166          dxy(std::forward<LDxy_>(dxy_)),
 
 1167          dyz(std::forward<LDyz_>(dyz_)),
 
 1168          dzx(std::forward<LDzx_>(dzx_))
 
 1173        template<
typename DT_>
 
 1176          return value.f(v[0], v[1], v[2]);
 
 1184      template<
typename Traits_>
 
 1185      using Evaluator = Intern::LambdaFunctionEvaluator<LambdaSet, Traits_, have_grad, have_hess>;
 
 1202      template<
typename... Lambdas_>
 
 1204        lambda_set(std::forward<Lambdas_>(lambdas)...)
 
 1220    template<
typename LambdaValue_>
 
 1240    template<
typename LambdaValue_, 
typename LambdaDx_, 
typename LambdaDy_, 
typename LambdaDz_>
 
 1242      LambdaValue_&& 
value, LambdaDx_&& dx, LambdaDy_&& dy, LambdaDz_&& dz)
 
 1245        std::forward<LambdaValue_>(
value), std::forward<LambdaDx_>(dx), std::forward<LambdaDy_>(dy), std::forward<LambdaDz_>(dz));
 
 1265    template<
typename LambdaValue_, 
typename LambdaDx_, 
typename LambdaDy_, 
typename LambdaDz_,
 
 1266      typename LambdaDxx_, 
typename LambdaDyy_, 
typename LambdaDzz_,
 
 1267      typename LambdaDxy_, 
typename LambdaDyz_, 
typename LambdaDzx_>
 
 1268    LambdaScalarFunction3D<LambdaValue_, LambdaDx_, LambdaDy_, LambdaDz_,
 
 1270      LambdaValue_&& 
value, LambdaDx_&& dx, LambdaDy_&& dy, LambdaDz_&& dz,
 
 1271      LambdaDxx_&& dxx, LambdaDyy_&& dyy, LambdaDzz_&& dzz, LambdaDxy_&& dxy, LambdaDyz_&& dyz, LambdaDzx_&& dzx)
 
 1274        LambdaDxx_, LambdaDyy_, LambdaDzz_, LambdaDxy_, LambdaDyz_, LambdaDzx_>(
 
 1275        std::forward<LambdaValue_>(
value), std::forward<LambdaDx_>(dx), std::forward<LambdaDy_>(dy), std::forward<LambdaDz_>(dz),
 
 1276        std::forward<LambdaDxx_>(dxx), std::forward<LambdaDyy_>(dyy), std::forward<LambdaDzz_>(dzz),
 
 1277        std::forward<LambdaDxy_>(dxy), std::forward<LambdaDyz_>(dyz), std::forward<LambdaDzx_>(dzx));
 
 1292    template<
typename Callable_>
 
 1300      typedef typename std::invoke_result_t<Callable_, Tiny::Vector<double,domain_dim>>::DataType CallableInnerType;
 
 1309      Callable_ call_func;
 
 1312       call_func(std::move(call_func_))
 
 1317       call_func(call_func_)
 
 1321      template<
typename EvalTraits_>
 
 1333        typedef typename SimplifiedLambdaVectorFunction2D::CallableInnerType InnerType;
 
 1337        Callable_ call_func;
 
 1341          call_func(function.call_func)
 
 1368    template<
typename Callable_>
 
 1384      Callable_ call_func;
 
 1387       call_func(std::move(call_func_))
 
 1392       call_func(call_func_)
 
 1396      template<
typename EvalTraits_>
 
 1415        Callable_ call_func;
 
 1419          call_func(function.call_func)
 
 1427          return call_func(point);
 
 1442    template<
typename LambdaValue1_, 
typename LambdaValue2_,
 
 1443      typename LambdaDx1_ = void, 
typename LambdaDx2_ = void,
 
 1444      typename LambdaDy1_ = void, 
typename LambdaDy2_ = void,
 
 1445      typename LambdaDxx1_ = void, 
typename LambdaDxx2_ = void,
 
 1446      typename LambdaDyy1_ = void, 
typename LambdaDyy2_ = void,
 
 1447      typename LambdaDxy1_ = void, 
typename LambdaDxy2_ = 
void>
 
 1459        Intern::LambdaHelper<LambdaValue1_>::have &&
 
 1460        Intern::LambdaHelper<LambdaValue2_>::have;
 
 1463        Intern::LambdaHelper<LambdaDx1_>::have &&
 
 1464        Intern::LambdaHelper<LambdaDx2_>::have &&
 
 1465        Intern::LambdaHelper<LambdaDy1_>::have &&
 
 1466        Intern::LambdaHelper<LambdaDy2_>::have;
 
 1469        Intern::LambdaHelper<LambdaDxx1_>::have &&
 
 1470        Intern::LambdaHelper<LambdaDxx2_>::have &&
 
 1471        Intern::LambdaHelper<LambdaDyy1_>::have &&
 
 1472        Intern::LambdaHelper<LambdaDyy2_>::have &&
 
 1473        Intern::LambdaHelper<LambdaDxy1_>::have &&
 
 1474        Intern::LambdaHelper<LambdaDxy2_>::have;
 
 1477      static_assert(
have_value, 
"LambdaVectorFunction2D needs at least the function value formula");
 
 1498        Intern::LambdaHelper<LambdaValue2_> value2;
 
 1499        Intern::LambdaHelper<void> value3;
 
 1501        Intern::LambdaHelper<LambdaDx1_> 
dx1;
 
 1502        Intern::LambdaHelper<LambdaDx2_> dx2;
 
 1503        Intern::LambdaHelper<void> dx3;
 
 1505        Intern::LambdaHelper<LambdaDy1_> 
dy1;
 
 1506        Intern::LambdaHelper<LambdaDy2_> dy2;
 
 1507        Intern::LambdaHelper<void> dy3;
 
 1509        Intern::LambdaHelper<void> 
dz1;
 
 1510        Intern::LambdaHelper<void> dz2;
 
 1511        Intern::LambdaHelper<void> dz3;
 
 1513        Intern::LambdaHelper<LambdaDxx1_> 
dxx1;
 
 1514        Intern::LambdaHelper<LambdaDxx2_> dxx2;
 
 1515        Intern::LambdaHelper<void> dxx3;
 
 1517        Intern::LambdaHelper<LambdaDyy1_> 
dyy1;
 
 1518        Intern::LambdaHelper<LambdaDyy2_> dyy2;
 
 1519        Intern::LambdaHelper<void> dyy3;
 
 1522        Intern::LambdaHelper<void> dzz2;
 
 1523        Intern::LambdaHelper<void> dzz3;
 
 1525        Intern::LambdaHelper<LambdaDxy1_> 
dxy1;
 
 1526        Intern::LambdaHelper<LambdaDxy2_> dxy2;
 
 1527        Intern::LambdaHelper<void> dxy3;
 
 1530        Intern::LambdaHelper<void> dyz2;
 
 1531        Intern::LambdaHelper<void> dyz3;
 
 1534        Intern::LambdaHelper<void> dzx2;
 
 1535        Intern::LambdaHelper<void> dzx3;
 
 1538        explicit LambdaSet(LambdaValue1_&& value1_, LambdaValue2_&& value2_) :
 
 1539          value1(std::forward<LambdaValue1_>(value1_)),
 
 1540          value2(std::forward<LambdaValue2_>(value2_))
 
 1546          typename LDx1_, 
typename LDx2_,
 
 1547          typename LDy1_, 
typename LDy2_>
 
 1548        explicit LambdaSet(LambdaValue1_&& value1_, LambdaValue2_&& value2_,
 
 1549          LDx1_&& dx1_, LDx2_&& dx2_, LDy1_&& dy1_, LDy2_&& dy2_) :
 
 1550          value1(std::forward<LambdaValue1_>(value1_)),
 
 1551          value2(std::forward<LambdaValue2_>(value2_)),
 
 1552          dx1(std::forward<LDx1_>(dx1_)), dx2(std::forward<LDx2_>(dx2_)),
 
 1553          dy1(std::forward<LDy1_>(dy1_)), dy2(std::forward<LDy2_>(dy2_))
 
 1559          typename LDx1_, 
typename LDx2_,
 
 1560          typename LDy1_, 
typename LDy2_,
 
 1561          typename LDxx1_, 
typename LDxx2_,
 
 1562          typename LDyy1_, 
typename LDyy2_,
 
 1563          typename LDxy1_, 
typename LDxy2_>
 
 1564        explicit LambdaSet(LambdaValue1_&& value1_, LambdaValue2_&& value2_,
 
 1565          LDx1_&& dx1_, LDx2_&& dx2_,
 
 1566          LDy1_&& dy1_, LDy2_&& dy2_,
 
 1567          LDxx1_&& dxx1_, LDxx2_&& dxx2_,
 
 1568          LDyy1_&& dyy1_, LDyy2_&& dyy2_,
 
 1569          LDxy1_&& dxy1_, LDxy2_&& dxy2_) :
 
 1570          value1(std::forward<LambdaValue1_>(value1_)),
 
 1571          value2(std::forward<LambdaValue2_>(value2_)),
 
 1572          dx1(std::forward<LDx1_>(dx1_)), dx2(std::forward<LDx2_>(dx2_)),
 
 1573          dy1(std::forward<LDy1_>(dy1_)), dy2(std::forward<LDy2_>(dy2_)),
 
 1574          dxx1(std::forward<LDxx1_>(dxx1_)), dxx2(std::forward<LDxx2_>(dxx2_)),
 
 1575          dyy1(std::forward<LDyy1_>(dyy1_)), dyy2(std::forward<LDyy2_>(dyy2_)),
 
 1576          dxy1(std::forward<LDxy1_>(dxy1_)), dxy2(std::forward<LDxy2_>(dxy2_))
 
 1581        template<
typename DT_>
 
 1592      template<
typename Traits_>
 
 1593      using Evaluator = Intern::LambdaFunctionEvaluator<LambdaSet, Traits_, have_grad, have_hess>;
 
 1610      template<
typename... Lambdas_>
 
 1612        lambda_set(std::forward<Lambdas_>(lambdas)...)
 
 1628    template<
typename LambdaValue1_, 
typename LambdaValue2_>
 
 1629    LambdaVectorFunction2D<LambdaValue1_, LambdaValue2_>
 
 1633        std::forward<LambdaValue1_>(value1), std::forward<LambdaValue2_>(value2));
 
 1650    template<
typename LambdaValue1_, 
typename LambdaValue2_,
 
 1651      typename LambdaDx1_, 
typename LambdaDx2_, 
typename LambdaDy1_, 
typename LambdaDy2_>
 
 1652    LambdaVectorFunction2D<LambdaValue1_, LambdaValue2_, LambdaDx1_, LambdaDx2_, LambdaDy1_, LambdaDy2_>
 
 1654        LambdaDx1_&& dx1, LambdaDx2_&& dx2, LambdaDy1_&& dy1, LambdaDy2_&& dy2)
 
 1657        LambdaDx1_, LambdaDx2_, LambdaDy1_, LambdaDy2_>(
 
 1658          std::forward<LambdaValue1_>(value1), std::forward<LambdaValue2_>(value2),
 
 1659          std::forward<LambdaDx1_>(dx1), std::forward<LambdaDx2_>(dx2),
 
 1660          std::forward<LambdaDy1_>(dy1), std::forward<LambdaDy2_>(dy2));
 
 1680    template<
typename LambdaValue1_, 
typename LambdaValue2_,
 
 1681      typename LambdaDx1_, 
typename LambdaDx2_,
 
 1682      typename LambdaDy1_, 
typename LambdaDy2_,
 
 1683      typename LambdaDxx1_, 
typename LambdaDxx2_,
 
 1684      typename LambdaDyy1_, 
typename LambdaDyy2_,
 
 1685      typename LambdaDxy1_, 
typename LambdaDxy2_>
 
 1686    LambdaVectorFunction2D<LambdaValue1_, LambdaValue2_, LambdaDx1_, LambdaDx2_, LambdaDy1_, LambdaDy2_,
 
 1687      LambdaDxx1_, LambdaDxx2_, LambdaDyy1_, LambdaDyy2_, LambdaDxy1_, LambdaDxy2_>
 
 1689        LambdaDx1_&& dx1, LambdaDx2_&& dx2, LambdaDy1_&& dy1, LambdaDy2_&& dy2,
 
 1690        LambdaDxx1_&& dxx1, LambdaDxx2_&& dxx2,
 
 1691        LambdaDyy1_&& dyy1, LambdaDyy2_&& dyy2,
 
 1692        LambdaDxy1_&& dxy1, LambdaDxy2_&& dxy2)
 
 1694      return LambdaVectorFunction2D<LambdaValue1_, LambdaValue2_, LambdaDx1_, LambdaDx2_, LambdaDy1_, LambdaDy2_,
 
 1695        LambdaDxx1_, LambdaDxx2_, LambdaDyy1_, LambdaDyy2_, LambdaDxy1_, LambdaDxy2_>(
 
 1696          std::forward<LambdaValue1_>(value1), std::forward<LambdaValue2_>(value2),
 
 1697          std::forward<LambdaDx1_>(dx1), std::forward<LambdaDx2_>(dx2),
 
 1698          std::forward<LambdaDy1_>(dy1), std::forward<LambdaDy2_>(dy2),
 
 1699          std::forward<LambdaDxx1_>(dxx1), std::forward<LambdaDxx2_>(dxx2),
 
 1700          std::forward<LambdaDyy1_>(dyy1), std::forward<LambdaDyy2_>(dyy2),
 
 1701          std::forward<LambdaDxy1_>(dxy1), std::forward<LambdaDxy2_>(dxy2));
 
 1714    template<
typename LambdaValue1_,
typename LambdaValue2_,
typename LambdaValue3_,
 
 1715      typename LambdaDx1_ = void, 
typename LambdaDx2_ = void, 
typename LambdaDx3_ = void,
 
 1716      typename LambdaDy1_ = void, 
typename LambdaDy2_ = void, 
typename LambdaDy3_ = void,
 
 1717      typename LambdaDz1_ = void, 
typename LambdaDz2_ = void, 
typename LambdaDz3_ = void,
 
 1718      typename LambdaDxx1_ = void, 
typename LambdaDxx2_ = void, 
typename LambdaDxx3_ = void,
 
 1719      typename LambdaDyy1_ = void, 
typename LambdaDyy2_ = void, 
typename LambdaDyy3_ = void,
 
 1720      typename LambdaDzz1_ = void, 
typename LambdaDzz2_ = void, 
typename LambdaDzz3_ = void,
 
 1721      typename LambdaDxy1_ = void, 
typename LambdaDxy2_ = void, 
typename LambdaDxy3_ = void,
 
 1722      typename LambdaDyz1_ = void, 
typename LambdaDyz2_ = void, 
typename LambdaDyz3_ = void,
 
 1723      typename LambdaDzx1_ = void, 
typename LambdaDzx2_ = void, 
typename LambdaDzx3_ = 
void 
 1736        Intern::LambdaHelper<LambdaValue1_>::have &&
 
 1737        Intern::LambdaHelper<LambdaValue2_>::have &&
 
 1738        Intern::LambdaHelper<LambdaValue3_>::have;
 
 1741        Intern::LambdaHelper<LambdaDx1_>::have &&
 
 1742        Intern::LambdaHelper<LambdaDx2_>::have &&
 
 1743        Intern::LambdaHelper<LambdaDx3_>::have &&
 
 1744        Intern::LambdaHelper<LambdaDy1_>::have &&
 
 1745        Intern::LambdaHelper<LambdaDy2_>::have &&
 
 1746        Intern::LambdaHelper<LambdaDy3_>::have &&
 
 1747        Intern::LambdaHelper<LambdaDz1_>::have &&
 
 1748        Intern::LambdaHelper<LambdaDz2_>::have &&
 
 1749        Intern::LambdaHelper<LambdaDz3_>::have;
 
 1752        Intern::LambdaHelper<LambdaDxx1_>::have &&
 
 1753        Intern::LambdaHelper<LambdaDxx2_>::have &&
 
 1754        Intern::LambdaHelper<LambdaDxx3_>::have &&
 
 1755        Intern::LambdaHelper<LambdaDyy1_>::have &&
 
 1756        Intern::LambdaHelper<LambdaDyy2_>::have &&
 
 1757        Intern::LambdaHelper<LambdaDyy3_>::have &&
 
 1758        Intern::LambdaHelper<LambdaDzz1_>::have &&
 
 1759        Intern::LambdaHelper<LambdaDzz2_>::have &&
 
 1760        Intern::LambdaHelper<LambdaDzz3_>::have &&
 
 1761        Intern::LambdaHelper<LambdaDxy1_>::have &&
 
 1762        Intern::LambdaHelper<LambdaDxy2_>::have &&
 
 1763        Intern::LambdaHelper<LambdaDxy3_>::have &&
 
 1764        Intern::LambdaHelper<LambdaDyz1_>::have &&
 
 1765        Intern::LambdaHelper<LambdaDyz2_>::have &&
 
 1766        Intern::LambdaHelper<LambdaDyz3_>::have &&
 
 1767        Intern::LambdaHelper<LambdaDzx1_>::have &&
 
 1768        Intern::LambdaHelper<LambdaDzx2_>::have &&
 
 1769        Intern::LambdaHelper<LambdaDzx3_>::have;
 
 1772      static_assert(
have_value, 
"LambdaVectorFunction3D needs at least the function value formula");
 
 1793        Intern::LambdaHelper<LambdaValue2_> value2;
 
 1794        Intern::LambdaHelper<LambdaValue3_> value3;
 
 1796        Intern::LambdaHelper<LambdaDx1_> 
dx1;
 
 1797        Intern::LambdaHelper<LambdaDx2_> dx2;
 
 1798        Intern::LambdaHelper<LambdaDx3_> dx3;
 
 1800        Intern::LambdaHelper<LambdaDy1_> 
dy1;
 
 1801        Intern::LambdaHelper<LambdaDy2_> dy2;
 
 1802        Intern::LambdaHelper<LambdaDy3_> dy3;
 
 1804        Intern::LambdaHelper<LambdaDz1_> 
dz1;
 
 1805        Intern::LambdaHelper<LambdaDz2_> dz2;
 
 1806        Intern::LambdaHelper<LambdaDz3_> dz3;
 
 1808        Intern::LambdaHelper<LambdaDxx1_> 
dxx1;
 
 1809        Intern::LambdaHelper<LambdaDxx2_> dxx2;
 
 1810        Intern::LambdaHelper<LambdaDxx3_> dxx3;
 
 1812        Intern::LambdaHelper<LambdaDyy1_> 
dyy1;
 
 1813        Intern::LambdaHelper<LambdaDyy2_> dyy2;
 
 1814        Intern::LambdaHelper<LambdaDyy3_> dyy3;
 
 1816        Intern::LambdaHelper<LambdaDzz1_> 
dzz1;
 
 1817        Intern::LambdaHelper<LambdaDzz2_> dzz2;
 
 1818        Intern::LambdaHelper<LambdaDzz3_> dzz3;
 
 1820        Intern::LambdaHelper<LambdaDxy1_> 
dxy1;
 
 1821        Intern::LambdaHelper<LambdaDxy2_> dxy2;
 
 1822        Intern::LambdaHelper<LambdaDxy3_> dxy3;
 
 1824        Intern::LambdaHelper<LambdaDyz1_> 
dyz1;
 
 1825        Intern::LambdaHelper<LambdaDyz2_> dyz2;
 
 1826        Intern::LambdaHelper<LambdaDyz3_> dyz3;
 
 1828        Intern::LambdaHelper<LambdaDzx1_> 
dzx1;
 
 1829        Intern::LambdaHelper<LambdaDzx2_> dzx2;
 
 1830        Intern::LambdaHelper<LambdaDzx3_> dzx3;
 
 1833        explicit LambdaSet(LambdaValue1_&& value1_, LambdaValue2_&& value2_, LambdaValue3_&& value3_) :
 
 1834          value1(std::forward<LambdaValue1_>(value1_)),
 
 1835          value2(std::forward<LambdaValue2_>(value2_)),
 
 1836          value3(std::forward<LambdaValue3_>(value3_))
 
 1842          typename LDx1_, 
typename LDx2_, 
typename LDx3_,
 
 1843          typename LDy1_, 
typename LDy2_, 
typename LDy3_,
 
 1844          typename LDz1_, 
typename LDz2_, 
typename LDz3_>
 
 1845        explicit LambdaSet(LambdaValue1_&& value1_, LambdaValue2_&& value2_, LambdaValue3_&& value3_,
 
 1846          LDx1_&& dx1_, LDx2_&& dx2_, LDx3_&& dx3_,
 
 1847          LDy1_&& dy1_, LDy2_&& dy2_, LDy3_&& dy3_,
 
 1848          LDz1_&& dz1_, LDz2_&& dz2_, LDz3_&& dz3_) :
 
 1849          value1(std::forward<LambdaValue1_>(value1_)),
 
 1850          value2(std::forward<LambdaValue2_>(value2_)),
 
 1851          value3(std::forward<LambdaValue3_>(value3_)),
 
 1852          dx1(std::forward<LDx1_>(dx1_)), dx2(std::forward<LDx2_>(dx2_)), dx3(std::forward<LDx3_>(dx3_)),
 
 1853          dy1(std::forward<LDy1_>(dy1_)), dy2(std::forward<LDy2_>(dy2_)), dy3(std::forward<LDy3_>(dy3_)),
 
 1854          dz1(std::forward<LDz1_>(dz1_)), dz2(std::forward<LDz2_>(dz2_)), dz3(std::forward<LDz3_>(dz3_))
 
 1860          typename LDx1_, 
typename LDx2_, 
typename LDx3_,
 
 1861          typename LDy1_, 
typename LDy2_, 
typename LDy3_,
 
 1862          typename LDz1_, 
typename LDz2_, 
typename LDz3_,
 
 1863          typename LDxx1_, 
typename LDxx2_, 
typename LDxx3_,
 
 1864          typename LDyy1_, 
typename LDyy2_, 
typename LDyy3_,
 
 1865          typename LDzz1_, 
typename LDzz2_, 
typename LDzz3_,
 
 1866          typename LDxy1_, 
typename LDxy2_, 
typename LDxy3_,
 
 1867          typename LDyz1_, 
typename LDyz2_, 
typename LDyz3_,
 
 1868          typename LDzx1_, 
typename LDzx2_, 
typename LDzx3_>
 
 1869        explicit LambdaSet(LambdaValue1_&& value1_, LambdaValue2_&& value2_, LambdaValue3_&& value3_,
 
 1870          LDx1_&& dx1_, LDx2_&& dx2_, LDx3_&& dx3_,
 
 1871          LDy1_&& dy1_, LDy2_&& dy2_, LDy3_&& dy3_,
 
 1872          LDz1_&& dz1_, LDz2_&& dz2_, LDz3_&& dz3_,
 
 1873          LDxx1_&& dxx1_, LDxx2_&& dxx2_, LDxx3_&& dxx3_,
 
 1874          LDyy1_&& dyy1_, LDyy2_&& dyy2_, LDyy3_&& dyy3_,
 
 1875          LDzz1_&& dzz1_, LDzz2_&& dzz2_, LDzz3_&& dzz3_,
 
 1876          LDxy1_&& dxy1_, LDxy2_&& dxy2_, LDxy3_&& dxy3_,
 
 1877          LDyz1_&& dyz1_, LDyz2_&& dyz2_, LDyz3_&& dyz3_,
 
 1878          LDzx1_&& dzx1_, LDzx2_&& dzx2_, LDzx3_&& dzx3_) :
 
 1879          value1(std::forward<LambdaValue1_>(value1_)),
 
 1880          value2(std::forward<LambdaValue2_>(value2_)),
 
 1881          value3(std::forward<LambdaValue3_>(value3_)),
 
 1882          dx1(std::forward<LDx1_>(dx1_)), dx2(std::forward<LDx2_>(dx2_)), dx3(std::forward<LDx3_>(dx3_)),
 
 1883          dy1(std::forward<LDy1_>(dy1_)), dy2(std::forward<LDy2_>(dy2_)), dy3(std::forward<LDy3_>(dy3_)),
 
 1884          dz1(std::forward<LDz1_>(dz1_)), dz2(std::forward<LDz2_>(dz2_)), dz3(std::forward<LDz3_>(dz3_)),
 
 1885          dxx1(std::forward<LDxx1_>(dxx1_)), dxx2(std::forward<LDxx2_>(dxx2_)), dxx3(std::forward<LDxx3_>(dxx3_)),
 
 1886          dyy1(std::forward<LDyy1_>(dyy1_)), dyy2(std::forward<LDyy2_>(dyy2_)), dyy3(std::forward<LDyy3_>(dyy3_)),
 
 1887          dzz1(std::forward<LDzz1_>(dzz1_)), dzz2(std::forward<LDzz2_>(dzz2_)), dzz3(std::forward<LDzz3_>(dzz3_)),
 
 1888          dxy1(std::forward<LDxy1_>(dxy1_)), dxy2(std::forward<LDxy2_>(dxy2_)), dxy3(std::forward<LDxy3_>(dxy3_)),
 
 1889          dyz1(std::forward<LDyz1_>(dyz1_)), dyz2(std::forward<LDyz2_>(dyz2_)), dyz3(std::forward<LDyz3_>(dyz3_)),
 
 1890          dzx1(std::forward<LDzx1_>(dzx1_)), dzx2(std::forward<LDzx2_>(dzx2_)), dzx3(std::forward<LDzx3_>(dzx3_))
 
 1895        template<
typename DT_>
 
 1899            value1.f(v[0], v[1], v[2]),
 
 1900            value2.f(v[0], v[1], v[2]),
 
 1901            value3.f(v[0], v[1], v[2])});
 
 1909      template<
typename Traits_>
 
 1910      using Evaluator = Intern::LambdaFunctionEvaluator<LambdaSet, Traits_, have_grad, have_hess>;
 
 1927      template<
typename... Lambdas_>
 
 1929        lambda_set(std::forward<Lambdas_>(lambdas)...)
 
 1945    template<
typename LambdaValue1_, 
typename LambdaValue2_, 
typename LambdaValue3_>
 
 1946    LambdaVectorFunction3D<LambdaValue1_, LambdaValue2_, LambdaValue3_>
 
 1950        std::forward<LambdaValue1_>(value1), std::forward<LambdaValue2_>(value2), std::forward<LambdaValue3_>(value3));
 
 1967    template<
typename LambdaValue1_, 
typename LambdaValue2_, 
typename LambdaValue3_,
 
 1968      typename LambdaDx1_, 
typename LambdaDx2_, 
typename LambdaDx3_,
 
 1969      typename LambdaDy1_, 
typename LambdaDy2_, 
typename LambdaDy3_,
 
 1970      typename LambdaDz1_, 
typename LambdaDz2_, 
typename LambdaDz3_>
 
 1971    LambdaVectorFunction3D<LambdaValue1_, LambdaValue2_, LambdaValue3_,
 
 1972      LambdaDx1_, LambdaDx2_, LambdaDx3_, LambdaDy1_, LambdaDy2_, LambdaDy3_, LambdaDz1_, LambdaDz2_, LambdaDz3_>
 
 1974        LambdaDx1_&& dx1, LambdaDx2_&& dx2, LambdaDx3_&& dx3,
 
 1975        LambdaDy1_&& dy1, LambdaDy2_&& dy2, LambdaDy3_&& dy3,
 
 1976        LambdaDz1_&& dz1, LambdaDz2_&& dz2, LambdaDz3_&& dz3)
 
 1979        LambdaDx1_, LambdaDx2_, LambdaDx3_, LambdaDy1_, LambdaDy2_, LambdaDy3_, LambdaDz1_, LambdaDz2_, LambdaDz3_>(
 
 1980        std::forward<LambdaValue1_>(value1), std::forward<LambdaValue2_>(value2), std::forward<LambdaValue3_>(value3),
 
 1981        std::forward<LambdaDx1_>(dx1), std::forward<LambdaDx2_>(dx2), std::forward<LambdaDx3_>(dx3),
 
 1982        std::forward<LambdaDy1_>(dy1), std::forward<LambdaDy2_>(dy2), std::forward<LambdaDy3_>(dy3),
 
 1983        std::forward<LambdaDz1_>(dz1), std::forward<LambdaDz2_>(dz2), std::forward<LambdaDz3_>(dz3));
 
 2003    template<
typename LambdaValue1_, 
typename LambdaValue2_, 
typename LambdaValue3_,
 
 2004      typename LambdaDx1_, 
typename LambdaDx2_, 
typename LambdaDx3_,
 
 2005      typename LambdaDy1_, 
typename LambdaDy2_, 
typename LambdaDy3_,
 
 2006      typename LambdaDz1_, 
typename LambdaDz2_, 
typename LambdaDz3_,
 
 2007      typename LambdaDxx1_, 
typename LambdaDxx2_, 
typename LambdaDxx3_,
 
 2008      typename LambdaDyy1_, 
typename LambdaDyy2_, 
typename LambdaDyy3_,
 
 2009      typename LambdaDzz1_, 
typename LambdaDzz2_, 
typename LambdaDzz3_,
 
 2010      typename LambdaDxy1_, 
typename LambdaDxy2_, 
typename LambdaDxy3_,
 
 2011      typename LambdaDyz1_, 
typename LambdaDyz2_, 
typename LambdaDyz3_,
 
 2012      typename LambdaDzx1_, 
typename LambdaDzx2_, 
typename LambdaDzx3_>
 
 2013    LambdaVectorFunction3D<LambdaValue1_, LambdaValue2_, LambdaValue3_,
 
 2014      LambdaDx1_, LambdaDx2_, LambdaDx3_, LambdaDy1_, LambdaDy2_, LambdaDy3_, LambdaDz1_, LambdaDz2_, LambdaDz3_,
 
 2015      LambdaDxx1_, LambdaDxx2_, LambdaDxx3_, LambdaDyy1_, LambdaDyy2_, LambdaDyy3_, LambdaDzz1_, LambdaDzz2_, LambdaDzz3_,
 
 2016      LambdaDxy1_, LambdaDxy2_, LambdaDxy3_, LambdaDyz1_, LambdaDyz2_, LambdaDyz3_, LambdaDzx1_, LambdaDzx2_, LambdaDzx3_>
 
 2018      LambdaDx1_&& dx1, LambdaDx2_&& dx2, LambdaDx3_&& dx3,
 
 2019      LambdaDy1_&& dy1, LambdaDy2_&& dy2, LambdaDy3_&& dy3,
 
 2020      LambdaDz1_&& dz1, LambdaDz2_&& dz2, LambdaDz3_&& dz3,
 
 2021      LambdaDxx1_&& dxx1, LambdaDxx2_&& dxx2, LambdaDxx3_&& dxx3,
 
 2022      LambdaDyy1_&& dyy1, LambdaDyy2_&& dyy2, LambdaDyy3_&& dyy3,
 
 2023      LambdaDzz1_&& dzz1, LambdaDzz2_&& dzz2, LambdaDzz3_&& dzz3,
 
 2024      LambdaDxy1_&& dxy1, LambdaDxy2_&& dxy2, LambdaDxy3_&& dxy3,
 
 2025      LambdaDyz1_&& dyz1, LambdaDyz2_&& dyz2, LambdaDyz3_&& dyz3,
 
 2026      LambdaDzx1_&& dzx1, LambdaDzx2_&& dzx2, LambdaDzx3_&& dzx3)
 
 2029        LambdaDx1_, LambdaDx2_, LambdaDx3_, LambdaDy1_, LambdaDy2_, LambdaDy3_, LambdaDz1_, LambdaDz2_, LambdaDz3_,
 
 2030        LambdaDxx1_, LambdaDxx2_, LambdaDxx3_, LambdaDyy1_, LambdaDyy2_, LambdaDyy3_, LambdaDzz1_, LambdaDzz2_, LambdaDzz3_,
 
 2031        LambdaDxy1_, LambdaDxy2_, LambdaDxy3_, LambdaDyz1_, LambdaDyz2_, LambdaDyz3_, LambdaDzx1_, LambdaDzx2_, LambdaDzx3_>(
 
 2032        std::forward<LambdaValue1_>(value1), std::forward<LambdaValue2_>(value2), std::forward<LambdaValue3_>(value3),
 
 2033        std::forward<LambdaDx1_>(dx1), std::forward<LambdaDx2_>(dx2), std::forward<LambdaDx3_>(dx3),
 
 2034        std::forward<LambdaDy1_>(dy1), std::forward<LambdaDy2_>(dy2), std::forward<LambdaDy3_>(dy3),
 
 2035        std::forward<LambdaDz1_>(dz1), std::forward<LambdaDz2_>(dz2), std::forward<LambdaDz3_>(dz3),
 
 2036        std::forward<LambdaDxx1_>(dxx1), std::forward<LambdaDxx2_>(dxx2), std::forward<LambdaDxx3_>(dxx3),
 
 2037        std::forward<LambdaDyy1_>(dyy1), std::forward<LambdaDyy2_>(dyy2), std::forward<LambdaDyy3_>(dyy3),
 
 2038        std::forward<LambdaDzz1_>(dzz1), std::forward<LambdaDzz2_>(dzz2), std::forward<LambdaDzz3_>(dzz3),
 
 2039        std::forward<LambdaDxy1_>(dxy1), std::forward<LambdaDxy2_>(dxy2), std::forward<LambdaDxy3_>(dxy3),
 
 2040        std::forward<LambdaDyz1_>(dyz1), std::forward<LambdaDyz2_>(dyz2), std::forward<LambdaDyz3_>(dyz3),
 
 2041        std::forward<LambdaDzx1_>(dzx1), std::forward<LambdaDzx2_>(dzx2), std::forward<LambdaDzx3_>(dzx3));
 
Analytic Function Evaluator base-class template.
Analytic Function interface.
Lambda function set container class.
Intern::LambdaHelper< LambdaValue_ > value
the lambda for the function value
LambdaSet(LambdaValue_ &&value_)
constructor for values only
const Intern::LambdaHelper< void > dz
dummy helper for Z-derivative
const Intern::LambdaHelper< void > dxy
dummy helper for XY-derivative
LambdaSet(LambdaValue_ &&value_, LDx_ &&dx_, LDxx_ &&dxx_)
constructor for values, gradients and hessians
const Intern::LambdaHelper< void > dy
dummy helper for Y-derivative
LambdaSet(LambdaValue_ &&value_, LDx_ &&dx_)
constructor for values and gradients
Intern::LambdaHelper< LambdaDx_ > dx
the lambda for the X-derivative
DT_ eval_value(const Tiny::Vector< DT_, 1 > &v) const
function value evaluation function
Intern::LambdaHelper< LambdaDxx_ > dxx
the lambda for the XX-derivative
const Intern::LambdaHelper< void > dyz
dummy helper for YZ-derivative
const Intern::LambdaHelper< void > dzz
dummy helper for ZZ-derivative
const Intern::LambdaHelper< void > dzx
dummy helper for ZX-derivative
const Intern::LambdaHelper< void > dyy
dummy helper for YY-derivative
Analytic 1D scalar lambda expression function implementation.
static constexpr bool can_value
nothing makes sense if we cannot compute function values
static constexpr bool have_value
we can compute values if LambdaValue_ is not void
Intern::LambdaFunctionEvaluator< LambdaSet, Traits_, have_grad, have_hess > Evaluator
evaluator class template is outsourced
Real initial_h_hess
initial H for hessian Richardson extrapolation
LambdaScalarFunction1D(Lambdas_ &&... lambdas)
Constructor.
LambdaSet lambda_set
the actual lambda set for this function
Real initial_h_grad
initial H for gradient Richardson extrapolation
static constexpr bool can_hess
we can always compute hessians (either directly or by Richardson extrapolation)
Analytic::Image::Scalar ImageType
this is a a scalar function
static constexpr bool have_grad
we can compute gradients if LambdaDx_ and LambdaDy_ are not void
int max_steps_grad
maximum number of gradient Richardson extrapolation steps
static constexpr bool can_grad
we can always compute gradients (either directly or by Richardson extrapolation)
static constexpr bool have_hess
we can compute hessians if LambdaDxx_, LambdaDyy_ and LambdaDxy_ are not void
static constexpr int domain_dim
this is a 1D function
int max_steps_hess
maximum number of hessian Richardson extrapolation steps
Lambda function set container class.
const Intern::LambdaHelper< void > dyz
dummy helper for YZ-derivative
LambdaSet(LambdaValue_ &&value_)
constructor for values only
const Intern::LambdaHelper< void > dz
dummy helper for Z-derivative
const Intern::LambdaHelper< void > dzx
dummy helper for ZX-derivative
Intern::LambdaHelper< LambdaValue_ > value
the lambda for the function value
DT_ eval_value(const Tiny::Vector< DT_, 2 > &v) const
function value evaluation function
Intern::LambdaHelper< LambdaDx_ > dx
the lambda for the X-derivative
Intern::LambdaHelper< LambdaDxy_ > dxy
the lambda for the XY-derivative
LambdaSet(LambdaValue_ &&value_, LDx_ &&dx_, LDy_ &&dy_)
constructor for values and gradients
Intern::LambdaHelper< LambdaDy_ > dy
the lambda for the Y-derivative
Intern::LambdaHelper< LambdaDyy_ > dyy
the lambda for the YY-derivative
const Intern::LambdaHelper< void > dzz
dummy helper for ZZ-derivative
LambdaSet(LambdaValue_ &&value_, LDx_ &&dx_, LDy_ &&dy_, LDxx_ &&dxx_, LDyy_ &&dyy_, LDxy_ &&dxy_)
constructor for values, gradients and hessians
Intern::LambdaHelper< LambdaDxx_ > dxx
the lambda for the XX-derivative
Analytic scalar 2D lambda expression function implementation.
static constexpr bool can_value
nothing makes sense if we cannot compute function values
static constexpr bool have_hess
we can compute hessians if LambdaDxx_, LambdaDyy_ and LambdaDxy_ are not void
int max_steps_grad
maximum number of gradient Richardson extrapolation steps
static constexpr bool have_value
we can compute values if LambdaValue_ is not void
Real initial_h_grad
initial H for gradient Richardson extrapolation
LambdaScalarFunction2D(Lambdas_ &&... lambdas)
Constructor.
static constexpr bool can_hess
we can always compute hessians (either directly or by Richardson extrapolation)
static constexpr bool have_grad
we can compute gradients if LambdaDx_ and LambdaDy_ are not void
LambdaSet lambda_set
the actual lambda set for this function
Real initial_h_hess
initial H for hessian Richardson extrapolation
Analytic::Image::Scalar ImageType
this is a a scalar function
int max_steps_hess
maximum number of hessian Richardson extrapolation steps
static constexpr bool can_grad
we can always compute gradients (either directly or by Richardson extrapolation)
Intern::LambdaFunctionEvaluator< LambdaSet, Traits_, have_grad, have_hess > Evaluator
evaluator class template is outsourced
static constexpr int domain_dim
this is a 2D function
Lambda function set container class.
Intern::LambdaHelper< LambdaDzx_ > dzx
the lambda for the ZX-derivative
Intern::LambdaHelper< LambdaDyy_ > dyy
the lambda for the YY-derivative
LambdaSet(LambdaValue_ &&value_, LDx_ &&dx_, LDy_ &&dy_, LDz_ &&dz_)
constructor for values and gradients
Intern::LambdaHelper< LambdaDxy_ > dxy
the lambda for the XY-derivative
Intern::LambdaHelper< LambdaDzz_ > dzz
the lambda for the ZZ-derivative
Intern::LambdaHelper< LambdaDyz_ > dyz
the lambda for the YZ-derivative
LambdaSet(LambdaValue_ &&value_, LDx_ &&dx_, LDy_ &&dy_, LDz_ &&dz_, LDxx_ &&dxx_, LDyy_ &&dyy_, LDzz_ &&dzz_, LDxy_ &&dxy_, LDyz_ &&dyz_, LDzx_ &&dzx_)
constructor for values, gradients and hessians
Intern::LambdaHelper< LambdaDy_ > dy
the lambda for the Y-derivative
Intern::LambdaHelper< LambdaDz_ > dz
the lambda for the Z-derivative
Intern::LambdaHelper< LambdaDxx_ > dxx
the lambda for the XX-derivative
Intern::LambdaHelper< LambdaDx_ > dx
the lambda for the X-derivative
Intern::LambdaHelper< LambdaValue_ > value
the lambda for the function value
LambdaSet(LambdaValue_ &&value_)
constructor for values only
DT_ eval_value(const Tiny::Vector< DT_, 3 > &v) const
function value evaluation function
Analytic 3D scalar lambda expression function implementation.
static constexpr int domain_dim
this is a 3D function
Analytic::Image::Scalar ImageType
this is a a scalar function
static constexpr bool have_value
we can compute values if LambdaValue_ is not void
LambdaScalarFunction3D(Lambdas_ &&... lambdas)
Constructor.
LambdaSet lambda_set
the actual lambda set for this function
Real initial_h_grad
initial H for gradient Richardson extrapolation
int max_steps_hess
maximum number of hessian Richardson extrapolation steps
static constexpr bool can_hess
we can always compute hessians (either directly or by Richardson extrapolation)
Intern::LambdaFunctionEvaluator< LambdaSet, Traits_, have_grad, have_hess > Evaluator
evaluator class template is outsourced
static constexpr bool have_hess
are all second order lambdas given?
int max_steps_grad
maximum number of gradient Richardson extrapolation steps
static constexpr bool can_value
nothing makes sense if we cannot compute function values
static constexpr bool can_grad
we can always compute gradients (either directly or by Richardson extrapolation)
static constexpr bool have_grad
are all first order lambdas given?
Real initial_h_hess
initial H for hessian Richardson extrapolation
Lambda function set container class.
Intern::LambdaHelper< void > dyz1
the lambdas for the YZ-derivatives
LambdaSet(LambdaValue1_ &&value1_, LambdaValue2_ &&value2_, LDx1_ &&dx1_, LDx2_ &&dx2_, LDy1_ &&dy1_, LDy2_ &&dy2_)
constructor for values and gradients
Intern::LambdaHelper< LambdaDyy1_ > dyy1
the lambdas for the YY-derivatives
Tiny::Vector< DT_, 2 > eval_value(const Tiny::Vector< DT_, 2 > &v) const
function value evaluation function
Intern::LambdaHelper< LambdaDx1_ > dx1
the lambdas for the X-derivatives
Intern::LambdaHelper< void > dzz1
the lambdas for the ZZ-derivatives
LambdaSet(LambdaValue1_ &&value1_, LambdaValue2_ &&value2_, LDx1_ &&dx1_, LDx2_ &&dx2_, LDy1_ &&dy1_, LDy2_ &&dy2_, LDxx1_ &&dxx1_, LDxx2_ &&dxx2_, LDyy1_ &&dyy1_, LDyy2_ &&dyy2_, LDxy1_ &&dxy1_, LDxy2_ &&dxy2_)
constructor for values, gradients and hessians
Intern::LambdaHelper< void > dz1
the lambdas for the Z-derivatives
Intern::LambdaHelper< LambdaDy1_ > dy1
the lambdas for the Y-derivatives
LambdaSet(LambdaValue1_ &&value1_, LambdaValue2_ &&value2_)
constructor for values only
Intern::LambdaHelper< LambdaDxy1_ > dxy1
the lambdas for the XY-derivatives
Intern::LambdaHelper< void > dzx1
the lambdas for the ZX-derivatives
Intern::LambdaHelper< LambdaDxx1_ > dxx1
the lambdas for the XX-derivatives
Intern::LambdaHelper< LambdaValue1_ > value1
the lambdas for the function values
Analytic 2D vector-valued lambda expression function implementation.
static constexpr bool can_value
nothing makes sense if we cannot compute function values
static constexpr bool have_grad
are all first order lambdas given?
Intern::LambdaFunctionEvaluator< LambdaSet, Traits_, have_grad, have_hess > Evaluator
evaluator class template is outsourced
static constexpr bool can_hess
we can always compute hessians (either directly or by Richardson extrapolation)
Real initial_h_hess
initial H for hessian Richardson extrapolation
LambdaVectorFunction2D(Lambdas_ &&... lambdas)
Constructor.
static constexpr int domain_dim
this is a 2D function
Real initial_h_grad
initial H for gradient Richardson extrapolation
static constexpr bool can_grad
we can always compute gradients (either directly or by Richardson extrapolation)
LambdaSet lambda_set
the actual lambda set for this function
static constexpr bool have_hess
are all second order lambdas given?
Analytic::Image::Vector< domain_dim > ImageType
this is a vector field
static constexpr bool have_value
we can compute values if LambdaValue_ is not void
int max_steps_hess
maximum number of hessian Richardson extrapolation steps
int max_steps_grad
maximum number of gradient Richardson extrapolation steps
Lambda function set container class.
Intern::LambdaHelper< LambdaDxy1_ > dxy1
the lambdas for the XY-derivatives
Intern::LambdaHelper< LambdaDyy1_ > dyy1
the lambdas for the YY-derivatives
Intern::LambdaHelper< LambdaValue1_ > value1
the lambdas for the function values
Intern::LambdaHelper< LambdaDyz1_ > dyz1
the lambdas for the YZ-derivatives
Intern::LambdaHelper< LambdaDy1_ > dy1
the lambdas for the Y-derivatives
LambdaSet(LambdaValue1_ &&value1_, LambdaValue2_ &&value2_, LambdaValue3_ &&value3_, LDx1_ &&dx1_, LDx2_ &&dx2_, LDx3_ &&dx3_, LDy1_ &&dy1_, LDy2_ &&dy2_, LDy3_ &&dy3_, LDz1_ &&dz1_, LDz2_ &&dz2_, LDz3_ &&dz3_, LDxx1_ &&dxx1_, LDxx2_ &&dxx2_, LDxx3_ &&dxx3_, LDyy1_ &&dyy1_, LDyy2_ &&dyy2_, LDyy3_ &&dyy3_, LDzz1_ &&dzz1_, LDzz2_ &&dzz2_, LDzz3_ &&dzz3_, LDxy1_ &&dxy1_, LDxy2_ &&dxy2_, LDxy3_ &&dxy3_, LDyz1_ &&dyz1_, LDyz2_ &&dyz2_, LDyz3_ &&dyz3_, LDzx1_ &&dzx1_, LDzx2_ &&dzx2_, LDzx3_ &&dzx3_)
constructor for values, gradients and hessians
Tiny::Vector< DT_, 3 > eval_value(const Tiny::Vector< DT_, 3 > &v) const
function value evaluation function
LambdaSet(LambdaValue1_ &&value1_, LambdaValue2_ &&value2_, LambdaValue3_ &&value3_)
constructor for values only
Intern::LambdaHelper< LambdaDxx1_ > dxx1
the lambdas for the XX-derivatives
Intern::LambdaHelper< LambdaDzz1_ > dzz1
the lambdas for the ZZ-derivatives
Intern::LambdaHelper< LambdaDx1_ > dx1
the lambdas for the X-derivatives
Intern::LambdaHelper< LambdaDzx1_ > dzx1
the lambdas for the ZX-derivatives
Intern::LambdaHelper< LambdaDz1_ > dz1
the lambdas for the Z-derivatives
LambdaSet(LambdaValue1_ &&value1_, LambdaValue2_ &&value2_, LambdaValue3_ &&value3_, LDx1_ &&dx1_, LDx2_ &&dx2_, LDx3_ &&dx3_, LDy1_ &&dy1_, LDy2_ &&dy2_, LDy3_ &&dy3_, LDz1_ &&dz1_, LDz2_ &&dz2_, LDz3_ &&dz3_)
constructor for values and gradients
Analytic 3D vector-valued lambda expression function implementation.
static constexpr bool can_hess
we can always compute hessians (either directly or by Richardson extrapolation)
static constexpr bool can_grad
we can always compute gradients (either directly or by Richardson extrapolation)
Analytic::Image::Vector< domain_dim > ImageType
this is a vector field
int max_steps_grad
maximum number of gradient Richardson extrapolation steps
Real initial_h_hess
initial H for hessian Richardson extrapolation
static constexpr bool have_value
we can compute values if LambdaValue_ is not void
LambdaVectorFunction3D(Lambdas_ &&... lambdas)
Constructor.
static constexpr bool have_grad
are all first order lambdas given?
int max_steps_hess
maximum number of hessian Richardson extrapolation steps
static constexpr bool can_value
nothing makes sense if we cannot compute function values
static constexpr int domain_dim
this is a 3D function
Intern::LambdaFunctionEvaluator< LambdaSet, Traits_, have_grad, have_hess > Evaluator
evaluator class template is outsourced
static constexpr bool have_hess
are all second order lambdas given?
Real initial_h_grad
initial H for gradient Richardson extrapolation
LambdaSet lambda_set
the actual lambda set for this function
EvalTraits_::DataType DataType
coefficient data type
EvalTraits_::ValueType ValueType
value type
EvalTraits_::PointType PointType
evaluation point type
Simpler 2D vector version of the general LambdaFunction interface.
static constexpr bool can_hess
we can always compute hessians (either directly or by Richardson extrapolation)
static constexpr bool can_grad
we can always compute gradients (either directly or by Richardson extrapolation)
static constexpr bool can_value
we can always compute values
Analytic::Image::Vector< domain_dim > ImageType
this is a vector field
static constexpr int domain_dim
this is a 2D function
EvalTraits_::ValueType ValueType
value type
EvalTraits_::DataType DataType
coefficient data type
EvalTraits_::PointType PointType
evaluation point type
Simpler 3D vector version of the general LambdaFunction interface.
static constexpr bool can_grad
we can always compute gradients (either directly or by Richardson extrapolation)
static constexpr int domain_dim
this is a 2D function
static constexpr bool can_value
we can always compute values
static constexpr bool can_hess
we can always compute hessians (either directly or by Richardson extrapolation)
Analytic::Image::Vector< domain_dim > ImageType
this is a vector field
Tiny Vector class template.
CUDA_HOST_DEVICE void convert(const Vector< Tx_, n_, sx_ > &x)
conversion operator
LambdaScalarFunction1D< LambdaValue_ > create_lambda_function_scalar_1d(LambdaValue_ &&value)
Creates a scalar 1D lambda function from function values only.
LambdaVectorFunction3D< LambdaValue1_, LambdaValue2_, LambdaValue3_ > create_lambda_function_vector_3d(LambdaValue1_ &&value1, LambdaValue2_ &&value2, LambdaValue3_ &&value3)
Creates a vector-valued 3D lambda function from function values only.
LambdaScalarFunction2D< LambdaValue_ > create_lambda_function_scalar_2d(LambdaValue_ &&value)
Creates a scalar 2D lambda function from function values only.
LambdaVectorFunction2D< LambdaValue1_, LambdaValue2_ > create_lambda_function_vector_2d(LambdaValue1_ &&value1, LambdaValue2_ &&value2)
Creates a vector-valued 2D lambda function from function values only.
LambdaScalarFunction3D< LambdaValue_ > create_lambda_function_scalar_3d(LambdaValue_ &&value)
Creates a scalar 3D lambda function from function values only.
Type
bitmask for zfp header
double Real
Real data type.
@ value
specifies whether the space should supply basis function values
@ hess
specifies whether the space should supply basis function hessians
@ grad
specifies whether the space should supply basis function gradients
Scalar Function Image tag class.
Vector Field Image tag class.