Changeset 102

Show
Ignore:
Timestamp:
05/12/08 17:34:07 (16 years ago)
Author:
smidl
Message:

corrections of sampling

Location:
bdm/stat
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • bdm/stat/libBM.cpp

    r85 r102  
    77using std::cout; 
    88 
    9 void RV::init( ivec in_ids, Array<std::string> in_names, ivec in_sizes, ivec in_times ) { 
     9void RV::init ( ivec in_ids, Array<std::string> in_names, ivec in_sizes, ivec in_times ) { 
    1010        // 
    1111        int i; 
     
    1313        //PRUDENT_MODE 
    1414        // All vetors should be of same length 
    15         if (     ( len != in_ids.length() ) || \ 
     15        if ( ( len != in_ids.length() ) || \ 
    1616                ( len != in_names.length() ) || \ 
    1717                ( len != in_sizes.length() ) || \ 
    18                 ( len != in_times.length() )) { 
    19                 it_error( "RV::RV inconsistent length of input vectors." ); 
     18                ( len != in_times.length() ) ) { 
     19                it_error ( "RV::RV inconsistent length of input vectors." ); 
    2020        } 
    2121 
     
    2525        times = in_times; 
    2626        tsize = 0; 
    27         for(i=0;i<len;i++){tsize+=sizes(i);} 
     27        for ( i=0;i<len;i++ ) {tsize+=sizes ( i );} 
    2828}; 
    2929 
     
    3232} 
    3333 
    34 RV::RV () : tsize(0),len(0){}; 
     34RV::RV () : tsize ( 0 ),len ( 0 ) {}; 
    3535 
    36 void RV::add (const RV &rv2) { 
     36void RV::add ( const RV &rv2 ) { 
    3737        // TODO 
    3838        tsize+=rv2.tsize; 
    3939        len +=rv2.len; 
    40         ids=concat(ids,rv2.ids); 
    41         sizes=concat(sizes,rv2.sizes); 
    42         times=concat(times,rv2.times); 
    43         names=concat(names,rv2.names); 
     40        ids=concat ( ids,rv2.ids ); 
     41        sizes=concat ( sizes,rv2.sizes ); 
     42        times=concat ( times,rv2.times ); 
     43        names=concat ( names,rv2.names ); 
    4444//      return *this; 
    4545}; 
    4646 
    4747RV::RV ( ivec in_ids ) { 
    48          
     48 
    4949        len = in_ids.length(); 
    50         Array<std::string> A( len ); 
     50        Array<std::string> A ( len ); 
    5151        std::string rvstr = "rv"; 
    5252 
    5353        for ( int i = 0; i < len;i++ ) { 
    54                 A( i ) = rvstr + to_str(i); 
     54                A ( i ) = rvstr + to_str ( i ); 
    5555        } 
    5656 
    57         init ( in_ids, A, ones_i( len ), zeros_i( len ) ); 
     57        init ( in_ids, A, ones_i ( len ), zeros_i ( len ) ); 
    5858} 
    5959 
    60 RV RV::subselect(ivec ind){ 
    61         return RV(ids(ind), names(to_Arr(ind)), sizes(ind), times(ind)); 
     60RV RV::subselect ( ivec ind ) { 
     61        return RV ( ids ( ind ), names ( to_Arr ( ind ) ), sizes ( ind ), times ( ind ) ); 
    6262} 
    6363 
    64 void RV::t(int delta){ times +=delta;} 
     64void RV::t ( int delta ) { times +=delta;} 
    6565 
    66 RV RV::operator()(ivec ind){ 
    67         return RV(ids(ind), names(to_Arr(ind)), sizes(ind), times(ind)); 
     66RV RV::operator() ( ivec ind ) { 
     67        return RV ( ids ( ind ), names ( to_Arr ( ind ) ), sizes ( ind ), times ( ind ) ); 
    6868} 
    6969 
    70 std::ostream &operator<<( std::ostream &os, const RV &rv ) { 
     70bool RV::equal ( RV rv2 ) const { 
     71        return ( ids==rv2.ids ) && ( times == rv2.times ) && ( sizes==rv2.sizes ); 
     72} 
     73 
     74mat epdf::sampleN ( int N ) const { 
     75        mat X =zeros ( rv.count(),N ); 
     76        for ( int i=0;i<N;i++ ) X.set_col ( i,this->sample() );  
     77        return X; 
     78}; 
     79 
     80 
     81std::ostream &operator<< ( std::ostream &os, const RV &rv ) { 
    7182 
    7283        for ( int i = 0; i < rv.len ;i++ ) { 
    73                 os << rv.ids( i ) << "(" << rv.sizes( i ) << ")" <<  // id(size)= 
    74                 "=" << rv.names( i )  << "_{"  << rv.times( i ) << "}; "; //name_{time} 
     84                os << rv.ids ( i ) << "(" << rv.sizes ( i ) << ")" <<  // id(size)= 
     85                "=" << rv.names ( i )  << "_{"  << rv.times ( i ) << "}; "; //name_{time} 
    7586        } 
    7687        return os; 
    7788} 
    7889 
    79 ivec RV::indexlist(){ 
    80         ivec indlist(tsize); 
     90ivec RV::indexlist() { 
     91        ivec indlist ( tsize ); 
    8192        int i; 
    8293        int pos = 0; 
    83         for(i=0;i<len;i++){ 
    84                 indlist.set_subvector(pos,pos+sizes(i)-1, ids(i)); 
     94        for ( i=0;i<len;i++ ) { 
     95                indlist.set_subvector ( pos,pos+sizes ( i )-1, ids ( i ) ); 
    8596        } 
    8697        return indlist; 
    8798} 
    8899 
    89 RV concat(const RV &rv1, const RV &rv2 ){ 
     100RV concat ( const RV &rv1, const RV &rv2 ) { 
    90101        RV pom = rv1; 
    91         pom.add(rv2);  
     102        pom.add ( rv2 ); 
    92103        return pom; 
    93104} 
  • bdm/stat/libBM.h

    r96 r102  
    3131        //! len = number of individual rvs 
    3232        int len; 
    33         //! Vector of unique IDs  
     33        //! Vector of unique IDs 
    3434        ivec ids; 
    3535        //! Vector of sizes 
     
    4242private: 
    4343        //! auxiliary function used in constructor 
    44         void init ( ivec in_ids, Array<std::string> in_names, ivec in_sizes, ivec in_times); 
     44        void init ( ivec in_ids, Array<std::string> in_names, ivec in_sizes, ivec in_times ); 
    4545public: 
    4646        //! Full constructor which is called by the others 
    47         RV ( ivec in_ids, Array<std::string> in_names, ivec in_sizes, ivec in_times); 
     47        RV ( ivec in_ids, Array<std::string> in_names, ivec in_sizes, ivec in_times ); 
    4848        //! default constructor 
    4949        RV ( ivec ids ); 
     
    6363        //! Find indexes of another rv in self 
    6464        ivec find ( RV rv2 ); 
     65        //! Compare if \c rv2 is identical to this \c RV 
     66        bool equal ( RV rv2 ) const; 
    6567        //! Add (concat) another variable to the current one 
    66         void add (const RV &rv2 ); 
     68        void add ( const RV &rv2 ); 
    6769        //! Add (concat) another variable to the current one 
    68         friend RV concat (const RV &rv1, const RV &rv2 ); 
     70        friend RV concat ( const RV &rv1, const RV &rv2 ); 
    6971        //! Subtract  another variable from the current one 
    7072        RV subt ( RV rv2 ); 
     
    7981 
    8082        //!access function 
    81         Array<std::string>& _names(){return names;}; 
    82  
    83         //!access function 
    84         int id(int at){return ids(at);}; 
    85         //!access function 
    86         int size(int at){return sizes(at);}; 
    87         //!access function 
    88         int time(int at){return times(at);}; 
    89         //!access function 
    90         std::string name(int at){return names(at);}; 
     83        Array<std::string>& _names() {return names;}; 
     84 
     85        //!access function 
     86        int id ( int at ) {return ids ( at );}; 
     87        //!access function 
     88        int size ( int at ) {return sizes ( at );}; 
     89        //!access function 
     90        int time ( int at ) {return times ( at );}; 
     91        //!access function 
     92        std::string name ( int at ) {return names ( at );}; 
    9193}; 
    9294 
     
    100102public: 
    101103        //!default constructor 
    102         fnc(int dy):dimy(dy){}; 
     104        fnc ( int dy ) :dimy ( dy ) {}; 
    103105        //! function evaluates numerical value of \f$f(x)\f$ at \f$x=\f$ \c cond 
    104106        virtual vec eval ( const vec &cond ) { 
    105107                return vec ( 0 ); 
    106         };  
     108        }; 
    107109 
    108110        //! access function 
     
    131133        //! Returns a sample, \f$x\f$ from density \f$epdf(rv)\f$ 
    132134        virtual vec sample () const =0; 
     135        //! Returns N samples from density \f$epdf(rv)\f$ 
     136        virtual mat sampleN ( int N ) const; 
    133137        //! Compute probability of argument \c val 
    134         virtual double eval ( const vec &val ) const {return exp(this->evalpdflog(val));}; 
     138        virtual double eval ( const vec &val ) const {return exp ( this->evalpdflog ( val ) );}; 
    135139 
    136140        //! Compute log-probability of argument \c val 
    137141        virtual double evalpdflog ( const vec &val ) const =0; 
    138142 
    139         //! return expected value  
     143        //! return expected value 
    140144        virtual vec mean() const =0; 
    141          
     145 
    142146        //! Destructor for future use; 
    143147        virtual ~epdf() {}; 
     
    163167//      virtual fnc moment ( const int order = 1 ); 
    164168        //! Returns a sample from the density conditioned on \c cond, \f$x \sim epdf(rv|cond)\f$. \param cond is numeric value of \c rv \param ll is a return value of log-likelihood of the sample. 
    165         virtual vec samplecond ( vec &cond, double &ll ) {this->condition(cond);vec temp= ep->sample();ll=ep->evalpdflog(temp);return temp;}; 
     169        virtual vec samplecond ( vec &cond, double &ll ) {this->condition ( cond );vec temp= ep->sample();ll=ep->evalpdflog ( temp );return temp;}; 
     170        //! Returns N samples from the density conditioned on \c cond, \f$x \sim epdf(rv|cond)\f$. \param cond is numeric value of \c rv \param ll is a return value of log-likelihood of the sample. 
     171        virtual mat samplecond ( vec &cond, vec &ll, int N ) { 
     172                this->condition ( cond ); 
     173                mat temp ( rv.count(),N ); vec smp ( rv.count() ); for ( int i=0;i<N;i++ ) {smp=ep->sample() ;temp.set_col ( i, smp );ll ( i ) =ep->evalpdflog ( smp );} 
     174                return temp; 
     175        }; 
    166176        //! Update \c ep so that it represents this mpdf conditioned on \c rvc = cond 
    167177        virtual void condition ( const vec &cond ) {}; 
    168          
     178 
    169179        //! Shortcut for conditioning and evaluation of the internal epdf. In some cases,  this operation can be implemented efficiently. 
    170         virtual double evalcond (const vec &dt, const vec &cond ) {this->condition(cond);return ep->eval(dt);}; 
     180        virtual double evalcond ( const vec &dt, const vec &cond ) {this->condition ( cond );return ep->eval ( dt );}; 
    171181 
    172182        //! Destructor for future use; 
     
    176186        mpdf ( const RV &rv0, const RV &rvc0 ) :rv ( rv0 ),rvc ( rvc0 ) {}; 
    177187        //! access function 
    178         RV _rvc(){return rvc;} 
    179         //!access function 
    180         epdf& _epdf(){return *ep;} 
     188        RV _rvc() {return rvc;} 
     189        //!access function 
     190        epdf& _epdf() {return *ep;} 
    181191}; 
    182192 
     
    230240 
    231241        //!Default constructor 
    232         BM(const RV &rv0) :rv(rv0), ll ( 0 ),evalll ( true ) {//Fixme: test rv  
     242        BM ( const RV &rv0 ) :rv ( rv0 ), ll ( 0 ),evalll ( true ) {//Fixme: test rv 
    233243        }; 
    234244 
     
    240250        void bayes ( mat Dt ); 
    241251        //! Returns a pointer to the epdf representing posterior density on parameters. Use with care! 
    242         virtual epdf& _epdf()=0; 
     252        virtual epdf& _epdf() =0; 
    243253 
    244254        //! Destructor for future use; 
     
    267277        virtual void condition ( const vec &val ) =0; 
    268278        //! Default constructor 
    269         BMcond(RV &rv0):rvc(rv0){}; 
     279        BMcond ( RV &rv0 ) :rvc ( rv0 ) {}; 
    270280        //! Destructor for future use 
    271         virtual ~BMcond(){}; 
     281        virtual ~BMcond() {}; 
    272282        //! access function 
    273283        const RV& _rvc() const {return rvc;} 
  • bdm/stat/libEF.cpp

    r96 r102  
    6565} 
    6666 
    67 mat egamma::sample ( int N ) const { 
    68         mat Smp ( rv.count(),N ); 
    69         int i,j; 
    70  
    71         for ( i=0; i<rv.count(); i++ ) { 
    72                 GamRNG.setup ( alpha ( i ),beta ( i ) ); 
    73  
    74                 for ( j=0; j<N; j++ ) { 
    75                         Smp ( i,j ) = GamRNG(); 
    76                 } 
    77         } 
    78  
    79         return Smp; 
    80 } 
     67// mat egamma::sample ( int N ) const { 
     68//      mat Smp ( rv.count(),N ); 
     69//      int i,j; 
     70//  
     71//      for ( i=0; i<rv.count(); i++ ) { 
     72//              GamRNG.setup ( alpha ( i ),beta ( i ) ); 
     73//  
     74//              for ( j=0; j<N; j++ ) { 
     75//                      Smp ( i,j ) = GamRNG(); 
     76//              } 
     77//      } 
     78//  
     79//      return Smp; 
     80// } 
    8181 
    8282double egamma::evalpdflog ( const vec &val ) const { 
  • bdm/stat/libEF.h

    r96 r102  
    162162        vec sample() const; 
    163163        //! TODO: is it used anywhere? 
    164         mat sample ( int N ) const; 
     164//      mat sample ( int N ) const; 
    165165        double evalpdflog ( const vec &val ) const; 
    166166        double lognc () const; 
     
    206206        vec sample() const { 
    207207                vec smp ( rv.count() ); UniRNG.sample_vector ( rv.count(),smp ); 
    208                 return low+distance*smp; 
     208                return low+elem_mult(distance,smp); 
    209209        } 
    210210        //! set values of \c low and \c high 
  • bdm/stat/loggers.cpp

    r95 r102  
    77#include <io.h> 
    88#endif 
     9 
     10void memlog::itsave(const char* fname){ 
     11        it_file itf(fname); 
     12        int i; 
     13        for (i=0; i<entries.length();i++){ 
     14         itf << Name(names(i)) << vectors(i); 
     15        } 
     16} 
    917 
    1018void dirfilelog::init() { 
  • bdm/stat/loggers.h

    r92 r102  
    8484        void step(bool final=false) {if ( ind<maxlen ) ind++; else it_error ( "memlog::ind is too high;" );} 
    8585        void logit ( int id, vec v ) {vectors ( id ).set_row ( ind,v );} 
     86        void itsave(const char* fname); 
    8687}; 
    8788