GeoModel - GeoModelCore
AbsFunction.h
1 //==========================================================================//
2 // Imported from the QAT library (qat.pitt.edu) by the copyright holder //
3 // Joe Boudreau. Software licensed under the terms and conditions of the //
4 // GNU Lesser Public License v3. //
5 //==========================================================================//
6 
7 //------------------------AbsFunction-----------------------------------//
8 // //
9 // AbsFunction, base class for function objects //
10 // //
11 //----------------------------------------------------------------------//
12 #ifndef AbsFunction_h
13 #define AbsFunction_h 1
14 #include "GeoGenericFunctions/Argument.h"
15 
16 namespace GeoGenfun {
17 
18  class AbsParameter;
19 
20  //-----------------------------------------------------------------------//
21  // Exact return type of arithmentic operations. To the user, the return //
22  // type is GENFUNCTION, or const AbsFunction &. //
23  //-----------------------------------------------------------------------//
24 
25  class FunctionProduct;
26  class FunctionSum;
27  class FunctionDifference;
28  class FunctionQuotient;
29  class FunctionNegation;
30  class FunctionDirectProduct;
31  class FunctionComposition;
32  class ConstPlusFunction;
33  class ConstTimesFunction;
34  class ConstMinusFunction;
35  class ConstOverFunction;
36  class FunctionPlusParameter;
37  class FunctionTimesParameter;
38  class FunctionNumDeriv;
39  class Variable;
40  class FunctionNoop;
41  class ParameterComposition;
42 
43  typedef FunctionNoop Derivative;
44 
45  class AbsFunction {
46 
47  public:
48 
49  // Default Constructor
50  AbsFunction();
51 
52  // Copy Constructor:
53  AbsFunction(const AbsFunction &right);
54 
55  // Destructor
56  virtual ~AbsFunction();
57 
58  // Function value: N-dimensional functions must override these:
59  virtual unsigned int dimensionality() const ; // returns 1;
60 
61  // Function value
62  virtual double operator() (double argument) const=0;
63  virtual double operator() (const Argument &argument) const=0;
64 
65  // Every function must override this:
66  virtual AbsFunction * clone() const=0;
67 
68  // Function composition. Do not attempt to override:
69  virtual FunctionComposition operator () (const AbsFunction &f) const;
70 
71  // Parameter composition. Do not attempt to override:
72  virtual ParameterComposition operator() ( const AbsParameter &p) const;
73 
74  // Derivative, (All functions) (do not override)
75  Derivative partial(const Variable &v) const;
76 
77  // Derivative (1D functions only) (do not override)
78  Derivative prime() const;
79 
80  // Does this function have an analytic derivative?
81  virtual bool hasAnalyticDerivative() const {return false;}
82 
83  // Derivative. Overriders may be provided, numerical method by default!
84  virtual Derivative partial(unsigned int) const;
85 
86  private:
87 
88  // It is illegal to assign a function.
89  const AbsFunction & operator=(const AbsFunction &right);
90 
91  };
92 
93 FunctionProduct operator * (const AbsFunction &op1, const AbsFunction &op2);
94 FunctionSum operator + (const AbsFunction &op1, const AbsFunction &op2);
95 FunctionDifference operator - (const AbsFunction &op1, const AbsFunction &op2);
96 FunctionQuotient operator / (const AbsFunction &op1, const AbsFunction &op2);
97 FunctionNegation operator - (const AbsFunction &op1);
98 
99 ConstTimesFunction operator * (double c, const AbsFunction &op2);
100 ConstPlusFunction operator + (double c, const AbsFunction &op2);
101 ConstMinusFunction operator - (double c, const AbsFunction &op2);
102 ConstOverFunction operator / (double c, const AbsFunction &op2);
103 
104 ConstTimesFunction operator * (const AbsFunction &op2, double c);
105 ConstPlusFunction operator + (const AbsFunction &op2, double c);
106 ConstPlusFunction operator - (const AbsFunction &op2, double c);
107 ConstTimesFunction operator / (const AbsFunction &op2, double c);
108 
109 FunctionTimesParameter operator * (const AbsFunction &op1, const AbsParameter &op2);
110 FunctionPlusParameter operator + (const AbsFunction &op1, const AbsParameter &op2);
111 FunctionPlusParameter operator - (const AbsFunction &op1, const AbsParameter &op2);
112 FunctionTimesParameter operator / (const AbsFunction &op1, const AbsParameter &op2);
113 
114 FunctionTimesParameter operator * (const AbsParameter &op1, const AbsFunction &op2);
115 FunctionPlusParameter operator + (const AbsParameter &op1, const AbsFunction &op2);
116 FunctionPlusParameter operator - (const AbsParameter &op1, const AbsFunction &op2);
117 FunctionTimesParameter operator / (const AbsParameter &op1, const AbsFunction &op2);
118 
119 FunctionDirectProduct operator % (const AbsFunction &op1, const AbsFunction &op2);
120 
121 typedef const AbsFunction & GENFUNCTION;
122 
123 } // namespace GeoGenfun
124 
125 
126 #define FUNCTION_OBJECT_DEF(classname) \
127 public: \
128  using AbsFunction::operator(); \
129  virtual classname *clone() const override; \
130 private:
131 
132 //----------------------------------------------------------------------------
133 //
134 // This macro implements the ugly boilerplate
135 //
136 
137 #define FUNCTION_OBJECT_IMP(classname) \
138 classname *classname::clone() const \
139 { \
140  return new classname(*this); \
141 }
142 
143 
144 #define FUNCTION_OBJECT_IMP_INLINE(classname) \
145 inline classname *classname::clone() const \
146 { \
147  return new classname(*this); \
148 }
149 
150 
151 //----------------------------------------------------------------------------
152 
153 
154 #include "GeoGenericFunctions/FunctionProduct.h"
155 #include "GeoGenericFunctions/FunctionSum.h"
156 #include "GeoGenericFunctions/FunctionDifference.h"
157 #include "GeoGenericFunctions/FunctionQuotient.h"
158 #include "GeoGenericFunctions/FunctionNegation.h"
159 #include "GeoGenericFunctions/FunctionDirectProduct.h"
160 #include "GeoGenericFunctions/FunctionComposition.h"
161 #include "GeoGenericFunctions/ConstPlusFunction.h"
162 #include "GeoGenericFunctions/ConstTimesFunction.h"
163 #include "GeoGenericFunctions/ConstMinusFunction.h"
164 #include "GeoGenericFunctions/ConstOverFunction.h"
165 #include "GeoGenericFunctions/FunctionPlusParameter.h"
166 #include "GeoGenericFunctions/FunctionTimesParameter.h"
167 #include "GeoGenericFunctions/FunctionNoop.h"
168 #include "GeoGenericFunctions/ParameterComposition.h"
169 
170 #endif
Definition: Abs.h:15