Skip to content

Commit e0b3d92

Browse files
authored
MAINT: linalg.interpolative: normalize rng argument with default_rng (SPEC7) (scipy#21893)
* MAINT: linalg.interpolative: normalize rng argument with default_rng (SPEC7)
1 parent 10e272d commit e0b3d92

File tree

2 files changed

+71
-82
lines changed

2 files changed

+71
-82
lines changed

scipy/linalg/_decomp_interpolative.pyx

Lines changed: 36 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,14 @@ __all__ = ['idd_estrank', 'idd_ldiv', 'idd_poweroftwo', 'idd_reconid', 'iddp_aid
132132
]
133133

134134

135-
def idd_diffsnorm(A: LinearOperator, B: LinearOperator, int its=20, rng=None):
135+
def idd_diffsnorm(A: LinearOperator, B: LinearOperator, *, rng, int its=20):
136136
cdef int n = A.shape[1], j = 0, intone = 1
137137
cdef cnp.float64_t snorm = 0.0
138138
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=1] v1
139139
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=1] v2
140140
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=1] u1
141141
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=1] u2
142142

143-
if not rng:
144-
rng = np.random.default_rng()
145143
v1 = rng.uniform(low=-1., high=1., size=n)
146144
v1 /= dnrm2(&n, &v1[0], &intone)
147145

@@ -162,8 +160,8 @@ def idd_diffsnorm(A: LinearOperator, B: LinearOperator, int its=20, rng=None):
162160
return snorm
163161

164162

165-
def idd_estrank(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, eps: float,
166-
rng=None):
163+
def idd_estrank(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, eps: float, *,
164+
rng):
167165
cdef int m = a.shape[0], n = a.shape[1]
168166
cdef int intone = 1, n2, nsteps = 3, row, r, nstep, cols, k, nulls
169167
cdef cnp.float64_t h, alpha, beta
@@ -178,9 +176,6 @@ def idd_estrank(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, eps: fl
178176
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] Fc
179177
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=2] F
180178

181-
if not rng:
182-
rng = np.random.default_rng()
183-
184179
n2 = idd_poweroftwo(m)
185180

186181
# This part is the initialization that is done via idd_frmi
@@ -281,7 +276,7 @@ def idd_estrank(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, eps: fl
281276
return k, Fcopy
282277

283278

284-
def idd_findrank(A: LinearOperator, cnp.float64_t eps, rng=None):
279+
def idd_findrank(A: LinearOperator, cnp.float64_t eps, *, rng):
285280
# Estimate the rank of A by repeatedly using A.rmatvec(random vec)
286281

287282
cdef int m = A.shape[0], n = A.shape[1], k = 0, kk = 0,r = n, krank
@@ -312,9 +307,6 @@ def idd_findrank(A: LinearOperator, cnp.float64_t eps, rng=None):
312307
"'scipy.linalg.interpolative.idd_findrank()' "
313308
"function.")
314309

315-
if not rng:
316-
rng = np.random.default_rng()
317-
318310
krank = 0
319311
try:
320312
while True:
@@ -464,15 +456,13 @@ def idd_reconid(B, idx, proj):
464456
return approx
465457

466458

467-
def idd_snorm(A: LinearOperator, int its=20, rng=None):
459+
def idd_snorm(A: LinearOperator, *, rng, int its=20):
468460
cdef int n = A.shape[1]
469461
cdef int j = 0, intone = 1
470462
cdef cnp.float64_t snorm = 0.0
471463
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=1] v
472464
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=1] u
473465

474-
if not rng:
475-
rng = np.random.default_rng()
476466
v = rng.uniform(low=-1., high=1., size=n)
477467
v /= dnrm2(&n, &v[0], &intone)
478468

@@ -488,7 +478,7 @@ def idd_snorm(A: LinearOperator, int its=20, rng=None):
488478
return snorm
489479

490480

