00001 #include "GTXabsl2Profiler.h"
00002
00003 GTXabsl2Profiler::GTXabsl2Profiler(SolutionRequest::xabsl2EngineID id,const unsigned long* frameNumber)
00004 : maxDepth(0), profilerCollectMode(GTXabsl2Profiler::dontCollectProfiles),
00005 profilerWriteMode(GTXabsl2Profiler::dontWriteProfiles),frameNumber(frameNumber)
00006 {
00007 outFileName = std::string("Xabsl2/")+std::string(SolutionRequest::getXabsl2EngineFileID(id))+std::string(".log");
00008 }
00009
00010 GTXabsl2Profiler::GTXabsl2Profiler()
00011 : maxDepth(0), profilerCollectMode(GTXabsl2Profiler::dontCollectProfiles),
00012 profilerWriteMode(GTXabsl2Profiler::dontWriteProfiles),frameNumber(NULL), outFileName(""){}
00013
00014 void GTXabsl2Profiler::init(Xabsl2Engine& pEngine,int length){
00015 OutTextFile out(outFileName.c_str(), false);
00016 log.clear();
00017 nameTable.init(length);
00018 registerOptions(pEngine.getRootOption(), 0);
00019 doDepthCount(pEngine.getRootOption(), 1);
00020 writeNameTableToStream(out);
00021 }
00022
00023 void GTXabsl2Profiler::registerSymbols(Xabsl2Engine& engine){
00024
00025 engine.registerEnumeratedOutputSymbol("profiler-collect-mode",(int*)&profilerCollectMode);
00026 engine.registerEnumeratedOutputSymbolEnumElement("profiler-collect-mode","profiler-collect-mode.collect-profiles", GTXabsl2Profiler::collectProfiles);
00027 engine.registerEnumeratedOutputSymbolEnumElement("profiler-collect-mode","profiler-collect-mode.dont-collect-profiles", GTXabsl2Profiler::dontCollectProfiles);
00028
00029 engine.registerEnumeratedOutputSymbol("profiler-write-mode",(int*)&profilerWriteMode);
00030 engine.registerEnumeratedOutputSymbolEnumElement("profiler-write-mode","profiler-write-mode.write-profiles", GTXabsl2Profiler::writeProfiles );
00031 engine.registerEnumeratedOutputSymbolEnumElement("profiler-write-mode","profiler-write-mode.write-complete-profiles", GTXabsl2Profiler::writeCompleteProfiles);
00032 engine.registerEnumeratedOutputSymbolEnumElement("profiler-write-mode","profiler-write-mode.dont-write-profiles", GTXabsl2Profiler::dontWriteProfiles);
00033
00034 }
00035
00036 void GTXabsl2Profiler::registerOptions(const Xabsl2Option* option, int depth){
00037 std::vector<std::string> states;
00038
00039 int i;
00040 for(i = 0; i<option->states.getSize();++i){
00041 if(!nameTable.exists( option->n, option->states[i]->n))
00042 states.push_back(option->states.getName(i));
00043 }
00044
00045 std::vector<std::string> params;
00046 for(i = 0; i<option->parameters.getSize();++i){
00047 params.push_back(option->parameters.getName(i));
00048 }
00049
00050
00051 nameTable.append(option->n, states, params, depth);
00052
00053 for(int j=0; j<option->states.getSize();++j){
00054 if(option->states[j]->subsequentOption && !nameTable.existsOption(option->states[j]->subsequentOption->n)){
00055 registerOptions(option->states[j]->subsequentOption, depth+1);
00056 }
00057 }
00058 }
00059
00060 void GTXabsl2Profiler::doDepthCount(const Xabsl2Option* option, int depth){
00061 if(depth > maxDepth)
00062 maxDepth = depth;
00063 for(int i=0; i< option->states.getSize();++i){
00064 if( nameTable[nameTable.getOptionPosition(option->n)].maxdepth < depth)
00065 nameTable[nameTable.getOptionPosition(option->n)].maxdepth = depth;
00066 }
00067 for(int j=0; j<option->states.getSize();++j){
00068 if(option->states[j]->subsequentOption)
00069 doDepthCount(option->states[j]->subsequentOption, depth+1);
00070 }
00071
00072 }
00073
00074 void GTXabsl2Profiler::doProfiling(Xabsl2Engine& pEngine){
00075
00076 const Xabsl2Option* option;
00077 std::vector<GTXabsl2ActiveOption> activeOptions;
00078
00079
00080 option = pEngine.getRootOption();
00081 while (option!=0)
00082 {
00083 if(nameTable.exists(option->n, option->activeState->n))
00084 {
00085 std::vector<double> params;
00086
00087 for(int i = 0; i<option->parameters.getSize();++i)
00088 {
00089 params.push_back(option->parameters[i]);
00090 }
00091
00092 GTXabsl2ActiveOption entry(nameTable.getOptionPosition(option->n), nameTable.getStatePosition(option->n, option->activeState->n), params);
00093 activeOptions.push_back(entry);
00094 }
00095 option = option->activeState->subsequentOption;
00096 }
00097 if(!log.size() || log.back().activeOptions != activeOptions)
00098 log.push_back(GTXabsl2LogEntry(*frameNumber, activeOptions));
00099 }
00100
00101 void GTXabsl2Profiler::recordCollectedLogs(){
00102
00103 OutTextFile out(outFileName.c_str(), true);
00104
00105 writeLogToStream(out);
00106
00107 }
00108 void GTXabsl2Profiler::recordCompleteLog(){
00109
00110 OutTextFile out(outFileName.c_str(), true);
00111 writeCompleteLogToStream(out);
00112
00113 }
00114
00115
00116 void GTXabsl2Profiler::writeLogToStream(Out& out)
00117 {
00118
00119 int upperBound = NROFELEMW < log.size() ? NROFELEMW : log.size()-1;
00120 for(int j = 0; j < upperBound; ++j){
00121 std::deque<GTXabsl2LogEntry>::iterator i = log.begin();
00122
00123 out << i->framenumber << i->activeOptions.size();
00124 for(std::vector<GTXabsl2ActiveOption>::iterator k = (*i).activeOptions.begin(); k != (*i).activeOptions.end(); ++k)
00125 {
00126 out << k->optionNumber;
00127 out << k->stateNumber;
00128 out << k->parameters.size();
00129 for(int l = 0; l < (int) (*k).parameters.size(); ++l){
00130 out << k->parameters[l];
00131 }
00132 }
00133 log.pop_front();
00134 }
00135
00136 }
00137
00138 void GTXabsl2Profiler::writeCompleteLogToStream(Out& out){
00139 for(std::deque<GTXabsl2LogEntry>::iterator i = log.begin(); i != log.end(); ++i){
00140 out << i->framenumber << i->activeOptions.size();
00141 for(std::vector<GTXabsl2ActiveOption>::iterator k = (*i).activeOptions.begin(); k != (*i).activeOptions.end(); ++k)
00142 {
00143 out << k->optionNumber;
00144 out << k->stateNumber;
00145 out << k->parameters.size();
00146 for(int l = 0; l < (int) (*k).parameters.size(); ++l){
00147 out << k->parameters[l];
00148 }
00149 }
00150 }
00151 log.clear();
00152 }
00153
00154 void GTXabsl2Profiler::writeNameTableToStream(Out& out){
00155 if(nameTable.getSize()){
00156 out << nameTable.getSize();
00157 for(int i = 0; i < nameTable.getSize(); ++i){
00158
00159 out << nameTable[i].optionName.c_str();
00160 out << nameTable[i].maxdepth;
00161 out << nameTable[i].states.size();
00162
00163 int j;
00164 for(j = 0; j < (int)nameTable[i].states.size(); ++j){
00165 out << nameTable[i].states[j].c_str();
00166 }
00167
00168 out << nameTable[i].parameters.size();
00169 for(j = 0; j < (int)nameTable[i].parameters.size(); ++j){
00170 out << nameTable[i].parameters[j].c_str();
00171 }
00172 }
00173 }
00174 }
00175
00176 void GTXabsl2Profiler::exportXMLFile(const char* outf){
00177 if(outf)
00178 {
00179 OutTextRawFile out(outf);
00180 writeXMLtoStream(out);
00181 }
00182 }
00183 void GTXabsl2Profiler::writeXMLtoStream(Out& out){
00184 out << "<log>\n";
00185 for(std::deque<GTXabsl2LogEntry>::iterator i = log.begin(); i != log.end(); ++i)
00186 {
00187 out << "<logentry" << " framenumber=\"" << i->framenumber << "\">";
00188 for(std::vector<GTXabsl2ActiveOption>::iterator j = (*i).activeOptions.begin(); j != (*i).activeOptions.end(); ++j)
00189 {
00190 out << "<active";
00191 out << " option=\"" << nameTable[j->optionNumber].optionName.c_str() << "\"";
00192 out << " state=\"" << nameTable[j->optionNumber].states[j->stateNumber].c_str() << "\"";
00193 out << " maxdepth=\"" << nameTable[j->optionNumber].maxdepth << "\" >";
00194 for(int k = 0; k < (int) j->parameters.size(); ++k)
00195 {
00196 out << "<parameter name\"";
00197 out << nameTable[j->optionNumber].parameters[k].c_str();
00198 out << "\" value=\"";
00199 out << j->parameters[k];
00200 out << "\"/>";
00201 }
00202 }
00203 }
00204 }
00205
00206 bool GTXabsl2Profiler::importLogFile(const char* filename){
00207 InTextFile in(filename);
00208 if(!in.exists())
00209 return false;
00210 if(in.eof())
00211 return true;
00212
00213 nameTable.clear();
00214 log.clear();
00215
00216
00217 int nametablesize;
00218 char optionname[300];
00219 char name[300];
00220 int depth;
00221 in >> nametablesize;
00222 for(;nametablesize > 0; --nametablesize){
00223 std::vector<std::string> statenames;
00224 std::vector<std::string> paramnames;
00225
00226 in >> optionname;
00227 in >> depth;
00228
00229 int number;
00230 in >> number;
00231 for(;number > 0; --number){
00232 in >> name;
00233 statenames.push_back(name);
00234 }
00235 in >> number;
00236 for(;number > 0; --number){
00237 in >> name;
00238 paramnames.push_back(name);
00239 }
00240
00241 nameTable.append(optionname, statenames, paramnames, depth);
00242 if(depth > maxDepth - 1)
00243 maxDepth = depth + 1;
00244 }
00245
00246
00247 int framenmb;
00248 while(!in.getEof()){
00249
00250 int nrofoptions;
00251 in >> framenmb;
00252 in >> nrofoptions;
00253 std::vector<GTXabsl2ActiveOption> activeOptions;
00254 for(;nrofoptions > 0; --nrofoptions){
00255 int optionnumber;
00256 int statenumber;
00257 in >> optionnumber;
00258 in >> statenumber;
00259 int nrofparams;
00260 in >> nrofparams;
00261 std::vector<double> params;
00262
00263 for(;nrofparams > 0; -- nrofparams){
00264 double param;
00265 in >> param;
00266 params.push_back(param);
00267 }
00268
00269 activeOptions.push_back(GTXabsl2ActiveOption(optionnumber, statenumber, params));
00270 }
00271 log.push_back(GTXabsl2LogEntry(framenmb, activeOptions));
00272 }
00273
00274 for(int i = 0; i < (int) log.size(); ++i){
00275 if(i > 0 && log[i-1].framenumber > log[i].framenumber)
00276 {
00277 log.clear();
00278 return false;
00279 }
00280 }
00281 return true;
00282
00283 }
00284
00285 std::vector<GTXabsl2ActiveOption> GTXabsl2Profiler::getActiveOptionsAtFrame(int time){
00286
00287 std::deque<GTXabsl2LogEntry>::iterator i = log.begin();
00288 std::vector<GTXabsl2ActiveOption> t;
00289 while(i != log.end() && (int)(*i).framenumber <= time){
00290 t = (*i).activeOptions;
00291 ++i;
00292 }
00293 return t;
00294
00295 }
00296
00297 std::string GTXabsl2Profiler::getOptionName(int optionnumber){
00298
00299 if(optionnumber && optionnumber < nameTable.getSize())
00300 return nameTable[optionnumber].optionName;
00301 else
00302 return std::string();
00303
00304 }
00305
00306 std::string GTXabsl2Profiler::getStateName(int optionnumber, int statenumber){
00307
00308 if(statenumber < nameTable.getSize())
00309 return nameTable[optionnumber].states[statenumber];
00310 else
00311 return std::string();
00312
00313 }
00314
00315 int GTXabsl2Profiler::getDepth(char* optionname){
00316
00317 return nameTable.existsOption(optionname)? nameTable[nameTable.getOptionPosition(optionname)].maxdepth : -1;
00318
00319 }
00320
00321 int GTXabsl2Profiler::getDepth(int optionnumber){
00322 return optionnumber < nameTable.getSize()? nameTable[optionnumber].maxdepth : -1;
00323 }
00324
00325 int GTXabsl2Profiler::getFollowingFramenumber(int frame){
00326
00327 std::deque<GTXabsl2LogEntry>::iterator i = log.begin();
00328 while(i != log.end()){
00329 if((int)(*i).framenumber <= frame)
00330 return (*i).framenumber;
00331 ++i;
00332 }
00333 return -1;
00334
00335 }
00336
00337 int GTXabsl2Profiler::getIndex(int framenumber){
00338 int temp = -1;
00339 std::deque<GTXabsl2LogEntry>::iterator i = log.begin();
00340 while(i != log.end() && (int)(*i).framenumber <= framenumber){
00341 ++temp;
00342 ++i;
00343 }
00344 return temp;
00345 }
00346
00347 GTXabsl2LogEntry& GTXabsl2Profiler::operator[](int i){
00348 return log[i];
00349 }
00350 int GTXabsl2Profiler::size(){
00351 return log.size();
00352 }
00353 GTXabsl2ProfilerNameTableEntry& GTXabsl2Profiler::getNameTableEntry(int index){
00354 return nameTable[index];
00355 }
00356 bool GTXabsl2Profiler::getActiveOption(int index, int maxdepth, GTXabsl2ActiveOption& retour){
00357 if(index > -1 && index < (int) log.size()){
00358 for(int i = 0; i < (int) log[index].activeOptions.size(); ++i){
00359 if(nameTable[log[index].activeOptions[i].optionNumber].maxdepth == maxdepth){
00360 retour = log[index].activeOptions[i];
00361 return true;
00362 }
00363
00364
00365 }
00366 }
00367 return false;
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430