45#ifndef DOXYGEN_SHOULD_SKIP_THIS
49 template < GUM_Numeric GUM_SCALAR >
51 std::string_view filename) :
53 GUM_CONSTRUCTOR(UAIMRFReader);
57 _streamName_ = filename;
63 _scanner_ =
new UAIMRF::Scanner(_streamName_.c_str());
64 _parser_ =
new UAIMRF::Parser(_scanner_);
65 }
catch (
IOError const&) { _ioerror_ =
true; }
68 template < GUM_Numeric GUM_SCALAR >
69 UAIMRFReader< GUM_SCALAR >::~UAIMRFReader() {
70 GUM_DESTRUCTOR(UAIMRFReader);
74 if (_parser_)
delete (_parser_);
76 if (_scanner_)
delete (_scanner_);
80 template < GUM_Numeric GUM_SCALAR >
81 UAIMRF::Scanner& UAIMRFReader< GUM_SCALAR >::scanner() {
82 if (_ioerror_) {
GUM_ERROR(gum::IOError,
"No such file " + streamName()) }
87 template < GUM_Numeric GUM_SCALAR >
88 const std::string& UAIMRFReader< GUM_SCALAR >::streamName()
const {
92 template < GUM_Numeric GUM_SCALAR >
93 bool UAIMRFReader< GUM_SCALAR >::trace()
const {
94 return _traceScanning_;
97 template < GUM_Numeric GUM_SCALAR >
98 void UAIMRFReader< GUM_SCALAR >::trace(
bool b) {
100 scanner().setTrace(b);
103 template < GUM_Numeric GUM_SCALAR >
104 Size UAIMRFReader< GUM_SCALAR >::proceed() {
105 if (_ioerror_) {
GUM_ERROR(gum::IOError,
"No such file " + streamName()) }
111 buildFromQuartets(_parser_->getQuartets());
114 return 1 + _parser_->errors().error_count;
118 return (_parser_->errors().error_count);
121 template < GUM_Numeric GUM_SCALAR >
122 void UAIMRFReader< GUM_SCALAR >::buildFromQuartets(
123 std::vector< std::tuple< float, int, int, int > > quartets) {
125 Size max = quartets.size();
127 _addWarning_(1, 1,
"Empty MarkovRandomField");
131 auto isInt = [&]() ->
bool {
return (std::get< 0 >(quartets[current]) == -1); };
132 auto lig = [&]() ->
int {
return std::get< 2 >(quartets[current]); };
133 auto col = [&]() ->
int {
return std::get< 3 >(quartets[current]); };
135 auto getInt = [&]() ->
int {
136 if (!isInt()) this->_addFatalError_(lig(), col(),
"int expected");
137 return std::get< 1 >(quartets[current]);
139 auto getVal = [&]() -> GUM_SCALAR {
140 return (isInt()) ? (std::get< 1 >(quartets[current])) : (
std::get< 0 >(quartets[current]));
142 auto incCurrent = [&]() {
144 if (current >= max) this->_addFatalError_(lig(), col(),
"Not enough data in UAI file");
148 Size nbrNode = (Size)getInt();
150 for (NodeId i = 0; i < nbrNode; i++) {
153 if (mod < 2) _addError_(lig(), col(),
"Number of modalities should be greater than 2.");
158 Size nbrFactors = (Size)getInt();
160 std::vector< NodeSet > clicks;
161 for (NodeId i = 0; i < nbrFactors; i++) {
163 Size nbrVar = (Size)getInt();
164 if (nbrVar == 0) _addError_(lig(), col(),
"0 is not possible here");
167 for (NodeId j = 0; j < nbrVar; j++) {
169 NodeId nod = (NodeId)getInt();
171 _addError_(lig(), col(),
"Not enough variables in the MarkovRandomField");
174 _mn_->addFactor(vars);
175 clicks.push_back(vars);
178 for (NodeId i = 0; i < nbrFactors; i++) {
180 Size nbrParam = (Size)getInt();
181 if (nbrParam != _mn_->factor(clicks[i]).domainSize()) {
182 _addFatalError_(lig(), col(),
"Size does not fit between clique and parameters");
184 std::vector< GUM_SCALAR > v;
185 for (Idx j = 0; j < nbrParam; j++) {
187 v.push_back(getVal());
189 _mn_->factor(clicks[i]).fillWith(v);
193 if (current != max - 1) _addError_(lig(), col(),
"Too many data in this file");
198 template < GUM_Numeric GUM_SCALAR >
199 Idx UAIMRFReader< GUM_SCALAR >::errLine(Idx i) {
200 if (_parseDone_)
return _parser_->errors().error(i).line;
204 template < GUM_Numeric GUM_SCALAR >
205 Idx UAIMRFReader< GUM_SCALAR >::errCol(Idx i) {
206 if (_parseDone_)
return _parser_->errors().error(i).column;
210 template < GUM_Numeric GUM_SCALAR >
211 bool UAIMRFReader< GUM_SCALAR >::errIsError(Idx i) {
212 if (_parseDone_)
return _parser_->errors().error(i).is_error;
216 template < GUM_Numeric GUM_SCALAR >
217 std::string UAIMRFReader< GUM_SCALAR >::errMsg(Idx i) {
218 if (_parseDone_)
return _parser_->errors().error(i).msg;
222 template < GUM_Numeric GUM_SCALAR >
223 void UAIMRFReader< GUM_SCALAR >::showElegantErrors(std::ostream& o) {
224 if (_parseDone_) _parser_->errors().elegantErrors(o);
228 template < GUM_Numeric GUM_SCALAR >
229 void UAIMRFReader< GUM_SCALAR >::showElegantErrorsAndWarnings(std::ostream& o) {
230 if (_parseDone_) _parser_->errors().elegantErrorsAndWarnings(o);
234 template < GUM_Numeric GUM_SCALAR >
235 void UAIMRFReader< GUM_SCALAR >::showErrorsAndWarnings(std::ostream& o) {
236 if (_parseDone_) _parser_->errors().simpleErrorsAndWarnings(o);
240 template < GUM_Numeric GUM_SCALAR >
241 void UAIMRFReader< GUM_SCALAR >::showErrorCounts(std::ostream& o) {
242 if (_parseDone_) _parser_->errors().syntheticResults(o);
246 template < GUM_Numeric GUM_SCALAR >
247 Size UAIMRFReader< GUM_SCALAR >::errors() {
248 return (!_parseDone_) ? (Size)0 : _parser_->errors().error_count;
251 template < GUM_Numeric GUM_SCALAR >
252 Size UAIMRFReader< GUM_SCALAR >::warnings() {
253 return (!_parseDone_) ? (Size)0 : _parser_->errors().warning_count;
256 template < GUM_Numeric GUM_SCALAR >
257 void UAIMRFReader< GUM_SCALAR >::_addFatalError_(Idx lig, Idx col, std::string_view s) {
258 _parser_->errors().addError(s, _streamName_, lig, col);
262 template < GUM_Numeric GUM_SCALAR >
263 void UAIMRFReader< GUM_SCALAR >::_addError_(Idx lig, Idx col, std::string_view s) {
264 _parser_->errors().addError(s, _streamName_, lig, col);
267 template < GUM_Numeric GUM_SCALAR >
268 void UAIMRFReader< GUM_SCALAR >::_addWarning_(Idx lig, Idx col, std::string_view s) {
269 _parser_->errors().addWarning(s, _streamName_, lig, col);
Definition file for UAI exportation class.
Base class for all aGrUM's exceptions.
Exception : input/output problem.
Pure virtual class for reading a MRF from a file.
Exception : operation not allowed.
UAIMRFReader(MarkovRandomField< GUM_SCALAR > *MN, std::string_view filename)
Constructor A reader is defined for reading a defined file.
#define GUM_ERROR(type, msg)
Set< NodeId > NodeSet
Some typdefs and define for shortcuts ...
gum is the global namespace for all aGrUM entities