]>
Commit | Line | Data |
---|---|---|
416331ca XL |
1 | use super::*; |
2 | ||
3 | extern crate test; | |
dfeec247 | 4 | use self::test::test::Bencher; |
dc9dc135 | 5 | use std::io; |
dfeec247 | 6 | use std::io::prelude::*; |
416331ca XL |
7 | |
8 | // Test vectors generated from R, using the script src/etc/stat-test-vectors.r. | |
dc9dc135 XL |
9 | |
10 | macro_rules! assert_approx_eq { | |
11 | ($a: expr, $b: expr) => {{ | |
12 | let (a, b) = (&$a, &$b); | |
dfeec247 | 13 | assert!((*a - *b).abs() < 1.0e-6, "{} is not approximately equal to {}", *a, *b); |
dc9dc135 XL |
14 | }}; |
15 | } | |
16 | ||
17 | fn check(samples: &[f64], summ: &Summary) { | |
18 | let summ2 = Summary::new(samples); | |
19 | ||
20 | let mut w = io::sink(); | |
21 | let w = &mut w; | |
22 | (write!(w, "\n")).unwrap(); | |
23 | ||
24 | assert_eq!(summ.sum, summ2.sum); | |
25 | assert_eq!(summ.min, summ2.min); | |
26 | assert_eq!(summ.max, summ2.max); | |
27 | assert_eq!(summ.mean, summ2.mean); | |
28 | assert_eq!(summ.median, summ2.median); | |
29 | ||
30 | // We needed a few more digits to get exact equality on these | |
31 | // but they're within float epsilon, which is 1.0e-6. | |
32 | assert_approx_eq!(summ.var, summ2.var); | |
33 | assert_approx_eq!(summ.std_dev, summ2.std_dev); | |
34 | assert_approx_eq!(summ.std_dev_pct, summ2.std_dev_pct); | |
35 | assert_approx_eq!(summ.median_abs_dev, summ2.median_abs_dev); | |
36 | assert_approx_eq!(summ.median_abs_dev_pct, summ2.median_abs_dev_pct); | |
37 | ||
38 | assert_eq!(summ.quartiles, summ2.quartiles); | |
39 | assert_eq!(summ.iqr, summ2.iqr); | |
40 | } | |
41 | ||
42 | #[test] | |
43 | fn test_min_max_nan() { | |
44 | let xs = &[1.0, 2.0, f64::NAN, 3.0, 4.0]; | |
45 | let summary = Summary::new(xs); | |
46 | assert_eq!(summary.min, 1.0); | |
47 | assert_eq!(summary.max, 4.0); | |
48 | } | |
49 | ||
50 | #[test] | |
51 | fn test_norm2() { | |
52 | let val = &[958.0000000000, 924.0000000000]; | |
53 | let summ = &Summary { | |
54 | sum: 1882.0000000000, | |
55 | min: 924.0000000000, | |
56 | max: 958.0000000000, | |
57 | mean: 941.0000000000, | |
58 | median: 941.0000000000, | |
59 | var: 578.0000000000, | |
60 | std_dev: 24.0416305603, | |
61 | std_dev_pct: 2.5549022912, | |
62 | median_abs_dev: 25.2042000000, | |
63 | median_abs_dev_pct: 2.6784484591, | |
64 | quartiles: (932.5000000000, 941.0000000000, 949.5000000000), | |
65 | iqr: 17.0000000000, | |
66 | }; | |
67 | check(val, summ); | |
68 | } | |
69 | #[test] | |
70 | fn test_norm10narrow() { | |
71 | let val = &[ | |
72 | 966.0000000000, | |
73 | 985.0000000000, | |
74 | 1110.0000000000, | |
75 | 848.0000000000, | |
76 | 821.0000000000, | |
77 | 975.0000000000, | |
78 | 962.0000000000, | |
79 | 1157.0000000000, | |
80 | 1217.0000000000, | |
81 | 955.0000000000, | |
82 | ]; | |
83 | let summ = &Summary { | |
84 | sum: 9996.0000000000, | |
85 | min: 821.0000000000, | |
86 | max: 1217.0000000000, | |
87 | mean: 999.6000000000, | |
88 | median: 970.5000000000, | |
89 | var: 16050.7111111111, | |
90 | std_dev: 126.6914010938, | |
91 | std_dev_pct: 12.6742097933, | |
92 | median_abs_dev: 102.2994000000, | |
93 | median_abs_dev_pct: 10.5408964451, | |
94 | quartiles: (956.7500000000, 970.5000000000, 1078.7500000000), | |
95 | iqr: 122.0000000000, | |
96 | }; | |
97 | check(val, summ); | |
98 | } | |
99 | #[test] | |
100 | fn test_norm10medium() { | |
101 | let val = &[ | |
102 | 954.0000000000, | |
103 | 1064.0000000000, | |
104 | 855.0000000000, | |
105 | 1000.0000000000, | |
106 | 743.0000000000, | |
107 | 1084.0000000000, | |
108 | 704.0000000000, | |
109 | 1023.0000000000, | |
110 | 357.0000000000, | |
111 | 869.0000000000, | |
112 | ]; | |
113 | let summ = &Summary { | |
114 | sum: 8653.0000000000, | |
115 | min: 357.0000000000, | |
116 | max: 1084.0000000000, | |
117 | mean: 865.3000000000, | |
118 | median: 911.5000000000, | |
119 | var: 48628.4555555556, | |
120 | std_dev: 220.5186059170, | |
121 | std_dev_pct: 25.4846418487, | |
122 | median_abs_dev: 195.7032000000, | |
123 | median_abs_dev_pct: 21.4704552935, | |
124 | quartiles: (771.0000000000, 911.5000000000, 1017.2500000000), | |
125 | iqr: 246.2500000000, | |
126 | }; | |
127 | check(val, summ); | |
128 | } | |
129 | #[test] | |
130 | fn test_norm10wide() { | |
131 | let val = &[ | |
132 | 505.0000000000, | |
133 | 497.0000000000, | |
134 | 1591.0000000000, | |
135 | 887.0000000000, | |
136 | 1026.0000000000, | |
137 | 136.0000000000, | |
138 | 1580.0000000000, | |
139 | 940.0000000000, | |
140 | 754.0000000000, | |
141 | 1433.0000000000, | |
142 | ]; | |
143 | let summ = &Summary { | |
144 | sum: 9349.0000000000, | |
145 | min: 136.0000000000, | |
146 | max: 1591.0000000000, | |
147 | mean: 934.9000000000, | |
148 | median: 913.5000000000, | |
149 | var: 239208.9888888889, | |
150 | std_dev: 489.0899599142, | |
151 | std_dev_pct: 52.3146817750, | |
152 | median_abs_dev: 611.5725000000, | |
153 | median_abs_dev_pct: 66.9482758621, | |
154 | quartiles: (567.2500000000, 913.5000000000, 1331.2500000000), | |
155 | iqr: 764.0000000000, | |
156 | }; | |
157 | check(val, summ); | |
158 | } | |
159 | #[test] | |
160 | fn test_norm25verynarrow() { | |
161 | let val = &[ | |
162 | 991.0000000000, | |
163 | 1018.0000000000, | |
164 | 998.0000000000, | |
165 | 1013.0000000000, | |
166 | 974.0000000000, | |
167 | 1007.0000000000, | |
168 | 1014.0000000000, | |
169 | 999.0000000000, | |
170 | 1011.0000000000, | |
171 | 978.0000000000, | |
172 | 985.0000000000, | |
173 | 999.0000000000, | |
174 | 983.0000000000, | |
175 | 982.0000000000, | |
176 | 1015.0000000000, | |
177 | 1002.0000000000, | |
178 | 977.0000000000, | |
179 | 948.0000000000, | |
180 | 1040.0000000000, | |
181 | 974.0000000000, | |
182 | 996.0000000000, | |
183 | 989.0000000000, | |
184 | 1015.0000000000, | |
185 | 994.0000000000, | |
186 | 1024.0000000000, | |
187 | ]; | |
188 | let summ = &Summary { | |
189 | sum: 24926.0000000000, | |
190 | min: 948.0000000000, | |
191 | max: 1040.0000000000, | |
192 | mean: 997.0400000000, | |
193 | median: 998.0000000000, | |
194 | var: 393.2066666667, | |
195 | std_dev: 19.8294393937, | |
196 | std_dev_pct: 1.9888308788, | |
197 | median_abs_dev: 22.2390000000, | |
198 | median_abs_dev_pct: 2.2283567134, | |
199 | quartiles: (983.0000000000, 998.0000000000, 1013.0000000000), | |
200 | iqr: 30.0000000000, | |
201 | }; | |
202 | check(val, summ); | |
203 | } | |
204 | #[test] | |
205 | fn test_exp10a() { | |
206 | let val = &[ | |
207 | 23.0000000000, | |
208 | 11.0000000000, | |
209 | 2.0000000000, | |
210 | 57.0000000000, | |
211 | 4.0000000000, | |
212 | 12.0000000000, | |
213 | 5.0000000000, | |
214 | 29.0000000000, | |
215 | 3.0000000000, | |
216 | 21.0000000000, | |
217 | ]; | |
218 | let summ = &Summary { | |
219 | sum: 167.0000000000, | |
220 | min: 2.0000000000, | |
221 | max: 57.0000000000, | |
222 | mean: 16.7000000000, | |
223 | median: 11.5000000000, | |
224 | var: 287.7888888889, | |
225 | std_dev: 16.9643416875, | |
226 | std_dev_pct: 101.5828843560, | |
227 | median_abs_dev: 13.3434000000, | |
228 | median_abs_dev_pct: 116.0295652174, | |
229 | quartiles: (4.2500000000, 11.5000000000, 22.5000000000), | |
230 | iqr: 18.2500000000, | |
231 | }; | |
232 | check(val, summ); | |
233 | } | |
234 | #[test] | |
235 | fn test_exp10b() { | |
236 | let val = &[ | |
237 | 24.0000000000, | |
238 | 17.0000000000, | |
239 | 6.0000000000, | |
240 | 38.0000000000, | |
241 | 25.0000000000, | |
242 | 7.0000000000, | |
243 | 51.0000000000, | |
244 | 2.0000000000, | |
245 | 61.0000000000, | |
246 | 32.0000000000, | |
247 | ]; | |
248 | let summ = &Summary { | |
249 | sum: 263.0000000000, | |
250 | min: 2.0000000000, | |
251 | max: 61.0000000000, | |
252 | mean: 26.3000000000, | |
253 | median: 24.5000000000, | |
254 | var: 383.5666666667, | |
255 | std_dev: 19.5848580967, | |
256 | std_dev_pct: 74.4671410520, | |
257 | median_abs_dev: 22.9803000000, | |
258 | median_abs_dev_pct: 93.7971428571, | |
259 | quartiles: (9.5000000000, 24.5000000000, 36.5000000000), | |
260 | iqr: 27.0000000000, | |
261 | }; | |
262 | check(val, summ); | |
263 | } | |
264 | #[test] | |
265 | fn test_exp10c() { | |
266 | let val = &[ | |
267 | 71.0000000000, | |
268 | 2.0000000000, | |
269 | 32.0000000000, | |
270 | 1.0000000000, | |
271 | 6.0000000000, | |
272 | 28.0000000000, | |
273 | 13.0000000000, | |
274 | 37.0000000000, | |
275 | 16.0000000000, | |
276 | 36.0000000000, | |
277 | ]; | |
278 | let summ = &Summary { | |
279 | sum: 242.0000000000, | |
280 | min: 1.0000000000, | |
281 | max: 71.0000000000, | |
282 | mean: 24.2000000000, | |
283 | median: 22.0000000000, | |
284 | var: 458.1777777778, | |
285 | std_dev: 21.4050876611, | |
286 | std_dev_pct: 88.4507754589, | |
287 | median_abs_dev: 21.4977000000, | |
288 | median_abs_dev_pct: 97.7168181818, | |
289 | quartiles: (7.7500000000, 22.0000000000, 35.0000000000), | |
290 | iqr: 27.2500000000, | |
291 | }; | |
292 | check(val, summ); | |
293 | } | |
294 | #[test] | |
295 | fn test_exp25() { | |
296 | let val = &[ | |
297 | 3.0000000000, | |
298 | 24.0000000000, | |
299 | 1.0000000000, | |
300 | 19.0000000000, | |
301 | 7.0000000000, | |
302 | 5.0000000000, | |
303 | 30.0000000000, | |
304 | 39.0000000000, | |
305 | 31.0000000000, | |
306 | 13.0000000000, | |
307 | 25.0000000000, | |
308 | 48.0000000000, | |
309 | 1.0000000000, | |
310 | 6.0000000000, | |
311 | 42.0000000000, | |
312 | 63.0000000000, | |
313 | 2.0000000000, | |
314 | 12.0000000000, | |
315 | 108.0000000000, | |
316 | 26.0000000000, | |
317 | 1.0000000000, | |
318 | 7.0000000000, | |
319 | 44.0000000000, | |
320 | 25.0000000000, | |
321 | 11.0000000000, | |
322 | ]; | |
323 | let summ = &Summary { | |
324 | sum: 593.0000000000, | |
325 | min: 1.0000000000, | |
326 | max: 108.0000000000, | |
327 | mean: 23.7200000000, | |
328 | median: 19.0000000000, | |
329 | var: 601.0433333333, | |
330 | std_dev: 24.5161851301, | |
331 | std_dev_pct: 103.3565983562, | |
332 | median_abs_dev: 19.2738000000, | |
333 | median_abs_dev_pct: 101.4410526316, | |
334 | quartiles: (6.0000000000, 19.0000000000, 31.0000000000), | |
335 | iqr: 25.0000000000, | |
336 | }; | |
337 | check(val, summ); | |
338 | } | |
339 | #[test] | |
340 | fn test_binom25() { | |
341 | let val = &[ | |
342 | 18.0000000000, | |
343 | 17.0000000000, | |
344 | 27.0000000000, | |
345 | 15.0000000000, | |
346 | 21.0000000000, | |
347 | 25.0000000000, | |
348 | 17.0000000000, | |
349 | 24.0000000000, | |
350 | 25.0000000000, | |
351 | 24.0000000000, | |
352 | 26.0000000000, | |
353 | 26.0000000000, | |
354 | 23.0000000000, | |
355 | 15.0000000000, | |
356 | 23.0000000000, | |
357 | 17.0000000000, | |
358 | 18.0000000000, | |
359 | 18.0000000000, | |
360 | 21.0000000000, | |
361 | 16.0000000000, | |
362 | 15.0000000000, | |
363 | 31.0000000000, | |
364 | 20.0000000000, | |
365 | 17.0000000000, | |
366 | 15.0000000000, | |
367 | ]; | |
368 | let summ = &Summary { | |
369 | sum: 514.0000000000, | |
370 | min: 15.0000000000, | |
371 | max: 31.0000000000, | |
372 | mean: 20.5600000000, | |
373 | median: 20.0000000000, | |
374 | var: 20.8400000000, | |
375 | std_dev: 4.5650848842, | |
376 | std_dev_pct: 22.2037202539, | |
377 | median_abs_dev: 5.9304000000, | |
378 | median_abs_dev_pct: 29.6520000000, | |
379 | quartiles: (17.0000000000, 20.0000000000, 24.0000000000), | |
380 | iqr: 7.0000000000, | |
381 | }; | |
382 | check(val, summ); | |
383 | } | |
384 | #[test] | |
385 | fn test_pois25lambda30() { | |
386 | let val = &[ | |
387 | 27.0000000000, | |
388 | 33.0000000000, | |
389 | 34.0000000000, | |
390 | 34.0000000000, | |
391 | 24.0000000000, | |
392 | 39.0000000000, | |
393 | 28.0000000000, | |
394 | 27.0000000000, | |
395 | 31.0000000000, | |
396 | 28.0000000000, | |
397 | 38.0000000000, | |
398 | 21.0000000000, | |
399 | 33.0000000000, | |
400 | 36.0000000000, | |
401 | 29.0000000000, | |
402 | 37.0000000000, | |
403 | 32.0000000000, | |
404 | 34.0000000000, | |
405 | 31.0000000000, | |
406 | 39.0000000000, | |
407 | 25.0000000000, | |
408 | 31.0000000000, | |
409 | 32.0000000000, | |
410 | 40.0000000000, | |
411 | 24.0000000000, | |
412 | ]; | |
413 | let summ = &Summary { | |
414 | sum: 787.0000000000, | |
415 | min: 21.0000000000, | |
416 | max: 40.0000000000, | |
417 | mean: 31.4800000000, | |
418 | median: 32.0000000000, | |
419 | var: 26.5933333333, | |
420 | std_dev: 5.1568724372, | |
421 | std_dev_pct: 16.3814245145, | |
422 | median_abs_dev: 5.9304000000, | |
423 | median_abs_dev_pct: 18.5325000000, | |
424 | quartiles: (28.0000000000, 32.0000000000, 34.0000000000), | |
425 | iqr: 6.0000000000, | |
426 | }; | |
427 | check(val, summ); | |
428 | } | |
429 | #[test] | |
430 | fn test_pois25lambda40() { | |
431 | let val = &[ | |
432 | 42.0000000000, | |
433 | 50.0000000000, | |
434 | 42.0000000000, | |
435 | 46.0000000000, | |
436 | 34.0000000000, | |
437 | 45.0000000000, | |
438 | 34.0000000000, | |
439 | 49.0000000000, | |
440 | 39.0000000000, | |
441 | 28.0000000000, | |
442 | 40.0000000000, | |
443 | 35.0000000000, | |
444 | 37.0000000000, | |
445 | 39.0000000000, | |
446 | 46.0000000000, | |
447 | 44.0000000000, | |
448 | 32.0000000000, | |
449 | 45.0000000000, | |
450 | 42.0000000000, | |
451 | 37.0000000000, | |
452 | 48.0000000000, | |
453 | 42.0000000000, | |
454 | 33.0000000000, | |
455 | 42.0000000000, | |
456 | 48.0000000000, | |
457 | ]; | |
458 | let summ = &Summary { | |
459 | sum: 1019.0000000000, | |
460 | min: 28.0000000000, | |
461 | max: 50.0000000000, | |
462 | mean: 40.7600000000, | |
463 | median: 42.0000000000, | |
464 | var: 34.4400000000, | |
465 | std_dev: 5.8685603004, | |
466 | std_dev_pct: 14.3978417577, | |
467 | median_abs_dev: 5.9304000000, | |
468 | median_abs_dev_pct: 14.1200000000, | |
469 | quartiles: (37.0000000000, 42.0000000000, 45.0000000000), | |
470 | iqr: 8.0000000000, | |
471 | }; | |
472 | check(val, summ); | |
473 | } | |
474 | #[test] | |
475 | fn test_pois25lambda50() { | |
476 | let val = &[ | |
477 | 45.0000000000, | |
478 | 43.0000000000, | |
479 | 44.0000000000, | |
480 | 61.0000000000, | |
481 | 51.0000000000, | |
482 | 53.0000000000, | |
483 | 59.0000000000, | |
484 | 52.0000000000, | |
485 | 49.0000000000, | |
486 | 51.0000000000, | |
487 | 51.0000000000, | |
488 | 50.0000000000, | |
489 | 49.0000000000, | |
490 | 56.0000000000, | |
491 | 42.0000000000, | |
492 | 52.0000000000, | |
493 | 51.0000000000, | |
494 | 43.0000000000, | |
495 | 48.0000000000, | |
496 | 48.0000000000, | |
497 | 50.0000000000, | |
498 | 42.0000000000, | |
499 | 43.0000000000, | |
500 | 42.0000000000, | |
501 | 60.0000000000, | |
502 | ]; | |
503 | let summ = &Summary { | |
504 | sum: 1235.0000000000, | |
505 | min: 42.0000000000, | |
506 | max: 61.0000000000, | |
507 | mean: 49.4000000000, | |
508 | median: 50.0000000000, | |
509 | var: 31.6666666667, | |
510 | std_dev: 5.6273143387, | |
511 | std_dev_pct: 11.3913245723, | |
512 | median_abs_dev: 4.4478000000, | |
513 | median_abs_dev_pct: 8.8956000000, | |
514 | quartiles: (44.0000000000, 50.0000000000, 52.0000000000), | |
515 | iqr: 8.0000000000, | |
516 | }; | |
517 | check(val, summ); | |
518 | } | |
519 | #[test] | |
520 | fn test_unif25() { | |
521 | let val = &[ | |
522 | 99.0000000000, | |
523 | 55.0000000000, | |
524 | 92.0000000000, | |
525 | 79.0000000000, | |
526 | 14.0000000000, | |
527 | 2.0000000000, | |
528 | 33.0000000000, | |
529 | 49.0000000000, | |
530 | 3.0000000000, | |
531 | 32.0000000000, | |
532 | 84.0000000000, | |
533 | 59.0000000000, | |
534 | 22.0000000000, | |
535 | 86.0000000000, | |
536 | 76.0000000000, | |
537 | 31.0000000000, | |
538 | 29.0000000000, | |
539 | 11.0000000000, | |
540 | 41.0000000000, | |
541 | 53.0000000000, | |
542 | 45.0000000000, | |
543 | 44.0000000000, | |
544 | 98.0000000000, | |
545 | 98.0000000000, | |
546 | 7.0000000000, | |
547 | ]; | |
548 | let summ = &Summary { | |
549 | sum: 1242.0000000000, | |
550 | min: 2.0000000000, | |
551 | max: 99.0000000000, | |
552 | mean: 49.6800000000, | |
553 | median: 45.0000000000, | |
554 | var: 1015.6433333333, | |
555 | std_dev: 31.8691595957, | |
556 | std_dev_pct: 64.1488719719, | |
557 | median_abs_dev: 45.9606000000, | |
558 | median_abs_dev_pct: 102.1346666667, | |
559 | quartiles: (29.0000000000, 45.0000000000, 79.0000000000), | |
560 | iqr: 50.0000000000, | |
561 | }; | |
562 | check(val, summ); | |
563 | } | |
564 | ||
565 | #[test] | |
566 | fn test_sum_f64s() { | |
567 | assert_eq!([0.5f64, 3.2321f64, 1.5678f64].sum(), 5.2999); | |
568 | } | |
569 | #[test] | |
570 | fn test_sum_f64_between_ints_that_sum_to_0() { | |
571 | assert_eq!([1e30f64, 1.2f64, -1e30f64].sum(), 1.2); | |
572 | } | |
416331ca XL |
573 | |
574 | #[bench] | |
575 | pub fn sum_three_items(b: &mut Bencher) { | |
576 | b.iter(|| { | |
577 | [1e20f64, 1.5f64, -1e20f64].sum(); | |
578 | }) | |
579 | } | |
580 | #[bench] | |
581 | pub fn sum_many_f64(b: &mut Bencher) { | |
582 | let nums = [-1e30f64, 1e60, 1e30, 1.0, -1e60]; | |
583 | let v = (0..500).map(|i| nums[i % 5]).collect::<Vec<_>>(); | |
584 | ||
585 | b.iter(|| { | |
586 | v.sum(); | |
587 | }) | |
588 | } | |
589 | ||
590 | #[bench] | |
591 | pub fn no_iter(_: &mut Bencher) {} |