gonum.org/v1/gonum@v0.14.0/stat/distuv/uniform_test.go (about)

     1  // Copyright ©2017 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  package distuv
     6  
     7  import (
     8  	"math"
     9  	"sort"
    10  	"testing"
    11  
    12  	"golang.org/x/exp/rand"
    13  
    14  	"gonum.org/v1/gonum/floats/scalar"
    15  )
    16  
    17  func TestUniformProb(t *testing.T) {
    18  	t.Parallel()
    19  	for _, test := range []struct {
    20  		min, max, x, want float64
    21  	}{
    22  		{0, 1, 1, 1},
    23  		{2, 4, 0, 0},
    24  		{2, 4, 5, 0},
    25  		{2, 4, 3, 0.5},
    26  		{0, 100, 1, 0.01},
    27  		{-1, 1, -1.5, 0},
    28  		{-1, 1, 1.5, 0},
    29  	} {
    30  		u := Uniform{test.min, test.max, nil}
    31  		pdf := u.Prob(test.x)
    32  		if !scalar.EqualWithinAbsOrRel(pdf, test.want, 1e-15, 1e-15) {
    33  			t.Errorf("PDF mismatch, x = %v, min = %v, max = %v. Got %v, want %v", test.x, test.min, test.max, pdf, test.want)
    34  		}
    35  		logWant := math.Log(test.want)
    36  		logPdf := u.LogProb(test.x)
    37  		if !scalar.EqualWithinAbsOrRel(logPdf, logWant, 1e-15, 1e-15) {
    38  			t.Errorf("Log PDF mismatch, x = %v, min = %v, max = %v. Got %v, want %v", test.x, test.min, test.max, logPdf, logWant)
    39  		}
    40  	}
    41  }
    42  
    43  func TestUniformCDFSurvival(t *testing.T) {
    44  	t.Parallel()
    45  	for _, test := range []struct {
    46  		min, max, x, want float64
    47  	}{
    48  		{0, 1, 1, 1},
    49  		{0, 100, 100, 1},
    50  		{0, 100, 0, 0},
    51  		{0, 100, 50, 0.5},
    52  		{0, 50, 10, 0.2},
    53  		{-1, 1, -1.5, 0},
    54  		{-1, 1, 1.5, 1},
    55  	} {
    56  		u := Uniform{test.min, test.max, nil}
    57  		cdf := u.CDF(test.x)
    58  		if !scalar.EqualWithinAbsOrRel(cdf, test.want, 1e-15, 1e-15) {
    59  			t.Errorf("CDF mismatch, x = %v, min = %v, max = %v. Got %v, want %v", test.x, test.min, test.max, cdf, test.want)
    60  		}
    61  		survival := u.Survival(test.x)
    62  		if !scalar.EqualWithinAbsOrRel(survival, 1-test.want, 1e-15, 1e-15) {
    63  			t.Errorf("CDF mismatch, x = %v, min = %v, max = %v. Got %v, want %v", test.x, test.min, test.max, survival, 1-test.want)
    64  		}
    65  	}
    66  }
    67  
    68  func TestUniform(t *testing.T) {
    69  	t.Parallel()
    70  	src := rand.New(rand.NewSource(1))
    71  	for i, b := range []Uniform{
    72  		{1, 2, src},
    73  		{0, 100, src},
    74  		{50, 60, src},
    75  	} {
    76  		testUniform(t, b, i)
    77  	}
    78  }
    79  
    80  func testUniform(t *testing.T, u Uniform, i int) {
    81  	const (
    82  		tol  = 1e-2
    83  		n    = 1e5
    84  		bins = 50
    85  	)
    86  	x := make([]float64, n)
    87  	generateSamples(x, u)
    88  	sort.Float64s(x)
    89  
    90  	testRandLogProbContinuous(t, i, 0, x, u, tol, bins)
    91  	checkMean(t, i, x, u, tol)
    92  	checkVarAndStd(t, i, x, u, tol)
    93  	checkExKurtosis(t, i, x, u, 7e-2)
    94  	checkProbContinuous(t, i, x, u.Min, u.Max, u, 1e-10)
    95  	checkQuantileCDFSurvival(t, i, x, u, 1e-2)
    96  	checkEntropy(t, i, x, u, tol)
    97  	checkSkewness(t, i, x, u, tol)
    98  	checkMedian(t, i, x, u, tol)
    99  	testDerivParam(t, &u)
   100  }
   101  
   102  func TestUniformScore(t *testing.T) {
   103  	t.Parallel()
   104  	u := Uniform{0, 1, nil}
   105  	for _, test := range []struct {
   106  		x, wantMin, wantMax float64
   107  	}{
   108  		{-0.001, math.NaN(), math.NaN()},
   109  		{0, math.NaN(), -1},
   110  		{1, 1, math.NaN()},
   111  		{1.001, math.NaN(), math.NaN()},
   112  	} {
   113  		score := u.Score(nil, test.x)
   114  		if !scalar.Same(score[0], test.wantMin) {
   115  			t.Errorf("Score[0] mismatch for at %g: got %v, want %g", test.x, score[0], test.wantMin)
   116  		}
   117  		if !scalar.Same(score[1], test.wantMax) {
   118  			t.Errorf("Score[1] mismatch for at %g: got %v, want %g", test.x, score[1], test.wantMax)
   119  		}
   120  	}
   121  }
   122  
   123  func TestUniformScoreInput(t *testing.T) {
   124  	t.Parallel()
   125  	u := Uniform{0, 1, nil}
   126  	scoreInput := u.ScoreInput(0.5)
   127  	if scoreInput != 0 {
   128  		t.Errorf("Mismatch in input score for U(0, 1) at x == 0.5: got %v, want 0", scoreInput)
   129  	}
   130  	xs := []float64{-0.0001, 0, 1, 1.0001}
   131  	for _, x := range xs {
   132  		scoreInput = u.ScoreInput(x)
   133  		if !math.IsNaN(scoreInput) {
   134  			t.Errorf("Expected NaN score input for U(0, 1) at x == %g, got %v", x, scoreInput)
   135  		}
   136  	}
   137  }