CLHEP VERSION Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
00001 // -*- C++ -*- 00002 // $Id: testEngineCopy.cc,v 1.2 2010/06/16 17:24:53 garren Exp $ 00003 // ---------------------------------------------------------------------- 00004 #include "CLHEP/Units/GlobalPhysicalConstants.h" // used to provoke shadowing warnings 00005 #include "CLHEP/Random/Randomize.h" 00006 #include "CLHEP/Random/NonRandomEngine.h" 00007 #include "CLHEP/Random/defs.h" 00008 #include <iostream> 00009 #include <iomanip> 00010 #include <vector> 00011 00012 #define CLEAN_OUTPUT 00013 #ifdef CLEAN_OUTPUT 00014 std::ofstream output("testEngineCopy.cout"); 00015 #else 00016 std::ostream & output = std::cout; 00017 #endif 00018 00019 // Normally on for routine validation: 00020 00021 #ifdef TURNOFF 00022 #endif 00023 00024 #define TEST_ENGINE_COPY 00025 00026 #define VERBOSER 00027 #define VERBOSER2 00028 00029 using namespace CLHEP; 00030 00031 // Absolutely Safe Equals Without Registers Screwing Us Up 00032 bool equals01(const std::vector<double> &ab) { 00033 return ab[1]==ab[0]; 00034 } 00035 bool equals(double a, double b) { 00036 std::vector<double> ab(2); 00037 ab[0]=a; ab[1]=b; 00038 return (equals01(ab)); 00039 } 00040 00041 std::vector<double> aSequence(int n) { 00042 std::vector<double> v; 00043 DualRand e(13542); 00044 RandFlat f(e); 00045 for (int i=0; i<n; i++) { 00046 v.push_back(f()); 00047 } 00048 return v; 00049 } 00050 00051 00052 // ----------- Copy of engines ----------- 00053 00054 template <class E> 00055 int vectorTest64(int n) { 00056 output << "Copy 64bit test for " << E::engineName() << "\n"; 00057 00058 E e; 00059 double x = 0; 00060 for (int i=0; i<n; i++) x += e.flat(); 00061 E f( e ); 00062 x = e.flat(); 00063 output << "x = " << x << std::endl; 00064 00065 double y = f.flat(); 00066 output << "y = " << y << std::endl; 00067 if( x != y ) return n; 00068 00069 for( int i=0; i<1000; ++i ) { 00070 x = e.flat(); 00071 y = f.flat(); 00072 if( !equals(x,y) ) { 00073 output << "i = " << i << " x, y " << x << " " << y 00074 << " vectorTest64 problem: e != f \n"; 00075 return n+i; 00076 } 00077 } 00078 00079 return 0; 00080 } 00081 // special case for NonRandomEngine 00082 template <> 00083 int vectorTest64<NonRandomEngine>(int n) { 00084 output << "Copy 64bit test for " << NonRandomEngine::engineName() << "\n"; 00085 00086 std::vector<double> nonRand = aSequence(500); 00087 NonRandomEngine e; 00088 e.setRandomSequence(&nonRand[0], nonRand.size()); 00089 00090 double x = 0; 00091 for (int i=0; i<n; i++) x += e.flat(); 00092 std::vector<unsigned long> v = e.put(); 00093 NonRandomEngine f(e); 00094 x = e.flat(); 00095 output << "x = " << x << std::endl; 00096 00097 double y = f.flat(); 00098 output << "y = " << y << std::endl; 00099 if( x != y ) return n; 00100 00101 for( int i=0; i<300; ++i ) { 00102 if( e.flat() != f.flat() ) { 00103 output << "i = " << i << " vectorTest64 for NonRandomEngine problem: e != f \n"; 00104 return n+i; 00105 } 00106 } 00107 00108 return 0; 00109 } 00110 00111 template <class E> 00112 E vectorRestore1(int n, std::vector<double> & v) { 00113 output << "Copy for " << E::engineName() << "\n"; 00114 E e(97538466); 00115 double r=0; 00116 for (int i=0; i<n; i++) r += e.flat(); 00117 E f(e); 00118 for (int j=0; j<25; j++) v.push_back(e.flat()); 00119 #ifdef VERBOSER2 00120 output << "First four of v are: " 00121 << v[0] << ", " << v[1] << ", " << v[2] << ", " << v[3] << "\n"; 00122 #endif 00123 return f; 00124 } 00125 00126 template <> 00127 NonRandomEngine 00128 vectorRestore1<NonRandomEngine> (int n, std::vector<double> & v) { 00129 #ifdef VERBOSER2 00130 output << "Copy for " << NonRandomEngine::engineName() << "\n"; 00131 #endif 00132 std::vector<double> nonRand = aSequence(500); 00133 NonRandomEngine e; 00134 e.setRandomSequence(&nonRand[0], nonRand.size()); 00135 double r=0; 00136 for (int i=0; i<n; i++) r += e.flat(); 00137 NonRandomEngine f(e); 00138 for (int j=0; j<25; j++) v.push_back(e.flat()); 00139 #ifdef VERBOSER2 00140 output << "First four of v are: " 00141 << v[0] << ", " << v[1] << ", " << v[2] << ", " << v[3] << "\n"; 00142 #endif 00143 return f; 00144 } 00145 00146 template <class E> 00147 int vectorRestore2(E & f, const std::vector<double> & v) { 00148 int stat = 0; 00149 std::vector<double> k; 00150 for (int j=0; j<25; j++) k.push_back(f.flat()); 00151 #ifdef VERBOSER2 00152 output << "First four of k are: " 00153 << k[0] << ", " << k[1] << ", " << k[2] << ", " << k[3] << "\n"; 00154 #endif 00155 for (int m1=0; m1<25; m1++) { 00156 if ( v[m1] != k[m1] ) { 00157 std::cout << "???? Incorrect copy restored value for engine: " 00158 << E::engineName() << "\n"; 00159 #ifdef CLEAN_OUTPUT 00160 output << "???? Incorrect copy restored value for engine: " 00161 << E::engineName() << "\n"; 00162 #endif 00163 stat |= 1048576; 00164 return stat; 00165 } 00166 } 00167 return stat; 00168 } 00169 00170 00171 template <class E> 00172 int vectorRestore(int n) { 00173 std::vector<double> v; 00174 int status1 = vectorTest64<E>(n); 00175 E f = vectorRestore1<E>(n,v); 00176 int status2 = vectorRestore2<E>(f, v); 00177 return (status1 | status2); 00178 } 00179 00180 00181 00182 // --------------------------------------------- 00183 // --------------------------------------------- 00184 // --------------------------------------------- 00185 00186 00187 int main() { 00188 int stat = 0; 00189 00190 #ifdef TEST_ENGINE_COPY 00191 output << "\n=================================\n"; 00192 output << " Part IX \n"; 00193 output << " Copy test of engines\n"; 00194 output << "=================================\n\n"; 00195 00196 stat |= vectorRestore<DualRand>(113); 00197 // copies of DRand48Engine are not allowed 00198 //stat |= vectorRestore<DRand48Engine>(114); 00199 stat |= vectorRestore<Hurd160Engine>(115); 00200 stat |= vectorRestore<Hurd288Engine>(116); 00201 stat |= vectorRestore<HepJamesRandom>(117); 00202 stat |= vectorRestore<MTwistEngine>(118); 00203 stat |= vectorRestore<RanecuEngine>(139); 00204 stat |= vectorRestore<Ranlux64Engine>(119); 00205 stat |= vectorRestore<RanluxEngine>(120); 00206 stat |= vectorRestore<RanshiEngine>(121); 00207 stat |= vectorRestore<TripleRand>(122); 00208 stat |= vectorRestore<NonRandomEngine>(123); 00209 // anonymous engines are not copyable 00210 //stat |= vectorRestore<RandEngine>(129); 00211 #endif 00212 00213 output << "\n=============================================\n\n"; 00214 00215 if (stat != 0) { 00216 std::cout << "One or more problems detected: stat = " << stat << "\n"; 00217 output << "One or more problems detected: stat = " << stat << "\n"; 00218 } else { 00219 output << "ranRestoreTest passed with no problems detected.\n"; 00220 } 00221 00222 if (stat == 0) return 0; 00223 if (stat > 0) return -(stat|1); 00224 return stat|1; 00225 } 00226