Couenne 0.5.8
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
18namespace Couenne
19{
20
23
24public:
25
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
41
42protected:
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
49public:
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
72class powertriplet: public funtriplet {
73
74protected:
75
76 CouNumber exponent_; //< defines the power function triplet
77 bool issignpower_; //< determines if signed power
78
79public:
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
98 {return safe_pow (x / exponent_, 1 / (exponent_ - 1), issignpower_);} //< inverse of first derivative
99};
100
101
104
105protected:
106
107 CouNumber mult_; //< pre-multiplier
108
109public:
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
129 {return safe_pow (x / (mult_ * exponent_), 1 / (exponent_ - 1));} //< inverse of first derivative
130};
131
132}
133#endif
virtual ~funtriplet()
Destructor.
funtriplet()
Basic constructor.
virtual CouNumber Fp(CouNumber x)=0
virtual CouNumber F(CouNumber x)=0
virtual CouNumber FpInv(CouNumber x)=0
virtual CouNumber Fpp(CouNumber x)=0
virtual CouNumber Fpp(CouNumber x)
virtual CouNumber FpInv(CouNumber x)
virtual CouNumber Fp(CouNumber x)
virtual ~kpowertriplet()
Destructor.
kpowertriplet(CouNumber exponent, CouNumber k)
Basic constructor.
virtual CouNumber F(CouNumber x)
powertriplet(CouNumber exponent, bool signpower=false)
Basic constructor.
virtual CouNumber FpInv(CouNumber x)
virtual ~powertriplet()
Destructor.
virtual CouNumber Fpp(CouNumber x)
virtual CouNumber F(CouNumber x)
virtual CouNumber Fp(CouNumber x)
virtual CouNumber FpInv(CouNumber x)
simpletriplet(unary_function f=NULL, unary_function fp=NULL, unary_function fpp=NULL, unary_function fpI=NULL)
Basic constructor.
virtual CouNumber Fp(CouNumber x)
virtual CouNumber F(CouNumber x)
virtual CouNumber Fpp(CouNumber x)
virtual ~simpletriplet()
Destructor.
general include file for different compilers
CouNumber safe_pow(CouNumber base, CouNumber exponent, bool signpower=false)
compute power and check for integer-and-odd inverse exponent
double CouNumber
main number type in Couenne
CouNumber(* unary_function)(CouNumber)
unary function, used in all exprUnary