From cf3307fa63eedaa45a128d528c243ee7d10e82d9 Mon Sep 17 00:00:00 2001 From: Dan Kortschak Date: Thu, 15 Aug 2024 14:45:05 +0930 Subject: [PATCH] all: partially migrate to math/rand/v2 This is not intended to be a completed transition since it leaves the libraries unusable to external client code, but rather as a step towards use of math/rand/v2. This initial step allows repair of sequence change failures without having to worry about API difference. --- blas/gonum/level1cmplx128_bench_test.go | 2 +- blas/gonum/level1float64_bench_test.go | 3 +- blas/gonum/level2cmplx128_bench_test.go | 3 +- blas/gonum/pardgemm_test.go | 3 +- .../autogen_bench_level1double.go | 3 +- blas/testblas/common.go | 3 +- blas/testblas/common_test.go | 3 +- blas/testblas/dgemmbench.go | 3 +- blas/testblas/dtrmvbench.go | 3 +- blas/testblas/dtrsm.go | 3 +- blas/testblas/dzasum.go | 3 +- blas/testblas/dznrm2.go | 3 +- blas/testblas/izamax.go | 2 +- blas/testblas/level2bench.go | 3 +- blas/testblas/zcopy.go | 2 +- blas/testblas/zgbmv.go | 2 +- blas/testblas/zgemm.go | 2 +- blas/testblas/zhbmv.go | 2 +- blas/testblas/zhemm.go | 3 +- blas/testblas/zher2k.go | 2 +- blas/testblas/zherk.go | 3 +- blas/testblas/zswap.go | 2 +- blas/testblas/zsymm.go | 3 +- blas/testblas/zsyr2k.go | 3 +- blas/testblas/zsyrk.go | 3 +- blas/testblas/ztbmv.go | 2 +- blas/testblas/ztbsv.go | 2 +- blas/testblas/ztpsv.go | 2 +- blas/testblas/ztrmm.go | 3 +- blas/testblas/ztrsm.go | 5 +- blas/testblas/ztrsv.go | 2 +- cmplxs/cmplxs_test.go | 3 +- diff/fd/gradient_test.go | 3 +- diff/fd/jacobian_test.go | 3 +- dsp/fourier/fourier_test.go | 3 +- dsp/fourier/radix24_test.go | 3 +- floats/floats_test.go | 3 +- graph/coloring/coloring.go | 3 +- graph/coloring/coloring_test.go | 3 +- graph/community/bisect.go | 3 +- graph/community/bisect_example_test.go | 5 +- graph/community/louvain_common.go | 3 +- graph/community/louvain_directed.go | 3 +- graph/community/louvain_directed_multiplex.go | 3 +- .../louvain_directed_multiplex_test.go | 3 +- graph/community/louvain_directed_test.go | 48 ++- graph/community/louvain_test.go | 3 +- graph/community/louvain_undirected.go | 3 +- .../community/louvain_undirected_multiplex.go | 3 +- .../louvain_undirected_multiplex_test.go | 3 +- graph/community/louvain_undirected_test.go | 50 ++- graph/complement_test.go | 3 +- graph/encoding/dot/bench_test.go | 3 +- graph/flow/control_flow_bench_test.go | 3 +- graph/formats/rdf/graph_test.go | 3 +- graph/formats/rdf/iso_canonical_test.go | 2 +- graph/formats/rdf/query_test.go | 3 +- graph/graphs/gen/batagelj_brandes.go | 3 +- graph/graphs/gen/duplication.go | 3 +- graph/graphs/gen/holme_kim.go | 3 +- graph/graphs/gen/small_world.go | 3 +- graph/layout/eades.go | 3 +- graph/layout/eades_test.go | 7 +- graph/layout/testdata/sheet_golden.png | Bin 23819 -> 24154 bytes graph/layout/testdata/square_golden.png | Bin 16206 -> 17956 bytes graph/layout/testdata/tetrahedron_golden.png | Bin 22864 -> 21250 bytes graph/layout/testdata/tube-steep_golden.png | Bin 23271 -> 13362 bytes graph/layout/testdata/tube_golden.png | Bin 28423 -> 26664 bytes graph/layout/testdata/wp_page_golden.png | Bin 27027 -> 26915 bytes graph/multi/directed_test.go | 3 +- graph/multi/undirected_test.go | 3 +- graph/multi/weighted_directed_test.go | 3 +- graph/multi/weighted_undirected_test.go | 3 +- graph/network/page.go | 3 +- graph/path/johnson_apsp.go | 3 +- graph/path/shortest.go | 3 +- graph/path/shortest_test.go | 3 +- graph/product/product_test.go | 3 +- graph/set/uid/uid_test.go | 2 +- graph/simple/densegraph_test.go | 3 +- graph/simple/directed_test.go | 3 +- graph/simple/undirected_test.go | 3 +- graph/simple/weighted_directed_test.go | 3 +- graph/simple/weighted_undirected_test.go | 3 +- graph/testgraph/testgraph.go | 9 +- graph/testgraph/testgraph_test.go | 20 +- graph/topo/bench_test.go | 3 +- integrate/simpsons_test.go | 3 +- integrate/trapezoidal_test.go | 3 +- internal/asm/f64/asm_test.go | 3 +- internal/asm/f64/dot_test.go | 3 +- internal/asm/f64/scal_test.go | 3 +- internal/rand/rand.go | 393 ++++++++++++++++++ internal/rand/rand_test.go | 368 ++++++++++++++++ internal/rand/staticcheck.conf | 1 + internal/testrand/extreme.go | 2 +- internal/testrand/extreme_test.go | 2 +- internal/testrand/rand.go | 2 +- lapack/testlapack/dbdsqr.go | 3 +- lapack/testlapack/dgebak.go | 3 +- lapack/testlapack/dgebal.go | 3 +- lapack/testlapack/dgebd2.go | 2 +- lapack/testlapack/dgebrd.go | 3 +- lapack/testlapack/dgecon.go | 3 +- lapack/testlapack/dgeev.go | 3 +- lapack/testlapack/dgeev_bench.go | 3 +- lapack/testlapack/dgehd2.go | 3 +- lapack/testlapack/dgehrd.go | 3 +- lapack/testlapack/dgelq2.go | 3 +- lapack/testlapack/dgelqf.go | 3 +- lapack/testlapack/dgels.go | 3 +- lapack/testlapack/dgeql2.go | 3 +- lapack/testlapack/dgeqp3.go | 3 +- lapack/testlapack/dgeqr2.go | 3 +- lapack/testlapack/dgeqrf.go | 3 +- lapack/testlapack/dgerq2.go | 3 +- lapack/testlapack/dgerqf.go | 3 +- lapack/testlapack/dgesc2.go | 3 +- lapack/testlapack/dgesv.go | 3 +- lapack/testlapack/dgesvd.go | 3 +- lapack/testlapack/dgetc2.go | 3 +- lapack/testlapack/dgetf2.go | 3 +- lapack/testlapack/dgetrf.go | 2 +- lapack/testlapack/dgetri.go | 3 +- lapack/testlapack/dgetrs.go | 3 +- lapack/testlapack/dgghrd.go | 3 +- lapack/testlapack/dggsvd3.go | 3 +- lapack/testlapack/dggsvp3.go | 3 +- lapack/testlapack/dgtsv.go | 3 +- lapack/testlapack/dlabrd.go | 2 +- lapack/testlapack/dlacn2.go | 3 +- lapack/testlapack/dlacpy.go | 3 +- lapack/testlapack/dlaev2.go | 2 +- lapack/testlapack/dlaexc.go | 3 +- lapack/testlapack/dlag2.go | 3 +- lapack/testlapack/dlags2.go | 3 +- lapack/testlapack/dlagtm.go | 3 +- lapack/testlapack/dlahqr.go | 3 +- lapack/testlapack/dlahr2.go | 3 +- lapack/testlapack/dlaln2.go | 2 +- lapack/testlapack/dlangb.go | 3 +- lapack/testlapack/dlangb_bench.go | 3 +- lapack/testlapack/dlange.go | 3 +- lapack/testlapack/dlangt.go | 3 +- lapack/testlapack/dlanhs.go | 3 +- lapack/testlapack/dlansb.go | 3 +- lapack/testlapack/dlanst.go | 3 +- lapack/testlapack/dlansy.go | 3 +- lapack/testlapack/dlantb.go | 3 +- lapack/testlapack/dlantb_bench.go | 3 +- lapack/testlapack/dlantr.go | 3 +- lapack/testlapack/dlanv2.go | 2 +- lapack/testlapack/dlapll.go | 3 +- lapack/testlapack/dlapmr.go | 2 +- lapack/testlapack/dlapy2.go | 3 +- lapack/testlapack/dlaqp2.go | 3 +- lapack/testlapack/dlaqps.go | 3 +- lapack/testlapack/dlaqr04.go | 3 +- lapack/testlapack/dlaqr1.go | 3 +- lapack/testlapack/dlaqr23.go | 3 +- lapack/testlapack/dlaqr5.go | 3 +- lapack/testlapack/dlaqr5_bench.go | 2 +- lapack/testlapack/dlarf.go | 3 +- lapack/testlapack/dlarfb.go | 3 +- lapack/testlapack/dlarfg.go | 3 +- lapack/testlapack/dlarft.go | 3 +- lapack/testlapack/dlarfx.go | 3 +- lapack/testlapack/dlascl.go | 3 +- lapack/testlapack/dlaset.go | 3 +- lapack/testlapack/dlasq1.go | 3 +- lapack/testlapack/dlasq2.go | 2 +- lapack/testlapack/dlasr.go | 3 +- lapack/testlapack/dlassq.go | 3 +- lapack/testlapack/dlasv2.go | 3 +- lapack/testlapack/dlasy2.go | 3 +- lapack/testlapack/dlatbs.go | 2 +- lapack/testlapack/dlatrd.go | 3 +- lapack/testlapack/dlatrs.go | 3 +- lapack/testlapack/dlauu2.go | 3 +- lapack/testlapack/dorg2l.go | 3 +- lapack/testlapack/dorg2r.go | 3 +- lapack/testlapack/dorgbr.go | 3 +- lapack/testlapack/dorghr.go | 3 +- lapack/testlapack/dorgl2.go | 3 +- lapack/testlapack/dorglq.go | 3 +- lapack/testlapack/dorgql.go | 3 +- lapack/testlapack/dorgqr.go | 3 +- lapack/testlapack/dorgr2.go | 3 +- lapack/testlapack/dorgtr.go | 5 +- lapack/testlapack/dorm2r.go | 3 +- lapack/testlapack/dormbr.go | 3 +- lapack/testlapack/dormhr.go | 3 +- lapack/testlapack/dorml2.go | 3 +- lapack/testlapack/dormlq.go | 3 +- lapack/testlapack/dormqr.go | 3 +- lapack/testlapack/dormr2.go | 3 +- lapack/testlapack/dpbcon.go | 2 +- lapack/testlapack/dpbtf2.go | 3 +- lapack/testlapack/dpbtrf.go | 3 +- lapack/testlapack/dpbtrs.go | 3 +- lapack/testlapack/dpocon.go | 3 +- lapack/testlapack/dpotrf.go | 3 +- lapack/testlapack/dpotri.go | 3 +- lapack/testlapack/dpotrs.go | 3 +- lapack/testlapack/dpstf2.go | 3 +- lapack/testlapack/dpstrf.go | 3 +- lapack/testlapack/dptcon.go | 3 +- lapack/testlapack/dptsv.go | 2 +- lapack/testlapack/dpttrf.go | 3 +- lapack/testlapack/dpttrs.go | 2 +- lapack/testlapack/dsteqr.go | 3 +- lapack/testlapack/dsterf.go | 3 +- lapack/testlapack/dsyev.go | 3 +- lapack/testlapack/dsytd2.go | 3 +- lapack/testlapack/dsytrd.go | 3 +- lapack/testlapack/dtbtrs.go | 3 +- lapack/testlapack/dtgsja.go | 3 +- lapack/testlapack/dtrcon.go | 3 +- lapack/testlapack/dtrevc3.go | 3 +- lapack/testlapack/dtrexc.go | 3 +- lapack/testlapack/dtrti2.go | 3 +- lapack/testlapack/dtrtri.go | 3 +- lapack/testlapack/dtrtrs.go | 3 +- lapack/testlapack/general.go | 3 +- lapack/testlapack/matgen.go | 3 +- lapack/testlapack/matgen_test.go | 3 +- lapack/testlapack/test_matrices.go | 3 +- mat/cdense_test.go | 2 +- mat/cholesky_test.go | 8 +- mat/dense_test.go | 3 +- mat/diagonal_test.go | 3 +- mat/eigen_test.go | 3 +- mat/gsvd_test.go | 3 +- mat/hogsvd_test.go | 2 +- mat/inner_test.go | 3 +- mat/list_test.go | 3 +- mat/lq_test.go | 2 +- mat/lu_test.go | 2 +- mat/matrix_test.go | 2 +- mat/mul_test.go | 3 +- mat/pool_test.go | 2 +- mat/product_test.go | 2 +- mat/qr_test.go | 3 +- mat/shadow_test.go | 2 +- mat/solve_test.go | 2 +- mat/svd_test.go | 3 +- mat/symmetric_test.go | 3 +- mat/triangular_test.go | 3 +- mat/tridiag_test.go | 3 +- mat/vector_test.go | 3 +- mathext/ell_carlson_test.go | 2 +- mathext/internal/amos/amos_fortran_test.go | 3 +- mathext/internal/amos/amos_test.go | 3 +- mathext/internal/amos/origcode_test.go | 1 - mathext/prng/mt19937_64_test.go | 2 +- mathext/prng/mt19937_test.go | 2 +- mathext/prng/prng_di_unimi_test.go | 2 +- optimize/cmaes.go | 3 +- optimize/cmaes_test.go | 5 +- optimize/convex/lp/simplex_test.go | 5 +- optimize/listsearch_test.go | 3 +- spatial/barneshut/barneshut2_test.go | 3 +- spatial/barneshut/barneshut3_test.go | 3 +- spatial/barneshut/galaxy_example_test.go | 3 +- spatial/curve/hilbert_test.go | 2 +- spatial/kdtree/kdtree_test.go | 2 +- spatial/kdtree/medians.go | 2 +- spatial/kdtree/medians_test.go | 2 +- spatial/r2/box_test.go | 2 +- spatial/r2/triangle_test.go | 2 +- spatial/r2/vector_test.go | 2 +- spatial/r3/box_test.go | 2 +- spatial/r3/mat_test.go | 10 +- spatial/r3/triangle_test.go | 2 +- spatial/r3/vector_test.go | 3 +- spatial/vptree/vptree.go | 3 +- spatial/vptree/vptree_test.go | 3 +- stat/card/card_test.go | 17 +- stat/distmat/permutation.go | 3 +- stat/distmat/permutation_test.go | 3 +- stat/distmat/unit_vector.go | 3 +- stat/distmat/unit_vector_example_test.go | 5 +- stat/distmat/unit_vector_test.go | 3 +- stat/distmat/wishart.go | 3 +- stat/distmat/wishart_test.go | 3 +- stat/distmv/dirichlet.go | 3 +- stat/distmv/dirichlet_test.go | 3 +- stat/distmv/normal.go | 3 +- stat/distmv/normal_test.go | 3 +- stat/distmv/normalbench_test.go | 3 +- stat/distmv/statdist_test.go | 3 +- stat/distmv/studentst.go | 2 +- stat/distmv/studentst_test.go | 3 +- stat/distmv/uniform.go | 2 +- stat/distuv/alphastable.go | 2 +- stat/distuv/alphastable_test.go | 12 +- stat/distuv/bernoulli.go | 2 +- stat/distuv/bernoulli_test.go | 2 +- stat/distuv/beta.go | 3 +- stat/distuv/beta_test.go | 3 +- stat/distuv/binomial.go | 3 +- stat/distuv/binomial_test.go | 5 +- stat/distuv/categorical.go | 2 +- stat/distuv/categorical_test.go | 3 +- stat/distuv/chi.go | 3 +- stat/distuv/chi_test.go | 3 +- stat/distuv/chisquared.go | 3 +- stat/distuv/chisquared_test.go | 3 +- stat/distuv/exponential.go | 3 +- stat/distuv/exponential_test.go | 4 +- stat/distuv/f.go | 3 +- stat/distuv/f_test.go | 7 +- stat/distuv/gamma.go | 3 +- stat/distuv/gamma_test.go | 3 +- stat/distuv/gumbel.go | 2 +- stat/distuv/gumbel_test.go | 2 +- stat/distuv/inversegamma.go | 3 +- stat/distuv/inversegamma_test.go | 3 +- stat/distuv/laplace.go | 2 +- stat/distuv/laplace_test.go | 2 +- stat/distuv/lognormal.go | 2 +- stat/distuv/lognormal_test.go | 4 +- stat/distuv/norm.go | 3 +- stat/distuv/norm_test.go | 3 +- stat/distuv/pareto.go | 2 +- stat/distuv/pareto_test.go | 7 +- stat/distuv/poisson.go | 3 +- stat/distuv/poisson_test.go | 3 +- stat/distuv/statdist_test.go | 3 +- stat/distuv/studentst.go | 3 +- stat/distuv/studentst_test.go | 3 +- stat/distuv/triangle.go | 2 +- stat/distuv/triangle_test.go | 2 +- stat/distuv/uniform.go | 2 +- stat/distuv/uniform_test.go | 3 +- stat/distuv/weibull.go | 2 +- stat/distuv/weibull_test.go | 4 +- stat/moments_bench_test.go | 2 +- stat/samplemv/halton.go | 3 +- stat/samplemv/halton_test.go | 3 +- stat/samplemv/metropolishastings.go | 3 +- stat/samplemv/sample_test.go | 3 +- stat/samplemv/samplemv.go | 3 +- stat/sampleuv/sample.go | 3 +- stat/sampleuv/weighted.go | 2 +- stat/sampleuv/weighted_test.go | 5 +- stat/sampleuv/withoutreplacement.go | 2 +- stat/sampleuv/withoutreplacement_test.go | 5 +- stat/spatial/spatial_test.go | 35 +- stat/stat_example_test.go | 7 +- stat/stat_test.go | 3 +- stat/statmat_test.go | 3 +- 352 files changed, 1240 insertions(+), 697 deletions(-) create mode 100644 internal/rand/rand.go create mode 100644 internal/rand/rand_test.go create mode 100644 internal/rand/staticcheck.conf diff --git a/blas/gonum/level1cmplx128_bench_test.go b/blas/gonum/level1cmplx128_bench_test.go index 3c21148c..c788c714 100644 --- a/blas/gonum/level1cmplx128_bench_test.go +++ b/blas/gonum/level1cmplx128_bench_test.go @@ -7,7 +7,7 @@ package gonum import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func benchmarkZdscal(b *testing.B, n, inc int) { diff --git a/blas/gonum/level1float64_bench_test.go b/blas/gonum/level1float64_bench_test.go index 0b870a97..96810ab6 100644 --- a/blas/gonum/level1float64_bench_test.go +++ b/blas/gonum/level1float64_bench_test.go @@ -9,9 +9,8 @@ package gonum import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) const ( diff --git a/blas/gonum/level2cmplx128_bench_test.go b/blas/gonum/level2cmplx128_bench_test.go index 419d2968..5d1eaeab 100644 --- a/blas/gonum/level2cmplx128_bench_test.go +++ b/blas/gonum/level2cmplx128_bench_test.go @@ -8,9 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) var benchSinkZ []complex128 diff --git a/blas/gonum/pardgemm_test.go b/blas/gonum/pardgemm_test.go index 49b12764..4b82c821 100644 --- a/blas/gonum/pardgemm_test.go +++ b/blas/gonum/pardgemm_test.go @@ -7,10 +7,9 @@ package gonum import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) func TestDgemmParallel(t *testing.T) { diff --git a/blas/testblas/benchautogen/autogen_bench_level1double.go b/blas/testblas/benchautogen/autogen_bench_level1double.go index b216bf0b..e7226866 100644 --- a/blas/testblas/benchautogen/autogen_bench_level1double.go +++ b/blas/testblas/benchautogen/autogen_bench_level1double.go @@ -24,9 +24,8 @@ var autogen = []byte("// Code generated by \"go run $GOPATH/src/gonum.org/v1/gon var imports = []byte(`import( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" )`) var randomSliceFunction = []byte(`func randomSlice(l, idx int) ([]float64) { diff --git a/blas/testblas/common.go b/blas/testblas/common.go index 0e809931..a308761c 100644 --- a/blas/testblas/common.go +++ b/blas/testblas/common.go @@ -9,10 +9,9 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "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 diff --git a/blas/testblas/common_test.go b/blas/testblas/common_test.go index 9c88b21c..4a904e18 100644 --- a/blas/testblas/common_test.go +++ b/blas/testblas/common_test.go @@ -9,10 +9,9 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) func TestFlattenBanded(t *testing.T) { diff --git a/blas/testblas/dgemmbench.go b/blas/testblas/dgemmbench.go index 7d51145e..99060028 100644 --- a/blas/testblas/dgemmbench.go +++ b/blas/testblas/dgemmbench.go @@ -7,9 +7,8 @@ package testblas import ( "testing" - "golang.org/x/exp/rand" - "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) { diff --git a/blas/testblas/dtrmvbench.go b/blas/testblas/dtrmvbench.go index f78e306b..df42ba21 100644 --- a/blas/testblas/dtrmvbench.go +++ b/blas/testblas/dtrmvbench.go @@ -7,9 +7,8 @@ package testblas import ( "testing" - "golang.org/x/exp/rand" - "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) { diff --git a/blas/testblas/dtrsm.go b/blas/testblas/dtrsm.go index b404d310..9ab116e5 100644 --- a/blas/testblas/dtrsm.go +++ b/blas/testblas/dtrsm.go @@ -7,10 +7,9 @@ package testblas import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dtrsmer interface { diff --git a/blas/testblas/dzasum.go b/blas/testblas/dzasum.go index 50d51a12..fccde21c 100644 --- a/blas/testblas/dzasum.go +++ b/blas/testblas/dzasum.go @@ -7,9 +7,8 @@ package testblas import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type Dzasumer interface { diff --git a/blas/testblas/dznrm2.go b/blas/testblas/dznrm2.go index 8beed143..c8672969 100644 --- a/blas/testblas/dznrm2.go +++ b/blas/testblas/dznrm2.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type Dznrm2er interface { diff --git a/blas/testblas/izamax.go b/blas/testblas/izamax.go index 85d8d949..cc44f7e1 100644 --- a/blas/testblas/izamax.go +++ b/blas/testblas/izamax.go @@ -7,7 +7,7 @@ package testblas import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Izamaxer interface { diff --git a/blas/testblas/level2bench.go b/blas/testblas/level2bench.go index 6d58c120..b5f20520 100644 --- a/blas/testblas/level2bench.go +++ b/blas/testblas/level2bench.go @@ -7,9 +7,8 @@ package testblas import ( "testing" - "golang.org/x/exp/rand" - "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) { diff --git a/blas/testblas/zcopy.go b/blas/testblas/zcopy.go index 0a58a847..e681baee 100644 --- a/blas/testblas/zcopy.go +++ b/blas/testblas/zcopy.go @@ -8,7 +8,7 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Zcopyer interface { diff --git a/blas/testblas/zgbmv.go b/blas/testblas/zgbmv.go index 93f6c6cc..75d1f4ed 100644 --- a/blas/testblas/zgbmv.go +++ b/blas/testblas/zgbmv.go @@ -8,8 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zgbmver interface { diff --git a/blas/testblas/zgemm.go b/blas/testblas/zgemm.go index f119b207..16fa8fc8 100644 --- a/blas/testblas/zgemm.go +++ b/blas/testblas/zgemm.go @@ -8,8 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zgemmer interface { diff --git a/blas/testblas/zhbmv.go b/blas/testblas/zhbmv.go index a437217b..b808c781 100644 --- a/blas/testblas/zhbmv.go +++ b/blas/testblas/zhbmv.go @@ -9,8 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zhbmver interface { diff --git a/blas/testblas/zhemm.go b/blas/testblas/zhemm.go index 1744fd25..bc488aea 100644 --- a/blas/testblas/zhemm.go +++ b/blas/testblas/zhemm.go @@ -9,9 +9,8 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zhemmer interface { diff --git a/blas/testblas/zher2k.go b/blas/testblas/zher2k.go index d219018c..d96901aa 100644 --- a/blas/testblas/zher2k.go +++ b/blas/testblas/zher2k.go @@ -9,8 +9,8 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zher2ker interface { diff --git a/blas/testblas/zherk.go b/blas/testblas/zherk.go index 7d986dea..68bd5085 100644 --- a/blas/testblas/zherk.go +++ b/blas/testblas/zherk.go @@ -9,9 +9,8 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zherker interface { diff --git a/blas/testblas/zswap.go b/blas/testblas/zswap.go index ce1ab7a1..cbcf40b7 100644 --- a/blas/testblas/zswap.go +++ b/blas/testblas/zswap.go @@ -8,7 +8,7 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Zswaper interface { diff --git a/blas/testblas/zsymm.go b/blas/testblas/zsymm.go index 455c96a0..6225dbf5 100644 --- a/blas/testblas/zsymm.go +++ b/blas/testblas/zsymm.go @@ -9,9 +9,8 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zsymmer interface { diff --git a/blas/testblas/zsyr2k.go b/blas/testblas/zsyr2k.go index 45d3d822..e2aec618 100644 --- a/blas/testblas/zsyr2k.go +++ b/blas/testblas/zsyr2k.go @@ -8,9 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zsyr2ker interface { diff --git a/blas/testblas/zsyrk.go b/blas/testblas/zsyrk.go index f8c74698..e07dcb9b 100644 --- a/blas/testblas/zsyrk.go +++ b/blas/testblas/zsyrk.go @@ -9,9 +9,8 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Zsyrker interface { diff --git a/blas/testblas/ztbmv.go b/blas/testblas/ztbmv.go index d55d90e3..0ba6b315 100644 --- a/blas/testblas/ztbmv.go +++ b/blas/testblas/ztbmv.go @@ -8,8 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Ztbmver interface { diff --git a/blas/testblas/ztbsv.go b/blas/testblas/ztbsv.go index 4c3f8349..4c4bacb4 100644 --- a/blas/testblas/ztbsv.go +++ b/blas/testblas/ztbsv.go @@ -8,8 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Ztbsver interface { diff --git a/blas/testblas/ztpsv.go b/blas/testblas/ztpsv.go index b405227e..ef775d94 100644 --- a/blas/testblas/ztpsv.go +++ b/blas/testblas/ztpsv.go @@ -8,8 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Ztpsver interface { diff --git a/blas/testblas/ztrmm.go b/blas/testblas/ztrmm.go index 487c99b1..5072e170 100644 --- a/blas/testblas/ztrmm.go +++ b/blas/testblas/ztrmm.go @@ -8,9 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Ztrmmer interface { diff --git a/blas/testblas/ztrsm.go b/blas/testblas/ztrsm.go index 25e253b8..0aa896dc 100644 --- a/blas/testblas/ztrsm.go +++ b/blas/testblas/ztrsm.go @@ -8,9 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Ztrsmer interface { @@ -37,7 +36,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) { - const tol = 1e-13 + const tol = 1e-12 rnd := rand.New(rand.NewSource(1)) diff --git a/blas/testblas/ztrsv.go b/blas/testblas/ztrsv.go index c981cdd2..933844ad 100644 --- a/blas/testblas/ztrsv.go +++ b/blas/testblas/ztrsv.go @@ -8,8 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Ztrsver interface { diff --git a/cmplxs/cmplxs_test.go b/cmplxs/cmplxs_test.go index 86ac2f61..cff4679e 100644 --- a/cmplxs/cmplxs_test.go +++ b/cmplxs/cmplxs_test.go @@ -11,10 +11,9 @@ import ( "strconv" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/cmplxs/cscalar" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) const ( diff --git a/diff/fd/gradient_test.go b/diff/fd/gradient_test.go index e32de1a2..4541e49d 100644 --- a/diff/fd/gradient_test.go +++ b/diff/fd/gradient_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Rosenbrock struct { diff --git a/diff/fd/jacobian_test.go b/diff/fd/jacobian_test.go index 8d096f30..0fa97081 100644 --- a/diff/fd/jacobian_test.go +++ b/diff/fd/jacobian_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/dsp/fourier/fourier_test.go b/dsp/fourier/fourier_test.go index d52d3aaf..1244cdf5 100644 --- a/dsp/fourier/fourier_test.go +++ b/dsp/fourier/fourier_test.go @@ -9,9 +9,8 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) func TestFFT(t *testing.T) { diff --git a/dsp/fourier/radix24_test.go b/dsp/fourier/radix24_test.go index 2b40d53c..49f02bc4 100644 --- a/dsp/fourier/radix24_test.go +++ b/dsp/fourier/radix24_test.go @@ -13,9 +13,8 @@ import ( "testing" "unsafe" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/cmplxs" + "gonum.org/v1/gonum/internal/rand" ) func TestCoefficients(t *testing.T) { diff --git a/floats/floats_test.go b/floats/floats_test.go index d9b65a8a..a6871f93 100644 --- a/floats/floats_test.go +++ b/floats/floats_test.go @@ -11,9 +11,8 @@ import ( "strconv" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) const ( diff --git a/graph/coloring/coloring.go b/graph/coloring/coloring.go index 2031b32a..dd7ba9f6 100644 --- a/graph/coloring/coloring.go +++ b/graph/coloring/coloring.go @@ -12,12 +12,11 @@ import ( "slices" "sort" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/graph/topo" + "gonum.org/v1/gonum/internal/rand" ) // ErrInvalidPartialColoring is returned when a partial coloring diff --git a/graph/coloring/coloring_test.go b/graph/coloring/coloring_test.go index 81d07b5c..5c4308cd 100644 --- a/graph/coloring/coloring_test.go +++ b/graph/coloring/coloring_test.go @@ -10,12 +10,11 @@ import ( "testing" "time" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/encoding/graph6" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/simple" + "gonum.org/v1/gonum/internal/rand" ) var runLong = flag.Bool("color.long", false, "run long exact coloring tests") diff --git a/graph/community/bisect.go b/graph/community/bisect.go index 11d38eb9..4a20d5f7 100644 --- a/graph/community/bisect.go +++ b/graph/community/bisect.go @@ -9,9 +9,8 @@ import ( "fmt" "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" + "gonum.org/v1/gonum/internal/rand" ) // Interval is an interval of resolutions with a common score. diff --git a/graph/community/bisect_example_test.go b/graph/community/bisect_example_test.go index 53e6f374..6692e777 100644 --- a/graph/community/bisect_example_test.go +++ b/graph/community/bisect_example_test.go @@ -8,11 +8,10 @@ import ( "fmt" "log" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph/community" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) func ExampleProfile_simple() { @@ -210,7 +209,7 @@ 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.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.2 High:1.6 Score:10 Communities:[[0 3 4 5 6 10] [1 7 9 12] [2 8 11]] Q=[10.5 26.7] + // 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.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.8 High:2.3 Score:-6 Communities:[[0 2 3 4 5 6 8 10 11] [1 7 9 12]] Q=[-5 57.5] diff --git a/graph/community/louvain_common.go b/graph/community/louvain_common.go index f9b68602..7d80459e 100644 --- a/graph/community/louvain_common.go +++ b/graph/community/louvain_common.go @@ -8,10 +8,9 @@ import ( "fmt" "slices" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "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 diff --git a/graph/community/louvain_directed.go b/graph/community/louvain_directed.go index bc7c2169..3c5241ca 100644 --- a/graph/community/louvain_directed.go +++ b/graph/community/louvain_directed.go @@ -8,12 +8,11 @@ import ( "math" "slices" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "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 diff --git a/graph/community/louvain_directed_multiplex.go b/graph/community/louvain_directed_multiplex.go index d8127af0..8d56f04b 100644 --- a/graph/community/louvain_directed_multiplex.go +++ b/graph/community/louvain_directed_multiplex.go @@ -8,12 +8,11 @@ import ( "fmt" "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) // DirectedMultiplex is a directed multiplex graph. diff --git a/graph/community/louvain_directed_multiplex_test.go b/graph/community/louvain_directed_multiplex_test.go index fe4175b6..3dd71bc8 100644 --- a/graph/community/louvain_directed_multiplex_test.go +++ b/graph/community/louvain_directed_multiplex_test.go @@ -11,13 +11,12 @@ import ( "slices" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) var communityDirectedMultiplexQTests = []struct { diff --git a/graph/community/louvain_directed_test.go b/graph/community/louvain_directed_test.go index fdee1082..8f576444 100644 --- a/graph/community/louvain_directed_test.go +++ b/graph/community/louvain_directed_test.go @@ -10,12 +10,11 @@ import ( "slices" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) type communityDirectedQTest struct { @@ -167,11 +166,12 @@ var communityDirectedQTests = []communityDirectedQTest{ }, }, { - q: 0.36862244897959184, + q: 0.3405612244897959, communities: [][]graph.Node{ {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(8), simple.Node(9), simple.Node(10), simple.Node(11), simple.Node(12), simple.Node(13), simple.Node(14), simple.Node(15)}, + {simple.Node(8), simple.Node(10), simple.Node(11), simple.Node(13), simple.Node(15)}, + {simple.Node(9), simple.Node(12), simple.Node(14)}, }, }, { @@ -212,7 +212,9 @@ func TestCommunityQDirected(t *testing.T) { } } - testCommunityQDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testCommunityQDirected(t, test, g) + }) } } @@ -229,7 +231,9 @@ func TestCommunityQWeightedDirected(t *testing.T) { } } - testCommunityQDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testCommunityQDirected(t, test, g) + }) } } @@ -265,7 +269,9 @@ func TestCommunityDeltaQDirected(t *testing.T) { } } - testCommunityDeltaQDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testCommunityDeltaQDirected(t, test, g) + }) } } @@ -282,7 +288,9 @@ func TestCommunityDeltaQWeightedDirected(t *testing.T) { } } - testCommunityDeltaQDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testCommunityDeltaQDirected(t, test, g) + }) } } @@ -390,7 +398,9 @@ func TestReduceQConsistencyDirected(t *testing.T) { } } - testReduceQConsistencyDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testReduceQConsistencyDirected(t, test, g) + }) } } @@ -407,7 +417,9 @@ func TestReduceQConsistencyWeightedDirected(t *testing.T) { } } - testReduceQConsistencyDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testReduceQConsistencyDirected(t, test, g) + }) } } @@ -508,7 +520,9 @@ func TestMoveLocalDirected(t *testing.T) { } } - testMoveLocalDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testMoveLocalDirected(t, test, g) + }) } } @@ -525,7 +539,9 @@ func TestMoveLocalWeightedDirected(t *testing.T) { } } - testMoveLocalDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testMoveLocalDirected(t, test, g) + }) } } @@ -570,7 +586,9 @@ func TestModularizeDirected(t *testing.T) { } } - testModularizeDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testModularizeDirected(t, test, g) + }) } } @@ -587,7 +605,9 @@ func TestModularizeWeightedDirected(t *testing.T) { } } - testModularizeDirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testModularizeDirected(t, test, g) + }) } } diff --git a/graph/community/louvain_test.go b/graph/community/louvain_test.go index e03a48d9..cdf01dca 100644 --- a/graph/community/louvain_test.go +++ b/graph/community/louvain_test.go @@ -7,11 +7,10 @@ package community import ( "fmt" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/graphs/gen" "gonum.org/v1/gonum/graph/simple" + "gonum.org/v1/gonum/internal/rand" ) // intset is an integer set. diff --git a/graph/community/louvain_undirected.go b/graph/community/louvain_undirected.go index 169f978d..ad17cc52 100644 --- a/graph/community/louvain_undirected.go +++ b/graph/community/louvain_undirected.go @@ -8,12 +8,11 @@ import ( "math" "slices" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "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 diff --git a/graph/community/louvain_undirected_multiplex.go b/graph/community/louvain_undirected_multiplex.go index 509b17db..90e040a3 100644 --- a/graph/community/louvain_undirected_multiplex.go +++ b/graph/community/louvain_undirected_multiplex.go @@ -8,12 +8,11 @@ import ( "fmt" "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) // UndirectedMultiplex is an undirected multiplex graph. diff --git a/graph/community/louvain_undirected_multiplex_test.go b/graph/community/louvain_undirected_multiplex_test.go index fc1c3062..da3c18c3 100644 --- a/graph/community/louvain_undirected_multiplex_test.go +++ b/graph/community/louvain_undirected_multiplex_test.go @@ -11,13 +11,12 @@ import ( "slices" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) var communityUndirectedMultiplexQTests = []struct { diff --git a/graph/community/louvain_undirected_test.go b/graph/community/louvain_undirected_test.go index a36493cb..82647ccf 100644 --- a/graph/community/louvain_undirected_test.go +++ b/graph/community/louvain_undirected_test.go @@ -10,12 +10,11 @@ import ( "slices" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) type communityUndirectedQTest struct { @@ -153,16 +152,15 @@ var communityUndirectedQTests = []communityUndirectedQTest{ }, }, { - q: 0.3496877054569362, + q: 0.3707264957264957, 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(4), simple.Node(10)}, {simple.Node(5), simple.Node(6), simple.Node(16)}, {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(23), simple.Node(25)}, - {simple.Node(24), simple.Node(27)}, + {simple.Node(23), simple.Node(27)}, + {simple.Node(24), simple.Node(25), simple.Node(28), simple.Node(31)}, {simple.Node(26), simple.Node(29)}, - {simple.Node(28), simple.Node(31)}, }, }, { @@ -275,7 +273,9 @@ func TestCommunityQUndirected(t *testing.T) { } } - testCommunityQUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testCommunityQUndirected(t, test, g) + }) } } @@ -292,7 +292,9 @@ func TestCommunityQWeightedUndirected(t *testing.T) { } } - testCommunityQUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testCommunityQUndirected(t, test, g) + }) } } @@ -328,7 +330,9 @@ func TestCommunityDeltaQUndirected(t *testing.T) { } } - testCommunityDeltaQUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testCommunityDeltaQUndirected(t, test, g) + }) } } @@ -345,7 +349,9 @@ func TestCommunityDeltaQWeightedUndirected(t *testing.T) { } } - testCommunityDeltaQUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testCommunityDeltaQUndirected(t, test, g) + }) } } @@ -453,7 +459,9 @@ func TestReduceQConsistencyUndirected(t *testing.T) { } } - testReduceQConsistencyUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testReduceQConsistencyUndirected(t, test, g) + }) } } @@ -470,7 +478,9 @@ func TestReduceQConsistencyWeightedUndirected(t *testing.T) { } } - testReduceQConsistencyUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testReduceQConsistencyUndirected(t, test, g) + }) } } @@ -571,7 +581,9 @@ func TestMoveLocalUndirected(t *testing.T) { } } - testMoveLocalUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testMoveLocalUndirected(t, test, g) + }) } } @@ -588,7 +600,9 @@ func TestMoveLocalWeightedUndirected(t *testing.T) { } } - testMoveLocalUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testMoveLocalUndirected(t, test, g) + }) } } @@ -633,7 +647,9 @@ func TestModularizeUndirected(t *testing.T) { } } - testModularizeUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testModularizeUndirected(t, test, g) + }) } } @@ -650,7 +666,9 @@ func TestModularizeWeightedUndirected(t *testing.T) { } } - testModularizeUndirected(t, test, g) + t.Run(test.name, func(t *testing.T) { + testModularizeUndirected(t, test, g) + }) } } diff --git a/graph/complement_test.go b/graph/complement_test.go index ab57138e..d8295f4f 100644 --- a/graph/complement_test.go +++ b/graph/complement_test.go @@ -8,12 +8,11 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/graphs/gen" "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/graph/simple" + "gonum.org/v1/gonum/internal/rand" ) var complementTests = []struct { diff --git a/graph/encoding/dot/bench_test.go b/graph/encoding/dot/bench_test.go index 1ac21a32..b7a82a51 100644 --- a/graph/encoding/dot/bench_test.go +++ b/graph/encoding/dot/bench_test.go @@ -8,12 +8,11 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/graphs/gen" "gonum.org/v1/gonum/graph/multi" "gonum.org/v1/gonum/graph/simple" + "gonum.org/v1/gonum/internal/rand" ) var ( diff --git a/graph/flow/control_flow_bench_test.go b/graph/flow/control_flow_bench_test.go index 3bf695d7..5ac8d0d1 100644 --- a/graph/flow/control_flow_bench_test.go +++ b/graph/flow/control_flow_bench_test.go @@ -13,8 +13,6 @@ import ( "strings" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/encoding" "gonum.org/v1/gonum/graph/encoding/dot" @@ -22,6 +20,7 @@ import ( "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/graph/topo" + "gonum.org/v1/gonum/internal/rand" ) var slta = flag.Bool("slta", false, "specify DominatorsSLT benchmark") diff --git a/graph/formats/rdf/graph_test.go b/graph/formats/rdf/graph_test.go index 6af24a0c..0cc2cb47 100644 --- a/graph/formats/rdf/graph_test.go +++ b/graph/formats/rdf/graph_test.go @@ -11,8 +11,6 @@ import ( "strings" "testing" - "golang.org/x/exp/rand" - "github.com/google/go-cmp/cmp" "gonum.org/v1/gonum/graph" @@ -21,6 +19,7 @@ import ( "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/graph/multi" "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) { diff --git a/graph/formats/rdf/iso_canonical_test.go b/graph/formats/rdf/iso_canonical_test.go index b65b8a9b..ce68ae2d 100644 --- a/graph/formats/rdf/iso_canonical_test.go +++ b/graph/formats/rdf/iso_canonical_test.go @@ -20,7 +20,7 @@ import ( "text/tabwriter" "time" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) var ( diff --git a/graph/formats/rdf/query_test.go b/graph/formats/rdf/query_test.go index a8904f26..46b59267 100644 --- a/graph/formats/rdf/query_test.go +++ b/graph/formats/rdf/query_test.go @@ -10,9 +10,8 @@ import ( "strings" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) var andTests = []struct { diff --git a/graph/graphs/gen/batagelj_brandes.go b/graph/graphs/gen/batagelj_brandes.go index e637bbc3..af449bf0 100644 --- a/graph/graphs/gen/batagelj_brandes.go +++ b/graph/graphs/gen/batagelj_brandes.go @@ -11,9 +11,8 @@ import ( "fmt" "math" - "golang.org/x/exp/rand" - "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 diff --git a/graph/graphs/gen/duplication.go b/graph/graphs/gen/duplication.go index 06ce3931..0efcd94c 100644 --- a/graph/graphs/gen/duplication.go +++ b/graph/graphs/gen/duplication.go @@ -8,10 +8,9 @@ import ( "fmt" "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) // UndirectedMutator is an undirected graph builder that can remove edges. diff --git a/graph/graphs/gen/holme_kim.go b/graph/graphs/gen/holme_kim.go index 8f49995d..74500541 100644 --- a/graph/graphs/gen/holme_kim.go +++ b/graph/graphs/gen/holme_kim.go @@ -8,10 +8,9 @@ import ( "errors" "fmt" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/simple" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat/sampleuv" ) diff --git a/graph/graphs/gen/small_world.go b/graph/graphs/gen/small_world.go index 1846ef10..404d9d31 100644 --- a/graph/graphs/gen/small_world.go +++ b/graph/graphs/gen/small_world.go @@ -9,9 +9,8 @@ import ( "fmt" "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat/sampleuv" ) diff --git a/graph/layout/eades.go b/graph/layout/eades.go index 7a83d165..ae14918a 100644 --- a/graph/layout/eades.go +++ b/graph/layout/eades.go @@ -7,9 +7,8 @@ package layout import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/spatial/barneshut" "gonum.org/v1/gonum/spatial/r2" ) diff --git a/graph/layout/eades_test.go b/graph/layout/eades_test.go index 19c62cec..049f95f9 100644 --- a/graph/layout/eades_test.go +++ b/graph/layout/eades_test.go @@ -8,10 +8,9 @@ import ( "path/filepath" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/simple" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/spatial/r2" "gonum.org/v1/plot" "gonum.org/v1/plot/vg" @@ -163,7 +162,7 @@ func TestEadesR2(t *testing.T) { return orderedGraph{g} }(), param: EadesR2{Repulsion: 1, Rate: 1, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)}, - wantIters: 99, + wantIters: 96, }, { @@ -192,7 +191,7 @@ func TestEadesR2(t *testing.T) { } 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.01, Updates: 100, Theta: 0.1, Src: rand.NewSource(1)}, wantIters: 100, }, } diff --git a/graph/layout/testdata/sheet_golden.png b/graph/layout/testdata/sheet_golden.png index 03540869e566dff7dcbf1122cf985cb3442807e7..e39052ac04e1b73e625fbf6ac5b9430e15e66364 100644 GIT binary patch literal 24154 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 UmYqTRhRk?^y^Z7EB5P{QKchF1%m4rY literal 23819 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 KT{oD)oc{s3X~5?I diff --git a/graph/layout/testdata/square_golden.png b/graph/layout/testdata/square_golden.png index dd97e3bede84dd37cf15be42694f37d6329ffee9..6fefc76c9f1970e6609d87d11c3312d4c1ae9012 100644 GIT binary patch literal 17956 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%0D5Q{2ICMxk%t zzP-?unHoVewuLlq3Q*Y25X>AgLoL5^s`kc)#t81G`S}g;T9u3A38!8<-h9mbgvv3~ zQblg{B0$j7Cr^$SSmx#AOiWI$;MC}Es$efnK9lUPOjXXccPOqitnb{$R&BBy zXwdRyM0-y_U|`+r*V8U92olPJ4DGeGwLLv0X=#*hOw*iSzI>68ka%Vi!1CGNfeAmM zGJ?Ei2m1FW9J+iGjO5(8b8c?Go|rzx|I^ab!|&Y5&C4TS@9Z{zUfh-G#*G`OEN^P! z)RL&*-f6SPw#i9KZnF}ywznT29o@EdD~0x+sKD~=XchQ$bajz?k+O6g_j-DIz=}aF z%TrS+>cqEgi>X=t;e-$Zq0Uav5iEUhZD&|L3MV}yqdGSgLoc`}3h0MR?x^^vTQ_dJ zDzt3`JJqTzK5s38AdK-|oGMBH8 zeMM(MIIyw^VC-)`T_yRTOQ} z+}938HxdiU|H(#Fc$?LwUm=X#q@O>7vknp8CC6*MJO3Q?qP91t>Fb;!Ex$0Bma4h=hZ`Gcv9>cUj?;;E@813J z;R6C0p@M3FHqAOG2pn|npR$3vY(Pu##tkjn-k1k5F=`hMSG9? zA`s_eam=HzXQjWs!bd@l<<8W)frX~%(Y-@k{+_J4oz{CO;R29fx@ zq{O+*!n>dafhsF2+kRg{H8XiE#Zi1^eHA1KX@i`}u11j?{$5byTVi5E#)6(azRyOX zA7488{TcN5+K~*t-1+X^vuDr5rKP3C#iKO&(R+l4hokpmp|5XhYHDoUclfa9%EC+m zk4f6^kgNH|qh2HS%UAuGVD$2^NISyIB z4$@a#od=b`afwxj*A0(-`EvPVNn1k$O`SN%Jjz4$HM?xCCLr{Lt1O8{$p=7zDC?YX zWvG*qlG>~LkY(Gpy3v`~s%k<) z!k5GKwY5rT&ZOM9q3r0GU)i9et=;wheg8A-I+uc{*9Xr#I9&7e#FNxsMAvw!|9R8v z*OXI9c+djNs`8Q&_XWO!(-l3nwVxZpxn^%IhUDgofE3^%*A|by$WOR)hk>CETmcED zbW;D3d|$PX+?p+uuco1rQZ0I!kVE~wR(`;GFH}*l#+5d7%=)PYddUi_ldSkY#E}aZ zE~MiA2B7EOGxh8siY)Zhe)H{(jT)KBF+T^&()04FJfWmiY)!)~`65*HVD z8Q0o|tdH^b0b|8V5XLmGck1CjP?H`k#&dw9h&M2#^H>5Zzc+Dav z#=%!ulb)oceC~^^AzgPX_M916Sy=%`!s$iTVDpfAckeRaP)d3H_{+#h5!iD|3h&C4 z7XMvA<4kdmJ7Z&ZdxBE1cO{O10Eh8E1Kp2;)$*-9$D9K zSThSfTGl4nle)U$kY{o`a!!{yQxAEV>V6+bNBBxyWX~RIHzq>t7+}-V(h_B2ft5D! zRn){N8c%C$Ybnmnb$eC&2D82RwQTqsVf_G~FZ;4OCP7sN4_vH?)I zZ{NPjR}|iD7_JNX+MXmFt%Ri<7 z{~Uk+J_r3xY!zq%LCGJ_N<8SSoYmFV+Da^Rgj~hFW5?&pb19Di;Zcc>b{8(>xVzQa z6aqa#2~aZ#;SeLdwYm35ii;amlv^Koz(T+0F99P&y^22}=x6leX~N{>B`z+mm7IM9 zB2$vy)Wn40S|xyjWGa2>5ccJWxHuCwF>1S{J;UANRwPaLQ%CoyPvO?)o}PzEyaZlb zCnu}Zr}M^+fx>WcauT099*~qoU(c|4GkFaU@J&}&SHOsX%lq56>7z9>)ZHMH^$ZMD zdM`SYAMFBA(N*?{n3(>97{G}a^alqMX`Q{>>Ym-YMMwUNjYG*?Lo#L;P(CUvD~ac8 zxWE{1D7}0CK0ua^a4Sj1WxVRor;F#$i%UwzjIXAqrf%U;xP%SK&mW&#g!be!8ZO-s z!OgW}#|rw9%HN}`tgKy`x)oPPgUgAVL+T_B9H8I0QO0{goFqcv1?EFdSY2JUwY7ch z<>%xyl~T}kUJ9w*>$?K_P8Rb-MUTg?I_~D*_@4C7GM@I8%rlzLo zE`hr-oR@bxoIBSzd<6v=K;X|rLqoF{t@_A_^UA{2`nKKCnrxyL0?eV)8|a85Pi+*E z*QbZ;$Xp4Dr^F(~xgWyEsvnDV3yQkqK4x`M*LIQ2sT?o)wJV9t9+K-A;J~M$b3nwtOV&?9rPFi zFY)=EMjFxqJpz&1vSkZ)o_B{(+|p>IV*iH^VB+iGEVG;?+1clz1N{8?vx8eCeaS86 z{(S+qFtl00I19Cmf`a6j7|F~1QmAHS^2;6z)5B=ms+NCND6TDx&Lw;h9C;LOkg1oX zmDOdKMeu(Yq%w?3EXZ=Zre?jEuj;JnsZ-x4CXPKevbC|H@d+eZ4Fa~#;f~o5UC)~c zxph1`5-(;|4SupPGYUKt>e|cd=H|A(@>Ox4UgC$&PD2ZemG`>r!M&ks@ptdePI}uA zYAu+wRw>la3@Zr+8&h+@IMWpjWUJTlCkZ7Q<7;~tlMCtAI1NCRbpFDX2 z%pf0`4wi@yYp(rr;0z}NCFmqXB+z!*BvH1o>({Q4HEnSIEd6B8?b}g0scC8P+iG`x zBUZ)ml-%6b!9i{}dV;39u`y^q^AI7X%|8C#Jq6EcD3iaS-~6MvxQw@+D7Ht<`VPrX zN-ASjPd%={Q7=jM%h#{*adFfg+cxkDYiny4nhy|({EZT(i%&-aX}36BxS-ri;C+fC z0gjw)x!2@jZknGkGGap$cte(&Fc#>f1B$}9$oRC#EhZ@mY5@u$veVyNFY&N78aGEr z(IIQo5=Rhlse=bMP*Rc~+s;$o(#Ho%^veN_<9+3VLP8G}e83L~Q5^`y>G~08o)ZVZ zXJ%*LY8=f2Zv{@g{fceH8rby)QW@gwJA)71Rx&K8> z-ei=AbJwr8B+>WidU?sjw~z%7fJ>CVgToUv0+2IUB}(z3jt;|3l^bG?gs3=kk^Co5 zj0VbiSaTBw1}xC`e*N={f>5carF9$n@N$<=NA}6VXXd&2`T3tepCJcxaz+OKkt0>u zV!`v?rcb%{#vDsEc>Ve{`C+}Ao0|s)23Vx4pLFZGyO)4~MMN-?*PwIqBxm)_?2$}^ zoN|mve*E}>mWZ623XqeK)bvM+)gF`Vp?`4%SGgve5NccEVq;6o%Y|I&5EHCe?P?XLap!bzE?<@ zGMj(8A~T4a#U#rSkIfPNaUJxBZ4VD>-PdL% z1$TT^^j=_M^rSdLcV8zHIpXYYU~scMG%PGelmGUq26}(`3fGDEK^wQl;xFu5z!o}oj{0bz`-45Y;Gk>jYg&)g{pC)_+dqz@euJyoL9 zGWBob`hZ1qRAr@X1XosEtP_2_TB0G-6qj!R3M%~smwC6tyP z2BGoyCy*m!`_4!+E32s=Kk`;`nodd|J$h8@!%0>`x69{RicqxxJ2NMv9$iDjt&xq! z?Tp-n?E8=+&`N#m>l5^Iz(T*VpGSjwy1Sot=f8WB{D?W@cvQ zXFg_U$A7o4$xQlxv;agh_6%jIxsPu3=-AVQzr=&mYJk8iTxf1#YWn5p&j=yHB5AL* zbnmNI$}*>(Ql@Ab85zB?k$8Q&>ez8<5jN0l?F)Z@4?+*JYTx$orVyct6x?KIB*0>R zZ(}V}Y+PJfS=lZIr6TgSloS>k_V+v?WZ!xITq@Pzmb;kjf$q%-ZH`V(TNoHXS_!kq zP)~b$)UVrbd_bZZViJ&--$90$tc;8|-QBF0X%2Mj+S_Nw#l;(gsM;Z#tygQa~(Sw>M*wW3n2LxWdRPl z<1TLvrNNrf3`0LBANv7ZX2iJ+y}dFw6`#i7^x{g$7M|A>Vgv??m?q-8cf4;I>G`wC z;edm_vR#-k<~H&E@y2a?ne1q(ng73OC4CiXb?ski^?cJ20&fmRhhU4=bu>g}Uyb?l zV>&u4Vf9)Hhq(#eQ86*L=gw&)a9+N^S+fIIZhUh? zawOf{#Ga-{L0FvZf3d0V8Jewh##vgGUR^-3CcjF>E+zuM+waK}U|=dgQk1@t??mkG zMm~!EMa%E&3yX`XjI-=P`3acXed8nq6NbVf&es$&y(E{iJuLLr?5>1hUOv9M*48`c z94;dNb z+V0og|EGvKdw6JYk3FU{lSY0(9i!?);xivRb_}BnD(~{C?Ka(;|0-p>+Yy^lnnp%< zA3ge%d!iT{B#6&qnlRgXCbG?c7o)p4Bn70R-~z|y^a1R70yA) ztOsgLLOzpqx%z+0WS-2X7&)}Q-`eXdeyTt$i&qPm`OIg3B zDw<63uXe;p#~y0aw{Ot>2>j$`s-oi9^FYdx@~!kYySuxotiDkYB>q#uQW$sdfAcQ_ z9O`~WmXPtUR7>M#Vd`zeXyKb{d05z{ehxwuV?x`{Z{N%dZKz4S2b3(NJ$??H!1%A9 zfe_UR5E5tjSm`B6{^-O%73|h$R4^r-a~+Rfl$7l4WuzDQzE?uR(98^9ETfYoD5>YI zL#7Lny>-c;NB6{u?XH^%s{T_)HOhy~qq^I2jI)ANc1;E_)-u`I+1-EeAli|Z+Rn{o z`m-|TALbPV$ZQoAX#L{%p9+?})f&~Ud-bYB;47tra)dEfF0L?Zj_tjxDLMa5G&^^K z=8rd_+y0UHvIE~T=#n?`f`bDM6&3FTZo(`Q=s$@@{g9keyXz6LOl_cx{LCAVdHhm0 zAXhf|oslAPt^_3kjmVt`4;?BgE>`8X6JR2uh>4s)5%V{oqEvQsdy$p3kHo7Ql=81C z7ON;mu#1n1;*His-(^UT0f9joql$zCE)q*!8u4G%Y*#1wVrnN(J~R;EU$%5@e#-T45jp$$b_#>- z|FA_n#bPxtw?HR4mYqBE|Nb6U4p7u=V}|%y(q2i)uIA?37O133RKVhGbX3qDfGMT1 zCer9hp$WFci~`QZmYA ze3qW)|>g|q>x`vXMZBg!e;dRhPEaCOL zbq;VyI5N=qLUlcV`EtD#5gc`OORzNvoaDLoN{^{WAmJEouN>Hr!uAi-6gr}CAT}ZA z_U+pc^&};WG1Y>!Pv(iNtdML$K`|0dHTcloZE9#3otP+(9+fk^r>kppWaRF>dl;>= zPHPa94*qX;D>9#uzcw$x%j>U_+WP3oatM#_=efoA-cK?z?0%8Dr8wJ~noz5?546$w z_hUXD3&n)QGRt4rO(w&8^%BhybxBD+Kl%^)`T5}hFDM+gZMfr9vswZr720lHoh?QN z-U@ykn>YHCY>WHwcDwnBY$}D24nZ6vxTRx`&A_*w_h}j;}wEbrVWx+u44Y zkX;fL#l%pDOg5yA-gjGVx0f5wW(J0ZDQ?6lFgL${_>Mt{*^4P>dX|f>rr8$n8ni>tP^8_aY%5&@N+#DJn_WdV`0|O%Q z5)=k|{*5|`Rhf=!a8o3s@CyrHY`C-CIWbNz3qLwy6r+7l1ZCHG$94iMFo`^a#Z4wn zrH$FeEI|*kl+u9e0yM5y-Q9hmgClZsZ_QBf3jVvh4U)Z;ST#?|#1wqWZ~eM~LDWb! z7mu9#C1+=6P)}>?)PPKazw7^E*h4U~N zD|p6?9C?33ok@^(Dl*SSe<+*ec=jylu>vZH;IQy*V$A<+>2^7#VJgbP*Y zrxS88ZK9&3CF>fJZ~9RQ^G@MVCO>}`w|R35X|-=())vJTCaY}0aJTP0=zhZ?_ubt= zV0HaV|I@Tu4y=#V?^~ZD2qF#XD0KnqRWE-pb9r z|I0FkfhpQ0BwMzzKr^qIG~{!%9?@$I`{62~37nY}gK+^~u^=8vp)YhS^kkm*=gjOTA zLAQXDYwx511@XjxiIAEhO-=%gBRYwPuO1F8>bt~H*AU55kh<%~?Kw=4Fgjs9wTseU z$H>?iF>7KE(B5oB3mppTVBL0>_21{lTOU9YO*Z_sGo4CF%cijO$&+TXlEOsInc)a1 zP>$v>~#N0meMs_VPGxI9%umT=V6 zf^-`180DC(oGaSZv5Ala00v=4+q>zX3q!69uGE6~=>uAV!P&iEOmg0Sijec&)$g<}eb;oVtoFy6DT0;oNEp)J2%nkg@r^>#R+Nas&a782n)n4Sg<6w>5yojdmx z(%u90oILVu;U^}7WFKIv&y=yDAx7yktp(W>ygAUa)=J_oTt$!u-ynRe`c1wHWGidt!)3A9+-66mADoAk`71z=2 zLcP_2ZKq9o$a`k0dVOu#I8(>#2k((1M-b6a;2~NAu0CM)06Z4)gT!^IGwtZjn>Q(M z5b(5Iu6yDlBO~MEcz9PEFVYF;M?pc+Q7wd8fCal;zg}@iyB4zs zDF0;L>gEB4>Z;?AVqk@YYz}YUI;rH^>==k~Q_EU@aj|5zFR9z-D@KPT(h^qqSvU`N z5b{*IF>=P1>)!rTY+JWtO8uL3mB5=0izgmJ5`HDqKc$Od%G#PDY;tmPe$%gLwFD}S zv-Aveh?quywe-WJ4c;md5s~Rca2<@t^7HacRrm?94Ie)yXgyBTOXU|ka#T`SI7}rK z?h8TJCGg#=qYbM-L%;g#vT|}rvE)^C9P|z*rYjg+-=x`~Bm*jlHIrDhW}m2DAM*J# z2-(l2%%Wa*y#N@rzBaWEF)72#1tU3F(T2f6og%EyoWac1Wp&A|zJ7yJs+P941VdP4 zqz1RzF-ucvP;c<)shaibfN=$vaY$o}b9(+pq^YUMu&@LaiRxE30b(H`jp*qx!Xq4= z`Sq*&-8+uIeg^Utm_sw3Ju}eOzPSARhjVgicDAOzz7xDab=%e8G2OSXqP%>hgALKz zksvL`$EWIx3V_Bf{aDOiB!GND4p*q!Ec9Wc9HRB_*Dk0Q$YkvF8=Jz)1~SNlBvrqS zQBRlPxPytF*Jeilfx#L-p1Nny7>LTTUw^srMQiFklFxbk_=Qb9eVKP;Ol+)LdZ)t5 zv}&rs;gwFy*ar_Lpg$CRd`~1MD)=msCuS*S1dbvQ6G#g?Bf)@YHBF@#PIrGOv_-Lk zEE^)4~NMEo$)BzXbgZLjI$@{HHzz~s@lHKI0iIy__cmo$u3;>y zh`Y9gX@=_kfAEtbt)b9%5=}gWaG2WYZ_Z-k_Bb;Ws%Z5{n@Z|5G8iu1XegWOt3&Is z@4#HRMQr-nK-F~*l;Dn@B&Zkg#VC5sQd#q-JW^3nneHmYRiC_Km#94M>${e!8ZsT1 zi>P%&g8XA51Brx*46_t~@-?WDzyrpRQ4$GkupfJ+93BDF3k=&pCHMD z$vL-)=)-Rp0k`Dax92ZidLw@6pZbqx7@g%&?#bez6-Gh zwds+(*DMrxj^J<(3Cf|XeN9ap-K0_+AjvZBI1C81C(E2+M#_Wou)6#ls#%BNzh$R9 zM&wW<;p-m25FmNWUYaw9F?X%EDdc?gWbY5bcv7HV*3>{*ae4W}j<2|DZ-2k6q@+tv z?g>mgf4m$D4s3lT{vZ7gh9s)br14*GY-RuuF^P#5hK9RX=)sLR7#j8^dykN({+ztY z+1c3u>V^h&vdnNIb~8!+5T>(MKEF&cUx8&0dl44a(g^><+VWI-JGEvVd^lNIS$TPz z$#<~VI)qGJL+wX%1Klbi;gpxxA}x=%QhFx_evCW{B5YxXv{XS2qcf!M-vQo+w8|Uu z9fQ9kT9*GzkQ6q_Zb2bfzJmMMnGg^I9G@)r@>B?H^dlx z0Yv4f8|8*i{%d4i=&wW%4QCRbu-0f}+&;Fj3sMhJ4`A)VrD;esn{h#mW+Ial&z?X3 zZFrbG=3r-MCwBU)Kt3Kr5--Dye-3J-?4|<-(zhVKi`A?g*t6#gI3gH=m6ab#@bK_3 z_!Qh+Z?^@$Ds}m)=j0?t;uTOHWTJ-AN>DJTsK|()dE(nQ^Z;@qB9}n<;ewNajSnLi z%&Q?Y?eTnaUjS3iwV6mis1VvfCPiQG{^u9aNGT{N0NO#4j%jPFax*cU{@WztuY^gw zw_bH`P9=+HqM|>Setn0p1(vbqSV0(50TEk$AMx;p!JdTRnqBlJD#O~cD+F^2c;b+t zpFUZ_Idpa84VgUN(~7$JKSO_s1)gKh)ARGKO-;kjW$^W%E_W47X#0dxjXcM=>s+!= zPj7FCEU%}axAqi95^0P9J1qvIOfj<7(a~{q{0S!j#&WQ~)YK@7#POzJj>pQzMo&eF zsKGj_@KB(tt1ELI3v5D&8oUi~|KUTRiEnyVmh{=?SoE$bxafdR^rNJtLD;%K;wv9M zaBy-8MQdV23A-M~rAv{1D}inH>5SPu^z`(e@}FRmG@#u@Ra$PS{4bB_)I)L{czGRF zSBKFiEh5wXp6Ka^m}J50g1^k>GNpkD4Rh{i#l^y6VjA2*Oh~x6;Vdm8kvI?k_nSA6 zh#twf*rQK@(v9}y#?V>TAOD$nWCt=)TMTBiryAUkjddM+8?7i7_o32j4n9i*4P#|r zU*B`>i4#*(y+oo~(oLomM`ABRjd|O)poU9*gpjVy*?by!61tUH*GDyW~{t1G= zSXo$tl7--Pl0Zhnk%%S1roT-ujzfVhtQ%x@$BsL)bT?|dH!rB_>9r#&;VtQh-Ttvr zQexuqypyb)oLcFf1{!?HDJdzaYH+I~5L4P!SPZ1kFd@3o*1(MhMh3Ugt5?>jA22r{ zXR_0yg8|BLa+sJJF3EJ=DVU%VJBwAFz0LGo8? zv@e#El|7zoenXb75G#vnhSqRjXB_DcGh2SL0)OZ7N7tE z8%`Ru^<{B!OMAQJvoklKx8e?etvn{d{~5EwBdd1BZ37FKBo79_FvwuZ3q~7h0=Gh0 zVPf)^eVC?(6VlMYr08KnLVCN(VJzwxRPbN0cCxXvk7jAu;$p-VJy2W`jfCIck4rK6UY0c&ES}Qi0uxLxUebo`Q1}p zok6IZ<(>S68kZJvOwB-=upL*hwA>lrQXj8{1~la6&8=6W@#aCf_u?#eVQy{?^)aNt z3e6oy@bEhIaMiJ_E=1r-V`CUQB4rP3RURbFH@CE4|3KIUSei?(jv_L)?%b&tq~Q#H zNPaU3GsJuM*k}R^;rjtGfE)i4MzZi{);$CN93Qu53o|t`n(fk8MAaZyV<{=u!E!ew zV)p2^J5+?%+4=dFRo8wMH=2TWAG+KR({(U^E3B-@2TWoinWI%VK9sP(EejkS>K~>U zG7iLSU^zITkb>X^r9r}Ohx6y*%RMM5S$DmWNR)yxF*Q~B0tG7D_sPlJf&w0HZtR`# z_r{8f3LJ6{w(N{JuE!D+?VaLCNIl}a;t5v>UKH@0x(_EZEp4&6$W6U#SP~vXP+$xo79aCTWOFGoqG9>R%(%e*9IR%l>JM!A4+i#W9Xpn4l(W9nTcftS zb6SIog9C5b;r$(So3ol4jt0{HcDN|$*+Iw$D>t}hlYWBi&cT4G?9T62 zKy@ZuV(7gW8MS5cyGq!p5I?+C1-y=;1!861yLTMMYYW>oM?4E~0R8H1 zjzp2qAy<^H0ZwsN7|USd27oKQnhqX29|%Q82exHYD_qgYKogD^95!YczXk(Y-G(T5 z^`XYijkm!Z_gegpdU{!Td1gk2=G-gPR=^z$)qKQ2K3u&{n#M@=iX^p(1*k0<0xim3e{qJ7 zZ^w=uAfb;=2^At<(I>(=eKZ7Pk*>9U7}a&UY-K{0u%m$o2trwU6R!oYD-{h*a7YMj z3jnKRMZZriE#F^|ACZNf-R$^rTm=;j??Py3Xo!i4P4vcRW@XXR(n?E7p?EPacc_6U zDE%0y@DM}yCnv|HX!?5E5BWU3@0umqi-TlcTUi7M@TuP^z5d71!GVOvLmz1ju7ANE zW^s5q(GjQ zCMrrn+7mUtN8nLAA~umjY*#0|ebe8+1P>ZJ9TocaxLH0VJWeBqz;s)jflJZ1GL}aI(<4bq_|Z9MGx(|9HW2$Ua{lBw8a{mI z3QRrdc`=N~>mzzg`c*RxTn?TG7-ZZ-sFjre5oQFxXTd)LwN68$G4Iq%yko()dp9|Y zAEnB!%&zCOIb;^g4a{Bcq_zd#kpA)1y11` zTn8P9;vGRY;vC6-Yce5q8#ir=Su?(q~s-uQA$=t{c{LIiH1h>6+t&fkjz54{Yr0<`G+u zWZjzIy_<$WeP7Y9TB-}I?aTN$IH<+WzGF0pQV67omM=J6^`l2Gf2v%3;WU2bFowUW zsW;l}QT!h~c+mIZgNXSvrKJ!LvMdU#%%OzvsVh&80~u?_m`wvZ6w`7T9)lnQhru^bMO3Il&hzy2boKCn zC%A(&a1d2-rJl>F($K)*9jXL43fhz5El}!V`hqTuns~N9Rb>wf-!wbW0s=Bz8&|Jh zU0nKJP;WEyt^s-?=A3ro9B8cY=`*}hpbq~9{+Luuj~5X;o6!i)Rat=+qP|^R#R2d*|u%F7vVn?MEFh8 zOOlpt+jQF0l;rh1?k|jZn(DT!i!5?;{HC!q(>9=v3=AX+95=`wFynhFFpv{rP%uy_ z{8V7_-1VG(Qd+@?OdTb;d>wfuIg;RD)}{nsHH9D5X^Fqgga*&;XuE$cR%A?eeaZ63 z?2DSgmgM6{yRro7!&Uc6xyyI;RN*MMXtHPI+1- zW$pCnR_h}{K|!H3te?Jp6K0^)N|P}=cTRwT^3>MiOlOM8a|h#d=e`b?UuwN`z;2+> zbM@1n6%SgHm_1vsiFzx%RzF=z^R>Brxx#U*c75GTwC-(BkMq*xsY8bjxw);L^#0)_ z$x?Cl00rmH^qiD|fq~-Mb#*m0+o@MkhYug7zg0iA^ydEYtgNi5@o{Yf1F}ORB=XiI z``bs)=m6mp`oFpt9z;Q-p4OrQj?PSd_5=vTPbWWNw~SWO|?X`i(T%n@%||$ zE`A~8Abt2iq491uw#`9v{}&Y%^-PTNv_xtN4j$5@*=lj;OicRv`tWBNWXklEA%1>- z^Yinbo}OvGKlXoUpd)EW(~B(d{rzJPBjf0cYvf)VvpA-E-&GH~)B(1<7;9JbC(*oQ6d; zN2eu{Ifs5jipJsJtQ&zmVig2tJ{Z5FE)Ka|M}7Z3Zk;tLFBt$ zHa316sWLP-FV4ugU~7BaW6|R3)vHdeU*A45+_Ps73(cj)@rI)|uNQy*WS8~xiEdO+ zaxf?|O^%COUKl>=EW<)aw=~`m6dN1+>XovY*+_ zCnEO>b5rb*r(N0+^74^kF&Q~|-{mJecJr*Qt!X452~p3{;bV8GUi`I@nVI?f=eL%o zCTZXG{#uXjx4|lnLNFsZ);nyX701O@#|&CPJV`V zJYjWp_02C6`sdOU> z7!MlLziZ)^n3{UheZgo+mYs!Vqd}|w*VN36%@Vn@tLv>>w-~~ejOr*9@5qF7e0-C9 zloyF7F8;Q&^GtgWA4B`VW0Nln3-|`aapTLEm0JM`(;ui)HQ7ZigT+J>?%s`6%@(zK z6}FWy(HQ#t>C+nD-v;+)IVpNmRk_bSx!lv2r^PPg!{=Kxf5ht5EpI%J3TG?a$`Sw3 z&#qkb;iEO)64tG>wwW1y^W5|WhFhyhJymXcbqNZhvrbNnX{pM$S$15v-nAHfq3(wLuI+A&zLx)bQ zsm=c!^Kbb|hua@{^QQ9P=(XamkrE@pGiN%dr>DDQw@k~PJa_-{uKZHhj~`(cr%y-L z*2*Mn80hHee9g|z?k_f%MH0Q;%E`#cC@3f>Dx&ejzcNsE@XY?Olclb#tdvxI3gK{( z=b)85ew><3T2e-atuL>lvhvfXPos7IX-b@{UXP5-%*@o(3TkT1%364Nc|(JP@1qVq zZ;5F@QRvHiR8SzgkIJ2wCY0E(!TN~FxpN-UY;|$zyFF?Kr&^~qQBw=z%F4m3*%Q#)g5_}qVMb4z-62*;6+?Fom( zm<}I1#@Ls~$IqX7(tBWd7@GvVCjy^B}$SiNl9GTUuscCm-FueS6Ix zq5OM(n;V`b;eCf#X!3G$a-Qm5<0T8~86ACNeWXG7-TU_^HiMci-CSK!s)Z6erk3_m zktKF~QNKVGAUC9Te^!StzG!~m8gHxl!-o&Y)9_zcu3Wj7TA6Dlm5SQ)^vM%fSJ#!* zRcb0KS2s7*wSU4 zem}0LsK_~;c>aaU#UBg9^wLkBJkc{V^F`UA_c7Ghca!7YQTuy`LPkkVO--q;i3zi+ z2^t6ToQe!5Et;&csKpbvW5&`#>eYl(k_Jy&*Ebo~&sPk3rmj`ZSTazO79MI)Dzp>I z{lRV_L}qj0#@)MjQ95dCYo9%PR#a4U`?luR<{xn}vGL6md23TkOUsKFKWfST>3=V5 zbLo;J(y-+=YaFi@ZEgHVkCq#n@7THX{j;m@N2;zL6zcrB zFkFsoYVGF?QOLOQcJ~K*7LLe(C#1PnIOi{4zTlkOtOKjbaxGX{S?!N8ZxCs;Bx%@O zyLL3OV-E$1kBm7VgZsfUwzQp$31)}XMW4T_7oZmu=^03>rr5O$wfs}bg~q0>_RoXG z&#%5GdsF*oZ7RCP>wbB8d1|VeherkXyv<}&c%D|8gM-7s;NafbWfi0!HMQ@`TnwH( zNi?zCcB}9@A(hIqeJe2ynPsJ=r3k>98rIh@<<1l9iiqr0G_i^}!$HfAfO)0JfXqUH#D?{Ks%i%^ku10O-*fdbd-^i(aXzg zYhwhpBU1NFO?Gy$dQNU$o}zSka6M<|z`iw7cM~hKYobrY2R;H^^_1+p4u26bk1&HJu=6ALZ8B%wTI*h&V_6 zj`cOPL`~q~;i1oEzI168m3(2SbgH;+bA5%k&AKf9T0fV{?Hfcay;Ol5+j32;kPv6i zoO%5C@sTodJo)kJQ-cFWxTL5k>XohalT6YcCDY;K00y|fgGFY`%gaGbZ@2gkA3o`| zG8ev^m*ZHe0F!-q6qNv<0SYDUqO38Q!&@T}aAPgH6mn)j^+OfGq#>t?A$E9*zZ z$n0Dn*cagFk>i!&flQJQBI`_%i0-s$+&N!|j-Zm)mz9~>9jQeUaLUBQWb(9XuSKbm z&L2?&UEQi{vzmZjz(SoLT_#9>Z2j3-?!wKzb^G?KqUb$=EAj;7Q$ZhGZdiO??S$RF zWA;WmI=y55TflnuM*O>3Og;d1J~-)JT~m{BE1ZKu#IlKEhtL7F@McSSRS7gfAd_9} zGJ=AFs1~Gd<=H(SK1g5x`eAvt>rsCG!u#jNg@qdH6sY}^)6@Ov;$~)1vx;f5{z43t z6AR(Dn8XEmc`w!9*p7yD+-I$%Y3C#4!~1vd7#SF{^YZrY*%PD6O->#PbRf5bUY>UG zk~)y#!Gok-p}E=FM#jeS?*soVly{*y1O^468mZ*y01r2h$ufp3EiEk}b;f*_J5j0d zD3GUz1qF{BJ^I45C@ShqaYQ~B#rGZP&+netrZZDIpkCAh6R0uO`Mj&T{%xR`fTS|= z@}65ZM*!WR*hKrqcG_IBwzeNGYwqulSIBssCRK9iMoUt`oz(rNAVcW zqdZT%Bt3liaa$bk=g*&0l9Gmohk=}_n8fm1E-R6^6M-> zaqk`L4jw#cR^hb0DvyMebkE+sX^79Q&2m>0%^C#%kxOq_Y?Y1vqPuft);p@xX|umk zQc~*Z>vy)c)>|%CR7g^WxcvJ5u_$f)o9Xr4Z;YiPKOifUm~(R8maXN>B4yA8q+=t3I!OM7sAg|(ufY>1e7<_E!4Y@#_3*Hnr?C7wDAE)_AQVKNA%) zKGgdD&LUt26hUV3E5Nlb&d$ei-!5D@kk+*|%lpFA0VPsf`%X|0@erB1hQ`K9-_nU0 z!*l1PEStjc(;T^1kp)ft&4&;7Tc$qF&gvHEg>i9(1@a$0%zDyGEV1K^rse}N+ul6c z`wt$l;fI}l>+8q~On29=E#o4C^xlq+o<~X4*Khvl5=zZ{%x*x?-`}5?H;;|DUU=k2 z`D?=LdGr#^hnPbG0=O7{228Wz;o&P`})i@^h_hD5?VSJNpz0)*sZ}!Xk=SbxOJ%O~Y zmN|Y3PIFKMe>OI5MMVK2=Pa-_+LY(mpA9#!+#b@m3b5?mgsv}aUTdnWOZ?+4U3T)VgBXaW^y@8ABdnStix+A(DI)%VX{zt+%uNHkx5_ppikbSs^fRu?cp z!znmV*mOPcMG7CkHY4q`Mmt&3 zo5#FyK6onGq5ezf&6_t585Yfb{+uT5N&g%pPw9t|k)ubB+!Z#bsc~S8Zs|j{wjtTD zkw6cS+ME79EL}{jvAGy=Cd?G(!g1bKN|+S{+JetL_DZ`_)v2n@P= zml0z+;05|AYDDM0lcyf^Qb#t&e!q3c8si+2o{XC5iA6(TQ`6BL z@w9|An^ybo?q2kgjyG>+mVddsyGKPuHIW5z&__l^t$zQGvLSHjP~1%H_2SlH%ZQ<2 zYKu#kevUT~lLcM4dbQKCG>nE^-s=nIcNrNOuq^ue`jbzFLRH&OL{|vqW}B`xOwP=> z|Nimi=1npLPRt2VTkBt|zTKo|M!^iS^$ppDL8pXVpp#=Qhgl{~m}{Oa{vpNAosS+r zK9wUtd%VnZdFHXn^V>|~4>L1~+7CJ|VZ^zk%8iz4OV%JfLP0`we~Z-jUR~W5I-srC zy~xO&J*6C~T?U0l&eN?iAU39FXQzDFLDoEd_N=|nQhojTT!#*IynmlE zXGA-#JM$*hdug)SxZLK?pPysFBsY4gNkD(>qM%S!SI6{ChoiQ(czSrCGyw66O(4D)I|%6#pN#9-K;c$cj`M#0eit_5R=o`zke1rWFaT6$v>ts z;q^$aohv*EMb6p91@m<@y4Jg=cHuPS^Pkc7fGE(qP%G+we?5`e7|{1_TV4%whBn_H z6S2aR;BXM%7@=ZfVw73}S8NeBxw*OD#_Evfm4eeuMvtkT)Fn8?)jf%r?9%m`K_&h9 z^XF^#3Tg)gpZF0#=ibK;tIe6&Vh`KEMJdQA*{Mu8fBX; zIx#uEdw~Ly(=ddV!?XV~wo>XcP&VFLztf{GntE4J>?A^P^96m@M zJeUK11l5?H_01M=uuGgny@rNRFLk)mkt0XIyb2I&8ZJA6xF<+Pm(^c=(*__vyCYULEiknO5=)EkJ~b8;p#bYfDy{R`dJg2goFI zm_5gSQ&3TTcxq?p;82v9xEG-qVS(8a10#x1t@lr%p3*QFN=Vs&3{FA*^@7bj;JjfyGZUOlM{a8V9(!WWX|2vAW`y?Jo* zw5w#;#)QiYOyuZs$bhj@EApO+6{66_m`#Iin)77sCSu04`}Z3g8X^ad`}+RDmmqLC zwSY=hZtYtFON#MmyRr4F+4vkr=YyJ%1;zuvVq|V1T*I%HE5NxG(YWod1($mx9 zl4vJqM~vdZPu{>kQZj7coHVixjaN@#HI&^?4u!xOtemlt(UWJ-czAh#|N2G8dYe1_ z$+3F=5!&}0EIUC&V+h31g)&Mw^b@f7%*@O}iNA3plPjl34ryPBno4w__%^gNv8?O} zpT4N~kA;;L*UUzF>wchW7FO0aYZpJi%?jr!+#MItE$d$TYlm|g1V?V1%XgJB)78C( zhXt_3A;qFJv+-*-Z8xuGe|I9`{A9HGMrO5bt zfeZs8SXfvHyG?rFW^u8js%q;K+dhWEBALQ-Q@AbG)t`4V>|_*_#Gq+xyk9`Shy2U~ z>0hs+n0M|K(yK0#Pd~p$UE&B>e{qCjXJ==^7_phE&a z?yb4?#BZu*Ru3V zt9hRThc5%n1J#64GB}u|`Hi@lw?uE6VH4NLjjLCWf3hX-!3h;Uek@@>M9ape=_*Je zhJYz4EuCkQSq-xiNkfQYT`lcppbd-F(5X;uq)_q59s4Awv zOin7eN_yOQ`)*sbE3u7bZ`zH!y6Ji$F)?%k`Wf5k>FK3UoE0m5pe5k;c zAsM{BAURP~*p67My16}-{t=WwRyaWBk*HK@;E%Z`bSwj%{?95DrQYK0(^sEPS zPIt}^LBiQ3yCIjO1J3(*|BfT+Sy_q>z0`$?KPb1wKeQ+xhTde+8`@gy_IUsR*Aas! zMxF~oo7(>oK?fdH(>0!ep5l{yOiSy(8TX?1|=-^Y34 z)Hq`psz%QgdteSnsl!20v(laDI8$;pQ<+#<|Evz09~wRQ?fm@Q+zlN&mO9rU*V)gX zy}y2V@%{UEP=mCrJHI=sX$kkY4@7P#T9ihn@;WN4tP>c)O5i zB3MpoPnU0_HAwy46{bZWUOQOSoYGZ=_+<_(9>pwS@c7&*L`y+NMnix93Yv^zk?9U9 zDg?ao_D4^*vpKF}Xy{&;+5Ph6%TJ#_qe-At>|&Evb(Qorym}Rc*5SzJh{(tkQ7f{Z ziB?+Aa~h??3$>o-oCGPyFYH7Z0^Y+``UOcY$jt(v<7Sii8uag~Xf8{!!|NeCk z5X+(}Fzl{QhbD4$eGFlc2+-??KxB47@wvH+{k*a9F!@f~pAo9ufjY&Md9Fc18msMq zHp}0?;~EzVO`d;EH1`9Z65!{TFFqqnZTdMb#kKLH%WqAs6Gk`!p%c@D0!dRpEaof` zJojV{!&aLArl-66v7XY_?b`gO97Z*ke)+^ZaF5T;0d@?%dq?>uh?ezs;Np)Tw<99H zFE5|g)I@Rmwe6F>e8H=5-O97Nx{VX^5tlIcqx%7aspJTxJ2^Y60cw`poN;v(!=b6e z{$8K&LwQM8P~-;=8~`Za(LnRN#z3zCvSj&)$uD@&q|3DJe-2^78(DmUz4D?V}oP zDmBcDy|rD(C|VS}yw>y2W`Vcz0V$Sg6?3+&t?ldAugGUHrmLVj@r7d?$CMhSM{bZ! zT>eH@1gMH~o^Z%;w8A-P&dB-=ionE|FOMHRGBGx`wXsolm2`=2vwr#TRk$Z)k}qeq zPE_zQsH11%CoPQ~eQ)H&wb|NVGbtbv3=9nkGVh!d!}iGLz_)6o%dW&rIVXErfd{g( zg4Fe0he5|eK6A9S#b_SF(_bQ2`1i=aHMB=F53qOl^&JutGJw?L=63kdAw+!O)uECL zQ2GE-gb<;mS{#8x@3!H%qnR0dC-&`^bmHLCpBNv9J%Bm0@xU$2L3rx98p+?G3HSdX z7GjJfeWXl2v(<!CxBPG*8y>E}mZ(j4SjwM=Ps76?J`#Vu1a? zbU?96p;;x<`~J zCgNja0O;&9ts0uZKck>yta2EsdO!mu5HYhXfZ6sICL-El!Lti$@|FQ zaqO7R9@GGs9*D`P@{5YtL@c%emmdeSXiy{Yx{o@ssWV{Je zLaLWUY)y(*$#1C~xDRa(QGf5=y{am2TU-8~iLj3#8c#Y;27|Ez-tXx-Y>5L0to5?R zyu$NCzihMq4(jD%onA9aW@BR`RM6$c2}R5`edEuL)k}{o5~`+ka7f50kaCF~PfJU; z>oZ>LLz%))qOiH&=Yhlc^k*g}CJqBv{DGV_SFmc==%@_l#G0B^^_+H#0?Gh65tr#! zuzZJ2o~6s|F5Bkt*jd^}B455j10>O{@bH4-;yj%K9~mU(W@M)gq~KbQrAgEu;81kf z;C^K4zzKQ6-{hqhCW9mn*|`@}ruD3c1LW(10$cEe;4{H)E4fOxZf$=ndEsqx3r@$! zHd^ip!~{gu-o1M}6bd4c-}jP}L932cx}9DsN@y3acq=KYC83Z(+v#8pIzI&gdl%7q zZAOEr5yBGa3~P~n{QUfLvCj*)n>j(aO}}-s#hDCJ70ZJ_RaA0faAUXrGHJZrHz3dh zc2SZ9VrbL6Cl-EZ-yN-O-V)$mw3Qow9NW!zFOpHWY~lHs9~A5gWOhtU5A?8z*(@jz z&}}hfq4yOQ7B2dTaq|2{Q5LBe8{FNAX|AU~5<2n~{TV72YD7!9-YI+gLd+B}`QQn$szqx@IPoW z(cpiot65kj5`C%2h%FyG+xJmRas_Xa#q9+s27j!aBk+%t{14-kb$ZkVHJ1QEJ!~B> zUk;nsr456&Gv``~pQ@@8shXjZsFCG_Y5*%$-PR`aWC=y?_yCj2JlU^1e_6EcAqs#e z8eq}lMMp+PrY0xv3YmG$zG3Af=3E1$bvatK-La>8H0pyW7_|0w=zbXD##b|&f)z4q zYJ8QIUtuy4Hmf8NRwmiyWWsEb;s8B=D5zjz#Wgne= zn{K78qoay0^NVBGW?q++l;9I*vy@jqMS|RgZuPjh7{GM>`j~I1@ePV+9?}m!WHXZm z1@uN$FaP{0>$f2prHpxyZu!voc_PdpQ&U0CHz;o6p0pg>TkmTdO?we`6G-g1*7ffl z!rmKB=g&U?_Dt*Y|31B=a{BN$?MitHC&cWH8#jW3gS8SLs-8X#=IefJtj>iCcpzN2 zw{s?qFL}^LZdsb#Ao_aRJJ<*mvZI4TEn*eSDOkL%UjY!xAYGsy!h{6Hl#Y&zXn$H) zs8KQHd)FYQ;6q7sb8~o(x_O%W_wCz&Dmvo-xi{xDIM+GoFKTK#9&S$;3064JG)z4c z$=}am+OUBVk0v?_Xb5ep($C{Rd=K-n!rWZ4k4&dHX(^_82*td=Pjd-Q7KoD|9=}G* zZgRw^Vqh7o_9O`VNQBDi#}-PQF&_kTVJT_a-5qu-U7HX6N(9)Z!s&vNl9HumW=e{Q zmzPwJ^MS>Nt5d0sIwc*t11vJ!rp4Tc$W@2RV@*^Idmki_R-7+`!B_ zIcbS8Y<$W|(&@AQ1(_=OdF3UF5Cv$cfLvEURFuM#p{530v%{c(Qpx=W(Gl7c1s3?+ znOp`c)X=iB_AY`3wFS+i^Y!bp^73CkwJTsyjEQRoB%cwQrlANrJ8}Nz%v_!$g)-#C-R+y z-{b;y*wxAaZ*IB++NVy1ym;XWDB$8!mX-Kd;m+qE4XZ z0jh)Iywvre`G_)!V){;@roj9Aa+#f!DcpQxbYV^TjmZhjwsKzI!3vN4tgIv5-AyL@ z67$fRb|67W*a5|1vIClct`}P-bq=FPg1Xsr2QzDH?&@uH_fgmC5o8xC1N@XJ8Up^& zHHamGo_VnzBjW+Zn`^&+x3shRA; z2a-TNi!pW9*IQujhAX4w<|(Io>mz3?<;THtL-oVl2|DstSlEpd6%a{MH3z%97gtt5 zrc6@+_nO$TG`bSs=FV(?S{B{$5$YOx7H+uTljgt`41o2TcOXriIYZ4DEtgJ+^Ny(t zNe=b<59obUeg$#@@*jLz$kVUyp6;w7PfkigHUerv#fEcofi1Y6s3wkbM))P2G0GpP zmJ)PqB^8xo<8rdkEyF`Y(jJRo9~$4iW7@bH+g#umNL>g2GD` zVNa{=@eeOwxl;D*8QO<6OK4-j`*+(KUAO(YMN4!RA_`m~p^a) zOo;bxOLek8|CmFP#A;0K;gnWi-aQ3l(B9ekM`=52uu(U%xhhEkXM09TsR@CHR0E}Q zMnfZv+6EK?oO^(`f7U-2hewh8;tP=5c3m{&f)whZ++nec?EwGB?1wBYEs1DG=)j?0 zUtgL3Z-RuvfLyWoZ3If~<0w@t%oT{hES&-jW=F(738pj!xbEp>txdoaMzos`50av<_Nk_3GSG0q&1M> z!GUc9h{qePp{I1?5$GF%gi4@Hz!?Jd;*TZ?CM2C*O^I6sd5`qEELv%~fZ$@f5_QVcWQA;IFO^nIjB9+roq_~@q9&&QTJ-<(bBL)l6C+8_$k*X)6 zA<=FAj?0oLvHJAs)9|q#zJ9R{VC;Og2e@1?p|{laY4b}<>Abe@$3su+0!;A7(NISn zN2_1Jd;M36QK1LJ`{Kn5;Jt*09NKnvhgLKNhMqlD^p=o>riJkrv!9x(>YdL;E?~sq zFih7Y&F{N8PQ`F1CdHMDmO^`QuQV(Y(fdRLJ8fjWR#dlp%~V!YaC39RA{~X_c6_8~ z)l4If*lO<_rCvFz(8_CVZH=KgOequPysEO2o|T3LGBd$~g24;Icta#TiA4J0gCG7T zKI*8{k4Y}jHGO@$f9V=18lVa_Fj}Cv9TpY_8{tIO3sb~_CehNvv;n=;G@M*qmtH4j z6c?N8>x_lut@T->gAW+q56c;f^TGe{J+zP;vee5tlNvss=y|s z-Ma?@>$Iz&FX>Q5Vzkgb+{64fh5`3)qkkHA$x^Y)RF{?MOdS2aG}QvD6QMBaKQf?W zJ)Kr>S(+Xl{`R9qHwTM&^2;}1cu=6Grl;dmQ_r{xN`^yudGu%}H8l)`(oW+Tj`$>D zN33DuH7F+(>8~bY*&YAb#AW2*&s0-lINPL7oFFGB&(hgr^dA^{+PmUXFl~KD#~~@H zcU@h=$B!q^8Br`wx9w(TP60_392&ZtHIg%El;b~Tu7-K;erhT~NQ3KjZtgNTN)37W z2Dk(NgBCNb&KeoH>NE%tSmGy1fni;<=#H}J`e<8#@jOy2oEQM`(3$t|2lw|41SZyI$>OzdoI z2KxK)sppq_I5Qh#4g(Xs>FC%Ut^^yM&(`Ki+*5{QDb&yNSpOo4M7AhpW+a%3ipsfj z?{4is3h9KAnq3CmbSefd=o81qiAa%*qwlsoa&5FM)vk=`1w~$e@EalxX@ZkjAf)tv zV|*ZLhpO=?|4>6wo_|Xj|6Rc*2&YluEN7~z8BAvj! z{b*tL_we@qJU_1wo_qSBqu|>5`pw{ANOj;CZ_XJpY)|Y+0JUdRezC+P%TyBLmBg6O zQGiuQ{P3IXX1y(K{KDlUcpNZx;QLjYkTD1$e0N zl=ff=s57{Hp~iHk$)J=!;URny0Zp;HuN97|6Mjxb=%Z;4Bh&^2OF)8jTv ztcKMc(k__l2&yMzy*)ik|HbD1+D6$bSNtlR(2lyYMb6jxfu6TjFVkFHkZzcu>m6N+D%Unr<=If3Mxm; z+4MNd6`_ixZ1A5!m9?%rC@Ig?cs&Jb(bwOj-f)B{{vjV99~4m;%7v@{s86=HT9{Cn z(e}Yaf^dN(gd-=HAvn*Z9D~#NAFpdoW27M;3bQx(y|L*rzu#Yg6?o3vTLDox_vJ3# zJgbb42k3lEI_IC+?+4k+$P*Xdyk#X?K!*+xu5|DCH5(tFjcU(jhtX;^2qATquJbwo zw~)=zC~vc!RCkpuBgz7mw~?@u(a-nz2t0yKEiHsKmyb-t*Ab}_63-#H;G2>_wvsYZ zzXUQ96%nboblT5LOMzBZURL(Zewbhxq=R^M7j8Wauvdr6NE04zg9K7yq>Q-=QGeMYn_p%!@$$@*+1n}l+X_#eJ9iEQ(fL{* zPf*jiD>!)X2?oj#Yfe0I$+5A4U_ZpQA1Z(}>g;?h zocQogo@*ac_BvDWrAwEhS&r*)&|;;=wKrQ0YM`nere)YeK+82WOrZKJg(^}BB}Vo} zy;eJO2J;sfM02?ADsNJ0(u|2oRZsrJdaN>cdf=4#-RAj_bmeYMLG z5P{O#8^sM@uHoZz7yl86LbZoVz{tSMnNeB!Zglj)oRJfRo@pC*6n6&65qntE0V#j{ z_<v{YBNO<4V!cYegkW-W8I&- zb4H6Cv=k-zh9PR(DWR-;%)c5LImyLk1=HCaqxqOCER{gQi;GTNTwEc-`UmL4OH?J2 zUSqfH0q5b||6**&Dn&oEj8uD~@+=RPT0#1SpWrYs(AXE+L#^Cv5$f!fcXBGOt&B+ zz*X1AsU-%Ek?Q~D9wYb+3_!!f2DAaVzo$&^l%gUrCi_2{wsDaAJObSmj~+$BFe!$Pqtuwmi$WD~>Q}e|(Z>_Kz;S zd)EM#0HE!a)|W3i4;_kZnSz&tU!#DsTkVv?4+q?8X#<)Xr-{Jm=;)Z3v#_|Q%LgG^ zV|L+20tr!(DPB<5w-^LyFp&lMyD#ci3>us-D8t5^)Y$Bqw>vdL$M5OoHCpRiRa^T& zJ?Hx`K%f}Lp(@cMM*?MzY`78&1ho!YUO}hB*5uRja^RjjKd)b*IAHVUz9&NBA2mkD z8uhYVPbyEGwlOG;?XzAJM-vu=w8zl$X~AW|SdJ-NyTq77Ly ziwRy~Z;5NOZ)!j$7aEuM_VtC|CXMkzFu4&>!C<*)CGKHo&l$_uqNevBc zAqZywI7EWsrwL#K&3STa3RbJ|+ou#jZf4oaY!ETH#NakfU}p_jM8e@i{$eu;?fq0) z|5~`Fuza+>zW&z_asNC}>puOdrYql+?;cund0`5D2dxD$lWrPhaR8eeh+|;!??w-a zsx$=_FG+BWSU4+FM8J_HkgyIjcXxO9x7y#g=bUImR?!imi(@gUue)0WHt{(puYgXQ zLx-$%Ja#=Aj<{Jdp`Go}G# zz(0rRxragmnO%wcudVx`0XT?CrUw?rSwbPQjS5e}2gOe;CQk&7nHn zsfCH;D^NYmDevB$Bm2oxneN(W_a9ObTCS((aimKt1==HiDIq4->H=~49CN*v#84_7 z{n$hOM<~Nc>&S=*id|&#l_}`OMn*KDa7`w>m3qD9LnP{6BKuY_PCM=&Tg-{3e&39nhH zm5PDE-RI9GdP;pLss_j+K+qrjhJ~>D`ueai3fNumoFA_9_lGQqjg!n%kzuz#`om*+ zi&1yc@FWWjdDhi0S};od4;$GVEfw0f`v~F}FOCZcw0C!FyZ=k`IM<+MlUXD`9hWl7 z;14K>-`!Rj<^O+ws)T;}B zBuN_X{T*8*L_|2AVZ;}|-P`H^AMWR$YfL_|nl2a{~O|b`0-=twZhg}_FhyueQ-WF^6#@EgkZ^q zpr=pW5Q6UespTnPq`)%g#%cW<17!PF!yB^~*cj(+Fi2t*7E#>X+&mX6k+}#;Z*p>S zQCNRFQ*cL%foRyCb&c19gA&}_*4W1Ru4Bq1pDlq9#3leD9+Th)Hp(9kA`iEAdUnGL zJa@DdL_cAd4PDu#Uy4{h-3S}5_#McX)cf}rJuR_b=-%vqAdmSD(*;&FV733tJaTV5 zIT%RG`H%KRO9R&-DNWONZt4z1p;(HGqSzNG(7WQ`@D;3&^=z47;JD*I<_t)Dlb|d4 zF}hQ~oEW1ZfB&xc+fi_iD21?WgR(0&t76n~rQj^qOp~GhEB@X;>CIS04!fO&p&g4$ z<#rYN9BD2R_ou+m0)tj$l>gpIlB)qZqhSi$HCA_`yGJMWsIz1Bbu ztNQfhFL~i5iMO{mY~@x~RsgHmaRPEcq0-Y^0b>g5 zAM{O)R4F&mIB6bniFfXZV2cA47t~IAWFp0PTR}!U*c^eBL50DpL96oY$&=|N52F#9 zJ*&!uRx{>51}KigfCupmu8Wpp?4}buh4+ugY4E@sKRq+ExqKAh|3F+Dtf&zC=Jcg0 zdM`nQ1=ITzegJgx$r8nzRHY>)HzX~t*QiRsCJGfDTqE3o3=||azB=d6k7EADZjt-f z4{cLRm3}mD`eEh~Nq#+gJDkIJxFb;*Snh3q|HDU*E=1X4^~TO_r`?lXVF`pr4Q{K| z`a8-rQ(woOLaC`KV4!9fd~_riIDH$;k=taln!dJ+^zY9V<~Pf!@R}(}p(2 zxbWeF*q4-x_^f!6W%&g58}Z%Pu>~_~9rn8qc2%so0CjzI3zR&9RYQWeIU>Rf%TlSS zsqu;z205xjb(^EvWk;cC7wG1dR78N5b;1HK;n}iPQE=9f?qno9G^~`g>+FF~p>cq0 z>)00%guqj2C$0-A_X%(a2t+7kz^QGu&OkEH_2cWvY0j8zW9qYf@i-kt>Q8l>tMnjg z^Tx1|1oJ@Qchfu=z<8vkH{c8gGgiMMPtm(~0aAf0%g@!-sPJ&QWfK4cn3oAT@94Of zG6ebx7!{Z{7Y+5<&j4gK!hZzYR|8+0+t117omejWHhPlfK?sL$16CQ-xOL$9ET|Ai(( zoegp+M0aSV3F@pztSN?`!ikRG!~cV#p{AkX15W?W0mT7Vdfo#*?J9BI82YgQdf4XG zJyENhWo6%ydDpRa24@Tg&LhbiZw<}Ew>0th;Tk-K1_lwS2eHu?P+oo%?ZR)vV^C|& zhoHM+h(~Jy5qo&Xcp9V_yxAZmA+X+;_KfYCJ5q?z=7ibsx7OFOIxWr^FSi~$Aa{(?lm2Y- zci5IZq<8P$eI&X1QWqOknO(bf@ek7Cx$oxD=pGojYhS*~HE)AIK!50M(latr<&1%g zym_k~+8$;fj3HuOr)Z~%HF&Vgo}$4+PDZ9)PV?#I>@uD?#LMLF10fVXJ&iCDD79t2qk z``)DgPpq4}ao3rMy%}VAScugL|n1j?PZO8z**LNio#Z!zR@tCBcFHhgV+7F76 zudi=Sbu}jCu;w+`T?B=MHa|To#!vys(e$fbr58#@VmgC2YB#t-6mFP)LqkI$z~RLa zb*$`{ua-lx0S){RHW>Hb?(S_{{m?;C2{(5IX=1m$_W_X{Z8MCpaGJUO`hM|Nr6phx zrfkS{7n{>eOCM8EUPUPboY;9xO ztg!|(M{@pA`QBaq0UPhoIjoLw$H zUvorMw5`3J3A2{0e`3eSV}RoBQ2XrW`~SY1VLugFWb+kA$4esnSW}1WkFAm7LrWeX zG_gXp$Zqzn&g&NH7~U0g=Vknf)!)0GY7*Yhu$SXnz99Rvi( zqf}x#;$9yN=crlklo+cUI>kQZ3j>M!^syN^nl@N$Mrf{c%{vWPbV`_8~loz_Ke zT=?5n+eAJ_fJ%wD^;JrAlvL zzg5ji|By}_1P18$a3xN-5kR>ZZ2V3Jfc&|%gn{~E^fynLSO*ps7FZ6NeRNb*TJZlv zUzc4wZX`rWLL}OP)sKCWPU-03Nok>he_zVrAxuUW*9JfSW!!4yFsx`W7}(lg5ZU*7 z%fglDn&`H_Z)L#w=S#hsUB;^%)*{ti@`_I7{O8>ryh*nU9z6=0PeSp{&9xc4MYW+& zyj%5(#VP(X5_-XM*fBzm&x%c3~W<%G!t5moW{TB5wx>%0%0+()m zEaiHMg~3}G9Izh>WIQnN%0i@Gu<-Hjq)1;8R$@CfvY>{KE>%317H9c42lg511->Bs zSGdujE0sn=rB;ipRKR0VbS)89yz)V^0u-B}xi9JYx-i1K9$08*VL-RoPFPBol#;@W zWoF@Up0q!z%g2BxH8eED*4L@>!-0vJ8C)Li?%hYBZLp=Se0qCm=gvr!4{`CQMeNwf z$8_ZTV;IfpBz7x5InzQ=vbJ`Gr5YUF>e>YosgivA1rmc8i>MvF`y-o)`b43hwDT zXAs@F2>^PVU3L@N3}G8)a2IO32jU65FibcRN3mKLk(g+Refm5TH~(qj{rDH&AhQ96 zV=|i=xh|A=I!6afBo|>hq@}>rgE@_rg#}A)&28e`^!&$;8F15wFH4f_G>dHa7mCQ~ zd5RZKBv_o<@$6N-Ya#q@c2WaR8+PgJLzFo<%(%R;u%i+bkmvlo^ujDs{m#q!fg}Xd zr>##*)ggG)MrYd%8KE_B#-$7Zm?nA98SNjxdjq?^A;uN z@BjDW4?6qBAme?lb{2Mpc0p-v*6wFoBv~}^Zi+!ujiomx42+C4tWtWo(XYEMUA*YV z`uQ6HhZK#`hoYK(D$A@ zMYv7?1FWgoz`-l|xEDa^tL!%>g17Irt0IqoHNErov~yCB>G2YsO<+Q7_R!6G)+E4k z2zLU;CYWC=L}dc`o<%=+-rC+yw42cx)dqavjkup9{(s-Q(=_IVRU`K4LjQF=lPVB3 zD$2^|E1U?M!E|_8gMSb0U#X7ddhSQ^4-6<#GGNDV<+88$qVsxz#lG zy6DlP&r4@qcb)M@_%2W~kRAr`fAaIQtl+9JYoR8=D(qUxAV2Qn9Pv6eLSd-mW(O+8k{yv}`5s@x9?3jqep z@O}fNC`xwoR;DVqW%=->H}^%49b=PpvH*%Gu8rhSE%w3tV!*!QE}=0Y3{IUoH7>ge z9|^iN-Xq4~Pr}ZgCS1Fg*%H0VIkF8>IJ6%)Itcg#gsAuHOHf7NHDngCxRIMXgIx!} z8SmdpB=TMdajyFMunV7k-35^SqOuYIhoBmw!DDVAcuux9Yu3ySb#)`d!seFZPSy!* z@dn5_;d}_f7Z`iczi7g6Re=)%{e}4Vk*UMLgA~rsp92_1@&d?r+&#RLfj5H(bUSVG!Ma++`Xr=RA$%!1))}B=VcKzygq*^9u_}W`jzh7NHB)!oUs){&Vd@ zL2oBH%#4X0q=thQQQ;h6B>SjtCM3KCmErei)lh>SDDoAkf6$m$uYO^Zr8+vofsK3A z%0xlq*qE4!$;rSTE=Wf(vBHPF_wYIHH?#0_(T0foZ*HJr0X0DZS7hJ7_krYrL|5ZH zbu-Caex6L8!2sYGKb4j1xW0paq%5K;4~|@N;aR1g{JMFF{Zi(mBF~r89@A16Ot+@_xl9Ko$Ho?^pvR z35Q2Hg>@DXgS|#eZIb*zfQ|ai|jZq0nhIVfe@0hA0mt_x$fElgd8#?sZ60HGKWg$jxn>4kR(Y6AtjC!nKDn6q*SNO zW8?^l%>Exe@B99Lt@T~&yPi7d?0xV1zOK)7?Jym!W30@)%mhKO9#>b@B?vmtmH#oV z!hg9}MPE-4hCIhrmG#{p&^p|V_3M{p#=lj4W=V=Pqao+UF>rH*>Rj zTe^J1ojhn6lYY zgabmESTo0?~N;lc$wX|F#H=ZuVEVq*5}*|R*A>wEF? zWry}xdBw%NWN&&7Y2W3R4V;Dc9Unh_Ow|$V@}AUmaghv3<`oot?Xy@MAHO+F^?SaJ zwy&>Zl%+`M5PQAzr?$2d^5{8!w!$lI1@GU#KmMY^B5$ur>Ep+bZ7nQxjg8+0-eeL9 zaO|C?WfT?7e$rOFa``eo@x8Y;JoBUe<;x?*S4SiyB`qy1+B-Um;y9F5W84)=F523j zedX9QG-PXH(#dt1l~B^u9R1Z%GV(Ro^yQ_~#>V_{5+b1uB2{b^iX9ytC*$^}>xf;v zc#)Zz+4y3NlJJAW*Y0bGGSbtFiHV6DJ`dX6BoeB=AueI3bi(N1;29H>q?nkr)YPh} z>A=81hmPXYIyw(CGwY}7I8>!VPZrG%XC_aNw#6kRTsAka44*!xrpC|D?z9gkMll&F7~EEG#U|iKP0pz3i&gu-YN(j^e8f z3=F}+!KH$3w65~yI8&djtgJ0Djq;;R%0baXQTCTEUCJ>n_rcd3ZttUge;M9nz5M&_ zzS3X+{yr|j)OYc;wzk8-n^=C6X6yW|A|l-4XCLO|*jrn3^YVUgX{qe78R+jXxY9DTH2nJY>%|KxY=PCQ1E;6S zY>Fm&daDWblP44GtmrumMNI6Sot+6{P_WUt&wrFWh zS0)&>+_$_TytbDjK=Y(m?%dL=xXDVQC^IvpIy{fHd3h<6=d$vtQ_%`w8NKLv&!7#IekS!VM(V()LY!d~va{PVRXb8KP_< z^YaV5v@Ll!gdwAM;^O)y-0}3*UO&ptv7>jO?#q{ghY$U#!%yq$W2bIfS4Y~H^8ER8 zN~0Hlfu4?zl4#66lTvC|m*NDr#&dkR_wU9X4xOcVINjrOS4Y0k5x=_16{lmrfB*jc zxda~{pPrr`8()#j4=o3Wu}A@u)rAYOckbNXV?>_)eL*zlP?jQHKqx!)shIm^D=XFG z$8lnOddKIMmV7Q>zKq2$bm+3kJaG-bLcgkKcJc>*!H3q?p!&YC_98uf{TG(?Y@D2& zA`{K5DW6+g!|IWn^T;?lw4a;)I->oNiX@ zW=U%+YisAFiLvr!6HQGN#Qt1U@3}w2*ID^ouU^e_>zC!%I(hPKbMwCK+b@Xta?x|x zrp&vLFomUg%fBx9n+xtw@HviCD68$mMlE%1R zFgqvbjIQq7P^~!k?!$)<@7neATfWVeD_5x3>#twGo|BW4?7K8edaKHz%2gp~GI8YM z#VnMJU=|+t?`JCCShB*0Nl?cFp7k>caW+=Z(&t`#m{%eA`F;`>8FqJo`*E)YZjy z?Wz(Ld;8|i{e*;E<06S|+k%W3e{W%04m(+7E)gFY8L6P4fM1|)IPvRyiQ8DS;_`!- z7)yKm_qEpezW2$B$qybF>*`AE#}<94BZiaQ+1ZIod~9SJ`Dm68OGfgBKTxpwb4kscJFo@>%3xaen8q&_skixi%W^;)KAjBDt6WVVW)~J z1$!T7WgU{0#nW?o+O(RHt=sVxPQCL}Wi2jlZu_p+9Ssdkq^30?)mcxUqStNTwryN; zO@KzIdu&2WOUv)y&ba=qThmtVHZLnFNzm8V7j^D!+&-6`9afJrGZ`5ehKGjCVm!y) zOA89fW@cudo^mz%OuyYM4D8j89cycAi`!!)x@8LoH@Ecu{rij5esz{TefCV@%J&zU z+R4tO?*8rDx6jVZXe3CpdJSj`v){aVQ$Ss+}`_0J6=ig|k(y=GfFI~Kt zD0lTqVPV{4^I`9q4~>m$y$m|OeQSJsFGfZ}!g+D-s+*e|N-IryeV8hCSzD3Ijvw{i z!c1;q7mF%gU0oL@lb7$HMaRXVCtTCj{WzaAyl(w^8yg$n`O!i(H8olO_Z=OJ2@bC- zJ98%$rh=ya{!Lc!`qJ2V(N5?z&;cJ`0)?{Q&RQ~HJmgg=(=s8KD7bOs)v2GKA3S)_ z(sBwr5?kir!Gma+qA}k-e?DzsU~uZx0eN{lK!t&Um*&-La5xFSloWI9DI1#~U2b|j zXYqe~dV0db!fI=4sgDFD;_WV8EV}ghNmGIhON$UahuY)zh2eP|%fSSP)U-5|kjs}Y z;m~61GtsY#J&}0$8X!b`Vq#)J!L+HOuCA_yz5TD=-rM)@Gw++}$MqyC`YydsB;}fx z3-a^R6FOO~I6w0VwvwK%k@$Hi0L(xy!RZl07(C1JKJJklb>fKfm2*b=dQdn6R*)`nJ0IdM|f(b|!iS zg)*E7Ya5&D$S@`$sp8q{Bn2;@g^BveNH#6$$QhERW>ZeiUb)1>wYBj9H=C??Y~PMw z-?Mx7)0Z!=y1L#`-}ZB4q~z7Bpr9Z}xAaXSPjrfAtFsOBfByU_tGHuQ0E^4U#)iTp zW8dCQmQt3Im*>Y*;N*-+NN8(m@z?wrf55U1b$SlhJ2Es>!4}FSrfH|{=zYk2(RNfo|7qt84SqPYrS@pXeH`p1*vF z{rD8<%Oh`$QN#*hCCFiZdX(A|uV-iT_g4quhbF#vV1xbC)D-@E{`2R&3FT=IA9nZl zZV(haEG0!x5?IB^+u?_XfXeZ*uu!{f=l1RCJw4`fiIJjD7CtA)IIPsJ+qZQM4G&33 ztRi$ypH7r?>&|R5djrfzRN6vC9uOLRePz-tK2%kFv9~ySvSR z?(!rZr4Ananr-MZ)~P^kVNc@x+rm1nJB&-e{55CbL?8;)UU6{%pRcX0{U-uN#19^v z`aSSgJNfXHOP8wNSD-*SIXizZ^~g_56ri~>{SEUf`u57HZ{TfQNJvQi`{Djx>^Ye|2jOYkek(Li19EU%q8x`6o9&!<-`7ybLdKI;N z`ozc2k1jN5k&qyLrPzJKLRWXg{ojgftE;O|;XEHW;NjtcQ%jX%z#h<6T$I|jjb8I7 z$E98qdnWp-C#RqG_VpD}MH8Abbi}r8$jZ-;32(ZwWlf;df4{Ynn|u1tAA+#5vU=Cl zq#!R}VBhg1J9`~TSVEa1Bv|Q+H6e(71)NbgZ`No9_ISRvc$%I*@FC@h%a8X0q+e>l z?kz17tyy};isx4MaO4Sg%*@Tz)z(JbygA-`o_2GyQrB)XJia6%ufCt z>%v|V;N@LKpmDvAmjr{6*}wmmQB)6m4(Et-T6+3XVRrWyZmNcc@mX2JsYk;zo=dNq zeH^#X)TGq?z`=tXjjGrP9X-AL!ov0I*8TbYJ0Ov5)`1dY@L_+v20t6mrcDhcd%eBA zLEj7wOGj4CK1GqYr&5#+4BYH=qwd~4gDRMIEXwTI5w+Sm>s|OGEZhyg1$ra@)56{T zo=S??&YcIPrGGzW>AwcpN=ite z4OjQ=(0V`+3**)60qs46L}NB{a`yG~94L@Kk0;*RDkUZLqO_EsEH@$YI*sr2>C?cf zZ{D0RaeI`O_UYqCmCR2q)_osX+1O0VeH74!_w9>POEb6WzIX4Qxan)}wt_3RBC@$? zBb)j8@7%rH`TW9L066y!13ZZKA{Vqt&J7#fJ9w%N@kWp*dTVirQ&UCkPI{wq8s=Mj zczWWb8!9W)k(Ex-d$}{zqx{klMMXsm!)#vi`XF=3zix$HvbR6%*zNc1*)x!cX&2=b z9kiAA4-N&2PB}*3i?qKhZuq;uk&_n0dDv|KrvHGO_bay}87LUc39Wi(&RoA1BDQ-s zNYYpQX>MMR!nA=p#m2TP_L8-AU9(_yRTV*?*DTPu;!}ZhfPMHjZ{}d4r!^JhPh1?& zKI_!*)lU2!ABJ6b#p39`$MgD~ZwlP``t@O)|D|9qwauG1$L&4;rlG;s*48Zlo4dRZ zP$JMyWo2bJ_nv@6E!j}ZqC;dFHRpWEo40SVDQCWoRfnv{hj_WTTnFB4^qCHKJP#^_ z190Zd8Bk&AtYZK;39TU03?zZLgEBJcSRgT_FJEr-%GkSOMP zSoc%~&(6-G*({8Cc9wczE%8`AJv|r31bXB|V?6rmB8G;B9z5W;TQ=Mfh97!i_wD(u zTkJ=U9HG+f$VI(-6T2Jb@M(5-P2a@1bLY^2a7AfpX|8f*U^-YDS$_M$ck$qK%F4?8 zS5DH;+q11gbGEcxoj&sA%b8XFW*0B6O?L~*oSUC-PEr`@?^jLHp$P5$e~>~xMO{m) zpsL6A z&AdmAfDzU!E|@tuXp6?=eLNx>!y|sy@z2mHxkNTnhgX@$WF2r&RDG^tz9=^B`3Z{iz#BZ#zvo5C1A`U*tEt?{?2-*{-|C5Rh0?M6T(YxU$HJ1Im$y0Lj8?iX zpaX7z1RP50@C5-~L+YBS4d;ou+%xoL^ol0aSdHo<2G{YM#02prqthb|(CPN}%uukWTw=&uc3x%eX&zHW@JbgOWFS|MC@#BgfM;2~zKLL6U zrYJ!L=5^~@zkI3daU=+N!Q7`$OU$dUclj5>ApjnNC|{iBqX~x+=6Pq=u3c+lVgi70c6iH%u)4aswnB#=wf9TV z<4>roj}Im6my_cSsRp8pxOTMkO#~oBw|ttw=FQR3(WmtE0&!J3*op?ZCRbft_((1R zsv?GG&(b=}N&uvPj)J1Zs6XP|q2;)hHbWlk)J)N->wFh#P_!i)8%m3!x4>Aif3dqV z5DOKMlbQJgy#Och_wV0lhokS_O(MDdN;wh&$|>3+9A0~0(&qig^phU!(~8$aLY`%3 z1CUWnZ=5P>Y;I;GR-QNc)^h68r@OaoLGN2lViJ*p`n6u@u$_&~j@`S%V+9W#I>g8r z(pMiPxoI66Usz=1-CMWB_UsvOqPC#MTkL*c^RyjBk09u;%-;rIAPD30=gk?FgLKjB z@wCzR>qMuZ8NC9^3JF=y%33z2XD8i;9Rq&2uy%NGu)wNu!^AEb!0O3x^jyVB%-nsLFLb+!w z2qgedEcES=sF)a2NcDku4XSeINg#|9CoWl8(UaL#t?+d-GwwTf>>w(Femw$$$!p8I z@b<2zy=!3N_T6e}e5|ajb_K7@ZbU=~@bj-@W)8p>Gjx~leEaroS6A|hbS+zlB9F;I z%?bWRbe}#)S*M*c_{_=?N$fqsz31Euv&w*b_cpz_CRe4Go}P|9?fvVHhNyOew5IqQ zO=o9`geDW9W}2{&)BN-mdBL%s9y&am754k`#fzD)G0^_n)OJ-hwcd#tAlVAG-yCRC zDJdzCL&72=f)g1y4ACkr=UIQpptGI5lYni30#mJ38I3lxOH2$UngKU^$2?qdwkvBW zj*mP1b9*~&Xo!i#lqn)20{I2S#Eel{l`~%B*YI$UZ#f88s;Rw&r6r^X!1I-VcqYgA z;)M%WmlkGGrKyJO9M~dXT3c(DeG=~9S1oT>J$8(fiGB+&xISgE9shbQZX@7kLHgh8&GLeW8?AT$Ng~|2MY=cP&0v`7icdYKMrlO4u{M& zHU_oLjZD5SU{!^Sg|Nfm@|i)THT&7KMl0uY=Xe!KnkP?w`ude;!r29458=1}^-yKs z1UADkC>7Y9nT@h4bF{i~vFk-|Z+S&hL{yZUiwoz(5igvn2eGjSSI~LGw#|HeK*g?P za^z^wbz!|YY$Fi=@88d{{g}VfQT!5xAN}z8b7xyybtnkHx<`&!F3wFoJ@agCsGfzH z*}6F?F)j}B*7bk9y3BKmnSAT`uAMs%$jIOZeEtk^(8NQB%p~G*98u?vMF|e{&;4Bt z)D&i??AdwvU2}78ak1Qv9mnn%1mOd#2=cG?wWNkS?w+0yH5~~ikuzG!hc!i_d3kx= zJ5HIKZxM_tzcybGIyU&XdcC5CYf2fxyJ^#{J9kzM+1-)Kjd zS?1Hl;`qG0yugg8J70Cz3;EI${E9yO*dId*zDvf(jxiGZAta!-bx+LvP5jZc5tkVY zd2w=(b^7F~y)sr3-@bg|CNuwnK!&5n^_Y{!(ev@sr@o&*ZwQ>Z+TXxI3-9uoM?Dme znr>XV>1g$Zk#9RhjO=;&_~-~mHhw>WAQH|R9f3tasZ|+9$))-X0~7cv+zhIXN{4Oad|2nUjcYU5Fl@qK*xxf7*4hjh>jvmJ66GL2w?c! zJOj2EN)FbkZ|PS*aEgu?*S>wZZUrM7zd2i4TB7BfXLe`&`ejdhWlL3N@A>fMi?xG8 zRAQmWH0|4Z<8NJEW5dHcckJL15Kx%%$#XLSWtp4*(v3@a^ym@vY=XoPH`-CcW7I`p zpAP|-DGRehayK&*-Z4L#e>OY!^&E3Z^)r*Q;@7WzoD=WH#_oZ#uf9!?M7C>ZQO$3M zDr#wTx{|Hx8cH+7&#?!(*M%*?aq^nx#KpzIHFo^@cJt;sNl8hlfl!p!ZcM~KgMM*R zUHx4msSs%ET3ncQ(Kkpkgr8d4%2%xylqZPNNqRPAC`FJq^IRT^ah)(WZtv#>z&zyk z>j5gYztY(PyKjIZiu*TGorK|a51m?!Ys~EJJ6l^@J33fN zOxpN2I}{bmb8@uKl2wnoM>JVGP$^p^BsPRpFZKy7%X<9o=i);>1tBVT9yp<*vMRh* z_w?z55)#lIL}D84q)Re0fj3i9Q_&MoDl1oZbSQ|4HGKOvo91=fk|hb94Eh7b*i7padD)>ChK` zJ#q4+9+dLiw*v%%LV&!`)QU?=+(y4MkXWi56qjbU#-1p1`4Rc_>19AS|J97{t-yON zSji&lL#De4C@mxsiMrGMeOFgkYwMqyFitcl+_d-Y`1q`plsube!K+uN&}Sjm-fFZG zoC;RRs;tv#7r8Vbx@S*Btp(Ny4}CrAC%iHU6gW)s$I@D$ig4n@fHnPW%|h9N&@=v` z9xd0&x9|Mk&UuQ7{{H>;DfLZ#JtJ`|IvP!<>Im9pO$HMrtaYrc6PbD_aXI@| zZ+OYm16@o*l=Ds2c^yc5K)btQzqhxq!);!JR?5oE49F&N@SvuKhLp7QpwU+V1w6s> z_^a^+%TVk?3vwhn(rj+(8Mb3Ls~&#n9omZrutMv8nkS z7WTmY{eD-B-)goCh*!qmxTHKpC zS-Z_T1_nHC2^+JV`vwMr>-)?z{knl2sPB(sY4on5JtI`e)AEEhvztak0NkQUExeg02U|AC$-t{|ILeqD{7GxrwgsZ=h?a6ks)!D%2+` zmFie#*s@bbLp1;8%g-PUWOiAcU}(M{PCA)G(V~rxLRmQn;SLLhiUe?>{0n7e`GEGwx8^i%v83_4nb6jM0Tgsv?s3s$cNrJ9EN(fzuo`5R_6}CEZG6YmhaL?)u zi99{fu(UNb0e$@i=tU16dOKH1B(gzK3b5z7o>X87;OD zQ;i)AUF|cRU0m`$=k*CN!!i0 zLhmF%O@#gjAdPZ2-yfrm`vcNnG2}=r60aBM|L)$o6EFwd{G+WDEjGU!{#|#Egm6w* zlCsm_yUliVyJ^DXFAEAbFww(#q$=NXgOc*(@neF3N_`_d+`N9Xsg4f&*j>7?h9S|z zhm%xAn(iNDA+yiupFRzj#sp@nkkEP(%kNCU1wgMo=ZjzD=8nOj9T*rG92}$^iP*Pw zD_B6FlJIz{6NiVsMv4w}>JQm52lRJsG*VkfVp_H0Jp#! zK6PqS2Y`UYrkjwV@KETW;b~=lDqr}0lB!(u9lEF(*BjtHo2L7xjf}j&z3FlfHa4Qj zd5wO5S^CqD$IaH83>%YBI(>R0O*o*os%lkKefY<`S{3Z4kFBj-eAeLCoMe8j3D3>9 z#BSQdI6zyA=nN>|dgzb`uJ`kk)0Du_xaepOpk4R{U?GVlH?o@>ON;&(nrl*$=r-no zL11(2V~QRV4EIDoKR?LG*f!PgMfSc=QaG8S0}O{2+66q2XeBI8xuAq6TRNgL^i~r~ zWNO-VW8-c!Mh;b2pg6RzU%$q0zOJfLf%*%F{FK<8KY#u}D}ozOO%WB9lk>!tK?L~s z4Xg!ey9(Z{_F#-w2i3MRGHS!=Ft_0_M9swZEG#I1RV?Q|ZU!krn~|v$B0Xq>JFm%* zX%I>a(ENc->!`}~asLVTZf-JTAckJ17t-Hb>HTfU25y{45$CWzv)`Z1N+Ms5t9X+~shO1}oPBF22 z2Q1g*dU5=6hEssx0}CnGky_#gggB?TJlhQ6m}(fLasGT_Y;0_1=8lA>$gnVv+284* zO*=<_{!INe?0t64wweJ57!FoeK|4rKZafA}gqnofPgM?D1Kt6BHYv%($;nAwohea^ zr*W(hJ|0o=<(ZL3Cui>17k5Ul?AmaF(?{>6rEO&k*}ZRHh=3}Ss;Vkz-YNn+4J5_9 zzGusSc=E98wwg(MbPg|1Poy@?8979ycr~HbQK>UiBVQ@`OgT^*;61-aj5`B!;5*1BmVv6Wqdjn*M9oxnfQbR zxaY_xKtm7res=NFrJtjt1D_;>58r&~zGeG%h6FMzDO5*SUw>OnqmEYKMyr)hOkNX? zKQr%gsD%zfgr6c`EYszpiOI?89>*a@YiC>-<`2w;;#H3fYzv+)m8O9R%Mo9L^@cZIAMT1sA?6{3dC zXr4Rg2}lX0!h7hXSaJvD8x3*@c3KsiNDc0sjt~?Sqy$#HK(pVtG4{_NS0N#xHGx~M zzg%OqrlwqhIwKj{yO(y;-|O$MN;Z-9fWSaH0w60yfIa~3C)8ex9cqZX@RIp$vD2k^ zBNRK<4m7nwF2{wO73Zc2R{^Y{XCFV_h|*0poXIRI`c_@thrVbfF^hOdPmgqWl^I02 zrluye;e}x>F^3G`^Q%{{nrE_my2~$tgMyfuUYpuT6JMyX&X>9J9WqgDaxwx98kwJJ zOTU=C^}`obmoKecZfZ)(7D5S)nId39^ zD{W}wI`5HFGiovbM}(hdf;4VZgwm$V(JA>jJNq4U=6}W%&e6b+ACrG5bXx-U#4FRS_rXk(53reyEyIIDDqX zyrXU)8-RAwRqC;t6gsqtpZ}3=7M^sfRMc>PV+>XrWFLhNvN-p&AoJ{Qk?2?6v%eum zO+Guer6e934o9qaD)LFM+KCfCLxg;6QRv9DO*C<1Xe+sCX`H;gPaZwGgQJ<06nUws z3oSA4tT+Jc>*+VmDXp#WT$zn1ETm8-pyS(MQ9oG~Hm$oJ9?nAesfq}!AR~T%Zb<*j z7nD?_iy<*&JbKg*4RwVQsPPf75-d#cu=mifU!5HtfEgy#F#7LM%rZ0+ zuGdc%t{TrT&`gBro1VU%#wGIh+qcbxjK<{=amK4det5&Z*I=qhiFoFpXiWkNV z?wJI&eftK^41;n#nVlmuHT7dxmv-hShH0~ynVA{vixNM6ukMQLwHhIuHwb?a*4EX7RO%Zo<zzw!5Kh_L z(O&Lrica9w6*hkV`t>^GQ ziFB?W6F42c+zh4*4{i7E-B1KG1%Rhcf<{V8x&Q_uLMXI6!>C=tsXZP?SIK+E>DS*b zU!J=cr$jCy)&su*{qWf64pC9aUIc+lhIZi5$|Az_)-TA+)n%ghDD>vPbSg`VBGK-D zhFb34y?Z2t&8ctzMICHeTe}%gACMJ=3Kou2AxnSm3NQowN=sY4+mAgv9 zh_;^%y8$_X7F#L1;tnoz8;Ws}GebhBCvdKhL#fDJu*mp$LoF?~Y(iz+&Dg-e#=&7d zDfm?h0!;Xk`v)&)bhe@)_74oewzj)+1>MAVamqmd^2|dt2^<7GLFMJkTAG>{^3Eb= z18_#dWf~ZK#bYalgZeQ7#@Txy1?*7pQuKx9#zxq$-Ip}_%U~z3C#a@qTYzanG=G>k*-3j0VTBZSC^hgn%WJ?jV8M)&qw5EWT^nca2lL#K{-doRFWnwuJd z%DuEzRMZ-BikR3?b=-kXH@Ba>OKod&b9F^j^hI7Chr(FMP*pGsL4>l{FVh!(zjiMq zgwbEgFL9N}*8m0sD1UdI(bL-+ z(}=bJ_OqOxpRb2dLrqOTK=s(d7no~6vLrbqJ@C_RZ}85C~#twm6!sXPe@38OUH-M#1K_V0Iug^8@1{$+YqGFck6Wojx| zK-JG7qpG_4pKXb2=u6Yh0??=Wh6Dw5Pq@SW<>$X?y@!d{E^Z!86|i&0`V#DJY&^K; zD<3F<{)ajYBLbnCIb4cBaYC8O7ztQhh#ZCBM=Xi0zpt*!d} zY+#mukdnaV#B__V-tfV>+H61M3n&m+`?>=X62HIMBtsL0TaJ^Yp>ZbrEFFnU;;{d@ zHQOEz4B`j(yXhb890Pzr4iP%KFNcMdV)boMdEVEME>rIS9)y!Lvbop8q=*BEadv6JF~%Km9B) za5YVMS%_v}*#`#9K+xI>SGMJP=qh*qDGMbff2XD*ydwPl>7vyi0Xu7lc&lq@tRsX0 zD9N`J*IE=+N@pQA0RY^t;IpuaRG@EaS`Ln}+Q8ydIKa{DJ+@g{WurCQLS^)z$3Qdy z!pFb%2292BcQrO<;W5#^rQ|qNCiA&8tZaTh?NKtLfyF zS5$O}#??FWc3*kxhY$F>cwnu-%I@(+Gh9`e>hJ04!D~uETUWhWr{4WW6DmkfyZc6!VQXn{ly1IIW)`Tg&y{pUe(lxXv z#LYm98UBw^V2k0g47<+3mXRL*(%ajM21aki_VgZS#Ra8R2KK;OhZpoW^rV7s96D5l zlnwNjzc7bkdnH*Qdi;1;N=gs< zH%Dy=Q|(aUjZ z5P+WLV zZf-(?f{{0GdN0ns%*#7)XB)(a9Wjj~U!DbiEOFn^e?cig*B%)ZNT6Y27- zM8Bp!zrd2H6*6DW6;+>%Tv|zq7wmI(%g|UTmvjUYjAo3RLmrkgtsK?xaP(*8G0h!& zcI~=^Z!aq=!=gY9Sdr#97g6F~;0TtLC7wvHdM`3(4WY)=R6DKZ-&ZWy*;rd6`IvG} z@(?vT7WU+}4S4K3_wCbmyu>Qqe6Q950u~4wH#VxBogHk>WTgdnOVX3bE56~5_U`Uz zM0|XQX&ohn=ov(_8Io$(3k%&4umURS^5jW3x5A1gc_tE~s3_WWEz(k0 zcTA6U<$}}Py*oHOd_410@Kcb!JJ4(w7Z!lYdgvS_`t#>IZ3Vq@7s>D=>G&U;~^M?)}*E<$dw)?}^|P#lq5MUdp&xiba^)sfW~K!~7( z1<2EQ_gqwcw(MVtd2G!d9q+ zf93t|P(;l7CjK#dZ>D}58T3ZDdqSHw`Q1}?+#mn$;lqb8h2;f>czHdMJE4ZT+x}nN zCe=VA1>PF;Bh)G|CZ_%t&HrqJ9&2`XoTp43F~|^;KbjpbUgQ`(7nn#NRo`du>>L9r zRLm^zEKXuT`8p=+qKi;5Mn|C>hul+UH!D1eJl^)0M#L?QtgSPEL})tlnNObZZrA{= z0$5GfWh56r??o9lOx>_3Mwp!Rwl96dbz=nk@T&X&36wprn5( zF}U1)W|8&~G7yqfx)NKV4FX;k5KvX-^%si-iU!BdY)3#h^jV;H^s^uV)mNDQ0EmV| zO&6N3b?)5v&Q3uK;%w64Yfo}=*a#rgJz`>h0*n$+h*$Z4_*Z}_Rh=(@ykLJjeNdC3 zf_fJW=px4h1PHQjEA<^YaAQP3*i_+&N+&dN7mm^IEp{GYCX{3&{{)==K^X{MaaUH2 zccDRoJlkGxGc^yFMo3u(C*yX0zGRqcKw`kw4}%@|5)x#fd=ExGF?K_o2({1E%`G85 z9RTgzm4*2)r8?2XTc%c3=&O{+OAYeqwQGC=+S` z;g^_re&vkFR`q~p5d?D6xYaP!N+=FAt_J}wlCgL1iZ+m*Xw@QFgxmu7BoNOO{8+?} z&BsckqfkYi-Q2W~ABQ68mw42ci-(7$MM7A1Afve06Kq+hcrfvQgt_>5bjy|Ce_C4g zin1rRg_Do(q)0Th2NVc4V2G-h>zGuE8XFq0O;L3h#_qcWwqASsN!Klg9RPK z0^fmUi;Z&$lq~r$D=D14qCku@abqW6ra)6w(S`${mIlpWLl`|NTq!}pYlTVUq|$^R1V|QxB(eLSJCfGIz0btX!J!Mm zR~j|%`t>#XmtTqO-D?l^3aJrDwtwfQF0VKhJ4FeVBFvw#{}DKSX#BH*Y1ZS%NbAEa z+rR1N@@(?5f17caSEVnw6FYtK#1M`)D|?;P{8J=9x3b6FyP)6oJzW<5X`gDH)k&$itW`LI4>u z3UD3hA>~LIG_iEhWdy}AvV=bO5I{&NU3VuJGfkMYV(eHgy5WWm8-TDEXs$o0cGK`Z zz&8F1b+|7rc*qMb#UB#UhKpHifu#b!h=#o#7+4Jj!VDMjdg+}R=?UDw-}#@i!f)J2 z)y+ZyN$j70DKTeie3kb4XUT_(z34WBNV4ba*89}}k)-zHLNxg-Bm9m(c44Ogmwdwf0 zJSQ+YfD-_(pg$fll#^OoYlw$Ug`EgxA-N4a0@0;r{AD}S+sG#{X;^|)!otIiUf7<( zz#f8r1Sxt3d*fW8{ds$P`x7UaY2vFM6&HVh|DKI}V{M=5{~t0LG>VE@QSgvtyEae8 zufmjqBzyGeQEEyJZuk}GRp>L%cxJoJ>;(*|jy%P-Mn}&V*u}$Jba9yk zAI8elFW=gKz`wq)`N5%2u(`2iD&LE+WBr|E+rj;@zWbNTm{!J6&Ybyz?dV&aa0}ZX zV?A#0L19jS6NwZ_UZ*4+uv9}Yu(8PmRHcdE!gvUJ2&g$#S@foFS^}(Ux^|h#|DfDT z_5x`)h^Yt{JvkUK3{;^Z>hjMWRzg-V*lja=@*7R~q>%g{3!Fxv`A1Viq5DKHq#ESI z0WaRK7;a+yWng_6bwZREVz9Z5|JsCGc^IC=j|MA_wdKW;0`k*-{-2!JvRS;!!puww zGQ`P~@ayj3*pIu*)3{=4GFvnu6(EKw+^*44>Jf7yJxT8BCFsS#CeT|{ML5V}L0j=b z=;rozc2F1SY2qJ{^wCT{EI__-y!TU@1x!t(!g2qH|4bdmV(dPXEw*})0)So}Vx+}4b zv=*Ib9425J5LK&WN34Eg8YJ&%6~t9;A$#io22Q+(M#doP`IXr{FDwj+rR&*i_x$lD zduik;)mG%^d-6W*8kOHqO(80eL=YMoY>tQ5j3?n? z|BnNk;rF#V69Yv=1#%1?9WD2Sd}ip{D!Wj86N%kblo*a$8^LN+4uZfA#tjKJzhzZ) z(}$0-lWdiaT>^L}hapz8(g`h2xG&M_+S^N^kd~ArWR`ufl>&T3 zAZ6#yEFs^83FsW%7u`br?n&Bcp`Su|8`nD8!ykL%^OrA}f!t0Lj;WutkwI`3yK3+v z5AH$t%o(5G{b87ANYpy^Qq3FK7o#id*RQ84yR#Xs`GY~MDmIDjrF&#bJ5OyS1rA^k z7>PO1K={~7Kla|(2y_R=gh4BdgrzXbKVpEGKQls7;HuHf!!7n5wUrlnvoHoOzKh?qA%Z`Zx<0+)s{U1Nq)$f{s0f|lAV3!dQdp4-dF8L zN(v?~O$K>7V1&Pa|GNCng7pXAd_$Nj^!Vfa5^%tR66ck-ZGh84 zYKhuvv8t^^2KqOd{TJX5uwh_g0E?)OJ$Ahq*Nw2SMi|+mEqWI&q!$*-U{thTaS7|) z(32S{q==mNTEdY`M)^xpEf2l7iI*2AN7uk0L?CD$y-C%wyYAG=AfT!D1cP8ySH8{q zAF&q3FyFz|kXOJe2)+IdZ=M=)4Zc-#c{x2b5hZJ28LAo9}M{r6{wZwj6DHS zaS2cq5HJK>vQIqM_Thusl`9H3ANVq-eGfkkQ*WF=~;(i1dJqN1Sz{_VXH z1rduXobQAdHWHH?lo;qS64Q}VuT=hLNmkbJ)2FXu!os2JH5Pj>p`@lZ z2na6!lZ}HD_6b12+}s>ObjqjzWIIu;%S5L$*jpy%LB__KKmEc7S&528MEZp%zLn7T zWI<*y8@Y+5wTpJ^aj@y?^`ASun^%)*z4SK%S|3?{|^VrI|>02weZ&aoTX0)7tM z?eY5Q15#47;bE|nVC4VmOs_yTL4~_z^|Vv1ukP0fA{Dd3Q=mit?E=(`lNmpFhJ10gxrTx*{b7(xZKNmfpy*VhiF8 z*uKz|wD!vfcsGD5_%1L0#fZvE0M$@*>%oHntOrF!*Cg!Uv#L(00|`+8n9!JWaBj+d z7V9GTU|e974bnBjK=RNxKsvd@Yt2JJHsmEGIom#OQhv4lzyXe^dduBrK`p5LPO|)C z1>phRV^J;?%k8qswtYiG$T^dyPf910dC#I&BP4Oi&cDeTgm<>E3zya)cO1`7j|Jr$oUhU<}Y^R*f&eEuX4f+1vyLL35pvX88b|&iO z=g0qs3k$JxaBSJSwQp<;`S)WeM+AX_jQHN$x}7p8r?7})F6Tg<`I>VcH5)=9=Nw{d z!i18FiiPu{NJB`^#0(Ukf|oBxyUK;gccZ}hF{zL$mApw(tLT)j?)~;td!%@;K%&Qh z2Z|D>f(e_~&H9jooT1e3FD}Nw;)51~z=XNYY$(tSDmI?A!vp8E++5599c;NyG1AQb zf|na;|LMc-BnTvN!hG13W#jJMYp{|4cQa?4y#>UB94Cj@j^NFi?PraQ(0?=^#{zTW zk?%Eqy?_OcDcQ11TwGsQ_jX)da*Yi(+5aV80=y6NldaMyc(AX_wWYMw)e#v+l54=x z0uw0!)nB;&avMIkT6^~xMwB2^BNSR|p_#6X2lij;<;$1r0{vy^80g>#(uO&m3HoF! zg@3%VGoMRmBjbcnCOTl-y9EK*$$1pYjO|ujJeaZ9H0`3jJv1lGEW_5qJP;NJmu-wU zd0^V}jnks)t*9But&k9YLHxNkQOiTgzj*}y4J3Cs0AzN-O@&Md3Fn^83y5)^>Iv2Y zWq2UvJp6GxHU)2l^mHsj%XrBM_@m|JotUG}$@ztWd%)O3Igglrn?UxCxqZ9p{k4r^ zR1)VYh1X6Ci}oP1`Izs4hXuQDy}?sR&^R__V{WL!OP&EU^FIX&j?Fwj|2N<2mpD-FjoP#Fj*=@^o(*a4TrD2x;NkM+9dAbSgGq^%fYdN>L|^retejl0qpa5J ziJ6PIVn|gKz413*g=*SbTA0HrJ^cE4d3hJcdl2d4Tr>k>gSm!mSiOlgcsF3cUkp4V z1z5T^JoFCo&mz%y@yRMugKy>Q2t3Ky^#TjeEozy8wefC*&a36{is2ID60)Q|c6Rz8 z(}scOyirC-IC%V8iE`UdWbPC(F7*0qPblGaFEnA_D(mDhYD%^5RLZ}1SwJo;F+v(* z8$VlpPoEXr=dWMK+6tSo&Y1t)t$>4$)D~FekpAZWF|LgpAtd>|D_*hfrsa{nGnsAJ zc^~iwEel#qpJ)BIZ{HwFzyR&{d~0d)+PmoA%Nb(wHfEyPfWrXEulhY2tmKBNPND)9 zyBXtbARy!lcjA)&6YVT1C&$al8Cc(kfuzfOr{^&J#~j>?u4kQJM5QsVOc*dSj*N_0 zl6-(pQIL^)hG4QpuS9vYbZvZEf7BwX39u5#G7DjfhN3nQk>VD&%) z+DY>9?pjIJqEo;W7%DPLKX&2-aL}c$*Vll5F;iYz`!5*{#$B@xroH3p@k;tPtb<_Y z*dG{*L2edD0y5uf9t7Y)o&QA$xv+n>9*bnE?fD7!e`cZ&rvjsI7^#YleVLz6@}6;A z5yM@Xv@zsTbzVVf+lCbra_YTM-#&|($KZq*JfFsoh;zRMrpFcG#DFxp*IE6r_fhkpKCncw$y-MWQd1QAsj zx)A2KZ?6scg?AnF_4cm3AwseLoO+6L^?Jx#NM1xmL^Qp9Tdl>6u@l&s86_q2sH=*_ zt2bBKK*9sb0(tLm?ufv5`72duec`$CxP6>2LahXe2-rlYPH~XCIpQ@6C=|qt+Dknq zsoRdw=fI)|klVl>3 zCJ4euNmEMx0`dZag6}_>U_cPBme4L?=eKp;8j8XPLE#qOs&oE)M52Eh0{@s51FyKxQ-bwq+8-OtUW#FaO@yX zV;nkc@#JHOSN0vncr8LjT4?EAydrAXpG$eb1LqakkOnv#1dR*ZF z=Atnn0Sf4YS92Ng;=L)7Qd0f3oVJw=UhcsaNF=49xS>7Mn&bqdkaO*zn6J)lzRsfy zg$3b8pZP04HO)yECweQ?m9MMGGzj7K3n*?YuU~ln9IQPru^8dC^Tx(F2kvDWr_SOf z0<+5pr>^{k*-(OfK2!h{E$5wy`~A+3vHRoaU8jDYmXRsU3*p+fp|PsU0>>JHG3Apo z8964RqILZVMBHE;88dH}`Y^QSANULn4TXyE+I=FR(u^Q*teW1vLqLRM!v^eHW|A;H zyliY))Nv~bkB<=uJDoK&TwIzTGma1)$9pVPZC?}?3LW;QzJITE<_!1zAiNZ`1(dAi zaVJZWHD0eq1_z~wxnai5lqzQVDGjWNzlk0NaRN*|Li6V-9UVs}r?ucW16ch{j zr0lG$_?r5aM8BzNbH|}KRdnRCBdRALhdMe^Fs6Uzf}`vMC<;(+@e7P3-Z%j{S0-Y7 zvRP5PHy=ya*cir`LNCDEAzX@g#CU=VgLz6HJQxufiD3sc4b0m^|3QgdPnO&J;lqqC zt>dzW(bO`d;|;te;&HK;3({Woe^)XGWm>!*)=1CyRF z9wbiA`W)|0beT1=nEv}$Q#9sexI^Q>ZxlM9m#-#XO$lWzs_ZfqBQ)|nrpQsN_eQI~ zICll1aEupXmJ3UOL$asiUHrG-U~ zagpx%^BpZM=F$nx-RD~Iy_wl(Mk*@sYMI+7(m{N1(joXNv->OIXn7)$=j--i<<&lu zlauJxkq571fEm{YRtV*uQe1qguuVYwPQC91cljhGVe05KVg-UxKQ_I)MpkMk%01k5 z)}sdIoyBY>bcdw-Yllyll$1#EvMRIZoo)Z}WqP7sXvDR6*#n(RYYO(o#du5+of=olvgmtkTwD7m;YL#MDMg( zDFVIQL1kNq;5CYrj>;R&mv^%ErE)9ZbN} zPpUNIAM=m7bqgtB@t8*M51zPKyp#g=gU#D7pFe}9OiVa6-(}@zm+5u|z7UBPlacw0 zAyvGM!NQ_<#ctQ%Ro2q`?%g`UCG7ENmTJ4s*35knRvxv>YM0!RkxcMZ3$C%a5O^cP!&e~E zAs6uu>fli3KunK&2o~1N@SdfosKL`9Cp~fLW($utjiyb*`3Wd2TK3L1Oq9|;wT{(= z5OE`OztPr+Czoq6SBKo^0oOtAJ*?ZPDUY#p6KZO-NMXokW@AG`?_&3PkOVHOAD=@$ zJu^dt>l`B+mwq>xk@7fxTx9XH*LaCd7(A20m^lC(`GPe*y$}>(On7;r*LRfHA>G82 zKi?+pzzT)v{5wW=*I6hK0PT0YFsD-88a%7;DlxMFp~qtV(*KlIGKV(;&6DEQ1?T+h z%^YhwoouN8ra}vP5G}7rr#zb?VPEA&dy3I`pD)1y3$8$KAefOMk>ENoxWo_*kOp?w zhK@50pWbx<0hDB+Y@ir6-`pjsMnR%GRUl>)3LCs`W4sS=6M2QDhE62|Mb;Mla4GGB zCc-o+X~I&0fo`JP-6=GCsN~Y7CK^{{=CS;>E!89L@40R1?cbl?XdVifps;WzVadQ^ zc!YS%*S~^(Ed4rb>-&=|vG-|={;&Fm3+GyJDwhV82bJ$IZ}0BT z@w3Ji-_siEkw-@e)vyIxy-)3`ZuytB(GokSw_I>NS)uIi>N@}M1aqoF`5NU4vQs>= zx^*VD(E@{{81O6*ZCD@U-Va?!a5qhXgBzpuAhIpW+O<#~PR5p8A*o5k6v!4B`2_~u z2E*;s8^XS*ENvw4$u6s|{X-_U_RLqS<+-&o*=%dhZ5^14hGKWOB$$D7EebGBMMX^c zBkbp^5tl7f*AWH#jwni}&DSH|snx~JoWY?X$Z*cqJm>5H%)_mUzS&ksU~4ADU}l9= zHfE8*$kz2wU02-q?#-7nYU$?7y>#_8?{5#&z)ufIR~Hqd=> zAdHV<1s-Tz*#Uf*woSb=xn58H5Ls3fk5^co%5{{9L`K)9N^BGGBhaW6RgcK^bU%yk zLU4JoM8vGV;b(2O(fi0kk>{Sy{xYZ_m632gDYJ7oIY)6JcI!&#^`qd5c4>XOuvHs{KU7Z;Z|h(_9tzlH0f*syq?n#JAdVuHM1_IMel+}n5V!$&LL@0DCBvhhw5di+h)|?ydH!Wf zqlrDMOpcT*Pzmr|Cb@Vd9G}u4(Als$xCCHiw)WkKU<_5rgWB2+{7jmY>J*u<0Nn3s zXLqoq*UuWasGj>6S?h`hX3rFWwfKhmv2TV6l~rRnx(Cx(vbq>Lnq;|}M9c8qk_m^I z`$DbjPr5I91}8bO_zRI&W>!{AbhN7c&*PQOTem(weIIR2(wPAqdnyT77&Jv-hG#EL zzc@YayZl1RhRdfi5^Pj#gea}w2n$?*Z~?zBD7GLwfd53K=-av@MD{6Lfc`cJmzareY@$nBK z2H-l*B zo;cV1>0xa4v&dTL`EahGe+0nBI2k1x+I?uIonkN3&*5JP;bi9vJ3`Lh1RGQjeJq2w lUt-lJW&HOytv*3$wSOf_uWWuFD}YlnvEL`a`<@pk`Co7E+ZzA? diff --git a/graph/layout/testdata/tube-steep_golden.png b/graph/layout/testdata/tube-steep_golden.png index bfa1ceab3fc485036eefe90fda708c8e108cb015..2433d8f23ddace2b126cb4c9e9ee4bd897323543 100644 GIT binary patch literal 13362 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 diff --git a/graph/layout/testdata/tube_golden.png b/graph/layout/testdata/tube_golden.png index 7154d9ad82297a8417f0073f4125c92a8d31b4e6..59b58769a13f051461d3a14d9b8e55f734074690 100644 GIT binary patch literal 26664 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 IY<%PY59ohU;Q#;t diff --git a/graph/layout/testdata/wp_page_golden.png b/graph/layout/testdata/wp_page_golden.png index 8ffa64f8330c67b49eb0a9b551f3b79c3e38658d..c1df2b1c9102e2182f145ae23e9c00b5c8a11175 100644 GIT binary patch literal 26915 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 F?0<+x$b0|* literal 27027 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 diff --git a/graph/multi/directed_test.go b/graph/multi/directed_test.go index e11631d9..73f79af4 100644 --- a/graph/multi/directed_test.go +++ b/graph/multi/directed_test.go @@ -8,13 +8,12 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/graph/multi" "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) { diff --git a/graph/multi/undirected_test.go b/graph/multi/undirected_test.go index e47a65f8..78c602b8 100644 --- a/graph/multi/undirected_test.go +++ b/graph/multi/undirected_test.go @@ -8,13 +8,12 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/graph/multi" "gonum.org/v1/gonum/graph/testgraph" + "gonum.org/v1/gonum/internal/rand" ) const ( diff --git a/graph/multi/weighted_directed_test.go b/graph/multi/weighted_directed_test.go index 9e0be2ff..dec55d39 100644 --- a/graph/multi/weighted_directed_test.go +++ b/graph/multi/weighted_directed_test.go @@ -7,13 +7,12 @@ package multi_test import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/graph/multi" "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) { diff --git a/graph/multi/weighted_undirected_test.go b/graph/multi/weighted_undirected_test.go index 053c63c0..251a4a1c 100644 --- a/graph/multi/weighted_undirected_test.go +++ b/graph/multi/weighted_undirected_test.go @@ -7,13 +7,12 @@ package multi_test import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/iterator" "gonum.org/v1/gonum/graph/multi" "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) { diff --git a/graph/network/page.go b/graph/network/page.go index 8c1634e6..34e1c6b0 100644 --- a/graph/network/page.go +++ b/graph/network/page.go @@ -7,10 +7,9 @@ package network import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/graph" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/graph/path/johnson_apsp.go b/graph/path/johnson_apsp.go index 9f54e051..2a3d03e3 100644 --- a/graph/path/johnson_apsp.go +++ b/graph/path/johnson_apsp.go @@ -7,10 +7,9 @@ package path import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "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. diff --git a/graph/path/shortest.go b/graph/path/shortest.go index 5b39db88..5de03a3a 100644 --- a/graph/path/shortest.go +++ b/graph/path/shortest.go @@ -8,11 +8,10 @@ import ( "math" "slices" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/graph/path/shortest_test.go b/graph/path/shortest_test.go index 41e8524a..7c3d204e 100644 --- a/graph/path/shortest_test.go +++ b/graph/path/shortest_test.go @@ -11,12 +11,11 @@ import ( "slices" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/graphs/gen" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) var shortestTests = []struct { diff --git a/graph/product/product_test.go b/graph/product/product_test.go index 81683fab..b1fa537f 100644 --- a/graph/product/product_test.go +++ b/graph/product/product_test.go @@ -9,12 +9,11 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/encoding/dot" "gonum.org/v1/gonum/graph/graphs/gen" "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()) } diff --git a/graph/set/uid/uid_test.go b/graph/set/uid/uid_test.go index f2122edb..3e247b83 100644 --- a/graph/set/uid/uid_test.go +++ b/graph/set/uid/uid_test.go @@ -9,7 +9,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestSetChurn(t *testing.T) { diff --git a/graph/simple/densegraph_test.go b/graph/simple/densegraph_test.go index 7f6275f7..8ad0d3dc 100644 --- a/graph/simple/densegraph_test.go +++ b/graph/simple/densegraph_test.go @@ -8,13 +8,12 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/graph/testgraph" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) func isZeroContiguousSet(nodes []graph.Node) bool { diff --git a/graph/simple/directed_test.go b/graph/simple/directed_test.go index 22d29a7d..f9d5436a 100644 --- a/graph/simple/directed_test.go +++ b/graph/simple/directed_test.go @@ -8,12 +8,11 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/simple" "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) { diff --git a/graph/simple/undirected_test.go b/graph/simple/undirected_test.go index e6df4184..ef5dcf42 100644 --- a/graph/simple/undirected_test.go +++ b/graph/simple/undirected_test.go @@ -8,12 +8,11 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/graph/testgraph" + "gonum.org/v1/gonum/internal/rand" ) const ( diff --git a/graph/simple/weighted_directed_test.go b/graph/simple/weighted_directed_test.go index 34bd6d41..78ae2783 100644 --- a/graph/simple/weighted_directed_test.go +++ b/graph/simple/weighted_directed_test.go @@ -8,12 +8,11 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/simple" "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) { diff --git a/graph/simple/weighted_undirected_test.go b/graph/simple/weighted_undirected_test.go index 3eff1dff..d3556c8e 100644 --- a/graph/simple/weighted_undirected_test.go +++ b/graph/simple/weighted_undirected_test.go @@ -8,12 +8,11 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/graph/simple" "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) { diff --git a/graph/testgraph/testgraph.go b/graph/testgraph/testgraph.go index 576cc806..cb7fab5c 100644 --- a/graph/testgraph/testgraph.go +++ b/graph/testgraph/testgraph.go @@ -13,12 +13,11 @@ import ( "slices" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/internal/set" "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) @@ -1614,6 +1613,9 @@ func AddEdges(t *testing.T, n int, g EdgeAdder, newNode func(id int64) graph.Nod var v graph.Node for { v = newNode(rnd.Int63n(int64(n))) + if g.Edge(u.ID(), v.ID()) != nil { + continue + } if canLoop || u.ID() != v.ID() { break } @@ -1678,6 +1680,9 @@ func AddWeightedEdges(t *testing.T, n int, g WeightedEdgeAdder, w float64, newNo var v graph.Node for { v = newNode(rnd.Int63n(int64(n))) + if g.Edge(u.ID(), v.ID()) != nil { + continue + } if canLoop || u.ID() != v.ID() { break } diff --git a/graph/testgraph/testgraph_test.go b/graph/testgraph/testgraph_test.go index 54ccc22e..92ed8458 100644 --- a/graph/testgraph/testgraph_test.go +++ b/graph/testgraph/testgraph_test.go @@ -26,23 +26,23 @@ var randomNodesTests = []struct { n: 1, seed: 1, new: newSimpleNode, - want: []graph.Node{simple.Node(-106976941678315313)}, + want: []graph.Node{simple.Node(-1890700816702069259)}, }, { n: 1, seed: 2, new: newSimpleNode, - want: []graph.Node{simple.Node(6816453162648937526)}, + want: []graph.Node{simple.Node(-9080340245984136982)}, }, { n: 4, seed: 1, new: newSimpleNode, want: []graph.Node{ - simple.Node(-106976941678315313), - simple.Node(867649948573917593), - simple.Node(-4246677790793934368), - simple.Node(406519965772129914), + simple.Node(-1890700816702069259), + simple.Node(7618499319381327068), + simple.Node(-8006975346196781910), + simple.Node(1952627761515405933), }, }, { @@ -50,10 +50,10 @@ var randomNodesTests = []struct { seed: 2, new: newSimpleNode, want: []graph.Node{ - simple.Node(6816453162648937526), - simple.Node(-4921844272880608907), - simple.Node(159088832891557680), - simple.Node(-2611333848016927708), + simple.Node(-9080340245984136982), + simple.Node(8080303881793168789), + simple.Node(6742726861847166348), + simple.Node(-1570298006490451715), }, }, } diff --git a/graph/topo/bench_test.go b/graph/topo/bench_test.go index 337af078..57612577 100644 --- a/graph/topo/bench_test.go +++ b/graph/topo/bench_test.go @@ -8,11 +8,10 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph/graphs/gen" "gonum.org/v1/gonum/graph/simple" + "gonum.org/v1/gonum/internal/rand" ) var ( diff --git a/integrate/simpsons_test.go b/integrate/simpsons_test.go index 3b5e02e6..bb8ff0e9 100644 --- a/integrate/simpsons_test.go +++ b/integrate/simpsons_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/integrate/testquad" + "gonum.org/v1/gonum/internal/rand" ) func TestSimpsons(t *testing.T) { diff --git a/integrate/trapezoidal_test.go b/integrate/trapezoidal_test.go index bda74518..0c0a2f8b 100644 --- a/integrate/trapezoidal_test.go +++ b/integrate/trapezoidal_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/integrate/testquad" + "gonum.org/v1/gonum/internal/rand" ) func TestTrapezoidal(t *testing.T) { diff --git a/internal/asm/f64/asm_test.go b/internal/asm/f64/asm_test.go index 93b33826..bd7a9737 100644 --- a/internal/asm/f64/asm_test.go +++ b/internal/asm/f64/asm_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) const ( diff --git a/internal/asm/f64/dot_test.go b/internal/asm/f64/dot_test.go index 28c08633..3a2dc8c1 100644 --- a/internal/asm/f64/dot_test.go +++ b/internal/asm/f64/dot_test.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - . "gonum.org/v1/gonum/internal/asm/f64" + "gonum.org/v1/gonum/internal/rand" ) func TestDotUnitary(t *testing.T) { diff --git a/internal/asm/f64/scal_test.go b/internal/asm/f64/scal_test.go index fc4d7cfc..4ef6dc40 100644 --- a/internal/asm/f64/scal_test.go +++ b/internal/asm/f64/scal_test.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" . "gonum.org/v1/gonum/internal/asm/f64" + "gonum.org/v1/gonum/internal/rand" ) var scalTests = []struct { diff --git a/internal/rand/rand.go b/internal/rand/rand.go new file mode 100644 index 00000000..521d8f40 --- /dev/null +++ b/internal/rand/rand.go @@ -0,0 +1,393 @@ +// Copyright ©2024 The Gonum Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package rand implements pseudo-random number generators. +// +// Random numbers are generated by a Source. Top-level functions, such as +// Float64 and Int, use a default shared Source that produces a deterministic +// sequence of values each time a program is run. Use the Seed function to +// initialize the default Source if different behavior is required for each run. +// The default Source, a LockedSource, is safe for concurrent use by multiple +// goroutines, but Sources created by NewSource are not. However, Sources are small +// and it is reasonable to have a separate Source for each goroutine, seeded +// differently, to avoid locking. +// +// For random numbers suitable for security-sensitive work, see the crypto/rand +// package. +package rand + +import ( + "math/rand/v2" + "sync" +) + +// A Source represents a source of uniformly-distributed +// pseudo-random int64 values in the range [0, 1<<64). +type Source interface { + Uint64() uint64 + Seed(seed uint64) +} + +// NewSource returns a new pseudo-random Source seeded with the given value. +func NewSource(seed uint64) Source { + return &pcgShim{rand.NewPCG(seed, seed)} +} + +type pcgShim struct { + *rand.PCG +} + +func (p *pcgShim) Seed(seed uint64) { + p.PCG.Seed(seed, seed) +} + +// A Rand is a source of random numbers. +type Rand struct { + src Source + + // readVal contains remainder of 64-bit integer used for bytes + // generation during most recent Read call. + // It is saved so next Read call can start where the previous + // one finished. + readVal uint64 + // readPos indicates the number of low-order bytes of readVal + // that are still valid. + readPos int8 +} + +// New returns a new Rand that uses random values from src +// to generate other random values. +func New(src Source) *Rand { + return &Rand{src: src} +} + +func (r *Rand) NormFloat64() float64 { + return rand.New(r.src).NormFloat64() +} + +func (r *Rand) ExpFloat64() float64 { + return rand.New(r.src).ExpFloat64() +} + +// Seed uses the provided seed value to initialize the generator to a deterministic state. +// Seed should not be called concurrently with any other Rand method. +func (r *Rand) Seed(seed uint64) { + if lk, ok := r.src.(*LockedSource); ok { + lk.seedPos(seed, &r.readPos) + return + } + + r.src.Seed(seed) + r.readPos = 0 +} + +// Uint64 returns a pseudo-random 64-bit integer as a uint64. +func (r *Rand) Uint64() uint64 { return r.src.Uint64() } + +// Int63 returns a non-negative pseudo-random 63-bit integer as an int64. +func (r *Rand) Int63() int64 { return int64(r.src.Uint64() &^ (1 << 63)) } + +// Uint32 returns a pseudo-random 32-bit value as a uint32. +func (r *Rand) Uint32() uint32 { return uint32(r.Uint64() >> 32) } + +// Int31 returns a non-negative pseudo-random 31-bit integer as an int32. +func (r *Rand) Int31() int32 { return int32(r.Uint64() >> 33) } + +// Int returns a non-negative pseudo-random int. +func (r *Rand) Int() int { + u := uint(r.Uint64()) + return int(u << 1 >> 1) // clear sign bit. +} + +const maxUint64 = (1 << 64) - 1 + +// Uint64n returns, as a uint64, a pseudo-random number in [0,n). +// It is guaranteed more uniform than taking a Source value mod n +// for any n that is not a power of 2. +func (r *Rand) Uint64n(n uint64) uint64 { + if n&(n-1) == 0 { // n is power of two, can mask + if n == 0 { + panic("invalid argument to Uint64n") + } + return r.Uint64() & (n - 1) + } + // If n does not divide v, to avoid bias we must not use + // a v that is within maxUint64%n of the top of the range. + v := r.Uint64() + if v > maxUint64-n { // Fast check. + ceiling := maxUint64 - maxUint64%n + for v >= ceiling { + v = r.Uint64() + } + } + + return v % n +} + +// Int63n returns, as an int64, a non-negative pseudo-random number in [0,n). +// It panics if n <= 0. +func (r *Rand) Int63n(n int64) int64 { + if n <= 0 { + panic("invalid argument to Int63n") + } + return int64(r.Uint64n(uint64(n))) +} + +// Int31n returns, as an int32, a non-negative pseudo-random number in [0,n). +// It panics if n <= 0. +func (r *Rand) Int31n(n int32) int32 { + if n <= 0 { + panic("invalid argument to Int31n") + } + // TODO: Avoid some 64-bit ops to make it more efficient on 32-bit machines. + return int32(r.Uint64n(uint64(n))) +} + +// Intn returns, as an int, a non-negative pseudo-random number in [0,n). +// It panics if n <= 0. +func (r *Rand) Intn(n int) int { + if n <= 0 { + panic("invalid argument to Intn") + } + // TODO: Avoid some 64-bit ops to make it more efficient on 32-bit machines. + return int(r.Uint64n(uint64(n))) +} + +// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0). +func (r *Rand) Float64() float64 { + // There is one bug in the value stream: r.Int63() may be so close + // to 1<<63 that the division rounds up to 1.0, and we've guaranteed + // that the result is always less than 1.0. + // + // We tried to fix this by mapping 1.0 back to 0.0, but since float64 + // values near 0 are much denser than near 1, mapping 1 to 0 caused + // a theoretically significant overshoot in the probability of returning 0. + // Instead of that, if we round up to 1, just try again. + // Getting 1 only happens 1/2⁵³ of the time, so most clients + // will not observe it anyway. +again: + f := float64(r.Uint64n(1<<53)) / (1 << 53) + if f == 1.0 { + goto again // resample; this branch is taken O(never) + } + return f +} + +// Float32 returns, as a float32, a pseudo-random number in [0.0,1.0). +func (r *Rand) Float32() float32 { + // We do not want to return 1.0. + // This only happens 1/2²⁴ of the time (plus the 1/2⁵³ of the time in Float64). +again: + f := float32(r.Float64()) + if f == 1 { + goto again // resample; this branch is taken O(very rarely) + } + return f +} + +// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n). +func (r *Rand) Perm(n int) []int { + m := make([]int, n) + // In the following loop, the iteration when i=0 always swaps m[0] with m[0]. + // A change to remove this useless iteration is to assign 1 to i in the init + // statement. But Perm also effects r. Making this change will affect + // the final state of r. So this change can't be made for compatibility + // reasons for Go 1. + for i := 0; i < n; i++ { + j := r.Intn(i + 1) + m[i] = m[j] + m[j] = i + } + return m +} + +// Shuffle pseudo-randomizes the order of elements. +// n is the number of elements. Shuffle panics if n < 0. +// swap swaps the elements with indexes i and j. +func (r *Rand) Shuffle(n int, swap func(i, j int)) { + if n < 0 { + panic("invalid argument to Shuffle") + } + + // Fisher-Yates shuffle: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle + // Shuffle really ought not be called with n that doesn't fit in 32 bits. + // Not only will it take a very long time, but with 2³¹! possible permutations, + // there's no way that any PRNG can have a big enough internal state to + // generate even a minuscule percentage of the possible permutations. + // Nevertheless, the right API signature accepts an int n, so handle it as best we can. + i := n - 1 + for ; i > 1<<31-1-1; i-- { + j := int(r.Int63n(int64(i + 1))) + swap(i, j) + } + for ; i > 0; i-- { + j := int(r.Int31n(int32(i + 1))) + swap(i, j) + } +} + +// Read generates len(p) random bytes and writes them into p. It +// always returns len(p) and a nil error. +// Read should not be called concurrently with any other Rand method unless +// the underlying source is a LockedSource. +func (r *Rand) Read(p []byte) (n int, err error) { + if lk, ok := r.src.(*LockedSource); ok { + return lk.Read(p, &r.readVal, &r.readPos) + } + return read(p, r.src, &r.readVal, &r.readPos) +} + +func read(p []byte, src Source, readVal *uint64, readPos *int8) (n int, err error) { + pos := *readPos + val := *readVal + rng, _ := src.(*pcgShim) + for n = 0; n < len(p); n++ { + if pos == 0 { + if rng != nil { + val = rng.Uint64() + } else { + val = src.Uint64() + } + pos = 8 + } + p[n] = byte(val) + val >>= 8 + pos-- + } + *readPos = pos + *readVal = val + return +} + +/* + * Top-level convenience functions + */ + +var globalRand = New(&LockedSource{src: *NewSource(1).(*pcgShim)}) + +// Type assert that globalRand's source is a LockedSource whose src is a PCGSource. +var _ pcgShim = globalRand.src.(*LockedSource).src + +// Seed uses the provided seed value to initialize the default Source to a +// deterministic state. If Seed is not called, the generator behaves as +// if seeded by Seed(1). +// Seed, unlike the Rand.Seed method, is safe for concurrent use. +func Seed(seed uint64) { globalRand.Seed(seed) } + +// Int63 returns a non-negative pseudo-random 63-bit integer as an int64 +// from the default Source. +func Int63() int64 { return globalRand.Int63() } + +// Uint32 returns a pseudo-random 32-bit value as a uint32 +// from the default Source. +func Uint32() uint32 { return globalRand.Uint32() } + +// Uint64 returns a pseudo-random 64-bit value as a uint64 +// from the default Source. +func Uint64() uint64 { return globalRand.Uint64() } + +// Int31 returns a non-negative pseudo-random 31-bit integer as an int32 +// from the default Source. +func Int31() int32 { return globalRand.Int31() } + +// Int returns a non-negative pseudo-random int from the default Source. +func Int() int { return globalRand.Int() } + +// Int63n returns, as an int64, a non-negative pseudo-random number in [0,n) +// from the default Source. +// It panics if n <= 0. +func Int63n(n int64) int64 { return globalRand.Int63n(n) } + +// Int31n returns, as an int32, a non-negative pseudo-random number in [0,n) +// from the default Source. +// It panics if n <= 0. +func Int31n(n int32) int32 { return globalRand.Int31n(n) } + +// Intn returns, as an int, a non-negative pseudo-random number in [0,n) +// from the default Source. +// It panics if n <= 0. +func Intn(n int) int { return globalRand.Intn(n) } + +// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0) +// from the default Source. +func Float64() float64 { return globalRand.Float64() } + +// Float32 returns, as a float32, a pseudo-random number in [0.0,1.0) +// from the default Source. +func Float32() float32 { return globalRand.Float32() } + +// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n) +// from the default Source. +func Perm(n int) []int { return globalRand.Perm(n) } + +// Shuffle pseudo-randomizes the order of elements using the default Source. +// n is the number of elements. Shuffle panics if n < 0. +// swap swaps the elements with indexes i and j. +func Shuffle(n int, swap func(i, j int)) { globalRand.Shuffle(n, swap) } + +// Read generates len(p) random bytes from the default Source and +// writes them into p. It always returns len(p) and a nil error. +// Read, unlike the Rand.Read method, is safe for concurrent use. +func Read(p []byte) (n int, err error) { return globalRand.Read(p) } + +// NormFloat64 returns a normally distributed float64 in the range +// [-math.MaxFloat64, +math.MaxFloat64] with +// standard normal distribution (mean = 0, stddev = 1) +// from the default Source. +// To produce a different normal distribution, callers can +// adjust the output using: +// +// sample = NormFloat64() * desiredStdDev + desiredMean +func NormFloat64() float64 { return globalRand.NormFloat64() } + +// ExpFloat64 returns an exponentially distributed float64 in the range +// (0, +math.MaxFloat64] with an exponential distribution whose rate parameter +// (lambda) is 1 and whose mean is 1/lambda (1) from the default Source. +// To produce a distribution with a different rate parameter, +// callers can adjust the output using: +// +// sample = ExpFloat64() / desiredRateParameter +func ExpFloat64() float64 { return globalRand.ExpFloat64() } + +// LockedSource is an implementation of Source that is concurrency-safe. +// A Rand using a LockedSource is safe for concurrent use. +// +// The zero value of LockedSource is valid, but should be seeded before use. +type LockedSource struct { + lk sync.Mutex + src pcgShim +} + +func (s *LockedSource) Uint64() (n uint64) { + s.lk.Lock() + n = s.src.Uint64() + s.lk.Unlock() + return +} + +func (s *LockedSource) Seed(seed uint64) { + s.lk.Lock() + s.src.Seed(seed) + s.lk.Unlock() +} + +// seedPos implements Seed for a LockedSource without a race condiiton. +func (s *LockedSource) seedPos(seed uint64, readPos *int8) { + s.lk.Lock() + s.src.Seed(seed) + *readPos = 0 + s.lk.Unlock() +} + +// Read implements Read for a LockedSource. +func (s *LockedSource) Read(p []byte, readVal *uint64, readPos *int8) (n int, err error) { + s.lk.Lock() + n, err = read(p, &s.src, readVal, readPos) + s.lk.Unlock() + return +} diff --git a/internal/rand/rand_test.go b/internal/rand/rand_test.go new file mode 100644 index 00000000..a528fc0e --- /dev/null +++ b/internal/rand/rand_test.go @@ -0,0 +1,368 @@ +// Copyright ©2024 The Gonum Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package rand + +import ( + "bytes" + "errors" + "fmt" + "io" + "math" + "os" + "runtime" + "strings" + "testing" + "testing/iotest" +) + +const ( + numTestSamples = 10000 +) + +type statsResults struct { + mean float64 + stddev float64 + closeEnough float64 + maxError float64 +} + +func nearEqual(a, b, closeEnough, maxError float64) bool { + absDiff := math.Abs(a - b) + if absDiff < closeEnough { // Necessary when one value is zero and one value is close to zero. + return true + } + return absDiff/max(math.Abs(a), math.Abs(b)) < maxError +} + +var testSeeds = []uint64{1, 1754801282, 1698661970, 1550503961} + +// checkSimilarDistribution returns success if the mean and stddev of the +// two statsResults are similar. +func (sr *statsResults) checkSimilarDistribution(expected *statsResults) error { + if !nearEqual(sr.mean, expected.mean, expected.closeEnough, expected.maxError) { + s := fmt.Sprintf("mean %v != %v (allowed error %v, %v)", sr.mean, expected.mean, expected.closeEnough, expected.maxError) + fmt.Println(s) + return errors.New(s) + } + if !nearEqual(sr.stddev, expected.stddev, expected.closeEnough, expected.maxError) { + s := fmt.Sprintf("stddev %v != %v (allowed error %v, %v)", sr.stddev, expected.stddev, expected.closeEnough, expected.maxError) + fmt.Println(s) + return errors.New(s) + } + return nil +} + +func getStatsResults(samples []float64) *statsResults { + res := new(statsResults) + var sum, squaresum float64 + for _, s := range samples { + sum += s + squaresum += s * s + } + res.mean = sum / float64(len(samples)) + res.stddev = math.Sqrt(squaresum/float64(len(samples)) - res.mean*res.mean) + return res +} + +func checkSampleDistribution(t *testing.T, samples []float64, expected *statsResults) { + t.Helper() + actual := getStatsResults(samples) + err := actual.checkSimilarDistribution(expected) + if err != nil { + t.Error(err) + } +} + +func checkSampleSliceDistributions(t *testing.T, samples []float64, nslices int, expected *statsResults) { + t.Helper() + chunk := len(samples) / nslices + for i := 0; i < nslices; i++ { + low := i * chunk + var high int + if i == nslices-1 { + high = len(samples) - 1 + } else { + high = (i + 1) * chunk + } + checkSampleDistribution(t, samples[low:high], expected) + } +} + +// +// Normal distribution tests +// + +func generateNormalSamples(nsamples int, mean, stddev float64, seed uint64) []float64 { + r := New(NewSource(seed)) + samples := make([]float64, nsamples) + for i := range samples { + samples[i] = r.NormFloat64()*stddev + mean + } + return samples +} + +func testNormalDistribution(t *testing.T, nsamples int, mean, stddev float64, seed uint64) { + //fmt.Printf("testing nsamples=%v mean=%v stddev=%v seed=%v\n", nsamples, mean, stddev, seed); + + samples := generateNormalSamples(nsamples, mean, stddev, seed) + errorScale := max(1.0, stddev) // Error scales with stddev + expected := &statsResults{mean, stddev, 0.10 * errorScale, 0.08 * errorScale} + + // Make sure that the entire set matches the expected distribution. + checkSampleDistribution(t, samples, expected) + + // Make sure that each half of the set matches the expected distribution. + checkSampleSliceDistributions(t, samples, 2, expected) + + // Make sure that each 7th of the set matches the expected distribution. + checkSampleSliceDistributions(t, samples, 7, expected) +} + +// Actual tests + +func TestStandardNormalValues(t *testing.T) { + for _, seed := range testSeeds { + testNormalDistribution(t, numTestSamples, 0, 1, seed) + } +} + +func TestNonStandardNormalValues(t *testing.T) { + sdmax := 1000.0 + mmax := 1000.0 + if testing.Short() { + sdmax = 5 + mmax = 5 + } + for sd := 0.5; sd < sdmax; sd *= 2 { + for m := 0.5; m < mmax; m *= 2 { + for _, seed := range testSeeds { + testNormalDistribution(t, numTestSamples, m, sd, seed) + if testing.Short() { + break + } + } + } + } +} + +// +// Exponential distribution tests +// + +func generateExponentialSamples(nsamples int, rate float64, seed uint64) []float64 { + r := New(NewSource(seed)) + samples := make([]float64, nsamples) + for i := range samples { + samples[i] = r.ExpFloat64() / rate + } + return samples +} + +func testExponentialDistribution(t *testing.T, nsamples int, rate float64, seed uint64) { + //fmt.Printf("testing nsamples=%v rate=%v seed=%v\n", nsamples, rate, seed) + + mean := 1 / rate + stddev := mean + + samples := generateExponentialSamples(nsamples, rate, seed) + errorScale := max(1.0, 1/rate) // Error scales with the inverse of the rate + expected := &statsResults{mean, stddev, 0.10 * errorScale, 0.20 * errorScale} + + // Make sure that the entire set matches the expected distribution. + checkSampleDistribution(t, samples, expected) + + // Make sure that each half of the set matches the expected distribution. + checkSampleSliceDistributions(t, samples, 2, expected) + + // Make sure that each 7th of the set matches the expected distribution. + checkSampleSliceDistributions(t, samples, 7, expected) +} + +// Actual tests + +func TestStandardExponentialValues(t *testing.T) { + for _, seed := range testSeeds { + testExponentialDistribution(t, numTestSamples, 1, seed) + } +} + +func TestNonStandardExponentialValues(t *testing.T) { + for rate := 0.05; rate < 10; rate *= 2 { + for _, seed := range testSeeds { + testExponentialDistribution(t, numTestSamples, rate, seed) + if testing.Short() { + break + } + } + } +} + +// compareUint32Slices returns the first index where the two slices +// disagree, or <0 if the lengths are the same and all elements +// are identical. +func compareUint32Slices(s1, s2 []uint32) int { + if len(s1) != len(s2) { + if len(s1) > len(s2) { + return len(s2) + 1 + } + return len(s1) + 1 + } + for i := range s1 { + if s1[i] != s2[i] { + return i + } + } + return -1 +} + +// compareFloat32Slices returns the first index where the two slices +// disagree, or <0 if the lengths are the same and all elements +// are identical. +func compareFloat32Slices(s1, s2 []float32) int { + if len(s1) != len(s2) { + if len(s1) > len(s2) { + return len(s2) + 1 + } + return len(s1) + 1 + } + for i := range s1 { + if !nearEqual(float64(s1[i]), float64(s2[i]), 0, 1e-7) { + return i + } + } + return -1 +} + +func hasSlowFloatingPoint() bool { + switch runtime.GOARCH { + case "arm": + return os.Getenv("GOARM") == "5" || strings.HasSuffix(os.Getenv("GOARM"), ",softfloat") + case "mips", "mipsle", "mips64", "mips64le": + // Be conservative and assume that all mips boards + // have emulated floating point. + // TODO: detect what it actually has. + return true + } + return false +} + +func TestFloat32(t *testing.T) { + // For issue 6721, the problem came after 7533753 calls, so check 10e6. + num := int(10e6) + // But do the full amount only on builders (not locally). + // But ARM5 floating point emulation is slow (Issue 10749), so + // do less for that builder: + if testing.Short() && hasSlowFloatingPoint() { // TODO: (testenv.Builder() == "" || hasSlowFloatingPoint()) + num /= 100 // 1.72 seconds instead of 172 seconds + } + + r := New(NewSource(1)) + for ct := 0; ct < num; ct++ { + f := r.Float32() + if f >= 1 { + t.Fatal("Float32() should be in range [0,1). ct:", ct, "f:", f) + } + } +} + +func testReadUniformity(t *testing.T, n int, seed uint64) { + r := New(NewSource(seed)) + buf := make([]byte, n) + nRead, err := r.Read(buf) + if err != nil { + t.Errorf("Read err %v", err) + } + if nRead != n { + t.Errorf("Read returned unexpected n; %d != %d", nRead, n) + } + + // Expect a uniform distribution of byte values, which lie in [0, 255]. + var ( + mean = 255.0 / 2 + stddev = 256.0 / math.Sqrt(12.0) + errorScale = stddev / math.Sqrt(float64(n)) + ) + + expected := &statsResults{mean, stddev, 0.10 * errorScale, 0.08 * errorScale} + + // Cast bytes as floats to use the common distribution-validity checks. + samples := make([]float64, n) + for i, val := range buf { + samples[i] = float64(val) + } + // Make sure that the entire set matches the expected distribution. + checkSampleDistribution(t, samples, expected) +} + +func TestReadUniformity(t *testing.T) { + testBufferSizes := []int{ + 2, 4, 7, 64, 1024, 1 << 16, 1 << 20, + } + for _, seed := range testSeeds { + for _, n := range testBufferSizes { + testReadUniformity(t, n, seed) + } + } +} + +func TestReadEmpty(t *testing.T) { + r := New(NewSource(1)) + buf := make([]byte, 0) + n, err := r.Read(buf) + if err != nil { + t.Errorf("Read err into empty buffer; %v", err) + } + if n != 0 { + t.Errorf("Read into empty buffer returned unexpected n of %d", n) + } +} + +func TestReadByOneByte(t *testing.T) { + r := New(NewSource(1)) + b1 := make([]byte, 100) + _, err := io.ReadFull(iotest.OneByteReader(r), b1) + if err != nil { + t.Errorf("read by one byte: %v", err) + } + r = New(NewSource(1)) + b2 := make([]byte, 100) + _, err = r.Read(b2) + if err != nil { + t.Errorf("read: %v", err) + } + if !bytes.Equal(b1, b2) { + t.Errorf("read by one byte vs single read:\n%x\n%x", b1, b2) + } +} + +func TestReadSeedReset(t *testing.T) { + r := New(NewSource(42)) + b1 := make([]byte, 128) + _, err := r.Read(b1) + if err != nil { + t.Errorf("read: %v", err) + } + r.Seed(42) + b2 := make([]byte, 128) + _, err = r.Read(b2) + if err != nil { + t.Errorf("read: %v", err) + } + if !bytes.Equal(b1, b2) { + t.Errorf("mismatch after re-seed:\n%x\n%x", b1, b2) + } +} + +func TestShuffleSmall(t *testing.T) { + // Check that Shuffle allows n=0 and n=1, but that swap is never called for them. + r := New(NewSource(1)) + for n := 0; n <= 1; n++ { + r.Shuffle(n, func(i, j int) { t.Fatalf("swap called, n=%d i=%d j=%d", n, i, j) }) + } +} diff --git a/internal/rand/staticcheck.conf b/internal/rand/staticcheck.conf new file mode 100644 index 00000000..d533ce21 --- /dev/null +++ b/internal/rand/staticcheck.conf @@ -0,0 +1 @@ +checks = ["inherit", "-U1000"] \ No newline at end of file diff --git a/internal/testrand/extreme.go b/internal/testrand/extreme.go index 6d1f96c0..67cec79f 100644 --- a/internal/testrand/extreme.go +++ b/internal/testrand/extreme.go @@ -7,7 +7,7 @@ package testrand import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // extreme is a pseudo-random number generator that has high probability of returning extreme values. diff --git a/internal/testrand/extreme_test.go b/internal/testrand/extreme_test.go index 415fd4f1..7f3ce755 100644 --- a/internal/testrand/extreme_test.go +++ b/internal/testrand/extreme_test.go @@ -8,7 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestExtreme_NaN(t *testing.T) { diff --git a/internal/testrand/rand.go b/internal/testrand/rand.go index f2972a85..50845651 100644 --- a/internal/testrand/rand.go +++ b/internal/testrand/rand.go @@ -8,7 +8,7 @@ package testrand import ( "flag" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) var ( diff --git a/lapack/testlapack/dbdsqr.go b/lapack/testlapack/dbdsqr.go index af4e314e..711de72f 100644 --- a/lapack/testlapack/dbdsqr.go +++ b/lapack/testlapack/dbdsqr.go @@ -9,12 +9,11 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type Dbdsqrer interface { diff --git a/lapack/testlapack/dgebak.go b/lapack/testlapack/dgebak.go index 1803c7ac..f6369a07 100644 --- a/lapack/testlapack/dgebak.go +++ b/lapack/testlapack/dgebak.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgebal.go b/lapack/testlapack/dgebal.go index c4fb76a6..4c2d196a 100644 --- a/lapack/testlapack/dgebal.go +++ b/lapack/testlapack/dgebal.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgebd2.go b/lapack/testlapack/dgebd2.go index 5b8b5c42..e2d9c795 100644 --- a/lapack/testlapack/dgebd2.go +++ b/lapack/testlapack/dgebd2.go @@ -7,7 +7,7 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Dgebd2er interface { diff --git a/lapack/testlapack/dgebrd.go b/lapack/testlapack/dgebrd.go index f9c1e821..179080bb 100644 --- a/lapack/testlapack/dgebrd.go +++ b/lapack/testlapack/dgebrd.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dgebrder interface { diff --git a/lapack/testlapack/dgecon.go b/lapack/testlapack/dgecon.go index a6679d3a..bc267051 100644 --- a/lapack/testlapack/dgecon.go +++ b/lapack/testlapack/dgecon.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgeev.go b/lapack/testlapack/dgeev.go index e098476d..e5f0db68 100644 --- a/lapack/testlapack/dgeev.go +++ b/lapack/testlapack/dgeev.go @@ -11,10 +11,9 @@ import ( "strconv" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgeev_bench.go b/lapack/testlapack/dgeev_bench.go index 1887d70b..03996c83 100644 --- a/lapack/testlapack/dgeev_bench.go +++ b/lapack/testlapack/dgeev_bench.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgehd2.go b/lapack/testlapack/dgehd2.go index 19731b3c..fad1bd01 100644 --- a/lapack/testlapack/dgehd2.go +++ b/lapack/testlapack/dgehd2.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dgehd2er interface { diff --git a/lapack/testlapack/dgehrd.go b/lapack/testlapack/dgehrd.go index eb399b1f..3952e485 100644 --- a/lapack/testlapack/dgehrd.go +++ b/lapack/testlapack/dgehrd.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dgehrder interface { diff --git a/lapack/testlapack/dgelq2.go b/lapack/testlapack/dgelq2.go index 5e29a600..bb9a27cb 100644 --- a/lapack/testlapack/dgelq2.go +++ b/lapack/testlapack/dgelq2.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dgelq2er interface { diff --git a/lapack/testlapack/dgelqf.go b/lapack/testlapack/dgelqf.go index 7300b306..63dbfe64 100644 --- a/lapack/testlapack/dgelqf.go +++ b/lapack/testlapack/dgelqf.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dgelqfer interface { diff --git a/lapack/testlapack/dgels.go b/lapack/testlapack/dgels.go index 4e520d1a..3f2c9a29 100644 --- a/lapack/testlapack/dgels.go +++ b/lapack/testlapack/dgels.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dgelser interface { diff --git a/lapack/testlapack/dgeql2.go b/lapack/testlapack/dgeql2.go index 9920b2fe..d90a71dc 100644 --- a/lapack/testlapack/dgeql2.go +++ b/lapack/testlapack/dgeql2.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dgeql2er interface { diff --git a/lapack/testlapack/dgeqp3.go b/lapack/testlapack/dgeqp3.go index 4779a285..86313bf6 100644 --- a/lapack/testlapack/dgeqp3.go +++ b/lapack/testlapack/dgeqp3.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgeqr2.go b/lapack/testlapack/dgeqr2.go index abe15e8a..87518a4a 100644 --- a/lapack/testlapack/dgeqr2.go +++ b/lapack/testlapack/dgeqr2.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgeqrf.go b/lapack/testlapack/dgeqrf.go index 02218618..579076db 100644 --- a/lapack/testlapack/dgeqrf.go +++ b/lapack/testlapack/dgeqrf.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dgeqrfer interface { diff --git a/lapack/testlapack/dgerq2.go b/lapack/testlapack/dgerq2.go index 5062cf8c..a6f11197 100644 --- a/lapack/testlapack/dgerq2.go +++ b/lapack/testlapack/dgerq2.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgerqf.go b/lapack/testlapack/dgerqf.go index 32f26fff..e63717e2 100644 --- a/lapack/testlapack/dgerqf.go +++ b/lapack/testlapack/dgerqf.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgesc2.go b/lapack/testlapack/dgesc2.go index dd48ca90..485b6e4a 100644 --- a/lapack/testlapack/dgesc2.go +++ b/lapack/testlapack/dgesc2.go @@ -9,11 +9,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgesv.go b/lapack/testlapack/dgesv.go index c41a37d1..5097a7ff 100644 --- a/lapack/testlapack/dgesv.go +++ b/lapack/testlapack/dgesv.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgesvd.go b/lapack/testlapack/dgesvd.go index 7d9e2f26..16360464 100644 --- a/lapack/testlapack/dgesvd.go +++ b/lapack/testlapack/dgesvd.go @@ -10,11 +10,10 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgetc2.go b/lapack/testlapack/dgetc2.go index 46ed0c96..ba2c7f7b 100644 --- a/lapack/testlapack/dgetc2.go +++ b/lapack/testlapack/dgetc2.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgetf2.go b/lapack/testlapack/dgetf2.go index 79a25b7d..6443bad1 100644 --- a/lapack/testlapack/dgetf2.go +++ b/lapack/testlapack/dgetf2.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dgetf2er interface { diff --git a/lapack/testlapack/dgetrf.go b/lapack/testlapack/dgetrf.go index 42dc713c..efcc472e 100644 --- a/lapack/testlapack/dgetrf.go +++ b/lapack/testlapack/dgetrf.go @@ -7,7 +7,7 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Dgetrfer interface { diff --git a/lapack/testlapack/dgetri.go b/lapack/testlapack/dgetri.go index 0c9bc281..28a6d17f 100644 --- a/lapack/testlapack/dgetri.go +++ b/lapack/testlapack/dgetri.go @@ -7,10 +7,9 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dgetrier interface { diff --git a/lapack/testlapack/dgetrs.go b/lapack/testlapack/dgetrs.go index dab03341..00e242dc 100644 --- a/lapack/testlapack/dgetrs.go +++ b/lapack/testlapack/dgetrs.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dgetrser interface { diff --git a/lapack/testlapack/dgghrd.go b/lapack/testlapack/dgghrd.go index 606ade96..8ee6410c 100644 --- a/lapack/testlapack/dgghrd.go +++ b/lapack/testlapack/dgghrd.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dggsvd3.go b/lapack/testlapack/dggsvd3.go index 62f58d11..3bbfa097 100644 --- a/lapack/testlapack/dggsvd3.go +++ b/lapack/testlapack/dggsvd3.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dggsvp3.go b/lapack/testlapack/dggsvp3.go index 472116e0..56258f76 100644 --- a/lapack/testlapack/dggsvp3.go +++ b/lapack/testlapack/dggsvp3.go @@ -7,10 +7,9 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dgtsv.go b/lapack/testlapack/dgtsv.go index cdea4238..ee8488e7 100644 --- a/lapack/testlapack/dgtsv.go +++ b/lapack/testlapack/dgtsv.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlabrd.go b/lapack/testlapack/dlabrd.go index 439ad47c..89d97813 100644 --- a/lapack/testlapack/dlabrd.go +++ b/lapack/testlapack/dlabrd.go @@ -8,7 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Dlabrder interface { diff --git a/lapack/testlapack/dlacn2.go b/lapack/testlapack/dlacn2.go index 00d288c8..162c64db 100644 --- a/lapack/testlapack/dlacn2.go +++ b/lapack/testlapack/dlacn2.go @@ -8,10 +8,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dlacn2er interface { diff --git a/lapack/testlapack/dlacpy.go b/lapack/testlapack/dlacpy.go index 4a2becb4..1e3c2acd 100644 --- a/lapack/testlapack/dlacpy.go +++ b/lapack/testlapack/dlacpy.go @@ -8,9 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Dlacpyer interface { diff --git a/lapack/testlapack/dlaev2.go b/lapack/testlapack/dlaev2.go index 73de0e54..a3118b17 100644 --- a/lapack/testlapack/dlaev2.go +++ b/lapack/testlapack/dlaev2.go @@ -8,7 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Dlaev2er interface { diff --git a/lapack/testlapack/dlaexc.go b/lapack/testlapack/dlaexc.go index 002be5e7..453833cf 100644 --- a/lapack/testlapack/dlaexc.go +++ b/lapack/testlapack/dlaexc.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlag2.go b/lapack/testlapack/dlag2.go index ee250b95..5bc87388 100644 --- a/lapack/testlapack/dlag2.go +++ b/lapack/testlapack/dlag2.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dlag2er interface { diff --git a/lapack/testlapack/dlags2.go b/lapack/testlapack/dlags2.go index e26f03ba..04dd1dc1 100644 --- a/lapack/testlapack/dlags2.go +++ b/lapack/testlapack/dlags2.go @@ -8,11 +8,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type Dlags2er interface { diff --git a/lapack/testlapack/dlagtm.go b/lapack/testlapack/dlagtm.go index a149453a..22a0472f 100644 --- a/lapack/testlapack/dlagtm.go +++ b/lapack/testlapack/dlagtm.go @@ -8,11 +8,10 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlahqr.go b/lapack/testlapack/dlahqr.go index be664891..267da311 100644 --- a/lapack/testlapack/dlahqr.go +++ b/lapack/testlapack/dlahqr.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dlahqrer interface { diff --git a/lapack/testlapack/dlahr2.go b/lapack/testlapack/dlahr2.go index 22448d51..d5ea60c8 100644 --- a/lapack/testlapack/dlahr2.go +++ b/lapack/testlapack/dlahr2.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dlahr2er interface { diff --git a/lapack/testlapack/dlaln2.go b/lapack/testlapack/dlaln2.go index 30c45956..a76db20c 100644 --- a/lapack/testlapack/dlaln2.go +++ b/lapack/testlapack/dlaln2.go @@ -10,7 +10,7 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Dlaln2er interface { diff --git a/lapack/testlapack/dlangb.go b/lapack/testlapack/dlangb.go index 574b785d..af86dcc9 100644 --- a/lapack/testlapack/dlangb.go +++ b/lapack/testlapack/dlangb.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlangb_bench.go b/lapack/testlapack/dlangb_bench.go index d77363f5..0419314b 100644 --- a/lapack/testlapack/dlangb_bench.go +++ b/lapack/testlapack/dlangb_bench.go @@ -9,8 +9,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlange.go b/lapack/testlapack/dlange.go index b7776eea..20216786 100644 --- a/lapack/testlapack/dlange.go +++ b/lapack/testlapack/dlange.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlangt.go b/lapack/testlapack/dlangt.go index 7dc6daa3..26b0807c 100644 --- a/lapack/testlapack/dlangt.go +++ b/lapack/testlapack/dlangt.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlanhs.go b/lapack/testlapack/dlanhs.go index 2c5bb2e3..bf64114d 100644 --- a/lapack/testlapack/dlanhs.go +++ b/lapack/testlapack/dlanhs.go @@ -8,8 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlansb.go b/lapack/testlapack/dlansb.go index fe594ae8..f4881e37 100644 --- a/lapack/testlapack/dlansb.go +++ b/lapack/testlapack/dlansb.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlanst.go b/lapack/testlapack/dlanst.go index 3aeb1f65..63016776 100644 --- a/lapack/testlapack/dlanst.go +++ b/lapack/testlapack/dlanst.go @@ -8,8 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlansy.go b/lapack/testlapack/dlansy.go index 6d6bf89c..74034cf1 100644 --- a/lapack/testlapack/dlansy.go +++ b/lapack/testlapack/dlansy.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlantb.go b/lapack/testlapack/dlantb.go index 6d37f3c4..0b641066 100644 --- a/lapack/testlapack/dlantb.go +++ b/lapack/testlapack/dlantb.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlantb_bench.go b/lapack/testlapack/dlantb_bench.go index b05f81ab..e0e49de4 100644 --- a/lapack/testlapack/dlantb_bench.go +++ b/lapack/testlapack/dlantb_bench.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlantr.go b/lapack/testlapack/dlantr.go index e9a72bf0..c5b30746 100644 --- a/lapack/testlapack/dlantr.go +++ b/lapack/testlapack/dlantr.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlanv2.go b/lapack/testlapack/dlanv2.go index 0b8b3588..e4d76ec8 100644 --- a/lapack/testlapack/dlanv2.go +++ b/lapack/testlapack/dlanv2.go @@ -9,7 +9,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Dlanv2er interface { diff --git a/lapack/testlapack/dlapll.go b/lapack/testlapack/dlapll.go index c25588de..0f56e950 100644 --- a/lapack/testlapack/dlapll.go +++ b/lapack/testlapack/dlapll.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlapmr.go b/lapack/testlapack/dlapmr.go index c71ae030..ce98b808 100644 --- a/lapack/testlapack/dlapmr.go +++ b/lapack/testlapack/dlapmr.go @@ -8,9 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dlapmrer interface { diff --git a/lapack/testlapack/dlapy2.go b/lapack/testlapack/dlapy2.go index caa872cb..279d60a7 100644 --- a/lapack/testlapack/dlapy2.go +++ b/lapack/testlapack/dlapy2.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type Dlapy2er interface { diff --git a/lapack/testlapack/dlaqp2.go b/lapack/testlapack/dlaqp2.go index 398318cd..9be86691 100644 --- a/lapack/testlapack/dlaqp2.go +++ b/lapack/testlapack/dlaqp2.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlaqps.go b/lapack/testlapack/dlaqps.go index 1bd9a128..e9903297 100644 --- a/lapack/testlapack/dlaqps.go +++ b/lapack/testlapack/dlaqps.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlaqr04.go b/lapack/testlapack/dlaqr04.go index 44b3944c..c4298a27 100644 --- a/lapack/testlapack/dlaqr04.go +++ b/lapack/testlapack/dlaqr04.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dlaqr04er interface { diff --git a/lapack/testlapack/dlaqr1.go b/lapack/testlapack/dlaqr1.go index 3b3e0eb2..0a07e798 100644 --- a/lapack/testlapack/dlaqr1.go +++ b/lapack/testlapack/dlaqr1.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dlaqr1er interface { diff --git a/lapack/testlapack/dlaqr23.go b/lapack/testlapack/dlaqr23.go index 8b48bfe3..dfc92fc5 100644 --- a/lapack/testlapack/dlaqr23.go +++ b/lapack/testlapack/dlaqr23.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlaqr5.go b/lapack/testlapack/dlaqr5.go index f38be8af..0d5b3c67 100644 --- a/lapack/testlapack/dlaqr5.go +++ b/lapack/testlapack/dlaqr5.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlaqr5_bench.go b/lapack/testlapack/dlaqr5_bench.go index c6368c17..066483ff 100644 --- a/lapack/testlapack/dlaqr5_bench.go +++ b/lapack/testlapack/dlaqr5_bench.go @@ -8,7 +8,7 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func Dlaqr5Benchmark(b *testing.B, impl Dlaqr5er) { diff --git a/lapack/testlapack/dlarf.go b/lapack/testlapack/dlarf.go index 0af90ad7..be190fe8 100644 --- a/lapack/testlapack/dlarf.go +++ b/lapack/testlapack/dlarf.go @@ -8,11 +8,10 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlarfb.go b/lapack/testlapack/dlarfb.go index 7f717b16..636517df 100644 --- a/lapack/testlapack/dlarfb.go +++ b/lapack/testlapack/dlarfb.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlarfg.go b/lapack/testlapack/dlarfg.go index 2d0d14b5..32e0a175 100644 --- a/lapack/testlapack/dlarfg.go +++ b/lapack/testlapack/dlarfg.go @@ -8,11 +8,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dlarfger interface { diff --git a/lapack/testlapack/dlarft.go b/lapack/testlapack/dlarft.go index fe1bc22c..09e81d01 100644 --- a/lapack/testlapack/dlarft.go +++ b/lapack/testlapack/dlarft.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlarfx.go b/lapack/testlapack/dlarfx.go index 85a277cd..5fd8ea66 100644 --- a/lapack/testlapack/dlarfx.go +++ b/lapack/testlapack/dlarfx.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dlarfxer interface { diff --git a/lapack/testlapack/dlascl.go b/lapack/testlapack/dlascl.go index cec3e6e1..b9607a0e 100644 --- a/lapack/testlapack/dlascl.go +++ b/lapack/testlapack/dlascl.go @@ -9,8 +9,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlaset.go b/lapack/testlapack/dlaset.go index f0135f4b..52cb75ae 100644 --- a/lapack/testlapack/dlaset.go +++ b/lapack/testlapack/dlaset.go @@ -8,9 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Dlaseter interface { diff --git a/lapack/testlapack/dlasq1.go b/lapack/testlapack/dlasq1.go index 3ee8cd06..71ef515b 100644 --- a/lapack/testlapack/dlasq1.go +++ b/lapack/testlapack/dlasq1.go @@ -10,9 +10,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dlasq1er interface { diff --git a/lapack/testlapack/dlasq2.go b/lapack/testlapack/dlasq2.go index 18e62d69..4e618183 100644 --- a/lapack/testlapack/dlasq2.go +++ b/lapack/testlapack/dlasq2.go @@ -10,9 +10,9 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlasr.go b/lapack/testlapack/dlasr.go index fa4fce0e..503cf07b 100644 --- a/lapack/testlapack/dlasr.go +++ b/lapack/testlapack/dlasr.go @@ -8,11 +8,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlassq.go b/lapack/testlapack/dlassq.go index d3abb537..13c093ff 100644 --- a/lapack/testlapack/dlassq.go +++ b/lapack/testlapack/dlassq.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dlassqer interface { diff --git a/lapack/testlapack/dlasv2.go b/lapack/testlapack/dlasv2.go index ca62f679..e9d5608a 100644 --- a/lapack/testlapack/dlasv2.go +++ b/lapack/testlapack/dlasv2.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dlasv2er interface { diff --git a/lapack/testlapack/dlasy2.go b/lapack/testlapack/dlasy2.go index 6e1a1f6f..ad9192c2 100644 --- a/lapack/testlapack/dlasy2.go +++ b/lapack/testlapack/dlasy2.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dlatbs.go b/lapack/testlapack/dlatbs.go index df03ca11..314cb46a 100644 --- a/lapack/testlapack/dlatbs.go +++ b/lapack/testlapack/dlatbs.go @@ -9,10 +9,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dlatbser interface { diff --git a/lapack/testlapack/dlatrd.go b/lapack/testlapack/dlatrd.go index 33209ecd..3940c1d5 100644 --- a/lapack/testlapack/dlatrd.go +++ b/lapack/testlapack/dlatrd.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dlatrder interface { diff --git a/lapack/testlapack/dlatrs.go b/lapack/testlapack/dlatrs.go index 2ddf306a..cd925480 100644 --- a/lapack/testlapack/dlatrs.go +++ b/lapack/testlapack/dlatrs.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dlatrser interface { diff --git a/lapack/testlapack/dlauu2.go b/lapack/testlapack/dlauu2.go index a1059b91..af2f642d 100644 --- a/lapack/testlapack/dlauu2.go +++ b/lapack/testlapack/dlauu2.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dorg2l.go b/lapack/testlapack/dorg2l.go index ec9ff38c..b8a9ad56 100644 --- a/lapack/testlapack/dorg2l.go +++ b/lapack/testlapack/dorg2l.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dorg2ler interface { diff --git a/lapack/testlapack/dorg2r.go b/lapack/testlapack/dorg2r.go index 74065265..bfbfbad6 100644 --- a/lapack/testlapack/dorg2r.go +++ b/lapack/testlapack/dorg2r.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type Dorg2rer interface { diff --git a/lapack/testlapack/dorgbr.go b/lapack/testlapack/dorgbr.go index d1090ae7..c2eddeab 100644 --- a/lapack/testlapack/dorgbr.go +++ b/lapack/testlapack/dorgbr.go @@ -7,10 +7,9 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dorghr.go b/lapack/testlapack/dorghr.go index ce4dc32f..0d6e3583 100644 --- a/lapack/testlapack/dorghr.go +++ b/lapack/testlapack/dorghr.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dorghrer interface { diff --git a/lapack/testlapack/dorgl2.go b/lapack/testlapack/dorgl2.go index 062a8ce4..ef7a5ea8 100644 --- a/lapack/testlapack/dorgl2.go +++ b/lapack/testlapack/dorgl2.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type Dorgl2er interface { diff --git a/lapack/testlapack/dorglq.go b/lapack/testlapack/dorglq.go index 41cbc8a9..3c0817ba 100644 --- a/lapack/testlapack/dorglq.go +++ b/lapack/testlapack/dorglq.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dorglqer interface { diff --git a/lapack/testlapack/dorgql.go b/lapack/testlapack/dorgql.go index c8d2a4fa..ca227518 100644 --- a/lapack/testlapack/dorgql.go +++ b/lapack/testlapack/dorgql.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dorgqler interface { diff --git a/lapack/testlapack/dorgqr.go b/lapack/testlapack/dorgqr.go index 2bbbc437..73c68292 100644 --- a/lapack/testlapack/dorgqr.go +++ b/lapack/testlapack/dorgqr.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dorgqrer interface { diff --git a/lapack/testlapack/dorgr2.go b/lapack/testlapack/dorgr2.go index 4f778d73..afc2c740 100644 --- a/lapack/testlapack/dorgr2.go +++ b/lapack/testlapack/dorgr2.go @@ -9,11 +9,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dorgtr.go b/lapack/testlapack/dorgtr.go index 4a308ae4..215e7658 100644 --- a/lapack/testlapack/dorgtr.go +++ b/lapack/testlapack/dorgtr.go @@ -8,11 +8,10 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dorgtrer interface { @@ -21,7 +20,7 @@ type Dorgtrer interface { } func DorgtrTest(t *testing.T, impl Dorgtrer) { - const tol = 1e-14 + const tol = 1e-13 rnd := rand.New(rand.NewSource(1)) for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} { diff --git a/lapack/testlapack/dorm2r.go b/lapack/testlapack/dorm2r.go index d819f911..6fde1996 100644 --- a/lapack/testlapack/dorm2r.go +++ b/lapack/testlapack/dorm2r.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dorm2rer interface { diff --git a/lapack/testlapack/dormbr.go b/lapack/testlapack/dormbr.go index f3baed92..5555ebf1 100644 --- a/lapack/testlapack/dormbr.go +++ b/lapack/testlapack/dormbr.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dormhr.go b/lapack/testlapack/dormhr.go index d3bdd139..422adcec 100644 --- a/lapack/testlapack/dormhr.go +++ b/lapack/testlapack/dormhr.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dormhrer interface { diff --git a/lapack/testlapack/dorml2.go b/lapack/testlapack/dorml2.go index 17fc112d..6cabe5bd 100644 --- a/lapack/testlapack/dorml2.go +++ b/lapack/testlapack/dorml2.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dorml2er interface { diff --git a/lapack/testlapack/dormlq.go b/lapack/testlapack/dormlq.go index 5a84c6f3..0a7fa3aa 100644 --- a/lapack/testlapack/dormlq.go +++ b/lapack/testlapack/dormlq.go @@ -7,10 +7,9 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dormlqer interface { diff --git a/lapack/testlapack/dormqr.go b/lapack/testlapack/dormqr.go index b3f03d6f..e09ef9e3 100644 --- a/lapack/testlapack/dormqr.go +++ b/lapack/testlapack/dormqr.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dormqrer interface { diff --git a/lapack/testlapack/dormr2.go b/lapack/testlapack/dormr2.go index a05b0a18..ba20b0db 100644 --- a/lapack/testlapack/dormr2.go +++ b/lapack/testlapack/dormr2.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dormr2er interface { diff --git a/lapack/testlapack/dpbcon.go b/lapack/testlapack/dpbcon.go index 8fba1848..fc7b822e 100644 --- a/lapack/testlapack/dpbcon.go +++ b/lapack/testlapack/dpbcon.go @@ -9,9 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dpbtf2.go b/lapack/testlapack/dpbtf2.go index 89fba9ee..bc38b8ba 100644 --- a/lapack/testlapack/dpbtf2.go +++ b/lapack/testlapack/dpbtf2.go @@ -8,9 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" + "gonum.org/v1/gonum/internal/rand" ) type Dpbtf2er interface { diff --git a/lapack/testlapack/dpbtrf.go b/lapack/testlapack/dpbtrf.go index 42487e50..1f25038d 100644 --- a/lapack/testlapack/dpbtrf.go +++ b/lapack/testlapack/dpbtrf.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dpbtrfer interface { diff --git a/lapack/testlapack/dpbtrs.go b/lapack/testlapack/dpbtrs.go index d0ee2918..80e2f221 100644 --- a/lapack/testlapack/dpbtrs.go +++ b/lapack/testlapack/dpbtrs.go @@ -9,11 +9,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dpbtrser interface { diff --git a/lapack/testlapack/dpocon.go b/lapack/testlapack/dpocon.go index 7b19e8d8..6850a5f1 100644 --- a/lapack/testlapack/dpocon.go +++ b/lapack/testlapack/dpocon.go @@ -8,11 +8,10 @@ import ( "log" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dpotrf.go b/lapack/testlapack/dpotrf.go index f8a952aa..473c626a 100644 --- a/lapack/testlapack/dpotrf.go +++ b/lapack/testlapack/dpotrf.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type Dpotrfer interface { diff --git a/lapack/testlapack/dpotri.go b/lapack/testlapack/dpotri.go index 2ed5f3fd..060762a9 100644 --- a/lapack/testlapack/dpotri.go +++ b/lapack/testlapack/dpotri.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dpotrier interface { diff --git a/lapack/testlapack/dpotrs.go b/lapack/testlapack/dpotrs.go index e93619cf..fb3a5a92 100644 --- a/lapack/testlapack/dpotrs.go +++ b/lapack/testlapack/dpotrs.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dpotrser interface { diff --git a/lapack/testlapack/dpstf2.go b/lapack/testlapack/dpstf2.go index 51fc5ede..dd4a9a2d 100644 --- a/lapack/testlapack/dpstf2.go +++ b/lapack/testlapack/dpstf2.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dpstf2er interface { diff --git a/lapack/testlapack/dpstrf.go b/lapack/testlapack/dpstrf.go index a097b30a..b3c4cb23 100644 --- a/lapack/testlapack/dpstrf.go +++ b/lapack/testlapack/dpstrf.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dptcon.go b/lapack/testlapack/dptcon.go index d25ee50a..c9838a03 100644 --- a/lapack/testlapack/dptcon.go +++ b/lapack/testlapack/dptcon.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dptsv.go b/lapack/testlapack/dptsv.go index 7a552d9f..5ad4201b 100644 --- a/lapack/testlapack/dptsv.go +++ b/lapack/testlapack/dptsv.go @@ -8,7 +8,7 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type Dptsver interface { diff --git a/lapack/testlapack/dpttrf.go b/lapack/testlapack/dpttrf.go index 4cd80184..9b8beda9 100644 --- a/lapack/testlapack/dpttrf.go +++ b/lapack/testlapack/dpttrf.go @@ -9,8 +9,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dpttrs.go b/lapack/testlapack/dpttrs.go index fc599624..e823876a 100644 --- a/lapack/testlapack/dpttrs.go +++ b/lapack/testlapack/dpttrs.go @@ -8,8 +8,8 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dsteqr.go b/lapack/testlapack/dsteqr.go index 8f9d45f4..156e2be5 100644 --- a/lapack/testlapack/dsteqr.go +++ b/lapack/testlapack/dsteqr.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dsterf.go b/lapack/testlapack/dsterf.go index ccd87973..40c2236c 100644 --- a/lapack/testlapack/dsterf.go +++ b/lapack/testlapack/dsterf.go @@ -10,11 +10,10 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dsyev.go b/lapack/testlapack/dsyev.go index 65ccc886..5ce68f49 100644 --- a/lapack/testlapack/dsyev.go +++ b/lapack/testlapack/dsyev.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dsytd2.go b/lapack/testlapack/dsytd2.go index 586efa98..22a9bcf7 100644 --- a/lapack/testlapack/dsytd2.go +++ b/lapack/testlapack/dsytd2.go @@ -8,10 +8,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dsytd2er interface { diff --git a/lapack/testlapack/dsytrd.go b/lapack/testlapack/dsytrd.go index 2b85ff3d..e151be32 100644 --- a/lapack/testlapack/dsytrd.go +++ b/lapack/testlapack/dsytrd.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dtbtrs.go b/lapack/testlapack/dtbtrs.go index 50b82246..b3d3f3d9 100644 --- a/lapack/testlapack/dtbtrs.go +++ b/lapack/testlapack/dtbtrs.go @@ -9,11 +9,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dtgsja.go b/lapack/testlapack/dtgsja.go index 88245c97..f2ad79ec 100644 --- a/lapack/testlapack/dtgsja.go +++ b/lapack/testlapack/dtgsja.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dtrcon.go b/lapack/testlapack/dtrcon.go index 11882dfe..403aee14 100644 --- a/lapack/testlapack/dtrcon.go +++ b/lapack/testlapack/dtrcon.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dtrevc3.go b/lapack/testlapack/dtrevc3.go index dce3d8c0..2b7a5c13 100644 --- a/lapack/testlapack/dtrevc3.go +++ b/lapack/testlapack/dtrevc3.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dtrexc.go b/lapack/testlapack/dtrexc.go index a5a025c1..33bc0bb5 100644 --- a/lapack/testlapack/dtrexc.go +++ b/lapack/testlapack/dtrexc.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/dtrti2.go b/lapack/testlapack/dtrti2.go index bfaf8a97..dd71d844 100644 --- a/lapack/testlapack/dtrti2.go +++ b/lapack/testlapack/dtrti2.go @@ -7,11 +7,10 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) type Dtrti2er interface { diff --git a/lapack/testlapack/dtrtri.go b/lapack/testlapack/dtrtri.go index 5483ef38..66d32714 100644 --- a/lapack/testlapack/dtrtri.go +++ b/lapack/testlapack/dtrtri.go @@ -7,10 +7,9 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) type Dtrtrier interface { diff --git a/lapack/testlapack/dtrtrs.go b/lapack/testlapack/dtrtrs.go index 3ea8f316..ccfe05e8 100644 --- a/lapack/testlapack/dtrtrs.go +++ b/lapack/testlapack/dtrtrs.go @@ -9,11 +9,10 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/general.go b/lapack/testlapack/general.go index f532e1d2..cf100d34 100644 --- a/lapack/testlapack/general.go +++ b/lapack/testlapack/general.go @@ -10,10 +10,9 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack" ) diff --git a/lapack/testlapack/matgen.go b/lapack/testlapack/matgen.go index 5bc2deea..5ab1dc94 100644 --- a/lapack/testlapack/matgen.go +++ b/lapack/testlapack/matgen.go @@ -7,11 +7,10 @@ package testlapack import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) // Dlatm1 computes the entries of dst as specified by mode, cond and rsign. diff --git a/lapack/testlapack/matgen_test.go b/lapack/testlapack/matgen_test.go index c9f5fc7a..a701ccbd 100644 --- a/lapack/testlapack/matgen_test.go +++ b/lapack/testlapack/matgen_test.go @@ -7,9 +7,8 @@ package testlapack import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) func TestDlagsy(t *testing.T) { diff --git a/lapack/testlapack/test_matrices.go b/lapack/testlapack/test_matrices.go index f6ce7fbe..2853572b 100644 --- a/lapack/testlapack/test_matrices.go +++ b/lapack/testlapack/test_matrices.go @@ -7,9 +7,8 @@ package testlapack import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) // A123 is the non-symmetric singular matrix diff --git a/mat/cdense_test.go b/mat/cdense_test.go index d5440638..4b79888b 100644 --- a/mat/cdense_test.go +++ b/mat/cdense_test.go @@ -8,7 +8,7 @@ import ( "math/cmplx" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestCDenseNewAtSet(t *testing.T) { diff --git a/mat/cholesky_test.go b/mat/cholesky_test.go index f938e891..8c5f5291 100644 --- a/mat/cholesky_test.go +++ b/mat/cholesky_test.go @@ -10,9 +10,8 @@ import ( "strconv" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestCholesky(t *testing.T) { @@ -917,9 +916,8 @@ func TestBandCholeskyDet(t *testing.T) { want := cholDense.Det() got := chol.Det() - diff := math.Abs(got - want) - if diff > tol { - t.Errorf("%v: unexpected result; got=%v, want=%v (diff=%v)", name, got, want, diff) + if !scalar.EqualWithinRel(got, want, tol) { + t.Errorf("%v: unexpected result; got=%v, want=%v (diff=%v)", name, got, want, math.Abs(got-want)) } } } diff --git a/mat/dense_test.go b/mat/dense_test.go index 687d8222..a1ce8612 100644 --- a/mat/dense_test.go +++ b/mat/dense_test.go @@ -11,10 +11,9 @@ import ( "strings" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat/combin" ) diff --git a/mat/diagonal_test.go b/mat/diagonal_test.go index 9c142b81..aca33d36 100644 --- a/mat/diagonal_test.go +++ b/mat/diagonal_test.go @@ -9,9 +9,8 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) func TestNewDiagDense(t *testing.T) { diff --git a/mat/eigen_test.go b/mat/eigen_test.go index e1dd2dfa..00ce5527 100644 --- a/mat/eigen_test.go +++ b/mat/eigen_test.go @@ -9,9 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) func TestEigen(t *testing.T) { diff --git a/mat/gsvd_test.go b/mat/gsvd_test.go index ec2f4e05..83225158 100644 --- a/mat/gsvd_test.go +++ b/mat/gsvd_test.go @@ -8,10 +8,9 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestGSVD(t *testing.T) { diff --git a/mat/hogsvd_test.go b/mat/hogsvd_test.go index 07886ddd..d8f0dec8 100644 --- a/mat/hogsvd_test.go +++ b/mat/hogsvd_test.go @@ -7,7 +7,7 @@ package mat import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestHOGSVD(t *testing.T) { diff --git a/mat/inner_test.go b/mat/inner_test.go index 269b2ea3..1a578c1a 100644 --- a/mat/inner_test.go +++ b/mat/inner_test.go @@ -8,10 +8,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/blas/testblas" + "gonum.org/v1/gonum/internal/rand" ) func TestInner(t *testing.T) { diff --git a/mat/list_test.go b/mat/list_test.go index 677f02e6..19577bd7 100644 --- a/mat/list_test.go +++ b/mat/list_test.go @@ -12,12 +12,11 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) // legalSizeSameRectangular returns whether the two matrices have the same rectangular shape. diff --git a/mat/lq_test.go b/mat/lq_test.go index 73986111..6b9b3796 100644 --- a/mat/lq_test.go +++ b/mat/lq_test.go @@ -7,7 +7,7 @@ package mat import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestLQ(t *testing.T) { diff --git a/mat/lu_test.go b/mat/lu_test.go index 2ae13ea3..62d99b6f 100644 --- a/mat/lu_test.go +++ b/mat/lu_test.go @@ -7,7 +7,7 @@ package mat import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestLU(t *testing.T) { diff --git a/mat/matrix_test.go b/mat/matrix_test.go index 8cc2d8c7..25fda0cd 100644 --- a/mat/matrix_test.go +++ b/mat/matrix_test.go @@ -10,10 +10,10 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func panics(fn func()) (panicked bool, message string) { diff --git a/mat/mul_test.go b/mat/mul_test.go index 5897409c..8b95ca1c 100644 --- a/mat/mul_test.go +++ b/mat/mul_test.go @@ -7,11 +7,10 @@ package mat import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) // TODO: Need to add tests where one is overwritten. diff --git a/mat/pool_test.go b/mat/pool_test.go index 25ea5084..ef82fbb6 100644 --- a/mat/pool_test.go +++ b/mat/pool_test.go @@ -9,7 +9,7 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestPool(t *testing.T) { diff --git a/mat/product_test.go b/mat/product_test.go index 36f58783..a589a383 100644 --- a/mat/product_test.go +++ b/mat/product_test.go @@ -8,7 +8,7 @@ import ( "fmt" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type dims struct{ r, c int } diff --git a/mat/qr_test.go b/mat/qr_test.go index e9ec26aa..3a7f9752 100644 --- a/mat/qr_test.go +++ b/mat/qr_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) func TestQR(t *testing.T) { diff --git a/mat/shadow_test.go b/mat/shadow_test.go index 8c7b8475..d80332e9 100644 --- a/mat/shadow_test.go +++ b/mat/shadow_test.go @@ -7,7 +7,7 @@ package mat import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestDenseOverlaps(t *testing.T) { diff --git a/mat/solve_test.go b/mat/solve_test.go index 043b3021..9c9034f4 100644 --- a/mat/solve_test.go +++ b/mat/solve_test.go @@ -7,7 +7,7 @@ package mat import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestSolve(t *testing.T) { diff --git a/mat/svd_test.go b/mat/svd_test.go index b7129f95..c2c1dfa4 100644 --- a/mat/svd_test.go +++ b/mat/svd_test.go @@ -7,9 +7,8 @@ package mat import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) func TestSVD(t *testing.T) { diff --git a/mat/symmetric_test.go b/mat/symmetric_test.go index af95d763..61e03b7a 100644 --- a/mat/symmetric_test.go +++ b/mat/symmetric_test.go @@ -10,11 +10,10 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestNewSymmetric(t *testing.T) { diff --git a/mat/triangular_test.go b/mat/triangular_test.go index 2aca32a1..1ea4db2a 100644 --- a/mat/triangular_test.go +++ b/mat/triangular_test.go @@ -10,10 +10,9 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas" "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" ) func TestNewTriangular(t *testing.T) { diff --git a/mat/tridiag_test.go b/mat/tridiag_test.go index 4eeb7ff6..f50699b7 100644 --- a/mat/tridiag_test.go +++ b/mat/tridiag_test.go @@ -9,8 +9,7 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/lapack/lapack64" ) diff --git a/mat/vector_test.go b/mat/vector_test.go index 258cab7a..bedec6bc 100644 --- a/mat/vector_test.go +++ b/mat/vector_test.go @@ -8,9 +8,8 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/blas/blas64" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat/combin" ) diff --git a/mathext/ell_carlson_test.go b/mathext/ell_carlson_test.go index 6306ad5c..1cf1213f 100644 --- a/mathext/ell_carlson_test.go +++ b/mathext/ell_carlson_test.go @@ -8,7 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // Testing EllipticF (and EllipticRF) using the addition theorems from http://dlmf.nist.gov/19.11.i diff --git a/mathext/internal/amos/amos_fortran_test.go b/mathext/internal/amos/amos_fortran_test.go index c9a90143..90bc58d9 100644 --- a/mathext/internal/amos/amos_fortran_test.go +++ b/mathext/internal/amos/amos_fortran_test.go @@ -12,8 +12,7 @@ import ( "runtime" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext/internal/amos/amoslib" ) diff --git a/mathext/internal/amos/amos_test.go b/mathext/internal/amos/amos_test.go index 3e6ba75e..f723b2fb 100644 --- a/mathext/internal/amos/amos_test.go +++ b/mathext/internal/amos/amos_test.go @@ -10,9 +10,8 @@ import ( "strconv" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) type input struct { diff --git a/mathext/internal/amos/origcode_test.go b/mathext/internal/amos/origcode_test.go index a45adddb..4fd03f5c 100644 --- a/mathext/internal/amos/origcode_test.go +++ b/mathext/internal/amos/origcode_test.go @@ -20,7 +20,6 @@ func iabs(a int) int { return -a } - func zairyOrig(ZR, ZI float64, ID, KODE int) (AIR, AII float64, NZ, IERR int) { // zairy is adapted from the original Netlib code by Donald Amos. // http://www.netlib.no/netlib/amos/zairy.f diff --git a/mathext/prng/mt19937_64_test.go b/mathext/prng/mt19937_64_test.go index d3de7a55..46738076 100644 --- a/mathext/prng/mt19937_64_test.go +++ b/mathext/prng/mt19937_64_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) var _ rand.Source = (*MT19937_64)(nil) diff --git a/mathext/prng/mt19937_test.go b/mathext/prng/mt19937_test.go index 709e1b25..4e7e842e 100644 --- a/mathext/prng/mt19937_test.go +++ b/mathext/prng/mt19937_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) var _ rand.Source = (*MT19937)(nil) diff --git a/mathext/prng/prng_di_unimi_test.go b/mathext/prng/prng_di_unimi_test.go index 21d5987a..078b3faf 100644 --- a/mathext/prng/prng_di_unimi_test.go +++ b/mathext/prng/prng_di_unimi_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // Random values in tests are produced by 40 iterations of the C code. diff --git a/optimize/cmaes.go b/optimize/cmaes.go index 70ead5a8..09904ec4 100644 --- a/optimize/cmaes.go +++ b/optimize/cmaes.go @@ -8,9 +8,8 @@ import ( "math" "sort" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/distmv" ) diff --git a/optimize/cmaes_test.go b/optimize/cmaes_test.go index 04ff14f9..23e0408b 100644 --- a/optimize/cmaes_test.go +++ b/optimize/cmaes_test.go @@ -9,9 +9,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/optimize/functions" ) @@ -156,7 +155,7 @@ func cmaTestCases() []cmaTestCase { Func: functions.Rastrigin{}.Func, }, method: &CmaEsChol{ - Population: 100, // Increase the population size to reduce noise. + Population: 200, // Increase the population size to reduce noise. }, settings: &Settings{ Converger: NeverTerminate{}, diff --git a/optimize/convex/lp/simplex_test.go b/optimize/convex/lp/simplex_test.go index b9307478..80bc6c46 100644 --- a/optimize/convex/lp/simplex_test.go +++ b/optimize/convex/lp/simplex_test.go @@ -7,9 +7,8 @@ package lp import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) @@ -132,7 +131,7 @@ func TestSimplex(t *testing.T) { rnd := rand.New(rand.NewSource(1)) // Randomized tests - testRandomSimplex(t, 20000, 0.7, 10, rnd) + testRandomSimplex(t, 20000, 0.2, 10, rnd) testRandomSimplex(t, 20000, 0, 10, rnd) testRandomSimplex(t, 200, 0, 100, rnd) testRandomSimplex(t, 2, 0, 400, rnd) diff --git a/optimize/listsearch_test.go b/optimize/listsearch_test.go index 40137e2e..9631a7ed 100644 --- a/optimize/listsearch_test.go +++ b/optimize/listsearch_test.go @@ -7,9 +7,8 @@ package optimize import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/optimize/functions" ) diff --git a/spatial/barneshut/barneshut2_test.go b/spatial/barneshut/barneshut2_test.go index 2bbb4303..a82949f9 100644 --- a/spatial/barneshut/barneshut2_test.go +++ b/spatial/barneshut/barneshut2_test.go @@ -10,9 +10,8 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/spatial/r2" ) diff --git a/spatial/barneshut/barneshut3_test.go b/spatial/barneshut/barneshut3_test.go index 88dfca7c..0c9e0ad5 100644 --- a/spatial/barneshut/barneshut3_test.go +++ b/spatial/barneshut/barneshut3_test.go @@ -10,9 +10,8 @@ import ( "reflect" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/spatial/r3" ) diff --git a/spatial/barneshut/galaxy_example_test.go b/spatial/barneshut/galaxy_example_test.go index 0f7f9314..ad2e79fc 100644 --- a/spatial/barneshut/galaxy_example_test.go +++ b/spatial/barneshut/galaxy_example_test.go @@ -7,8 +7,7 @@ package barneshut_test import ( "log" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/spatial/barneshut" "gonum.org/v1/gonum/spatial/r2" ) diff --git a/spatial/curve/hilbert_test.go b/spatial/curve/hilbert_test.go index b68b14ec..1237a2c3 100644 --- a/spatial/curve/hilbert_test.go +++ b/spatial/curve/hilbert_test.go @@ -12,7 +12,7 @@ import ( "strings" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func ExampleHilbert2D_Pos() { diff --git a/spatial/kdtree/kdtree_test.go b/spatial/kdtree/kdtree_test.go index 8b0b4e2a..b5432339 100644 --- a/spatial/kdtree/kdtree_test.go +++ b/spatial/kdtree/kdtree_test.go @@ -16,7 +16,7 @@ import ( "testing" "unsafe" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) var ( diff --git a/spatial/kdtree/medians.go b/spatial/kdtree/medians.go index 607d4897..7e50c518 100644 --- a/spatial/kdtree/medians.go +++ b/spatial/kdtree/medians.go @@ -7,7 +7,7 @@ package kdtree import ( "sort" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // Partition partitions list such that all elements less than the value at diff --git a/spatial/kdtree/medians_test.go b/spatial/kdtree/medians_test.go index f6936113..6e0d5790 100644 --- a/spatial/kdtree/medians_test.go +++ b/spatial/kdtree/medians_test.go @@ -8,7 +8,7 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) type ints []int diff --git a/spatial/r2/box_test.go b/spatial/r2/box_test.go index 0e0ea869..e524eb7b 100644 --- a/spatial/r2/box_test.go +++ b/spatial/r2/box_test.go @@ -7,7 +7,7 @@ package r2 import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestBoxContains(t *testing.T) { diff --git a/spatial/r2/triangle_test.go b/spatial/r2/triangle_test.go index 423905dc..8e18d386 100644 --- a/spatial/r2/triangle_test.go +++ b/spatial/r2/triangle_test.go @@ -8,7 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestTriangleDegenerate(t *testing.T) { diff --git a/spatial/r2/vector_test.go b/spatial/r2/vector_test.go index 05dbbf0f..aac09981 100644 --- a/spatial/r2/vector_test.go +++ b/spatial/r2/vector_test.go @@ -8,8 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestAdd(t *testing.T) { diff --git a/spatial/r3/box_test.go b/spatial/r3/box_test.go index 2424ae5c..b8380dfa 100644 --- a/spatial/r3/box_test.go +++ b/spatial/r3/box_test.go @@ -7,7 +7,7 @@ package r3 import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestBoxContains(t *testing.T) { diff --git a/spatial/r3/mat_test.go b/spatial/r3/mat_test.go index 5e18d9ad..77659aeb 100644 --- a/spatial/r3/mat_test.go +++ b/spatial/r3/mat_test.go @@ -8,8 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/num/quat" ) @@ -284,7 +283,7 @@ var scalarFields = []struct { func TestMatHessian(t *testing.T) { const ( - tol = 1e-5 + tol = 3e-5 h = 8e-4 ) step := Vec{X: h, Y: h, Z: h} @@ -296,8 +295,9 @@ func TestMatHessian(t *testing.T) { got.Hessian(p, step, test.field) want := test.hessian(p) if !mat.EqualApprox(got, want, tol) { - t.Errorf("matrices not equal within tol\ngot: %v\nwant: %v", - mat.Formatted(got), mat.Formatted(want)) + t.Errorf("matrices not equal within tol\ngot: %v\nwant: %v", + mat.Formatted(got, mat.Prefix(" ")), + mat.Formatted(want, mat.Prefix(" "))) } } } diff --git a/spatial/r3/triangle_test.go b/spatial/r3/triangle_test.go index 689079cf..6c57d511 100644 --- a/spatial/r3/triangle_test.go +++ b/spatial/r3/triangle_test.go @@ -8,7 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestTriangleDegenerate(t *testing.T) { diff --git a/spatial/r3/vector_test.go b/spatial/r3/vector_test.go index 72023e2b..5da34d66 100644 --- a/spatial/r3/vector_test.go +++ b/spatial/r3/vector_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/spatial/vptree/vptree.go b/spatial/vptree/vptree.go index 5c945199..e17d9d0e 100644 --- a/spatial/vptree/vptree.go +++ b/spatial/vptree/vptree.go @@ -10,8 +10,7 @@ import ( "math" "sort" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat" ) diff --git a/spatial/vptree/vptree_test.go b/spatial/vptree/vptree_test.go index f20e7d2a..f80b4399 100644 --- a/spatial/vptree/vptree_test.go +++ b/spatial/vptree/vptree_test.go @@ -16,9 +16,8 @@ import ( "testing" "unsafe" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/internal/order" + "gonum.org/v1/gonum/internal/rand" ) var ( diff --git a/stat/card/card_test.go b/stat/card/card_test.go index c38c4719..b04d4c83 100644 --- a/stat/card/card_test.go +++ b/stat/card/card_test.go @@ -15,9 +15,8 @@ import ( "sync" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) // exact is an exact cardinality accumulator. @@ -51,16 +50,16 @@ var counterTests = []struct { {name: "HyperLogLog32-0-10-FNV-1a", count: 0, counter: func() counter { return mustCounter(NewHyperLogLog32(10, fnv.New32a())) }, tol: 0}, {name: "HyperLogLog64-0-10-FNV-1a", count: 0, counter: func() counter { return mustCounter(NewHyperLogLog64(10, fnv.New64a())) }, tol: 0}, {name: "HyperLogLog32-10-14-FNV-1a", count: 10, counter: func() counter { return mustCounter(NewHyperLogLog32(14, fnv.New32a())) }, tol: 0.0005}, - {name: "HyperLogLog32-1e3-4-FNV-1a", count: 1e3, counter: func() counter { return mustCounter(NewHyperLogLog32(4, fnv.New32a())) }, tol: 0.1}, - {name: "HyperLogLog32-1e4-6-FNV-1a", count: 1e4, counter: func() counter { return mustCounter(NewHyperLogLog32(6, fnv.New32a())) }, tol: 0.06}, - {name: "HyperLogLog32-1e7-8-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog32(8, fnv.New32a())) }, tol: 0.03}, + {name: "HyperLogLog32-1e3-4-FNV-1a", count: 1e3, counter: func() counter { return mustCounter(NewHyperLogLog32(4, fnv.New32a())) }, tol: 0.5}, + {name: "HyperLogLog32-1e4-6-FNV-1a", count: 1e4, counter: func() counter { return mustCounter(NewHyperLogLog32(6, fnv.New32a())) }, tol: 0.1}, + {name: "HyperLogLog32-1e7-8-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog32(8, fnv.New32a())) }, tol: 0.08}, {name: "HyperLogLog64-1e7-8-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog64(8, fnv.New64a())) }, tol: 0.07}, {name: "HyperLogLog32-1e7-10-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog32(10, fnv.New32a())) }, tol: 0.06}, - {name: "HyperLogLog64-1e7-10-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog64(10, fnv.New64a())) }, tol: 0.02}, - {name: "HyperLogLog32-1e7-14-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog32(14, fnv.New32a())) }, tol: 0.005}, - {name: "HyperLogLog64-1e7-14-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog64(14, fnv.New64a())) }, tol: 0.002}, + {name: "HyperLogLog64-1e7-10-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog64(10, fnv.New64a())) }, tol: 0.04}, + {name: "HyperLogLog32-1e7-14-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog32(14, fnv.New32a())) }, tol: 0.015}, + {name: "HyperLogLog64-1e7-14-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog64(14, fnv.New64a())) }, tol: 0.01}, {name: "HyperLogLog32-1e7-16-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog32(16, fnv.New32a())) }, tol: 0.005}, - {name: "HyperLogLog64-1e7-16-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog64(16, fnv.New64a())) }, tol: 0.002}, + {name: "HyperLogLog64-1e7-16-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog64(16, fnv.New64a())) }, tol: 0.008}, {name: "HyperLogLog64-1e7-20-FNV-1a", count: 1e7, counter: func() counter { return mustCounter(NewHyperLogLog64(20, fnv.New64a())) }, tol: 0.001}, {name: "HyperLogLog64-1e3-20-FNV-1a", count: 1e3, counter: func() counter { return mustCounter(NewHyperLogLog64(20, fnv.New64a())) }, tol: 0.001}, } diff --git a/stat/distmat/permutation.go b/stat/distmat/permutation.go index e1112646..d45e74e6 100644 --- a/stat/distmat/permutation.go +++ b/stat/distmat/permutation.go @@ -5,8 +5,7 @@ package distmat import ( - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/stat/distmat/permutation_test.go b/stat/distmat/permutation_test.go index 206e2a8c..7c764395 100644 --- a/stat/distmat/permutation_test.go +++ b/stat/distmat/permutation_test.go @@ -7,8 +7,7 @@ package distmat import ( "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/stat/distmat/unit_vector.go b/stat/distmat/unit_vector.go index 4f6bc5f4..87df26c1 100644 --- a/stat/distmat/unit_vector.go +++ b/stat/distmat/unit_vector.go @@ -5,8 +5,7 @@ package distmat import ( - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/distuv" ) diff --git a/stat/distmat/unit_vector_example_test.go b/stat/distmat/unit_vector_example_test.go index cd815fc1..f321a652 100644 --- a/stat/distmat/unit_vector_example_test.go +++ b/stat/distmat/unit_vector_example_test.go @@ -7,8 +7,7 @@ package distmat_test import ( "fmt" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/distmat" ) @@ -39,5 +38,5 @@ func ExampleUnitVector() { distance := mat.Norm(position, 2) fmt.Printf("took %d steps in %d-space, walked %1.1f in total", nSteps, nDim, distance) // Output: - // took 22 steps in 52-space, walked 5.3 in total + // took 60 steps in 41-space, walked 7.8 in total } diff --git a/stat/distmat/unit_vector_test.go b/stat/distmat/unit_vector_test.go index 1b5e5b62..35d95fff 100644 --- a/stat/distmat/unit_vector_test.go +++ b/stat/distmat/unit_vector_test.go @@ -7,9 +7,8 @@ package distmat import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/stat/distmat/wishart.go b/stat/distmat/wishart.go index 0f007dc1..02af6281 100644 --- a/stat/distmat/wishart.go +++ b/stat/distmat/wishart.go @@ -8,8 +8,7 @@ import ( "math" "sync" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/mathext" "gonum.org/v1/gonum/stat/distuv" diff --git a/stat/distmat/wishart_test.go b/stat/distmat/wishart_test.go index cc7e686c..bf9bdfe4 100644 --- a/stat/distmat/wishart_test.go +++ b/stat/distmat/wishart_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/stat/distmv/dirichlet.go b/stat/distmv/dirichlet.go index fec49ce4..3b89c5c5 100644 --- a/stat/distmv/dirichlet.go +++ b/stat/distmv/dirichlet.go @@ -7,9 +7,8 @@ package distmv import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/distuv" ) diff --git a/stat/distmv/dirichlet_test.go b/stat/distmv/dirichlet_test.go index 24f69de9..a07ac532 100644 --- a/stat/distmv/dirichlet_test.go +++ b/stat/distmv/dirichlet_test.go @@ -8,8 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/stat/distmv/normal.go b/stat/distmv/normal.go index 8d6cc814..8d55bfeb 100644 --- a/stat/distmv/normal.go +++ b/stat/distmv/normal.go @@ -7,9 +7,8 @@ package distmv import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat" "gonum.org/v1/gonum/stat/distuv" diff --git a/stat/distmv/normal_test.go b/stat/distmv/normal_test.go index c358fd31..52573213 100644 --- a/stat/distmv/normal_test.go +++ b/stat/distmv/normal_test.go @@ -9,10 +9,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/diff/fd" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat" ) diff --git a/stat/distmv/normalbench_test.go b/stat/distmv/normalbench_test.go index d254e5b9..b2cf5cda 100644 --- a/stat/distmv/normalbench_test.go +++ b/stat/distmv/normalbench_test.go @@ -8,8 +8,7 @@ import ( "log" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) diff --git a/stat/distmv/statdist_test.go b/stat/distmv/statdist_test.go index 605a3ba1..c2623e33 100644 --- a/stat/distmv/statdist_test.go +++ b/stat/distmv/statdist_test.go @@ -8,10 +8,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/spatial/r1" ) diff --git a/stat/distmv/studentst.go b/stat/distmv/studentst.go index 2ef71bec..c9c8b5e5 100644 --- a/stat/distmv/studentst.go +++ b/stat/distmv/studentst.go @@ -8,10 +8,10 @@ import ( "math" "sort" - "golang.org/x/exp/rand" "golang.org/x/tools/container/intsets" "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat" "gonum.org/v1/gonum/stat/distuv" diff --git a/stat/distmv/studentst_test.go b/stat/distmv/studentst_test.go index 324843c2..ad5fbcd6 100644 --- a/stat/distmv/studentst_test.go +++ b/stat/distmv/studentst_test.go @@ -8,10 +8,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat" ) diff --git a/stat/distmv/uniform.go b/stat/distmv/uniform.go index 75082f7a..1d98f241 100644 --- a/stat/distmv/uniform.go +++ b/stat/distmv/uniform.go @@ -7,7 +7,7 @@ package distmv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/spatial/r1" ) diff --git a/stat/distuv/alphastable.go b/stat/distuv/alphastable.go index d23335d9..ee31dc36 100644 --- a/stat/distuv/alphastable.go +++ b/stat/distuv/alphastable.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // AlphaStable represents an α-stable distribution with four parameters. diff --git a/stat/distuv/alphastable_test.go b/stat/distuv/alphastable_test.go index c761f606..7923e8f7 100644 --- a/stat/distuv/alphastable_test.go +++ b/stat/distuv/alphastable_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat" ) @@ -38,7 +38,7 @@ func TestAlphaStable(t *testing.T) { func TestAlphaStability(t *testing.T) { t.Parallel() const ( - n = 10000 + n = 100000 ksTol = 2e-2 ) for i, test := range []struct { @@ -60,7 +60,7 @@ func TestAlphaStableGaussian(t *testing.T) { t.Parallel() src := rand.New(rand.NewSource(1)) d := AlphaStable{Alpha: 2, Beta: 0, C: 1.5, Mu: -0.4, Src: src} - n := 100000 + n := 1000000 x := make([]float64, n) for i := 0; i < n; i++ { x[i] = d.Rand() @@ -69,14 +69,14 @@ func TestAlphaStableGaussian(t *testing.T) { checkExKurtosis(t, 0, x, d, 1e-2) checkMean(t, 0, x, d, 1e-2) checkVarAndStd(t, 0, x, d, 1e-2) - checkMode(t, 0, x, d, 5e-2, 1e-1) + checkMode(t, 0, x, d, 5e-2, 3e-1) } func TestAlphaStableMean(t *testing.T) { t.Parallel() src := rand.New(rand.NewSource(1)) d := AlphaStable{Alpha: 1.75, Beta: 0.2, C: 1.2, Mu: 0.3, Src: src} - n := 100000 + n := 1000000 x := make([]float64, n) for i := 0; i < n; i++ { x[i] = d.Rand() @@ -166,6 +166,8 @@ func testAlphaStableAnalytic(t *testing.T, i int, dist AlphaStable) { } func testStability(t *testing.T, i, n int, alpha, beta1, beta2, c1, c2, mu1, mu2, ksTol float64) { + t.Helper() + src := rand.New(rand.NewSource(1)) d1 := AlphaStable{alpha, beta1, c1, mu1, src} d2 := AlphaStable{alpha, beta2, c2, mu2, src} diff --git a/stat/distuv/bernoulli.go b/stat/distuv/bernoulli.go index 47d6f0ad..8f06a952 100644 --- a/stat/distuv/bernoulli.go +++ b/stat/distuv/bernoulli.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // Bernoulli represents a random variable whose value is 1 with probability p and diff --git a/stat/distuv/bernoulli_test.go b/stat/distuv/bernoulli_test.go index a59553b1..0a5fe4e1 100644 --- a/stat/distuv/bernoulli_test.go +++ b/stat/distuv/bernoulli_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestBernoulli(t *testing.T) { diff --git a/stat/distuv/beta.go b/stat/distuv/beta.go index e72c26e8..67acf7a1 100644 --- a/stat/distuv/beta.go +++ b/stat/distuv/beta.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" ) diff --git a/stat/distuv/beta_test.go b/stat/distuv/beta_test.go index 6e8a7435..b88e4249 100644 --- a/stat/distuv/beta_test.go +++ b/stat/distuv/beta_test.go @@ -9,9 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestBetaProb(t *testing.T) { diff --git a/stat/distuv/binomial.go b/stat/distuv/binomial.go index a7e67377..16be8e4f 100644 --- a/stat/distuv/binomial.go +++ b/stat/distuv/binomial.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" "gonum.org/v1/gonum/stat/combin" ) diff --git a/stat/distuv/binomial_test.go b/stat/distuv/binomial_test.go index 04b6119e..85dc530f 100644 --- a/stat/distuv/binomial_test.go +++ b/stat/distuv/binomial_test.go @@ -8,9 +8,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestBinomialProb(t *testing.T) { @@ -145,7 +144,7 @@ func testBinomial(t *testing.T, b Binomial, i int) { checkMean(t, i, x, b, tol) checkVarAndStd(t, i, x, b, tol) checkExKurtosis(t, i, x, b, 7e-2) - checkSkewness(t, i, x, b, tol) + checkSkewness(t, i, x, b, 3e-2) if b.NumParameters() != 2 { t.Errorf("Wrong number of parameters") diff --git a/stat/distuv/categorical.go b/stat/distuv/categorical.go index 13a26b8e..0930d7d6 100644 --- a/stat/distuv/categorical.go +++ b/stat/distuv/categorical.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // Categorical is an extension of the Bernoulli distribution where x takes diff --git a/stat/distuv/categorical_test.go b/stat/distuv/categorical_test.go index 996560c4..103ae4a4 100644 --- a/stat/distuv/categorical_test.go +++ b/stat/distuv/categorical_test.go @@ -8,10 +8,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) const ( diff --git a/stat/distuv/chi.go b/stat/distuv/chi.go index 07efb284..4fb07ea9 100644 --- a/stat/distuv/chi.go +++ b/stat/distuv/chi.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" ) diff --git a/stat/distuv/chi_test.go b/stat/distuv/chi_test.go index 51b7a066..84a3f0cb 100644 --- a/stat/distuv/chi_test.go +++ b/stat/distuv/chi_test.go @@ -9,9 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestChiProb(t *testing.T) { diff --git a/stat/distuv/chisquared.go b/stat/distuv/chisquared.go index 000e19b3..708d975d 100644 --- a/stat/distuv/chisquared.go +++ b/stat/distuv/chisquared.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" ) diff --git a/stat/distuv/chisquared_test.go b/stat/distuv/chisquared_test.go index 6c8c0858..0bec319d 100644 --- a/stat/distuv/chisquared_test.go +++ b/stat/distuv/chisquared_test.go @@ -9,9 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestChiSquaredProb(t *testing.T) { diff --git a/stat/distuv/exponential.go b/stat/distuv/exponential.go index 9770c445..ce443041 100644 --- a/stat/distuv/exponential.go +++ b/stat/distuv/exponential.go @@ -7,9 +7,8 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat" ) diff --git a/stat/distuv/exponential_test.go b/stat/distuv/exponential_test.go index 591adaef..be51d32e 100644 --- a/stat/distuv/exponential_test.go +++ b/stat/distuv/exponential_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestExponentialProb(t *testing.T) { @@ -73,7 +73,7 @@ func testExponential(t *testing.T, dist Exponential, i int) { checkMean(t, i, x, dist, tol) checkVarAndStd(t, i, x, dist, tol) checkEntropy(t, i, x, dist, tol) - checkExKurtosis(t, i, x, dist, tol) + checkExKurtosis(t, i, x, dist, 3e-2) checkSkewness(t, i, x, dist, tol) checkMedian(t, i, x, dist, tol) checkQuantileCDFSurvival(t, i, x, dist, tol) diff --git a/stat/distuv/f.go b/stat/distuv/f.go index e7e6434d..139d375c 100644 --- a/stat/distuv/f.go +++ b/stat/distuv/f.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" ) diff --git a/stat/distuv/f_test.go b/stat/distuv/f_test.go index 75ea6b7f..b4f06794 100644 --- a/stat/distuv/f_test.go +++ b/stat/distuv/f_test.go @@ -9,9 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestFProb(t *testing.T) { @@ -88,10 +87,10 @@ func testF(t *testing.T, f F, i int) { checkProbContinuous(t, i, x, 0, math.Inf(1), f, 1e-4) checkMean(t, i, x, f, tol) checkVarAndStd(t, i, x, f, tol) - checkExKurtosis(t, i, x, f, 1e-1) + checkExKurtosis(t, i, x, f, 2e-1) checkSkewness(t, i, x, f, 5e-2) checkQuantileCDFSurvival(t, i, x, f, 5e-3) - checkMode(t, i, x, f, 2e-2, 3e-2) + checkMode(t, i, x, f, 2e-2, 1e-1) if f.NumParameters() != 2 { t.Errorf("Wrong number of parameters. Got %v, want 2", f.NumParameters()) diff --git a/stat/distuv/gamma.go b/stat/distuv/gamma.go index 556d1b53..88d986f5 100644 --- a/stat/distuv/gamma.go +++ b/stat/distuv/gamma.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" ) diff --git a/stat/distuv/gamma_test.go b/stat/distuv/gamma_test.go index 52196f1a..41d079be 100644 --- a/stat/distuv/gamma_test.go +++ b/stat/distuv/gamma_test.go @@ -10,9 +10,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestGamma(t *testing.T) { diff --git a/stat/distuv/gumbel.go b/stat/distuv/gumbel.go index 1c25f4a1..9e620e5b 100644 --- a/stat/distuv/gumbel.go +++ b/stat/distuv/gumbel.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // GumbelRight implements the right-skewed Gumbel distribution, a two-parameter diff --git a/stat/distuv/gumbel_test.go b/stat/distuv/gumbel_test.go index dff8f97c..30f29c57 100644 --- a/stat/distuv/gumbel_test.go +++ b/stat/distuv/gumbel_test.go @@ -9,8 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestGumbelRightProbCDF(t *testing.T) { diff --git a/stat/distuv/inversegamma.go b/stat/distuv/inversegamma.go index 672ccc2a..d9eb41f7 100644 --- a/stat/distuv/inversegamma.go +++ b/stat/distuv/inversegamma.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" ) diff --git a/stat/distuv/inversegamma_test.go b/stat/distuv/inversegamma_test.go index 51a018f4..9689151a 100644 --- a/stat/distuv/inversegamma_test.go +++ b/stat/distuv/inversegamma_test.go @@ -9,9 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestInverseGamma(t *testing.T) { diff --git a/stat/distuv/laplace.go b/stat/distuv/laplace.go index 09fdc2e4..813a3adc 100644 --- a/stat/distuv/laplace.go +++ b/stat/distuv/laplace.go @@ -8,7 +8,7 @@ import ( "math" "sort" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat" ) diff --git a/stat/distuv/laplace_test.go b/stat/distuv/laplace_test.go index a4cea928..1bb12cfb 100644 --- a/stat/distuv/laplace_test.go +++ b/stat/distuv/laplace_test.go @@ -9,8 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestLaplaceProb(t *testing.T) { diff --git a/stat/distuv/lognormal.go b/stat/distuv/lognormal.go index cbfd48a2..32ea1d83 100644 --- a/stat/distuv/lognormal.go +++ b/stat/distuv/lognormal.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // LogNormal represents a random variable whose log is normally distributed. diff --git a/stat/distuv/lognormal_test.go b/stat/distuv/lognormal_test.go index fb47768d..7bb2ad34 100644 --- a/stat/distuv/lognormal_test.go +++ b/stat/distuv/lognormal_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestLognormal(t *testing.T) { @@ -37,7 +37,7 @@ func TestLognormal(t *testing.T) { checkQuantileCDFSurvival(t, i, x, dist, tol) checkProbContinuous(t, i, x, 0, math.Inf(1), dist, 1e-10) checkProbQuantContinuous(t, i, x, dist, tol) - checkMode(t, i, x, dist, 1e-2, 1e-2) + checkMode(t, i, x, dist, 1e-2, 1e-1) logProb := dist.LogProb(-0.0001) if !math.IsInf(logProb, -1) { diff --git a/stat/distuv/norm.go b/stat/distuv/norm.go index dd709582..36b0bdeb 100644 --- a/stat/distuv/norm.go +++ b/stat/distuv/norm.go @@ -7,9 +7,8 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" "gonum.org/v1/gonum/stat" ) diff --git a/stat/distuv/norm_test.go b/stat/distuv/norm_test.go index d4dd54a7..686b005f 100644 --- a/stat/distuv/norm_test.go +++ b/stat/distuv/norm_test.go @@ -9,10 +9,9 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) // TestNormalProbs tests LogProb, Prob, CumProb, and Quantile diff --git a/stat/distuv/pareto.go b/stat/distuv/pareto.go index c3f0aa1f..e1eb0555 100644 --- a/stat/distuv/pareto.go +++ b/stat/distuv/pareto.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // Pareto implements the Pareto (Type I) distribution, a one parameter distribution diff --git a/stat/distuv/pareto_test.go b/stat/distuv/pareto_test.go index 6bc8805a..90051522 100644 --- a/stat/distuv/pareto_test.go +++ b/stat/distuv/pareto_test.go @@ -9,9 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestParetoProb(t *testing.T) { @@ -161,11 +160,11 @@ func testPareto(t *testing.T, p Pareto, i int) { generateSamples(x, p) sort.Float64s(x) - checkQuantileCDFSurvival(t, i, x, p, 1e-3) + checkQuantileCDFSurvival(t, i, x, p, 3e-3) testRandLogProbContinuous(t, i, 0, x, p, tol, bins) checkMean(t, i, x, p, tol) checkVarAndStd(t, i, x, p, tol) - checkExKurtosis(t, i, x, p, 7e-2) + checkExKurtosis(t, i, x, p, 3e-1) checkProbContinuous(t, i, x, p.Xm, math.Inf(1), p, 1e-10) checkEntropy(t, i, x, p, 1e-2) checkMedian(t, i, x, p, 1e-3) diff --git a/stat/distuv/poisson.go b/stat/distuv/poisson.go index 34e9c436..599c2801 100644 --- a/stat/distuv/poisson.go +++ b/stat/distuv/poisson.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" ) diff --git a/stat/distuv/poisson_test.go b/stat/distuv/poisson_test.go index 24670222..f4e107cc 100644 --- a/stat/distuv/poisson_test.go +++ b/stat/distuv/poisson_test.go @@ -10,9 +10,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestPoissonProb(t *testing.T) { diff --git a/stat/distuv/statdist_test.go b/stat/distuv/statdist_test.go index 782b025a..d6f94008 100644 --- a/stat/distuv/statdist_test.go +++ b/stat/distuv/statdist_test.go @@ -8,10 +8,9 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestBhattacharyyaBeta(t *testing.T) { diff --git a/stat/distuv/studentst.go b/stat/distuv/studentst.go index 26d305c2..39c963ba 100644 --- a/stat/distuv/studentst.go +++ b/stat/distuv/studentst.go @@ -7,8 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mathext" ) diff --git a/stat/distuv/studentst_test.go b/stat/distuv/studentst_test.go index 78666732..2a6f9c7f 100644 --- a/stat/distuv/studentst_test.go +++ b/stat/distuv/studentst_test.go @@ -9,10 +9,9 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestStudentsTProb(t *testing.T) { diff --git a/stat/distuv/triangle.go b/stat/distuv/triangle.go index 76e1227e..cac002d0 100644 --- a/stat/distuv/triangle.go +++ b/stat/distuv/triangle.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // Triangle represents a triangle distribution (https://en.wikipedia.org/wiki/Triangular_distribution). diff --git a/stat/distuv/triangle_test.go b/stat/distuv/triangle_test.go index 6cc95b16..2d3c62eb 100644 --- a/stat/distuv/triangle_test.go +++ b/stat/distuv/triangle_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestTriangleConstraint(t *testing.T) { diff --git a/stat/distuv/uniform.go b/stat/distuv/uniform.go index 01415389..80ef56ea 100644 --- a/stat/distuv/uniform.go +++ b/stat/distuv/uniform.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // UnitUniform is an instantiation of the uniform distribution with Min = 0 diff --git a/stat/distuv/uniform_test.go b/stat/distuv/uniform_test.go index b5eed925..ece382d6 100644 --- a/stat/distuv/uniform_test.go +++ b/stat/distuv/uniform_test.go @@ -9,9 +9,8 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func TestUniformProb(t *testing.T) { diff --git a/stat/distuv/weibull.go b/stat/distuv/weibull.go index bbf49271..80adbfb6 100644 --- a/stat/distuv/weibull.go +++ b/stat/distuv/weibull.go @@ -7,7 +7,7 @@ package distuv import ( "math" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // Weibull distribution. Valid range for x is [0,+∞). diff --git a/stat/distuv/weibull_test.go b/stat/distuv/weibull_test.go index da2518ab..b89ac78b 100644 --- a/stat/distuv/weibull_test.go +++ b/stat/distuv/weibull_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) func TestHalfKStandardWeibullProb(t *testing.T) { @@ -254,7 +254,7 @@ func testWeibull(t *testing.T, dist Weibull, i int) { checkMean(t, i, x, dist, tol) checkVarAndStd(t, i, x, dist, tol) checkEntropy(t, i, x, dist, tol) - checkExKurtosis(t, i, x, dist, tol) + checkExKurtosis(t, i, x, dist, 3e-2) checkSkewness(t, i, x, dist, tol) checkMedian(t, i, x, dist, tol) checkQuantileCDFSurvival(t, i, x, dist, tol) diff --git a/stat/moments_bench_test.go b/stat/moments_bench_test.go index 8ccea8e0..22ea1167 100644 --- a/stat/moments_bench_test.go +++ b/stat/moments_bench_test.go @@ -14,7 +14,7 @@ package stat import ( "testing" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) const ( diff --git a/stat/samplemv/halton.go b/stat/samplemv/halton.go index 6acb7f1a..bb5bd6d1 100644 --- a/stat/samplemv/halton.go +++ b/stat/samplemv/halton.go @@ -7,8 +7,7 @@ package samplemv import ( "fmt" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/distmv" ) diff --git a/stat/samplemv/halton_test.go b/stat/samplemv/halton_test.go index b2381950..0ae0da43 100644 --- a/stat/samplemv/halton_test.go +++ b/stat/samplemv/halton_test.go @@ -8,8 +8,7 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/distmv" ) diff --git a/stat/samplemv/metropolishastings.go b/stat/samplemv/metropolishastings.go index e784fc93..a98e895e 100644 --- a/stat/samplemv/metropolishastings.go +++ b/stat/samplemv/metropolishastings.go @@ -7,8 +7,7 @@ package samplemv import ( "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/distmv" ) diff --git a/stat/samplemv/sample_test.go b/stat/samplemv/sample_test.go index eaf168f1..93dc1ca7 100644 --- a/stat/samplemv/sample_test.go +++ b/stat/samplemv/sample_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/spatial/r1" "gonum.org/v1/gonum/stat" diff --git a/stat/samplemv/samplemv.go b/stat/samplemv/samplemv.go index e2076282..8073703f 100644 --- a/stat/samplemv/samplemv.go +++ b/stat/samplemv/samplemv.go @@ -8,8 +8,7 @@ import ( "errors" "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/distmv" ) diff --git a/stat/sampleuv/sample.go b/stat/sampleuv/sample.go index 38ee3a8e..a2899bed 100644 --- a/stat/sampleuv/sample.go +++ b/stat/sampleuv/sample.go @@ -8,8 +8,7 @@ import ( "errors" "math" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat/distuv" ) diff --git a/stat/sampleuv/weighted.go b/stat/sampleuv/weighted.go index 9cf04dc0..3f4d8961 100644 --- a/stat/sampleuv/weighted.go +++ b/stat/sampleuv/weighted.go @@ -4,7 +4,7 @@ package sampleuv -import "golang.org/x/exp/rand" +import "gonum.org/v1/gonum/internal/rand" // Weighted provides sampling without replacement from a collection of items with // non-uniform probability. diff --git a/stat/sampleuv/weighted_test.go b/stat/sampleuv/weighted_test.go index a3d98a12..2c3abf23 100644 --- a/stat/sampleuv/weighted_test.go +++ b/stat/sampleuv/weighted_test.go @@ -10,9 +10,8 @@ import ( "testing" "time" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) var prob = flag.Bool("prob", false, "enables probabilistic testing of the random weighted sampler") @@ -25,7 +24,7 @@ var ( } exp = newExp() - obt = []float64{1020, 1909, 3937, 7881, 15687, 31486, 62310, 124632, 250453, 500685} + obt = []float64{980, 1945, 3929, 7835, 15473, 31322, 62602, 124937, 250815, 500162} ) func newTestWeighted() Weighted { diff --git a/stat/sampleuv/withoutreplacement.go b/stat/sampleuv/withoutreplacement.go index ec70da3b..9bd771f2 100644 --- a/stat/sampleuv/withoutreplacement.go +++ b/stat/sampleuv/withoutreplacement.go @@ -7,7 +7,7 @@ package sampleuv import ( "sort" - "golang.org/x/exp/rand" + "gonum.org/v1/gonum/internal/rand" ) // WithoutReplacement samples len(idxs) integers from [0, n) without replacement. diff --git a/stat/sampleuv/withoutreplacement_test.go b/stat/sampleuv/withoutreplacement_test.go index 7142f105..84941999 100644 --- a/stat/sampleuv/withoutreplacement_test.go +++ b/stat/sampleuv/withoutreplacement_test.go @@ -7,9 +7,8 @@ package sampleuv import ( "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" ) func TestWithoutReplacement(t *testing.T) { @@ -28,7 +27,7 @@ func TestWithoutReplacement(t *testing.T) { { // Test without perm and with source. N: 10, K: 3, Src: rand.New(rand.NewSource(1)), - Trials: 100000, Tol: 1e-3, + Trials: 100000, Tol: 1.4e-3, }, } { dist := make([]float64, test.N) diff --git a/stat/spatial/spatial_test.go b/stat/spatial/spatial_test.go index 13289323..ef81630f 100644 --- a/stat/spatial/spatial_test.go +++ b/stat/spatial/spatial_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" ) @@ -72,8 +71,8 @@ var spatialTests = []struct { }, locality: simpleAdjacency, - wantMoranI: -0.04387221370785312, - wantZ: -1.3543515772206267, + wantMoranI: 0.008189938751264034, + wantZ: 0.2903525107058353, wantSegs: 0, }, { @@ -98,8 +97,8 @@ var spatialTests = []struct { }, locality: simpleAdjacency, - wantMoranI: 0.0259414094549987, - wantZ: 0.8511426395944303, + wantMoranI: 0.03230842429979648, + wantZ: 1.052284249349285, wantSegs: 0, }, { @@ -112,8 +111,8 @@ var spatialTests = []struct { }, locality: simpleAdjacency, - wantMoranI: -0.0003533345592575677, - wantZ: 0.0204605353504713, + wantMoranI: -0.020274625925858967, + wantZ: -0.6088762077902174, wantSegs: 0, }, { @@ -126,8 +125,8 @@ var spatialTests = []struct { }, locality: simpleAdjacency, - wantMoranI: -0.8587138204405251, - wantZ: -27.09614459007475, + wantMoranI: -0.8587390485358907, + wantZ: -27.096941353241128, wantSegs: 0, }, { @@ -150,8 +149,8 @@ var spatialTests = []struct { }, locality: simpleAdjacencyBand, - wantMoranI: -0.04387221370785312, - wantZ: -1.3543515772206267, + wantMoranI: 0.008189938751264034, + wantZ: 0.2903525107058353, wantSegs: 0, }, { @@ -176,8 +175,8 @@ var spatialTests = []struct { }, locality: simpleAdjacencyBand, - wantMoranI: 0.0259414094549987, - wantZ: 0.8511426395944303, + wantMoranI: 0.03230842429979648, + wantZ: 1.052284249349285, wantSegs: 0, }, { @@ -190,8 +189,8 @@ var spatialTests = []struct { }, locality: simpleAdjacencyBand, - wantMoranI: -0.0003533345592575677, - wantZ: 0.0204605353504713, + wantMoranI: -0.020274625925858967, + wantZ: -0.6088762077902174, wantSegs: 0, }, { @@ -204,8 +203,8 @@ var spatialTests = []struct { }, locality: simpleAdjacencyBand, - wantMoranI: -0.8587138204405251, - wantZ: -27.09614459007475, + wantMoranI: -0.8587390485358907, + wantZ: -27.096941353241128, wantSegs: 0, }, { diff --git a/stat/stat_example_test.go b/stat/stat_example_test.go index f1f7241a..cde522c2 100644 --- a/stat/stat_example_test.go +++ b/stat/stat_example_test.go @@ -7,8 +7,7 @@ package stat_test import ( "fmt" - "golang.org/x/exp/rand" - + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/stat" ) @@ -39,7 +38,7 @@ func ExampleLinearRegression() { fmt.Printf("R^2: %.6f\n", r2) // Output: - // Estimated offset is: 0.988572 - // Estimated slope is: 3.000154 + // Estimated offset is: 0.999675 + // Estimated slope is: 2.999971 // R^2: 0.999999 } diff --git a/stat/stat_test.go b/stat/stat_test.go index 0a0cbf67..2cc14e35 100644 --- a/stat/stat_test.go +++ b/stat/stat_test.go @@ -11,10 +11,9 @@ import ( "strconv" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats/scalar" + "gonum.org/v1/gonum/internal/rand" ) func ExampleCircularMean() { diff --git a/stat/statmat_test.go b/stat/statmat_test.go index e70ed6f2..d5ad81e9 100644 --- a/stat/statmat_test.go +++ b/stat/statmat_test.go @@ -8,9 +8,8 @@ import ( "math" "testing" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/floats" + "gonum.org/v1/gonum/internal/rand" "gonum.org/v1/gonum/mat" )