3#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
10#include <dune/functions/common/type_traits.hh>
11#include <dune/functions/common/defaultderivativetraits.hh>
12#include <dune/functions/common/differentiablefunction_imp.hh>
13#include <dune/functions/common/signature.hh>
14#include <dune/functions/common/typeerasure.hh>
15#include <dune/functions/common/functionconcepts.hh>
27template<
class Signature,
template<
class>
class DerivativeTraits=DefaultDerivativeTraits,
size_t bufferSize=56>
28class DifferentiableFunction
37 template<
class S,
template<
class>
class DerivativeTraits,
size_t bufferSize>
38 struct DifferentiableFunctionTraits
44 using Range =
typename SignatureTraits<Signature>::Range;
47 using Domain =
typename SignatureTraits<Signature>::Domain;
50 using DerivativeSignature =
typename SignatureTraits<Signature>::template DerivativeSignature<DerivativeTraits>;
53 using DerivativeInterface = DifferentiableFunction<DerivativeSignature, DerivativeTraits, bufferSize>;
56 using Concept = DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>;
60 using Model = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
80template<
class Range,
class Domain,
template<
class>
class DerivativeTraits,
size_t bufferSize>
81class DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize> :
83 typename Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::Concept,
84 Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::template Model>
86 using Traits = Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>;
90 using DerivativeInterface =
typename Traits::DerivativeInterface;
105 template<
class F, disableCopyMove<DifferentiableFunction, F> = 0 >
109 static_assert(Dune::Functions::Concept::isFunction<F, Range(Domain)>(),
"Trying to construct a DifferentiableFunction from type that does not model the Function concept");
118 Range operator() (
const Domain& x)
const
120 return this->asInterface().operator()(x);
130 friend DerivativeInterface
derivative(
const DifferentiableFunction& t)
132 return t.asInterface().derivative();
DifferentiableFunction(F &&f)
Construct from function.
Definition: differentiablefunction.hh:106
DifferentiableFunction()=default
Default constructor.
Base class for type-erased interface wrapper.
Definition: typeerasure.hh:165
friend DerivativeInterface derivative(const DifferentiableFunction &t)
Get derivative of wrapped function.
Definition: differentiablefunction.hh:130
Dune namespace.
Definition: alignedallocator.hh:13
Utilities for type computations, constraining overloads, ...