GCOP  1.0
multicost.h
Go to the documentation of this file.
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