GCOP
1.0
|
00001 #ifndef GCOP_MULTICOST_H 00002 #define GCOP_MULTICOST_H 00003 00004 #include <Eigen/Dense> 00005 #include <iostream> 00006 #include "cost.h" 00007 00008 namespace gcop { 00009 00010 using namespace Eigen; 00011 using namespace std; 00012 00024 template <typename T, 00025 int _nx = Dynamic, 00026 int _nu = Dynamic, 00027 int _np = Dynamic> class MultiCost : public Cost<T, _nx, _nu, _np> { 00028 public: 00029 00030 typedef Matrix<double, _nx, 1> Vectornd; 00031 typedef Matrix<double, _nu, 1> Vectorcd; 00032 typedef Matrix<double, _np, 1> Vectormd; 00033 00034 typedef Matrix<double, _nx, _nx> Matrixnd; 00035 typedef Matrix<double, _nx, _nu> Matrixncd; 00036 typedef Matrix<double, _nu, _nx> Matrixcnd; 00037 typedef Matrix<double, _nu, _nu> Matrixcd; 00038 00039 // typedef Matrix<double, Dynamic, 1> Vectormd; 00040 typedef Matrix<double, _np, _np> Matrixmd; 00041 typedef Matrix<double, _nx, _np> Matrixnmd; 00042 typedef Matrix<double, _np, _nx> Matrixmnd; 00043 00049 MultiCost(System<T, _nx, _nu, _np> &sys, double tf); 00050 00063 virtual double L(double t, const T &x, const Vectorcd &u, double h, 00064 const Vectormd *p = 0, 00065 Vectornd *Lx = 0, Matrixnd* Lxx = 0, 00066 Vectorcd *Lu = 0, Matrixcd* Luu = 0, 00067 Matrixncd *Lxu = 0, 00068 Vectormd *Lp = 0, Matrixmd *Lpp = 0, 00069 Matrixmnd *Lpx = 0); 00070 00071 Vectornd Lx; 00072 Matrixnd Lxx; 00073 Vectorcd Lu; 00074 Matrixcd Luu; 00075 Matrixncd Lxu; 00076 Vectormd Lp; 00077 Matrixmd Lpp; 00078 Matrixmnd Lpx; 00079 00080 vector<Cost<T, _nx, _nu, _np>* > costs; 00081 }; 00082 00083 00084 template <typename T, int _nx, int _nu, int _np> 00085 MultiCost<T, _nx, _nu, _np>::MultiCost(System<T, _nx, _nu, _np> &sys, 00086 double tf) : Cost<T, _nx, _nu, _np>(sys, tf) { 00087 if (_nx == Dynamic) { 00088 Lx.resize(sys.X.n); 00089 Lxx.resize(sys.X.n, sys.U.n); 00090 Lxu.resize(sys.X.n, sys.U.n); 00091 Lpx.resize(sys.P.n, sys.X.n); 00092 } 00093 if (_nu == Dynamic) { 00094 Lu.resize(sys.U.n); 00095 Luu.resize(sys.U.n, sys.U.n); 00096 } 00097 if (_np == Dynamic) { 00098 Lp.resize(sys.P.n); 00099 Lpp.resize(sys.P.n, sys.P.n); 00100 } 00101 } 00102 00103 template <typename T, int _nx, int _nu, int _np> 00104 double MultiCost<T, _nx, _nu, _np>::L(double t, const T& x, const Vectorcd& u, double h, 00105 const Vectormd *p, 00106 Matrix<double, _nx, 1> *Lx, Matrix<double, _nx, _nx>* Lxx, 00107 Matrix<double, _nu, 1> *Lu, Matrix<double, _nu, _nu>* Luu, 00108 Matrix<double, _nx, _nu> *Lxu, 00109 Vectormd *Lp, Matrixmd *Lpp, 00110 Matrixmnd *Lpx) { 00111 double c = 0; 00112 if (Lx) 00113 Lx->setZero(); 00114 if (Lxx) 00115 Lxx->setZero(); 00116 if (Lu) 00117 Lu->setZero(); 00118 if (Luu) 00119 Luu->setZero(); 00120 if (Lxu) 00121 Lxu->setZero(); 00122 if (Lp) 00123 Lp->setZero(); 00124 if (Lpp) 00125 Lpp->setZero(); 00126 if (Lpx) 00127 Lpx->setZero(); 00128 00129 for (int i = 0; i < costs.size(); ++i) { 00130 c = c + costs[i]->L(t, x, u, h, p, 00131 (Lx ? &this->Lx : 0), 00132 (Lxx ? &this->Lxx : 0), 00133 Lu ? &this->Lu : 0, 00134 Luu ? &this->Luu : 0, 00135 Lxu ? &this->Lxu : 0, 00136 Lp ? &this->Lp : 0, 00137 Lpp ? &this->Lpp : 0, 00138 Lpx ? &this->Lpx : 0); 00139 if (Lx) 00140 *Lx = *Lx + this->Lx; 00141 if (Lxx) 00142 *Lxx = *Lxx + this->Lxx; 00143 if (Lu) 00144 *Lu = *Lu + this->Lu; 00145 if (Luu) 00146 *Luu = *Luu + this->Luu; 00147 if (Lxu) 00148 *Lxu = *Lxu + this->Lxu; 00149 if (Lp) 00150 *Lp = *Lp + this->Lp; 00151 if (Lpp) 00152 *Lpp = *Lpp + this->Lpp; 00153 if (Lpx) 00154 *Lpx = *Lpx + this->Lpx; 00155 } 00156 return c; 00157 } 00158 } 00159 00160 #endif