00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPJOURNALIST_HPP__
00010 #define __IPJOURNALIST_HPP__
00011
00012 #include "IpoptConfig.h"
00013 #include "IpTypes.hpp"
00014 #include "IpReferenced.hpp"
00015 #include "IpSmartPtr.hpp"
00016
00017 #ifdef HAVE_CSTDARG
00018 # include <cstdarg>
00019 #else
00020 # ifdef HAVE_STDARG_H
00021 # include <stdarg.h>
00022 # else
00023 # include <cstdarg>
00024 # endif
00025 #endif
00026
00027 #ifdef HAVE_CSTDIO
00028 # include <cstdio>
00029 #else
00030 # ifdef HAVE_STDIO_H
00031 # include <stdio.h>
00032 # else
00033 # include <cstdio>
00034 # endif
00035 #endif
00036
00037 #include <string>
00038 #include <vector>
00039 #include <ostream>
00040
00041 namespace Ipopt
00042 {
00043
00044
00045 class Journal;
00046 class FileJournal;
00047
00051 enum EJournalLevel {
00052 J_INSUPPRESSIBLE=-1,
00053 J_NONE=0,
00054 J_ERROR,
00055 J_STRONGWARNING,
00056 J_SUMMARY,
00057 J_WARNING,
00058 J_ITERSUMMARY,
00059 J_DETAILED,
00060 J_MOREDETAILED,
00061 J_VECTOR,
00062 J_MOREVECTOR,
00063 J_MATRIX,
00064 J_MOREMATRIX,
00065 J_ALL,
00066 J_LAST_LEVEL
00067 };
00068
00070 enum EJournalCategory {
00071 J_DBG=0,
00072 J_STATISTICS,
00073 J_MAIN,
00074 J_INITIALIZATION,
00075 J_BARRIER_UPDATE,
00076 J_SOLVE_PD_SYSTEM,
00077 J_FRAC_TO_BOUND,
00078 J_LINEAR_ALGEBRA,
00079 J_LINE_SEARCH,
00080 J_HESSIAN_APPROXIMATION,
00081 J_SOLUTION,
00082 J_DOCUMENTATION,
00083 J_NLP,
00084 J_TIMING_STATISTICS,
00085 J_USER_APPLICATION ,
00086 J_USER1 ,
00087 J_USER2 ,
00088 J_USER3 ,
00089 J_USER4 ,
00090 J_USER5 ,
00091 J_USER6 ,
00092 J_USER7 ,
00093 J_USER8 ,
00094 J_USER9 ,
00095 J_USER10 ,
00096 J_USER11 ,
00097 J_USER12 ,
00098 J_USER13 ,
00099 J_USER14 ,
00100 J_USER15 ,
00101 J_USER16 ,
00102 J_USER17 ,
00103 J_LAST_CATEGORY
00104 };
00106
00134 class Journalist : public ReferencedObject
00135 {
00136 public:
00140 Journalist();
00141
00143 virtual ~Journalist();
00145
00152 virtual void Printf(EJournalLevel level, EJournalCategory category,
00153 const char* format, ...) const;
00154
00162 virtual void PrintStringOverLines(EJournalLevel level, EJournalCategory category,
00163 Index indent_spaces, Index max_length,
00164 const std::string& line) const;
00165
00167 virtual void PrintfIndented(EJournalLevel level,
00168 EJournalCategory category,
00169 Index indent_level,
00170 const char* format, ...) const;
00171
00174 virtual void VPrintf(EJournalLevel level,
00175 EJournalCategory category,
00176 const char* pformat,
00177 va_list ap) const;
00178
00181 virtual void VPrintfIndented(EJournalLevel level,
00182 EJournalCategory category,
00183 Index indent_level,
00184 const char* pformat,
00185 va_list ap) const;
00186
00193 virtual bool ProduceOutput(EJournalLevel level,
00194 EJournalCategory category) const;
00195
00196
00201 virtual void FlushBuffer() const;
00203
00222 virtual bool AddJournal(const SmartPtr<Journal> jrnl);
00223
00231 virtual SmartPtr<Journal> AddFileJournal(
00232 const std::string& location_name,
00233 const std::string& fname,
00234 EJournalLevel default_level = J_WARNING
00235 );
00236
00240 virtual SmartPtr<Journal> GetJournal(const std::string& location_name);
00241
00243 virtual void DeleteAllJournals();
00245
00246 private:
00256 Journalist(const Journalist&);
00257
00259 void operator=(const Journalist&);
00261
00262
00264 std::vector< SmartPtr<Journal> > journals_;
00266 };
00267
00273 class Journal : public ReferencedObject
00274 {
00275 public:
00277 Journal(const std::string& name, EJournalLevel default_level);
00278
00280 virtual ~Journal();
00281
00283 virtual std::string Name();
00284
00286 virtual void SetPrintLevel(
00287 EJournalCategory category, EJournalLevel level
00288 );
00289
00291 virtual void SetAllPrintLevels(
00292 EJournalLevel level
00293 );
00294
00306 virtual bool IsAccepted(
00307 EJournalCategory category, EJournalLevel level
00308 ) const;
00309
00311 virtual void Print(EJournalCategory category, EJournalLevel level,
00312 const char* str)
00313 {
00314 PrintImpl(category, level, str);
00315 }
00316
00318 virtual void Printf(EJournalCategory category, EJournalLevel level,
00319 const char* pformat, va_list ap)
00320 {
00321 PrintfImpl(category, level, pformat, ap);
00322 }
00323
00325 virtual void FlushBuffer()
00326 {
00327 FlushBufferImpl();
00328 }
00330
00331 protected:
00337 virtual void PrintImpl(EJournalCategory category, EJournalLevel level,
00338 const char* str)=0;
00339
00341 virtual void PrintfImpl(EJournalCategory category, EJournalLevel level,
00342 const char* pformat, va_list ap)=0;
00343
00345 virtual void FlushBufferImpl()=0;
00347
00348 private:
00358 Journal();
00359
00361 Journal(const Journal&);
00362
00364 void operator=(const Journal&);
00366
00368 std::string name_;
00369
00371 Index print_levels_[J_LAST_CATEGORY];
00372 };
00373
00374
00379 class FileJournal : public Journal
00380 {
00381 public:
00383 FileJournal(const std::string& name, EJournalLevel default_level);
00384
00386 virtual ~FileJournal();
00387
00395 virtual bool Open(const char* fname);
00396
00397 protected:
00403 virtual void PrintImpl(EJournalCategory category, EJournalLevel level,
00404 const char* str);
00405
00407 virtual void PrintfImpl(EJournalCategory category, EJournalLevel level,
00408 const char* pformat, va_list ap);
00409
00411 virtual void FlushBufferImpl();
00413
00414 private:
00424 FileJournal();
00425
00427 FileJournal(const FileJournal&);
00428
00430 void operator=(const FileJournal&);
00432
00434 FILE* file_;
00435 };
00436
00440 class StreamJournal : public Journal
00441 {
00442 public:
00444 StreamJournal(const std::string& name, EJournalLevel default_level);
00445
00447 virtual ~StreamJournal()
00448 {}
00449
00451 void SetOutputStream(std::ostream* os);
00452
00453 protected:
00459 virtual void PrintImpl(EJournalCategory category, EJournalLevel level,
00460 const char* str);
00461
00463 virtual void PrintfImpl(EJournalCategory category, EJournalLevel level,
00464 const char* pformat, va_list ap);
00465
00467 virtual void FlushBufferImpl();
00469
00470 private:
00480 StreamJournal();
00481
00483 StreamJournal(const StreamJournal&);
00484
00486 void operator=(const StreamJournal&);
00488
00490 std::ostream* os_;
00491
00493 char buffer_[32768];
00494 };
00495 }
00496
00497 #endif