]> git.lizzy.rs Git - rust.git/blob - library/test/src/stats/tests.rs
Merge commit '4a053f206fd6799a25823c307f7d7f9d897be118' into sync-rustfmt-subtree
[rust.git] / library / test / src / stats / tests.rs
1 use super::*;
2
3 extern crate test;
4 use self::test::test::Bencher;
5 use std::io;
6 use std::io::prelude::*;
7
8 // Test vectors generated from R, using the script src/etc/stat-test-vectors.r.
9
10 macro_rules! assert_approx_eq {
11     ($a: expr, $b: expr) => {{
12         let (a, b) = (&$a, &$b);
13         assert!((*a - *b).abs() < 1.0e-6, "{} is not approximately equal to {}", *a, *b);
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 }
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) {}