22 #ifndef DOXYGEN_SHOULD_SKIP_THIS 24 # include <agrum/ID/io/BIFXML/BIFXMLIDReader.h> 35 template <
typename GUM_SCALAR >
36 INLINE BIFXMLIDReader< GUM_SCALAR >::BIFXMLIDReader(InfluenceDiagram< GUM_SCALAR >* infdiag,
37 const std::string& filePath) :
38 IDReader< GUM_SCALAR >(infdiag, filePath) {
39 GUM_CONSTRUCTOR(BIFXMLIDReader);
41 _filePath_ = filePath;
47 template <
typename GUM_SCALAR >
48 INLINE BIFXMLIDReader< GUM_SCALAR >::~BIFXMLIDReader() {
49 GUM_DESTRUCTOR(BIFXMLIDReader);
58 template <
typename GUM_SCALAR >
59 void BIFXMLIDReader< GUM_SCALAR >::proceed() {
62 std::string status =
"Loading File ...";
63 GUM_EMIT2(onProceed, 0, status);
65 ticpp::Document xmlDoc(_filePath_);
68 if (xmlDoc.NoChildren()) {
69 GUM_ERROR(IOError,
": Loading fail, please check the file for any syntax error.")
73 status =
"File loaded. Now looking for BIF element ...";
74 GUM_EMIT2(onProceed, 4, status);
76 ticpp::Element* bifElement = xmlDoc.FirstChildElement(
"BIF");
79 status =
"BIF Element reached. Now searching network ...";
80 GUM_EMIT2(onProceed, 7, status);
82 ticpp::Element* networkElement = bifElement->FirstChildElement(
"NETWORK");
85 status =
"Network found. Now proceeding variables instanciation...";
86 GUM_EMIT2(onProceed, 10, status);
88 _parsingVariables_(networkElement);
91 status =
"All variables have been instancied. Now filling up diagram...";
92 GUM_EMIT2(onProceed, 55, status);
94 _fillingDiagram_(networkElement);
96 status =
"Instanciation of network completed";
97 GUM_EMIT2(onProceed, 100, status);
99 }
catch (ticpp::Exception& tinyexception) { GUM_ERROR(IOError, tinyexception.what()) }
102 template <
typename GUM_SCALAR >
103 void BIFXMLIDReader< GUM_SCALAR >::_parsingVariables_(ticpp::Element* parentNetwork) {
106 ticpp::Iterator< ticpp::Element > varIte(
"VARIABLE");
108 for (varIte = varIte.begin(parentNetwork); varIte != varIte.end(); ++varIte)
114 for (varIte = varIte.begin(parentNetwork); varIte != varIte.end(); ++varIte) {
115 ticpp::Element* currentVar = varIte.Get();
118 ticpp::Element* varNameElement = currentVar->FirstChildElement(
"NAME");
119 std::string varName = varNameElement->GetTextOrDefault(
"");
122 ticpp::Element* varDescrElement = currentVar->FirstChildElement(
"PROPERTY");
123 std::string varDescription = varDescrElement->GetTextOrDefault(
"");
126 LabelizedVariable newVar(varName, varDescription, 0);
129 ticpp::Iterator< ticpp::Element > varOutComesIte(
"OUTCOME");
131 for (varOutComesIte = varOutComesIte.begin(currentVar);
132 varOutComesIte != varOutComesIte.end();
134 newVar.addLabel(varOutComesIte->GetTextOrDefault(
""));
137 std::string nodeType = currentVar->GetAttribute< std::string >(
"TYPE");
140 if (nodeType.compare(
"decision") == 0)
141 _infdiag_->addDecisionNode(newVar);
142 else if (nodeType.compare(
"utility") == 0)
143 _infdiag_->addUtilityNode(newVar);
145 _infdiag_->addChanceNode(newVar);
148 std::string status =
"Network found. Now proceedind variables instanciation...";
149 int progress = (
int)((
float)nbIte / (
float)nbVar * 45) + 10;
150 GUM_EMIT2(onProceed, progress, status);
155 template <
typename GUM_SCALAR >
156 void BIFXMLIDReader< GUM_SCALAR >::_fillingDiagram_(ticpp::Element* parentNetwork) {
159 ticpp::Iterator< ticpp::Element > definitionIte(
"DEFINITION");
161 for (definitionIte = definitionIte.begin(parentNetwork); definitionIte != definitionIte.end();
168 for (definitionIte = definitionIte.begin(parentNetwork); definitionIte != definitionIte.end();
170 ticpp::Element* currentVar = definitionIte.Get();
173 std::string currentVarName = currentVar->FirstChildElement(
"FOR")->GetTextOrDefault(
"");
174 NodeId currentVarId = _infdiag_->idFromName(currentVarName);
177 ticpp::Iterator< ticpp::Element > givenIte(
"GIVEN");
178 List< NodeId > parentList;
180 for (givenIte = givenIte.begin(currentVar); givenIte != givenIte.end(); ++givenIte) {
181 std::string parentNode = givenIte->GetTextOrDefault(
"");
182 NodeId parentId = _infdiag_->idFromName(parentNode);
183 parentList.pushBack(parentId);
186 for (List< NodeId >::iterator_safe parentListIte = parentList.rbeginSafe();
187 parentListIte != parentList.rendSafe();
189 _infdiag_->addArc(*parentListIte, currentVarId);
192 if (!_infdiag_->isDecisionNode(currentVarId)) {
193 ticpp::Element* tableElement = currentVar->FirstChildElement(
"TABLE");
194 std::istringstream issTableString(tableElement->GetTextOrDefault(
""));
195 std::list< GUM_SCALAR > tablelist;
198 while (!issTableString.eof()) {
199 issTableString >> value;
200 tablelist.push_back(value);
203 std::vector< GUM_SCALAR > tablevector(tablelist.begin(), tablelist.end());
206 if (_infdiag_->isChanceNode(currentVarId)) {
207 const Potential< GUM_SCALAR >* table = &_infdiag_->cpt(currentVarId);
208 table->populate(tablevector);
209 }
else if (_infdiag_->isUtilityNode(currentVarId)) {
210 const Potential< GUM_SCALAR >* table = &_infdiag_->utility(currentVarId);
211 table->populate(tablevector);
216 std::string status =
"All variables have been instancied. Now filling up diagram...";
217 int progress = (
int)((
float)nbIte / (
float)nbDef * 45) + 55;
218 GUM_EMIT2(onProceed, progress, status);