| |
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 // check parameter vector consistency 00158 if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Exponential 00159 && mStochasticAttribute.mParameter.size() != 1) 00160 err=true; 00161 if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Gauss 00162 && mStochasticAttribute.mParameter.size() != 2) 00163 err=true; 00164 if(mStochasticAttribute.mPdf == SimStochasticEventAttribute::Uniform 00165 && mStochasticAttribute.mParameter.size() != 2) 00166 err=true; 00167 rTr.ReadEnd("Stochastic"); 00168 } 00169 00170 // report error 00171 if(err) { 00172 std::stringstream errstr; 00173 errstr << "invalid simulation event property" << rTr.FileLine(); 00174 throw Exception("SimEventAttribute::Read", errstr.str(), 52); 00175 } 00176 00177 // cannot digest? -> done 00178 break; 00179 00180 } 00181 } 00182 00183 00184 00185 00186 } // namespace faudes 00187 |
libFAUDES 2.14g --- 2009-12-3 --- c++ source docu by doxygen 1.5.6