| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package benchmath |
| |
| import "github.com/aclements/go-moremath/stats" |
| |
| // AssumeNormal is an assumption that a sample is normally distributed. |
| // The summary statistic is the sample mean and comparisons are done |
| // using the two-sample t-test. |
| var AssumeNormal = assumeNormal{} |
| |
| type assumeNormal struct{} |
| |
| var _ Assumption = assumeNormal{} |
| |
| func (assumeNormal) SummaryLabel() string { |
| return "mean" |
| } |
| |
| func (assumeNormal) Summary(s *Sample, confidence float64) Summary { |
| // TODO: Perform a normality test. |
| |
| sample := s.sample() |
| mean, lo, hi := sample.MeanCI(confidence) |
| |
| return Summary{ |
| Center: mean, |
| Lo: lo, |
| Hi: hi, |
| Confidence: confidence, |
| } |
| } |
| |
| func (assumeNormal) Compare(s1, s2 *Sample) Comparison { |
| t, err := stats.TwoSampleWelchTTest(s1.sample(), s2.sample(), stats.LocationDiffers) |
| if err != nil { |
| // The t-test failed. Report as if there's no |
| // significant difference, along with the error. |
| return Comparison{P: 1, N1: len(s1.Values), N2: len(s2.Values), Warnings: []error{err}} |
| } |
| return Comparison{P: t.P, N1: len(s1.Values), N2: len(s2.Values)} |
| } |