Couenne  0.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CouenneFunTriplets.hpp
Go to the documentation of this file.
1 /* $Id: CouenneFunTriplets.hpp 940 2013-01-13 19:49:02Z pbelotti $
2  *
3  * Name: funtriplets.hpp
4  * Author: Pietro Belotti
5  * Purpose: class for representing a function and its first- and second-order derivative
6  *
7  * (C) Carnegie-Mellon University, 2007-10
8  * This file is licensed under the Eclipse Public License (EPL)
9  */
10 
11 #ifndef Funtriplets_hpp
12 #define Funtriplets_hpp
13 
14 #include <math.h>
15 
16 #include "CouenneExprPow.hpp"
17 
18 namespace Couenne
19 {
20 
22 class funtriplet {
23 
24 public:
25 
27  funtriplet () {}
28 
30  virtual ~funtriplet () {}
31 
32  virtual CouNumber F (CouNumber x) = 0; //< main funtion
33  virtual CouNumber Fp (CouNumber x) = 0; //< first-order derivative of main funtion
34  virtual CouNumber Fpp (CouNumber x) = 0; //< second-order derivative of main funtion
35  virtual CouNumber FpInv (CouNumber x) = 0; //< inverse of the first-order derivative
36 };
37 
38 
40 class simpletriplet: public funtriplet {
41 
42 protected:
43 
44  unary_function f_; //< the function
45  unary_function fp_; //< the first-order derivative
46  unary_function fpp_; //< the second-order derivative
47  unary_function fpI_; //< the inverse of the first-order derivative
48 
49 public:
50 
53  unary_function fp = NULL,
54  unary_function fpp = NULL,
55  unary_function fpI = NULL):
56  f_ (f),
57  fp_ (fp),
58  fpp_ (fpp),
59  fpI_ (fpI) {}
60 
62  virtual ~simpletriplet () {}
63 
64  virtual CouNumber F (CouNumber x) {return f_ (x);} //< main funtion
65  virtual CouNumber Fp (CouNumber x) {return fp_ (x);} //< first-order derivative
66  virtual CouNumber Fpp (CouNumber x) {return fpp_ (x);} //< second-order derivative
67  virtual CouNumber FpInv (CouNumber x) {return fpI_ (x);} //< inverse of first-order derivative
68 };
69 
70 
72 class powertriplet: public funtriplet {
73 
74 protected:
75 
76  CouNumber exponent_; //< defines the power function triplet
77  bool issignpower_; //< determines if signed power
78 
79 public:
80 
82  powertriplet (CouNumber exponent, bool signpower = false):
83  exponent_ (exponent), issignpower_ (signpower) {}
84 
86  virtual ~powertriplet () {}
87 
88  virtual CouNumber F (CouNumber x)
89  {return safe_pow (x, exponent_, issignpower_);} //< main funtion
90 
91  virtual CouNumber Fp (CouNumber x)
92  {return exponent_ * safe_pow (issignpower_ ? fabs(x) : x, exponent_ - 1);} //< first-order derivative
93 
94  virtual CouNumber Fpp (CouNumber x)
95  {return exponent_ * (exponent_ - 1) * safe_pow (x, exponent_ - 2, issignpower_);} //< second-order derivative
96 
97  virtual CouNumber FpInv (CouNumber x)
98  {return safe_pow (x / exponent_, 1 / (exponent_ - 1), issignpower_);} //< inverse of first derivative
99 };
100 
101 
104 
105 protected:
106 
107  CouNumber mult_; //< pre-multiplier
108 
109 public:
110 
113  powertriplet (exponent),
114  mult_ (k) {}
115 
117  virtual ~kpowertriplet () {}
118 
119  virtual CouNumber F (CouNumber x) //< main funtion
120  {return mult_ * safe_pow (x, exponent_);}
121 
122  virtual CouNumber Fp (CouNumber x) //< first-order derivative
123  {return mult_ * exponent_ * safe_pow (x, exponent_ - 1);}
124 
125  virtual CouNumber Fpp (CouNumber x) //< second-order derivative
126  {return mult_ * exponent_ * (exponent_ - 1) * safe_pow (x, exponent_ - 2);}
127 
128  virtual CouNumber FpInv (CouNumber x)
129  {return safe_pow (x / (mult_ * exponent_), 1 / (exponent_ - 1));} //< inverse of first derivative
130 };
131 
132 }
133 #endif
virtual CouNumber Fpp(CouNumber x)
virtual CouNumber F(CouNumber x)=0
kpowertriplet(CouNumber exponent, CouNumber k)
Basic constructor.
virtual ~simpletriplet()
Destructor.
virtual CouNumber Fp(CouNumber x)
virtual ~funtriplet()
Destructor.
virtual CouNumber FpInv(CouNumber x)
virtual CouNumber Fpp(CouNumber x)=0
virtual CouNumber Fpp(CouNumber x)
virtual CouNumber Fpp(CouNumber x)
virtual CouNumber Fp(CouNumber x)
powertriplet(CouNumber exponent, bool signpower=false)
Basic constructor.
virtual CouNumber FpInv(CouNumber x)
virtual CouNumber Fp(CouNumber x)
CouNumber(* unary_function)(CouNumber)
unary function, used in all exprUnary
simpletriplet(unary_function f=NULL, unary_function fp=NULL, unary_function fpp=NULL, unary_function fpI=NULL)
Basic constructor.
virtual ~powertriplet()
Destructor.
virtual CouNumber F(CouNumber x)
double CouNumber
main number type in Couenne
virtual ~kpowertriplet()
Destructor.
virtual CouNumber Fp(CouNumber x)=0
funtriplet()
Basic constructor.
CouNumber safe_pow(CouNumber base, CouNumber exponent, bool signpower=false)
compute power and check for integer-and-odd inverse exponent
virtual CouNumber F(CouNumber x)
virtual CouNumber FpInv(CouNumber x)=0
virtual CouNumber F(CouNumber x)
virtual CouNumber FpInv(CouNumber x)