Changeset 12

Show
Ignore:
Timestamp:
01/25/08 10:53:47 (17 years ago)
Author:
smidl
Message:

opravy v libDC (stale nefunkcni)

Files:
6 modified

Legend:

Unmodified
Added
Removed
  • Makefile

    r11 r12  
    22CPPFLAGS=-g 
    33 
    4 all: testPF 
     4all: testSmp 
    55 
    66test: test0 
     
    1313testKF: testKF.o libKF.o libBM.o libDC.o itpp_ext.o 
    1414testPF: testPF.o libPF.o libBM.o libDC.o itpp_ext.o 
    15  
    16 itpp_ext.o: itpp_ext.cpp itpp_ext.h 
     15testSmp: testSmp.o libEF.o libBM.o libDC.o itpp_ext.o 
  • libBM.cpp

    r8 r12  
    99void RV::init( ivec in_ids, Array<std::string> in_names, ivec in_sizes, ivec in_times, ivec in_obs ) { 
    1010        // 
     11        int i; 
    1112        len = in_ids.length(); 
    1213        //PRUDENT_MODE 
     
    2526        times = in_times; 
    2627        obs = in_obs; 
     28        size = 0; 
     29        for(i=0;i<len;i++){size+=sizes(i);} 
    2730}; 
    2831 
     
    3235 
    3336RV::RV () {}; 
    34  
    35 inline int RV::length () {return len;}; 
    3637 
    3738RV::RV ( ivec in_ids ) { 
     
    4849} 
    4950 
    50 RV RV::rvsubselect(ivec ind){ 
     51RV RV::subselect(ivec ind){ 
    5152        return RV(ids(ind), names(to_Arr(ind)), sizes(ind), times(ind), obs(ind)); 
    5253} 
  • libBM.h

    r8 r12  
    2525*/ 
    2626class RV { 
    27         int len; 
     27        int size,len; 
    2828        ivec ids; 
    2929        ivec sizes; 
     
    4646 
    4747        //! Return length (number of scalars) of the RV. 
    48         int length(); 
     48        int count() {return size;} 
     49        //TODO why not inline and later?? 
     50         
    4951        //! Find indexes of another rv in self 
    50         ivec rvfind(RV rv2); 
     52        ivec find(RV rv2); 
    5153        //! Add (concat) another variable to the current one 
    52         RV rvadd(RV rv2); 
     54        RV add(RV rv2); 
    5355        //! Subtract  another variable from the current one 
    54         RV rvsubt(RV rv2); 
     56        RV subt(RV rv2); 
    5557        //! Select only variables at indeces ind 
    56         RV rvsubselect(ivec ind); 
     58        RV subselect(ivec ind); 
    5759        //! Select only variables at indeces ind 
    5860        RV operator()(ivec ind); 
     
    110112}; 
    111113 
     114 
     115 
    112116#endif // BM_H 
  • libDC.cpp

    r8 r12  
    1818        D = exD; 
    1919        L = exL; 
     20        dim = exD.length(); 
    2021} 
    2122 
     
    2324        vec D ; 
    2425        mat L; 
     26        dim = 0; 
    2527} 
    2628 
     
    2830//TODO check if correct!! Based on heuristic observation of lu() 
    2931 
    30         int dim = V.cols(); 
     32        dim = V.cols(); 
    3133        it_assert_debug( dim == V.rows(),"ldmat::ldmat matrix V is not square!" ); 
    3234 
    33         mat U( dim,dim ); 
    34  
    35         L = V; //Allocate space for L 
    36         ivec p = ivec( dim ); //not clear why? 
    37  
    38         lu( V,L,U,p ); 
    39  
    40 //Now, if V is symmetric, L is what we seek and D is on diagonal of U 
    41         D = diag( U ); 
    42  
    43 //check if V was symmetric 
    44 //TODO How? norm of L-U'? 
    45 //it_assert_debug(); 
     35         
    4636} 
    4737 
     
    6252} 
    6353 
    64 std::ostream &operator<< ( std::ostream &os,  sqmat &sq ) { 
    65         os << sq.to_mat() << endl; 
     54std::ostream &operator<< ( std::ostream &os,  ldmat &ld ) { 
     55        os << "L:" << ld.L << endl; 
     56        os << "D:" << ld.D << endl; 
    6657} 
    6758 
     
    8576                } 
    8677        } 
    87         return V; 
     78        mat V2 = L.transpose()*diag( D )*L; 
     79        return V2; 
    8880} 
    8981 
     
    177169} 
    178170 
    179 ldmat& ldmat::operator *= (double x){ 
    180 int i; 
    181 for(i=0;i<D.length();i++){D(i)*=x;}; 
    182 } 
    183  
     171ldmat& ldmat::operator *= ( double x ) { 
     172        int i; 
     173        for ( i=0;i<D.length();i++ ){D( i )*=x;}; 
     174} 
     175 
     176vec ldmat::sqrt_mult( vec &x ) { 
     177        int i,j; 
     178        vec res( dim ); 
     179        double sum; 
     180        for ( i=0;i<dim;i++ ) {//for each element of result 
     181                res( i ) = 0.0; 
     182                for ( j=i;j<dim;j++ ) {//sum D(j)*L(:,i).*x 
     183                        res( i ) += sqrt( D( j ) )*L( j,i )*x( j ); 
     184                } 
     185        } 
     186        vec res2 = L.transpose()*diag( sqrt( D ) )*x; 
     187        return res2; 
     188} 
     189 
     190void ldmat::ldform( mat &A,vec &D0 ) { 
     191        int m = A.rows(); 
     192        int n = A.cols(); 
     193        int mn = (m<n) ? m :n ; 
     194 
     195        it_assert_debug( A.cols()==dim,"ldmat::ldform A is not compatible" ); 
     196        it_assert_debug( D.length()==A.rows(),"ldmat::ldform Vector D must have the length as row count of A" ); 
     197 
     198        L=concat_vertical( zeros( n,n ), diag( sqrt( D0 ) )*A ); 
     199        D=zeros( n+m ); 
     200         
     201        //unnecessary big L and D will be made smaller at the end of file 
     202         
     203        vec w=zeros( n ); 
     204        vec v; 
     205        double sum, beta, pom; 
     206 
     207        int cc=0; 
     208        int i=n; // +1 in .m 
     209        int ii,j,jj; 
     210        while (( i> ( n-mn+1-cc ) )&&( i>1 ) ) { 
     211                i--; 
     212                sum = 0.0; 
     213                v.set_size( m+i-( n-cc ) ); //prepare v 
     214                for ( ii=n-cc;ii<m+i;i++ ) { 
     215                        sum+= L( ii,i )*L( ii,i ); 
     216                        v( ii )=L( ii,i ); //assign v 
     217                } 
     218                if ( L( m+i,i )==0 ) { 
     219                        beta = sqrt( sum ); 
     220                } else { 
     221                        beta = L( m+i,i )+sign( L( m+i,i ) )*sqrt( sum ) ; 
     222                } 
     223                if ( std::fabs( beta )<eps ) { 
     224                        cc++; 
     225                        L.set_row( n+1-cc, L.get_row( m+i ) ); 
     226                        L.set_row( m+i,0 ); 
     227                        D( m+i )=0; L( m+i,i )=1; 
     228                        L.set_submatrix( n+1-cc,m+i,i,i,0 ); 
     229                        continue; 
     230                } 
     231 
     232                sum-=v( v.length()-1 )*v( v.length()-1 ); // 
     233                sum/=beta*beta; 
     234                sum++; 
     235 
     236                v/=beta; 
     237                v( v.length()-1 )=1; 
     238 
     239                pom=-2/sum; 
     240                for ( j=i;i>=0;i-- ) { 
     241                        w( j )=0.0; 
     242                        for ( ii=n-cc;ii<m+i;ii++ ) { 
     243                                w( j )+= v( ii )*L( ii,j ); 
     244                        } 
     245                        w( j )*=pom; 
     246                } 
     247 
     248                for ( ii=n-cc;ii<m+i;ii++ ) { 
     249                        for ( jj=0;jj<i-1;jj++ ) { 
     250                                L( ii,jj )+= v( ii )*w( jj ); 
     251                        } 
     252                } 
     253                for ( ii=n-cc;ii<m+i;ii++ ) { 
     254                        L( ii,i )= 0; 
     255                } 
     256                L( m+i,i )+=w( i ); 
     257 
     258                D( m+i )=L( m+i,i )*L( m+i,i ); 
     259                for ( ii=0;ii<i;ii++ ) { 
     260                        L( m+i,ii )/=L( m+i,i ); 
     261                } 
     262        } 
     263        if ( i>0 ) { 
     264                for ( ii=0;ii<i-1;ii++ ) { 
     265                        jj = D.length()-1-n+ii; 
     266                        L.set_row(jj,0); 
     267                        L(jj,jj)=1; 
     268                } 
     269        } 
     270 
     271        //cut-out L and D; 
     272        L.del_rows(0,m-1); 
     273        D.del(0,m-1); 
     274} 
    184275 
    185276//////// Auxiliary Functions 
     
    255346                *kr = 0.0; 
    256347                if ( *Df < -threshold ) { 
    257                 it_warning( "Problem in dydr: subraction of dyad results in negative definitness. Likely mistake in calling function." );} 
     348                        it_warning( "Problem in dydr: subraction of dyad results in negative definitness. Likely mistake in calling function." ); 
     349                } 
    258350                *Df = 0.0; 
    259351        } 
  • libDC.h

    r8 r12  
    5252 
    5353        /*! 
     54        \brief Multiplies square root of $V$ by vector $x$. 
     55         
     56        Used e.g. in generating normal samples. 
     57        */ 
     58        virtual vec sqrt_mult(vec &v) =0; 
     59         
     60        /*! 
    5461        \brief Evaluates quadratic form $x= v'*V*v$; 
    5562         
     
    5966//      //! easy version of the  
    6067//      sqmat inv(); 
    61  
    62         friend std::ostream &operator<< ( std::ostream &os, sqmat &sq ); 
    6368 
    6469        //! Clearing matrix so that it corresponds to zeros. 
     
    7176        virtual int rows() =0; 
    7277 
     78protected: 
     79        int dim; 
    7380}; 
    7481 
     
    8693        void clear(); 
    8794         
     95         
    8896        //! Constructor 
    8997        fsqmat(const mat &M); 
     
    95103        */ 
    96104        virtual void inv(fsqmat* Inv); 
     105         
     106 
    97107}; 
    98108 
     
    118128        int cols(); 
    119129        int rows(); 
     130        vec sqrt_mult(vec &v); 
    120131 
    121132        /*! \brief Matrix inversion preserving the chosen form. 
     
    133144   void mult_sym( const mat &C, ldmat &U, bool trans=false ); 
    134145 
     146        /*! \brief Transforms general $A'D0A$ into pure $L'DL$ 
     147         
     148        The new decomposition fullfills: $A'*diag(D)*A = self.L'*diag(self.D)*self.L$ 
     149 
     150        @param A general matrix 
     151        @param D0 general vector 
     152         
     153        */ 
     154   void ldform( mat &A, vec &D0 ); 
     155 
    135156        ldmat& operator += (const ldmat &ldA); 
    136157        ldmat& operator -= (const ldmat &ldA); 
    137158        ldmat& operator *= (double x); 
    138159         
     160        friend std::ostream &operator<< ( std::ostream &os, ldmat &sq ); 
     161 
    139162protected: 
    140163        vec D; 
  • libEF.h

    r8 r12  
    1515 
    1616#include <itpp/itbase.h> 
     17#include "libDC.h" 
     18#include "libBM.h" 
    1719//#include <std> 
    1820 
     
    2426* More?... 
    2527*/ 
    26 class eEF :public epdf { 
     28class eEF : public epdf { 
    2729 
    2830public: 
    29         virtual void tupdate( double phi, mat &vbar, double nubar ){}; 
    30         virtual void dupdate( mat &v,double nu=1.0 ){}; 
     31        virtual void tupdate( double phi, mat &vbar, double nubar ) {}; 
     32        virtual void dupdate( mat &v,double nu=1.0 ) {}; 
    3133}; 
    3234 
    33 class mEF :public mpdf { 
     35class mEF : public mpdf { 
    3436 
    3537public: 
     
    4446template<class sq_T> 
    4547class enorm : public eEF { 
     48        int dim; 
    4649        vec mu; 
    4750        sq_T R; 
     
    5255        void dupdate( mat &v,double nu=1.0 ); 
    5356        vec sample(); 
     57        mat sample(int N); 
    5458        double eval( const vec &val ); 
    55  
     59        Normal_RNG RNG; 
    5660}; 
    5761 
     
    7680template<class sq_T> 
    7781enorm<sq_T>::enorm( RV &rv, vec &mu0, sq_T &R0 ) { 
     82        dim = rv.count(); 
    7883        mu = mu0; 
    7984        R = R0; 
     
    9297template<class sq_T> 
    9398vec enorm<sq_T>::sample() { 
    94         // 
     99        vec x( dim ); 
     100        RNG.sample_vector( dim,x ); 
     101        vec smp = R.sqrt_mult( x ); 
     102 
     103        smp += mu; 
     104        return smp; 
     105}; 
     106 
     107template<class sq_T> 
     108mat enorm<sq_T>::sample( int N ) { 
     109        mat X( dim,N ); 
     110        vec x( dim ); 
     111        vec pom; 
     112        int i; 
     113        for ( i=0;i<N;i++ ) { 
     114                RNG.sample_vector( dim,x ); 
     115                pom = R.sqrt_mult( x ); 
     116                pom +=mu; 
     117                X.set_col( i, pom); 
     118        } 
     119        return X; 
    95120}; 
    96121 
     
    106131template<class sq_T> 
    107132mlnorm<sq_T>::mlnorm( RV &rv,RV &rvc, mat &A, sq_T &R ) { 
    108         int dim = rv.length(); 
     133        int dim = rv.count(); 
    109134        vec mu( dim ); 
    110135 
     
    116141        this->condition( cond ); 
    117142        vec smp = epdf.sample(); 
    118         lik = epdf.eval(smp); 
     143        lik = epdf.eval( smp ); 
    119144        return smp; 
    120145} 
     
    123148mat mlnorm<sq_T>::samplecond( vec &cond, vec &lik, int n ) { 
    124149        int i; 
    125         int dim = rv.length(); 
     150        int dim = rv.count(); 
    126151        mat Smp( dim,n ); 
    127         vec smp( dim); 
     152        vec smp( dim ); 
    128153        this->condition( cond ); 
    129154        for ( i=0; i<dim; i++ ) { 
    130155                smp = epdf.sample(); 
    131                 lik(i) = epdf.eval(smp); 
    132                 Smp.set_col( i ,smp); 
     156                lik( i ) = epdf.eval( smp ); 
     157                Smp.set_col( i ,smp ); 
    133158        } 
    134159        return Smp; 
     
    136161 
    137162template<class sq_T> 
    138 void mlnorm<sq_T>::condition( vec &cond) { 
     163void mlnorm<sq_T>::condition( vec &cond ) { 
     164        epdf.mu = A*cond; 
     165//R is already assigned; 
    139166} 
    140167