/home/coin/SVN-release/OS-2.4.1/Couenne/src/util/CouenneFunTriplets.hpp

Go to the documentation of this file.
00001 /* $Id: CouenneFunTriplets.hpp 490 2011-01-14 16:07:12Z pbelotti $
00002  *
00003  * Name:    funtriplets.hpp
00004  * Author:  Pietro Belotti
00005  * Purpose: class for representing a function and its first- and second-order derivative
00006  *
00007  * (C) Carnegie-Mellon University, 2007-10
00008  * This file is licensed under the Eclipse Public License (EPL)
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; //< main funtion
00033   virtual CouNumber Fp    (CouNumber x) = 0; //< first-order derivative of main funtion
00034   virtual CouNumber Fpp   (CouNumber x) = 0; //< second-order derivative of main funtion
00035   virtual CouNumber FpInv (CouNumber x) = 0; //< inverse of the first-order derivative
00036 };
00037 
00038 
00040 class simpletriplet: public funtriplet {
00041 
00042 protected:
00043 
00044   unary_function f_;   //< the function 
00045   unary_function fp_;  //< the first-order derivative
00046   unary_function fpp_; //< the second-order derivative 
00047   unary_function fpI_; //< the inverse of the first-order derivative 
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);} //< main funtion
00065   virtual CouNumber Fp    (CouNumber x) {return fp_  (x);} //< first-order derivative
00066   virtual CouNumber Fpp   (CouNumber x) {return fpp_ (x);} //< second-order derivative
00067   virtual CouNumber FpInv (CouNumber x) {return fpI_ (x);} //< inverse of first-order derivative
00068 };
00069 
00070 
00072 class powertriplet: public funtriplet {
00073 
00074 protected:
00075 
00076   CouNumber exponent_; //< defines the power function triplet
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_);}                                   //< main funtion
00089 
00090   virtual CouNumber Fp  (CouNumber x) 
00091   {return exponent_ * safe_pow (x, exponent_ - 1);}                   //< first-order derivative 
00092 
00093   virtual CouNumber Fpp (CouNumber x) 
00094   {return exponent_ * (exponent_ - 1) * safe_pow (x, exponent_ - 2);} //< second-order derivative 
00095 
00096   virtual CouNumber FpInv (CouNumber x) 
00097   {return safe_pow (x / exponent_, 1 / (exponent_ - 1));} //< inverse of first derivative
00098 };
00099 
00100 
00102 class kpowertriplet: public powertriplet {
00103 
00104 protected:
00105 
00106   CouNumber mult_; //< pre-multiplier
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)  //< main funtion
00119   {return mult_ * safe_pow (x, exponent_);}
00120 
00121   virtual CouNumber Fp  (CouNumber x)  //< first-order derivative 
00122   {return mult_ * exponent_ * safe_pow (x, exponent_ - 1);}
00123 
00124   virtual CouNumber Fpp (CouNumber x)  //< second-order derivative 
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));} //< inverse of first derivative
00129 };
00130 
00131 }
00132 #endif

Generated on Thu Nov 10 03:05:46 2011 by  doxygen 1.4.7