Changeset 788 for library

Show
Ignore:
Timestamp:
01/15/10 01:29:59 (14 years ago)
Author:
mido
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

    r770 r788  
    1515 
    1616#include <map> 
     17#include <string> 
     18#include <bitset> 
    1719 
    1820#include "../itpp_ext.h" 
     
    970972*/ 
    971973 
     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 
     982enum defined_options; 
     983 
     984class 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{ 
     992private: 
     993        bitset<32> values; 
     994 
     995        static const Array<string> names;  
     996 
     997public: 
     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}; 
     1028UIREGISTER(logged_options); 
     1029DEFINED_OPTIONS(bounds,likelyhood,full); 
     1030 
     1031 
    9721032class BM : public root { 
    9731033protected: 
     
    10851145        //!@{ 
    10861146 
    1087         //! Set boolean options from a string, recognized are: "logbounds,logll" 
    1088         virtual void set_options ( const string &opt ); 
    1089  
    10901147        //! Add all logged variables to a logger 
    10911148        //! Log levels two digits: xy where 
     
    10961153        //! Save results to the given logger, details of what is stored is configured by \c LIDs and \c options 
    10971154        virtual void log_write ( ) const; 
     1155 
     1156 
     1157        // TOHLE EFEKTIVNE NAHRAZUJE loglevel 
     1158        // TODO pozdeji dat private 
     1159        logged_options logged; 
    10981160 
    10991161        //!@} 
     
    11121174                } 
    11131175 
    1114                 string opt; 
    1115                 if ( UI::get ( opt, set, "options", UI::optional ) ) { 
    1116                         set_options ( opt ); 
    1117                 } 
    1118         } 
     1176                UI::get ( logged, set, "logged", UI::optional ); 
     1177        } 
     1178 
    11191179 
    11201180        void to_setting ( Setting &set ) const { 
     
    11231183                UI::save( &rvc, set, "rvc" );            
    11241184                UI::save( &posterior()._rv(), set, "rv" ); 
    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; 
     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                        } 
    11381209                } 
    1139                 if( log_level == 1 ) opt = opt + "logll"; 
    1140                 if( !opt.empty() ) 
    1141                         UI::save( opt, set, "options" ); 
    1142         } 
     1210        } 
     1211 
     1212 
    11431213}; 
    11441214