aGrUM  0.20.3
a C++ library for (probabilistic) graphical models
UAIMNReader.h
Go to the documentation of this file.
1 /**
2  *
3  * Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(@LIP6) et Christophe GONZALES(@AMU)
4  * (@AMU) info_at_agrum_dot_org
5  *
6  * This library is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this library. If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 /**
22  * @file
23  * @brief Definition file for UAI exportation class
24  *
25  * Reads a markov net in UAI format
26  *
27  * @author Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
28  */
29 
30 #ifndef UAI_MN_READER_H
31 #define UAI_MN_READER_H
32 
33 #include <agrum/MN/MarkovNet.h>
34 #include <agrum/MN/io/MNReader.h>
35 #include <agrum/agrum.h>
36 #include <iostream>
37 #include <string>
38 
39 #ifndef DOXYGEN_SHOULD_SKIP_THIS
40 // including coco-generated PARSER and SCANNER
41 # undef _COCO_PARSER_H_
42 # undef _COCO_SCANNER_H_
43 # include <agrum/MN/io/UAI/cocoR/Parser.h>
44 #endif // DOXYGEN_SHOULD_SKIP_THIS
45 
46 namespace gum {
47  /* =========================================================================*/
48  /* === READERS === */
49  /* =========================================================================*/
50  /**
51  * @class UAIMNReader
52  * @headerfile UAIMNReader.h <agrum/MN/io/UAI/UAIMNReader.h>
53  * @ingroup mn_io
54  * @brief Pure virtual class for reading a MN from a file.
55  *
56  * Every class used to read the content of a Markov Network from a stream,
57  * or a file must be a subclass of UAIMNReader.
58  */
59  template < typename GUM_SCALAR >
60  class UAIMNReader: public MNReader< GUM_SCALAR > {
61  public:
62  /**
63  * Constructor
64  * A reader is defined for reading a defined file. Hence the 2 args of the
65  * constructor.
66  * Note that the MN has to be built outside the reader. There is no
67  * delegation to
68  * create/destroy
69  * the MN from inside the reader.
70  */
71  UAIMNReader(MarkovNet< GUM_SCALAR >* MN, const std::string& filename);
72 
73  /**
74  * Default destructor.
75  */
76  ~UAIMNReader() final;
77 
78  /// Direct access to DSL scanner (mandatory for listener connection)
79  /// @throws IOError if file not exists
80  UAIMN::Scanner& scanner();
81 
82  /// name of read file
83  const std::string& streamName() const;
84 
85  /// accessor to trace function (just write the number of parser line)
86  bool trace() const;
87  void trace(bool b);
88 
89  /// parse.
90  /// @return the number of detected errors
91  /// @throws IOError if file not exists
92  Size proceed() final;
93 
94  void buildFromQuartets(std::vector< std::tuple< float, int, int, int > > quartets);
95 
96  /// @{
97  /// publishing Errors API
98 
99  /// # of errors
100  Size errors();
101  /// # of errors
102  Size warnings();
103 
104  /// line of ith error or warning
105  Idx errLine(Idx i);
106  /// col of ith error or warning
107  Idx errCol(Idx i);
108  /// type of ith error or warning
109  bool errIsError(Idx i);
110  /// message of ith error or warning
111  std::string errMsg(Idx i);
112 
113  /// send on std::cerr the list of errorswith contents
114  void showElegantErrors(std::ostream& o = std::cerr);
115 
116  /// send on std::cerr the list of errors or warnings with contents
117  void showElegantErrorsAndWarnings(std::ostream& o = std::cerr);
118 
119  /// send on std::cerr the list of errors or warnings
120  void showErrorsAndWarnings(std::ostream& o = std::cerr);
121 
122  /// send on std::cerr the number of errors and the number of warnings
123  void showErrorCounts(std::ostream& o = std::cerr);
124  /// @}
125 
126  protected:
127  MarkovNet< GUM_SCALAR >* _mn_;
128  UAIMN::Scanner* _scanner_;
129  UAIMN::Parser* _parser_;
130 
131  std::string _streamName_;
132  bool _traceScanning_;
133  bool _parseDone_;
134 
135  // a boolean to throw the ioerror not in the constructor but in the
136  // proceed()
137  bool _ioerror_;
138 
139  void _addFatalError_(Idx lig, Idx col,
140  const std::string& s); // throw an exception
141  void _addError_(Idx lig, Idx col, const std::string& s);
142  void _addWarning_(Idx lig, Idx col, const std::string& s);
143  };
144 
145 
146 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
147  extern template class UAIMNReader< double >;
148 #endif
149 
150 } /* namespace gum */
151 
152 #include "UAIMNReader_tpl.h"
153 
154 #endif // UAI_MN_READER_H