All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Adapter.cpp
Go to the documentation of this file.
1 // $Id: Adapter.cpp,v 1.2 2004/03/28 18:50:36 mato Exp $
2 // Include files
3 // ============================================================================
4 // GaudiMath
5 // ============================================================================
6 #include "GaudiMath/GaudiMath.h"
7 // ============================================================================
8 // AIDA
9 // ============================================================================
10 #include "AIDA/IFunction.h"
11 // ============================================================================
12 #include <cstring>
13 
14 namespace Genfun
15 {
16  namespace GaudiMathImplementation
17  {
18 
19  FUNCTION_OBJECT_IMP( AdapterIFunction )
20 
21  AdapterIFunction::AdapterIFunction ( const AIDA::IFunction& fun)
22  : AbsFunction ( )
23  , m_fun ( &fun )
24  , m_dim ( fun.dimension() )
25  , m_arg ( fun.dimension() , 0 )
26  {}
27 
29  : AbsFunction ( )
30  , m_fun ( right.m_fun )
31  , m_dim ( right.m_dim )
32  , m_arg ( right.m_arg )
33  {}
34 
36 
37  double AdapterIFunction::operator() ( double x ) const
38  {
39  for ( size_t i = 0; i < m_dim; ++i ) { m_arg[i] = 0.0 ; }
40  m_arg[0] = x ;
41  return m_fun -> value ( m_arg ) ;
42  }
43 
44  double AdapterIFunction::operator() ( const Genfun::Argument& x ) const
45  {
46  for ( size_t i = 0; i < m_dim; ++i ) { m_arg[i] = x[i] ; }
47  return m_fun -> value ( m_arg ) ;
48  }
49 
51  {
52  if ( i >= m_dim )
53  {
54  const AbsFunction& aux = GaudiMath::Constant( 0 , m_dim ) ;
55  return Genfun::FunctionNoop( &aux ) ;
56  };
57  const AbsFunction& aux = GaudiMath::Derivative( *this , i ) ;
58  return Genfun::FunctionNoop ( &aux ) ;
59  }
60 
61  FUNCTION_OBJECT_IMP( Adapter2DoubleFunction )
62 
65  : AbsFunction ( )
66  , m_func ( func )
67  {}
68 
70  ( const Adapter2DoubleFunction& right )
71  : AbsFunction ( )
72  , m_func ( right.m_func )
73  {}
74 
76 
77  double Adapter2DoubleFunction::operator()
78  ( double x ) const
79  { return m_func ( x , 0 ) ; }
80 
81  double Adapter2DoubleFunction::operator()
82  ( const Genfun::Argument& x ) const
83  { return m_func ( x[0] , x[1] ) ; }
84 
85  double Adapter2DoubleFunction::operator()
86  ( const double x ,
87  const double y ) const
88  { return m_func ( x , y ) ; }
89 
92  {
93  if ( i >= 2 )
94  {
95  const AbsFunction& aux = GaudiMath::Constant( 0 , 2 ) ;
96  return Genfun::FunctionNoop( &aux ) ;
97  };
98  const AbsFunction& aux = GaudiMath::Derivative( *this , i ) ;
99  return Genfun::FunctionNoop ( &aux ) ;
100  }
101 
102  FUNCTION_OBJECT_IMP( Adapter3DoubleFunction )
103 
106  : AbsFunction ( )
107  , m_func ( func )
108  {}
109 
111  ( const Adapter3DoubleFunction& right )
112  : AbsFunction ( )
113  , m_func ( right.m_func )
114  {}
115 
117 
118  double Adapter3DoubleFunction::operator()
119  ( double x ) const
120  { return m_func ( x , 0 , 0 ) ; }
121 
122  double Adapter3DoubleFunction::operator()
123  ( const Genfun::Argument& x ) const
124  { return m_func ( x[0] , x[1] , x[2] ) ; }
125 
126  double Adapter3DoubleFunction::operator()
127  ( const double x ,
128  const double y ,
129  const double z ) const
130  { return m_func ( x , y , z ) ; }
131 
134  {
135  if ( i >= 3 )
136  {
137  const AbsFunction& aux = GaudiMath::Constant( 0 , 3 ) ;
138  return Genfun::FunctionNoop( &aux ) ;
139  };
140  const AbsFunction& aux = GaudiMath::Derivative( *this , i ) ;
141  return Genfun::FunctionNoop ( &aux ) ;
142  }
143 
144  // ========================================================================
146  // ========================================================================
147  FUNCTION_OBJECT_IMP( SimpleFunction )
148  // ========================================================================
149 
150  // =======================================================================
154  // ========================================================================
156  ( SimpleFunction::Function1 func )
157  : AbsFunction ()
158  , m_case ( SimpleFunction::TrivialArg )
159  , m_DIM ( 1 )
160  , m_func1 ( func )
161  , m_func2 ( 0 )
162  , m_arg2 ( 0 )
163  , m_func3 ( 0 )
164  , m_arg3 ( )
165  {}
166  // ========================================================================
167 
168  // ========================================================================
173  // ========================================================================
176  const size_t dim )
177  : AbsFunction ()
178  , m_case ( SimpleFunction::ArrayArg )
179  , m_DIM ( dim )
180  , m_func1 ( 0 )
181  , m_func2 ( func )
182  , m_arg2 ( 0 )
183  , m_func3 ( 0 )
184  , m_arg3 ( )
185  {
186  m_arg2 = new double[dim];
187  }
188  // ========================================================================
189 
190  // ========================================================================
195  // ========================================================================
198  const size_t dim )
199  : AbsFunction ()
200  , m_case ( SimpleFunction::VectorArg )
201  , m_DIM ( dim )
202  , m_func1 ( 0 )
203  , m_func2 ( 0 )
204  , m_arg2 ( 0 )
205  , m_func3 ( func )
206  , m_arg3 ( dim , 0 )
207  {}
208  // ========================================================================
209 
210  // ========================================================================
212  // ========================================================================
214  ( const SimpleFunction& right )
215  : AbsFunction ()
216  , m_case ( right.m_case )
217  , m_DIM ( right.m_DIM )
218  , m_func1 ( right.m_func1 )
219  , m_func2 ( right.m_func2 )
220  , m_arg2 ( 0 )
221  , m_func3 ( right.m_func3 )
222  , m_arg3 ( right.m_arg3 )
223  {
224  if ( 0 != right.m_arg2 )
225  {
226  std::memcpy(m_arg2, right.m_arg2, m_DIM);
227  }
228  }
229  // ========================================================================
230 
231  // ========================================================================
233  // ========================================================================
235  { if( 0 != m_arg2 ) { delete m_arg2 ; m_arg2 = 0 ;} }
236  // ========================================================================
237 
238  // ========================================================================
240  // ========================================================================
242  {
243  if ( i >= m_DIM )
244  {
245  const AbsFunction& aux = GaudiMath::Constant( 0 , m_DIM ) ;
246  return Genfun::FunctionNoop( &aux ) ;
247  }
248  const AbsFunction& aux = GaudiMath::Derivative( *this , i ) ;
249  return Genfun::FunctionNoop( &aux );
250  }
251 
252  // ========================================================================
254  // ========================================================================
255  double SimpleFunction::operator() ( double value ) const
256  {
257  double result = 0 ;
258  switch ( m_case )
259  {
260  case TrivialArg :
261  result = (*m_func1) ( value ) ; break ;
262  case ArrayArg :
263  std::fill ( m_arg2 , m_arg2 + m_DIM , 0.0 );
264  m_arg2[0] = value ;
265  result = (*m_func2) ( m_arg2 ) ; break ;
266  case VectorArg :
267  std::fill ( m_arg3.begin () , m_arg3.end () , 0.0 );
268  m_arg3[0] = value ;
269  result = (*m_func3) ( m_arg3 ) ; break ;
270  default:
271  break ;
272  };
273  return result ;
274  }
275  // ========================================================================
276 
277  // ========================================================================
279  // ========================================================================
280  double SimpleFunction::operator() ( const Argument& argument ) const
281  {
282  double result = 0 ;
283  switch ( m_case )
284  {
285  case TrivialArg :
286  result = (*m_func1) ( argument[0] ) ; break ;
287  case ArrayArg :
288  for( size_t i = 0 ; i < m_DIM ; ++i ) { m_arg2[i] = argument[i] ; }
289  return (*m_func2)( m_arg2 ) ; ; break ;
290  case VectorArg :
291  for( size_t i = 0 ; i < m_DIM ; ++i ) { m_arg3[i] = argument[i] ; }
292  result = (*m_func3) ( m_arg3 ) ; break ;
293  default:
294  break ;
295  }
296  return result ;
297  }
298 
299  } // end of namespace GaudiMathImplementation
300 } // end of namespace Genfun
301 
302 
303 // ============================================================================
304 // The END
305 // ============================================================================
virtual Genfun::Derivative partial(unsigned int i) const
Derivatives.
Definition: Adapter.cpp:241
virtual double operator()(double a) const
Definition: Adapter.cpp:37
virtual ~Adapter2DoubleFunction()
virtual destructor
Definition: Adapter.cpp:75
GAUDI_API void fill(AIDA::IHistogram1D *histo, const double value, const double weight=1.0)
simple function to fill AIDA::IHistogram1D objects
Definition: Fill.cpp:37
virtual Genfun::Derivative partial(unsigned int i) const
Derivatives.
Definition: Adapter.cpp:91
virtual Genfun::Derivative partial(unsigned int i) const
Derivatives.
Definition: Adapter.cpp:50
Genfun::AbsFunction Function
Definition: GaudiMath.h:26
Genfun::GaudiMathImplementation::NumericalDerivative Derivative
Definition: GaudiMath.h:31
virtual Genfun::Derivative partial(unsigned int i) const
Derivatives.
Definition: Adapter.cpp:133
constructor from the trivial function with two argument
Definition: FunAdapters.h:91
virtual double operator()(double) const
Function value.
Definition: Adapter.cpp:255
virtual ~Adapter3DoubleFunction()
virtual destructor
Definition: Adapter.cpp:116
double(* Function3)(const std::vector< double > &)
Definition: FunAdapters.h:207
constructor from the trivial function with two argument
Definition: FunAdapters.h:154
double fun(const std::vector< double > &x)
Definition: PFuncTest.cpp:27
list i
Definition: ana.py:128
Genfun::GaudiMathImplementation::Constant Constant
Definition: GaudiMath.h:29
constructor from the IFunction ( see AIDA/IFunction.h)
Definition: FunAdapters.h:31