ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-3.0/test/math/testRandNumGen.cpp
Revision: 2075
Committed: Wed Mar 2 07:32:15 2005 UTC (19 years, 4 months ago) by tim
File size: 2885 byte(s)
Log Message:
Adding unit test for random number generator

File Contents

# User Rev Content
1 tim 2075 #include <cassert>
2     #include <fstream>
3     #include <algorithm>
4     #include "utils/simError.h"
5     #include "math/ParallelRandNumGen.hpp"
6    
7     void RandNumGenTestCase::testUniform(){
8     MTRand randNumGen(823645754);
9    
10     const int N = 16;
11     std::vector<unsigned long int> histogram(N, 0);
12     const int num = 1000000;
13     for (int i = 0; i <num; ++i) {
14     ++histogram[randNumGen.randInt(N -1 )]; // rantInt returns an integer in [0, N-1]
15     }
16    
17     std::ofstream uniform("uniform.dat")
18     int avg = num / N;
19     double tolerance = 0.01*avg;
20     for (int i = 0; i < num; ++i) {
21     assert((histogram[i] - avg) /avg <= tolerance);
22     uniform << i << "\t" << histogram[i] << std::endl;
23     }
24     }
25    
26     void RandNumGenTestCase::testGaussian(){
27     MTRand randNumGen(823645754);
28     double mean = 100.0;
29     double variance = 1.0;
30     const int num = 1000000;
31     double interval = 0.1;
32     const int size = 2000;
33     vector<unsigned long int> histogram(size , 0);
34     vector<double> normalizedHistogram(size);
35     for (int i = 0; i < num; ++i) {
36     int index = static_cast<int>(randNumGen.randNorm(mean, variance) / interval);
37     ++histogram[index];
38     }
39    
40     std::transform(histogram.begin(), histogram.end(), normalizedHistogram.begin(), std::bind2nd(std::divides<double>(), num));
41     std::ofstream gaussian("gaussian.dat");
42     for (int i = 0; i < num; ++i) {
43     gaussian << i << "\t" << normalizedHistogram[i] << std::endl;
44     }
45     }
46    
47     void RandNumGenTestCase::testParallelRandNumGen(){
48     const int seed = 324271632;
49     const int nloops = 1000000;
50     MPI_Status istatus;
51     ParallelRandNumGen mpiRandNumGen(seed);
52     const int masterNode = 0;
53     if (worldRank = masterNode) {
54    
55     MTRand singleRandNumGen(seed);
56    
57     int nProcessors;
58     MPI_Comm_size(MPI_COMM_WORLD, &nProcessors);
59     std::vector<unsigned long int> mpiRandNums(nProcessors);
60     std::vector<unsigned long int> singleRandNums(nProcessors);
61    
62     for (int i = 0; i < nloops; ++i) {
63     mpiRandNums[masterNode] = mpiRandNumGen.randInt();
64    
65     for (int j = 0; j < nProcessors; ++j) {
66     if (j != masterNode) {
67     MPI_Recv(&mpiRandNums[j], 1, MPI_UNSIGNED_LONG, j, i, MPI_COMM_WORLD, &istatus);
68     }
69    
70     singleRandNums[j] = mpiRandNumGen.randInt();
71     }
72    
73     assert(mpiRandNums, singleRandNums);
74     }
75    
76    
77    
78     } else {
79    
80     unsigned long int randNum;
81     for (int i = 0; i < nloops; ++i) {
82     randNum = mpiRandNumGen.randInt();
83     MPI_Send(&randNum, 1, MPI_INT, masterNode, i, MPI_COMM_WORLD);
84     }
85    
86     }
87    
88     }
89    
90    
91     int main(int argc, char* argv[]) {
92    
93     MPI_Init(argc, argv);
94    
95     if (worldRank == 0 ) {
96     testUniform();
97     testGaussian();
98     }
99    
100     testParallelRandNumGen();
101    
102     MPI_Finalize();
103     }