00001 
00013 #ifndef AR_H
00014 #define AR_H
00015 
00016 #include "../math/functions.h"
00017 #include "../stat/exp_family.h"
00018 #include "../base/user_info.h"
00019 
00020 #include "arx_straux.h"
00021 
00022 namespace bdm {
00023 
00043 class ARX: public BMEF {
00044 protected:
00046         int dimx;
00049         RV _yrv;
00051         egiw est;
00053         ldmat &V;
00055         double ν
00056 public:
00059         ARX ( const double frg0 = 1.0 ) : BMEF ( frg0 ), est (), V ( est._V() ), nu ( est._nu() ) {};
00060         ARX ( const ARX &A0 ) : BMEF (), est (), V ( est._V() ), nu ( est._nu() ) {
00061                 set_statistics ( A0.dimx, A0.V, A0.nu );
00062                 set_parameters ( A0.frg );
00063         };
00064         ARX* _copy_() const;
00065         void set_parameters ( double frg0 ) {
00066                 frg = frg0;
00067         }
00068         void set_statistics ( int dimx0, const ldmat V0, double nu0 = -1.0 ) {
00069                 est.set_parameters ( dimx0, V0, nu0 );
00070                 last_lognc = est.lognc();
00071                 dimx = dimx0;
00072         }
00074 
00075 
00076 
00078         void set_statistics ( const BMEF* BM0 );
00079 
00080 
00083 
00085         void bayes ( const vec &dt, const double w );
00086         void bayes ( const vec &dt ) {
00087                 bayes ( dt, 1.0 );
00088         };
00089         double logpred ( const vec &dt ) const;
00090         void flatten ( const BMEF* B ) {
00091                 const ARX* A = dynamic_cast<const ARX*> ( B );
00092                 
00093                 est.pow ( A->nu / nu );
00094                 if ( evalll ) {
00095                         last_lognc = est.lognc();
00096                 }
00097         }
00099         enorm<ldmat>* epredictor ( const vec &rgr ) const;
00101         enorm<ldmat>* epredictor() const {
00102                 bdm_assert_debug ( dimx == V.rows() - 1, "Regressor is not only 1" );
00103                 return epredictor ( vec_1 ( 1.0 ) );
00104         }
00106         mlnorm<ldmat>* predictor() const;
00107         mlstudent* predictor_student() const;
00109         ivec structure_est ( egiw Eg0 );
00111         ivec structure_est_LT ( egiw Eg0 );
00113 
00116         const egiw& posterior() const {
00117                 return est;
00118         }
00120 
00123         void set_drv ( const RV &drv0 ) {
00124                 drv = drv0;
00125         }
00126 
00127         RV& get_yrv() {
00128                 
00129                 if ( _yrv._dsize() != dimx ) {
00130                         int i = 0;
00131                         while ( _yrv._dsize() < dimx ) {
00132                                 _yrv.add ( drv ( vec_1 ( i ) ) );
00133                                 i++;
00134                         }
00135                 }
00136                 
00137                 bdm_assert_debug ( _yrv._dsize() == dimx, "incompatible drv" );
00138                 return _yrv;
00139         }
00141 
00142         
00163         void from_setting ( const Setting &set );
00164 
00165 };
00166 
00167 UIREGISTER ( ARX );
00168 SHAREDPTR ( ARX );
00169 
00170 }
00171 
00172 #endif // AR_H
00173 
00174