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