00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef Funtriplets_hpp
00012 #define Funtriplets_hpp
00013
00014 #include <math.h>
00015
00016 #include "CouenneExprPow.hpp"
00017
00018 namespace Couenne
00019 {
00020
00022 class funtriplet {
00023
00024 public:
00025
00027 funtriplet () {}
00028
00030 virtual ~funtriplet () {}
00031
00032 virtual CouNumber F (CouNumber x) = 0;
00033 virtual CouNumber Fp (CouNumber x) = 0;
00034 virtual CouNumber Fpp (CouNumber x) = 0;
00035 virtual CouNumber FpInv (CouNumber x) = 0;
00036 };
00037
00038
00040 class simpletriplet: public funtriplet {
00041
00042 protected:
00043
00044 unary_function f_;
00045 unary_function fp_;
00046 unary_function fpp_;
00047 unary_function fpI_;
00048
00049 public:
00050
00052 simpletriplet (unary_function f = NULL,
00053 unary_function fp = NULL,
00054 unary_function fpp = NULL,
00055 unary_function fpI = NULL):
00056 f_ (f),
00057 fp_ (fp),
00058 fpp_ (fpp),
00059 fpI_ (fpI) {}
00060
00062 virtual ~simpletriplet () {}
00063
00064 virtual CouNumber F (CouNumber x) {return f_ (x);}
00065 virtual CouNumber Fp (CouNumber x) {return fp_ (x);}
00066 virtual CouNumber Fpp (CouNumber x) {return fpp_ (x);}
00067 virtual CouNumber FpInv (CouNumber x) {return fpI_ (x);}
00068 };
00069
00070
00072 class powertriplet: public funtriplet {
00073
00074 protected:
00075
00076 CouNumber exponent_;
00077
00078 public:
00079
00081 powertriplet (CouNumber exponent):
00082 exponent_ (exponent) {}
00083
00085 virtual ~powertriplet () {}
00086
00087 virtual CouNumber F (CouNumber x)
00088 {return safe_pow (x, exponent_);}
00089
00090 virtual CouNumber Fp (CouNumber x)
00091 {return exponent_ * safe_pow (x, exponent_ - 1);}
00092
00093 virtual CouNumber Fpp (CouNumber x)
00094 {return exponent_ * (exponent_ - 1) * safe_pow (x, exponent_ - 2);}
00095
00096 virtual CouNumber FpInv (CouNumber x)
00097 {return safe_pow (x / exponent_, 1 / (exponent_ - 1));}
00098 };
00099
00100
00102 class kpowertriplet: public powertriplet {
00103
00104 protected:
00105
00106 CouNumber mult_;
00107
00108 public:
00109
00111 kpowertriplet (CouNumber exponent, CouNumber k):
00112 powertriplet (exponent),
00113 mult_ (k) {}
00114
00116 virtual ~kpowertriplet () {}
00117
00118 virtual CouNumber F (CouNumber x)
00119 {return mult_ * safe_pow (x, exponent_);}
00120
00121 virtual CouNumber Fp (CouNumber x)
00122 {return mult_ * exponent_ * safe_pow (x, exponent_ - 1);}
00123
00124 virtual CouNumber Fpp (CouNumber x)
00125 {return mult_ * exponent_ * (exponent_ - 1) * safe_pow (x, exponent_ - 2);}
00126
00127 virtual CouNumber FpInv (CouNumber x)
00128 {return safe_pow (x / (mult_ * exponent_), 1 / (exponent_ - 1));}
00129 };
00130
00131 }
00132 #endif