43#ifndef DOXYGEN_SHOULD_SKIP_THIS
47 template <
typename GUM_SCALAR >
49 const std::string& filename) :
51 GUM_CONSTRUCTOR(UAIMRFReader);
55 _streamName_ = filename;
61 _scanner_ =
new UAIMRF::Scanner(_streamName_.c_str());
62 _parser_ =
new UAIMRF::Parser(_scanner_);
63 }
catch (
IOError const&) { _ioerror_ =
true; }
66 template <
typename GUM_SCALAR >
67 UAIMRFReader< GUM_SCALAR >::~UAIMRFReader() {
68 GUM_DESTRUCTOR(UAIMRFReader);
72 if (_parser_)
delete (_parser_);
74 if (_scanner_)
delete (_scanner_);
78 template <
typename GUM_SCALAR >
79 INLINE UAIMRF::Scanner& UAIMRFReader< GUM_SCALAR >::scanner() {
80 if (_ioerror_) {
GUM_ERROR(gum::IOError,
"No such file " + streamName()) }
85 template <
typename GUM_SCALAR >
86 INLINE
const std::string& UAIMRFReader< GUM_SCALAR >::streamName()
const {
90 template <
typename GUM_SCALAR >
91 INLINE
bool UAIMRFReader< GUM_SCALAR >::trace()
const {
92 return _traceScanning_;
95 template <
typename GUM_SCALAR >
96 INLINE
void UAIMRFReader< GUM_SCALAR >::trace(
bool b) {
98 scanner().setTrace(b);
101 template <
typename GUM_SCALAR >
102 Size UAIMRFReader< GUM_SCALAR >::proceed() {
103 if (_ioerror_) {
GUM_ERROR(gum::IOError,
"No such file " + streamName()) }
109 buildFromQuartets(_parser_->getQuartets());
112 return 1 + _parser_->errors().error_count;
116 return (_parser_->errors().error_count);
119 template <
typename GUM_SCALAR >
120 void UAIMRFReader< GUM_SCALAR >::buildFromQuartets(
121 std::vector< std::tuple< float, int, int, int > > quartets) {
123 Size max = quartets.size();
125 _addWarning_(1, 1,
"Empty MarkovRandomField");
129 auto isInt = [&]() ->
bool {
return (std::get< 0 >(quartets[current]) == -1); };
130 auto lig = [&]() ->
int {
return std::get< 2 >(quartets[current]); };
131 auto col = [&]() ->
int {
return std::get< 3 >(quartets[current]); };
133 auto getInt = [&]() ->
int {
134 if (!isInt()) this->_addFatalError_(lig(), col(),
"int expected");
135 return std::get< 1 >(quartets[current]);
137 auto getVal = [&]() -> GUM_SCALAR {
138 return (isInt()) ? (std::get< 1 >(quartets[current])) : (
std::get< 0 >(quartets[current]));
140 auto incCurrent = [&]() {
142 if (current >= max) this->_addFatalError_(lig(), col(),
"Not enough data in UAI file");
146 Size nbrNode = (Size)getInt();
148 for (NodeId i = 0; i < nbrNode; i++) {
151 if (mod < 2) _addError_(lig(), col(),
"Number of modalities should be greater than 2.");
156 Size nbrFactors = (Size)getInt();
158 std::vector< NodeSet > clicks;
159 for (NodeId i = 0; i < nbrFactors; i++) {
161 Size nbrVar = (Size)getInt();
162 if (nbrVar == 0) _addError_(lig(), col(),
"0 is not possible here");
165 for (NodeId j = 0; j < nbrVar; j++) {
167 NodeId nod = (NodeId)getInt();
169 _addError_(lig(), col(),
"Not enough variables in the MarkovRandomField");
172 _mn_->addFactor(vars);
173 clicks.push_back(vars);
176 for (NodeId i = 0; i < nbrFactors; i++) {
178 Size nbrParam = (Size)getInt();
179 if (nbrParam != _mn_->factor(clicks[i]).domainSize()) {
180 _addFatalError_(lig(), col(),
"Size does not fit between clique and parameters");
182 std::vector< GUM_SCALAR > v;
183 for (Idx j = 0; j < nbrParam; j++) {
185 v.push_back(getVal());
187 _mn_->factor(clicks[i]).fillWith(v);
191 if (current != max - 1) _addError_(lig(), col(),
"Too many data in this file");
196 template <
typename GUM_SCALAR >
197 INLINE Idx UAIMRFReader< GUM_SCALAR >::errLine(Idx i) {
198 if (_parseDone_)
return _parser_->errors().error(i).line;
202 template <
typename GUM_SCALAR >
203 INLINE Idx UAIMRFReader< GUM_SCALAR >::errCol(Idx i) {
204 if (_parseDone_)
return _parser_->errors().error(i).column;
208 template <
typename GUM_SCALAR >
209 INLINE
bool UAIMRFReader< GUM_SCALAR >::errIsError(Idx i) {
210 if (_parseDone_)
return _parser_->errors().error(i).is_error;
214 template <
typename GUM_SCALAR >
215 INLINE std::string UAIMRFReader< GUM_SCALAR >::errMsg(Idx i) {
216 if (_parseDone_)
return _parser_->errors().error(i).msg;
220 template <
typename GUM_SCALAR >
221 INLINE
void UAIMRFReader< GUM_SCALAR >::showElegantErrors(std::ostream& o) {
222 if (_parseDone_) _parser_->errors().elegantErrors(o);
226 template <
typename GUM_SCALAR >
227 INLINE
void UAIMRFReader< GUM_SCALAR >::showElegantErrorsAndWarnings(std::ostream& o) {
228 if (_parseDone_) _parser_->errors().elegantErrorsAndWarnings(o);
232 template <
typename GUM_SCALAR >
233 INLINE
void UAIMRFReader< GUM_SCALAR >::showErrorsAndWarnings(std::ostream& o) {
234 if (_parseDone_) _parser_->errors().simpleErrorsAndWarnings(o);
238 template <
typename GUM_SCALAR >
239 INLINE
void UAIMRFReader< GUM_SCALAR >::showErrorCounts(std::ostream& o) {
240 if (_parseDone_) _parser_->errors().syntheticResults(o);
244 template <
typename GUM_SCALAR >
245 INLINE Size UAIMRFReader< GUM_SCALAR >::errors() {
246 return (!_parseDone_) ? (Size)0 : _parser_->errors().error_count;
249 template <
typename GUM_SCALAR >
250 INLINE Size UAIMRFReader< GUM_SCALAR >::warnings() {
251 return (!_parseDone_) ? (Size)0 : _parser_->errors().warning_count;
254 template <
typename GUM_SCALAR >
255 INLINE
void UAIMRFReader< GUM_SCALAR >::_addFatalError_(Idx lig, Idx col,
const std::string& s) {
256 _parser_->errors().addError(s, _streamName_, lig, col);
260 template <
typename GUM_SCALAR >
261 INLINE
void UAIMRFReader< GUM_SCALAR >::_addError_(Idx lig, Idx col,
const std::string& s) {
262 _parser_->errors().addError(s, _streamName_, lig, col);
265 template <
typename GUM_SCALAR >
266 INLINE
void UAIMRFReader< GUM_SCALAR >::_addWarning_(Idx lig, Idx col,
const std::string& s) {
267 _parser_->errors().addWarning(s, _streamName_, lig, col);
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, const std::string &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