491-
def iddp_aid(cnp.ndarray[cnp.float64_t, ndim=2] a: NDArray, eps: float, rng=None):
481+
def iddp_aid(cnp.ndarray[cnp.float64_t, ndim=2] a: NDArray, eps: float, *, rng):
492482
krank, proj = idd_estrank(a, eps, rng=rng)
493483
if krank != 0:
494484
proj = proj[:krank, :]
@@ -497,7 +487,7 @@ def iddp_aid(cnp.ndarray[cnp.float64_t, ndim=2] a: NDArray, eps: float, rng=None
497487
return iddp_id(a, eps=eps)
498488

499489

500-
def iddp_asvd(cnp.ndarray[cnp.float64_t, ndim=2] a: NDArray, eps: float, rng=None):
490+
def iddp_asvd(cnp.ndarray[cnp.float64_t, ndim=2] a: NDArray, eps: float, *, rng):
501491
cdef int m = a.shape[0], n = a.shape[1]
502492
cdef int krank, info, ci
503493
cdef cnp.ndarray[cnp.float64_t, mode='fortran', ndim=2] C
@@ -680,20 +670,20 @@ def iddp_qrpiv(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a, cnp.float64_t eps
680670
return k + 1, taus, ind
681671

682672

683-
def iddp_rid(A: LinearOperator, cnp.float64_t eps, rng=None):
684-
_, ret = idd_findrank(A, eps, rng)
673+
def iddp_rid(A: LinearOperator, cnp.float64_t eps, *, rng):
674+
_, ret = idd_findrank(A, eps, rng=rng)
685675
return iddp_id(ret, eps)
686676

687677

688-
def iddp_rsvd(A: LinearOperator, cnp.float64_t eps, rng=None):
678+
def iddp_rsvd(A: LinearOperator, cnp.float64_t eps, *, rng):
689679
cdef int n = A.shape[1]
690680
cdef int krank, j
691681
cdef cnp.ndarray[cnp.int64_t, mode='c', ndim=1] perms
692682
cdef cnp.ndarray[cnp.float64_t, ndim=2] proj
693683
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=2] col
694684
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=1] x
695685

696-
krank, perms, proj = iddp_rid(A, eps, rng)
686+
krank, perms, proj = iddp_rid(A, eps, rng=rng)
697687
if krank > 0:
698688
# idd_getcols
699689
col = cnp.PyArray_EMPTY(2, [n, krank], cnp.NPY_FLOAT64, 0)
@@ -743,8 +733,8 @@ def iddp_svd(cnp.ndarray[cnp.float64_t, ndim=2] a: NDArray, eps: float):
743733
return UU, S, V
744734

745735

746-
def iddr_aid(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, int krank,
747-
rng=None):
736+
def iddr_aid(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, int krank, *,
737+
rng):
748738
cdef int m = a.shape[0], n = a.shape[1], n2, nsteps = 3, row, r, nstep, L
749739
cdef cnp.float64_t h, alpha, beta
750740
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=3] albetas
@@ -754,9 +744,6 @@ def iddr_aid(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, int krank,
754744
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=2] rta
755745
cdef cnp.ndarray[cnp.npy_int64, mode='c', ndim=1] marker
756746

757-
if not rng:
758-
rng = np.random.default_rng()
759-
760747
# idd_aidi
761748
L = krank + 8
762749
n2 = 0
@@ -898,8 +885,8 @@ def iddr_aid(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, int krank,
898885
return perms, proj
899886

900887

901-
def iddr_asvd(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, int krank,
902-
rng=None):
888+
def iddr_asvd(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, int krank, *,
889+
rng):
903890
cdef int m = a.shape[0], n = a.shape[1]
904891
cdef int info, ci
905892
cdef cnp.ndarray[cnp.float64_t, mode='fortran', ndim=2] C
@@ -1057,28 +1044,25 @@ def iddr_qrpiv(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, krank: i
10571044
return ind, taus
10581045

10591046

1060-
def iddr_rid(A: LinearOperator, int krank, rng=None):
1047+
def iddr_rid(A: LinearOperator, int krank, *, rng):
10611048
cdef int m = A.shape[0], n = A.shape[1], k = 0
10621049
cdef int L = min(krank+2, min(m, n))
10631050
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=2] r
10641051

1065-
if not rng:
1066-
rng = np.random.default_rng()
1067-
10681052
r = cnp.PyArray_EMPTY(2, [L, n], cnp.NPY_FLOAT64, 0)
10691053
for k in range(L):
10701054
r[k, :] = A.rmatvec(rng.uniform(size=m))
10711055

10721056
return iddr_id(a=r, krank=krank)
10731057

10741058

1075-
def iddr_rsvd(A: LinearOperator, int krank, rng=None):
1059+
def iddr_rsvd(A: LinearOperator, int krank, *, rng):
10761060
cdef int n = A.shape[1], j
10771061
cdef cnp.ndarray[cnp.int64_t, mode='c', ndim=1] perms
10781062
cdef cnp.ndarray[cnp.float64_t, ndim=2] proj
10791063
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=2] col
10801064

1081-
perms, proj = iddr_rid(A, krank, rng)
1065+
perms, proj = iddr_rid(A, krank, rng=rng)
10821066
# idd_getcols
10831067
col = cnp.PyArray_EMPTY(2, [n, krank], cnp.NPY_FLOAT64, 0)
10841068
x = cnp.PyArray_ZEROS(1, [n], cnp.NPY_FLOAT64, 0)
@@ -1121,16 +1105,14 @@ def iddr_svd(cnp.ndarray[cnp.float64_t, mode="c", ndim=2] a: NDArray, int krank)
11211105
return UU, S, V
11221106

