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     rTw.WriteInteger(mPriorityAttribute.mPriority);
00060     rTw.WriteEnd("Priority");
00061   }
00062   // write stochastic
00063   if(mStochastic) {
00064     rTw.WriteBegin("Stochastic");
00065     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Extern) rTw.WriteOption("Extern");
00066     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Trigger) rTw.WriteOption("Trigger");
00067     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Delay) rTw.WriteOption("Delay");
00068     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Exponential) rTw.WriteOption("Exponential");
00069     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Gauss) rTw.WriteOption("Gauss");
00070     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Uniform) rTw.WriteOption("Uniform");
00071     if(mStochasticAttribute.mParameter.size()>0) {
00072       rTw.WriteBegin("Parameter");
00073       std::vector<double>::const_iterator pit=mStochasticAttribute.mParameter.begin();
00074       for(; pit!=mStochasticAttribute.mParameter.end(); pit++) {
00075   rTw.WriteFloat(*pit);
00076       }
00077       rTw.WriteEnd("Parameter");
00078     }
00079     rTw.WriteEnd("Stochastic");
00080   }
00081 }
00082 
00083 //DoRead(rTr)
00084 void SimEventAttribute::DoRead(TokenReader& rTr, const std::string& rLabel, const Type* pContext) {
00085   (void) rLabel;
00086   // call base first
00087   AttributeCFlags::DoRead(rTr,"",pContext);
00088 
00089   // report
00090   FD_DC("SimEventAttribute(" << this << ")::DoRead(tr)");
00091 
00092   // clear myself
00093   mStochastic=false;
00094   mPriority=false;
00095 
00096   // read as long as we can handle
00097   Token token;
00098   bool err=false;
00099   while(rTr.Peek(token)) {
00100 
00101     // try priority
00102     if(token.IsBegin() && token.StringValue()=="Priority") {
00103       rTr.ReadBegin("Priority");
00104       mPriority=true;
00105       rTr.Get(token);
00106       if(!token.IsFloat()) {
00107         err=true; 
00108       } else {
00109         mPriorityAttribute.mPriority=(int) token.FloatValue();
00110       }
00111       rTr.ReadEnd("Priority");
00112       continue;
00113     }
00114 
00115     // try stochastic
00116     if(token.IsBegin() && token.StringValue()=="Stochastic") {
00117       rTr.ReadBegin("Stochastic");
00118       // stochastic default
00119       mStochastic=true;
00120       mStochasticAttribute.mType = SimStochasticEventAttribute::Extern;
00121       mStochasticAttribute.mPdf = SimStochasticEventAttribute::Exponential;
00122       mStochasticAttribute.mParameter.clear();
00123       mStochasticAttribute.mParameter.push_back(1);
00124       // mandatory option: intern/extern
00125       rTr.Get(token);
00126       if(!token.IsOption()) {
00127   err=true; 
00128       } else {
00129         if(token.OptionValue() == "Extern") 
00130     {mStochasticAttribute.mType = SimStochasticEventAttribute::Extern; };
00131         if(token.OptionValue() == "Trigger") 
00132     {mStochasticAttribute.mType = SimStochasticEventAttribute::Trigger; };
00133         if(token.OptionValue() == "Delay") 
00134     {mStochasticAttribute.mType = SimStochasticEventAttribute::Delay; };
00135       } 
00136       // mandatory option: exponential/gauss/ etc
00137       rTr.Get(token);
00138       if(!token.IsOption()) {
00139   err=true; 
00140       } else {
00141         if(token.OptionValue() == "Exponential") 
00142       {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Exponential;};
00143         if(token.OptionValue() == "Gauss") 
00144     {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Gauss;};
00145         if(token.OptionValue() == "Uniform") 
00146       {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Uniform;};
00147       }  
00148       // optional data: parameter vector
00149       rTr.Peek(token);
00150       if(token.StringValue()=="Parameter" && token.IsBegin()) {
00151         mStochasticAttribute.mParameter.clear();
00152         rTr.ReadBegin("Parameter");
00153         while (!rTr.Eos("Parameter")) {
00154           double par = rTr.ReadFloat();
00155           mStochasticAttribute.mParameter.push_back(par);      
00156         }
00157         rTr.ReadEnd("Parameter");
00158       }
00159       // old file format: fix missing restricted support pdfs
00160       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Exponential 
00161          && mStochasticAttribute.mParameter.size() == 1) {
00162         double lambda= mStochasticAttribute.mParameter.at(0);
00163         mStochasticAttribute.mParameter.clear();
00164   mStochasticAttribute.mParameter.push_back(0);
00165   mStochasticAttribute.mParameter.push_back(tpTime::Max);
00166   mStochasticAttribute.mParameter.push_back(lambda);
00167       }
00168       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Gauss 
00169          && mStochasticAttribute.mParameter.size() == 2) {
00170         double mue= mStochasticAttribute.mParameter.at(0);
00171         double sigma= mStochasticAttribute.mParameter.at(1);
00172         mStochasticAttribute.mParameter.clear();
00173   mStochasticAttribute.mParameter.push_back(0);
00174   mStochasticAttribute.mParameter.push_back(tpTime::Max);
00175   mStochasticAttribute.mParameter.push_back(mue);
00176   mStochasticAttribute.mParameter.push_back(sigma);
00177       }
00178       // check parameter vector consistency
00179       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Exponential 
00180          && mStochasticAttribute.mParameter.size() != 3) 
00181         err=true;
00182       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Gauss 
00183          && mStochasticAttribute.mParameter.size() != 4) 
00184         err=true;
00185       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Uniform 
00186          && mStochasticAttribute.mParameter.size() != 2) 
00187         err=true;
00188       rTr.ReadEnd("Stochastic");
00189     }
00190 
00191     // report error
00192     if(err) {
00193       std::stringstream errstr;
00194       errstr << "invalid simulation event property" << rTr.FileLine();
00195       throw Exception("SimEventAttribute::Read", errstr.str(), 52);
00196     }
00197 
00198     // cannot digest? -> done
00199     break;
00200     
00201   }
00202 }
00203 
00204 
00205 // debug str
00206 std::string SimEventAttribute::Str(void) const {
00207   std::stringstream retstr;
00208   //retstr << "[" << this << "] ";
00209   if(IsPriority()) {
00210     retstr<< "priority=" << Priority().mPriority << " ";
00211   }
00212   if(IsStochastic()) {
00213     retstr<< "stochastic=" << SimStochasticEventAttribute::TStr(Stochastic().mType) << " " ;
00214     retstr<< "scheduled_for=" << tpTime::Str(mScheduledFor) << " ";
00215     retstr<< " expires_at=" << tpTime::Str(mExpiresAt) << " ";
00216     retstr<< " delay_for=" << tpTime::Str(mDelayFor) << " ";
00217   }
00218   return retstr.str();
00219 }
00220 
00221 
00222 
00223 } // namespace faudes
00224 

libFAUDES 2.23h --- 2014.04.03 --- c++ api documentaion by doxygen