00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "IO/Serialization.h"
00025 #include "Utils/Utils.h"
00026
00027 #include <fstream>
00028 #include <cctype>
00029
00030 namespace MultiBoost {
00031
00032
00033
00034 Serialization::Serialization(const string& shypFileName, const string& weakLearnerName)
00035 : _shypFileName(shypFileName)
00036 {
00037
00038 ofstream shypFile(shypFileName.c_str());
00039
00040
00041 shypFile << "<?xml version=\"1.0\"?>" << endl;
00042 shypFile << "<multiboost>" << endl;
00043 shypFile << standardTag("algo", weakLearnerName, 1) << endl;
00044
00045 }
00046
00047
00048
00049 Serialization::~Serialization()
00050 {
00051
00052 ofstream shypFile(_shypFileName.c_str(), ios_base::app);
00053 shypFile << "</multiboost>" << endl;
00054 }
00055
00056
00057
00058 void Serialization::saveHypotheses(vector<BaseLearner*>& weakHypotheses)
00059 {
00060
00061 for (int i = 0; i < (int)weakHypotheses.size(); ++i)
00062 appendHypothesis(i, weakHypotheses[i]);
00063 }
00064
00065
00066
00067 void Serialization::appendHypothesis(const int iteration, BaseLearner* pWeakHypothesis)
00068 {
00069
00070 ofstream shypFile(_shypFileName.c_str(), ios_base::app);
00071
00072
00073 shypFile << "\t<weakhyp iter=\"" << iteration << "\">" << endl;
00074
00075 pWeakHypothesis->save(shypFile, 2);
00076
00077 shypFile << "\t</weakhyp>"<< endl;
00078
00079
00080 shypFile << "\t<!-- ################################## -->" << endl;
00081 }
00082
00083
00084
00085
00086
00087 void UnSerialization::loadHypotheses(const string& shypFileName,
00088 vector<BaseLearner*>& weakHypotheses)
00089 {
00090
00091 ifstream inFile(shypFileName.c_str());
00092 if (!inFile.is_open())
00093 {
00094 cerr << "ERROR: Cannot open strong hypothesis file <" << shypFileName << ">!" << endl;
00095 exit(1);
00096 }
00097
00098
00099 nor_utils::StreamTokenizer st(inFile, "<>\n\r\t");
00100
00101
00102 if ( !seekSimpleTag(st, "multiboost") )
00103 {
00104
00105 cerr << "ERROR: Not a valid MultiBoost Strong Hypothesis file!!" << endl;
00106 exit(1);
00107 }
00108
00109
00110 string basicLearnerName = seekAndParseEnclosedValue<string>(st, "algo");
00111
00112
00113 if ( !BaseLearner::RegisteredLearners().hasLearner(basicLearnerName) )
00114 {
00115 cerr << "ERROR: Weak learner <" << basicLearnerName << "> not registered!!" << endl;
00116 exit(1);
00117 }
00118
00119 string rawTag;
00120 string tag, tagParam, tagValue;
00121
00122 while (true)
00123 {
00124
00125 if ( seekParamTag(st, "weakhyp") )
00126 {
00127
00128 BaseLearner* pWeakHypothesis =
00129 BaseLearner::RegisteredLearners().getLearner(basicLearnerName)->create();
00130
00131
00132 pWeakHypothesis->load(st);
00133
00134
00135 weakHypotheses.push_back(pWeakHypothesis);
00136 }
00137 else
00138 break;
00139 }
00140
00141 }
00142
00143
00144
00145 bool UnSerialization::seekSimpleTag(nor_utils::StreamTokenizer& st, const string& tag)
00146 {
00147 do{
00148 if ( nor_utils::cmp_nocase( st.next_token(), tag ) )
00149 return true;
00150 } while( st.has_token() );
00151
00152 return false;
00153 }
00154
00155
00156
00157 bool UnSerialization::seekParamTag(nor_utils::StreamTokenizer& st, const string& tag)
00158 {
00159
00160 do {
00161
00162 string rawTag = st.next_token();
00163 string tagOnly;
00164 string::const_iterator p = rawTag.begin();
00165
00166
00167 insert_iterator<string> tagIt(tagOnly, tagOnly.begin());
00168 for ( ; p != rawTag.end(); ++p)
00169 {
00170 if ( isspace(*p) )
00171 break;
00172 *tagIt = *p;
00173 }
00174
00175
00176 if ( nor_utils::cmp_nocase( tagOnly, tag ) )
00177 return true;
00178
00179 } while( st.has_token() );
00180
00181 return false;
00182 }
00183
00184
00185
00186 void UnSerialization::parseParamTag(const string& str, string& tag, string& tagParam, string& paramValue)
00187 {
00188
00189 if ( str.find('=') == string::npos )
00190 {
00191 tag = str;
00192 return;
00193 }
00194
00195 tag = "";
00196 tagParam = "";
00197 paramValue = "";
00198
00199 string::const_iterator p = str.begin();
00200
00201
00202 insert_iterator<string> tagIt(tag, tag.begin());
00203 for ( ; p != str.end(); ++p)
00204 {
00205 if ( isspace(*p) )
00206 break;
00207 *tagIt = *p;
00208 }
00209
00210
00211 for ( ; isspace(*p) && p != str.end() ; ++p );
00212
00213
00214 insert_iterator<string> paramIt(tagParam, tagParam.begin());
00215 for ( ; p != str.end(); ++p)
00216 {
00217 if (*p == '=')
00218 break;
00219 *paramIt = *p;
00220 }
00221
00222
00223 for ( ; p != str.end() && isspace(*p); ++p );
00224
00225 for ( ; p != str.end() && *p == '='; ++p );
00226
00227 for ( ; p != str.end() && isspace(*p); ++p );
00228
00229
00230 for ( ; *p == '"' && p != str.end() ; ++p );
00231
00232
00233 insert_iterator<string> valueIt(paramValue, paramValue.begin());
00234 for ( ; p != str.end(); ++p)
00235 {
00236 if (*p == '\"')
00237 break;
00238 *valueIt = *p;
00239 }
00240
00241 }
00242
00243
00244
00245 bool UnSerialization::seekAndParseParamTag(nor_utils::StreamTokenizer& st, const string& tag, string& tagParam, string& paramValue)
00246 {
00247 bool tagFound = false;
00248 string rawTag;
00249 string foundTag;
00250 string::const_iterator p;
00251
00252 tagParam = "";
00253 paramValue = "";
00254
00255 do {
00256
00257
00258 rawTag = st.next_token();
00259 foundTag = "";
00260
00261 p = rawTag.begin();
00262
00263
00264 insert_iterator<string> tagIt(foundTag, foundTag.begin());
00265 for ( ; p != rawTag.end(); ++p)
00266 {
00267 if ( isspace(*p) )
00268 break;
00269 *tagIt = *p;
00270 }
00271
00272 if ( nor_utils::cmp_nocase(tag, foundTag) )
00273 {
00274 tagFound = true;
00275 break;
00276 }
00277
00278 } while( st.has_token() );
00279
00280 if ( !tagFound )
00281 return false;
00282
00283
00284 for ( ; isspace(*p) && p != rawTag.end() ; ++p );
00285
00286
00287 insert_iterator<string> paramIt(tagParam, tagParam.begin());
00288 for ( ; p != rawTag.end(); ++p)
00289 {
00290 if (*p == '=')
00291 break;
00292 *paramIt = *p;
00293 }
00294
00295
00296 for ( ; p != rawTag.end() && isspace(*p); ++p );
00297
00298 for ( ; p != rawTag.end() && *p == '='; ++p );
00299
00300 for ( ; p != rawTag.end() && isspace(*p); ++p );
00301
00302
00303 for ( ; p != rawTag.end() && *p == '"'; ++p );
00304
00305
00306 insert_iterator<string> valueIt(paramValue, paramValue.begin());
00307 for ( ; p != rawTag.end(); ++p)
00308 {
00309 if (*p == '\"')
00310 break;
00311 *valueIt = *p;
00312 }
00313
00314 return true;
00315 }
00316
00317
00318
00319 }