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(
37 InfluenceDiagram< GUM_SCALAR >* infdiag,
38 const std::string& filePath) :
39 IDReader< GUM_SCALAR >(infdiag, filePath) {
40 GUM_CONSTRUCTOR(BIFXMLIDReader);
42 filePath__ = filePath;
48 template <
typename GUM_SCALAR >
49 INLINE BIFXMLIDReader< GUM_SCALAR >::~BIFXMLIDReader() {
50 GUM_DESTRUCTOR(BIFXMLIDReader);
59 template <
typename GUM_SCALAR >
60 void BIFXMLIDReader< GUM_SCALAR >::proceed() {
63 std::string status =
"Loading File ...";
64 GUM_EMIT2(onProceed, 0, status);
66 ticpp::Document xmlDoc(filePath__);
69 if (xmlDoc.NoChildren()) {
71 ": Loading fail, please check the file for any syntax error.");
75 status =
"File loaded. Now looking for BIF element ...";
76 GUM_EMIT2(onProceed, 4, status);
78 ticpp::Element* bifElement = xmlDoc.FirstChildElement(
"BIF");
81 status =
"BIF Element reached. Now searching network ...";
82 GUM_EMIT2(onProceed, 7, status);
84 ticpp::Element* networkElement = bifElement->FirstChildElement(
"NETWORK");
87 status =
"Network found. Now proceeding variables instanciation...";
88 GUM_EMIT2(onProceed, 10, status);
90 parsingVariables__(networkElement);
93 status =
"All variables have been instancied. Now filling up diagram...";
94 GUM_EMIT2(onProceed, 55, status);
96 fillingDiagram__(networkElement);
98 status =
"Instanciation of network completed";
99 GUM_EMIT2(onProceed, 100, status);
101 }
catch (ticpp::Exception& tinyexception) {
102 GUM_ERROR(IOError, tinyexception.what());
106 template <
typename GUM_SCALAR >
107 void BIFXMLIDReader< GUM_SCALAR >::parsingVariables__(
108 ticpp::Element* parentNetwork) {
111 ticpp::Iterator< ticpp::Element > varIte(
"VARIABLE");
113 for (varIte = varIte.begin(parentNetwork); varIte != varIte.end(); ++varIte)
119 for (varIte = varIte.begin(parentNetwork); varIte != varIte.end(); ++varIte) {
120 ticpp::Element* currentVar = varIte.Get();
123 ticpp::Element* varNameElement = currentVar->FirstChildElement(
"NAME");
124 std::string varName = varNameElement->GetTextOrDefault(
"");
127 ticpp::Element* varDescrElement = currentVar->FirstChildElement(
"PROPERTY");
128 std::string varDescription = varDescrElement->GetTextOrDefault(
"");
131 LabelizedVariable newVar(varName, varDescription, 0);
134 ticpp::Iterator< ticpp::Element > varOutComesIte(
"OUTCOME");
136 for (varOutComesIte = varOutComesIte.begin(currentVar);
137 varOutComesIte != varOutComesIte.end();
139 newVar.addLabel(varOutComesIte->GetTextOrDefault(
""));
142 std::string nodeType = currentVar->GetAttribute< std::string >(
"TYPE");
145 if (nodeType.compare(
"decision") == 0)
146 infdiag__->addDecisionNode(newVar);
147 else if (nodeType.compare(
"utility") == 0)
148 infdiag__->addUtilityNode(newVar);
150 infdiag__->addChanceNode(newVar);
154 =
"Network found. Now proceedind variables instanciation...";
155 int progress = (
int)((
float)nbIte / (
float)nbVar * 45) + 10;
156 GUM_EMIT2(onProceed, progress, status);
161 template <
typename GUM_SCALAR >
162 void BIFXMLIDReader< GUM_SCALAR >::fillingDiagram__(
163 ticpp::Element* parentNetwork) {
166 ticpp::Iterator< ticpp::Element > definitionIte(
"DEFINITION");
168 for (definitionIte = definitionIte.begin(parentNetwork);
169 definitionIte != definitionIte.end();
176 for (definitionIte = definitionIte.begin(parentNetwork);
177 definitionIte != definitionIte.end();
179 ticpp::Element* currentVar = definitionIte.Get();
182 std::string currentVarName
183 = currentVar->FirstChildElement(
"FOR")->GetTextOrDefault(
"");
184 NodeId currentVarId = infdiag__->idFromName(currentVarName);
187 ticpp::Iterator< ticpp::Element > givenIte(
"GIVEN");
188 List< NodeId > parentList;
190 for (givenIte = givenIte.begin(currentVar); givenIte != givenIte.end();
192 std::string parentNode = givenIte->GetTextOrDefault(
"");
193 NodeId parentId = infdiag__->idFromName(parentNode);
194 parentList.pushBack(parentId);
197 for (List< NodeId >::iterator_safe parentListIte = parentList.rbeginSafe();
198 parentListIte != parentList.rendSafe();
200 infdiag__->addArc(*parentListIte, currentVarId);
203 if (!infdiag__->isDecisionNode(currentVarId)) {
204 ticpp::Element* tableElement = currentVar->FirstChildElement(
"TABLE");
205 std::istringstream issTableString(tableElement->GetTextOrDefault(
""));
206 std::list< GUM_SCALAR > tablelist;
209 while (!issTableString.eof()) {
210 issTableString >> value;
211 tablelist.push_back(value);
214 std::vector< GUM_SCALAR > tablevector(tablelist.begin(), tablelist.end());
217 if (infdiag__->isChanceNode(currentVarId)) {
218 const Potential< GUM_SCALAR >* table = &infdiag__->cpt(currentVarId);
219 table->populate(tablevector);
220 }
else if (infdiag__->isUtilityNode(currentVarId)) {
221 const Potential< GUM_SCALAR >* table = &infdiag__->utility(currentVarId);
222 table->populate(tablevector);
228 =
"All variables have been instancied. Now filling up diagram...";
229 int progress = (
int)((
float)nbIte / (
float)nbDef * 45) + 55;
230 GUM_EMIT2(onProceed, progress, status);