Changeset 643

Show
Ignore:
Timestamp:
09/28/09 19:34:23 (15 years ago)
Author:
mido
Message:

small patch of documentation of installation under win xp; preparation of discrete.h extension

Location:
library
Files:
1 added
3 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/CMakeLists.txt

    r619 r643  
    55        math/chmat.cpp math/chmat.h  
    66        math/functions.cpp math/functions.h) 
    7 SET(bdm_stat stat/exp_family.cpp stat/exp_family.h stat/emix.cpp stat/emix.h stat/merger.h stat/merger.cpp stat/discrete.h) 
     7SET(bdm_stat stat/exp_family.cpp stat/exp_family.h stat/emix.cpp stat/emix.h stat/merger.h stat/merger.cpp stat/discrete.h stat/discrete.cpp) 
    88SET(bdm_estim estim/kalman.cpp estim/kalman.h estim/particles.cpp estim/particles.h estim/arx.cpp estim/arx.h estim/arx_straux.cpp estim/mixtures.cpp estim/mixtures.h) 
    99SET(bdm_ctrl design/ctrlbase.cpp design/ctrlbase.h) 
  • library/bdm/stat/discrete.h

    r620 r643  
    1919#include "../math/chmat.h" 
    2020 
    21 namespace bdm 
    22 { 
     21namespace bdm { 
    2322 
    24         //! Rectangular support 
    25         //! Support points are located inbetween ranges! For example: 
    26         //! For ranges=[0,1] and gridsizes=[1] the support point is 0.5 
    27         class rectangular_support: public root { 
    28                 protected: 
    29                         //! Array of boundaries (2D vectors: [begining,end]) for each dimension 
    30                         Array<vec> ranges; 
    31                         //! Number of support points in each dimension 
    32                         ivec gridsizes; 
    33                         //! dimension 
    34                         int dim; 
    35                         //! Number of data points 
    36                         int Npoints; 
    37                         //! active vector for first_vec and next_vec 
    38                         vec actvec; 
    39                         //! indeces of active vector 
    40                         vec actvec_ind; 
    41                         //! length of steps in each dimension 
    42                         vec steps; 
    43                 public: 
    44                         //! default constructor 
    45                         rectangular_support() : dim(0), Npoints(0) { 
    46                         } 
    47                          
    48                         //! set parameters 
    49                         void set_parameters(const Array<vec> &ranges0, const ivec &gridsize0){ 
    50                                 ranges=ranges0; 
    51                                 gridsizes=gridsize0; 
    52                                 initialize(); 
    53                         } 
    54                         //! Internal functio to set temporaries correctly 
    55                         void initialize() { 
    56                                 dim = ranges.length(); 
    57                                 bdm_assert(gridsizes.length() == dim, "Incompatible dimensions of input"); 
    58                                 Npoints = prod(gridsizes); 
    59                                 bdm_assert(Npoints > 0, "Wrong input parameters"); 
    60                                  
    61                                 //precompute steps 
    62                                 steps.set_size(dim); 
    63                                 for ( int j = 0; j < dim; j++ ) { 
    64                                         steps ( j ) = ( ranges ( j ) ( 1 ) - ranges(j)(0) ) / gridsizes ( j ); 
    65                                 } 
    66                                 actvec.set_size(dim); 
    67                                 actvec_ind.set_size(dim); 
    68                         } 
    69                         //! return vector at position given by vector of indeces 
    70                         vec get_vec(const ivec &inds){ 
    71                                 vec v ( dim ); 
    72                                 for ( int j = 0; j < dim; j++ ) { 
    73                                         bdm_assert_debug(inds(j) < gridsizes(j), "Index out of bounds"); 
    74                                         v ( j ) = ranges(j)(0) + (0.5+inds(j))*steps(j); 
    75                                 } 
    76                                 return v; 
    77                         } 
     23//! Rectangular support 
     24//! Support points are located inbetween ranges! For example: 
     25//! For ranges=[0,1] and gridsizes=[1] the support point is 0.5 
     26class rectangular_support: public root { 
     27protected: 
     28        //! Array of boundaries (2D vectors: [begining,end]) for each dimension 
     29        Array<vec> ranges; 
     30        //! Number of support points in each dimension 
     31        ivec gridsizes; 
     32        //! dimension 
     33        int dim; 
     34        //! Number of data points 
     35        int Npoints; 
     36        //! active vector for first_vec and next_vec 
     37        vec actvec; 
     38        //! indeces of active vector 
     39        vec actvec_ind; 
     40        //! length of steps in each dimension 
     41        vec steps; 
     42public: 
     43        //! default constructor 
     44        rectangular_support() : dim ( 0 ), Npoints ( 0 ) { 
     45        } 
    7846 
    79                         //! convert dimension indeces into linear index, the indexing is in the same way as in \c next_vec() 
    80                         long linear_index (const ivec inds){ 
    81                                 long ind=0; 
    82                                 bdm_assert_debug(inds.length() == dim, "Improper indices inds"); 
    83                                 int dim_skips=1; // skips in active dimension, in the first dimension, the skips are 1 index per value 
    84                                                  
    85                                 for (int j=0; j<dim; j++){  
    86                                         ind += dim_skips*(inds(j)); // add shift in linear index caused by this dimension 
    87                                         dim_skips*=gridsizes(j);  // indeces in the next dimension are repeated with period gridsizes(j) times greater that in this dimesion 
    88                                 } 
    89                                 return ind; 
    90                         }  
    91                         //! set the first vector to corner and store result in actvec 
    92                         const vec& first_vec(){ 
    93                                 for ( int j = 0; j < dim; j++ ) { 
    94                                         actvec ( j ) = ranges(j)(0) + 0.5*steps(j); 
    95                                         actvec_ind(j) = 0; 
    96                                 } 
    97                                 return actvec; 
    98                         } 
    99                         //! Get next active vector, call ONLY after first_vector()! 
    100                         const vec& next_vec() { 
    101                                 // go through all dimensions 
    102                                 int j=0; 
    103                                 while (j<dim) { 
    104                                         if ( actvec_ind ( j ) == gridsizes ( j ) - 1 ) { //j-th index is full 
    105                                                 actvec_ind ( j ) = 0; //shift back 
    106                                                 actvec ( j ) = ranges ( j ) ( 0 ) + 0.5*steps(j); 
    107                                                 j++; 
    108                                         } else { 
    109                                                 actvec_ind ( j ) ++; 
    110                                                 actvec ( j ) += steps ( j ); 
    111                                                 break; 
    112                                         } 
    113                                 } 
    114                                 return actvec; 
    115                         }  
    116                          
    117                         ivec nearest_point(const vec &val){ 
    118                                 ivec inds; 
    119                                 inds.set_size(dim); 
    120                                 for(int j=0; j<dim; j++){ 
    121                                         if (val(j)<ranges(j)(0)) 
    122                                                 inds(j) = 0; 
    123                                         else { 
    124                                                 if (val(j)>ranges(j)(1)) 
    125                                                         inds(j) = gridsizes(j)-1; 
    126                                                 else { 
    127                                                         inds(j) = ::round(val(j) - ranges(j)(0)/ steps(j)); 
    128                                                 } 
    129                                         } 
    130                                 } 
    131                                 return inds; 
    132                         } 
     47        //! set parameters 
     48        void set_parameters ( const Array<vec> &ranges0, const ivec &gridsize0 ); 
    13349 
    134                         //! Access function 
    135                         int points() const {return Npoints;} 
    136                          
    137                         //! access function 
    138                         const vec& _steps() const {return steps;} 
    139                          
    140                         void from_setting (const Setting &set) { 
    141                                 UI::get (ranges , set, "ranges", UI::compulsory); 
    142                                 UI::get (gridsizes, set, "gridsizes", UI::compulsory); 
    143                                 initialize(); 
    144                         } 
    145         }; 
    146         UIREGISTER(rectangular_support); 
    147          
    148         //! Discrete support with stored support points  
    149         class discrete_support: public root{ 
    150                 protected: 
    151                         //! storage of support points 
    152                         Array<vec> Spoints; 
    153                         //! index in iterators 
    154                         int idx; 
    155                 public: 
    156                         //! Default constructor 
    157                         discrete_support() : Spoints(0), idx(0){} 
    158                         //! Access function 
    159                         int points() const {return Spoints.length();} 
    160                         //! set the first vector to corner and store result in actvec 
    161                         const vec& first_vec(){bdm_assert_debug(Spoints.length()>0,"Empty support");idx=0; return Spoints(idx);} 
    162                         //! set next vector after calling first_vec() 
    163                         const vec& next_vec(){bdm_assert_debug(Spoints.length()>idx-1,"Out of support points"); return Spoints(++idx);} 
    164                          
    165                         /*! 
    166                         \code 
    167                           class = "discrete_support"; 
    168                           points = ( [1,2..], [2,2..], ...); // list of points 
    169                            === OR === 
    170                           epdf = {class="epdf_offspring",...}; // epdf rfom which to sample 
    171                           npoints = 100;                     // number of samples 
    172                         \endcode 
    173                         */ 
    174                         void from_setting (const Setting &set) { 
    175                                 UI::get (Spoints, set, "points", UI::compulsory); 
    176                                 if (points()<1){ 
    177                                         int npoints; 
    178                                         shared_ptr<epdf> ep= UI::build<epdf>(set, "epdf", UI::compulsory); 
    179                                         if (!UI::get(npoints,set,"npoints",UI::optional)){npoints=100;} 
    180                                          
    181                                         //sample 
    182                                         Spoints.set_size(npoints); 
    183                                         for(int i=0; i<points(); i++){Spoints(i)=ep->sample();} 
    184                                 } 
    185                         } 
    186                         //! access function 
    187                         Array<vec> & _Spoints() {return Spoints;} 
    188         }; 
    189         UIREGISTER(discrete_support); 
    190          
    191         class grid_fnc: public fnc{ 
    192                 protected: 
    193                         rectangular_support sup; 
    194                         vec values; 
    195                 public: 
    196                         //! constructor function 
    197                         void set_support(rectangular_support &sup0){sup=sup0; values=zeros(sup.points());} 
    198                         //! constructor function fills values by calling function \c f , double f(vec&), given by a pointer 
    199                         void set_values(double (*evalptr)(const vec&)){ 
    200                                 if (sup.points()>0){ 
    201                                         values(0) = (*evalptr)(sup.first_vec()); 
    202                                         for (int j=1; j<sup.points(); j++){  
    203                                                 values(j)=(*evalptr)(sup.next_vec()); 
    204                                         } 
    205                                 } 
    206                         }  
    207                         //! get value nearest to the given point 
    208                         double nearest_val(const vec &val){return values( sup.linear_index(sup.nearest_point(val)));} 
    209                          
    210                         vec eval(const vec &val){return vec_1(nearest_val(val));} 
    211         }; 
    212         UIREGISTER(grid_fnc); 
     50        //! Internal functio to set temporaries correctly 
     51        void initialize(); 
    21352 
    214         //! Piecewise constant pdf on rectangular support 
    215         //! Each point on the grid represents a centroid around which the density is constant. 
    216         //! This is a trivial point-mass density where all points have the same mass. 
    217         class egrid: public epdf{ 
    218                 protected: 
    219                         rectangular_support sup; 
    220                         vec values; 
    221                 public: 
    222                         //! we assume that evallog is not called too often otherwise we should cache log(values) 
    223                         double evallog(const vec &val){return log(values( sup.linear_index(sup.nearest_point(val))));} 
    224                          
    225         }; 
     53        //! return vector at position given by vector of indeces 
     54        vec get_vec ( const ivec &inds ); 
     55 
     56        //! convert dimension indeces into linear index, the indexing is in the same way as in \c next_vec() 
     57        long linear_index ( const ivec inds ); 
     58 
     59        //! set the first vector to corner and store result in actvec 
     60        const vec& first_vec(); 
     61 
     62        //! Get next active vector, call ONLY after first_vector()! 
     63        const vec& next_vec(); 
     64 
     65        //! \todo to je asi navic .. v predkovi! 
     66        ivec nearest_point ( const vec &val ); 
     67 
     68        //! Access function 
     69        int points() const { 
     70                return Npoints; 
     71        } 
     72 
     73        //! access function 
     74        //! \todo opet pouze do potomka.. 
     75        const vec& _steps() const { 
     76                return steps; 
     77        } 
     78 
     79        void from_setting ( const Setting &set ); 
     80}; 
     81UIREGISTER ( rectangular_support ); 
     82 
     83//! Discrete support with stored support points 
     84class discrete_support: public root { 
     85protected: 
     86        //! storage of support points 
     87        Array<vec> Spoints; 
     88        //! index in iterators 
     89        int idx; 
     90public: 
     91        //! Default constructor 
     92        discrete_support() : Spoints ( 0 ), idx ( 0 ) {} 
     93        //! Access function 
     94        int points() const { 
     95                return Spoints.length(); 
     96        } 
     97        //! set the first vector to corner and store result in actvec 
     98        const vec& first_vec() { 
     99                bdm_assert_debug ( Spoints.length() > 0, "Empty support" ); 
     100                idx = 0; 
     101                return Spoints ( idx ); 
     102        } 
     103        //! set next vector after calling first_vec() 
     104        const vec& next_vec() { 
     105                bdm_assert_debug ( Spoints.length() > idx - 1, "Out of support points" ); 
     106                return Spoints ( ++idx ); 
     107        } 
     108 
     109        /*! 
     110        \code 
     111          class = "discrete_support"; 
     112          points = ( [1,2..], [2,2..], ...); // list of points 
     113           === OR === 
     114          epdf = {class="epdf_offspring",...}; // epdf rfom which to sample 
     115          npoints = 100;                     // number of samples 
     116        \endcode 
     117        */ 
     118        void from_setting ( const Setting &set ); 
     119 
     120        //! access function 
     121        Array<vec> & _Spoints() { 
     122                return Spoints; 
     123        } 
     124}; 
     125UIREGISTER ( discrete_support ); 
     126 
     127class grid_fnc: public fnc { 
     128protected: 
     129        rectangular_support sup; 
     130        vec values; 
     131public: 
     132        //! constructor function 
     133        void set_support ( rectangular_support &sup0 ) { 
     134                sup = sup0; 
     135                values = zeros ( sup.points() ); 
     136        } 
     137        //! constructor function fills values by calling function \c f , double f(vec&), given by a pointer 
     138        void set_values ( double ( *evalptr ) ( const vec& ) ); 
     139 
     140        //! get value nearest to the given point 
     141        double nearest_val ( const vec &val ) { 
     142                return values ( sup.linear_index ( sup.nearest_point ( val ) ) ); 
     143        } 
     144 
     145        vec eval ( const vec &val ) { 
     146                return vec_1 ( nearest_val ( val ) ); 
     147        } 
     148}; 
     149UIREGISTER ( grid_fnc ); 
     150 
     151//! Piecewise constant pdf on rectangular support 
     152//! Each point on the grid represents a centroid around which the density is constant. 
     153//! This is a trivial point-mass density where all points have the same mass. 
     154class egrid: public epdf { 
     155protected: 
     156        rectangular_support sup; 
     157        vec values; 
     158public: 
     159        //! we assume that evallog is not called too often otherwise we should cache log(values) 
     160        double evallog ( const vec &val ) { 
     161                return log ( values ( sup.linear_index ( sup.nearest_point ( val ) ) ) ); 
     162        } 
     163 
     164}; 
    226165} 
    227166#endif //DISCR_H 
  • library/doc/tutorial/00install.dox

    r632 r643  
    6262 Path = %PATH%; <bdm_dir>\library\system\win32\dll 
    6363\endcode 
    64 Otherwise you will not be able to run any programs. 
     64 
     65Be sure to set system variable globally, i.e., through the dialog box "System Properties",  
     66tab "Advanced" and button "Environment Variables". Otherwise you will not be able to run  
     67any programs. 
    6568 
    6669