Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Tools/Xabsl2/GT/GTXabsl2Profiler.cpp

Go to the documentation of this file.
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   // number of active options is 0 when basic behaviors are tested separately
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   // debugLogToStream(out);
00105   writeLogToStream(out);
00106 
00107 }
00108 void GTXabsl2Profiler::recordCompleteLog(){
00109 
00110   OutTextFile out(outFileName.c_str(), true);
00111   writeCompleteLogToStream(out);
00112 
00113 }
00114 
00115 /* deletes entries while writing out */
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   // nametable
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   // logs
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   // check if log hos non ascending frame numbers
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 * Change Log:
00373 *
00374 * $Log: GTXabsl2Profiler.cpp,v $
00375 * Revision 1.8  2004/06/14 17:15:51  spranger
00376 * added documentation
00377 *
00378 * Revision 1.7  2004/05/26 09:34:52  roefer
00379 * Warning removed
00380 *
00381 * Revision 1.6  2004/05/25 19:34:16  spranger
00382 * fixed off by one
00383 *
00384 * Revision 1.5  2004/05/25 14:08:24  spranger
00385 * added sanity checks for imported logs
00386 *
00387 * Revision 1.4  2004/05/24 16:34:43  spranger
00388 * removed DebugLogToStream, bugfix
00389 *
00390 * Revision 1.3  2004/05/24 14:14:45  spranger
00391 * changed construction of outfilename
00392 *
00393 * Revision 1.2  2004/05/24 13:17:43  spranger
00394 * comment out xml-export
00395 *
00396 * Revision 1.1  2004/05/23 18:59:42  spranger
00397 * changed interface, added framenumber to Constructor
00398 *
00399 * Revision 1.11  2004/05/22 16:58:04  spranger
00400 * changed dialog appearance, added features (including extended profiler-interface)
00401 *
00402 * Revision 1.10  2004/05/04 15:35:02  spranger
00403 * extended interface
00404 *
00405 * Revision 1.9  2004/05/03 13:21:57  spranger
00406 * extended interface
00407 *
00408 * Revision 1.8  2004/04/30 09:26:23  spranger
00409 * redone interface, added xml-export
00410 *
00411 * Revision 1.7  2004/04/28 17:31:40  spranger
00412 * redesign of nametable, added import facilities
00413 *
00414 * Revision 1.6  2004/04/24 08:27:00  roefer
00415 * Warning removed. The original code was somewhat nonsense. Was it really intended that way?
00416 *
00417 * Revision 1.5  2004/04/22 14:28:02  roefer
00418 * .NET errors/warnings removed
00419 *
00420 * Revision 1.4  2004/04/22 11:33:19  spranger
00421 * different log handling (queue), added writingoglogs which does not write out whole log
00422 *
00423 * Revision 1.3  2004/04/20 18:17:01  spranger
00424 * added nametable-structure, added log functionality
00425 *
00426 * Revision 1.2  2004/04/14 13:33:54  loetzsch
00427 * added change log
00428 *
00429 */
00430 

Generated on Thu Sep 23 19:57:42 2004 for GT2004 by doxygen 1.3.6