00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef FN_H
00013 #define FN_H
00014
00015 #include "../base/bdmbase.h"
00016
00017 namespace bdm {
00018
00020 class constfn : public fnc {
00022 vec val;
00023
00024 public:
00025
00027 vec eval ( const vec &cond ) {
00028 return val;
00029 };
00031 constfn ( const vec &val0 ) : fnc(), val ( val0 ) {
00032 dimy = val.length();
00033 };
00034 };
00035
00037 class linfn: public fnc {
00039 RV rv;
00041 mat A;
00043 vec B;
00044 public :
00045 vec eval ( const vec &cond ) {
00046 it_assert_debug ( cond.length() == A.cols(), "linfn::eval Wrong cond." );
00047 return A*cond + B;
00048 };
00049
00050
00052 linfn ( ) : fnc(), A ( ), B () { };
00054 void set_parameters ( const mat &A0 , const vec &B0 ) {
00055 A = A0;
00056 B = B0;
00057 dimy = A.rows();
00058 };
00059 };
00060
00061
00071 class diffbifn: public fnc {
00072 protected:
00074 RV rvx;
00076 RV rvu;
00078 int dimx;
00080 int dimu;
00081 public:
00083 vec eval ( const vec &cond ) {
00084 it_assert_debug ( cond.length() == ( dimx + dimu ), "linfn::eval Wrong cond." );
00085 return eval ( cond ( 0, dimx - 1 ), cond ( dimx, dimx + dimu - 1 ) );
00086 };
00087
00089 virtual vec eval ( const vec &x0, const vec &u0 ) {
00090 return zeros ( dimy );
00091 };
00093 virtual void dfdx_cond ( const vec &x0, const vec &u0, mat &A , bool full = true ) {};
00095 virtual void dfdu_cond ( const vec &x0, const vec &u0, mat &A, bool full = true ) {};
00097 diffbifn () : fnc() {};
00099 int _dimx() const {
00100 return dimx;
00101 }
00103 int _dimu() const {
00104 return dimu;
00105 }
00106 };
00107
00109
00110 class bilinfn: public diffbifn {
00111 mat A;
00112 mat B;
00113 public :
00116
00117 bilinfn () : diffbifn () , A() , B() {};
00118 bilinfn ( const mat A0, const mat B0 ) {
00119 set_parameters ( A0, B0 );
00120 };
00122 void set_parameters ( const mat A0, const mat B0 ) {
00123 it_assert_debug ( A0.rows() == B0.rows(), "" );
00124 A = A0;
00125 B = B0;
00126 dimy = A.rows();
00127 dimx = A.cols();
00128 dimu = B.cols();
00129 }
00131
00134 inline vec eval ( const vec &x0, const vec &u0 ) {
00135 it_assert_debug ( x0.length() == dimx, "linfn::eval Wrong xcond." );
00136 it_assert_debug ( u0.length() == dimu, "linfn::eval Wrong ucond." );
00137 return A*x0 + B*u0;
00138 }
00139
00140 void dfdx_cond ( const vec &x0, const vec &u0, mat &F, bool full ) {
00141 it_assert_debug ( ( F.cols() == A.cols() ) & ( F.rows() == A.rows() ), "Allocated F is not compatible." );
00142 if ( full ) F = A;
00143 }
00145 void dfdu_cond ( const vec &x0, const vec &u0, mat &F, bool full = true ) {
00146 it_assert_debug ( ( F.cols() == B.cols() ) & ( F.rows() == B.rows() ), "Allocated F is not compatible." );
00147 if ( full ) F = B;
00148 }
00150 };
00151
00152 }
00153 #endif // FN_H