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(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 |