root/library/bdm/base/loggers.h @ 1064

Revision 1064, 5.6 kB (checked in by mido, 14 years ago)

astyle applied all over the library

  • 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/*!
23 * Logging into matrices in data format in memory, optionally persisted into a file.
24 */
25class memlog : public logger {
26
27protected:
28    //! Maximum length of vectors stored in memory
29    int maxlen;
30    //! Currect record to be written
31    int ind;
32    //! Storage
33    Array<mat> vectors;
34    //! name of  file to save results (IT file for vectors and cfg for settings)
35    string filename;
36
37    //! this flag is only to assure reentrance of the finalize() method
38    bool file_saved;
39public:
40    //! convenience constructor
41    memlog ( int maxlen0, string fn = "" ) : logger ( "_" ), maxlen ( maxlen0 ), ind ( 0 ), vectors ( 0 ), filename ( fn ), file_saved(false) {}
42
43    //!Default constructor
44    memlog() : logger ( "_" ), maxlen ( 0 ), ind ( 0 ), vectors ( 0 ), file_saved(false) {}
45
46    //! Initialize storage
47    void init();
48
49    void step() {
50        if ( ind < maxlen ) ind++;
51        else bdm_error ( "memlog::ind is too high;" );
52    }
53
54    void log_vector ( int id, const vec &v ) {
55        bdm_assert ( id < vectors.length(), "Logger was not initialized, run init()." );
56        if ( id >= 0 ) {
57            vectors ( id ).set_row ( ind, v );
58        }
59    }
60    void log_double ( int id, const double &d ) {
61        bdm_assert ( id < vectors.length(), "Logger was not initialized, run init()." );
62        if ( id >= 0 ) {
63            vectors ( id )( ind, 0 )=d;
64        }
65    }
66    void logit ( int id, const double &d ) {
67        bdm_assert_debug ( id < vectors.length(), "Logger was not initialized, run init()." );
68        bdm_assert_debug ( vectors ( id ).cols() == 1, "Vector expected" );
69        if ( id >= 0 ) {
70            vectors ( id ) ( ind ) = d;
71        }
72    }
73    //! Save values into an itfile named after \c fname.
74    void itsave ( const char* fname );
75    //!
76    void finalize() {
77        if ( filename.length() > 0 && !file_saved ) {
78            itsave ( ( filename + ".it" ).c_str() );
79            if ( settings.length() > 0 ) {
80                setting_conf.writeFile ( ( filename + ".cfg" ).c_str() );
81            }
82            file_saved = true;
83        }
84
85    };
86
87
88    /*! \brief UI for memlog
89
90    \code
91    logger = {
92        class = "memlog";
93        filename = "file_name"; // resulting filename with vectors in it format and setting in cfg
94        maxlen = 100;           // size of memory buffer
95    }
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    /*! \brief UI for stdlog
139
140    \code
141    logger = {
142        class = "stdlog"; // no parameterization needed
143    }
144    \endcode
145    */
146    void from_setting ( const Setting &set ) {
147    }
148};
149UIREGISTER ( stdlog );
150
151/*!
152* \brief Logging into dirfile with buffer in memory
153
154* Dirfile is a special format used by the kst program. See documentation of kst for description.
155*
156* This format is used to store scalars, hence multivariate RVs must be separated.
157*/
158class dirfilelog : public memlog {
159
160protected:
161    //!name of the directory
162    string dirname;
163    //! Automatically generated
164    Array<string> scalarnames;
165
166    //! this flag is only to assure reentrance of the finalize() method
167    bool buffers_written;
168public:
169    /*!\brief Default constructor
170    @param dirname0 name of the directory in which to store the results
171    @param maxlen0 length of the memory buffers, when full the buffers will be dumped to HDD and returned to the beginning. */
172    dirfilelog ( string dirname0, int maxlen0 ) : memlog ( maxlen0 ), dirname ( dirname0 ), scalarnames ( 0 ), buffers_written(false) {}
173
174    dirfilelog() : buffers_written(false) {}
175
176    //! Initialize storage
177    void init();
178    void step();
179    void finalize();
180    /*! \brief Write memory storage to disk.
181    @param Len length of buffer to be written, if 0 the file is truncated at 0.
182    */
183    void write_buffers ( int Len );
184
185    /*! \brief UI for dirfilelog (Kst file format)
186    \code
187    logger = {
188        class = "dirfilelog";
189        dirname = "directory_for_files"; // resulting files will be stored there
190        maxlen = 100;                    // size of memory buffer, when full results are written to disk
191    }
192    \endcode
193    */
194    void from_setting ( const Setting &set );
195
196    // TODO dodelat void to_setting( Setting &set ) const;
197};
198
199UIREGISTER ( dirfilelog );
200SHAREDPTR ( dirfilelog );
201
202};
203#endif // LGR_H
Note: See TracBrowser for help on using the browser.