root/library/bdm/base/loggers.h

Revision 1069, 5.8 kB (checked in by mido, 14 years ago)

documentation of loggers updated

  • Property svn:eol-style set to native
Line 
1/*!
2  \file
3  \brief Loggers for storing results of experiments
4  \author Vaclav Smidl.
5
6  -----------------------------------
7  BDM++ - C++ library for Bayesian Decision Making under Uncertainty
8
9  Using IT++ for numerical operations
10  -----------------------------------
11*/
12
13#ifndef LGR_H
14#define LGR_H
15
16#include "bdmbase.h"
17#include "user_info.h"
18
19namespace bdm {
20using std::string;
21
22/*! \brief Logging into matrices in data format in memory, optionally persisted into a file.
23 */
24class memlog : public logger {
25
26protected:
27    //! Maximum length of vectors stored in memory
28    int maxlen;
29    //! Currect record to be written
30    int ind;
31    //! Storage
32    Array<mat> vectors;
33    //! name of  file to save results (IT file for vectors and cfg for settings)
34    string filename;
35
36    //! this flag is only to assure reentrance of the finalize() method
37    bool file_saved;
38public:
39    //! convenience constructor
40    memlog ( int maxlen0, string fn = "" ) : logger ( "_" ), maxlen ( maxlen0 ), ind ( 0 ), vectors ( 0 ), filename ( fn ), file_saved(false) {}
41
42    //!Default constructor
43    memlog() : logger ( "_" ), maxlen ( 0 ), ind ( 0 ), vectors ( 0 ), file_saved(false) {}
44
45    //! Initialize storage
46    void init();
47
48    void step() {
49        if ( ind < maxlen ) ind++;
50        else bdm_error ( "memlog::ind is too high;" );
51    }
52
53    void log_vector ( int id, const vec &v ) {
54        bdm_assert ( id < vectors.length(), "Logger was not initialized, run init()." );
55        if ( id >= 0 ) {
56            vectors ( id ).set_row ( ind, v );
57        }
58    }
59    void log_double ( int id, const double &d ) {
60        bdm_assert ( id < vectors.length(), "Logger was not initialized, run init()." );
61        if ( id >= 0 ) {
62            vectors ( id )( ind, 0 )=d;
63        }
64    }
65    void logit ( int id, const double &d ) {
66        bdm_assert_debug ( id < vectors.length(), "Logger was not initialized, run init()." );
67        bdm_assert_debug ( vectors ( id ).cols() == 1, "Vector expected" );
68        if ( id >= 0 ) {
69            vectors ( id ) ( ind ) = d;
70        }
71    }
72    //! Save values into an itfile named after \c fname.
73    void itsave ( const char* fname );
74    //!
75    void finalize() {
76        if ( filename.length() > 0 && !file_saved ) {
77            itsave ( ( filename + ".it" ).c_str() );
78            if ( settings.length() > 0 ) {
79                setting_conf.writeFile ( ( filename + ".cfg" ).c_str() );
80            }
81            file_saved = true;
82        }
83
84    };
85
86
87   /*! Create object from the following structure
88
89    \code
90    class = 'memlog';   
91    maxlen = [];               % size of memory buffer
92    --- optional fields ---
93    filename = 'file_name';    % resulting filename with vectors in itpp format and setting in cfg       
94    --- inherited fields ---
95    bdm::logger::from_setting
96    \endcode
97     */
98    void from_setting ( const Setting &set );
99
100    // TODO dodelat void to_setting( Setting &set ) const;
101};
102
103UIREGISTER ( memlog );
104SHAREDPTR ( memlog );
105
106
107/*! \brief Simple logger used for debugging
108All data records are written out to std from where they could be send to file
109*/
110class stdlog: public memlog {
111public:
112    //! default constructor
113    stdlog() : memlog ( 1 ) {};
114
115    void init() {
116        memlog::init();
117        for ( int i = 0; i < entries.length(); i++ ) {
118            if ( entries ( i )._dsize() == 1 ) {
119                cout << names ( i ) << separator << entries ( i ).name ( 0 ) << "\t";
120            } else
121                for ( int j = 0; j < vectors ( i ).cols(); j++ ) {
122                    cout << names ( i ) << separator << entries ( i ).scalarname ( j ) << "\t";
123                }
124        }
125        cout << endl;
126
127
128    }
129    //!writes everything out
130    void step() {
131        for ( int i = 0; i < vectors.length(); i++ ) {
132            for ( int j = 0; j < vectors ( i ).cols(); j++ ) {
133                cout << vectors ( i ) ( 0, j ) << "\t";
134            }
135        }
136        cout << endl;
137    }
138   /*! Create object from the following structure
139    \code
140    class = 'stdlog';   % no parameterization needed
141    \endcode
142    */
143    void from_setting ( const Setting &set ) {
144    }
145};
146UIREGISTER ( stdlog );
147
148/*!
149* \brief Logging into dirfile with buffer in memory
150
151* Dirfile is a special format used by the kst program. See documentation of kst for description.
152*
153* This format is used to store scalars, hence multivariate RVs must be separated.
154*/
155class dirfilelog : public memlog {
156
157protected:
158    //!name of the directory
159    string dirname;
160    //! Automatically generated
161    Array<string> scalarnames;
162
163    //! this flag is only to assure reentrance of the finalize() method
164    bool buffers_written;
165public:
166    /*!\brief Default constructor
167    @param dirname0 name of the directory in which to store the results
168    @param maxlen0 length of the memory buffers, when full the buffers will be dumped to HDD and returned to the beginning. */
169    dirfilelog ( string dirname0, int maxlen0 ) : memlog ( maxlen0 ), dirname ( dirname0 ), scalarnames ( 0 ), buffers_written(false) {}
170
171    dirfilelog() : buffers_written(false) {}
172
173    //! Initialize storage
174    void init();
175    void step();
176    void finalize();
177    /*! \brief Write memory storage to disk.
178    @param Len length of buffer to be written, if 0 the file is truncated at 0.
179    */
180    void write_buffers ( int Len );
181
182    /*! Create object from the following structure
183    \code
184    class = 'dirfilelog';
185    dirname = 'directory_for_files'; % resulting files will be stored there
186    maxlen = [];                     % size of memory buffer, when full results are written to disk
187    --- inherited fields ---
188    bdm::memlog::from_setting
189    \endcode
190    */
191    void from_setting ( const Setting &set );
192
193    // TODO dodelat void to_setting( Setting &set ) const;
194};
195
196UIREGISTER ( dirfilelog );
197SHAREDPTR ( dirfilelog );
198
199};
200#endif // LGR_H
Note: See TracBrowser for help on using the browser.