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

libFAUDES 2.16b --- 2010-9-8 --- c++ source docu by doxygen 1.6.3