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