CLHEP VERSION Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

testEngineCopy.cc

Go to the documentation of this file.
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 

Generated on 15 Nov 2012 for CLHEP by  doxygen 1.4.7