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

Revision 907, 4.9 kB (checked in by mido, 14 years ago)

LOG LEVEL improved and hopefully finished

  • 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 logit ( int id, const double &d ) {
61                bdm_assert_debug ( id < vectors.length(), "Logger was not initialized, run init()." );
62                bdm_assert_debug ( vectors ( id ).cols() == 1, "Vector expected" );
63                if ( id >= 0 ) {
64                        vectors ( id ) ( ind ) = d;
65                }
66        }
67        //! Save values into an itfile named after \c fname.
68        void itsave ( const char* fname );
69        //!
70        void finalize() {
71                if ( filename.length() > 0 && !file_saved ) {
72                        itsave ( ( filename + ".it" ).c_str() );
73                        if ( settings.length() > 0 ) {
74                                setting_conf.writeFile ( ( filename + ".cfg" ).c_str() );
75                        }
76                        file_saved = true;
77                }
78
79        };
80
81
82        /*! \brief UI for memlog
83
84        \code
85        logger = {
86                class = "memlog";
87                filename = "file_name"; // resulting filename with vectors in it format and setting in cfg
88                maxlen = 100;           // size of memory buffer
89        }
90        \endcode
91         */
92        void from_setting ( const Setting &set );
93
94        // TODO dodelat void to_setting( Setting &set ) const;
95};
96
97UIREGISTER ( memlog );
98SHAREDPTR ( memlog );
99
100
101/*! \brief Simple logger used for debugging
102All data records are written out to std from where they could be send to file
103*/
104class stdlog: public memlog {
105public:
106        //! default constructor
107        stdlog() : memlog ( 1 ) {};
108
109        void init() {
110                memlog::init();
111                for ( int i = 0; i < entries.length(); i++ ) {
112                        if ( entries ( i )._dsize() == 1 ) {
113                                cout << names ( i ) << separator << entries ( i ).name ( 0 ) << "\t";
114                        } else
115                                for ( int j = 0; j < vectors ( i ).cols(); j++ ) {
116                                        cout << names ( i ) << separator << entries ( i ).scalarname ( j ) << "\t";
117                                }
118                }
119                cout << endl;
120
121
122        }
123        //!writes everything out
124        void step() {
125                for ( int i = 0; i < vectors.length(); i++ ) {
126                        for ( int j = 0; j < vectors ( i ).cols(); j++ ) {
127                                cout << vectors ( i ) ( 0, j ) << "\t";
128                        }
129                }
130                cout << endl;
131        }
132        /*! \brief UI for stdlog
133
134        \code
135        logger = {
136                class = "stdlog"; // no parameterization needed
137        }
138        \endcode
139        */
140        void from_setting ( const Setting &set ) {
141        }
142};
143UIREGISTER ( stdlog );
144
145/*!
146* \brief Logging into dirfile with buffer in memory
147
148* Dirfile is a special format used by the kst program. See documentation of kst for description.
149*
150* This format is used to store scalars, hence multivariate RVs must be separated.
151*/
152class dirfilelog : public memlog {
153
154protected:
155        //!name of the directory
156        string dirname;
157        //! Automatically generated
158        Array<string> scalarnames;
159
160        //! this flag is only to assure reentrance of the finalize() method
161        bool buffers_written;
162public:
163        /*!\brief Default constructor
164        @param dirname0 name of the directory in which to store the results
165        @param maxlen0 length of the memory buffers, when full the buffers will be dumped to HDD and returned to the beginning. */
166        dirfilelog ( string dirname0, int maxlen0 ) : memlog ( maxlen0 ), dirname ( dirname0 ), scalarnames ( 0 ), buffers_written(false) {}
167
168        dirfilelog() : buffers_written(false) {}
169
170        //! Initialize storage
171        void init();
172        void step();
173        void finalize();
174        /*! \brief Write memory storage to disk.
175        @param Len length of buffer to be written, if 0 the file is truncated at 0.
176        */
177        void write_buffers ( int Len );
178
179        /*! \brief UI for dirfilelog (Kst file format)
180        \code
181        logger = {
182                class = "dirfilelog";
183                dirname = "directory_for_files"; // resulting files will be stored there
184                maxlen = 100;                    // size of memory buffer, when full results are written to disk
185        }
186        \endcode
187        */
188        void from_setting ( const Setting &set );
189
190        // TODO dodelat void to_setting( Setting &set ) const;
191};
192
193UIREGISTER ( dirfilelog );
194SHAREDPTR ( dirfilelog );
195
196};
197#endif // LGR_H
Note: See TracBrowser for help on using the browser.