00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 #ifndef FN_H
00013 #define FN_H
00014 
00015 #include "../bdmerror.h"
00016 #include "../base/bdmbase.h"
00017 
00018 namespace bdm {
00019 
00021 class constfn : public fnc {
00023         vec val;
00024 
00025 public:
00026         
00028         vec eval ( const vec &cond ) {
00029                 return val;
00030         };
00032         constfn ( const vec &val0 ) : fnc(), val ( val0 ) {
00033                 dimy = val.length();
00034         };
00035 };
00036 
00038 class linfn: public fnc {
00040         RV rv;
00042         mat A;
00044         vec B;
00045 public :
00046         vec eval ( const vec &cond ) {
00047                 bdm_assert_debug ( cond.length() == A.cols(), "linfn::eval Wrong cond." );
00048                 return A * cond + B;
00049         }
00050 
00051 
00053         linfn ( ) : fnc(), A ( ), B () { };
00055         void set_parameters ( const mat &A0 , const vec &B0 ) {
00056                 A = A0;
00057                 B = B0;
00058                 dimy = A.rows();
00059         };
00060 };
00061 
00062 
00072 class diffbifn: public fnc {
00073 protected:
00075         RV rvx;
00077         RV rvu;
00079         int dimx;
00081         int dimu;
00082 public:
00084         vec eval ( const vec &cond ) {
00085                 bdm_assert_debug ( cond.length() == ( dimx + dimu ), "linfn::eval Wrong cond." );
00086                 return eval ( cond ( 0, dimx - 1 ), cond ( dimx, dimx + dimu - 1 ) );
00087         }
00088 
00090         virtual vec eval ( const vec &x0, const vec &u0 ) {
00091                 return zeros ( dimy );
00092         };
00094         virtual void dfdx_cond ( const vec &x0, const vec &u0, mat &A , bool full = true ) {};
00096         virtual void dfdu_cond ( const vec &x0, const vec &u0, mat &A, bool full = true ) {};
00098         diffbifn () : fnc() {};
00100         int _dimx() const {
00101                 return dimx;
00102         }
00104         int _dimu() const {
00105                 return dimu;
00106         }
00107 };
00108 
00110 
00111 class bilinfn: public diffbifn {
00112         mat A;
00113         mat B;
00114 public :
00117 
00118         bilinfn () : diffbifn (), A(), B() { }
00119 
00120         bilinfn ( const mat &A0, const mat &B0 ) {
00121                 set_parameters ( A0, B0 );
00122         }
00123 
00125         void set_parameters ( const mat &A0, const mat &B0 ) {
00126                 bdm_assert ( A0.rows() == B0.rows(), "bilinfn matrices must have the same number of rows" );
00127                 A = A0;
00128                 B = B0;
00129                 dimy = A.rows();
00130                 dimx = A.cols();
00131                 dimu = B.cols();
00132         }
00134 
00137         inline vec eval ( const  vec &x0, const vec &u0 ) {
00138                 bdm_assert_debug ( x0.length() == dimx, "bilinfn::eval Wrong xcond." );
00139                 bdm_assert_debug ( u0.length() == dimu, "bilinfn::eval Wrong ucond." );
00140                 return A*x0 + B*u0;
00141         }
00142 
00143         void dfdx_cond ( const vec &x0, const vec &u0, mat &F, bool full ) {
00144                 bdm_assert_debug ( ( F.cols() == A.cols() ) && ( F.rows() == A.rows() ), "Allocated F is not compatible." );
00145                 if ( full ) F = A;      
00146         }
00147 
00148         void dfdu_cond ( const vec &x0, const vec &u0, mat &F,  bool full = true ) {
00149                 bdm_assert_debug ( ( F.cols() == B.cols() ) && ( F.rows() == B.rows() ), "Allocated F is not compatible." );
00150                 if ( full ) F = B;      
00151         }
00153 };
00154 
00155 } 
00156 #endif // FN_H