CLHEP 2.0.4.7 Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
00001 // $Id: NonRandomEngine.cc,v 1.4.4.2.2.1 2008/11/13 21:35:23 garren Exp $ 00002 // -*- C++ -*- 00003 // 00004 // ----------------------------------------------------------------------- 00005 // Hep Random 00006 // --- NonRandomEngine --- 00007 // class implementation file 00008 // ----------------------------------------------------------------------- 00009 // M. Fischler - Created 9/30/99 00010 // 00011 // M. Fischler - Modifications to capture sequence as a vector, which 00012 // are needed to retain sanity when put and get are involved. 00013 // Mark Fischler - Methods for distrib. instance save/restore 12/8/04 00014 // M. Fischler - Initialization of all state data (even those parts unused) 00015 // - at ctor time, to thwart a VC++ i/o bug. 00016 // M. Fischler - put/get for vectors of ulongs 3/15/05 00017 // M. Fischler - State-saving using only ints, for portability 4/12/05 00018 // 00019 //========================================================================= 00020 00021 #include "CLHEP/Random/defs.h" 00022 #include "CLHEP/Random/NonRandomEngine.h" 00023 #include "CLHEP/Random/engineIDulong.h" 00024 #include "CLHEP/Random/DoubConv.hh" 00025 #include <stdlib.h> 00026 #include <iostream> 00027 #include <string> 00028 #include <cassert> 00029 00030 //#define TRACE_IO 00031 00032 namespace CLHEP { 00033 00034 std::string NonRandomEngine::name() const {return "NonRandomEngine";} 00035 00036 NonRandomEngine::NonRandomEngine() : nextHasBeenSet(false), 00037 sequenceHasBeenSet(false), 00038 intervalHasBeenSet(false) , 00039 nextRandom(0.05), 00040 nInSeq(0), 00041 randomInterval(0.1) { } 00042 00043 NonRandomEngine::~NonRandomEngine() { } 00044 00045 00046 void NonRandomEngine::setNextRandom(double r) { 00047 nextRandom = r; 00048 nextHasBeenSet=true; 00049 return; 00050 } 00051 00052 void NonRandomEngine::setRandomSequence(double* s, int n) { 00053 sequence.clear(); 00054 for (int i=0; i<n; i++) sequence.push_back(*s++); 00055 assert (sequence.size() == (unsigned int)n); 00056 nInSeq = 0; 00057 sequenceHasBeenSet=true; 00058 nextHasBeenSet=false; 00059 return; 00060 } 00061 00062 void NonRandomEngine::setRandomInterval(double x) { 00063 randomInterval = x; 00064 intervalHasBeenSet=true; 00065 return; 00066 } 00067 00068 double NonRandomEngine::flat() { 00069 00070 if (sequenceHasBeenSet) { 00071 double v = sequence[nInSeq++]; 00072 if (nInSeq >= sequence.size() ) sequenceHasBeenSet = false; 00073 return v; 00074 } 00075 00076 if ( !nextHasBeenSet ) { 00077 std::cout 00078 << "Attempt to use NonRandomEngine without setting next random!\n"; 00079 exit(1); 00080 } 00081 00082 double a = nextRandom; 00083 nextHasBeenSet = false; 00084 00085 if (intervalHasBeenSet) { 00086 nextRandom += randomInterval; 00087 if ( nextRandom >= 1 ) nextRandom -= 1.0; 00088 nextHasBeenSet = true; 00089 } 00090 00091 return a; 00092 } 00093 00094 00095 void NonRandomEngine::flatArray(const int size, double* vect) { 00096 for (int i = 0; i < size; ++i) { 00097 vect[i] = flat(); 00098 } 00099 } 00100 00101 std::ostream & NonRandomEngine::put (std::ostream & os) const { 00102 std::string beginMarker = "NonRandomEngine-begin"; 00103 os << beginMarker << "\nUvec\n"; 00104 std::vector<unsigned long> v = put(); 00105 for (unsigned int i=0; i<v.size(); ++i) { 00106 os << v[i] << "\n"; 00107 } 00108 return os; 00109 #ifdef REMOVED 00110 std::string endMarker = "NonRandomEngine-end"; 00111 int pr = os.precision(20); 00112 os << " " << beginMarker << "\n"; 00113 os << nextHasBeenSet << " "; 00114 os << sequenceHasBeenSet << " "; 00115 os << intervalHasBeenSet << "\n"; 00116 os << nextRandom << " " << nInSeq << " " << randomInterval << "\n"; 00117 os << sequence.size() << "\n"; 00118 for (unsigned int i = 0; i < sequence.size(); ++i) { 00119 os << sequence[i] << "\n"; 00120 } 00121 os << endMarker << "\n "; 00122 os.precision(pr); 00123 return os; 00124 #endif 00125 } 00126 00127 std::vector<unsigned long> NonRandomEngine::put () const { 00128 std::vector<unsigned long> v; 00129 v.push_back (engineIDulong<NonRandomEngine>()); 00130 std::vector<unsigned long> t; 00131 v.push_back(static_cast<unsigned long>(nextHasBeenSet)); 00132 v.push_back(static_cast<unsigned long>(sequenceHasBeenSet)); 00133 v.push_back(static_cast<unsigned long>(intervalHasBeenSet)); 00134 t = DoubConv::dto2longs(nextRandom); 00135 v.push_back(t[0]); v.push_back(t[1]); 00136 v.push_back(static_cast<unsigned long>(nInSeq)); 00137 t = DoubConv::dto2longs(randomInterval); 00138 v.push_back(t[0]); v.push_back(t[1]); 00139 v.push_back(static_cast<unsigned long>(sequence.size())); 00140 for (unsigned int i=0; i<sequence.size(); ++i) { 00141 t = DoubConv::dto2longs(sequence[i]); 00142 v.push_back(t[0]); v.push_back(t[1]); 00143 } 00144 return v; 00145 } 00146 00147 std::istream & NonRandomEngine::get (std::istream & is) { 00148 std::string beginMarker = "NonRandomEngine-begin"; 00149 is >> beginMarker; 00150 if (beginMarker != "NonRandomEngine-begin") { 00151 is.clear(std::ios::badbit | is.rdstate()); 00152 std::cerr << "\nInput mispositioned or" 00153 << "\nNonRandomEngine state description missing or" 00154 << "\nwrong engine type found.\n"; 00155 return is; 00156 } 00157 return getState(is); 00158 } 00159 00160 std::string NonRandomEngine::beginTag ( ) { 00161 return "NonRandomEngine-begin"; 00162 } 00163 00164 std::istream & NonRandomEngine::getState (std::istream & is) { 00165 if ( possibleKeywordInput ( is, "Uvec", nextHasBeenSet ) ) { 00166 std::vector<unsigned long> v; 00167 unsigned long uu = 99999; 00168 unsigned long ssiz = 0; 00169 //std::string temporary; 00170 //is >> temporary; 00171 //std::cout << "*** " << temporary << "\n"; 00172 for (unsigned int istart=0; istart < 10; ++istart) { 00173 is >> uu; 00174 if (!is) { 00175 is.clear(std::ios::badbit | is.rdstate()); 00176 std::cout << "istart = " << istart << "\n"; 00177 std::cerr 00178 << "\nNonRandomEngine state (vector) description has no sequence size." 00179 << "\ngetState() has failed." 00180 << "\nInput stream is probably mispositioned now." << std::endl; 00181 return is; 00182 } 00183 v.push_back(uu); 00184 #ifdef TRACE_IO 00185 std::cout << "v[" << istart << "] = " << uu << "\n"; 00186 #endif 00187 if (istart==9) ssiz = uu; 00188 } 00189 for (unsigned int ivec=0; ivec < 2*ssiz; ++ivec) { 00190 is >> uu; 00191 if (!is) { 00192 is.clear(std::ios::badbit | is.rdstate()); 00193 std::cerr << "\nNonRandomEngine state (vector) description improper." 00194 << "\ngetState() has failed." 00195 << "\nInput stream is probably mispositioned now." << std::endl; 00196 return is; 00197 } 00198 v.push_back(uu); 00199 #ifdef TRACE_IO 00200 std::cout << "v[" << v.size()-1 << "] = " << uu << "\n"; 00201 #endif 00202 } 00203 getState(v); 00204 return (is); 00205 } 00206 00207 // is >> nextHasBeenSet; Removed, encompassed by possibleKeywordInput() 00208 00209 std::string endMarker = "NonRandomEngine-end"; 00210 is >> sequenceHasBeenSet >> intervalHasBeenSet; 00211 is >> nextRandom >> nInSeq >> randomInterval; 00212 unsigned int seqSize; 00213 is >> seqSize; 00214 sequence.clear(); 00215 double x; 00216 for (unsigned int i = 0; i < seqSize; ++i) { 00217 is >> x; 00218 sequence.push_back(x); 00219 } 00220 is >> endMarker; 00221 if (endMarker != "NonRandomEngine-end") { 00222 is.clear(std::ios::badbit | is.rdstate()); 00223 std::cerr << "\n NonRandomEngine state description incomplete." 00224 << "\nInput stream is probably mispositioned now." << std::endl; 00225 return is; 00226 } 00227 return is; 00228 } 00229 00230 bool NonRandomEngine::get (const std::vector<unsigned long> & v) { 00231 if ((v[0] & 0xffffffffUL) != engineIDulong<NonRandomEngine>()) { 00232 std::cerr << 00233 "\nNonRandomEngine get:state vector has wrong ID word - state unchanged\n"; 00234 return false; 00235 } 00236 return getState(v); 00237 } 00238 00239 bool NonRandomEngine::getState (const std::vector<unsigned long> & v) { 00240 unsigned int seqSize = v[9]; 00241 if (v.size() != 2*seqSize + 10 ) { 00242 std::cerr << 00243 "\nNonRandomEngine get:state vector has wrong length - state unchanged\n"; 00244 std::cerr << " (length = " << v.size() 00245 << "; expected " << 2*seqSize + 10 << ")\n"; 00246 return false; 00247 } 00248 std::vector<unsigned long> t(2); 00249 nextHasBeenSet = (v[1]!=0); 00250 sequenceHasBeenSet = (v[2]!=0); 00251 intervalHasBeenSet = (v[3]!=0); 00252 t[0] = v[4]; t[1] = v[5]; nextRandom = DoubConv::longs2double(t); 00253 nInSeq = v[6]; 00254 t[0] = v[7]; t[1] = v[8]; randomInterval = DoubConv::longs2double(t); 00255 sequence.clear(); 00256 for (unsigned int i=0; i<seqSize; ++i) { 00257 t[0] = v[2*i+10]; t[1] = v[2*i+11]; 00258 sequence.push_back(DoubConv::longs2double(t)); 00259 } 00260 return true; 00261 } 00262 00263 00264 } // namespace CLHEP 00265