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
Line 
1#include <math.h>
2#include <stdlib.h>
3
4#include "randfmt.h"
5#include "dsfmtflags.h"
6#include "dSFMT.h"
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{
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);
21}
22
23FMTRandGen::~FMTRandGen()
24{
25// Ne pas oublier de faire le delete
26 delete dsfmt_ptr_;
27}
28
29void FMTRandGen::ShowRandom()
30{
31 cout<<"RandomGenerator is FMTRandGen"<<endl;
32}
33
34void FMTRandGen::SetSeed(uint_4 seed)
35{
36 dsfmt_init_gen_rand(dsfmt_ptr_,seed);
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
46 dsfmt_init_by_array(dsfmt_ptr_,init_key,key_length);
47
48 delete [] init_key;
49}
50
51r_8 FMTRandGen::Next()
52{
53 return dsfmt_genrand_close_open(dsfmt_ptr_);
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);
81 s.Put(dobj->dsfmt_ptr_->idx);
82 for(int i=0;i<DSFMT_N+1;i++) {
83 for(int j=0;j<2;j++) {
84 uint_8 v = dobj->dsfmt_ptr_->status[i].u[j];
85 s.PutU8(v);
86 }
87 }
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();
100 s.Get(dobj->dsfmt_ptr_->idx);
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);
105 dobj->dsfmt_ptr_->status[i].u[j] = v;
106 }
107 }
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.