Changeset 870 for library/bdm

Show
Ignore:
Timestamp:
03/18/10 19:13:02 (14 years ago)
Author:
mido
Message:

LOG_LEVEL final cut (or rather semifinal? I hope to improve work with ids soon)
and also it rests to adapt applications, work is in progress

Location:
library/bdm
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/base/bdmbase.cpp

    r863 r870  
    563563        } 
    564564         
    565         if (log_level[bounds]){ 
     565        if (log_level[logbounds]){ 
    566566                prior().log_level[epdf::loglb]=true; 
    567567                prior().log_level[epdf::logub]=true; 
    568568        } 
    569         if (log_level[full]){ 
     569        if (log_level[logfull]){ 
    570570                prior().log_level[epdf::logfull]=true; 
    571571        } 
  • library/bdm/base/bdmbase.h

    r864 r870  
    492492//! Probability density function with numerical statistics, e.g. posterior density. 
    493493class epdf : public pdf { 
    494         LOG_LEVEL(epdf, logmean, loglb, logub, logfull); 
     494        //! \var log_level_enums logmean 
     495        //! TODO DOPLNIT         
     496         
     497        //! \var log_level_enums loglb 
     498        //! TODO DOPLNIT 
     499         
     500        //! \var log_level_enums logub 
     501        //! TODO DOPLNIT 
     502         
     503        //! \var log_level_enums logfull 
     504        //! TODO DOPLNIT 
     505        LOG_LEVEL(epdf,logmean,loglb,logub,logfull); 
    495506 
    496507public: 
     
    895906 
    896907class DS : public root { 
     908        //! \var log_level_enums dt 
     909        //! TODO DOPLNIT 
    897910        LOG_LEVEL(DS, dt); 
     911 
    898912protected: 
    899913        //! size of data returned by \c getdata() 
     
    983997 
    984998class BM : public root { 
    985         LOG_LEVEL(BM, full, likelihood, bounds); 
     999        //! \var log_level_enums logfull 
     1000        //! TODO DOPLNIT 
     1001 
     1002        //! \var log_level_enums logevidence 
     1003        //! TODO DOPLNIT 
     1004         
     1005        //! \var log_level_enums logbounds 
     1006        //! TODO DOPLNIT         
     1007        LOG_LEVEL(BM,logfull,logevidence,logbounds); 
    9861008 
    9871009protected: 
     
    11451167        void validate() 
    11461168        { 
    1147                 if ( log_level[full] ) { 
     1169                if ( log_level[logfull] ) { 
    11481170                        const_cast<epdf&> ( posterior() ).log_level[epdf::logfull] = true; 
    11491171                } else { 
    1150                         if ( log_level[bounds] ) { 
     1172                        if ( log_level[logbounds] ) { 
    11511173                                const_cast<epdf&> ( posterior() ).log_level[epdf::loglb] = true; 
    11521174                        } else { 
    11531175                                const_cast<epdf&> ( posterior() ).log_level[epdf::logmean] = true;; 
    11541176                        } 
    1155                         if ( log_level[likelihood] ) { 
    1156                                 // TODO testovat tedy likelyhood misto 1.. log_level = 1; 
     1177                        if ( log_level[logevidence] ) { 
    11571178                        } 
    11581179                } 
  • library/bdm/base/user_info.h

    r863 r870  
    305305        static void from_setting ( double &real, const Setting &element ); 
    306306 
    307         //! This method converts a Setting into a specific logged_options<T> variant and initialize options properly 
    308         template< class T> static void from_setting ( logged_options<T> &options, const Setting &element ) 
     307        //! This method converts a Setting into a specific log_level_template<T> variant and initialize options properly 
     308        template< class T> static void from_setting ( log_level_template<T> &log_level, const Setting &element ) 
    309309        { 
    310                 options.values.reset(); 
    311                 Array<string> true_options; 
    312                 UI::get( true_options, element ); 
    313                 for( int i = 0; i < true_options.length(); i++ ) 
    314                         for( int j = 0; j < options.names().length(); j++ ){ 
    315                                 if( true_options(i) == options.names()(j)  )  
     310                string raw_log_level; 
     311                UI::get( raw_log_level, element ); 
     312                Array<string> loaded_log_level = log_level_template<T>::string2Array( raw_log_level ); 
     313                 
     314                log_level.values.reset(); 
     315 
     316                for( int i = 0; i < loaded_log_level.length(); i++ ) 
     317                        for( int j = 0; j < log_level.names().length(); j++ ){ 
     318                                if( loaded_log_level(i) == log_level.names()(j)  )  
    316319                                { 
    317                                         options.values[j] = true; 
     320                                        log_level.values[j] = true; 
    318321                                        break; 
    319322                                }  
     
    324327        template<class T> static void from_setting ( T* &instance, const Setting &element ) { 
    325328                const SettingResolver link ( element ); 
    326                 assert_type ( link.result, Setting::TypeGroup ); 
     329                assert_type( link.result, Setting::TypeGroup ); 
    327330 
    328331                // we get a value stored in the "class" attribute 
     
    600603        } 
    601604 
    602         // The only difference from classical UserInfo approach to logged_options is the fact 
    603         // that the actual element related to logged_options could possibly exists yet. In this case,  
     605        // The only difference from classical UserInfo approach to log_level_template is the fact 
     606        // that the actual UI element related to log_level_template could possibly exists yet. In this case,  
    604607        // we do not want to throw an exception like in the case of any other type being loaded 
    605         // from Setting. Here, we rather add our options into this existig element. This way, it is  
    606         // possible that more instances of logged_options class (all contained in one wrapping instance of 
    607         // a particular class!) can be stored in only one line in a configuration file 
    608         template< class T> static void save ( const logged_options<T> &options, Setting &element, const string &name = "options"  ) { 
     608        // from Setting. We rather fill the current log_level into this existig element. This way, it is  
     609        // possible that more instances of log_level_template class (templated with different classes) 
     610        // can be stored in only one line in a configuration file 
     611        template< class T> static void save ( const log_level_template<T> &log_level, Setting &element, const string &name = "log_level"  ) { 
    609612                assert_type ( element, Setting::TypeGroup ); 
     613 
     614                string string_to_write; 
    610615 
    611616                Setting *list; 
     
    613618                { 
    614619                        list = &element[name]; 
    615                         assert_type ( *list, Setting::TypeList ); 
     620                        assert_type ( *list, Setting::TypeString ); 
     621                        string_to_write = ( const char* ) *list; 
    616622                } 
    617623                else 
    618                         list = &element.add ( name, Setting::TypeList );  
    619  
    620                 Array<string> true_options; 
    621                 int true_options_count = 0; 
    622                 true_options.set_length( options.values.size() ); 
    623                 for( unsigned int i = 0; i < options.values.size(); i++ ) 
    624                         if( options.values[i] )  
    625                                 true_options( true_options_count++ ) = options.names()(i); 
    626                 save( true_options, *list, name ); 
     624                        list = &element.add ( name, Setting::TypeString );  
     625 
     626                for( unsigned int i = 0; i < log_level.values.size(); i++ ) 
     627                        if( log_level.values[i] ) // a jeste zkontrolovat zda to jmeno uz neni obsazeno?  
     628                        { 
     629                                if( string_to_write.length() > 0 ) 
     630                                        string_to_write = string_to_write + ','; 
     631                                string_to_write = string_to_write + log_level.names()(i); 
     632                        } 
     633                         
     634                *list = string_to_write; 
    627635        } 
    628636 
  • library/bdm/bdmroot.h

    r865 r870  
    3838void UI_DBG (const Setting &S, const string &spc, ostream &out ); 
    3939         
    40 //! level of details that will be logged to a logger 
    41 // DULEZITE TODO - zde musi respektovat aktualne ulozene hodnoty, tj. nacist je, pak pridat 
    42 // ty co se maji v tomto kroku ulozit a pak vse ulozit.. protoze to delame kompozici a ne dedenim  DODELAT 
    43 // ALE HOUBY, TAKHLE TO NEJDE, musime nechat jako samostatny objekt, kazda uroven tedy zvlast,  
    44 // jednoznacne jmeno atd..  
    45 // 
    46 //! information about connection to a logger 
    47 template<class T> class logged_options { 
     40//! This class stores a details that will be logged to a logger 
     41template<class T> class log_level_template { 
    4842private: 
     43        // UserInfo class have to be able to read all the internal  
     44        // attributes to be able to write/read log_level to/from a Setting structure 
    4945        friend class UI; 
    5046 
     
    5248        bitset<32> values; 
    5349 
     50        //! string equivalents of the used enumerations which are filled with a help of #LOG_LEVEL macro within class T 
    5451        const Array<string> &names() const 
    5552        { 
    56                 return T::option_names(); 
     53                return T::log_level_names(); 
    5754        } 
    5855 
    5956public: 
    6057         
     58        //! a general utility transforming a comma-separated sequence of strings into an instance of Array<strings> 
     59        static Array<string> string2Array( const string &input ) 
     60        { 
     61                string result = input; 
     62                string::size_type loc; 
     63                while( loc = result.find( ',' ), loc != string::npos ) 
     64                        result[loc] = ' '; 
     65                return Array<string>("{ " + result + " }" ); 
     66        } 
     67 
     68        //! is any field of log_level active? 
    6169        bool any() const 
    6270        { 
     
    6472        } 
    6573 
    66         bool operator [] (const enum T::possible_options &option ) const 
    67         { 
    68                 return values[option]; 
    69         } 
    70  
    71         bitset<32>::reference operator [] (const enum T::possible_options &option ) 
    72         { 
    73                 return values[option]; 
     74        //! read only operator for testing  individual fields of log_level 
     75        //! 
     76        //! it is necessary to acces it with a proper enumeration type, thus this approach is type-safe 
     77        bool operator [] (const enum T::log_level_enums &log_level ) const 
     78        { 
     79                return values[log_level]; 
     80        } 
     81 
     82        //! operator for setting an individual field of log_level  
     83        //! 
     84        //! it is necessary to acces it with a proper enumeration type, thus this approach is type-safe 
     85        bitset<32>::reference operator [] (const enum T::log_level_enums &log_level ) 
     86        { 
     87                return values[log_level]; 
    7488        } 
    7589}; 
    7690 
    77 // MUZEME INTERNE POUZIVAT ENUMY, A KLIDNE MENIT JEJICH PORADI, DIKY TOMUHLE MAKRU SE VZDY NAMAPUJI NA TY SPRAVNE STRINGY  
    78 #define LOG_LEVEL(CLASSNAME,...) private: friend class logged_options<CLASSNAME>; static const Array<string> &option_names() { static const Array<string> option_names( "{"#__VA_ARGS__" }" ); return option_names; }; public: enum possible_options { __VA_ARGS__ }; logged_options<CLASSNAME> log_level; 
     91/*! 
     92  \def LOG_LEVEL(classname,...) 
     93  \brief Macro for defining a log_level attribute with a specific set of enumerations related to a specific class  
     94 
     95  This macro has to be called within a class declaration. Its argument \a classname has to correspond to that wrapping class. 
     96  This macro defines a log_level instance which can be modified either directly or by the means of #UI class. 
     97 
     98  One of the main purposes of this macro is to allow variability in using enumerations. By relating them to their names through 
     99  an array of strings, we are no more dependant on their precise ordering. What is more, we can add or remove any without harming  
     100  any applications which are using this library. 
     101 
     102  \todo Write a more detailed explanation including also examples 
     103 
     104  \ref ui 
     105*/ 
     106#define LOG_LEVEL(classname,...) public: enum log_level_enums { __VA_ARGS__ }; log_level_template<classname> log_level; private: friend class log_level_template<classname>; static const Array<string> &log_level_names() { static const Array<string> log_level_names = log_level_template<classname>::string2Array( #__VA_ARGS__ ); return log_level_names; } 
    79107 
    80108//forward declaration 
     
    99127        friend class UI; 
    100128 
    101         // TODO okomentovat 
    102         static const Array<string> &option_names()  
     129        //! This method is a dummy method closely related to to the #LOG_LEVEL macro, do not remove it 
     130        static const string &log_level_names()  
    103131        {  
    104                 static const Array<string> option_names;  
    105                 return option_names;  
     132                static const string log_level_names;  
     133                return log_level_names;  
    106134        };  
    107135 
     
    189217 
    190218public: 
    191         // TODO okomentovat 
    192         enum possible_options { }; 
     219        //! This enumeration defines all possible options specifing the level of details logged by a logger about this specific class  
     220        //!  
     221        //! It has to be reimplemented in descendant classes using the #LOG_LEVEL macro 
     222        enum log_level_enums { }; 
    193223 
    194224        //!default constructor 
  • library/bdm/estim/particles.h

    r850 r870  
    2626 
    2727class PF : public BM { 
    28         //! Introduces two new options: 
    29         //! \li weights - meaning that all weightes will be logged 
    30         //! \li samples - all samples will be also logged 
     28        //! \var log_level_enums weights 
     29        //! all weightes will be logged 
     30 
     31        //! \var log_level_enums samples 
     32        //! all samples will be logged 
    3133        LOG_LEVEL(PF,weights,samples); 
    32  
     34         
    3335protected: 
    3436        //!number of particles; 
     
    221223 
    222224class MPF : public BM  { 
    223         //! Introduces new option  
    224         //! \li means - meaning TODO 
     225        //! \var log_level_enums means  
     226        //! TODO DOPLNIT 
    225227        LOG_LEVEL(MPF,means); 
     228 
    226229protected: 
    227230        //! particle filter on non-linear variable 
  • library/bdm/stat/exp_family.h

    r850 r870  
    350350*/ 
    351351class egiw : public eEF { 
     352        //! \var log_level_enums tri 
     353        //! TODO DOPLNIT 
    352354        LOG_LEVEL(egiw,tri); 
     355 
    353356protected: 
    354357        //! Extended information matrix of sufficient statistics