mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 07:06:54 +08:00
all: replace internal rand shim with math/rand/v2
This commit is contained in:
@@ -5,13 +5,12 @@
|
|||||||
package gonum
|
package gonum
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func benchmarkZdscal(b *testing.B, n, inc int) {
|
func benchmarkZdscal(b *testing.B, n, inc int) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
alpha := rnd.NormFloat64()
|
alpha := rnd.NormFloat64()
|
||||||
x := make([]complex128, (n-1)*inc+1)
|
x := make([]complex128, (n-1)*inc+1)
|
||||||
for i := range x {
|
for i := range x {
|
||||||
|
@@ -7,10 +7,10 @@
|
|||||||
package gonum
|
package gonum
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@@ -6,10 +6,10 @@ package gonum
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var benchSinkZ []complex128
|
var benchSinkZ []complex128
|
||||||
@@ -26,7 +26,7 @@ func BenchmarkZher(b *testing.B) {
|
|||||||
|
|
||||||
func benchmarkZher(b *testing.B, uplo blas.Uplo, n, inc int) {
|
func benchmarkZher(b *testing.B, uplo blas.Uplo, n, inc int) {
|
||||||
b.Run(fmt.Sprintf("Uplo%d-N%d-Inc%d", uplo, n, inc), func(b *testing.B) {
|
b.Run(fmt.Sprintf("Uplo%d-N%d-Inc%d", uplo, n, inc), func(b *testing.B) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
alpha := rnd.NormFloat64()
|
alpha := rnd.NormFloat64()
|
||||||
x := make([]complex128, (n-1)*inc+1)
|
x := make([]complex128, (n-1)*inc+1)
|
||||||
for i := range x {
|
for i := range x {
|
||||||
|
@@ -5,15 +5,15 @@
|
|||||||
package gonum
|
package gonum
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDgemmParallel(t *testing.T) {
|
func TestDgemmParallel(t *testing.T) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for i, test := range []struct {
|
for i, test := range []struct {
|
||||||
m int
|
m int
|
||||||
n int
|
n int
|
||||||
|
@@ -22,10 +22,10 @@ var copyrightnotice = []byte(`// Copyright ©2014 The Gonum Authors. All rights
|
|||||||
var autogen = []byte("// Code generated by \"go run $GOPATH/src/gonum.org/v1/gonum/blas/testblas/benchautogen/autogen_bench_level1double.go\"; DO NOT EDIT.\n")
|
var autogen = []byte("// Code generated by \"go run $GOPATH/src/gonum.org/v1/gonum/blas/testblas/benchautogen/autogen_bench_level1double.go\"; DO NOT EDIT.\n")
|
||||||
|
|
||||||
var imports = []byte(`import(
|
var imports = []byte(`import(
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)`)
|
)`)
|
||||||
|
|
||||||
var randomSliceFunction = []byte(`func randomSlice(l, idx int) ([]float64) {
|
var randomSliceFunction = []byte(`func randomSlice(l, idx int) ([]float64) {
|
||||||
|
@@ -7,11 +7,11 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/floats/scalar"
|
"gonum.org/v1/gonum/floats/scalar"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// throwPanic will throw unexpected panics if true, or will just report them as errors if false
|
// throwPanic will throw unexpected panics if true, or will just report them as errors if false
|
||||||
|
@@ -7,11 +7,11 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestFlattenBanded(t *testing.T) {
|
func TestFlattenBanded(t *testing.T) {
|
||||||
@@ -193,7 +193,7 @@ func TestFlattenTriangular(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPackUnpackAsHermitian(t *testing.T) {
|
func TestPackUnpackAsHermitian(t *testing.T) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
||||||
for _, n := range []int{1, 2, 5, 50} {
|
for _, n := range []int{1, 2, 5, 50} {
|
||||||
for _, lda := range []int{max(1, n), n + 11} {
|
for _, lda := range []int{max(1, n), n + 11} {
|
||||||
|
@@ -5,10 +5,10 @@
|
|||||||
package testblas
|
package testblas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func DgemmBenchmark(b *testing.B, dgemm Dgemmer, m, n, k int, tA, tB blas.Transpose) {
|
func DgemmBenchmark(b *testing.B, dgemm Dgemmer, m, n, k int, tA, tB blas.Transpose) {
|
||||||
|
@@ -5,14 +5,14 @@
|
|||||||
package testblas
|
package testblas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func DtrmvBenchmark(b *testing.B, dtrmv Dtrmver, n, lda, incX int, ul blas.Uplo, tA blas.Transpose, d blas.Diag) {
|
func DtrmvBenchmark(b *testing.B, dtrmv Dtrmver, n, lda, incX int, ul blas.Uplo, tA blas.Transpose, d blas.Diag) {
|
||||||
rnd := rand.New(rand.NewSource(0))
|
rnd := rand.New(rand.NewPCG(0, 0))
|
||||||
a := make([]float64, n*lda)
|
a := make([]float64, n*lda)
|
||||||
for i := range a {
|
for i := range a {
|
||||||
a[i] = rnd.Float64()
|
a[i] = rnd.Float64()
|
||||||
|
@@ -5,11 +5,11 @@
|
|||||||
package testblas
|
package testblas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dtrsmer interface {
|
type Dtrsmer interface {
|
||||||
@@ -18,7 +18,7 @@ type Dtrsmer interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DtrsmTest(t *testing.T, impl Dtrsmer) {
|
func DtrsmTest(t *testing.T, impl Dtrsmer) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for i, test := range []struct {
|
for i, test := range []struct {
|
||||||
s blas.Side
|
s blas.Side
|
||||||
ul blas.Uplo
|
ul blas.Uplo
|
||||||
|
@@ -5,10 +5,10 @@
|
|||||||
package testblas
|
package testblas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats/scalar"
|
"gonum.org/v1/gonum/floats/scalar"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dzasumer interface {
|
type Dzasumer interface {
|
||||||
@@ -17,7 +17,7 @@ type Dzasumer interface {
|
|||||||
|
|
||||||
func DzasumTest(t *testing.T, impl Dzasumer) {
|
func DzasumTest(t *testing.T, impl Dzasumer) {
|
||||||
const tol = 1e-14
|
const tol = 1e-14
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 50, 100} {
|
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 50, 100} {
|
||||||
for _, incX := range []int{-5, 1, 2, 10} {
|
for _, incX := range []int{-5, 1, 2, 10} {
|
||||||
aincX := abs(incX)
|
aincX := abs(incX)
|
||||||
@@ -30,11 +30,11 @@ func DzasumTest(t *testing.T, impl Dzasumer) {
|
|||||||
}
|
}
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
re := float64(2*i + 1)
|
re := float64(2*i + 1)
|
||||||
if rnd.Intn(2) == 0 {
|
if rnd.IntN(2) == 0 {
|
||||||
re *= -1
|
re *= -1
|
||||||
}
|
}
|
||||||
im := float64(2 * (i + 1))
|
im := float64(2 * (i + 1))
|
||||||
if rnd.Intn(2) == 0 {
|
if rnd.IntN(2) == 0 {
|
||||||
im *= -1
|
im *= -1
|
||||||
}
|
}
|
||||||
x[i*aincX] = complex(re, im)
|
x[i*aincX] = complex(re, im)
|
||||||
|
@@ -7,10 +7,10 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats/scalar"
|
"gonum.org/v1/gonum/floats/scalar"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dznrm2er interface {
|
type Dznrm2er interface {
|
||||||
@@ -105,7 +105,7 @@ func Dznrm2Test(t *testing.T, impl Dznrm2er) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tol = 1e-14
|
tol = 1e-14
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, n := range []int{10, 50, 100} {
|
for _, n := range []int{10, 50, 100} {
|
||||||
for _, incX := range []int{1, 2, 10} {
|
for _, incX := range []int{1, 2, 10} {
|
||||||
re := make([]float64, n)
|
re := make([]float64, n)
|
||||||
|
@@ -5,9 +5,8 @@
|
|||||||
package testblas
|
package testblas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Izamaxer interface {
|
type Izamaxer interface {
|
||||||
@@ -15,7 +14,7 @@ type Izamaxer interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func IzamaxTest(t *testing.T, impl Izamaxer) {
|
func IzamaxTest(t *testing.T, impl Izamaxer) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 50, 100} {
|
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 50, 100} {
|
||||||
for _, incX := range []int{-5, 1, 2, 10} {
|
for _, incX := range []int{-5, 1, 2, 10} {
|
||||||
aincX := abs(incX)
|
aincX := abs(incX)
|
||||||
@@ -34,7 +33,7 @@ func IzamaxTest(t *testing.T, impl Izamaxer) {
|
|||||||
|
|
||||||
want := -1
|
want := -1
|
||||||
if incX > 0 && n > 0 {
|
if incX > 0 && n > 0 {
|
||||||
want = rnd.Intn(n)
|
want = rnd.IntN(n)
|
||||||
x[want*incX] = 10 + 10i
|
x[want*incX] = 10 + 10i
|
||||||
}
|
}
|
||||||
got := impl.Izamax(n, x, incX)
|
got := impl.Izamax(n, x, incX)
|
||||||
|
@@ -5,10 +5,10 @@
|
|||||||
package testblas
|
package testblas
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func DgemvBenchmark(b *testing.B, impl Dgemver, tA blas.Transpose, m, n, incX, incY int) {
|
func DgemvBenchmark(b *testing.B, impl Dgemver, tA blas.Transpose, m, n, incX, incY int) {
|
||||||
|
@@ -6,9 +6,8 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zcopyer interface {
|
type Zcopyer interface {
|
||||||
@@ -16,7 +15,7 @@ type Zcopyer interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ZcopyTest(t *testing.T, impl Zcopyer) {
|
func ZcopyTest(t *testing.T, impl Zcopyer) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for n := 0; n <= 20; n++ {
|
for n := 0; n <= 20; n++ {
|
||||||
for _, inc := range allPairs([]int{-7, -3, 1, 13}, []int{-11, -5, 1, 17}) {
|
for _, inc := range allPairs([]int{-7, -3, 1, 13}, []int{-11, -5, 1, 17}) {
|
||||||
incX := inc[0]
|
incX := inc[0]
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zgbmver interface {
|
type Zgbmver interface {
|
||||||
@@ -19,7 +19,7 @@ type Zgbmver interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ZgbmvTest(t *testing.T, impl Zgbmver) {
|
func ZgbmvTest(t *testing.T, impl Zgbmver) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
||||||
// Generate all possible size combinations.
|
// Generate all possible size combinations.
|
||||||
for _, mn := range allPairs([]int{1, 2, 3, 5}, []int{1, 2, 3, 5}) {
|
for _, mn := range allPairs([]int{1, 2, 3, 5}, []int{1, 2, 3, 5}) {
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zgemmer interface {
|
type Zgemmer interface {
|
||||||
@@ -36,7 +36,7 @@ func ZgemmTest(t *testing.T, impl Zgemmer) {
|
|||||||
func zgemmTest(t *testing.T, impl Zgemmer, tA, tB blas.Transpose, m, n, k int) {
|
func zgemmTest(t *testing.T, impl Zgemmer, tA, tB blas.Transpose, m, n, k int) {
|
||||||
const tol = 1e-13
|
const tol = 1e-13
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
rowA, colA := m, k
|
rowA, colA := m, k
|
||||||
if tA != blas.NoTrans {
|
if tA != blas.NoTrans {
|
||||||
|
@@ -7,10 +7,10 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zhbmver interface {
|
type Zhbmver interface {
|
||||||
@@ -20,7 +20,7 @@ type Zhbmver interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ZhbmvTest(t *testing.T, impl Zhbmver) {
|
func ZhbmvTest(t *testing.T, impl Zhbmver) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
||||||
for _, n := range []int{0, 1, 2, 3, 5} {
|
for _, n := range []int{0, 1, 2, 3, 5} {
|
||||||
for k := 0; k < n; k++ {
|
for k := 0; k < n; k++ {
|
||||||
|
@@ -7,10 +7,10 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zhemmer interface {
|
type Zhemmer interface {
|
||||||
@@ -35,7 +35,7 @@ func ZhemmTest(t *testing.T, impl Zhemmer) {
|
|||||||
func zhemmTest(t *testing.T, impl Zhemmer, side blas.Side, uplo blas.Uplo, m, n int) {
|
func zhemmTest(t *testing.T, impl Zhemmer, side blas.Side, uplo blas.Uplo, m, n int) {
|
||||||
const tol = 1e-13
|
const tol = 1e-13
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
nA := m
|
nA := m
|
||||||
if side == blas.Right {
|
if side == blas.Right {
|
||||||
|
@@ -7,10 +7,10 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zher2ker interface {
|
type Zher2ker interface {
|
||||||
@@ -35,7 +35,7 @@ func Zher2kTest(t *testing.T, impl Zher2ker) {
|
|||||||
func zher2kTest(t *testing.T, impl Zher2ker, uplo blas.Uplo, trans blas.Transpose, n, k int) {
|
func zher2kTest(t *testing.T, impl Zher2ker, uplo blas.Uplo, trans blas.Transpose, n, k int) {
|
||||||
const tol = 1e-13
|
const tol = 1e-13
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
row, col := n, k
|
row, col := n, k
|
||||||
if trans == blas.ConjTrans {
|
if trans == blas.ConjTrans {
|
||||||
|
@@ -7,10 +7,10 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zherker interface {
|
type Zherker interface {
|
||||||
@@ -35,7 +35,7 @@ func ZherkTest(t *testing.T, impl Zherker) {
|
|||||||
func zherkTest(t *testing.T, impl Zherker, uplo blas.Uplo, trans blas.Transpose, n, k int) {
|
func zherkTest(t *testing.T, impl Zherker, uplo blas.Uplo, trans blas.Transpose, n, k int) {
|
||||||
const tol = 1e-13
|
const tol = 1e-13
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
rowA, colA := n, k
|
rowA, colA := n, k
|
||||||
if trans == blas.ConjTrans {
|
if trans == blas.ConjTrans {
|
||||||
|
@@ -6,9 +6,8 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zswaper interface {
|
type Zswaper interface {
|
||||||
@@ -16,7 +15,7 @@ type Zswaper interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ZswapTest(t *testing.T, impl Zswaper) {
|
func ZswapTest(t *testing.T, impl Zswaper) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for n := 0; n < 20; n++ {
|
for n := 0; n < 20; n++ {
|
||||||
for _, inc := range allPairs([]int{-5, -1, 1, 2, 5, 10}, []int{-3, -1, 1, 3, 7, 12}) {
|
for _, inc := range allPairs([]int{-5, -1, 1, 2, 5, 10}, []int{-3, -1, 1, 3, 7, 12}) {
|
||||||
incX := inc[0]
|
incX := inc[0]
|
||||||
|
@@ -7,10 +7,10 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zsymmer interface {
|
type Zsymmer interface {
|
||||||
@@ -35,7 +35,7 @@ func ZsymmTest(t *testing.T, impl Zsymmer) {
|
|||||||
func zsymmTest(t *testing.T, impl Zsymmer, side blas.Side, uplo blas.Uplo, m, n int) {
|
func zsymmTest(t *testing.T, impl Zsymmer, side blas.Side, uplo blas.Uplo, m, n int) {
|
||||||
const tol = 1e-13
|
const tol = 1e-13
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
nA := m
|
nA := m
|
||||||
if side == blas.Right {
|
if side == blas.Right {
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zsyr2ker interface {
|
type Zsyr2ker interface {
|
||||||
@@ -34,7 +34,7 @@ func Zsyr2kTest(t *testing.T, impl Zsyr2ker) {
|
|||||||
func zsyr2kTest(t *testing.T, impl Zsyr2ker, uplo blas.Uplo, trans blas.Transpose, n, k int) {
|
func zsyr2kTest(t *testing.T, impl Zsyr2ker, uplo blas.Uplo, trans blas.Transpose, n, k int) {
|
||||||
const tol = 1e-13
|
const tol = 1e-13
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
row, col := n, k
|
row, col := n, k
|
||||||
if trans == blas.Trans {
|
if trans == blas.Trans {
|
||||||
|
@@ -7,10 +7,10 @@ package testblas
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Zsyrker interface {
|
type Zsyrker interface {
|
||||||
@@ -35,7 +35,7 @@ func ZsyrkTest(t *testing.T, impl Zsyrker) {
|
|||||||
func zsyrkTest(t *testing.T, impl Zsyrker, uplo blas.Uplo, trans blas.Transpose, n, k int) {
|
func zsyrkTest(t *testing.T, impl Zsyrker, uplo blas.Uplo, trans blas.Transpose, n, k int) {
|
||||||
const tol = 1e-13
|
const tol = 1e-13
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
rowA, colA := n, k
|
rowA, colA := n, k
|
||||||
if trans == blas.Trans {
|
if trans == blas.Trans {
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ztbmver interface {
|
type Ztbmver interface {
|
||||||
@@ -19,7 +19,7 @@ type Ztbmver interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ZtbmvTest(t *testing.T, impl Ztbmver) {
|
func ZtbmvTest(t *testing.T, impl Ztbmver) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
||||||
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
||||||
for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
|
for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ztbsver interface {
|
type Ztbsver interface {
|
||||||
@@ -19,7 +19,7 @@ type Ztbsver interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ZtbsvTest(t *testing.T, impl Ztbsver) {
|
func ZtbsvTest(t *testing.T, impl Ztbsver) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
||||||
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
||||||
for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
|
for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ztpsver interface {
|
type Ztpsver interface {
|
||||||
@@ -19,7 +19,7 @@ type Ztpsver interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ZtpsvTest(t *testing.T, impl Ztpsver) {
|
func ZtpsvTest(t *testing.T, impl Ztpsver) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
||||||
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
||||||
for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
|
for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ztrmmer interface {
|
type Ztrmmer interface {
|
||||||
@@ -38,7 +38,7 @@ func ZtrmmTest(t *testing.T, impl Ztrmmer) {
|
|||||||
func ztrmmTest(t *testing.T, impl Ztrmmer, side blas.Side, uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, m, n int) {
|
func ztrmmTest(t *testing.T, impl Ztrmmer, side blas.Side, uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, m, n int) {
|
||||||
const tol = 1e-13
|
const tol = 1e-13
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
nA := m
|
nA := m
|
||||||
if side == blas.Right {
|
if side == blas.Right {
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ztrsmer interface {
|
type Ztrsmer interface {
|
||||||
@@ -38,7 +38,7 @@ func ZtrsmTest(t *testing.T, impl Ztrsmer) {
|
|||||||
func ztrsmTest(t *testing.T, impl Ztrsmer, side blas.Side, uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, m, n int) {
|
func ztrsmTest(t *testing.T, impl Ztrsmer, side blas.Side, uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, m, n int) {
|
||||||
const tol = 1e-12
|
const tol = 1e-12
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
nA := m
|
nA := m
|
||||||
if side == blas.Right {
|
if side == blas.Right {
|
||||||
|
@@ -6,10 +6,10 @@ package testblas
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ztrsver interface {
|
type Ztrsver interface {
|
||||||
@@ -19,7 +19,7 @@ type Ztrsver interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ZtrsvTest(t *testing.T, impl Ztrsver) {
|
func ZtrsvTest(t *testing.T, impl Ztrsver) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
||||||
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
|
||||||
for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
|
for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
|
||||||
|
@@ -8,12 +8,12 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/cmplxs/cscalar"
|
"gonum.org/v1/gonum/cmplxs/cscalar"
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -1201,7 +1201,7 @@ func randomSlice(l int, src rand.Source) []complex128 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func benchmarkAdd(b *testing.B, size int) {
|
func benchmarkAdd(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1215,7 +1215,7 @@ func BenchmarkAddLarge(b *testing.B) { benchmarkAdd(b, Large) }
|
|||||||
func BenchmarkAddHuge(b *testing.B) { benchmarkAdd(b, Huge) }
|
func BenchmarkAddHuge(b *testing.B) { benchmarkAdd(b, Huge) }
|
||||||
|
|
||||||
func benchmarkAddTo(b *testing.B, size int) {
|
func benchmarkAddTo(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
@@ -1230,7 +1230,7 @@ func BenchmarkAddToLarge(b *testing.B) { benchmarkAddTo(b, Large) }
|
|||||||
func BenchmarkAddToHuge(b *testing.B) { benchmarkAddTo(b, Huge) }
|
func BenchmarkAddToHuge(b *testing.B) { benchmarkAddTo(b, Huge) }
|
||||||
|
|
||||||
func benchmarkCumProd(b *testing.B, size int) {
|
func benchmarkCumProd(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1244,7 +1244,7 @@ func BenchmarkCumProdLarge(b *testing.B) { benchmarkCumProd(b, Large) }
|
|||||||
func BenchmarkCumProdHuge(b *testing.B) { benchmarkCumProd(b, Huge) }
|
func BenchmarkCumProdHuge(b *testing.B) { benchmarkCumProd(b, Huge) }
|
||||||
|
|
||||||
func benchmarkCumSum(b *testing.B, size int) {
|
func benchmarkCumSum(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1258,7 +1258,7 @@ func BenchmarkCumSumLarge(b *testing.B) { benchmarkCumSum(b, Large) }
|
|||||||
func BenchmarkCumSumHuge(b *testing.B) { benchmarkCumSum(b, Huge) }
|
func BenchmarkCumSumHuge(b *testing.B) { benchmarkCumSum(b, Huge) }
|
||||||
|
|
||||||
func benchmarkDiv(b *testing.B, size int) {
|
func benchmarkDiv(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1272,7 +1272,7 @@ func BenchmarkDivLarge(b *testing.B) { benchmarkDiv(b, Large) }
|
|||||||
func BenchmarkDivHuge(b *testing.B) { benchmarkDiv(b, Huge) }
|
func BenchmarkDivHuge(b *testing.B) { benchmarkDiv(b, Huge) }
|
||||||
|
|
||||||
func benchmarkDivTo(b *testing.B, size int) {
|
func benchmarkDivTo(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
@@ -1287,7 +1287,7 @@ func BenchmarkDivToLarge(b *testing.B) { benchmarkDivTo(b, Large) }
|
|||||||
func BenchmarkDivToHuge(b *testing.B) { benchmarkDivTo(b, Huge) }
|
func BenchmarkDivToHuge(b *testing.B) { benchmarkDivTo(b, Huge) }
|
||||||
|
|
||||||
func benchmarkSub(b *testing.B, size int) {
|
func benchmarkSub(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1301,7 +1301,7 @@ func BenchmarkSubLarge(b *testing.B) { benchmarkSub(b, Large) }
|
|||||||
func BenchmarkSubHuge(b *testing.B) { benchmarkSub(b, Huge) }
|
func BenchmarkSubHuge(b *testing.B) { benchmarkSub(b, Huge) }
|
||||||
|
|
||||||
func benchmarkSubTo(b *testing.B, size int) {
|
func benchmarkSubTo(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
@@ -1316,7 +1316,7 @@ func BenchmarkSubToLarge(b *testing.B) { benchmarkSubTo(b, Large) }
|
|||||||
func BenchmarkSubToHuge(b *testing.B) { benchmarkSubTo(b, Huge) }
|
func BenchmarkSubToHuge(b *testing.B) { benchmarkSubTo(b, Huge) }
|
||||||
|
|
||||||
func benchmarkDot(b *testing.B, size int) {
|
func benchmarkDot(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1330,7 +1330,7 @@ func BenchmarkDotLarge(b *testing.B) { benchmarkDot(b, Large) }
|
|||||||
func BenchmarkDotHuge(b *testing.B) { benchmarkDot(b, Huge) }
|
func BenchmarkDotHuge(b *testing.B) { benchmarkDot(b, Huge) }
|
||||||
|
|
||||||
func benchmarkAddScaledTo(b *testing.B, size int) {
|
func benchmarkAddScaledTo(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
y := randomSlice(size, src)
|
y := randomSlice(size, src)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
@@ -1345,7 +1345,7 @@ func BenchmarkAddScaledToLarge(b *testing.B) { benchmarkAddScaledTo(b, Large) }
|
|||||||
func BenchmarkAddScaledToHuge(b *testing.B) { benchmarkAddScaledTo(b, Huge) }
|
func BenchmarkAddScaledToHuge(b *testing.B) { benchmarkAddScaledTo(b, Huge) }
|
||||||
|
|
||||||
func benchmarkScale(b *testing.B, size int) {
|
func benchmarkScale(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i += 2 {
|
for i := 0; i < b.N; i += 2 {
|
||||||
@@ -1359,7 +1359,7 @@ func BenchmarkScaleLarge(b *testing.B) { benchmarkScale(b, Large) }
|
|||||||
func BenchmarkScaleHuge(b *testing.B) { benchmarkScale(b, Huge) }
|
func BenchmarkScaleHuge(b *testing.B) { benchmarkScale(b, Huge) }
|
||||||
|
|
||||||
func benchmarkNorm2(b *testing.B, size int) {
|
func benchmarkNorm2(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
@@ -1372,7 +1372,7 @@ func BenchmarkNorm2Large(b *testing.B) { benchmarkNorm2(b, Large) }
|
|||||||
func BenchmarkNorm2Huge(b *testing.B) { benchmarkNorm2(b, Huge) }
|
func BenchmarkNorm2Huge(b *testing.B) { benchmarkNorm2(b, Huge) }
|
||||||
|
|
||||||
func benchmarkReverse(b *testing.B, size int) {
|
func benchmarkReverse(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
|
@@ -6,10 +6,10 @@ package fd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Rosenbrock struct {
|
type Rosenbrock struct {
|
||||||
@@ -42,7 +42,7 @@ func (r Rosenbrock) FDf(x []float64, deriv []float64) (sum float64) {
|
|||||||
|
|
||||||
func TestGradient(t *testing.T) {
|
func TestGradient(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for i, test := range []struct {
|
for i, test := range []struct {
|
||||||
nDim int
|
nDim int
|
||||||
tol float64
|
tol float64
|
||||||
|
@@ -6,10 +6,10 @@ package fd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/mat"
|
"gonum.org/v1/gonum/mat"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ func vecFunc43Jac(jac *mat.Dense, x []float64) {
|
|||||||
|
|
||||||
func TestJacobian(t *testing.T) {
|
func TestJacobian(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
// Test with default settings.
|
// Test with default settings.
|
||||||
for tc, test := range []struct {
|
for tc, test := range []struct {
|
||||||
|
@@ -6,17 +6,17 @@ package fourier
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestFFT(t *testing.T) {
|
func TestFFT(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
const tol = 1e-10
|
const tol = 1e-10
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
t.Run("NewFFT", func(t *testing.T) {
|
t.Run("NewFFT", func(t *testing.T) {
|
||||||
for n := 1; n <= 200; n++ {
|
for n := 1; n <= 200; n++ {
|
||||||
fft := NewFFT(n)
|
fft := NewFFT(n)
|
||||||
@@ -122,7 +122,7 @@ func TestFFT(t *testing.T) {
|
|||||||
|
|
||||||
func TestCmplxFFT(t *testing.T) {
|
func TestCmplxFFT(t *testing.T) {
|
||||||
const tol = 1e-12
|
const tol = 1e-12
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
t.Run("NewFFT", func(t *testing.T) {
|
t.Run("NewFFT", func(t *testing.T) {
|
||||||
for n := 1; n <= 200; n++ {
|
for n := 1; n <= 200; n++ {
|
||||||
fft := NewCmplxFFT(n)
|
fft := NewCmplxFFT(n)
|
||||||
@@ -220,7 +220,7 @@ func TestCmplxFFT(t *testing.T) {
|
|||||||
func TestDCT(t *testing.T) {
|
func TestDCT(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
const tol = 1e-10
|
const tol = 1e-10
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
t.Run("NewDCT", func(t *testing.T) {
|
t.Run("NewDCT", func(t *testing.T) {
|
||||||
for n := 2; n <= 200; n++ {
|
for n := 2; n <= 200; n++ {
|
||||||
dct := NewDCT(n)
|
dct := NewDCT(n)
|
||||||
@@ -263,7 +263,7 @@ func TestDCT(t *testing.T) {
|
|||||||
func TestDST(t *testing.T) {
|
func TestDST(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
const tol = 1e-10
|
const tol = 1e-10
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
t.Run("NewDST", func(t *testing.T) {
|
t.Run("NewDST", func(t *testing.T) {
|
||||||
for n := 1; n <= 200; n++ {
|
for n := 1; n <= 200; n++ {
|
||||||
dst := NewDST(n)
|
dst := NewDST(n)
|
||||||
@@ -306,7 +306,7 @@ func TestDST(t *testing.T) {
|
|||||||
func TestQuarterWaveFFT(t *testing.T) {
|
func TestQuarterWaveFFT(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
const tol = 1e-10
|
const tol = 1e-10
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
t.Run("NewQuarterWaveFFT", func(t *testing.T) {
|
t.Run("NewQuarterWaveFFT", func(t *testing.T) {
|
||||||
for n := 1; n <= 200; n++ {
|
for n := 1; n <= 200; n++ {
|
||||||
qw := NewQuarterWaveFFT(n)
|
qw := NewQuarterWaveFFT(n)
|
||||||
@@ -397,7 +397,7 @@ func BenchmarkRealFFTCoefficients(b *testing.B) {
|
|||||||
sizes = append(sizes, 100, 4000, 1e6)
|
sizes = append(sizes, 100, 4000, 1e6)
|
||||||
for _, n := range sizes {
|
for _, n := range sizes {
|
||||||
fft := NewFFT(n)
|
fft := NewFFT(n)
|
||||||
seq := randFloats(n, rand.NewSource(1))
|
seq := randFloats(n, rand.NewPCG(1, 1))
|
||||||
dst := make([]complex128, n/2+1)
|
dst := make([]complex128, n/2+1)
|
||||||
|
|
||||||
b.Run(fmt.Sprint(n), func(b *testing.B) {
|
b.Run(fmt.Sprint(n), func(b *testing.B) {
|
||||||
@@ -416,7 +416,7 @@ func BenchmarkRealFFTSequence(b *testing.B) {
|
|||||||
sizes = append(sizes, 100, 4000, 1e6)
|
sizes = append(sizes, 100, 4000, 1e6)
|
||||||
for _, n := range sizes {
|
for _, n := range sizes {
|
||||||
fft := NewFFT(n)
|
fft := NewFFT(n)
|
||||||
coeff := randComplexes(n/2+1, rand.NewSource(1))
|
coeff := randComplexes(n/2+1, rand.NewPCG(1, 1))
|
||||||
dst := make([]float64, n)
|
dst := make([]float64, n)
|
||||||
|
|
||||||
b.Run(fmt.Sprint(n), func(b *testing.B) {
|
b.Run(fmt.Sprint(n), func(b *testing.B) {
|
||||||
@@ -435,7 +435,7 @@ func BenchmarkCmplxFFTCoefficients(b *testing.B) {
|
|||||||
sizes = append(sizes, 100, 4000, 1e6)
|
sizes = append(sizes, 100, 4000, 1e6)
|
||||||
for _, n := range sizes {
|
for _, n := range sizes {
|
||||||
fft := NewCmplxFFT(n)
|
fft := NewCmplxFFT(n)
|
||||||
d := randComplexes(n, rand.NewSource(1))
|
d := randComplexes(n, rand.NewPCG(1, 1))
|
||||||
|
|
||||||
b.Run(fmt.Sprint(n), func(b *testing.B) {
|
b.Run(fmt.Sprint(n), func(b *testing.B) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
@@ -453,7 +453,7 @@ func BenchmarkCmplxFFTSequence(b *testing.B) {
|
|||||||
sizes = append(sizes, 100, 4000, 1e6)
|
sizes = append(sizes, 100, 4000, 1e6)
|
||||||
for _, n := range sizes {
|
for _, n := range sizes {
|
||||||
fft := NewCmplxFFT(n)
|
fft := NewCmplxFFT(n)
|
||||||
d := randComplexes(n, rand.NewSource(1))
|
d := randComplexes(n, rand.NewPCG(1, 1))
|
||||||
|
|
||||||
b.Run(fmt.Sprint(n), func(b *testing.B) {
|
b.Run(fmt.Sprint(n), func(b *testing.B) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
|
@@ -8,19 +8,19 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/bits"
|
"math/bits"
|
||||||
|
"math/rand/v2"
|
||||||
"slices"
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/cmplxs"
|
"gonum.org/v1/gonum/cmplxs"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCoefficients(t *testing.T) {
|
func TestCoefficients(t *testing.T) {
|
||||||
const tol = 1e-8
|
const tol = 1e-8
|
||||||
|
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
for n := 4; n < 1<<20; n <<= 1 {
|
for n := 4; n < 1<<20; n <<= 1 {
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
t.Run(fmt.Sprintf("Radix2/%d", n), func(t *testing.T) {
|
t.Run(fmt.Sprintf("Radix2/%d", n), func(t *testing.T) {
|
||||||
@@ -73,7 +73,7 @@ func TestCoefficients(t *testing.T) {
|
|||||||
func TestSequence(t *testing.T) {
|
func TestSequence(t *testing.T) {
|
||||||
const tol = 1e-10
|
const tol = 1e-10
|
||||||
|
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
for n := 4; n < 1<<20; n <<= 1 {
|
for n := 4; n < 1<<20; n <<= 1 {
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
t.Run(fmt.Sprintf("Radix2/%d", n), func(t *testing.T) {
|
t.Run(fmt.Sprintf("Radix2/%d", n), func(t *testing.T) {
|
||||||
@@ -185,7 +185,7 @@ func TestBitPairReversePermute(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReversePairs(t *testing.T) {
|
func TestReversePairs(t *testing.T) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < 1000; i++ {
|
for i := 0; i < 1000; i++ {
|
||||||
x := uint(rnd.Uint64())
|
x := uint(rnd.Uint64())
|
||||||
got := reversePairs(x)
|
got := reversePairs(x)
|
||||||
@@ -254,7 +254,7 @@ func TestTrimRadix4(t *testing.T) {
|
|||||||
|
|
||||||
func BenchmarkCoefficients(b *testing.B) {
|
func BenchmarkCoefficients(b *testing.B) {
|
||||||
for n := 16; n < 1<<24; n <<= 3 {
|
for n := 16; n < 1<<24; n <<= 3 {
|
||||||
d := randComplexes(n, rand.NewSource(1))
|
d := randComplexes(n, rand.NewPCG(1, 1))
|
||||||
b.Run(fmt.Sprintf("Radix2/%d", n), func(b *testing.B) {
|
b.Run(fmt.Sprintf("Radix2/%d", n), func(b *testing.B) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
CoefficientsRadix2(d)
|
CoefficientsRadix2(d)
|
||||||
@@ -273,7 +273,7 @@ func BenchmarkCoefficients(b *testing.B) {
|
|||||||
|
|
||||||
func BenchmarkSequence(b *testing.B) {
|
func BenchmarkSequence(b *testing.B) {
|
||||||
for n := 16; n < 1<<24; n <<= 3 {
|
for n := 16; n < 1<<24; n <<= 3 {
|
||||||
d := randComplexes(n, rand.NewSource(1))
|
d := randComplexes(n, rand.NewPCG(1, 1))
|
||||||
b.Run(fmt.Sprintf("Radix2/%d", n), func(b *testing.B) {
|
b.Run(fmt.Sprintf("Radix2/%d", n), func(b *testing.B) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
SequenceRadix2(d)
|
SequenceRadix2(d)
|
||||||
|
@@ -7,12 +7,12 @@ package floats
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats/scalar"
|
"gonum.org/v1/gonum/floats/scalar"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -1609,7 +1609,7 @@ func randomSlice(l int, src rand.Source) []float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func benchmarkMin(b *testing.B, size int) {
|
func benchmarkMin(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
@@ -1622,7 +1622,7 @@ func BenchmarkMinLarge(b *testing.B) { benchmarkMin(b, Large) }
|
|||||||
func BenchmarkMinHuge(b *testing.B) { benchmarkMin(b, Huge) }
|
func BenchmarkMinHuge(b *testing.B) { benchmarkMin(b, Huge) }
|
||||||
|
|
||||||
func benchmarkAdd(b *testing.B, size int) {
|
func benchmarkAdd(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1636,7 +1636,7 @@ func BenchmarkAddLarge(b *testing.B) { benchmarkAdd(b, Large) }
|
|||||||
func BenchmarkAddHuge(b *testing.B) { benchmarkAdd(b, Huge) }
|
func BenchmarkAddHuge(b *testing.B) { benchmarkAdd(b, Huge) }
|
||||||
|
|
||||||
func benchmarkAddTo(b *testing.B, size int) {
|
func benchmarkAddTo(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
@@ -1651,7 +1651,7 @@ func BenchmarkAddToLarge(b *testing.B) { benchmarkAddTo(b, Large) }
|
|||||||
func BenchmarkAddToHuge(b *testing.B) { benchmarkAddTo(b, Huge) }
|
func BenchmarkAddToHuge(b *testing.B) { benchmarkAddTo(b, Huge) }
|
||||||
|
|
||||||
func benchmarkCumProd(b *testing.B, size int) {
|
func benchmarkCumProd(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1665,7 +1665,7 @@ func BenchmarkCumProdLarge(b *testing.B) { benchmarkCumProd(b, Large) }
|
|||||||
func BenchmarkCumProdHuge(b *testing.B) { benchmarkCumProd(b, Huge) }
|
func BenchmarkCumProdHuge(b *testing.B) { benchmarkCumProd(b, Huge) }
|
||||||
|
|
||||||
func benchmarkCumSum(b *testing.B, size int) {
|
func benchmarkCumSum(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1679,7 +1679,7 @@ func BenchmarkCumSumLarge(b *testing.B) { benchmarkCumSum(b, Large) }
|
|||||||
func BenchmarkCumSumHuge(b *testing.B) { benchmarkCumSum(b, Huge) }
|
func BenchmarkCumSumHuge(b *testing.B) { benchmarkCumSum(b, Huge) }
|
||||||
|
|
||||||
func benchmarkDiv(b *testing.B, size int) {
|
func benchmarkDiv(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1693,7 +1693,7 @@ func BenchmarkDivLarge(b *testing.B) { benchmarkDiv(b, Large) }
|
|||||||
func BenchmarkDivHuge(b *testing.B) { benchmarkDiv(b, Huge) }
|
func BenchmarkDivHuge(b *testing.B) { benchmarkDiv(b, Huge) }
|
||||||
|
|
||||||
func benchmarkDivTo(b *testing.B, size int) {
|
func benchmarkDivTo(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
@@ -1708,7 +1708,7 @@ func BenchmarkDivToLarge(b *testing.B) { benchmarkDivTo(b, Large) }
|
|||||||
func BenchmarkDivToHuge(b *testing.B) { benchmarkDivTo(b, Huge) }
|
func BenchmarkDivToHuge(b *testing.B) { benchmarkDivTo(b, Huge) }
|
||||||
|
|
||||||
func benchmarkSub(b *testing.B, size int) {
|
func benchmarkSub(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1722,7 +1722,7 @@ func BenchmarkSubLarge(b *testing.B) { benchmarkSub(b, Large) }
|
|||||||
func BenchmarkSubHuge(b *testing.B) { benchmarkSub(b, Huge) }
|
func BenchmarkSubHuge(b *testing.B) { benchmarkSub(b, Huge) }
|
||||||
|
|
||||||
func benchmarkSubTo(b *testing.B, size int) {
|
func benchmarkSubTo(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
@@ -1737,7 +1737,7 @@ func BenchmarkSubToLarge(b *testing.B) { benchmarkSubTo(b, Large) }
|
|||||||
func BenchmarkSubToHuge(b *testing.B) { benchmarkSubTo(b, Huge) }
|
func BenchmarkSubToHuge(b *testing.B) { benchmarkSubTo(b, Huge) }
|
||||||
|
|
||||||
func benchmarkLogSumExp(b *testing.B, size int) {
|
func benchmarkLogSumExp(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
@@ -1750,7 +1750,7 @@ func BenchmarkLogSumExpLarge(b *testing.B) { benchmarkLogSumExp(b, Large) }
|
|||||||
func BenchmarkLogSumExpHuge(b *testing.B) { benchmarkLogSumExp(b, Huge) }
|
func BenchmarkLogSumExpHuge(b *testing.B) { benchmarkLogSumExp(b, Huge) }
|
||||||
|
|
||||||
func benchmarkDot(b *testing.B, size int) {
|
func benchmarkDot(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s1 := randomSlice(size, src)
|
s1 := randomSlice(size, src)
|
||||||
s2 := randomSlice(size, src)
|
s2 := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
@@ -1764,7 +1764,7 @@ func BenchmarkDotLarge(b *testing.B) { benchmarkDot(b, Large) }
|
|||||||
func BenchmarkDotHuge(b *testing.B) { benchmarkDot(b, Huge) }
|
func BenchmarkDotHuge(b *testing.B) { benchmarkDot(b, Huge) }
|
||||||
|
|
||||||
func benchmarkAddScaledTo(b *testing.B, size int) {
|
func benchmarkAddScaledTo(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
y := randomSlice(size, src)
|
y := randomSlice(size, src)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
@@ -1779,7 +1779,7 @@ func BenchmarkAddScaledToLarge(b *testing.B) { benchmarkAddScaledTo(b, Large) }
|
|||||||
func BenchmarkAddScaledToHuge(b *testing.B) { benchmarkAddScaledTo(b, Huge) }
|
func BenchmarkAddScaledToHuge(b *testing.B) { benchmarkAddScaledTo(b, Huge) }
|
||||||
|
|
||||||
func benchmarkScale(b *testing.B, size int) {
|
func benchmarkScale(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
dst := randomSlice(size, src)
|
dst := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i += 2 {
|
for i := 0; i < b.N; i += 2 {
|
||||||
@@ -1793,7 +1793,7 @@ func BenchmarkScaleLarge(b *testing.B) { benchmarkScale(b, Large) }
|
|||||||
func BenchmarkScaleHuge(b *testing.B) { benchmarkScale(b, Huge) }
|
func BenchmarkScaleHuge(b *testing.B) { benchmarkScale(b, Huge) }
|
||||||
|
|
||||||
func benchmarkNorm2(b *testing.B, size int) {
|
func benchmarkNorm2(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
@@ -1806,7 +1806,7 @@ func BenchmarkNorm2Large(b *testing.B) { benchmarkNorm2(b, Large) }
|
|||||||
func BenchmarkNorm2Huge(b *testing.B) { benchmarkNorm2(b, Huge) }
|
func BenchmarkNorm2Huge(b *testing.B) { benchmarkNorm2(b, Huge) }
|
||||||
|
|
||||||
func benchmarkSumCompensated(b *testing.B, size int) {
|
func benchmarkSumCompensated(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
@@ -1820,7 +1820,7 @@ func BenchmarkSumCompensatedLarge(b *testing.B) { benchmarkSumCompensated(b, La
|
|||||||
func BenchmarkSumCompensatedHuge(b *testing.B) { benchmarkSumCompensated(b, Huge) }
|
func BenchmarkSumCompensatedHuge(b *testing.B) { benchmarkSumCompensated(b, Huge) }
|
||||||
|
|
||||||
func benchmarkSum(b *testing.B, size int) {
|
func benchmarkSum(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
@@ -1834,7 +1834,7 @@ func BenchmarkSumLarge(b *testing.B) { benchmarkSum(b, Large) }
|
|||||||
func BenchmarkSumHuge(b *testing.B) { benchmarkSum(b, Huge) }
|
func BenchmarkSumHuge(b *testing.B) { benchmarkSum(b, Huge) }
|
||||||
|
|
||||||
func benchmarkReverse(b *testing.B, size int) {
|
func benchmarkReverse(b *testing.B, size int) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
s := randomSlice(size, src)
|
s := randomSlice(size, src)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
|
@@ -9,6 +9,7 @@ package coloring
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"math/rand/v2"
|
||||||
"slices"
|
"slices"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
@@ -16,7 +17,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/graph/topo"
|
"gonum.org/v1/gonum/graph/topo"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrInvalidPartialColoring is returned when a partial coloring
|
// ErrInvalidPartialColoring is returned when a partial coloring
|
||||||
|
@@ -7,6 +7,7 @@ package coloring
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -14,7 +15,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/encoding/graph6"
|
"gonum.org/v1/gonum/graph/encoding/graph6"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var runLong = flag.Bool("color.long", false, "run long exact coloring tests")
|
var runLong = flag.Bool("color.long", false, "run long exact coloring tests")
|
||||||
@@ -511,7 +511,7 @@ func TestRandomized(t *testing.T) {
|
|||||||
for seed := uint64(1); seed <= 1000; seed++ {
|
for seed := uint64(1); seed <= 1000; seed++ {
|
||||||
for _, test := range coloringTests {
|
for _, test := range coloringTests {
|
||||||
for _, partial := range []map[int64]int{nil, test.partial} {
|
for _, partial := range []map[int64]int{nil, test.partial} {
|
||||||
k, colors, err := Randomized(test.g, partial, rand.NewSource(seed))
|
k, colors, err := Randomized(test.g, partial, rand.NewPCG(seed, seed))
|
||||||
|
|
||||||
if partial == nil && k != test.colors && !test.randomized.Has(k) {
|
if partial == nil && k != test.colors && !test.randomized.Has(k) {
|
||||||
t.Errorf("unexpected chromatic number for %q with seed=%d: got:%d want:%d or in %v\ncolors:%v",
|
t.Errorf("unexpected chromatic number for %q with seed=%d: got:%d want:%d or in %v\ncolors:%v",
|
||||||
@@ -767,7 +767,7 @@ func BenchmarkColoring(b *testing.B) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
b.Run("Randomized", func(b *testing.B) {
|
b.Run("Randomized", func(b *testing.B) {
|
||||||
rnd := rand.NewSource(1)
|
rnd := rand.NewPCG(1, 1)
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
_, _, err := Randomized(bench.g, nil, rnd)
|
_, _, err := Randomized(bench.g, nil, rnd)
|
||||||
|
@@ -8,9 +8,9 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Interval is an interval of resolutions with a common score.
|
// Interval is an interval of resolutions with a common score.
|
||||||
|
@@ -7,11 +7,11 @@ package community_test
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph/community"
|
"gonum.org/v1/gonum/graph/community"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func ExampleProfile_simple() {
|
func ExampleProfile_simple() {
|
||||||
@@ -19,7 +19,7 @@ func ExampleProfile_simple() {
|
|||||||
// Since this is a randomized algorithm we use a defined random source to ensure
|
// Since this is a randomized algorithm we use a defined random source to ensure
|
||||||
// consistency between test runs. In practice, results will not differ greatly
|
// consistency between test runs. In practice, results will not differ greatly
|
||||||
// between runs with different PRNG seeds.
|
// between runs with different PRNG seeds.
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
|
|
||||||
// Create dumbell graph:
|
// Create dumbell graph:
|
||||||
//
|
//
|
||||||
@@ -173,7 +173,7 @@ func ExampleProfile_multiplex() {
|
|||||||
// algorithm. Since this is a randomized algorithm we use a defined random source
|
// algorithm. Since this is a randomized algorithm we use a defined random source
|
||||||
// to ensure consistency between test runs. In practice, results will not differ
|
// to ensure consistency between test runs. In practice, results will not differ
|
||||||
// greatly between runs with different PRNG seeds.
|
// greatly between runs with different PRNG seeds.
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
|
|
||||||
// The undirected graphs, friends and enemies, are the political relationships
|
// The undirected graphs, friends and enemies, are the political relationships
|
||||||
// in the Middle East as described in the Slate article:
|
// in the Middle East as described in the Slate article:
|
||||||
@@ -209,10 +209,10 @@ func ExampleProfile_multiplex() {
|
|||||||
// Low:0.1 High:0.72 Score:26 Communities:[[0] [1 7 9 12] [2 8 11] [3 4 5 10] [6]] Q=[24.7 1.97]
|
// Low:0.1 High:0.72 Score:26 Communities:[[0] [1 7 9 12] [2 8 11] [3 4 5 10] [6]] Q=[24.7 1.97]
|
||||||
// Low:0.72 High:1.1 Score:24 Communities:[[0 6] [1 7 9 12] [2 8 11] [3 4 5 10]] Q=[16.9 14.1]
|
// Low:0.72 High:1.1 Score:24 Communities:[[0 6] [1 7 9 12] [2 8 11] [3 4 5 10]] Q=[16.9 14.1]
|
||||||
// Low:1.1 High:1.2 Score:18 Communities:[[0 2 6 11] [1 7 9 12] [3 4 5 8 10]] Q=[9.16 25.1]
|
// Low:1.1 High:1.2 Score:18 Communities:[[0 2 6 11] [1 7 9 12] [3 4 5 8 10]] Q=[9.16 25.1]
|
||||||
// Low:1.2 High:1.6 Score:10 Communities:[[0 3 4 5 6 10] [1 7 9 12] [2 8 11]] Q=[11 25.2]
|
// Low:1.2 High:1.6 Score:10 Communities:[[0 3 4 5 6 10] [1 7 9 12] [2 8 11]] Q=[10.7 26]
|
||||||
// Low:1.6 High:1.6 Score:8 Communities:[[0 1 6 7 9 12] [2 8 11] [3 4 5 10]] Q=[5.56 39.8]
|
// Low:1.6 High:1.6 Score:8 Communities:[[0 1 6 7 9 12] [2 8 11] [3 4 5 10]] Q=[5.56 39.8]
|
||||||
// Low:1.6 High:1.8 Score:2 Communities:[[0 2 3 4 5 6 10] [1 7 8 9 11 12]] Q=[-1.82 48.6]
|
// Low:1.6 High:1.8 Score:2 Communities:[[0 2 3 4 5 6 10] [1 7 8 9 11 12]] Q=[-1.82 48.6]
|
||||||
// Low:1.8 High:2.3 Score:-6 Communities:[[0 2 3 4 5 6 8 10 11] [1 7 9 12]] Q=[-5 57.5]
|
// Low:1.8 High:2.3 Score:-6 Communities:[[0 2 3 4 5 6 8 10 11] [1 7 9 12]] Q=[-5.02 57.5]
|
||||||
// Low:2.3 High:2.4 Score:-10 Communities:[[0 1 2 6 7 8 9 11 12] [3 4 5 10]] Q=[-11.2 79]
|
// Low:2.3 High:2.4 Score:-10 Communities:[[0 1 2 6 7 8 9 11 12] [3 4 5 10]] Q=[-11.2 79]
|
||||||
// Low:2.4 High:4.3 Score:-52 Communities:[[0 1 2 3 4 5 6 7 8 9 10 11 12]] Q=[-46.1 117]
|
// Low:2.4 High:4.3 Score:-52 Communities:[[0 1 2 3 4 5 6 7 8 9 10 11 12]] Q=[-46.1 117]
|
||||||
// Low:4.3 High:10 Score:-54 Communities:[[0 1 2 3 4 6 7 8 9 10 11 12] [5]] Q=[-82 254]
|
// Low:4.3 High:10 Score:-54 Communities:[[0 1 2 3 4 6 7 8 9 10 11 12] [5]] Q=[-82 254]
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
package community
|
package community
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
@@ -46,7 +47,7 @@ func TestProfileWeightedUndirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testProfileUndirected(t *testing.T, test communityUndirectedQTest, g graph.Undirected) {
|
func testProfileUndirected(t *testing.T, test communityUndirectedQTest, g graph.Undirected) {
|
||||||
fn := ModularScore(g, Weight, 10, nil)
|
fn := ModularScore(g, Weight, 10, rand.NewPCG(1, 1))
|
||||||
p, err := Profile(fn, true, 1e-3, 0.1, 10)
|
p, err := Profile(fn, true, 1e-3, 0.1, 10)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("%s: unexpected error: %v", test.name, err)
|
t.Errorf("%s: unexpected error: %v", test.name, err)
|
||||||
@@ -105,7 +106,7 @@ func TestProfileWeightedDirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testProfileDirected(t *testing.T, test communityDirectedQTest, g graph.Directed) {
|
func testProfileDirected(t *testing.T, test communityDirectedQTest, g graph.Directed) {
|
||||||
fn := ModularScore(g, Weight, 10, nil)
|
fn := ModularScore(g, Weight, 10, rand.NewPCG(1, 1))
|
||||||
p, err := Profile(fn, true, 1e-3, 0.1, 10)
|
p, err := Profile(fn, true, 1e-3, 0.1, 10)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("%s: unexpected error: %v", test.name, err)
|
t.Errorf("%s: unexpected error: %v", test.name, err)
|
||||||
|
@@ -6,11 +6,11 @@ package community
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Q returns the modularity Q score of the graph g subdivided into the
|
// Q returns the modularity Q score of the graph g subdivided into the
|
||||||
@@ -71,7 +71,7 @@ type ReducedGraph interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Modularize returns the hierarchical modularization of g at the given resolution
|
// Modularize returns the hierarchical modularization of g at the given resolution
|
||||||
// using the Louvain algorithm. If src is nil, rand.Intn is used as the random
|
// using the Louvain algorithm. If src is nil, rand.IntN is used as the random
|
||||||
// generator. Modularize will panic if g has any edge with negative edge weight.
|
// generator. Modularize will panic if g has any edge with negative edge weight.
|
||||||
//
|
//
|
||||||
// If g is undirected it is modularised to minimise
|
// If g is undirected it is modularised to minimise
|
||||||
@@ -186,7 +186,7 @@ type ReducedMultiplex interface {
|
|||||||
|
|
||||||
// ModularizeMultiplex returns the hierarchical modularization of g at the given resolution
|
// ModularizeMultiplex returns the hierarchical modularization of g at the given resolution
|
||||||
// using the Louvain algorithm. If all is true and g have negatively weighted layers, all
|
// using the Louvain algorithm. If all is true and g have negatively weighted layers, all
|
||||||
// communities will be searched during the modularization. If src is nil, rand.Intn is
|
// communities will be searched during the modularization. If src is nil, rand.IntN is
|
||||||
// used as the random generator. ModularizeMultiplex will panic if g has any edge with
|
// used as the random generator. ModularizeMultiplex will panic if g has any edge with
|
||||||
// edge weight that does not sign-match the layer weight.
|
// edge weight that does not sign-match the layer weight.
|
||||||
//
|
//
|
||||||
|
@@ -6,13 +6,13 @@ package community
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// qDirected returns the modularity Q score of the graph g subdivided into the
|
// qDirected returns the modularity Q score of the graph g subdivided into the
|
||||||
@@ -77,7 +77,7 @@ func qDirected(g graph.Directed, communities [][]graph.Node, resolution float64)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// louvainDirected returns the hierarchical modularization of g at the given
|
// louvainDirected returns the hierarchical modularization of g at the given
|
||||||
// resolution using the Louvain algorithm. If src is nil, rand.Intn is used
|
// resolution using the Louvain algorithm. If src is nil, rand.IntN is used
|
||||||
// as the random generator. louvainDirected will panic if g has any edge with negative
|
// as the random generator. louvainDirected will panic if g has any edge with negative
|
||||||
// edge weight.
|
// edge weight.
|
||||||
func louvainDirected(g graph.Directed, resolution float64, src rand.Source) ReducedGraph {
|
func louvainDirected(g graph.Directed, resolution float64, src rand.Source) ReducedGraph {
|
||||||
@@ -85,9 +85,9 @@ func louvainDirected(g graph.Directed, resolution float64, src rand.Source) Redu
|
|||||||
// of the algorithm used here.
|
// of the algorithm used here.
|
||||||
|
|
||||||
c := reduceDirected(g, nil)
|
c := reduceDirected(g, nil)
|
||||||
rnd := rand.Intn
|
rnd := rand.IntN
|
||||||
if src != nil {
|
if src != nil {
|
||||||
rnd = rand.New(src).Intn
|
rnd = rand.New(src).IntN
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
l := newDirectedLocalMover(c, c.communities, resolution)
|
l := newDirectedLocalMover(c, c.communities, resolution)
|
||||||
|
@@ -7,12 +7,12 @@ package community
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// DirectedMultiplex is a directed multiplex graph.
|
// DirectedMultiplex is a directed multiplex graph.
|
||||||
@@ -166,7 +166,7 @@ func (g DirectedLayers) Layer(l int) graph.Directed { return g[l] }
|
|||||||
|
|
||||||
// louvainDirectedMultiplex returns the hierarchical modularization of g at the given resolution
|
// louvainDirectedMultiplex returns the hierarchical modularization of g at the given resolution
|
||||||
// using the Louvain algorithm. If all is true and g has negatively weighted layers, all
|
// using the Louvain algorithm. If all is true and g has negatively weighted layers, all
|
||||||
// communities will be searched during the modularization. If src is nil, rand.Intn is
|
// communities will be searched during the modularization. If src is nil, rand.IntN is
|
||||||
// used as the random generator. louvainDirectedMultiplex will panic if g has any edge with
|
// used as the random generator. louvainDirectedMultiplex will panic if g has any edge with
|
||||||
// edge weight that does not sign-match the layer weight.
|
// edge weight that does not sign-match the layer weight.
|
||||||
//
|
//
|
||||||
@@ -183,9 +183,9 @@ func louvainDirectedMultiplex(g DirectedMultiplex, weights, resolutions []float6
|
|||||||
// of the algorithm used here.
|
// of the algorithm used here.
|
||||||
|
|
||||||
c := reduceDirectedMultiplex(g, nil, weights)
|
c := reduceDirectedMultiplex(g, nil, weights)
|
||||||
rnd := rand.Intn
|
rnd := rand.IntN
|
||||||
if src != nil {
|
if src != nil {
|
||||||
rnd = rand.New(src).Intn
|
rnd = rand.New(src).IntN
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
l := newDirectedMultiplexLocalMover(c, c.communities, weights, resolutions, all)
|
l := newDirectedMultiplexLocalMover(c, c.communities, weights, resolutions, all)
|
||||||
|
@@ -7,6 +7,7 @@ package community
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"slices"
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -16,7 +17,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var communityDirectedMultiplexQTests = []struct {
|
var communityDirectedMultiplexQTests = []struct {
|
||||||
@@ -326,7 +326,7 @@ tests:
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1)).Intn
|
rnd := rand.New(rand.NewPCG(1, 1)).IntN
|
||||||
for _, structure := range test.structures {
|
for _, structure := range test.structures {
|
||||||
communityOf := make(map[int64]int)
|
communityOf := make(map[int64]int)
|
||||||
communities := make([][]graph.Node, len(structure.memberships))
|
communities := make([][]graph.Node, len(structure.memberships))
|
||||||
@@ -588,7 +588,7 @@ func TestLouvainDirectedMultiplex(t *testing.T) {
|
|||||||
)
|
)
|
||||||
// Modularize is randomised so we do this to
|
// Modularize is randomised so we do this to
|
||||||
// ensure the level tests are consistent.
|
// ensure the level tests are consistent.
|
||||||
src := rand.New(rand.NewSource(1))
|
src := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < louvainIterations; i++ {
|
for i := 0; i < louvainIterations; i++ {
|
||||||
r := ModularizeMultiplex(g, weights, nil, true, src).(*ReducedDirectedMultiplex)
|
r := ModularizeMultiplex(g, weights, nil, true, src).(*ReducedDirectedMultiplex)
|
||||||
if q := floats.Sum(QMultiplex(r, nil, weights, nil)); q > bestQ || math.IsNaN(q) {
|
if q := floats.Sum(QMultiplex(r, nil, weights, nil)); q > bestQ || math.IsNaN(q) {
|
||||||
@@ -689,7 +689,7 @@ func TestNonContiguousWeightedDirectedMultiplex(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLouvainDirectedMultiplex(b *testing.B) {
|
func BenchmarkLouvainDirectedMultiplex(b *testing.B) {
|
||||||
src := rand.New(rand.NewSource(1))
|
src := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
ModularizeMultiplex(DirectedLayers{dupGraphDirected}, nil, nil, true, src)
|
ModularizeMultiplex(DirectedLayers{dupGraphDirected}, nil, nil, true, src)
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ package community
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"slices"
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -14,7 +15,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type communityDirectedQTest struct {
|
type communityDirectedQTest struct {
|
||||||
@@ -90,13 +90,12 @@ var communityDirectedQTests = []communityDirectedQTest{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
q: 0.3911232174331037,
|
q: 0.4037814452812049,
|
||||||
communities: [][]graph.Node{
|
communities: [][]graph.Node{
|
||||||
{simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(3), simple.Node(7), simple.Node(11), simple.Node(12), simple.Node(13), simple.Node(17), simple.Node(19), simple.Node(21)},
|
{simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(3), simple.Node(7), simple.Node(11), simple.Node(12), simple.Node(13), simple.Node(17), simple.Node(19), simple.Node(21)},
|
||||||
{simple.Node(4), simple.Node(10)},
|
{simple.Node(4), simple.Node(10)},
|
||||||
{simple.Node(5), simple.Node(6), simple.Node(16)},
|
{simple.Node(5), simple.Node(6), simple.Node(16)},
|
||||||
{simple.Node(8), simple.Node(30)},
|
{simple.Node(8), simple.Node(9), simple.Node(14), simple.Node(15), simple.Node(18), simple.Node(20), simple.Node(22), simple.Node(30), simple.Node(32), simple.Node(33)},
|
||||||
{simple.Node(9), simple.Node(14), simple.Node(15), simple.Node(18), simple.Node(20), simple.Node(22), simple.Node(32), simple.Node(33)},
|
|
||||||
{simple.Node(23), simple.Node(24), simple.Node(25), simple.Node(27), simple.Node(28), simple.Node(31)},
|
{simple.Node(23), simple.Node(24), simple.Node(25), simple.Node(27), simple.Node(28), simple.Node(31)},
|
||||||
{simple.Node(26), simple.Node(29)},
|
{simple.Node(26), simple.Node(29)},
|
||||||
},
|
},
|
||||||
@@ -166,7 +165,7 @@ var communityDirectedQTests = []communityDirectedQTest{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
q: 0.3405612244897959,
|
q: 0.34056122448979587,
|
||||||
communities: [][]graph.Node{
|
communities: [][]graph.Node{
|
||||||
{simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(4), simple.Node(5)},
|
{simple.Node(0), simple.Node(1), simple.Node(2), simple.Node(4), simple.Node(5)},
|
||||||
{simple.Node(3), simple.Node(6), simple.Node(7)},
|
{simple.Node(3), simple.Node(6), simple.Node(7)},
|
||||||
@@ -295,7 +294,7 @@ func TestCommunityDeltaQWeightedDirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testCommunityDeltaQDirected(t *testing.T, test communityDirectedQTest, g graph.Directed) {
|
func testCommunityDeltaQDirected(t *testing.T, test communityDirectedQTest, g graph.Directed) {
|
||||||
rnd := rand.New(rand.NewSource(1)).Intn
|
rnd := rand.New(rand.NewPCG(1, 1)).IntN
|
||||||
for _, structure := range test.structures {
|
for _, structure := range test.structures {
|
||||||
communityOf := make(map[int64]int)
|
communityOf := make(map[int64]int)
|
||||||
communities := make([][]graph.Node, len(structure.memberships))
|
communities := make([][]graph.Node, len(structure.memberships))
|
||||||
@@ -632,7 +631,7 @@ func testModularizeDirected(t *testing.T, test communityDirectedQTest, g graph.D
|
|||||||
)
|
)
|
||||||
// Modularize is randomised so we do this to
|
// Modularize is randomised so we do this to
|
||||||
// ensure the level tests are consistent.
|
// ensure the level tests are consistent.
|
||||||
src := rand.New(rand.NewSource(1))
|
src := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < louvainIterations; i++ {
|
for i := 0; i < louvainIterations; i++ {
|
||||||
r := Modularize(g, 1, src).(*ReducedDirected)
|
r := Modularize(g, 1, src).(*ReducedDirected)
|
||||||
if q := Q(r, nil, 1); q > bestQ || math.IsNaN(q) {
|
if q := Q(r, nil, 1); q > bestQ || math.IsNaN(q) {
|
||||||
@@ -732,7 +731,7 @@ func TestNonContiguousWeightedDirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLouvainDirected(b *testing.B) {
|
func BenchmarkLouvainDirected(b *testing.B) {
|
||||||
src := rand.New(rand.NewSource(1))
|
src := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
Modularize(dupGraphDirected, 1, src)
|
Modularize(dupGraphDirected, 1, src)
|
||||||
}
|
}
|
||||||
|
@@ -6,11 +6,11 @@ package community
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/graphs/gen"
|
"gonum.org/v1/gonum/graph/graphs/gen"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// intset is an integer set.
|
// intset is an integer set.
|
||||||
@@ -228,7 +228,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
err := gen.Duplication(dupGraph, 1000, 0.8, 0.1, 0.5, rand.New(rand.NewSource(1)))
|
err := gen.Duplication(dupGraph, 1000, 0.8, 0.1, 0.5, rand.New(rand.NewPCG(1, 1)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@@ -6,13 +6,13 @@ package community
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// qUndirected returns the modularity Q score of the graph g subdivided into the
|
// qUndirected returns the modularity Q score of the graph g subdivided into the
|
||||||
@@ -73,7 +73,7 @@ func qUndirected(g graph.Undirected, communities [][]graph.Node, resolution floa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// louvainUndirected returns the hierarchical modularization of g at the given
|
// louvainUndirected returns the hierarchical modularization of g at the given
|
||||||
// resolution using the Louvain algorithm. If src is nil, rand.Intn is used as
|
// resolution using the Louvain algorithm. If src is nil, rand.IntN is used as
|
||||||
// the random generator. louvainUndirected will panic if g has any edge with negative edge
|
// the random generator. louvainUndirected will panic if g has any edge with negative edge
|
||||||
// weight.
|
// weight.
|
||||||
//
|
//
|
||||||
@@ -83,9 +83,9 @@ func louvainUndirected(g graph.Undirected, resolution float64, src rand.Source)
|
|||||||
// of the algorithm used here.
|
// of the algorithm used here.
|
||||||
|
|
||||||
c := reduceUndirected(g, nil)
|
c := reduceUndirected(g, nil)
|
||||||
rnd := rand.Intn
|
rnd := rand.IntN
|
||||||
if src != nil {
|
if src != nil {
|
||||||
rnd = rand.New(src).Intn
|
rnd = rand.New(src).IntN
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
l := newUndirectedLocalMover(c, c.communities, resolution)
|
l := newUndirectedLocalMover(c, c.communities, resolution)
|
||||||
|
@@ -7,12 +7,12 @@ package community
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// UndirectedMultiplex is an undirected multiplex graph.
|
// UndirectedMultiplex is an undirected multiplex graph.
|
||||||
@@ -162,7 +162,7 @@ func (g UndirectedLayers) Layer(l int) graph.Undirected { return g[l] }
|
|||||||
|
|
||||||
// louvainUndirectedMultiplex returns the hierarchical modularization of g at the given resolution
|
// louvainUndirectedMultiplex returns the hierarchical modularization of g at the given resolution
|
||||||
// using the Louvain algorithm. If all is true and g has negatively weighted layers, all
|
// using the Louvain algorithm. If all is true and g has negatively weighted layers, all
|
||||||
// communities will be searched during the modularization. If src is nil, rand.Intn is
|
// communities will be searched during the modularization. If src is nil, rand.IntN is
|
||||||
// used as the random generator. louvainUndirectedMultiplex will panic if g has any edge with
|
// used as the random generator. louvainUndirectedMultiplex will panic if g has any edge with
|
||||||
// edge weight that does not sign-match the layer weight.
|
// edge weight that does not sign-match the layer weight.
|
||||||
//
|
//
|
||||||
@@ -179,9 +179,9 @@ func louvainUndirectedMultiplex(g UndirectedMultiplex, weights, resolutions []fl
|
|||||||
// of the algorithm used here.
|
// of the algorithm used here.
|
||||||
|
|
||||||
c := reduceUndirectedMultiplex(g, nil, weights)
|
c := reduceUndirectedMultiplex(g, nil, weights)
|
||||||
rnd := rand.Intn
|
rnd := rand.IntN
|
||||||
if src != nil {
|
if src != nil {
|
||||||
rnd = rand.New(src).Intn
|
rnd = rand.New(src).IntN
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
l := newUndirectedMultiplexLocalMover(c, c.communities, weights, resolutions, all)
|
l := newUndirectedMultiplexLocalMover(c, c.communities, weights, resolutions, all)
|
||||||
|
@@ -7,6 +7,7 @@ package community
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"slices"
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -16,7 +17,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var communityUndirectedMultiplexQTests = []struct {
|
var communityUndirectedMultiplexQTests = []struct {
|
||||||
@@ -295,7 +295,7 @@ tests:
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1)).Intn
|
rnd := rand.New(rand.NewPCG(1, 1)).IntN
|
||||||
for _, structure := range test.structures {
|
for _, structure := range test.structures {
|
||||||
communityOf := make(map[int64]int)
|
communityOf := make(map[int64]int)
|
||||||
communities := make([][]graph.Node, len(structure.memberships))
|
communities := make([][]graph.Node, len(structure.memberships))
|
||||||
@@ -557,7 +557,7 @@ func TestLouvainMultiplex(t *testing.T) {
|
|||||||
)
|
)
|
||||||
// Modularize is randomised so we do this to
|
// Modularize is randomised so we do this to
|
||||||
// ensure the level tests are consistent.
|
// ensure the level tests are consistent.
|
||||||
src := rand.New(rand.NewSource(1))
|
src := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < louvainIterations; i++ {
|
for i := 0; i < louvainIterations; i++ {
|
||||||
r := ModularizeMultiplex(g, weights, nil, true, src).(*ReducedUndirectedMultiplex)
|
r := ModularizeMultiplex(g, weights, nil, true, src).(*ReducedUndirectedMultiplex)
|
||||||
if q := floats.Sum(QMultiplex(r, nil, weights, nil)); q > bestQ || math.IsNaN(q) {
|
if q := floats.Sum(QMultiplex(r, nil, weights, nil)); q > bestQ || math.IsNaN(q) {
|
||||||
@@ -658,7 +658,7 @@ func TestNonContiguousWeightedUndirectedMultiplex(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLouvainMultiplex(b *testing.B) {
|
func BenchmarkLouvainMultiplex(b *testing.B) {
|
||||||
src := rand.New(rand.NewSource(1))
|
src := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
ModularizeMultiplex(UndirectedLayers{dupGraph}, nil, nil, true, src)
|
ModularizeMultiplex(UndirectedLayers{dupGraph}, nil, nil, true, src)
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ package community
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"slices"
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -14,7 +15,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type communityUndirectedQTest struct {
|
type communityUndirectedQTest struct {
|
||||||
@@ -356,7 +356,7 @@ func TestCommunityDeltaQWeightedUndirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testCommunityDeltaQUndirected(t *testing.T, test communityUndirectedQTest, g graph.Undirected) {
|
func testCommunityDeltaQUndirected(t *testing.T, test communityUndirectedQTest, g graph.Undirected) {
|
||||||
rnd := rand.New(rand.NewSource(1)).Intn
|
rnd := rand.New(rand.NewPCG(1, 1)).IntN
|
||||||
for _, structure := range test.structures {
|
for _, structure := range test.structures {
|
||||||
communityOf := make(map[int64]int)
|
communityOf := make(map[int64]int)
|
||||||
communities := make([][]graph.Node, len(structure.memberships))
|
communities := make([][]graph.Node, len(structure.memberships))
|
||||||
@@ -693,7 +693,7 @@ func testModularizeUndirected(t *testing.T, test communityUndirectedQTest, g gra
|
|||||||
)
|
)
|
||||||
// Modularize is randomised so we do this to
|
// Modularize is randomised so we do this to
|
||||||
// ensure the level tests are consistent.
|
// ensure the level tests are consistent.
|
||||||
src := rand.New(rand.NewSource(1))
|
src := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < louvainIterations; i++ {
|
for i := 0; i < louvainIterations; i++ {
|
||||||
r := Modularize(g, 1, src).(*ReducedUndirected)
|
r := Modularize(g, 1, src).(*ReducedUndirected)
|
||||||
if q := Q(r, nil, 1); q > bestQ || math.IsNaN(q) {
|
if q := Q(r, nil, 1); q > bestQ || math.IsNaN(q) {
|
||||||
@@ -793,7 +793,7 @@ func TestNonContiguousWeightedUndirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLouvain(b *testing.B) {
|
func BenchmarkLouvain(b *testing.B) {
|
||||||
src := rand.New(rand.NewSource(1))
|
src := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
Modularize(dupGraph, 1, src)
|
Modularize(dupGraph, 1, src)
|
||||||
}
|
}
|
||||||
|
@@ -6,23 +6,23 @@ package graph_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/graphs/gen"
|
"gonum.org/v1/gonum/graph/graphs/gen"
|
||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var complementTests = []struct {
|
var complementTests = []struct {
|
||||||
g graph.Graph
|
g graph.Graph
|
||||||
}{
|
}{
|
||||||
{g: gnp(100, 0, rand.NewSource(1))},
|
{g: gnp(100, 0, rand.NewPCG(1, 1))},
|
||||||
{g: gnp(100, 0.05, rand.NewSource(1))},
|
{g: gnp(100, 0.05, rand.NewPCG(1, 1))},
|
||||||
{g: gnp(100, 0.5, rand.NewSource(1))},
|
{g: gnp(100, 0.5, rand.NewPCG(1, 1))},
|
||||||
{g: gnp(100, 0.95, rand.NewSource(1))},
|
{g: gnp(100, 0.95, rand.NewPCG(1, 1))},
|
||||||
{g: gnp(100, 1, rand.NewSource(1))},
|
{g: gnp(100, 1, rand.NewPCG(1, 1))},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestComplement(t *testing.T) {
|
func TestComplement(t *testing.T) {
|
||||||
|
@@ -6,13 +6,13 @@ package dot
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/graphs/gen"
|
"gonum.org/v1/gonum/graph/graphs/gen"
|
||||||
"gonum.org/v1/gonum/graph/multi"
|
"gonum.org/v1/gonum/graph/multi"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -33,7 +33,7 @@ var (
|
|||||||
|
|
||||||
func gnpDirected(n int, p float64) graph.Directed {
|
func gnpDirected(n int, p float64) graph.Directed {
|
||||||
g := simple.NewDirectedGraph()
|
g := simple.NewDirectedGraph()
|
||||||
err := gen.Gnp(g, n, p, rand.NewSource(1))
|
err := gen.Gnp(g, n, p, rand.NewPCG(1, 1))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("dot: bad test: %v", err))
|
panic(fmt.Sprintf("dot: bad test: %v", err))
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ func gnpDirected(n int, p float64) graph.Directed {
|
|||||||
|
|
||||||
func powerLawMultiDirected(n, d int) graph.DirectedMultigraph {
|
func powerLawMultiDirected(n, d int) graph.DirectedMultigraph {
|
||||||
g := multi.NewDirectedGraph()
|
g := multi.NewDirectedGraph()
|
||||||
err := gen.PowerLaw(g, n, d, rand.NewSource(1))
|
err := gen.PowerLaw(g, n, d, rand.NewPCG(1, 1))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("dot: bad test: %v", err))
|
panic(fmt.Sprintf("dot: bad test: %v", err))
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -20,7 +21,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/graph/topo"
|
"gonum.org/v1/gonum/graph/topo"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var slta = flag.Bool("slta", false, "specify DominatorsSLT benchmark")
|
var slta = flag.Bool("slta", false, "specify DominatorsSLT benchmark")
|
||||||
@@ -165,7 +165,7 @@ func BenchmarkRandomGraphDominators(b *testing.B) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
g := test.g()
|
g := test.g()
|
||||||
|
|
||||||
// Guess a maximally expensive entry to the graph.
|
// Guess a maximally expensive entry to the graph.
|
||||||
@@ -177,7 +177,7 @@ func BenchmarkRandomGraphDominators(b *testing.B) {
|
|||||||
// in the first position of the error. Pick one
|
// in the first position of the error. Pick one
|
||||||
// of the nodes at random.
|
// of the nodes at random.
|
||||||
unordered := err.(topo.Unorderable)
|
unordered := err.(topo.Unorderable)
|
||||||
root = unordered[0][rnd.Intn(len(unordered[0]))]
|
root = unordered[0][rnd.IntN(len(unordered[0]))]
|
||||||
}
|
}
|
||||||
if root == nil {
|
if root == nil {
|
||||||
b.Error("no entry node label for graph")
|
b.Error("no entry node label for graph")
|
||||||
@@ -198,11 +198,11 @@ func BenchmarkRandomGraphDominators(b *testing.B) {
|
|||||||
for i, v := range sort[1:] {
|
for i, v := range sort[1:] {
|
||||||
u := sort[i]
|
u := sort[i]
|
||||||
if u == nil {
|
if u == nil {
|
||||||
u = unordered[ui][rnd.Intn(len(unordered[ui]))]
|
u = unordered[ui][rnd.IntN(len(unordered[ui]))]
|
||||||
ui++
|
ui++
|
||||||
}
|
}
|
||||||
if v == nil {
|
if v == nil {
|
||||||
v = unordered[ui][rnd.Intn(len(unordered[ui]))]
|
v = unordered[ui][rnd.IntN(len(unordered[ui]))]
|
||||||
}
|
}
|
||||||
if !g.HasEdgeFromTo(u.ID(), v.ID()) {
|
if !g.HasEdgeFromTo(u.ID(), v.ID()) {
|
||||||
g.SetEdge(g.NewEdge(u, v))
|
g.SetEdge(g.NewEdge(u, v))
|
||||||
@@ -225,7 +225,7 @@ func BenchmarkRandomGraphDominators(b *testing.B) {
|
|||||||
func gnm(n, m int) func() *simple.DirectedGraph {
|
func gnm(n, m int) func() *simple.DirectedGraph {
|
||||||
return func() *simple.DirectedGraph {
|
return func() *simple.DirectedGraph {
|
||||||
dg := simple.NewDirectedGraph()
|
dg := simple.NewDirectedGraph()
|
||||||
err := gen.Gnm(dg, n, m, rand.New(rand.NewSource(1)))
|
err := gen.Gnm(dg, n, m, rand.New(rand.NewPCG(1, 1)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@@ -238,13 +238,13 @@ func gnm(n, m int) func() *simple.DirectedGraph {
|
|||||||
func duplication(n int, delta, alpha, sigma float64) func() *simple.DirectedGraph {
|
func duplication(n int, delta, alpha, sigma float64) func() *simple.DirectedGraph {
|
||||||
return func() *simple.DirectedGraph {
|
return func() *simple.DirectedGraph {
|
||||||
g := undirected{simple.NewDirectedGraph()}
|
g := undirected{simple.NewDirectedGraph()}
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
err := gen.Duplication(g, n, delta, alpha, sigma, rnd)
|
err := gen.Duplication(g, n, delta, alpha, sigma, rnd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
for _, e := range graph.EdgesOf(g.Edges()) {
|
for _, e := range graph.EdgesOf(g.Edges()) {
|
||||||
if rnd.Intn(2) == 0 {
|
if rnd.IntN(2) == 0 {
|
||||||
g.RemoveEdge(e.From().ID(), e.To().ID())
|
g.RemoveEdge(e.From().ID(), e.To().ID())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,7 @@ package rdf_test
|
|||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -19,7 +20,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/graph/multi"
|
"gonum.org/v1/gonum/graph/multi"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func graphBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, _, _ float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
func graphBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, _, _ float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
||||||
@@ -88,10 +88,10 @@ func TestGraph(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -116,10 +116,10 @@ func TestGraph(t *testing.T) {
|
|||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
var lines []graph.Line
|
var lines []graph.Line
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -11,6 +11,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"hash"
|
"hash"
|
||||||
"io"
|
"io"
|
||||||
|
"math/rand/v2"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
@@ -19,8 +20,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -53,7 +52,7 @@ func TestIsoCanonicalHashes(t *testing.T) {
|
|||||||
for _, path := range glob {
|
for _, path := range glob {
|
||||||
name := filepath.Base(path)
|
name := filepath.Base(path)
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
src := rand.NewSource(seed)
|
src := rand.NewPCG(seed, seed)
|
||||||
|
|
||||||
f, err := os.Open(path)
|
f, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -6,12 +6,12 @@ package rdf
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
"math/rand/v2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var andTests = []struct {
|
var andTests = []struct {
|
||||||
@@ -52,7 +52,7 @@ var andTests = []struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestQueryAnd(t *testing.T) {
|
func TestQueryAnd(t *testing.T) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
for _, test := range andTests {
|
for _, test := range andTests {
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
a := Query{terms: permutedTerms(test.a, src)}
|
a := Query{terms: permutedTerms(test.a, src)}
|
||||||
@@ -108,7 +108,7 @@ var orTests = []struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestQueryOr(t *testing.T) {
|
func TestQueryOr(t *testing.T) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
for _, test := range orTests {
|
for _, test := range orTests {
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
a := Query{terms: permutedTerms(test.a, src)}
|
a := Query{terms: permutedTerms(test.a, src)}
|
||||||
@@ -164,7 +164,7 @@ var notTests = []struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestQueryNot(t *testing.T) {
|
func TestQueryNot(t *testing.T) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
for _, test := range notTests {
|
for _, test := range notTests {
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
a := Query{terms: permutedTerms(test.a, src)}
|
a := Query{terms: permutedTerms(test.a, src)}
|
||||||
@@ -271,7 +271,7 @@ var uniqueTests = []struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestQueryUnique(t *testing.T) {
|
func TestQueryUnique(t *testing.T) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
for _, test := range uniqueTests {
|
for _, test := range uniqueTests {
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
a := Query{terms: permutedTerms(test.in, src)}
|
a := Query{terms: permutedTerms(test.in, src)}
|
||||||
|
@@ -10,9 +10,9 @@ package gen
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Gnp constructs a Gilbert’s model subgraph in the destination, dst, of order n. Edges
|
// Gnp constructs a Gilbert’s model subgraph in the destination, dst, of order n. Edges
|
||||||
@@ -77,7 +77,7 @@ func Gnp(dst graph.Builder, n int, p float64, src rand.Source) error {
|
|||||||
|
|
||||||
// Gnm constructs a Erdős-Rényi model subgraph in the destination, dst, of
|
// Gnm constructs a Erdős-Rényi model subgraph in the destination, dst, of
|
||||||
// order n and size m. If src is not nil it is used as the random source,
|
// order n and size m. If src is not nil it is used as the random source,
|
||||||
// otherwise rand.Intn is used. The graph is constructed in O(m) expected
|
// otherwise rand.IntN is used. The graph is constructed in O(m) expected
|
||||||
// time for m ≤ (n choose 2)/2.
|
// time for m ≤ (n choose 2)/2.
|
||||||
func Gnm(dst GraphBuilder, n, m int, src rand.Source) error {
|
func Gnm(dst GraphBuilder, n, m int, src rand.Source) error {
|
||||||
if m == 0 {
|
if m == 0 {
|
||||||
@@ -101,9 +101,9 @@ func Gnm(dst GraphBuilder, n, m int, src rand.Source) error {
|
|||||||
|
|
||||||
var rnd func(int) int
|
var rnd func(int) int
|
||||||
if src == nil {
|
if src == nil {
|
||||||
rnd = rand.Intn
|
rnd = rand.IntN
|
||||||
} else {
|
} else {
|
||||||
rnd = rand.New(src).Intn
|
rnd = rand.New(src).IntN
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes := make([]graph.Node, n)
|
nodes := make([]graph.Node, n)
|
||||||
@@ -166,11 +166,11 @@ func SmallWorldsBB(dst GraphBuilder, n, d int, p float64, src rand.Source) error
|
|||||||
)
|
)
|
||||||
if src == nil {
|
if src == nil {
|
||||||
rnd = rand.Float64
|
rnd = rand.Float64
|
||||||
rndN = rand.Intn
|
rndN = rand.IntN
|
||||||
} else {
|
} else {
|
||||||
r := rand.New(src)
|
r := rand.New(src)
|
||||||
rnd = r.Float64
|
rnd = r.Float64
|
||||||
rndN = r.Intn
|
rndN = r.IntN
|
||||||
}
|
}
|
||||||
|
|
||||||
hasEdge := dst.HasEdgeBetween
|
hasEdge := dst.HasEdgeBetween
|
||||||
@@ -309,7 +309,7 @@ func edgeNodesFor(i int, nodes []graph.Node) (v, w graph.Node) {
|
|||||||
|
|
||||||
// PowerLaw constructs a power-law degree graph by preferential attachment in dst
|
// PowerLaw constructs a power-law degree graph by preferential attachment in dst
|
||||||
// with n nodes and minimum degree d. PowerLaw does not consider nodes in dst prior
|
// with n nodes and minimum degree d. PowerLaw does not consider nodes in dst prior
|
||||||
// to the call. If src is not nil it is used as the random source, otherwise rand.Intn
|
// to the call. If src is not nil it is used as the random source, otherwise rand.IntN
|
||||||
// is used.
|
// is used.
|
||||||
// The graph is constructed in O(nd) — O(n+m) — time.
|
// The graph is constructed in O(nd) — O(n+m) — time.
|
||||||
//
|
//
|
||||||
@@ -320,9 +320,9 @@ func PowerLaw(dst graph.MultigraphBuilder, n, d int, src rand.Source) error {
|
|||||||
}
|
}
|
||||||
var rnd func(int) int
|
var rnd func(int) int
|
||||||
if src == nil {
|
if src == nil {
|
||||||
rnd = rand.Intn
|
rnd = rand.IntN
|
||||||
} else {
|
} else {
|
||||||
rnd = rand.New(src).Intn
|
rnd = rand.New(src).IntN
|
||||||
}
|
}
|
||||||
|
|
||||||
m := make([]graph.Node, 2*n*d)
|
m := make([]graph.Node, 2*n*d)
|
||||||
@@ -345,7 +345,7 @@ func PowerLaw(dst graph.MultigraphBuilder, n, d int, src rand.Source) error {
|
|||||||
// BipartitePowerLaw constructs a bipartite power-law degree graph by preferential attachment
|
// BipartitePowerLaw constructs a bipartite power-law degree graph by preferential attachment
|
||||||
// in dst with 2×n nodes and minimum degree d. BipartitePowerLaw does not consider nodes in
|
// in dst with 2×n nodes and minimum degree d. BipartitePowerLaw does not consider nodes in
|
||||||
// dst prior to the call. The two partitions are returned in p1 and p2. If src is not nil it is
|
// dst prior to the call. The two partitions are returned in p1 and p2. If src is not nil it is
|
||||||
// used as the random source, otherwise rand.Intn is used.
|
// used as the random source, otherwise rand.IntN is used.
|
||||||
// The graph is constructed in O(nd) — O(n+m) — time.
|
// The graph is constructed in O(nd) — O(n+m) — time.
|
||||||
//
|
//
|
||||||
// The algorithm used is described in http://algo.uni-konstanz.de/publications/bb-eglrn-05.pdf
|
// The algorithm used is described in http://algo.uni-konstanz.de/publications/bb-eglrn-05.pdf
|
||||||
@@ -355,9 +355,9 @@ func BipartitePowerLaw(dst graph.MultigraphBuilder, n, d int, src rand.Source) (
|
|||||||
}
|
}
|
||||||
var rnd func(int) int
|
var rnd func(int) int
|
||||||
if src == nil {
|
if src == nil {
|
||||||
rnd = rand.Intn
|
rnd = rand.IntN
|
||||||
} else {
|
} else {
|
||||||
rnd = rand.New(src).Intn
|
rnd = rand.New(src).IntN
|
||||||
}
|
}
|
||||||
|
|
||||||
p := make([]graph.Node, 2*n)
|
p := make([]graph.Node, 2*n)
|
||||||
|
@@ -7,10 +7,10 @@ package gen
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// UndirectedMutator is an undirected graph builder that can remove edges.
|
// UndirectedMutator is an undirected graph builder that can remove edges.
|
||||||
@@ -47,11 +47,11 @@ func Duplication(dst UndirectedMutator, n int, delta, alpha, sigma float64, src
|
|||||||
)
|
)
|
||||||
if src == nil {
|
if src == nil {
|
||||||
rnd = rand.Float64
|
rnd = rand.Float64
|
||||||
rndN = rand.Intn
|
rndN = rand.IntN
|
||||||
} else {
|
} else {
|
||||||
r := rand.New(src)
|
r := rand.New(src)
|
||||||
rnd = r.Float64
|
rnd = r.Float64
|
||||||
rndN = r.Intn
|
rndN = r.IntN
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes := graph.NodesOf(dst.Nodes())
|
nodes := graph.NodesOf(dst.Nodes())
|
||||||
|
@@ -7,10 +7,10 @@ package gen
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/stat/sampleuv"
|
"gonum.org/v1/gonum/stat/sampleuv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ import (
|
|||||||
// additional edges joining existing nodes with probability proportional to the nodes'
|
// additional edges joining existing nodes with probability proportional to the nodes'
|
||||||
// degrees. The edges are formed as a triad with probability, p.
|
// degrees. The edges are formed as a triad with probability, p.
|
||||||
// If src is not nil it is used as the random source, otherwise rand.Float64 and
|
// If src is not nil it is used as the random source, otherwise rand.Float64 and
|
||||||
// rand.Intn are used for the random number generators.
|
// rand.IntN are used for the random number generators.
|
||||||
//
|
//
|
||||||
// The algorithm is essentially as described in http://arxiv.org/abs/cond-mat/0110452.
|
// The algorithm is essentially as described in http://arxiv.org/abs/cond-mat/0110452.
|
||||||
func TunableClusteringScaleFree(dst graph.UndirectedBuilder, n, m int, p float64, src rand.Source) error {
|
func TunableClusteringScaleFree(dst graph.UndirectedBuilder, n, m int, p float64, src rand.Source) error {
|
||||||
@@ -37,11 +37,11 @@ func TunableClusteringScaleFree(dst graph.UndirectedBuilder, n, m int, p float64
|
|||||||
)
|
)
|
||||||
if src == nil {
|
if src == nil {
|
||||||
rnd = rand.Float64
|
rnd = rand.Float64
|
||||||
rndN = rand.Intn
|
rndN = rand.IntN
|
||||||
} else {
|
} else {
|
||||||
r := rand.New(src)
|
r := rand.New(src)
|
||||||
rnd = r.Float64
|
rnd = r.Float64
|
||||||
rndN = r.Intn
|
rndN = r.IntN
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initial condition.
|
// Initial condition.
|
||||||
|
@@ -8,9 +8,9 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/stat/sampleuv"
|
"gonum.org/v1/gonum/stat/sampleuv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -6,9 +6,9 @@ package layout
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/spatial/barneshut"
|
"gonum.org/v1/gonum/spatial/barneshut"
|
||||||
"gonum.org/v1/gonum/spatial/r2"
|
"gonum.org/v1/gonum/spatial/r2"
|
||||||
)
|
)
|
||||||
|
@@ -5,12 +5,12 @@
|
|||||||
package layout_test
|
package layout_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/spatial/r2"
|
"gonum.org/v1/gonum/spatial/r2"
|
||||||
"gonum.org/v1/plot"
|
"gonum.org/v1/plot"
|
||||||
"gonum.org/v1/plot/vg"
|
"gonum.org/v1/plot/vg"
|
||||||
@@ -37,7 +37,7 @@ func TestEadesR2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return orderedGraph{g}
|
return orderedGraph{g}
|
||||||
}(),
|
}(),
|
||||||
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)},
|
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewPCG(1, 1)},
|
||||||
wantIters: 100,
|
wantIters: 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -55,7 +55,7 @@ func TestEadesR2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return orderedGraph{g}
|
return orderedGraph{g}
|
||||||
}(),
|
}(),
|
||||||
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)},
|
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewPCG(1, 1)},
|
||||||
wantIters: 100,
|
wantIters: 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -75,7 +75,7 @@ func TestEadesR2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return orderedGraph{g}
|
return orderedGraph{g}
|
||||||
}(),
|
}(),
|
||||||
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)},
|
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewPCG(1, 1)},
|
||||||
wantIters: 100,
|
wantIters: 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -101,7 +101,7 @@ func TestEadesR2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return orderedGraph{g}
|
return orderedGraph{g}
|
||||||
}(),
|
}(),
|
||||||
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)},
|
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewPCG(1, 1)},
|
||||||
wantIters: 100,
|
wantIters: 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -130,7 +130,7 @@ func TestEadesR2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return orderedGraph{g}
|
return orderedGraph{g}
|
||||||
}(),
|
}(),
|
||||||
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)},
|
param: EadesR2{Repulsion: 1, Rate: 0.1, Updates: 100, Theta: 0.1, Src: rand.NewPCG(1, 1)},
|
||||||
wantIters: 100,
|
wantIters: 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -161,7 +161,7 @@ func TestEadesR2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return orderedGraph{g}
|
return orderedGraph{g}
|
||||||
}(),
|
}(),
|
||||||
param: EadesR2{Repulsion: 1, Rate: 1, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)},
|
param: EadesR2{Repulsion: 1, Rate: 1, Updates: 100, Theta: 0.1, Src: rand.NewPCG(1, 1)},
|
||||||
wantIters: 96,
|
wantIters: 96,
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -191,7 +191,7 @@ func TestEadesR2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return orderedGraph{g}
|
return orderedGraph{g}
|
||||||
}(),
|
}(),
|
||||||
param: EadesR2{Repulsion: 1, Rate: 0.01, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)},
|
param: EadesR2{Repulsion: 1, Rate: 0.01, Updates: 100, Theta: 0.1, Src: rand.NewPCG(1, 1)},
|
||||||
wantIters: 100,
|
wantIters: 100,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ package multi_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
@@ -13,7 +14,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/graph/multi"
|
"gonum.org/v1/gonum/graph/multi"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func directedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, _, _ float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
func directedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, _, _ float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
||||||
@@ -86,10 +86,10 @@ func TestDirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -114,10 +114,10 @@ func TestDirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
var lines []graph.Line
|
var lines []graph.Line
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -6,6 +6,7 @@ package multi_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
@@ -13,7 +14,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/graph/multi"
|
"gonum.org/v1/gonum/graph/multi"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -91,10 +91,10 @@ func TestUndirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -119,10 +119,10 @@ func TestUndirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
var lines []graph.Line
|
var lines []graph.Line
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
package multi_test
|
package multi_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
@@ -12,7 +13,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/graph/multi"
|
"gonum.org/v1/gonum/graph/multi"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func weightedDirectedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, self, absent float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
func weightedDirectedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, self, absent float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
||||||
@@ -102,10 +102,10 @@ func TestWeightedDirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -131,10 +131,10 @@ func TestWeightedDirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
var lines []graph.Line
|
var lines []graph.Line
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
package multi_test
|
package multi_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
@@ -12,7 +13,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/iterator"
|
"gonum.org/v1/gonum/graph/iterator"
|
||||||
"gonum.org/v1/gonum/graph/multi"
|
"gonum.org/v1/gonum/graph/multi"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func weightedUndirectedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, self, absent float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
func weightedUndirectedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, self, absent float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
||||||
@@ -102,10 +102,10 @@ func TestWeightedUndirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -131,10 +131,10 @@ func TestWeightedUndirected(t *testing.T) {
|
|||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
var lines []graph.Line
|
var lines []graph.Line
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -6,10 +6,10 @@ package network
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/mat"
|
"gonum.org/v1/gonum/mat"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -6,10 +6,10 @@ package path
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// JohnsonAllPaths returns a shortest-path tree for shortest paths in the graph g.
|
// JohnsonAllPaths returns a shortest-path tree for shortest paths in the graph g.
|
||||||
@@ -32,7 +32,7 @@ func JohnsonAllPaths(g graph.Graph) (paths AllShortest, ok bool) {
|
|||||||
for {
|
for {
|
||||||
// Choose a random node ID until we find
|
// Choose a random node ID until we find
|
||||||
// one that is not in g.
|
// one that is not in g.
|
||||||
q = sign * rand.Int63()
|
q = sign * rand.Int64()
|
||||||
if _, exists := paths.indexOf[q]; !exists {
|
if _, exists := paths.indexOf[q]; !exists {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@@ -6,12 +6,12 @@ package path
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats/scalar"
|
"gonum.org/v1/gonum/floats/scalar"
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/mat"
|
"gonum.org/v1/gonum/mat"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -354,7 +354,7 @@ func (p ShortestAlts) To(vid int64) (path []graph.Node, weight float64, unique b
|
|||||||
var next int
|
var next int
|
||||||
if len(c) != 1 {
|
if len(c) != 1 {
|
||||||
unique = false
|
unique = false
|
||||||
next = c[rand.Intn(len(c))]
|
next = c[rand.IntN(len(c))]
|
||||||
} else {
|
} else {
|
||||||
next = c[0]
|
next = c[0]
|
||||||
}
|
}
|
||||||
@@ -382,7 +382,7 @@ func (p ShortestAlts) To(vid int64) (path []graph.Node, weight float64, unique b
|
|||||||
c := p.next[to]
|
c := p.next[to]
|
||||||
if len(c) != 1 {
|
if len(c) != 1 {
|
||||||
unique = false
|
unique = false
|
||||||
next = c[rand.Intn(len(c))]
|
next = c[rand.IntN(len(c))]
|
||||||
} else {
|
} else {
|
||||||
next = c[0]
|
next = c[0]
|
||||||
}
|
}
|
||||||
@@ -659,7 +659,7 @@ func (p AllShortest) Between(uid, vid int64) (path []graph.Node, weight float64,
|
|||||||
c := p.at(from, to)
|
c := p.at(from, to)
|
||||||
if len(c) != 1 {
|
if len(c) != 1 {
|
||||||
unique = false
|
unique = false
|
||||||
next = c[rand.Intn(len(c))]
|
next = c[rand.IntN(len(c))]
|
||||||
} else {
|
} else {
|
||||||
next = c[0]
|
next = c[0]
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,7 @@ package path
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"slices"
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -15,7 +16,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/graphs/gen"
|
"gonum.org/v1/gonum/graph/graphs/gen"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var shortestTests = []struct {
|
var shortestTests = []struct {
|
||||||
@@ -35,7 +35,7 @@ func TestShortestAlts(t *testing.T) {
|
|||||||
for _, test := range shortestTests {
|
for _, test := range shortestTests {
|
||||||
t.Run(fmt.Sprintf("AllTo_%d×%d|%v", test.n, test.d, test.p), func(t *testing.T) {
|
t.Run(fmt.Sprintf("AllTo_%d×%d|%v", test.n, test.d, test.p), func(t *testing.T) {
|
||||||
g := simple.NewDirectedGraph()
|
g := simple.NewDirectedGraph()
|
||||||
gen.SmallWorldsBB(g, test.n, test.d, test.p, rand.New(rand.NewSource(test.seed)))
|
gen.SmallWorldsBB(g, test.n, test.d, test.p, rand.New(rand.NewPCG(test.seed, test.seed)))
|
||||||
all := allShortest(DijkstraAllPaths(g))
|
all := allShortest(DijkstraAllPaths(g))
|
||||||
|
|
||||||
for uid := int64(0); uid < int64(test.n); uid++ {
|
for uid := int64(0); uid < int64(test.n); uid++ {
|
||||||
@@ -82,7 +82,7 @@ func TestAllShortest(t *testing.T) {
|
|||||||
for _, test := range shortestTests {
|
for _, test := range shortestTests {
|
||||||
t.Run(fmt.Sprintf("AllBetween_%d×%d|%v", test.n, test.d, test.p), func(t *testing.T) {
|
t.Run(fmt.Sprintf("AllBetween_%d×%d|%v", test.n, test.d, test.p), func(t *testing.T) {
|
||||||
g := simple.NewDirectedGraph()
|
g := simple.NewDirectedGraph()
|
||||||
gen.SmallWorldsBB(g, test.n, test.d, test.p, rand.New(rand.NewSource(test.seed)))
|
gen.SmallWorldsBB(g, test.n, test.d, test.p, rand.New(rand.NewPCG(test.seed, test.seed)))
|
||||||
|
|
||||||
p := DijkstraAllPaths(g)
|
p := DijkstraAllPaths(g)
|
||||||
for uid := int64(0); uid < int64(test.n); uid++ {
|
for uid := int64(0); uid < int64(test.n); uid++ {
|
||||||
@@ -221,7 +221,7 @@ var shortestBenchmarks = []struct {
|
|||||||
func BenchmarkShortestAlts(b *testing.B) {
|
func BenchmarkShortestAlts(b *testing.B) {
|
||||||
for _, bench := range shortestBenchmarks {
|
for _, bench := range shortestBenchmarks {
|
||||||
g := simple.NewDirectedGraph()
|
g := simple.NewDirectedGraph()
|
||||||
gen.SmallWorldsBB(g, bench.n, bench.d, bench.p, rand.New(rand.NewSource(bench.seed)))
|
gen.SmallWorldsBB(g, bench.n, bench.d, bench.p, rand.New(rand.NewPCG(bench.seed, bench.seed)))
|
||||||
|
|
||||||
// Find the widest path set.
|
// Find the widest path set.
|
||||||
var (
|
var (
|
||||||
@@ -282,7 +282,7 @@ func BenchmarkAllShortest(b *testing.B) {
|
|||||||
for _, bench := range shortestBenchmarks {
|
for _, bench := range shortestBenchmarks {
|
||||||
for _, f := range shortestPathAlgs {
|
for _, f := range shortestPathAlgs {
|
||||||
g := simple.NewDirectedGraph()
|
g := simple.NewDirectedGraph()
|
||||||
gen.SmallWorldsBB(g, bench.n, bench.d, bench.p, rand.New(rand.NewSource(bench.seed)))
|
gen.SmallWorldsBB(g, bench.n, bench.d, bench.p, rand.New(rand.NewPCG(bench.seed, bench.seed)))
|
||||||
p := f.fn(g)
|
p := f.fn(g)
|
||||||
|
|
||||||
// Find the widest path set.
|
// Find the widest path set.
|
||||||
|
@@ -7,13 +7,13 @@ package product
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/encoding/dot"
|
"gonum.org/v1/gonum/graph/encoding/dot"
|
||||||
"gonum.org/v1/gonum/graph/graphs/gen"
|
"gonum.org/v1/gonum/graph/graphs/gen"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (n Node) DOTID() string { return fmt.Sprintf("(%d,%d)", n.A.ID(), n.B.ID()) }
|
func (n Node) DOTID() string { return fmt.Sprintf("(%d,%d)", n.A.ID(), n.B.ID()) }
|
||||||
@@ -69,10 +69,10 @@ var productTests = []struct {
|
|||||||
{name: "paths", a: path(-1), b: path(1)},
|
{name: "paths", a: path(-1), b: path(1)},
|
||||||
{name: "wp_mp", a: path(-2), b: path(2)},
|
{name: "wp_mp", a: path(-2), b: path(2)},
|
||||||
{name: "wp_gp", a: left(), b: right()},
|
{name: "wp_gp", a: left(), b: right()},
|
||||||
{name: "gnp_2×2", a: gnp(2, 0.5, rand.NewSource(1)), b: gnp(2, 0.5, rand.NewSource(2))},
|
{name: "gnp_2×2", a: gnp(2, 0.5, rand.NewPCG(1, 1)), b: gnp(2, 0.5, rand.NewPCG(2, 2))},
|
||||||
{name: "gnp_2×3", a: gnp(2, 0.5, rand.NewSource(1)), b: gnp(3, 0.5, rand.NewSource(2))},
|
{name: "gnp_2×3", a: gnp(2, 0.5, rand.NewPCG(1, 1)), b: gnp(3, 0.5, rand.NewPCG(2, 2))},
|
||||||
{name: "gnp_3×3", a: gnp(3, 0.5, rand.NewSource(1)), b: gnp(3, 0.5, rand.NewSource(2))},
|
{name: "gnp_3×3", a: gnp(3, 0.5, rand.NewPCG(1, 1)), b: gnp(3, 0.5, rand.NewPCG(2, 2))},
|
||||||
{name: "gnp_4×4", a: gnp(4, 0.5, rand.NewSource(1)), b: gnp(4, 0.5, rand.NewSource(2))},
|
{name: "gnp_4×4", a: gnp(4, 0.5, rand.NewPCG(1, 1)), b: gnp(4, 0.5, rand.NewPCG(2, 2))},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCartesian(t *testing.T) {
|
func TestCartesian(t *testing.T) {
|
||||||
@@ -373,7 +373,7 @@ func BenchmarkProduct(b *testing.B) {
|
|||||||
} {
|
} {
|
||||||
for _, p := range []float64{0.05, 0.25, 0.5, 0.75, 0.95} {
|
for _, p := range []float64{0.05, 0.25, 0.5, 0.75, 0.95} {
|
||||||
for _, n := range bench.len {
|
for _, n := range bench.len {
|
||||||
src := rand.NewSource(uint64(seed))
|
src := rand.NewPCG(uint64(seed), uint64(seed))
|
||||||
b.Run(fmt.Sprintf("%s %d-%.2f", bench.name, n, p), func(b *testing.B) {
|
b.Run(fmt.Sprintf("%s %d-%.2f", bench.name, n, p), func(b *testing.B) {
|
||||||
g1 := gnp(n, p, src)
|
g1 := gnp(n, p, src)
|
||||||
g2 := gnp(n, p, src)
|
g2 := gnp(n, p, src)
|
||||||
|
@@ -7,13 +7,12 @@ package uid
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSetChurn(t *testing.T) {
|
func TestSetChurn(t *testing.T) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
set := NewSet()
|
set := NewSet()
|
||||||
|
|
||||||
@@ -29,7 +28,7 @@ func TestSetChurn(t *testing.T) {
|
|||||||
set.Use(id)
|
set.Use(id)
|
||||||
seen[id] = true
|
seen[id] = true
|
||||||
if rnd.Float64() < 0.01 {
|
if rnd.Float64() < 0.01 {
|
||||||
j := rnd.Intn(10)
|
j := rnd.IntN(10)
|
||||||
for id := range seen {
|
for id := range seen {
|
||||||
set.Release(id)
|
set.Release(id)
|
||||||
delete(seen, id)
|
delete(seen, id)
|
||||||
|
@@ -6,6 +6,7 @@ package simple_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
@@ -13,7 +14,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func isZeroContiguousSet(nodes []graph.Node) bool {
|
func isZeroContiguousSet(nodes []graph.Node) bool {
|
||||||
@@ -129,11 +129,11 @@ func TestDirectedMatrix(t *testing.T) {
|
|||||||
})
|
})
|
||||||
t.Run("RemoveEdges", func(t *testing.T) {
|
t.Run("RemoveEdges", func(t *testing.T) {
|
||||||
g := newEdgeShimDir{simple.NewDirectedMatrix(100, 0, 1, 0)}
|
g := newEdgeShimDir{simple.NewDirectedMatrix(100, 0, 1, 0)}
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
it := g.Nodes()
|
it := g.Nodes()
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -250,11 +250,11 @@ func TestDirectedMatrixFrom(t *testing.T) {
|
|||||||
})
|
})
|
||||||
t.Run("RemoveEdges", func(t *testing.T) {
|
t.Run("RemoveEdges", func(t *testing.T) {
|
||||||
g := newEdgeShimDir{simple.NewDirectedMatrixFrom(makeNodes(numNodes), 0, 1, 0)}
|
g := newEdgeShimDir{simple.NewDirectedMatrixFrom(makeNodes(numNodes), 0, 1, 0)}
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
it := g.Nodes()
|
it := g.Nodes()
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -380,11 +380,11 @@ func TestUnirectedMatrix(t *testing.T) {
|
|||||||
})
|
})
|
||||||
t.Run("RemoveEdges", func(t *testing.T) {
|
t.Run("RemoveEdges", func(t *testing.T) {
|
||||||
g := newEdgeShimUndir{simple.NewUndirectedMatrix(100, 0, 1, 0)}
|
g := newEdgeShimUndir{simple.NewUndirectedMatrix(100, 0, 1, 0)}
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
it := g.Nodes()
|
it := g.Nodes()
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -501,11 +501,11 @@ func TestUndirectedMatrixFrom(t *testing.T) {
|
|||||||
})
|
})
|
||||||
t.Run("RemoveEdges", func(t *testing.T) {
|
t.Run("RemoveEdges", func(t *testing.T) {
|
||||||
g := newEdgeShimUndir{simple.NewUndirectedMatrixFrom(makeNodes(numNodes), 0, 1, 0)}
|
g := newEdgeShimUndir{simple.NewUndirectedMatrixFrom(makeNodes(numNodes), 0, 1, 0)}
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
it := g.Nodes()
|
it := g.Nodes()
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -6,13 +6,13 @@ package simple_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func directedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, _, _ float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
func directedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, _, _ float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
||||||
@@ -91,10 +91,10 @@ func TestDirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -128,10 +128,10 @@ func TestDirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -6,13 +6,13 @@ package simple_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -96,10 +96,10 @@ func TestUndirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -133,10 +133,10 @@ func TestUndirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -6,13 +6,13 @@ package simple_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func weightedDirectedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, self, absent float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
func weightedDirectedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, self, absent float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
||||||
@@ -100,10 +100,10 @@ func TestWeightedDirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -139,10 +139,10 @@ func TestWeightedDirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -6,13 +6,13 @@ package simple_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/graph/testgraph"
|
"gonum.org/v1/gonum/graph/testgraph"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func weightedUndirectedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, self, absent float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
func weightedUndirectedBuilder(nodes []graph.Node, edges []testgraph.WeightedLine, self, absent float64) (g graph.Graph, n []graph.Node, e []testgraph.Edge, s, a float64, ok bool) {
|
||||||
@@ -116,10 +116,10 @@ func TestWeightedUndirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
@@ -139,10 +139,10 @@ func TestWeightedUndirected(t *testing.T) {
|
|||||||
g.AddNode(it.Node())
|
g.AddNode(it.Node())
|
||||||
}
|
}
|
||||||
it.Reset()
|
it.Reset()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
u := it.Node()
|
u := it.Node()
|
||||||
d := rnd.Intn(5)
|
d := rnd.IntN(5)
|
||||||
vit := g.Nodes()
|
vit := g.Nodes()
|
||||||
for d >= 0 && vit.Next() {
|
for d >= 0 && vit.Next() {
|
||||||
v := vit.Node()
|
v := vit.Node()
|
||||||
|
@@ -9,6 +9,7 @@ package testgraph // import "gonum.org/v1/gonum/graph/testgraph"
|
|||||||
import (
|
import (
|
||||||
"cmp"
|
"cmp"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"slices"
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -17,7 +18,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/internal/set"
|
"gonum.org/v1/gonum/graph/internal/set"
|
||||||
"gonum.org/v1/gonum/internal/order"
|
"gonum.org/v1/gonum/internal/order"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/mat"
|
"gonum.org/v1/gonum/mat"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1607,12 +1607,12 @@ func AddEdges(t *testing.T, n int, g EdgeAdder, newNode func(id int64) graph.Nod
|
|||||||
graph.Node
|
graph.Node
|
||||||
}
|
}
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
u := newNode(rnd.Int63n(int64(n)))
|
u := newNode(rnd.Int64N(int64(n)))
|
||||||
var v graph.Node
|
var v graph.Node
|
||||||
for {
|
for {
|
||||||
v = newNode(rnd.Int63n(int64(n)))
|
v = newNode(rnd.Int64N(int64(n)))
|
||||||
if g.Edge(u.ID(), v.ID()) != nil {
|
if g.Edge(u.ID(), v.ID()) != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -1674,12 +1674,12 @@ func AddWeightedEdges(t *testing.T, n int, g WeightedEdgeAdder, w float64, newNo
|
|||||||
graph.Node
|
graph.Node
|
||||||
}
|
}
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
u := newNode(rnd.Int63n(int64(n)))
|
u := newNode(rnd.Int64N(int64(n)))
|
||||||
var v graph.Node
|
var v graph.Node
|
||||||
for {
|
for {
|
||||||
v = newNode(rnd.Int63n(int64(n)))
|
v = newNode(rnd.Int64N(int64(n)))
|
||||||
if g.Edge(u.ID(), v.ID()) != nil {
|
if g.Edge(u.ID(), v.ID()) != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -1797,11 +1797,11 @@ func AddLines(t *testing.T, n int, g LineAdder, newNode func(id int64) graph.Nod
|
|||||||
graph.Node
|
graph.Node
|
||||||
}
|
}
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
seen := make(tripleInt64s)
|
seen := make(tripleInt64s)
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
u := newNode(rnd.Int63n(int64(n)))
|
u := newNode(rnd.Int64N(int64(n)))
|
||||||
v := newNode(rnd.Int63n(int64(n)))
|
v := newNode(rnd.Int64N(int64(n)))
|
||||||
prev := g.Lines(u.ID(), v.ID())
|
prev := g.Lines(u.ID(), v.ID())
|
||||||
l := g.NewLine(u, v)
|
l := g.NewLine(u, v)
|
||||||
if seen.has(u.ID(), v.ID(), l.ID()) {
|
if seen.has(u.ID(), v.ID(), l.ID()) {
|
||||||
@@ -1861,11 +1861,11 @@ func AddWeightedLines(t *testing.T, n int, g WeightedLineAdder, w float64, newNo
|
|||||||
graph.Node
|
graph.Node
|
||||||
}
|
}
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
seen := make(tripleInt64s)
|
seen := make(tripleInt64s)
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
u := newNode(rnd.Int63n(int64(n)))
|
u := newNode(rnd.Int64N(int64(n)))
|
||||||
v := newNode(rnd.Int63n(int64(n)))
|
v := newNode(rnd.Int64N(int64(n)))
|
||||||
prev := g.Lines(u.ID(), v.ID())
|
prev := g.Lines(u.ID(), v.ID())
|
||||||
l := g.NewWeightedLine(u, v, w)
|
l := g.NewWeightedLine(u, v, w)
|
||||||
if seen.has(u.ID(), v.ID(), l.ID()) {
|
if seen.has(u.ID(), v.ID(), l.ID()) {
|
||||||
@@ -2113,7 +2113,7 @@ func NewRandomNodes(n int, seed uint64, new func(id int64) graph.Node) *RandomNo
|
|||||||
seed: seed,
|
seed: seed,
|
||||||
newNode: new,
|
newNode: new,
|
||||||
|
|
||||||
state: rand.New(rand.NewSource(seed)),
|
state: rand.New(rand.NewPCG(seed, seed)),
|
||||||
seen: make(set.Ints[int64]),
|
seen: make(set.Ints[int64]),
|
||||||
count: 0,
|
count: 0,
|
||||||
}
|
}
|
||||||
@@ -2135,7 +2135,7 @@ func (n *RandomNodes) Next() bool {
|
|||||||
if n.state.Float64() < 0.5 {
|
if n.state.Float64() < 0.5 {
|
||||||
sign *= -1
|
sign *= -1
|
||||||
}
|
}
|
||||||
n.curr = sign * n.state.Int63()
|
n.curr = sign * n.state.Int64()
|
||||||
if !n.seen.Has(n.curr) {
|
if !n.seen.Has(n.curr) {
|
||||||
n.seen.Add(n.curr)
|
n.seen.Add(n.curr)
|
||||||
return true
|
return true
|
||||||
@@ -2154,7 +2154,7 @@ func (n *RandomNodes) Node() graph.Node {
|
|||||||
|
|
||||||
// Reset returns the iterator to its initial state.
|
// Reset returns the iterator to its initial state.
|
||||||
func (n *RandomNodes) Reset() {
|
func (n *RandomNodes) Reset() {
|
||||||
n.state = rand.New(rand.NewSource(n.seed))
|
n.state = rand.New(rand.NewPCG(n.seed, n.seed))
|
||||||
n.seen = make(set.Ints[int64])
|
n.seen = make(set.Ints[int64])
|
||||||
n.count = 0
|
n.count = 0
|
||||||
}
|
}
|
||||||
|
@@ -6,12 +6,12 @@ package topo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/graph"
|
"gonum.org/v1/gonum/graph"
|
||||||
"gonum.org/v1/gonum/graph/graphs/gen"
|
"gonum.org/v1/gonum/graph/graphs/gen"
|
||||||
"gonum.org/v1/gonum/graph/simple"
|
"gonum.org/v1/gonum/graph/simple"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -34,7 +34,7 @@ var (
|
|||||||
|
|
||||||
func gnpDirected(n int, p float64) graph.Directed {
|
func gnpDirected(n int, p float64) graph.Directed {
|
||||||
g := simple.NewDirectedGraph()
|
g := simple.NewDirectedGraph()
|
||||||
err := gen.Gnp(g, n, p, rand.NewSource(1))
|
err := gen.Gnp(g, n, p, rand.NewPCG(1, 1))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("topo: bad test: %v", err))
|
panic(fmt.Sprintf("topo: bad test: %v", err))
|
||||||
}
|
}
|
||||||
@@ -43,7 +43,7 @@ func gnpDirected(n int, p float64) graph.Directed {
|
|||||||
|
|
||||||
func gnpUndirected(n int, p float64) graph.Undirected {
|
func gnpUndirected(n int, p float64) graph.Undirected {
|
||||||
g := simple.NewUndirectedGraph()
|
g := simple.NewUndirectedGraph()
|
||||||
err := gen.Gnp(g, n, p, rand.NewSource(1))
|
err := gen.Gnp(g, n, p, rand.NewPCG(1, 1))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("topo: bad test: %v", err))
|
panic(fmt.Sprintf("topo: bad test: %v", err))
|
||||||
}
|
}
|
||||||
|
@@ -6,15 +6,15 @@ package integrate
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/integrate/testquad"
|
"gonum.org/v1/gonum/integrate/testquad"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSimpsons(t *testing.T) {
|
func TestSimpsons(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for i, test := range []struct {
|
for i, test := range []struct {
|
||||||
integral testquad.Integral
|
integral testquad.Integral
|
||||||
n int
|
n int
|
||||||
|
@@ -6,15 +6,15 @@ package integrate
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/integrate/testquad"
|
"gonum.org/v1/gonum/integrate/testquad"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTrapezoidal(t *testing.T) {
|
func TestTrapezoidal(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for i, test := range []struct {
|
for i, test := range []struct {
|
||||||
integral testquad.Integral
|
integral testquad.Integral
|
||||||
n int
|
n int
|
||||||
|
@@ -6,10 +6,10 @@ package f64_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats/scalar"
|
"gonum.org/v1/gonum/floats/scalar"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@@ -7,10 +7,10 @@ package f64_test
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
. "gonum.org/v1/gonum/internal/asm/f64"
|
. "gonum.org/v1/gonum/internal/asm/f64"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDotUnitary(t *testing.T) {
|
func TestDotUnitary(t *testing.T) {
|
||||||
|
@@ -6,11 +6,11 @@ package f64_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats/scalar"
|
"gonum.org/v1/gonum/floats/scalar"
|
||||||
. "gonum.org/v1/gonum/internal/asm/f64"
|
. "gonum.org/v1/gonum/internal/asm/f64"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var scalTests = []struct {
|
var scalTests = []struct {
|
||||||
@@ -100,7 +100,7 @@ func TestScalUnitary(t *testing.T) {
|
|||||||
|
|
||||||
func TestScalUnitaryTo(t *testing.T) {
|
func TestScalUnitaryTo(t *testing.T) {
|
||||||
const xGdVal, dstGdVal = -1, 0.5
|
const xGdVal, dstGdVal = -1, 0.5
|
||||||
rng := rand.New(rand.NewSource(42))
|
rng := rand.New(rand.NewPCG(42, 42))
|
||||||
for i, test := range scalTests {
|
for i, test := range scalTests {
|
||||||
n := len(test.x)
|
n := len(test.x)
|
||||||
for _, align := range align2 {
|
for _, align := range align2 {
|
||||||
@@ -155,7 +155,7 @@ func TestScalInc(t *testing.T) {
|
|||||||
func TestScalIncTo(t *testing.T) {
|
func TestScalIncTo(t *testing.T) {
|
||||||
const xGdVal, dstGdVal = -1, 0.5
|
const xGdVal, dstGdVal = -1, 0.5
|
||||||
gdLn := 4
|
gdLn := 4
|
||||||
rng := rand.New(rand.NewSource(42))
|
rng := rand.New(rand.NewPCG(42, 42))
|
||||||
for i, test := range scalTests {
|
for i, test := range scalTests {
|
||||||
n := len(test.x)
|
n := len(test.x)
|
||||||
for _, inc := range newIncSet(1, 2, 3, 4, 7, 10) {
|
for _, inc := range newIncSet(1, 2, 3, 4, 7, 10) {
|
||||||
|
@@ -6,8 +6,7 @@ package testrand
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// extreme is a pseudo-random number generator that has high probability of returning extreme values.
|
// extreme is a pseudo-random number generator that has high probability of returning extreme values.
|
||||||
@@ -28,12 +27,6 @@ func newExtreme(p, nan float64, rnd Rand) *extreme {
|
|||||||
// Perm returns a permutation of integers [0, n).
|
// Perm returns a permutation of integers [0, n).
|
||||||
func (e *extreme) Perm(n int) []int { return e.rnd.Perm(n) }
|
func (e *extreme) Perm(n int) []int { return e.rnd.Perm(n) }
|
||||||
|
|
||||||
// Read generates len(p) pseudo-random bytes.
|
|
||||||
func (e *extreme) Read(p []byte) (n int, err error) { return e.rnd.Read(p) }
|
|
||||||
|
|
||||||
// Seed reseeds the pseudo-random generator.
|
|
||||||
func (e *extreme) Seed(seed uint64) { e.rnd.Seed(seed) }
|
|
||||||
|
|
||||||
// Shuffle shuffles n items using the swap callback.
|
// Shuffle shuffles n items using the swap callback.
|
||||||
func (e *extreme) Shuffle(n int, swap func(i, j int)) { e.rnd.Shuffle(n, swap) }
|
func (e *extreme) Shuffle(n int, swap func(i, j int)) { e.rnd.Shuffle(n, swap) }
|
||||||
|
|
||||||
@@ -57,7 +50,7 @@ func (e *extreme) nan() bool {
|
|||||||
func (e *extreme) ExpFloat64() float64 {
|
func (e *extreme) ExpFloat64() float64 {
|
||||||
switch {
|
switch {
|
||||||
case e.p():
|
case e.p():
|
||||||
return extremeFloat64Exp[e.rnd.Intn(len(extremeFloat64Exp))]
|
return extremeFloat64Exp[e.rnd.IntN(len(extremeFloat64Exp))]
|
||||||
case e.nan():
|
case e.nan():
|
||||||
return math.NaN()
|
return math.NaN()
|
||||||
}
|
}
|
||||||
@@ -69,7 +62,7 @@ func (e *extreme) ExpFloat64() float64 {
|
|||||||
func (e *extreme) Float32() float32 {
|
func (e *extreme) Float32() float32 {
|
||||||
switch {
|
switch {
|
||||||
case e.p():
|
case e.p():
|
||||||
return extremeFloat32Unit[e.rnd.Intn(len(extremeFloat32Unit))]
|
return extremeFloat32Unit[e.rnd.IntN(len(extremeFloat32Unit))]
|
||||||
case e.nan():
|
case e.nan():
|
||||||
return float32(math.NaN())
|
return float32(math.NaN())
|
||||||
}
|
}
|
||||||
@@ -81,7 +74,7 @@ func (e *extreme) Float32() float32 {
|
|||||||
func (e *extreme) Float64() float64 {
|
func (e *extreme) Float64() float64 {
|
||||||
switch {
|
switch {
|
||||||
case e.p():
|
case e.p():
|
||||||
return extremeFloat64Unit[e.rnd.Intn(len(extremeFloat64Unit))]
|
return extremeFloat64Unit[e.rnd.IntN(len(extremeFloat64Unit))]
|
||||||
case e.nan():
|
case e.nan():
|
||||||
return math.NaN()
|
return math.NaN()
|
||||||
}
|
}
|
||||||
@@ -92,23 +85,23 @@ func (e *extreme) Float64() float64 {
|
|||||||
// Int returns a non-negative pseudo-random int.
|
// Int returns a non-negative pseudo-random int.
|
||||||
func (e *extreme) Int() int {
|
func (e *extreme) Int() int {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
return extremeInt[e.rnd.Intn(len(extremeInt))]
|
return extremeInt[e.rnd.IntN(len(extremeInt))]
|
||||||
}
|
}
|
||||||
return e.rnd.Int()
|
return e.rnd.Int()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int31 returns a non-negative pseudo-random int32.
|
// Int32 returns a non-negative pseudo-random int32.
|
||||||
func (e *extreme) Int31() int32 {
|
func (e *extreme) Int32() int32 {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
return extremeInt31[e.rnd.Intn(len(extremeInt31))]
|
return extremeInt31[e.rnd.IntN(len(extremeInt31))]
|
||||||
}
|
}
|
||||||
return e.rnd.Int31()
|
return e.rnd.Int32()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int31n returns a non-negative pseudo-random int32 from range [0, n).
|
// Int32N returns a non-negative pseudo-random int32 from range [0, n).
|
||||||
func (e *extreme) Int31n(n int32) int32 {
|
func (e *extreme) Int32N(n int32) int32 {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
switch rand.Intn(4) {
|
switch rand.IntN(4) {
|
||||||
case 0:
|
case 0:
|
||||||
return 0
|
return 0
|
||||||
case 1:
|
case 1:
|
||||||
@@ -119,21 +112,21 @@ func (e *extreme) Int31n(n int32) int32 {
|
|||||||
return n - 1
|
return n - 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return e.rnd.Int31n(n)
|
return e.rnd.Int32N(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int63 returns a non-negative pseudo-random int64.
|
// Int64 returns a non-negative pseudo-random int64.
|
||||||
func (e *extreme) Int63() int64 {
|
func (e *extreme) Int64() int64 {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
return extremeInt63[e.rnd.Intn(len(extremeInt63))]
|
return extremeInt63[e.rnd.IntN(len(extremeInt63))]
|
||||||
}
|
}
|
||||||
return e.rnd.Int63()
|
return e.rnd.Int64()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int63n returns a non-negative pseudo-random int from range [0, n).
|
// Int64N returns a non-negative pseudo-random int from range [0, n).
|
||||||
func (e *extreme) Int63n(n int64) int64 {
|
func (e *extreme) Int64N(n int64) int64 {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
switch rand.Intn(4) {
|
switch rand.IntN(4) {
|
||||||
case 0:
|
case 0:
|
||||||
return 0
|
return 0
|
||||||
case 1:
|
case 1:
|
||||||
@@ -144,13 +137,13 @@ func (e *extreme) Int63n(n int64) int64 {
|
|||||||
return n - 1
|
return n - 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return e.rnd.Int63n(n)
|
return e.rnd.Int64N(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int returns a non-negative pseudo-random int from range [0, n).
|
// IntN returns a non-negative pseudo-random int from range [0, n).
|
||||||
func (e *extreme) Intn(n int) int {
|
func (e *extreme) IntN(n int) int {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
switch rand.Intn(4) {
|
switch rand.IntN(4) {
|
||||||
case 0:
|
case 0:
|
||||||
return 0
|
return 0
|
||||||
case 1:
|
case 1:
|
||||||
@@ -161,14 +154,14 @@ func (e *extreme) Intn(n int) int {
|
|||||||
return n - 1
|
return n - 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return e.rnd.Intn(n)
|
return e.rnd.IntN(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NormFloat64 returns a normally distributed pseudo-random float64 in range [-math.MaxFloat64, math.MaxFloat64].
|
// NormFloat64 returns a normally distributed pseudo-random float64 in range [-math.MaxFloat64, math.MaxFloat64].
|
||||||
func (e *extreme) NormFloat64() float64 {
|
func (e *extreme) NormFloat64() float64 {
|
||||||
switch {
|
switch {
|
||||||
case e.p():
|
case e.p():
|
||||||
return extremeFloat64Norm[e.rnd.Intn(len(extremeFloat64Norm))]
|
return extremeFloat64Norm[e.rnd.IntN(len(extremeFloat64Norm))]
|
||||||
case e.nan():
|
case e.nan():
|
||||||
return math.NaN()
|
return math.NaN()
|
||||||
}
|
}
|
||||||
@@ -179,7 +172,7 @@ func (e *extreme) NormFloat64() float64 {
|
|||||||
// Uint32 returns a pseudo-random uint32.
|
// Uint32 returns a pseudo-random uint32.
|
||||||
func (e *extreme) Uint32() uint32 {
|
func (e *extreme) Uint32() uint32 {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
return extremeUint32[e.rnd.Intn(len(extremeUint32))]
|
return extremeUint32[e.rnd.IntN(len(extremeUint32))]
|
||||||
}
|
}
|
||||||
return e.rnd.Uint32()
|
return e.rnd.Uint32()
|
||||||
}
|
}
|
||||||
@@ -187,15 +180,15 @@ func (e *extreme) Uint32() uint32 {
|
|||||||
// Uint64 returns a pseudo-random uint64.
|
// Uint64 returns a pseudo-random uint64.
|
||||||
func (e *extreme) Uint64() uint64 {
|
func (e *extreme) Uint64() uint64 {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
return extremeUint64[e.rnd.Intn(len(extremeUint64))]
|
return extremeUint64[e.rnd.IntN(len(extremeUint64))]
|
||||||
}
|
}
|
||||||
return e.rnd.Uint64()
|
return e.rnd.Uint64()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint64n returns a pseudo-random uint64 from range [0, n).
|
// Uint64N returns a pseudo-random uint64 from range [0, n).
|
||||||
func (e *extreme) Uint64n(n uint64) uint64 {
|
func (e *extreme) Uint64N(n uint64) uint64 {
|
||||||
if e.p() {
|
if e.p() {
|
||||||
switch rand.Intn(4) {
|
switch rand.IntN(4) {
|
||||||
case 0:
|
case 0:
|
||||||
return 0
|
return 0
|
||||||
case 1:
|
case 1:
|
||||||
@@ -206,5 +199,5 @@ func (e *extreme) Uint64n(n uint64) uint64 {
|
|||||||
return n - 1
|
return n - 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return e.rnd.Uint64n(n)
|
return e.rnd.Uint64N(n)
|
||||||
}
|
}
|
||||||
|
@@ -6,13 +6,12 @@ package testrand
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestExtreme_NaN(t *testing.T) {
|
func TestExtreme_NaN(t *testing.T) {
|
||||||
src := rand.NewSource(1)
|
src := rand.NewPCG(1, 1)
|
||||||
rnd := rand.New(src)
|
rnd := rand.New(src)
|
||||||
ext := newExtreme(0, 1, rnd)
|
ext := newExtreme(0, 1, rnd)
|
||||||
|
|
||||||
|
@@ -7,8 +7,7 @@ package testrand
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
|
"math/rand/v2"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -25,25 +24,23 @@ type TB interface {
|
|||||||
// Source corresponds to the interface in golang.org/x/exp/rand.Source.
|
// Source corresponds to the interface in golang.org/x/exp/rand.Source.
|
||||||
type Source = rand.Source
|
type Source = rand.Source
|
||||||
|
|
||||||
// Rand corresponds to golang.org/x/exp/rand.Rand.
|
// Rand corresponds to math/rand/v2.Rand.
|
||||||
type Rand interface {
|
type Rand interface {
|
||||||
ExpFloat64() float64
|
ExpFloat64() float64
|
||||||
Float32() float32
|
Float32() float32
|
||||||
Float64() float64
|
Float64() float64
|
||||||
Int() int
|
Int() int
|
||||||
Int31() int32
|
Int32() int32
|
||||||
Int31n(n int32) int32
|
Int32N(n int32) int32
|
||||||
Int63() int64
|
Int64() int64
|
||||||
Int63n(n int64) int64
|
Int64N(n int64) int64
|
||||||
Intn(n int) int
|
IntN(n int) int
|
||||||
NormFloat64() float64
|
NormFloat64() float64
|
||||||
Perm(n int) []int
|
Perm(n int) []int
|
||||||
Read(p []byte) (n int, err error)
|
|
||||||
Seed(seed uint64)
|
|
||||||
Shuffle(n int, swap func(i, j int))
|
Shuffle(n int, swap func(i, j int))
|
||||||
Uint32() uint32
|
Uint32() uint32
|
||||||
Uint64() uint64
|
Uint64() uint64
|
||||||
Uint64n(n uint64) uint64
|
Uint64N(n uint64) uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new random number generator using the global flags.
|
// New returns a new random number generator using the global flags.
|
||||||
@@ -55,13 +52,13 @@ func New(tb TB) Rand {
|
|||||||
|
|
||||||
// Don't log the default case.
|
// Don't log the default case.
|
||||||
if seed == 1 && *extremeFlag == 0 && *nanFlag == 0 {
|
if seed == 1 && *extremeFlag == 0 && *nanFlag == 0 {
|
||||||
base := rand.New(rand.NewSource(seed))
|
base := rand.New(rand.NewPCG(seed, seed))
|
||||||
return base
|
return base
|
||||||
}
|
}
|
||||||
|
|
||||||
tb.Logf("seed=%d, prob=%.2f, nan=%.2f", seed, *extremeFlag, *nanFlag)
|
tb.Logf("seed=%d, prob=%.2f, nan=%.2f", seed, *extremeFlag, *nanFlag)
|
||||||
|
|
||||||
base := rand.New(rand.NewSource(seed))
|
base := rand.New(rand.NewPCG(seed, seed))
|
||||||
if *extremeFlag <= 0 && *nanFlag <= 0 {
|
if *extremeFlag <= 0 && *nanFlag <= 0 {
|
||||||
return base
|
return base
|
||||||
}
|
}
|
||||||
@@ -78,9 +75,9 @@ func NewSource(tb TB) Source {
|
|||||||
|
|
||||||
// Don't log the default case.
|
// Don't log the default case.
|
||||||
if seed == 1 {
|
if seed == 1 {
|
||||||
return rand.NewSource(seed)
|
return rand.NewPCG(seed, seed)
|
||||||
}
|
}
|
||||||
|
|
||||||
tb.Logf("seed %d", seed)
|
tb.Logf("seed %d", seed)
|
||||||
return rand.NewSource(seed)
|
return rand.NewPCG(seed, seed)
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ package testlapack
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -13,7 +14,6 @@ import (
|
|||||||
"gonum.org/v1/gonum/blas/blas64"
|
"gonum.org/v1/gonum/blas/blas64"
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/floats/scalar"
|
"gonum.org/v1/gonum/floats/scalar"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dbdsqrer interface {
|
type Dbdsqrer interface {
|
||||||
@@ -21,7 +21,7 @@ type Dbdsqrer interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DbdsqrTest(t *testing.T, impl Dbdsqrer) {
|
func DbdsqrTest(t *testing.T, impl Dbdsqrer) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
bi := blas64.Implementation()
|
bi := blas64.Implementation()
|
||||||
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
|
||||||
for _, test := range []struct {
|
for _, test := range []struct {
|
||||||
|
@@ -6,11 +6,11 @@ package testlapack
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/blas/blas64"
|
"gonum.org/v1/gonum/blas/blas64"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/lapack"
|
"gonum.org/v1/gonum/lapack"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,19 +19,19 @@ type Dgebaker interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DgebakTest(t *testing.T, impl Dgebaker) {
|
func DgebakTest(t *testing.T, impl Dgebaker) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
for _, job := range []lapack.BalanceJob{lapack.BalanceNone, lapack.Permute, lapack.Scale, lapack.PermuteScale} {
|
for _, job := range []lapack.BalanceJob{lapack.BalanceNone, lapack.Permute, lapack.Scale, lapack.PermuteScale} {
|
||||||
for _, side := range []lapack.EVSide{lapack.EVLeft, lapack.EVRight} {
|
for _, side := range []lapack.EVSide{lapack.EVLeft, lapack.EVRight} {
|
||||||
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 10, 18, 31, 53} {
|
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 10, 18, 31, 53} {
|
||||||
for _, extra := range []int{0, 11} {
|
for _, extra := range []int{0, 11} {
|
||||||
for cas := 0; cas < 100; cas++ {
|
for cas := 0; cas < 100; cas++ {
|
||||||
m := rnd.Intn(n + 1)
|
m := rnd.IntN(n + 1)
|
||||||
v := randomGeneral(n, m, m+extra, rnd)
|
v := randomGeneral(n, m, m+extra, rnd)
|
||||||
var ilo, ihi int
|
var ilo, ihi int
|
||||||
if v.Rows > 0 {
|
if v.Rows > 0 {
|
||||||
ihi = rnd.Intn(n)
|
ihi = rnd.IntN(n)
|
||||||
ilo = rnd.Intn(ihi + 1)
|
ilo = rnd.IntN(ihi + 1)
|
||||||
} else {
|
} else {
|
||||||
ihi = -1
|
ihi = -1
|
||||||
}
|
}
|
||||||
@@ -70,12 +70,12 @@ func testDgebak(t *testing.T, impl Dgebaker, job lapack.BalanceJob, side lapack.
|
|||||||
if job == lapack.Permute || job == lapack.PermuteScale {
|
if job == lapack.Permute || job == lapack.PermuteScale {
|
||||||
// Make up some random permutations.
|
// Make up some random permutations.
|
||||||
for i := n - 1; i > ihi; i-- {
|
for i := n - 1; i > ihi; i-- {
|
||||||
scale[i] = float64(rnd.Intn(i + 1))
|
scale[i] = float64(rnd.IntN(i + 1))
|
||||||
blas64.Swap(blas64.Vector{N: n, Data: p.Data[i:], Inc: p.Stride},
|
blas64.Swap(blas64.Vector{N: n, Data: p.Data[i:], Inc: p.Stride},
|
||||||
blas64.Vector{N: n, Data: p.Data[int(scale[i]):], Inc: p.Stride})
|
blas64.Vector{N: n, Data: p.Data[int(scale[i]):], Inc: p.Stride})
|
||||||
}
|
}
|
||||||
for i := 0; i < ilo; i++ {
|
for i := 0; i < ilo; i++ {
|
||||||
scale[i] = float64(i + rnd.Intn(ihi-i+1))
|
scale[i] = float64(i + rnd.IntN(ihi-i+1))
|
||||||
blas64.Swap(blas64.Vector{N: n, Data: p.Data[i:], Inc: p.Stride},
|
blas64.Swap(blas64.Vector{N: n, Data: p.Data[i:], Inc: p.Stride},
|
||||||
blas64.Vector{N: n, Data: p.Data[int(scale[i]):], Inc: p.Stride})
|
blas64.Vector{N: n, Data: p.Data[int(scale[i]):], Inc: p.Stride})
|
||||||
}
|
}
|
||||||
|
@@ -6,11 +6,11 @@ package testlapack
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/blas/blas64"
|
"gonum.org/v1/gonum/blas/blas64"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/lapack"
|
"gonum.org/v1/gonum/lapack"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ type Dgebaler interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DgebalTest(t *testing.T, impl Dgebaler) {
|
func DgebalTest(t *testing.T, impl Dgebaler) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
for _, job := range []lapack.BalanceJob{lapack.BalanceNone, lapack.Permute, lapack.Scale, lapack.PermuteScale} {
|
for _, job := range []lapack.BalanceJob{lapack.BalanceNone, lapack.Permute, lapack.Scale, lapack.PermuteScale} {
|
||||||
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 10, 18, 31, 53, 100} {
|
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 10, 18, 31, 53, 100} {
|
||||||
|
@@ -5,9 +5,8 @@
|
|||||||
package testlapack
|
package testlapack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dgebd2er interface {
|
type Dgebd2er interface {
|
||||||
@@ -15,7 +14,7 @@ type Dgebd2er interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Dgebd2Test(t *testing.T, impl Dgebd2er) {
|
func Dgebd2Test(t *testing.T, impl Dgebd2er) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, test := range []struct {
|
for _, test := range []struct {
|
||||||
m, n, lda int
|
m, n, lda int
|
||||||
}{
|
}{
|
||||||
|
@@ -6,10 +6,10 @@ package testlapack
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dgebrder interface {
|
type Dgebrder interface {
|
||||||
@@ -18,7 +18,7 @@ type Dgebrder interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DgebrdTest(t *testing.T, impl Dgebrder) {
|
func DgebrdTest(t *testing.T, impl Dgebrder) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, test := range []struct {
|
for _, test := range []struct {
|
||||||
m, n, lda int
|
m, n, lda int
|
||||||
}{
|
}{
|
||||||
|
@@ -7,10 +7,10 @@ package testlapack
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/lapack"
|
"gonum.org/v1/gonum/lapack"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ type Dgeconer interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DgeconTest(t *testing.T, impl Dgeconer) {
|
func DgeconTest(t *testing.T, impl Dgeconer) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, n := range []int{0, 1, 2, 3, 4, 5, 10, 50} {
|
for _, n := range []int{0, 1, 2, 3, 4, 5, 10, 50} {
|
||||||
for _, lda := range []int{max(1, n), n + 3} {
|
for _, lda := range []int{max(1, n), n + 3} {
|
||||||
dgeconTest(t, impl, rnd, n, lda)
|
dgeconTest(t, impl, rnd, n, lda)
|
||||||
|
@@ -8,12 +8,12 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"math/cmplx"
|
"math/cmplx"
|
||||||
|
"math/rand/v2"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/blas/blas64"
|
"gonum.org/v1/gonum/blas/blas64"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/lapack"
|
"gonum.org/v1/gonum/lapack"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ type dgeevTest struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DgeevTest(t *testing.T, impl Dgeever) {
|
func DgeevTest(t *testing.T, impl Dgeever) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
for i, test := range []dgeevTest{
|
for i, test := range []dgeevTest{
|
||||||
{
|
{
|
||||||
@@ -488,7 +488,7 @@ func DgeevTest(t *testing.T, impl Dgeever) {
|
|||||||
re := rnd.NormFloat64()
|
re := rnd.NormFloat64()
|
||||||
if i == n-1 || rnd.Float64() < 0.5 {
|
if i == n-1 || rnd.Float64() < 0.5 {
|
||||||
// Real eigenvalue.
|
// Real eigenvalue.
|
||||||
nb := rnd.Intn(min(4, n-i)) + 1
|
nb := rnd.IntN(min(4, n-i)) + 1
|
||||||
for k := 0; k < nb; k++ {
|
for k := 0; k < nb; k++ {
|
||||||
tmat.Data[i*tmat.Stride+i] = re
|
tmat.Data[i*tmat.Stride+i] = re
|
||||||
ev[i] = complex(re, 0)
|
ev[i] = complex(re, 0)
|
||||||
@@ -498,7 +498,7 @@ func DgeevTest(t *testing.T, impl Dgeever) {
|
|||||||
}
|
}
|
||||||
// Complex eigenvalue.
|
// Complex eigenvalue.
|
||||||
im := rnd.NormFloat64()
|
im := rnd.NormFloat64()
|
||||||
nb := rnd.Intn(min(4, (n-i)/2)) + 1
|
nb := rnd.IntN(min(4, (n-i)/2)) + 1
|
||||||
for k := 0; k < nb; k++ {
|
for k := 0; k < nb; k++ {
|
||||||
// 2×2 block for the complex eigenvalue.
|
// 2×2 block for the complex eigenvalue.
|
||||||
tmat.Data[i*tmat.Stride+i] = re
|
tmat.Data[i*tmat.Stride+i] = re
|
||||||
|
@@ -5,16 +5,16 @@
|
|||||||
package testlapack
|
package testlapack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas/blas64"
|
"gonum.org/v1/gonum/blas/blas64"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
"gonum.org/v1/gonum/lapack"
|
"gonum.org/v1/gonum/lapack"
|
||||||
)
|
)
|
||||||
|
|
||||||
func DgeevBenchmark(b *testing.B, impl Dgeever) {
|
func DgeevBenchmark(b *testing.B, impl Dgeever) {
|
||||||
var resultGeneral blas64.General
|
var resultGeneral blas64.General
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
benchmarks := []struct {
|
benchmarks := []struct {
|
||||||
name string
|
name string
|
||||||
a blas64.General
|
a blas64.General
|
||||||
|
@@ -7,11 +7,11 @@ package testlapack
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/blas/blas64"
|
"gonum.org/v1/gonum/blas/blas64"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dgehd2er interface {
|
type Dgehd2er interface {
|
||||||
@@ -19,7 +19,7 @@ type Dgehd2er interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Dgehd2Test(t *testing.T, impl Dgehd2er) {
|
func Dgehd2Test(t *testing.T, impl Dgehd2er) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for _, n := range []int{1, 2, 3, 4, 5, 7, 10, 30} {
|
for _, n := range []int{1, 2, 3, 4, 5, 7, 10, 30} {
|
||||||
for _, extra := range []int{0, 1, 13} {
|
for _, extra := range []int{0, 1, 13} {
|
||||||
for cas := 0; cas < 100; cas++ {
|
for cas := 0; cas < 100; cas++ {
|
||||||
@@ -32,8 +32,8 @@ func Dgehd2Test(t *testing.T, impl Dgehd2er) {
|
|||||||
func testDgehd2(t *testing.T, impl Dgehd2er, n, extra int, rnd *rand.Rand) {
|
func testDgehd2(t *testing.T, impl Dgehd2er, n, extra int, rnd *rand.Rand) {
|
||||||
const tol = 1e-14
|
const tol = 1e-14
|
||||||
|
|
||||||
ilo := rnd.Intn(n)
|
ilo := rnd.IntN(n)
|
||||||
ihi := rnd.Intn(n)
|
ihi := rnd.IntN(n)
|
||||||
if ilo > ihi {
|
if ilo > ihi {
|
||||||
ilo, ihi = ihi, ilo
|
ilo, ihi = ihi, ilo
|
||||||
}
|
}
|
||||||
|
@@ -7,11 +7,11 @@ package testlapack
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/blas/blas64"
|
"gonum.org/v1/gonum/blas/blas64"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dgehrder interface {
|
type Dgehrder interface {
|
||||||
@@ -21,7 +21,7 @@ type Dgehrder interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func DgehrdTest(t *testing.T, impl Dgehrder) {
|
func DgehrdTest(t *testing.T, impl Dgehrder) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
|
|
||||||
// Randomized tests for small matrix sizes that will most likely
|
// Randomized tests for small matrix sizes that will most likely
|
||||||
// use the unblocked algorithm.
|
// use the unblocked algorithm.
|
||||||
@@ -29,8 +29,8 @@ func DgehrdTest(t *testing.T, impl Dgehrder) {
|
|||||||
for _, extra := range []int{0, 13} {
|
for _, extra := range []int{0, 13} {
|
||||||
for _, optwork := range []bool{true, false} {
|
for _, optwork := range []bool{true, false} {
|
||||||
for cas := 0; cas < 10; cas++ {
|
for cas := 0; cas < 10; cas++ {
|
||||||
ilo := rnd.Intn(n)
|
ilo := rnd.IntN(n)
|
||||||
ihi := rnd.Intn(n)
|
ihi := rnd.IntN(n)
|
||||||
if ilo > ihi {
|
if ilo > ihi {
|
||||||
ilo, ihi = ihi, ilo
|
ilo, ihi = ihi, ilo
|
||||||
}
|
}
|
||||||
|
@@ -5,12 +5,12 @@
|
|||||||
package testlapack
|
package testlapack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gonum.org/v1/gonum/blas"
|
"gonum.org/v1/gonum/blas"
|
||||||
"gonum.org/v1/gonum/blas/blas64"
|
"gonum.org/v1/gonum/blas/blas64"
|
||||||
"gonum.org/v1/gonum/floats"
|
"gonum.org/v1/gonum/floats"
|
||||||
"gonum.org/v1/gonum/internal/rand"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dgelq2er interface {
|
type Dgelq2er interface {
|
||||||
@@ -20,7 +20,7 @@ type Dgelq2er interface {
|
|||||||
func Dgelq2Test(t *testing.T, impl Dgelq2er) {
|
func Dgelq2Test(t *testing.T, impl Dgelq2er) {
|
||||||
const tol = 1e-14
|
const tol = 1e-14
|
||||||
|
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewPCG(1, 1))
|
||||||
for c, test := range []struct {
|
for c, test := range []struct {
|
||||||
m, n, lda int
|
m, n, lda int
|
||||||
}{
|
}{
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user