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