11231107

1124-
def idz_diffsnorm(A: LinearOperator, B: LinearOperator, int its=20, rng=None):
1108+
def idz_diffsnorm(A: LinearOperator, B: LinearOperator, *, rng, int its=20):
11251109
cdef int n = A.shape[1], j = 0, intone = 1
11261110
cdef cnp.float64_t snorm = 0.0
11271111
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=1] v1
11281112
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=1] v2
11291113
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=1] u1
11301114
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=1] u2
11311115

1132-
if not rng:
1133-
rng = np.random.default_rng()
11341116
v1 = rng.uniform(low=-1, high=1, size=(n, 2)).view(np.complex128).ravel()
11351117
v1 /= dznrm2(&n, &v1[0], &intone)
11361118

@@ -1151,8 +1133,8 @@ def idz_diffsnorm(A: LinearOperator, B: LinearOperator, int its=20, rng=None):
11511133
return snorm
11521134

11531135

1154-
def idz_estrank(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, eps: float,
1155-
rng=None):
1136+
def idz_estrank(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, eps: float, *,
1137+
rng):
11561138
cdef int m = a.shape[0], n = a.shape[1], n2, nsteps = 3, row, r, nstep, cols, k
11571139
cdef cnp.float64_t h, alpha, beta
11581140
cdef cnp.ndarray[cnp.float64_t, mode='c', ndim=3] albetas
@@ -1163,9 +1145,6 @@ def idz_estrank(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, eps:
11631145
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] rta
11641146
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] F
11651147

1166-
if not rng:
1167-
rng = np.random.default_rng()
1168-
11691148
n2 = idd_poweroftwo(m)
11701149
# This part is the initialization that is done via idz_frmi
11711150
# for a Subsampled Randomized Fourier Transform (SRFT).
@@ -1244,7 +1223,7 @@ def idz_estrank(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, eps:
12441223
return k, Fcopy
12451224

12461225

1247-
def idz_findrank(A: LinearOperator, cnp.float64_t eps, rng=None):
1226+
def idz_findrank(A: LinearOperator, cnp.float64_t eps, *, rng):
12481227
# Estimate the rank of A by repeatedly using A.rmatvec(random vec)
12491228

12501229
cdef int m = A.shape[0], n = A.shape[1], k = 0, kk = 0,r = n, krank
@@ -1277,9 +1256,6 @@ def idz_findrank(A: LinearOperator, cnp.float64_t eps, rng=None):
12771256
"'scipy.linalg.interpolative.idz_findrank()' "
12781257
"function.")
12791258

1280-
if not rng:
1281-
rng = np.random.default_rng()
1282-
12831259
krank = 0
12841260
try:
12851261
while True:
@@ -1416,16 +1392,13 @@ def idz_reconid(B, idx, proj):
14161392
return approx
14171393

14181394

1419-
def idz_snorm(A: LinearOperator, int its=20, rng=None):
1395+
def idz_snorm(A: LinearOperator, *, rng, int its=20):
14201396
cdef int n = A.shape[1]
14211397
cdef int j = 0, intone = 1
14221398
cdef cnp.float64_t snorm = 0.0
14231399
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=1] v
14241400
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=1] u
14251401

1426-
if not rng:
1427-
rng = np.random.default_rng()
1428-
14291402
v = rng.uniform(low=-1, high=1, size=(n, 2)).view(np.complex128).ravel()
14301403
v /= dznrm2(&n, &v[0], &intone)
14311404

@@ -1441,8 +1414,8 @@ def idz_snorm(A: LinearOperator, int its=20, rng=None):
14411414
return snorm
14421415

14431416

1444-
def idzp_aid(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, eps: float,
1445-
rng=None):
1417+
def idzp_aid(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, eps: float, *,
1418+
rng):
14461419
krank, proj = idz_estrank(a, eps=eps, rng=rng)
14471420
if krank != 0:
14481421
proj = proj[:krank, :]
@@ -1451,8 +1424,8 @@ def idzp_aid(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, eps: fl
14511424
return idzp_id(a, eps=eps)
14521425

14531426

1454-
def idzp_asvd(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a, cnp.float64_t eps,
1455-
rng=None):
1427+
def idzp_asvd(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a, cnp.float64_t eps, *,
1428+
rng):
14561429
cdef int m = a.shape[0], n = a.shape[1]
14571430
cdef int krank, info, ci
14581431
cdef cnp.ndarray[cnp.complex128_t, mode='fortran', ndim=2] C
@@ -1469,7 +1442,7 @@ def idzp_asvd(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a, cnp.float64_t e
14691442
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] p
14701443
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] col
14711444

1472-
krank, perms, proj = idzp_aid(a.copy(), eps, rng)
1445+
krank, perms, proj = idzp_aid(a.copy(), eps, rng=rng)
14731446

