1 #include "TestDistribution.h"
2 #include "UniformDistribution.h"
3 #include "arrcmp.h"
4 #include <iostream>
5 #include <fstream>
6 #include <cstdio>
7 #include <cstdlib>
8 #include <cmath>
9 #include <string.h>
10
11 using namespace std;
12
TestDistribution()13 TestDistribution::TestDistribution()
14 {
15 // set the seed
16 seed = 779;
17 DistributionBase::setSeed( seed );
18
19 // set lower and upper bounds
20 lb = 5;
21 ub = 10;
22
23 //get the first deviate
24 Distribution distArg( UniformDistribution( lb, ub ) );
25 this->deviate = distArg.getDeviate();
26 }
27
~TestDistribution()28 TestDistribution::~TestDistribution()
29 {
30 }
31
run()32 void TestDistribution::run()
33 {
34 testDistributionDefault();
35 testDistributionArg();
36 testGetDeviateNoProb();
37 testGetDeviateWithProb();
38 testGetCDF();
39 testLowerBound();
40 testUpperBound();
41 testMean();
42 testStdDev();
43 testPrint();
44 testPrintAttributes();
45 testTypeName();
46 testUsePseudoRandom();
47
48 }
49
50
testUsePseudoRandom()51 void TestDistribution::testUsePseudoRandom() {
52
53 DistributionBase::usePseudoRandom(true);
54
55 DistributionBase::setSeed(0);
56 double number = DistributionBase::uniformUnitDeviate();
57 _test(fabs(number - 0.000)<0.0001);
58 number = DistributionBase::uniformUnitDeviate();
59 _test(fabs(number - 0.001)<0.0001);
60
61 DistributionBase::setSeed(500);
62 number = DistributionBase::uniformUnitDeviate();
63 _test(fabs(number - 0.500)<0.0001);
64 number = DistributionBase::uniformUnitDeviate();
65 _test(fabs(number - 0.501)<0.0001);
66
67 DistributionBase::setSeed(998);
68 number = DistributionBase::uniformUnitDeviate();
69 _test(fabs(number - 0.998)<0.0001);
70 number = DistributionBase::uniformUnitDeviate();
71 _test(fabs(number - 0.999)<0.0001);
72 number = DistributionBase::uniformUnitDeviate();
73 _test(fabs(number - 0.0)<0.0001);
74
75 DistributionBase::usePseudoRandom(false);
76 DistributionBase::setSeed(0);
77 number = DistributionBase::uniformUnitDeviate();
78 _test(number != 0);
79
80 DistributionBase::setSeed(0);
81
82 }
83
84
testDistributionDefault()85 void TestDistribution::testDistributionDefault()
86 {
87 // use constructor Distribution();
88 Distribution distEmpty;
89
90 try {
91 _test( distEmpty.lowerBound() == 0 );
92
93 // if here then no exception was thrown, record failure.
94 _test( false );
95 } catch( std::exception& e ) {
96 // if here then exception was thrown, record success
97 _test( true );
98 }
99 }
100
testDistributionArg()101 void TestDistribution::testDistributionArg()
102 {
103 // use constructor Distribution( DistributionBase& base );
104 Distribution distArg( UniformDistribution( lb, ub ) );
105
106 _test( distArg.lowerBound() == lb );
107 _test( distArg.upperBound() == ub );
108 }
109
testGetDeviateNoProb()110 void TestDistribution::testGetDeviateNoProb()
111 {
112 DistributionBase::setSeed( seed );
113 Distribution distArg( UniformDistribution( lb, ub ) );
114
115 // test the returned deviate value
116 _test( fabs(distArg.getDeviate() - this->deviate) < 0.001 );
117 }
118
testGetDeviateWithProb()119 void TestDistribution::testGetDeviateWithProb()
120 {
121 DistributionBase::setSeed( seed );
122 Distribution distArg( UniformDistribution( lb, ub ) );
123
124 // test the returned deviate value
125 _test( distArg.getDeviate( 0.5 ) == (lb + (ub-lb)*0.5) );
126 }
127
testGetCDF()128 void TestDistribution::testGetCDF()
129 {
130 Distribution distArg( UniformDistribution( lb, ub ) );
131
132 // test the returned CDF value
133
134 double a = distArg.getCDF( 0.5 );
135 double b = ((0.5-lb)/(ub-lb));
136 _test( a == b );
137 // _test( distArg.getCDF( 0.5 ) == ((0.5-lb)/(ub-lb)) );
138 }
139
testLowerBound()140 void TestDistribution::testLowerBound()
141 {
142 Distribution distArg( UniformDistribution( lb, ub ) );
143
144 _test( distArg.lowerBound() == lb );
145 }
146
testUpperBound()147 void TestDistribution::testUpperBound()
148 {
149 Distribution distArg( UniformDistribution( lb, ub ) );
150
151 _test( distArg.upperBound() == ub );
152 }
153
testMean()154 void TestDistribution::testMean()
155 {
156 Distribution distArg( UniformDistribution( lb, ub ) );
157
158 _test( distArg.mean() == lb+(ub-lb)/2 );
159 }
160
testStdDev()161 void TestDistribution::testStdDev()
162 {
163 Distribution distArg( UniformDistribution( lb, ub ) );
164
165 _test( fabs(distArg.stdDev() - sqrt(pow(ub-lb,2)/12.0)) < 1.0e-10 );
166 }
167
testPrint()168 void TestDistribution::testPrint()
169 {
170 char buf[128];
171
172 Distribution distArg( UniformDistribution( lb, ub ) );
173
174 ofstream fout;
175 ifstream fin;
176
177 string data;
178 string test_str;
179
180 // write the data to a file, then reopen the
181 // file and verify the data was written correctly
182 memset( buf, 0, 128 );
183 #ifdef HAVE_SNPRINTF
184 snprintf( buf, 128, "UNIFORM %d %d", (int)lb, (int)ub );
185 #else
186 int numberOfCharsRead = sprintf( buf, "UNIFORM %d %d", (int)lb, (int)ub );
187 assert(numberOfCharsRead <= 128);
188 #endif
189
190 test_str = buf;
191
192 fout.open( "TestDistribution_Log" );
193 if( fout )
194 {
195 distArg.print( fout );
196 fout << endl;
197 fout.close();
198 }
199 else
200 {
201 _test( false );
202 }
203
204 fin.open( "TestDistribution_Log" );
205 if( fin )
206 {
207 fin.getline( buf, 128 );
208 data = buf;
209
210 _test( data == test_str );
211 fin.close();
212 }
213 else
214 {
215 _test( false );
216 }
217 }
218
219
testPrintAttributes()220 void TestDistribution::testPrintAttributes()
221 {
222 char buf[128];
223
224 Distribution distArg( UniformDistribution( lb, ub ) );
225
226 ofstream fout;
227 ifstream fin;
228
229 string data;
230 string test_str;
231
232 // write the data to a file, then reopen the
233 // file and verify the data was written correctly
234 memset( buf, 0, 128 );
235 #ifdef HAVE_SNPRINTF
236 snprintf( buf, 128, "distribution=\"uniform\" lower=\"%d\" upper=\"%d\"", (int)lb, (int)ub );
237 #else
238 int numberOfCharsRead =
239 sprintf( buf, "distribution=\"uniform\" lower=\"%d\" upper=\"%d\"", (int)lb, (int)ub );
240 assert(numberOfCharsRead <= 128);
241 #endif
242 test_str = buf;
243
244 fout.open( "TestDistribution_Log" );
245 if( fout )
246 {
247 distArg.printAttributes( fout );
248 fout << endl;
249 fout.close();
250 }
251 else
252 {
253 _test( false );
254 }
255
256 fin.open( "TestDistribution_Log" );
257 if( fin )
258 {
259 fin.getline( buf, 128 );
260 data = buf;
261
262 _test( data == test_str );
263 fin.close();
264 }
265 else
266 {
267 _test( false );
268 }
269 }
270
testTypeName()271 void TestDistribution::testTypeName()
272 {
273 Distribution distArg( UniformDistribution( lb, ub ) );
274
275 _test( distArg.typeName() == std::string( "UniformDistribution" ) );
276 }
277