1// Copyright ©2014 The Gonum Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// a set of benchmarks to evaluate the performance of the various
6// moment statistics: Mean, Variance, StdDev, MeanVariance, MeanStdDev,
7// Covariance, Correlation, Skew, ExKurtosis, Moment, MomentAbout, ...
8//
9// It tests both weighted and unweighted versions by using a slice of
10// all ones.
11
12package stat
13
14import (
15	"testing"
16
17	"golang.org/x/exp/rand"
18)
19
20const (
21	small  = 10
22	medium = 1000
23	large  = 100000
24	huge   = 10000000
25)
26
27// tests for unweighted versions
28
29func RandomSlice(l int) []float64 {
30	s := make([]float64, l)
31	for i := range s {
32		s[i] = rand.Float64()
33	}
34	return s
35}
36
37func benchmarkMean(b *testing.B, s, wts []float64) {
38	b.ResetTimer()
39	for i := 0; i < b.N; i++ {
40		Mean(s, wts)
41	}
42}
43
44func BenchmarkMeanSmall(b *testing.B) {
45	s := RandomSlice(small)
46	benchmarkMean(b, s, nil)
47}
48
49func BenchmarkMeanMedium(b *testing.B) {
50	s := RandomSlice(medium)
51	benchmarkMean(b, s, nil)
52}
53
54func BenchmarkMeanLarge(b *testing.B) {
55	s := RandomSlice(large)
56	benchmarkMean(b, s, nil)
57}
58
59func BenchmarkMeanHuge(b *testing.B) {
60	s := RandomSlice(huge)
61	benchmarkMean(b, s, nil)
62}
63
64func BenchmarkMeanSmallWeighted(b *testing.B) {
65	s := RandomSlice(small)
66	wts := RandomSlice(small)
67	benchmarkMean(b, s, wts)
68}
69
70func BenchmarkMeanMediumWeighted(b *testing.B) {
71	s := RandomSlice(medium)
72	wts := RandomSlice(medium)
73	benchmarkMean(b, s, wts)
74}
75
76func BenchmarkMeanLargeWeighted(b *testing.B) {
77	s := RandomSlice(large)
78	wts := RandomSlice(large)
79	benchmarkMean(b, s, wts)
80}
81
82func BenchmarkMeanHugeWeighted(b *testing.B) {
83	s := RandomSlice(huge)
84	wts := RandomSlice(huge)
85	benchmarkMean(b, s, wts)
86}
87
88func benchmarkVariance(b *testing.B, s, wts []float64) {
89	b.ResetTimer()
90	for i := 0; i < b.N; i++ {
91		Variance(s, wts)
92	}
93}
94
95func BenchmarkVarianceSmall(b *testing.B) {
96	s := RandomSlice(small)
97	benchmarkVariance(b, s, nil)
98}
99
100func BenchmarkVarianceMedium(b *testing.B) {
101	s := RandomSlice(medium)
102	benchmarkVariance(b, s, nil)
103}
104
105func BenchmarkVarianceLarge(b *testing.B) {
106	s := RandomSlice(large)
107	benchmarkVariance(b, s, nil)
108}
109
110func BenchmarkVarianceHuge(b *testing.B) {
111	s := RandomSlice(huge)
112	benchmarkVariance(b, s, nil)
113}
114
115func BenchmarkVarianceSmallWeighted(b *testing.B) {
116	s := RandomSlice(small)
117	wts := RandomSlice(small)
118	benchmarkVariance(b, s, wts)
119}
120
121func BenchmarkVarianceMediumWeighted(b *testing.B) {
122	s := RandomSlice(medium)
123	wts := RandomSlice(medium)
124	benchmarkVariance(b, s, wts)
125}
126
127func BenchmarkVarianceLargeWeighted(b *testing.B) {
128	s := RandomSlice(large)
129	wts := RandomSlice(large)
130	benchmarkVariance(b, s, wts)
131}
132
133func BenchmarkVarianceHugeWeighted(b *testing.B) {
134	s := RandomSlice(huge)
135	wts := RandomSlice(huge)
136	benchmarkVariance(b, s, wts)
137}
138
139func benchmarkStdDev(b *testing.B, s, wts []float64) {
140	b.ResetTimer()
141	for i := 0; i < b.N; i++ {
142		StdDev(s, wts)
143	}
144}
145
146func BenchmarkStdDevSmall(b *testing.B) {
147	s := RandomSlice(small)
148	benchmarkStdDev(b, s, nil)
149}
150
151func BenchmarkStdDevMedium(b *testing.B) {
152	s := RandomSlice(medium)
153	benchmarkStdDev(b, s, nil)
154}
155
156func BenchmarkStdDevLarge(b *testing.B) {
157	s := RandomSlice(large)
158	benchmarkStdDev(b, s, nil)
159}
160
161func BenchmarkStdDevHuge(b *testing.B) {
162	s := RandomSlice(huge)
163	benchmarkStdDev(b, s, nil)
164}
165
166func BenchmarkStdDevSmallWeighted(b *testing.B) {
167	s := RandomSlice(small)
168	wts := RandomSlice(small)
169	benchmarkStdDev(b, s, wts)
170}
171
172func BenchmarkStdDevMediumWeighted(b *testing.B) {
173	s := RandomSlice(medium)
174	wts := RandomSlice(medium)
175	benchmarkStdDev(b, s, wts)
176}
177
178func BenchmarkStdDevLargeWeighted(b *testing.B) {
179	s := RandomSlice(large)
180	wts := RandomSlice(large)
181	benchmarkStdDev(b, s, wts)
182}
183
184func BenchmarkStdDevHugeWeighted(b *testing.B) {
185	s := RandomSlice(huge)
186	wts := RandomSlice(huge)
187	benchmarkStdDev(b, s, wts)
188}
189
190func benchmarkMeanVariance(b *testing.B, s, wts []float64) {
191	b.ResetTimer()
192	for i := 0; i < b.N; i++ {
193		MeanVariance(s, wts)
194	}
195}
196
197func BenchmarkMeanVarianceSmall(b *testing.B) {
198	s := RandomSlice(small)
199	benchmarkMeanVariance(b, s, nil)
200}
201
202func BenchmarkMeanVarianceMedium(b *testing.B) {
203	s := RandomSlice(medium)
204	benchmarkMeanVariance(b, s, nil)
205}
206
207func BenchmarkMeanVarianceLarge(b *testing.B) {
208	s := RandomSlice(large)
209	benchmarkMeanVariance(b, s, nil)
210}
211
212func BenchmarkMeanVarianceHuge(b *testing.B) {
213	s := RandomSlice(huge)
214	benchmarkMeanVariance(b, s, nil)
215}
216
217func BenchmarkMeanVarianceSmallWeighted(b *testing.B) {
218	s := RandomSlice(small)
219	wts := RandomSlice(small)
220	benchmarkMeanVariance(b, s, wts)
221}
222
223func BenchmarkMeanVarianceMediumWeighted(b *testing.B) {
224	s := RandomSlice(medium)
225	wts := RandomSlice(medium)
226	benchmarkMeanVariance(b, s, wts)
227}
228
229func BenchmarkMeanVarianceLargeWeighted(b *testing.B) {
230	s := RandomSlice(large)
231	wts := RandomSlice(large)
232	benchmarkMeanVariance(b, s, wts)
233}
234
235func BenchmarkMeanVarianceHugeWeighted(b *testing.B) {
236	s := RandomSlice(huge)
237	wts := RandomSlice(huge)
238	benchmarkMeanVariance(b, s, wts)
239}
240
241func benchmarkMeanStdDev(b *testing.B, s, wts []float64) {
242	b.ResetTimer()
243	for i := 0; i < b.N; i++ {
244		MeanStdDev(s, wts)
245	}
246}
247
248func BenchmarkMeanStdDevSmall(b *testing.B) {
249	s := RandomSlice(small)
250	benchmarkMeanStdDev(b, s, nil)
251}
252
253func BenchmarkMeanStdDevMedium(b *testing.B) {
254	s := RandomSlice(medium)
255	benchmarkMeanStdDev(b, s, nil)
256}
257
258func BenchmarkMeanStdDevLarge(b *testing.B) {
259	s := RandomSlice(large)
260	benchmarkMeanStdDev(b, s, nil)
261}
262
263func BenchmarkMeanStdDevHuge(b *testing.B) {
264	s := RandomSlice(huge)
265	benchmarkMeanStdDev(b, s, nil)
266}
267
268func BenchmarkMeanStdDevSmallWeighted(b *testing.B) {
269	s := RandomSlice(small)
270	wts := RandomSlice(small)
271	benchmarkMeanStdDev(b, s, wts)
272}
273
274func BenchmarkMeanStdDevMediumWeighted(b *testing.B) {
275	s := RandomSlice(medium)
276	wts := RandomSlice(medium)
277	benchmarkMeanStdDev(b, s, wts)
278}
279
280func BenchmarkMeanStdDevLargeWeighted(b *testing.B) {
281	s := RandomSlice(large)
282	wts := RandomSlice(large)
283	benchmarkMeanStdDev(b, s, wts)
284}
285
286func BenchmarkMeanStdDevHugeWeighted(b *testing.B) {
287	s := RandomSlice(huge)
288	wts := RandomSlice(huge)
289	benchmarkMeanStdDev(b, s, wts)
290}
291
292func benchmarkCovariance(b *testing.B, s1, s2, wts []float64) {
293	b.ResetTimer()
294	for i := 0; i < b.N; i++ {
295		Covariance(s1, s2, wts)
296	}
297}
298
299func BenchmarkCovarianceSmall(b *testing.B) {
300	s1 := RandomSlice(small)
301	s2 := RandomSlice(small)
302	benchmarkCovariance(b, s1, s2, nil)
303}
304
305func BenchmarkCovarianceMedium(b *testing.B) {
306	s1 := RandomSlice(medium)
307	s2 := RandomSlice(medium)
308	benchmarkCovariance(b, s1, s2, nil)
309}
310
311func BenchmarkCovarianceLarge(b *testing.B) {
312	s1 := RandomSlice(large)
313	s2 := RandomSlice(large)
314	benchmarkCovariance(b, s1, s2, nil)
315}
316
317func BenchmarkCovarianceHuge(b *testing.B) {
318	s1 := RandomSlice(huge)
319	s2 := RandomSlice(huge)
320	benchmarkCovariance(b, s1, s2, nil)
321}
322
323func BenchmarkCovarianceSmallWeighted(b *testing.B) {
324	s1 := RandomSlice(small)
325	s2 := RandomSlice(small)
326	wts := RandomSlice(small)
327	benchmarkCovariance(b, s1, s2, wts)
328}
329
330func BenchmarkCovarianceMediumWeighted(b *testing.B) {
331	s1 := RandomSlice(medium)
332	s2 := RandomSlice(medium)
333	wts := RandomSlice(medium)
334	benchmarkCovariance(b, s1, s2, wts)
335}
336
337func BenchmarkCovarianceLargeWeighted(b *testing.B) {
338	s1 := RandomSlice(large)
339	s2 := RandomSlice(large)
340	wts := RandomSlice(large)
341	benchmarkCovariance(b, s1, s2, wts)
342}
343
344func BenchmarkCovarianceHugeWeighted(b *testing.B) {
345	s1 := RandomSlice(huge)
346	s2 := RandomSlice(huge)
347	wts := RandomSlice(huge)
348	benchmarkCovariance(b, s1, s2, wts)
349}
350
351func benchmarkCorrelation(b *testing.B, s1, s2, wts []float64) {
352	b.ResetTimer()
353	for i := 0; i < b.N; i++ {
354		Correlation(s1, s2, wts)
355	}
356}
357
358func BenchmarkCorrelationSmall(b *testing.B) {
359	s1 := RandomSlice(small)
360	s2 := RandomSlice(small)
361	benchmarkCorrelation(b, s1, s2, nil)
362}
363
364func BenchmarkCorrelationMedium(b *testing.B) {
365	s1 := RandomSlice(medium)
366	s2 := RandomSlice(medium)
367	benchmarkCorrelation(b, s1, s2, nil)
368}
369
370func BenchmarkCorrelationLarge(b *testing.B) {
371	s1 := RandomSlice(large)
372	s2 := RandomSlice(large)
373	benchmarkCorrelation(b, s1, s2, nil)
374}
375
376func BenchmarkCorrelationHuge(b *testing.B) {
377	s1 := RandomSlice(huge)
378	s2 := RandomSlice(huge)
379	benchmarkCorrelation(b, s1, s2, nil)
380}
381
382func BenchmarkCorrelationSmallWeighted(b *testing.B) {
383	s1 := RandomSlice(small)
384	s2 := RandomSlice(small)
385	wts := RandomSlice(small)
386	benchmarkCorrelation(b, s1, s2, wts)
387}
388
389func BenchmarkCorrelationMediumWeighted(b *testing.B) {
390	s1 := RandomSlice(medium)
391	s2 := RandomSlice(medium)
392	wts := RandomSlice(medium)
393	benchmarkCorrelation(b, s1, s2, wts)
394}
395
396func BenchmarkCorrelationLargeWeighted(b *testing.B) {
397	s1 := RandomSlice(large)
398	s2 := RandomSlice(large)
399	wts := RandomSlice(large)
400	benchmarkCorrelation(b, s1, s2, wts)
401}
402
403func BenchmarkCorrelationHugeWeighted(b *testing.B) {
404	s1 := RandomSlice(huge)
405	s2 := RandomSlice(huge)
406	wts := RandomSlice(huge)
407	benchmarkCorrelation(b, s1, s2, wts)
408}
409
410func benchmarkSkew(b *testing.B, s, wts []float64) {
411	b.ResetTimer()
412	for i := 0; i < b.N; i++ {
413		Skew(s, wts)
414	}
415}
416
417func BenchmarkSkewSmall(b *testing.B) {
418	s := RandomSlice(small)
419	benchmarkSkew(b, s, nil)
420}
421
422func BenchmarkSkewMedium(b *testing.B) {
423	s := RandomSlice(medium)
424	benchmarkSkew(b, s, nil)
425}
426
427func BenchmarkSkewLarge(b *testing.B) {
428	s := RandomSlice(large)
429	benchmarkSkew(b, s, nil)
430}
431
432func BenchmarkSkewHuge(b *testing.B) {
433	s := RandomSlice(huge)
434	benchmarkSkew(b, s, nil)
435}
436
437func BenchmarkSkewSmallWeighted(b *testing.B) {
438	s := RandomSlice(small)
439	wts := RandomSlice(small)
440	benchmarkSkew(b, s, wts)
441}
442
443func BenchmarkSkewMediumWeighted(b *testing.B) {
444	s := RandomSlice(medium)
445	wts := RandomSlice(medium)
446	benchmarkSkew(b, s, wts)
447}
448
449func BenchmarkSkewLargeWeighted(b *testing.B) {
450	s := RandomSlice(large)
451	wts := RandomSlice(large)
452	benchmarkSkew(b, s, wts)
453}
454
455func BenchmarkSkewHugeWeighted(b *testing.B) {
456	s := RandomSlice(huge)
457	wts := RandomSlice(huge)
458	benchmarkSkew(b, s, wts)
459}
460
461func benchmarkExKurtosis(b *testing.B, s, wts []float64) {
462	b.ResetTimer()
463	for i := 0; i < b.N; i++ {
464		ExKurtosis(s, wts)
465	}
466}
467
468func BenchmarkExKurtosisSmall(b *testing.B) {
469	s := RandomSlice(small)
470	benchmarkExKurtosis(b, s, nil)
471}
472
473func BenchmarkExKurtosisMedium(b *testing.B) {
474	s := RandomSlice(medium)
475	benchmarkExKurtosis(b, s, nil)
476}
477
478func BenchmarkExKurtosisLarge(b *testing.B) {
479	s := RandomSlice(large)
480	benchmarkExKurtosis(b, s, nil)
481}
482
483func BenchmarkExKurtosisHuge(b *testing.B) {
484	s := RandomSlice(huge)
485	benchmarkExKurtosis(b, s, nil)
486}
487
488func BenchmarkExKurtosisSmallWeighted(b *testing.B) {
489	s := RandomSlice(small)
490	wts := RandomSlice(small)
491	benchmarkExKurtosis(b, s, wts)
492}
493
494func BenchmarkExKurtosisMediumWeighted(b *testing.B) {
495	s := RandomSlice(medium)
496	wts := RandomSlice(medium)
497	benchmarkExKurtosis(b, s, wts)
498}
499
500func BenchmarkExKurtosisLargeWeighted(b *testing.B) {
501	s := RandomSlice(large)
502	wts := RandomSlice(large)
503	benchmarkExKurtosis(b, s, wts)
504}
505
506func BenchmarkExKurtosisHugeWeighted(b *testing.B) {
507	s := RandomSlice(huge)
508	wts := RandomSlice(huge)
509	benchmarkExKurtosis(b, s, wts)
510}
511
512func benchmarkMoment(b *testing.B, n float64, s, wts []float64) {
513	b.ResetTimer()
514	for i := 0; i < b.N; i++ {
515		Moment(n, s, wts)
516	}
517}
518
519func BenchmarkMomentSmall(b *testing.B) {
520	s := RandomSlice(small)
521	benchmarkMoment(b, 5, s, nil)
522}
523
524func BenchmarkMomentMedium(b *testing.B) {
525	s := RandomSlice(medium)
526	benchmarkMoment(b, 5, s, nil)
527}
528
529func BenchmarkMomentLarge(b *testing.B) {
530	s := RandomSlice(large)
531	benchmarkMoment(b, 5, s, nil)
532}
533
534func BenchmarkMomentHuge(b *testing.B) {
535	s := RandomSlice(huge)
536	benchmarkMoment(b, 5, s, nil)
537}
538
539func BenchmarkMomentSmallWeighted(b *testing.B) {
540	s := RandomSlice(small)
541	wts := RandomSlice(small)
542	benchmarkMoment(b, 5, s, wts)
543}
544
545func BenchmarkMomentMediumWeighted(b *testing.B) {
546	s := RandomSlice(medium)
547	wts := RandomSlice(medium)
548	benchmarkMoment(b, 5, s, wts)
549}
550
551func BenchmarkMomentLargeWeighted(b *testing.B) {
552	s := RandomSlice(large)
553	wts := RandomSlice(large)
554	benchmarkMoment(b, 5, s, wts)
555}
556
557func BenchmarkMomentHugeWeighted(b *testing.B) {
558	s := RandomSlice(huge)
559	wts := RandomSlice(huge)
560	benchmarkMoment(b, 5, s, wts)
561}
562
563func benchmarkMomentAbout(b *testing.B, n float64, s []float64, mean float64, wts []float64) {
564	b.ResetTimer()
565	for i := 0; i < b.N; i++ {
566		MomentAbout(n, s, mean, wts)
567	}
568}
569
570func BenchmarkMomentAboutSmall(b *testing.B) {
571	s := RandomSlice(small)
572	benchmarkMomentAbout(b, 5, s, 0, nil)
573}
574
575func BenchmarkMomentAboutMedium(b *testing.B) {
576	s := RandomSlice(medium)
577	benchmarkMomentAbout(b, 5, s, 0, nil)
578}
579
580func BenchmarkMomentAboutLarge(b *testing.B) {
581	s := RandomSlice(large)
582	benchmarkMomentAbout(b, 5, s, 0, nil)
583}
584
585func BenchmarkMomentAboutHuge(b *testing.B) {
586	s := RandomSlice(huge)
587	benchmarkMomentAbout(b, 5, s, 0, nil)
588}
589
590func BenchmarkMomentAboutSmallWeighted(b *testing.B) {
591	s := RandomSlice(small)
592	wts := RandomSlice(small)
593	benchmarkMomentAbout(b, 5, s, 0, wts)
594}
595
596func BenchmarkMomentAboutMediumWeighted(b *testing.B) {
597	s := RandomSlice(medium)
598	wts := RandomSlice(medium)
599	benchmarkMomentAbout(b, 5, s, 0, wts)
600}
601
602func BenchmarkMomentAboutLargeWeighted(b *testing.B) {
603	s := RandomSlice(large)
604	wts := RandomSlice(large)
605	benchmarkMomentAbout(b, 5, s, 0, wts)
606}
607
608func BenchmarkMomentAboutHugeWeighted(b *testing.B) {
609	s := RandomSlice(huge)
610	wts := RandomSlice(huge)
611	benchmarkMomentAbout(b, 5, s, 0, wts)
612}
613