blob: 1b5e5b62de0a1b5f420180bdeabf0016acba308e [file] [log] [blame]
// Copyright ©2020 The Gonum 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 distmat
import (
"testing"
"golang.org/x/exp/rand"
"gonum.org/v1/gonum/floats/scalar"
"gonum.org/v1/gonum/mat"
)
func TestUnitVector(t *testing.T) {
u := NewUnitVector(rand.NewSource(1))
for _, d := range []int{10, 32, 64, 100} {
v := mat.NewVecDense(d, nil)
u.UnitVecTo(v)
l := mat.Norm(v, 2)
if !scalar.EqualWithinAbs(l, 1.0, 1e-12) {
t.Errorf("expected length 1 but got %f", l)
}
}
}
func TestUnitVectorStats(t *testing.T) {
n := 1e7
u := NewUnitVector(rand.NewSource(1))
for _, d := range []int{1, 2, 3} {
v := mat.NewVecDense(d, nil)
tot := mat.NewVecDense(d, nil)
for i := 0; i < int(n); i++ {
u.UnitVecTo(v)
tot.AddVec(tot, v)
}
tot.ScaleVec(1/n, tot)
// Each dimension should average out to 0.
for i := 0; i < d; i++ {
if !scalar.EqualWithinAbs(tot.AtVec(i), 0.0, 1e-3) {
t.Errorf("expected average entry 0 but got %f", tot.AtVec(i))
}
}
l := mat.Norm(tot, 2)
// And the length should be 0.
if !scalar.EqualWithinAbs(l, 0.0, 1e-3) {
t.Errorf("expected length 0 but got %f", l)
}
}
}