About
User Reference
C++ API
luafaudes
Developer
Links
libFAUDES online
libFAUDES

Sections

Index

sp_simeventset.cpp

Go to the documentation of this file.
00001 /** @file sp_simeventset.cpp Eventsets with execution data for simulation */
00002 
00003 
00004 /* 
00005    Copyright (C) 2008  Thomas Moor
00006    Exclusive copyright is granted to Klaus Schmidt
00007 */
00008 
00009 #include "sp_simeventset.h"
00010  
00011 namespace faudes {
00012 
00013 
00014 // faudes type std
00015 FAUDES_TYPE_IMPLEMENTATION(Void,SimEventAttribute,AttributeCFlags)
00016 
00017 
00018 // Assign my members
00019 void SimEventAttribute::DoAssign(const SimEventAttribute& rSrcAttr) { 
00020   // call base (incl. virtual clear)
00021   AttributeCFlags::DoAssign(rSrcAttr);
00022   // my additional members
00023   mStochastic=rSrcAttr.mStochastic;
00024   mPriority=rSrcAttr.mPriority;
00025   mPriorityAttribute=rSrcAttr.mPriorityAttribute;
00026   mStochasticAttribute=rSrcAttr.mStochasticAttribute;
00027   // my dynamic state
00028   mScheduledFor=rSrcAttr.mScheduledFor;
00029   mExpiresAt=rSrcAttr.mExpiresAt;
00030   mDelayFor=rSrcAttr.mDelayFor;
00031   mReferenceInterval=rSrcAttr.mReferenceInterval;
00032 }
00033 
00034 
00035 // Test equality
00036 bool SimEventAttribute::DoEqual(const SimEventAttribute& rOther) const { 
00037   // call base 
00038   if(!AttributeCFlags::DoEqual(rOther)) return false;
00039   // my additional members
00040   if(mStochastic!=rOther.mStochastic) return false;
00041   if(mPriority!=rOther.mPriority) return false;
00042   if(!(mPriorityAttribute==rOther.mPriorityAttribute)) return false;
00043   if(!(mStochasticAttribute==rOther.mStochasticAttribute)) return false;
00044   // pass
00045   return true;
00046 }
00047 
00048 
00049 //DoWrite(rTw);
00050 void SimEventAttribute::DoWrite(TokenWriter& rTw, const std::string& rLabel, const Type* pContext) const {
00051   (void) rLabel;
00052   // do base first
00053   AttributeCFlags::DoWrite(rTw,"",pContext);
00054   FD_DC("SimEventAttribute(" << this << ")::DoWrite(tr)");
00055   Token token;
00056   // write priority
00057   if(mPriority) {
00058     rTw.WriteBegin("Priority");
00059     Token token;
00060     token.SetInteger(mPriorityAttribute.mPriority);
00061     rTw.Write(token);
00062     rTw.WriteEnd("Priority");
00063   }
00064   // write stochastic
00065   if(mStochastic) {
00066     rTw.WriteBegin("Stochastic");
00067     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Extern) rTw.WriteOption("Extern");
00068     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Trigger) rTw.WriteOption("Trigger");
00069     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Delay) rTw.WriteOption("Delay");
00070     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Exponential) rTw.WriteOption("Exponential");
00071     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Gauss) rTw.WriteOption("Gauss");
00072     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Uniform) rTw.WriteOption("Uniform");
00073     if(mStochasticAttribute.mParameter.size()>0) {
00074       rTw.WriteBegin("Parameter");
00075       std::vector<double>::const_iterator pit=mStochasticAttribute.mParameter.begin();
00076       for(; pit!=mStochasticAttribute.mParameter.end(); pit++) {
00077   rTw.WriteFloat(*pit);
00078       }
00079       rTw.WriteEnd("Parameter");
00080     }
00081     rTw.WriteEnd("Stochastic");
00082   }
00083 }
00084 
00085 //DoRead(rTr)
00086 void SimEventAttribute::DoRead(TokenReader& rTr, const std::string& rLabel, const Type* pContext) {
00087   (void) rLabel;
00088   // call base first
00089   AttributeCFlags::DoRead(rTr,"",pContext);
00090 
00091   // report
00092   FD_DC("SimEventAttribute(" << this << ")::DoRead(tr)");
00093 
00094   // clear myself
00095   mStochastic=false;
00096   mPriority=false;
00097 
00098   // read as long as we can handle
00099   Token token;
00100   bool err=false;
00101   while(rTr.Peek(token)) {
00102 
00103     // try priority
00104     if(token.IsBegin() && token.StringValue()=="Priority") {
00105       rTr.ReadBegin("Priority");
00106       mPriority=true;
00107       rTr.Get(token);
00108       if(!token.IsFloat()) {
00109         err=true; 
00110       } else {
00111         mPriorityAttribute.mPriority=(int) token.FloatValue();
00112       }
00113       rTr.ReadEnd("Priority");
00114       continue;
00115     }
00116 
00117     // try stochastic
00118     if(token.IsBegin() && token.StringValue()=="Stochastic") {
00119       rTr.ReadBegin("Stochastic");
00120       // stochastic default
00121       mStochastic=true;
00122       mStochasticAttribute.mType = SimStochasticEventAttribute::Extern;
00123       mStochasticAttribute.mPdf = SimStochasticEventAttribute::Exponential;
00124       mStochasticAttribute.mParameter.clear();
00125       mStochasticAttribute.mParameter.push_back(1);
00126       // mandatory option: intern/extern
00127       rTr.Get(token);
00128       if(!token.IsOption()) {
00129   err=true; 
00130       } else {
00131         if(token.OptionValue() == "Extern") 
00132     {mStochasticAttribute.mType = SimStochasticEventAttribute::Extern; };
00133         if(token.OptionValue() == "Trigger") 
00134     {mStochasticAttribute.mType = SimStochasticEventAttribute::Trigger; };
00135         if(token.OptionValue() == "Delay") 
00136     {mStochasticAttribute.mType = SimStochasticEventAttribute::Delay; };
00137       } 
00138       // mandatory option: exponential/gauss/ etc
00139       rTr.Get(token);
00140       if(!token.IsOption()) {
00141   err=true; 
00142       } else {
00143         if(token.OptionValue() == "Exponential") 
00144       {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Exponential;};
00145         if(token.OptionValue() == "Gauss") 
00146     {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Gauss;};
00147         if(token.OptionValue() == "Uniform") 
00148       {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Uniform;};
00149       }  
00150       // optional data: parameter vector
00151       rTr.Peek(token);
00152       if(token.StringValue()=="Parameter" && token.IsBegin()) {
00153         mStochasticAttribute.mParameter.clear();
00154         rTr.ReadBegin("Parameter");
00155         while (!rTr.Eos("Parameter")) {
00156           double par = rTr.ReadFloat();
00157           mStochasticAttribute.mParameter.push_back(par);      
00158         }
00159         rTr.ReadEnd("Parameter");
00160       }
00161       // old file format: fix missing restricted support pdfs
00162       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Exponential 
00163          && mStochasticAttribute.mParameter.size() == 1) {
00164         double lambda= mStochasticAttribute.mParameter.at(0);
00165         mStochasticAttribute.mParameter.clear();
00166   mStochasticAttribute.mParameter.push_back(0);
00167   mStochasticAttribute.mParameter.push_back(tpTime::Max);
00168   mStochasticAttribute.mParameter.push_back(lambda);
00169       }
00170       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Gauss 
00171          && mStochasticAttribute.mParameter.size() == 2) {
00172         double mue= mStochasticAttribute.mParameter.at(0);
00173         double sigma= mStochasticAttribute.mParameter.at(1);
00174         mStochasticAttribute.mParameter.clear();
00175   mStochasticAttribute.mParameter.push_back(0);
00176   mStochasticAttribute.mParameter.push_back(tpTime::Max);
00177   mStochasticAttribute.mParameter.push_back(mue);
00178   mStochasticAttribute.mParameter.push_back(sigma);
00179       }
00180       // check parameter vector consistency
00181       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Exponential 
00182          && mStochasticAttribute.mParameter.size() != 3) 
00183         err=true;
00184       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Gauss 
00185          && mStochasticAttribute.mParameter.size() != 4) 
00186         err=true;
00187       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Uniform 
00188          && mStochasticAttribute.mParameter.size() != 2) 
00189         err=true;
00190       rTr.ReadEnd("Stochastic");
00191     }
00192 
00193     // report error
00194     if(err) {
00195       std::stringstream errstr;
00196       errstr << "invalid simulation event property" << rTr.FileLine();
00197       throw Exception("SimEventAttribute::Read", errstr.str(), 52);
00198     }
00199 
00200     // cannot digest? -> done
00201     break;
00202     
00203   }
00204 }
00205 
00206 
00207 // debug str
00208 std::string SimEventAttribute::Str(void) const {
00209   std::stringstream retstr;
00210   //retstr << "[" << this << "] ";
00211   if(IsPriority()) {
00212     retstr<< "priority=" << Priority().mPriority << " ";
00213   }
00214   if(IsStochastic()) {
00215     retstr<< "stochastic=" << SimStochasticEventAttribute::TStr(Stochastic().mType) << " " ;
00216     retstr<< "scheduled_for=" << tpTime::Str(mScheduledFor) << " ";
00217     retstr<< " expires_at=" << tpTime::Str(mExpiresAt) << " ";
00218     retstr<< " delay_for=" << tpTime::Str(mDelayFor) << " ";
00219   }
00220   return retstr.str();
00221 }
00222 
00223 
00224 
00225 } // namespace faudes
00226 

libFAUDES 2.20s --- 2011.10.12 --- c++ source docu by doxygen