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 }
00028 
00029 
00030 // Test equality
00031 bool SimEventAttribute::DoEqual(const SimEventAttribute& rOther) const { 
00032   // call base 
00033   if(!AttributeCFlags::DoEqual(rOther)) return false;
00034   // my additional members
00035   if(mStochastic!=rOther.mStochastic) return false;
00036   if(mPriority!=rOther.mPriority) return false;
00037   if(!(mPriorityAttribute==rOther.mPriorityAttribute)) return false;
00038   if(!(mStochasticAttribute==rOther.mStochasticAttribute)) return false;
00039   // pass
00040   return true;
00041 }
00042 
00043 
00044 //DoWrite(rTw);
00045 void SimEventAttribute::DoWrite(TokenWriter& rTw, const std::string& rLabel, const Type* pContext) const {
00046   (void) rLabel;
00047   // do base first
00048   AttributeCFlags::DoWrite(rTw,"",pContext);
00049   FD_DC("SimEventAttribute(" << this << ")::DoWrite(tr)");
00050   Token token;
00051   // write priority
00052   if(mPriority) {
00053     rTw.WriteBegin("Priority");
00054     Token token;
00055     token.SetInteger(mPriorityAttribute.mPriority);
00056     rTw.Write(token);
00057     rTw.WriteEnd("Priority");
00058   }
00059   // write stochastic
00060   if(mStochastic) {
00061     rTw.WriteBegin("Stochastic");
00062     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Extern) rTw.WriteOption("Extern");
00063     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Trigger) rTw.WriteOption("Trigger");
00064     if(mStochasticAttribute.mType==SimStochasticEventAttribute::Delay) rTw.WriteOption("Delay");
00065     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Exponential) rTw.WriteOption("Exponential");
00066     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Gauss) rTw.WriteOption("Gauss");
00067     if(mStochasticAttribute.mPdf==SimStochasticEventAttribute::Uniform) rTw.WriteOption("Uniform");
00068     if(mStochasticAttribute.mParameter.size()>0) {
00069       rTw.WriteBegin("Parameter");
00070       std::vector<double>::const_iterator pit=mStochasticAttribute.mParameter.begin();
00071       for(; pit!=mStochasticAttribute.mParameter.end(); pit++) {
00072   rTw.WriteFloat(*pit);
00073       }
00074       rTw.WriteEnd("Parameter");
00075     }
00076     rTw.WriteEnd("Stochastic");
00077   }
00078 }
00079 
00080 //DoRead(rTr)
00081 void SimEventAttribute::DoRead(TokenReader& rTr, const std::string& rLabel, const Type* pContext) {
00082   (void) rLabel;
00083   // call base first
00084   AttributeCFlags::DoRead(rTr,"",pContext);
00085 
00086   // report
00087   FD_DC("SimEventAttribute(" << this << ")::DoRead(tr)");
00088 
00089   // clear myself
00090   mStochastic=false;
00091   mPriority=false;
00092 
00093   // read as long as we can handle
00094   Token token;
00095   bool err=false;
00096   while(rTr.Peek(token)) {
00097 
00098     // try priority
00099     if(token.IsBegin() && token.StringValue()=="Priority") {
00100       rTr.ReadBegin("Priority");
00101       mPriority=true;
00102       rTr.Get(token);
00103       if(!token.IsFloat()) {
00104         err=true; 
00105       } else {
00106         mPriorityAttribute.mPriority=(int) token.FloatValue();
00107       }
00108       rTr.ReadEnd("Priority");
00109       continue;
00110     }
00111 
00112     // try stochastic
00113     if(token.IsBegin() && token.StringValue()=="Stochastic") {
00114       rTr.ReadBegin("Stochastic");
00115       // stochastic default
00116       mStochastic=true;
00117       mStochasticAttribute.mType = SimStochasticEventAttribute::Extern;
00118       mStochasticAttribute.mPdf = SimStochasticEventAttribute::Exponential;
00119       mStochasticAttribute.mParameter.clear();
00120       mStochasticAttribute.mParameter.push_back(1);
00121       // mandatory option: intern/extern
00122       rTr.Get(token);
00123       if(!token.IsOption()) {
00124   err=true; 
00125       } else {
00126         if(token.OptionValue() == "Extern") 
00127     {mStochasticAttribute.mType = SimStochasticEventAttribute::Extern; };
00128         if(token.OptionValue() == "Trigger") 
00129     {mStochasticAttribute.mType = SimStochasticEventAttribute::Trigger; };
00130         if(token.OptionValue() == "Delay") 
00131     {mStochasticAttribute.mType = SimStochasticEventAttribute::Delay; };
00132       } 
00133       // mandatory option: exponential/gauss/ etc
00134       rTr.Get(token);
00135       if(!token.IsOption()) {
00136   err=true; 
00137       } else {
00138         if(token.OptionValue() == "Exponential") 
00139       {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Exponential;};
00140         if(token.OptionValue() == "Gauss") 
00141     {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Gauss;};
00142         if(token.OptionValue() == "Uniform") 
00143       {mStochasticAttribute.mPdf = SimStochasticEventAttribute::Uniform;};
00144       }  
00145       // optional data: parameter vector
00146       rTr.Peek(token);
00147       if(token.StringValue()=="Parameter" && token.IsBegin()) {
00148         mStochasticAttribute.mParameter.clear();
00149         rTr.ReadBegin("Parameter");
00150         while (!rTr.Eos("Parameter")) {
00151           double par = rTr.ReadFloat();
00152           mStochasticAttribute.mParameter.push_back(par);      
00153         }
00154         rTr.ReadEnd("Parameter");
00155       }
00156       // old file format: fix missing restricted support pdfs
00157       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Exponential 
00158          && mStochasticAttribute.mParameter.size() == 1) {
00159         double lambda= mStochasticAttribute.mParameter.at(0);
00160         mStochasticAttribute.mParameter.clear();
00161   mStochasticAttribute.mParameter.push_back(0);
00162   mStochasticAttribute.mParameter.push_back(tpTime::Max);
00163   mStochasticAttribute.mParameter.push_back(lambda);
00164       }
00165       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Gauss 
00166          && mStochasticAttribute.mParameter.size() == 2) {
00167         double mue= mStochasticAttribute.mParameter.at(0);
00168         double sigma= mStochasticAttribute.mParameter.at(1);
00169         mStochasticAttribute.mParameter.clear();
00170   mStochasticAttribute.mParameter.push_back(0);
00171   mStochasticAttribute.mParameter.push_back(tpTime::Max);
00172   mStochasticAttribute.mParameter.push_back(mue);
00173   mStochasticAttribute.mParameter.push_back(sigma);
00174       }
00175       // check parameter vector consistency
00176       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Exponential 
00177          && mStochasticAttribute.mParameter.size() != 3) 
00178         err=true;
00179       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Gauss 
00180          && mStochasticAttribute.mParameter.size() != 4) 
00181         err=true;
00182       if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Uniform 
00183          && mStochasticAttribute.mParameter.size() != 2) 
00184         err=true;
00185       rTr.ReadEnd("Stochastic");
00186     }
00187 
00188     // report error
00189     if(err) {
00190       std::stringstream errstr;
00191       errstr << "invalid simulation event property" << rTr.FileLine();
00192       throw Exception("SimEventAttribute::Read", errstr.str(), 52);
00193     }
00194 
00195     // cannot digest? -> done
00196     break;
00197     
00198   }
00199 }
00200 
00201 
00202 
00203 
00204 } // namespace faudes
00205 

libFAUDES 2.18b --- 2010-12-17 --- c++ source docu by doxygen 1.6.3