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 } 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.20d --- 2011.04.26 --- c++ source docu by doxygen