Changeset 792 for library/bdm

Show
Ignore:
Timestamp:
01/21/10 23:21:36 (14 years ago)
Author:
smidl
Message:

sketch of class logged_options which is intendet to replace log_level in future, DOES NOT WORK AT THE MOMENT, NOT TESTED

Files:
1 modified

Legend:

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

    r788 r792  
    1515 
    1616#include <map> 
    17 #include <string> 
    18 #include <bitset> 
    1917 
    2018#include "../itpp_ext.h" 
     
    972970*/ 
    973971 
    974 #ifndef BDMLIB 
    975 // MUZEME INTERNE POUZIVAT ENUMY, A KLIDNE MENIT JEJICH PORADI, DIKY TOMUHLE MAKRU SE VZDY NAMAPUJI NA TY SPRAVNE STRINGY  
    976 #define DEFINED_OPTIONS(...) enum defined_options { __VA_ARGS__ }; const Array<string> logged_options::names( "{"#__VA_ARGS__"}" ) 
    977 // TODO: ROZPARESUJE TO KONSTRUKTOR ARRAYE NA JEDNOTLIVE STRINGY?? NUTNO OTESTOVAT!! 
    978 #else 
    979 #define DEFINED_OPTIONS(...) enum defined_options { __VA_ARGS__ };  
    980 #endif 
    981  
    982 enum defined_options; 
    983  
    984 class logged_options : public root  
    985 // TODO: HA, TADY TO MAME!! POKUD ZDE CHCEME TEZ UZIVAT FROMSETTING A TOSETTING, NEMUZOU BYT LOGOVACI 
    986 // VECI PRIMO V ROOTU.. RESENIM BUDE ZREJME KOMPOZICE - FUNKCNOST SOUVISEJICI S LOGGERAMA UMISTENA V ROOTU  
    987 // PREJDE DO TETO TRIDY, A KDO BUDE MIT ZAJEM O NAPOJENI NA LOGGERY MUSI OBSAHOVAT LOGGED_OPTIONS INSTANCI...  
    988 // TZN. TRIDU LOGGED OPTIONS BUDE JESTE TREBA LEHCE ROZSIRIT.. 
    989 // KOMPOZICE TAKY UMOZNI NEKOLIK RUZNYCH LOGGERU PRO JEDEN OBJEKT.. PROSTE BUDE OBSHOVAT NEKOLIK RUZNYCH  
    990 // LOGGED_OPTIONS INSTANCI NAPOJENYCH NA RUZNE LOGGERY.. HMM, ALE TO JE TREBA JESTE DOMYSLET.) 
    991 { 
    992 private: 
    993         bitset<32> values; 
    994  
    995         static const Array<string> names;  
    996  
    997 public: 
    998          
    999         bool operator [] (const defined_options &option ) 
    1000         { 
    1001                 return values[option]; 
    1002         } 
    1003  
    1004         void from_setting ( const Setting &set ) 
    1005         { 
    1006                 values.reset(); 
    1007                 Array<string> true_options; 
    1008                 UI::get( true_options, set ); 
    1009                 for( int i = 0; i < true_options.length(); i++ ) 
    1010                         for( int j = 0; j < names.length(); j++ ) 
    1011                                 if( true_options(i) == names(j)  )  
    1012                                 { 
    1013                                         values[j] = true; 
    1014                                         break; 
    1015                                 } // TODO kdyz ho to vubec nenajde, nic se nedeje.. coz radeji vyhodit UI vyjimku??! 
    1016         } 
    1017          
    1018         void to_setting( Setting &set ) const 
    1019         { 
    1020                 Array<string> true_options( values.count() ); 
    1021                 int true_options_count = 0; 
    1022                 for( unsigned int i = 0; i < values.size(); i++ ) 
    1023                         if( values[i] )  
    1024                                 true_options( true_options_count++ ) = names(i); 
    1025                 UI::save( true_options, set ); 
    1026         } 
    1027 }; 
    1028 UIREGISTER(logged_options); 
    1029 DEFINED_OPTIONS(bounds,likelyhood,full); 
    1030  
    1031  
    1032972class BM : public root { 
    1033973protected: 
     
    11451085        //!@{ 
    11461086 
     1087        //! Set boolean options from a string, recognized are: "logbounds,logll" 
     1088        virtual void set_options ( const string &opt ); 
     1089 
    11471090        //! Add all logged variables to a logger 
    11481091        //! Log levels two digits: xy where 
     
    11531096        //! Save results to the given logger, details of what is stored is configured by \c LIDs and \c options 
    11541097        virtual void log_write ( ) const; 
    1155  
    1156  
    1157         // TOHLE EFEKTIVNE NAHRAZUJE loglevel 
    1158         // TODO pozdeji dat private 
    1159         logged_options logged; 
    11601098 
    11611099        //!@} 
     
    11741112                } 
    11751113 
    1176                 UI::get ( logged, set, "logged", UI::optional ); 
    1177         } 
    1178  
     1114                string opt; 
     1115                if ( UI::get ( opt, set, "options", UI::optional ) ) { 
     1116                        set_options ( opt ); 
     1117                } 
     1118        } 
    11791119 
    11801120        void to_setting ( Setting &set ) const { 
     
    11831123                UI::save( &rvc, set, "rvc" );            
    11841124                UI::save( &posterior()._rv(), set, "rv" ); 
    1185                 UI::save( &posterior()._rv(), set, "rv" ); 
    1186                 UI::save( &logged, set, "logged" ); 
    1187         } 
    1188  
    1189         virtual void set_options ( const string &  );  
    1190          
    1191         // TODO JEN JAKO UKAZKA POUZIT LOGGED[..], NAKONEC ODSTRANIT CELOU METODU, A TAKY JEJI ORIGINAL VYSE 
    1192         // jen co zavedeme logged_options i do dalsich objektu, pak se vse muze nastavovat primo  
    1193         // ve from_settingu, bude to tak ok?  
    1194         // nejlepsi by bylo, kdyby se options posterioru() nastavovaly v jeho from_settingu,  
    1195         // aby nevznikala takovahle kaskada zavislosti.. pujde to? domyslet 
    1196         virtual void SHOWING_ROOM( const string &  ) 
    1197         { 
    1198                 if ( logged[full] ) { 
    1199                         const_cast<epdf&> ( posterior() ).set_log_level ( 10 ) ; 
    1200                 } else { 
    1201                         if ( logged[bounds]  ) { 
    1202                                 const_cast<epdf&> ( posterior() ).set_log_level ( 2 ) ; 
    1203                         } else { 
    1204                                 const_cast<epdf&> ( posterior() ).set_log_level ( 1 ) ; 
    1205                         } 
    1206                         if ( logged[likelyhood]  ) { 
    1207                                 log_level = 1; 
    1208                         } 
     1125 
     1126                string opt; 
     1127                switch( posterior()._log_level() ) 
     1128                { 
     1129                case 2: 
     1130                        opt = "logbounds "; 
     1131                        break; 
     1132                case 10: 
     1133                        opt = "logfull "; 
     1134                        break; 
     1135                default: 
     1136                        opt = ""; 
     1137                        break; 
    12091138                } 
    1210         } 
    1211  
    1212  
     1139                if( log_level == 1 ) opt = opt + "logll"; 
     1140                if( !opt.empty() ) 
     1141                        UI::save( opt, set, "options" ); 
     1142        } 
    12131143}; 
    12141144