The Gaudi Framework  v30r3 (a5ef0a68)
FunAdapters.h
Go to the documentation of this file.
1 #ifndef GAUDIMATH_FUNADAPTERS_H
2 #define GAUDIMATH_FUNADAPTERS_H 1
3 // ============================================================================
4 // Include files
5 // ============================================================================
6 #include <boost/variant.hpp>
7 #include <memory>
8 // ============================================================================
9 // from CLHEP
10 // ============================================================================
11 #include "CLHEP/GenericFunctions/AbsFunction.hh"
12 #include "CLHEP/GenericFunctions/Argument.hh"
13 #include "CLHEP/GenericFunctions/GenericFunctions.hh"
14 // ============================================================================
15 #include "GaudiKernel/Kernel.h"
16 #include "GaudiKernel/compose.h"
17 
18 #if defined( __clang__ ) || defined( __CLING__ )
19 #pragma clang diagnostic push
20 #pragma clang diagnostic ignored "-Winconsistent-missing-override"
21 #elif defined( __GNUC__ ) && __GNUC__ >= 5
22 #pragma GCC diagnostic push
23 #pragma GCC diagnostic ignored "-Wsuggest-override"
24 #endif
25 
26 namespace detail
27 {
28 
29  auto dispatch_variant = []( auto&& variant, auto&&... lambdas ) -> decltype( auto ) {
30  return boost::apply_visitor( compose( std::forward<decltype( lambdas )>( lambdas )... ),
31  std::forward<decltype( variant )>( variant ) );
32  };
33 }
34 
35 namespace AIDA
36 {
37  class IFunction;
38 }
39 
40 namespace Genfun
41 {
42  namespace GaudiMathImplementation
43  {
44  // ========================================================================
51  // =========================================================================
52 
53  class GAUDI_API AdapterIFunction : public AbsFunction
54  {
55  public:
57  FUNCTION_OBJECT_DEF( AdapterIFunction )
58  public:
62  AdapterIFunction( const AIDA::IFunction& fun );
64  AdapterIFunction( const AdapterIFunction& ) = default;
65 
66  double operator()( double a ) const override;
67 
68  double operator()( const Argument& x ) const override;
69 
70  unsigned int dimensionality() const override { return m_arg.size(); }
71 
73  bool hasAnalyticDerivative() const override { return true; }
75  Genfun::Derivative partial( unsigned int i ) const override;
76 
77  AdapterIFunction& operator=( const AdapterIFunction& ) = delete;
78 
79  private:
80  const AIDA::IFunction* m_fun;
82  };
84  FUNCTION_OBJECT_IMP( AdapterIFunction )
85 
86  // ========================================================================
110  // ========================================================================
112  {
113  public:
115  typedef double ( *Function )( const double, const double );
116 
117  public:
119  FUNCTION_OBJECT_DEF( Adapter2DoubleFunction )
120  public:
125 
126  double operator()( double x ) const override;
127 
128  double operator()( const Argument& x ) const override;
129 
130  unsigned int dimensionality() const override { return 2; }
132  bool hasAnalyticDerivative() const override { return true; }
134  Genfun::Derivative partial( unsigned int i ) const override;
135 
136  public:
137  double operator()( const double x, const double y ) const;
138 
139  // assigmenet operator is disabled
141 
142  private:
143  Function m_func = nullptr;
144  };
146  FUNCTION_OBJECT_IMP( Adapter2DoubleFunction )
147 
148  // ========================================================================
173  // ========================================================================
175  {
176  public:
178  typedef double ( *Function )( const double, const double, const double );
179 
180  public:
182  FUNCTION_OBJECT_DEF( Adapter3DoubleFunction )
183  public:
188 
189  double operator()( double x ) const override;
190 
191  double operator()( const Argument& x ) const override;
192 
193  unsigned int dimensionality() const override { return 3; }
195  bool hasAnalyticDerivative() const override { return true; }
197  Genfun::Derivative partial( unsigned int i ) const override;
198 
199  public:
200  double operator()( const double x, const double y, const double z ) const;
201 
202  private:
203  // assignment operator is disabled
205 
206  private:
207  Function m_func = nullptr;
208  };
210  FUNCTION_OBJECT_IMP( Adapter3DoubleFunction )
211 
212  // ========================================================================
219  // ========================================================================
220  class GAUDI_API SimpleFunction : public AbsFunction
221  {
222  public:
223  typedef double ( *Function1 )( const double );
224  typedef double ( *Function2 )( const double* );
225  typedef double ( *Function3 )( const std::vector<double>& );
226 
227  public:
229  FUNCTION_OBJECT_DEF( SimpleFunction )
230 
231  public:
235  SimpleFunction( Function1 func );
236 
241  SimpleFunction( Function2 func, const size_t dim );
242 
247  SimpleFunction( Function3 func, const size_t dim );
248 
249  public:
251  unsigned int dimensionality() const override
252  {
253  return detail::dispatch_variant( m_func, []( Function1 ) { return 1ul; },
254  [&]( auto ) { return m_arg.size(); } );
255  }
257  bool hasAnalyticDerivative() const override { return true; }
259  double operator()( double ) const override;
261  double operator()( const Argument& ) const override;
263  Genfun::Derivative partial( unsigned int i ) const override;
264 
265  private:
266  boost::variant<Function1, Function2, Function3> m_func;
268  };
270  FUNCTION_OBJECT_IMP( SimpleFunction )
271 
272  } // end of namespace GaudiMathImeplementation
273 } // end of namespace Genfun
274 
275 #if defined( __clang__ ) || defined( __CLING__ )
276 #pragma clang diagnostic pop
277 #elif defined( __GNUC__ ) && __GNUC__ >= 5
278 #pragma GCC diagnostic pop
279 #endif
280 
281 #endif // GAUDIMATH_FUNADAPTERS_H
282 // ============================================================================
auto dispatch_variant
Definition: FunAdapters.h:29
bool hasAnalyticDerivative() const override
Does this function have an analytic derivative?
Definition: FunAdapters.h:257
mandatory macro from CLHEP/GenericFunctions
Definition: FunAdapters.h:220
Genfun::AbsFunction Function
Definition: GaudiMath.h:24
#define class
Genfun::GaudiMathImplementation::NumericalDerivative Derivative
Definition: GaudiMath.h:27
bool hasAnalyticDerivative() const override
Does this function have an analytic derivative?
Definition: FunAdapters.h:195
GaudiKernel.
Definition: Fill.h:10
bool hasAnalyticDerivative() const override
Does this function have an analytic derivative?
Definition: FunAdapters.h:132
PropertyMgr & operator=(const PropertyMgr &)=delete
mandatory macro from CLHEP/GenericFunctions
Definition: FunAdapters.h:111
TupleObj.h GaudiAlg/TupleObj.h namespace with few technical implementations.
boost::variant< Function1, Function2, Function3 > m_func
Definition: FunAdapters.h:266
mandatory macro from CLHEP/GenericFunctions
Definition: FunAdapters.h:174
virtual Out operator()(const vector_of_const_< In > &inputs) const =0
double fun(const std::vector< double > &x)
Definition: PFuncTest.cpp:26
auto compose(lambda_ts &&...lambdas)
Definition: compose.h:77
#define GAUDI_API
Definition: Kernel.h:104
T forward(T...args)
unsigned int dimensionality() const override
Definition: FunAdapters.h:70
bool hasAnalyticDerivative() const override
Does this function have an analytic derivative?
Definition: FunAdapters.h:73
constructor from the IFunction ( see AIDA/IFunction.h)
Definition: FunAdapters.h:53