source: Sophya/trunk/SophyaLib/BaseTools/randfmt.cc

Last change on this file was 3620, checked in by ansari, 16 years ago

les includes dSFMT.h ... mis ds le fichier randfmt.cc uniquement, declaration d'un pointeur dsfmt_t au lieu de la structure - Reza 06/06/2009

File size: 2.8 KB
RevLine 
[3602]1#include <math.h>
2#include <stdlib.h>
3
4#include "randfmt.h"
[3620]5#include "dsfmtflags.h"
6#include "dSFMT.h"
[3602]7
8namespace SOPHYA {
9
10//----------------------------------------------------------------
11// Implementation d'un generateur aleatoire utilisant le code
12// SIMD-oriented Fast Mersenne Twister (SFMT).
13// http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
14
15
16FMTRandGen::FMTRandGen(uint_4 seed)
17{
[3620]18 // On est oblige de faire new car la structure ds_fmt_t pas defini ds randfmt.h
19 dsfmt_ptr_ = new dsfmt_t;
20 dsfmt_init_gen_rand(dsfmt_ptr_,seed);
[3602]21}
22
23FMTRandGen::~FMTRandGen()
24{
[3620]25// Ne pas oublier de faire le delete
26 delete dsfmt_ptr_;
[3602]27}
28
[3615]29void FMTRandGen::ShowRandom()
30{
31 cout<<"RandomGenerator is FMTRandGen"<<endl;
32}
33
[3602]34void FMTRandGen::SetSeed(uint_4 seed)
35{
[3620]36 dsfmt_init_gen_rand(dsfmt_ptr_,seed);
[3602]37}
38
39void FMTRandGen::SetSeed(vector<uint_4> seed)
40{
41 if(seed.size()<=0) return;
42 int key_length = (int)seed.size();
43 uint_4* init_key = new uint_4[key_length];
44 for(int i=0;i<key_length;i++) init_key[i] = seed[i];
45
[3620]46 dsfmt_init_by_array(dsfmt_ptr_,init_key,key_length);
[3602]47
48 delete [] init_key;
49}
50
51r_8 FMTRandGen::Next()
52{
[3620]53 return dsfmt_genrand_close_open(dsfmt_ptr_);
[3602]54}
55
56void FMTRandGen::AutoInit(int lp)
57{
58 vector<uint_2> seed;
59 GenerateSeedVector(1,seed,lp);
60 vector<uint_4> s;
61 uint_4 s4;
62 s4 = seed[0] | (seed[1]<<16);
63 s.push_back(s4);
64 s4 = seed[2] | (seed[3]<<16);
65 s.push_back(s4);
66 SetSeed(s);
67}
68
69//----------------------------------------------------------
70// Classe pour la gestion de persistance
71// ObjFileIO<FMTRandGen>
72//----------------------------------------------------------
73
74/* --Methode-- */
75DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
76void ObjFileIO<FMTRandGen>::WriteSelf(POutPersist& s) const
77{
78 if (dobj == NULL)
79 throw NullPtrError("ObjFileIO<FMTRandGen>::WriteSelf() dobj=NULL");
80 s.Put((uint_4)DSFMT_MEXP);
[3620]81 s.Put(dobj->dsfmt_ptr_->idx);
[3603]82 for(int i=0;i<DSFMT_N+1;i++) {
83 for(int j=0;j<2;j++) {
[3620]84 uint_8 v = dobj->dsfmt_ptr_->status[i].u[j];
[3603]85 s.PutU8(v);
86 }
87 }
[3602]88 return;
89}
90
91/* --Methode-- */
92DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
93void ObjFileIO<FMTRandGen>::ReadSelf(PInPersist& s)
94{
95 uint_4 mexp;
96 s.Get(mexp);
97 if(mexp != DSFMT_MEXP)
98 throw SzMismatchError("ObjFileIO<FMTRandGen>::WriteSelf() wrong DSFMT_MEXP");
99 if(dobj == NULL) dobj = new FMTRandGen();
[3620]100 s.Get(dobj->dsfmt_ptr_->idx);
[3603]101 for(int i=0;i<DSFMT_N+1;i++) {
102 for(int j=0;j<2;j++) {
103 uint_8 v;
104 s.Get(v);
[3620]105 dobj->dsfmt_ptr_->status[i].u[j] = v;
[3603]106 }
107 }
[3602]108 return;
109}
110
111// ---------------------------------------------------------
112#ifdef __CXX_PRAGMA_TEMPLATES__
113#pragma define_template ObjFileIO<FMTRandGen>
114#endif
115
116#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
117template class ObjFileIO<FMTRandGen>;
118#endif
119
120} /* namespace SOPHYA */
Note: See TracBrowser for help on using the repository browser.