14741447
if krank > 0:
14751448
UU = cnp.PyArray_ZEROS(2, [m, krank], cnp.NPY_COMPLEX128, 0)
@@ -1619,12 +1592,12 @@ def idzp_qrpiv(cnp.ndarray[cnp.complex128_t, mode="c", ndim=2] a, cnp.float64_t
16191592
return k+1, taus, ind
16201593

16211594

1622-
def idzp_rid(A: LinearOperator, cnp.float64_t eps, rng=None):
1595+
def idzp_rid(A: LinearOperator, cnp.float64_t eps, *, rng):
16231596
_, ret = idz_findrank(A, eps, rng=rng)
16241597
return idzp_id(ret, eps=eps)
16251598

16261599

1627-
def idzp_rsvd(A: LinearOperator, cnp.float64_t eps, rng=None):
1600+
def idzp_rsvd(A: LinearOperator, cnp.float64_t eps, *, rng):
16281601
cdef int n = A.shape[1]
16291602
cdef int krank, j
16301603
cdef cnp.ndarray[cnp.int64_t, mode='c', ndim=1] perms
@@ -1681,8 +1654,8 @@ def idzp_svd(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a, cnp.float64_t ep
16811654
return UU, S, V
16821655

16831656

1684-
def idzr_aid(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, int krank,
1685-
rng=None):
1657+
def idzr_aid(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, int krank, *,
1658+
rng):
16861659
cdef int m = a.shape[0], n2, L, nblock, nsteps = 3, mb
16871660
cdef cnp.float64_t twopi = 2*np.pi, fact
16881661
cdef double complex twopii = twopi*1.j
@@ -1694,9 +1667,6 @@ def idzr_aid(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, int kra
16941667
cdef cnp.ndarray[cnp.npy_float64, mode='c', ndim=2] rta
16951668
cdef cnp.ndarray[cnp.npy_float64, mode='c', ndim=2] giv2x2
16961669

1697-
if not rng:
1698-
rng = np.random.default_rng()
1699-
17001670
n2 = 0
17011671
L = krank + 8
17021672
if (L >= n2) or (L > m):
@@ -1771,7 +1741,7 @@ def idzr_aid(cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] a: NDArray, int kra
17711741
return idzr_id(V, krank)
17721742

17731743

1774-
def idzr_asvd(cnp.ndarray[cnp.complex128_t, mode="c", ndim=2] a, int krank, rng=None):
1744+
def idzr_asvd(cnp.ndarray[cnp.complex128_t, mode="c", ndim=2] a, int krank, *, rng):
17751745
cdef int m = a.shape[0], n = a.shape[1]
17761746
cdef int info, ci
17771747
cdef cnp.ndarray[cnp.complex128_t, mode='fortran', ndim=2] C
@@ -1928,28 +1898,25 @@ def idzr_qrpiv(cnp.ndarray[cnp.complex128_t, mode="c", ndim=2] a, int krank):
19281898
return ind, taus
19291899

19301900

1931-
def idzr_rid(A: LinearOperator, int krank, rng=None):
1901+
def idzr_rid(A: LinearOperator, int krank, *, rng):
19321902
cdef int m = A.shape[0], n = A.shape[1], k = 0
19331903
cdef int L = min(krank+2, min(m, n))
19341904
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] r
19351905

1936-
if not rng:
1937-
rng = np.random.default_rng()
1938-
19391906
r = cnp.PyArray_EMPTY(2, [L, n], cnp.NPY_COMPLEX128, 0)
19401907
for k in range(L):
19411908
r[k, :] = A.rmatvec(rng.uniform(size=(m,2)).view(np.complex128).ravel())
19421909

19431910
return idzr_id(a=r.conj(), krank=krank)
19441911

19451912

1946-
def idzr_rsvd(A: LinearOperator, int krank, rng=None):
1913+
def idzr_rsvd(A: LinearOperator, int krank, *, rng):
19471914
cdef int n = A.shape[1], j
19481915
cdef cnp.ndarray[cnp.int64_t, mode='c', ndim=1] perms
19491916
cdef cnp.ndarray[cnp.complex128_t, ndim=2] proj
19501917
cdef cnp.ndarray[cnp.complex128_t, mode='c', ndim=2] col
19511918

1952-
perms, proj = idzr_rid(A, krank, rng)
1919+
perms, proj = idzr_rid(A, krank, rng=rng)
19531920
# idd_getcols
19541921
col = cnp.PyArray_EMPTY(2, [n, krank], cnp.NPY_COMPLEX128, 0)
19551922
x = cnp.PyArray_ZEROS(1, [n], cnp.NPY_COMPLEX128, 0)

0 commit comments

Comments
 (0)