CLHEP 2.0.4.7 Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

NonRandomEngine.cc

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

Generated on Thu Jul 1 22:02:30 2010 for CLHEP by  doxygen 1.4.7