blob: 206e2a8cfc02388ff8d26d74eda470d362d9bbbb [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/mat"
)
func TestUniformPermutation(t *testing.T) {
up := NewUniformPermutation(rand.NewSource(1))
for _, n := range []int{10, 32, 64, 100} {
m := mat.NewDense(n, n, nil)
up.PermTo(m)
// Test that each row and column satisfies the permutation matrix
// invariant that all rows and columns have a single unit element
// and the remaining elements are zero.
for i := 0; i < n; i++ {
checkHasSingleUnitElement(t, "row", i, mat.Row(nil, i, m))
checkHasSingleUnitElement(t, "col", i, mat.Col(nil, i, m))
}
}
}
func checkHasSingleUnitElement(t *testing.T, dir string, n int, v []float64) {
t.Helper()
var sum float64
for i, x := range v {
switch x {
case 0, 1:
sum += x
default:
t.Errorf("unexpected value in %s %d position %d: %v", dir, n, i, v)
}
}
if sum != 1 {
t.Errorf("%s %d is not a valid vector: %v", dir, n, v)
}
}