|
libFAUDES
Sections
Index
|
sp_simeventset.cppGo 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