00001 
00013 #ifndef DC_H
00014 #define DC_H
00015 
00016 
00017 #include "../itpp_ext.h"
00018 
00019 namespace bdm
00020 {
00021 
00022 using namespace itpp;
00023 
00025 void dydr ( double * r, double *f, double *Dr, double *Df, double *R, int jl, int jh, double *kr, int m, int mx );
00026 
00028 
00029 mat ltuinv ( const mat &L );
00030 
00035 class sqmat {
00036 public:
00044         virtual void opupdt ( const vec &v, double w ) = 0;
00045 
00049         virtual mat to_mat() const = 0;
00050 
00054         virtual void mult_sym ( const mat &C ) = 0;
00055 
00059         virtual void mult_sym_t ( const mat &C ) = 0;
00060 
00061 
00066         virtual double logdet() const = 0;
00067 
00073         virtual vec sqrt_mult ( const vec &v ) const = 0;
00074 
00079         virtual double qform ( const vec &v ) const = 0;
00080 
00085         virtual double invqform ( const vec &v ) const = 0;
00086 
00087 
00088 
00089 
00091         virtual void clear() = 0;
00092 
00094         int cols() const {
00095                 return dim;
00096         };
00097 
00099         int rows() const {
00100                 return dim;
00101         };
00102 
00104         virtual ~sqmat() {};
00106         sqmat ( const int dim0 ) : dim ( dim0 ) {};
00108         sqmat() : dim ( 0 ) {};
00109 protected:
00111         int dim;
00112 };
00113 
00114 
00119 class fsqmat: public sqmat {
00120 protected:
00122         mat M;
00123 public:
00124         void opupdt ( const vec &v, double w );
00125         mat to_mat() const;
00126         void mult_sym ( const mat &C );
00127         void mult_sym_t ( const mat &C );
00129         void mult_sym ( const mat &C, fsqmat &U ) const;
00131         void mult_sym_t ( const mat &C, fsqmat &U ) const;
00132         void clear();
00133 
00135         fsqmat() {}; 
00137         fsqmat ( const int dim0 ); 
00139         fsqmat ( const mat &M );
00141         fsqmat ( const fsqmat &M, const ivec &perm ) : sqmat ( M.rows() ) {
00142                 it_error ( "not implemneted" );
00143         };
00145         fsqmat ( const vec &d ) : sqmat ( d.length() ) {
00146                 M = diag ( d );
00147         };
00148 
00150         virtual ~fsqmat() {};
00151 
00152 
00158         void inv ( fsqmat &Inv ) const;
00159 
00160         double logdet() const {
00161                 return log ( det ( M ) );
00162         };
00163         double qform ( const  vec &v ) const {
00164                 return ( v* ( M*v ) );
00165         };
00166         double invqform ( const  vec &v ) const {
00167                 return ( v* ( itpp::inv ( M ) *v ) );
00168         };
00169         vec sqrt_mult ( const vec &v ) const {
00170                 mat Ch = chol ( M );
00171                 return Ch*v;
00172         };
00173 
00175         void add ( const fsqmat &fsq2, double w = 1.0 ) {
00176                 M += fsq2.M;
00177         };
00178 
00180         void setD ( const vec &nD ) {
00181                 M = diag ( nD );
00182         }
00184         vec getD () {
00185                 return diag ( M );
00186         }
00188         void setD ( const vec &nD, int i ) {
00189                 for ( int j = i; j < nD.length(); j++ ) {
00190                         M ( j, j ) = nD ( j - i );    
00191                 }
00192         }
00193 
00194 
00196         fsqmat& operator += ( const fsqmat &A ) {
00197                 M += A.M;
00198                 return *this;
00199         };
00201         fsqmat& operator -= ( const fsqmat &A ) {
00202                 M -= A.M;
00203                 return *this;
00204         };
00206         fsqmat& operator *= ( double x ) {
00207                 M *= x;
00208                 return *this;
00209         };
00210 
00212         friend std::ostream &operator<< ( std::ostream &os, const fsqmat &sq );
00213 
00214 };
00215 
00221 class ldmat: public sqmat {
00222 public:
00224         ldmat ( const mat &L, const vec &D );
00226         ldmat ( const mat &V );
00228         ldmat ( const ldmat &V0, const ivec &perm ) : sqmat ( V0.rows() ) {
00229                 ldform ( V0.L.get_cols ( perm ), V0.D );
00230         };
00232         ldmat ( vec D0 );
00234         ldmat ();
00236         ldmat ( const int dim0 );
00237 
00239         virtual ~ldmat() {};
00240 
00241         
00242 
00243         void opupdt ( const vec &v, double w );
00244         mat to_mat() const;
00245         void mult_sym ( const mat &C );
00246         void mult_sym_t ( const mat &C );
00248         void add ( const ldmat &ld2, double w = 1.0 );
00249         double logdet() const;
00250         double qform ( const vec &v ) const;
00251         double invqform ( const vec &v ) const;
00252         void clear();
00253         vec sqrt_mult ( const vec &v ) const;
00254 
00255 
00259         void inv ( ldmat &Inv ) const;
00260 
00265         void mult_sym ( const mat &C, ldmat &U ) const;
00266 
00271         void mult_sym_t ( const mat &C, ldmat &U ) const;
00272 
00273 
00280         void ldform ( const mat &A, const vec &D0 );
00281 
00283         void setD ( const vec &nD ) {
00284                 D = nD;
00285         }
00287         void setD ( const vec &nD, int i ) {
00288                 D.replace_mid ( i, nD );    
00289         }
00291         void setL ( const vec &nL ) {
00292                 L = nL;
00293         }
00294 
00296         const vec& _D() const {
00297                 return D;
00298         }
00300         const mat& _L() const {
00301                 return L;
00302         }
00303 
00305         ldmat& operator += ( const ldmat &ldA );
00307         ldmat& operator -= ( const ldmat &ldA );
00309         ldmat& operator *= ( double x );
00310 
00312         friend std::ostream &operator<< ( std::ostream &os, const ldmat &sq );
00313 
00314 protected:
00316         vec D;
00318         mat L;
00319 
00320 };
00321 
00324 inline ldmat& ldmat::operator += ( const ldmat & ldA )  {
00325         this->add ( ldA );
00326         return *this;
00327 }
00329 inline ldmat& ldmat::operator -= ( const ldmat & ldA )  {
00330         this->add ( ldA, -1.0 );
00331         return *this;
00332 }
00333 
00334 }
00335 
00336 #endif // DC_H