Skip to content

Commit c9731bd

Browse files
committed
view(...) -> @views in LOBPCG
1 parent d7a3915 commit c9731bd

File tree

1 file changed

+86
-84
lines changed

1 file changed

+86
-84
lines changed

src/lobpcg.jl

Lines changed: 86 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,15 @@ function A_mul_X!(b::Blocks, A)
126126
return
127127
end
128128
function A_mul_X!(b::Blocks, A, n)
129-
mul!(view(b.A_block, :, 1:n), A, view(b.block, :, 1:n))
129+
@views mul!(b.A_block[:, 1:n], A, b.block[:, 1:n])
130130
return
131131
end
132132
function B_mul_X!(b::Blocks{true}, B)
133133
mul!(b.B_block, B, b.block)
134134
return
135135
end
136136
function B_mul_X!(b::Blocks{true}, B, n)
137-
mul!(view(b.B_block, :, 1:n), B, view(b.block, :, 1:n))
137+
@views mul!(b.B_block[:, 1:n], B, b.block[:, 1:n])
138138
return
139139
end
140140
function B_mul_X!(b::Blocks{false}, B, n = 0)
@@ -210,12 +210,12 @@ function (constr!::Constraint{Nothing})(X, X_temp)
210210
end
211211

212212
function (constr!::Constraint)(X, X_temp)
213-
if size(constr!.Y, 2) > 0
213+
@views if size(constr!.Y, 2) > 0
214214
sizeX = size(X, 2)
215215
sizeY = size(constr!.Y, 2)
216-
gramYBV_view = view(constr!.gramYBV, 1:sizeY, 1:sizeX)
216+
gramYBV_view = constr!.gramYBV[1:sizeY, 1:sizeX]
217217
mul!(gramYBV_view, adjoint(constr!.BY), X)
218-
tmp_view = view(constr!.tmp, 1:sizeY, 1:sizeX)
218+
tmp_view = constr!.tmp[1:sizeY, 1:sizeX]
219219
ldiv!(tmp_view, constr!.gram_chol, gramYBV_view)
220220
mul!(X_temp, constr!.Y, tmp_view)
221221
@inbounds X .= X .- X_temp
@@ -235,9 +235,9 @@ function (precond!::RPreconditioner{Nothing})(X)
235235
end
236236
function (precond!::RPreconditioner)(X)
237237
bs = size(X, 2)
238-
ldiv!(view(precond!.buffer, :, 1:bs), precond!.M, X)
238+
@views ldiv!(precond!.buffer[:, 1:bs], precond!.M, X)
239239
# Just returning buffer would be cheaper but struct at call site must be mutable
240-
@inbounds X .= @view precond!.buffer[:, 1:bs]
240+
@inbounds @views X .= precond!.buffer[:, 1:bs]
241241
nothing
242242
end
243243

@@ -260,17 +260,17 @@ function BlockGram(XBlocks::Blocks{Generalized, T}) where {Generalized, T}
260260
return BlockGram{Generalized, Matrix{T}}(XAX, XAR, XAP, RAR, RAP, PAP)
261261
end
262262
XAX!(BlockGram, XBlocks) = mul!(BlockGram.XAX, adjoint(XBlocks.block), XBlocks.A_block)
263-
XAP!(BlockGram, XBlocks, PBlocks, n) = mul!(view(BlockGram.XAP, :, 1:n), adjoint(XBlocks.block), view(PBlocks.A_block, :, 1:n))
264-
XAR!(BlockGram, XBlocks, RBlocks, n) = mul!(view(BlockGram.XAR, :, 1:n), adjoint(XBlocks.block), view(RBlocks.A_block, :, 1:n))
265-
RAR!(BlockGram, RBlocks, n) = mul!(view(BlockGram.RAR, 1:n, 1:n), adjoint(view(RBlocks.block, :, 1:n)), view(RBlocks.A_block, :, 1:n))
266-
RAP!(BlockGram, RBlocks, PBlocks, n) = mul!(view(BlockGram.RAP, 1:n, 1:n), adjoint(view(RBlocks.A_block, :, 1:n)), view(PBlocks.block, :, 1:n))
267-
PAP!(BlockGram, PBlocks, n) = mul!(view(BlockGram.PAP, 1:n, 1:n), adjoint(view(PBlocks.block, :, 1:n)), view(PBlocks.A_block, :, 1:n))
268-
XBP!(BlockGram, XBlocks, PBlocks, n) = mul!(view(BlockGram.XAP, :, 1:n), adjoint(XBlocks.block), view(PBlocks.B_block, :, 1:n))
269-
XBR!(BlockGram, XBlocks, RBlocks, n) = mul!(view(BlockGram.XAR, :, 1:n), adjoint(XBlocks.block), view(RBlocks.B_block, :, 1:n))
270-
RBP!(BlockGram, RBlocks, PBlocks, n) = mul!(view(BlockGram.RAP, 1:n, 1:n), adjoint(view(RBlocks.B_block, :, 1:n)), view(PBlocks.block, :, 1:n))
263+
XAP!(BlockGram, XBlocks, PBlocks, n) = @views mul!(BlockGram.XAP[:, 1:n], adjoint(XBlocks.block), PBlocks.A_block[:, 1:n])
264+
XAR!(BlockGram, XBlocks, RBlocks, n) = @views mul!(BlockGram.XAR[:, 1:n], adjoint(XBlocks.block), RBlocks.A_block[:, 1:n])
265+
RAR!(BlockGram, RBlocks, n) = @views mul!(BlockGram.RAR[1:n, 1:n], adjoint(RBlocks.block[:, 1:n]), RBlocks.A_block[:, 1:n])
266+
RAP!(BlockGram, RBlocks, PBlocks, n) = @views mul!(BlockGram.RAP[1:n, 1:n], adjoint(RBlocks.A_block[:, 1:n]), PBlocks.block[:, 1:n])
267+
PAP!(BlockGram, PBlocks, n) = @views mul!(BlockGram.PAP[1:n, 1:n], adjoint(PBlocks.block[:, 1:n]), PBlocks.A_block[:, 1:n])
268+
XBP!(BlockGram, XBlocks, PBlocks, n) = @views mul!(BlockGram.XAP[:, 1:n], adjoint(XBlocks.block), PBlocks.B_block[:, 1:n])
269+
XBR!(BlockGram, XBlocks, RBlocks, n) = @views mul!(BlockGram.XAR[:, 1:n], adjoint(XBlocks.block), RBlocks.B_block[:, 1:n])
270+
RBP!(BlockGram, RBlocks, PBlocks, n) = @views mul!(BlockGram.RAP[1:n, 1:n], adjoint(RBlocks.B_block[:, 1:n]), PBlocks.block[:, 1:n])
271271
#XBX!(BlockGram, XBlocks) = mul!(BlockGram.XAX, adjoint(XBlocks.block), XBlocks.B_block)
272-
#RBR!(BlockGram, RBlocks, n) = mul!(view(BlockGram.RAR, 1:n, 1:n), adjoint(view(RBlocks.block, :, 1:n)), view(RBlocks.B_block, :, 1:n))
273-
#PBP!(BlockGram, PBlocks, n) = mul!(view(BlockGram.PAP, 1:n, 1:n), adjoint(view(PBlocks.block, :, 1:n)), view(PBlocks.B_block, :, 1:n))
272+
#RBR!(BlockGram, RBlocks, n) = @views mul!(BlockGram.RAR[1:n, 1:n], adjoint(RBlocks.block[:, 1:n]), RBlocks.B_block[:, 1:n])
273+
#PBP!(BlockGram, PBlocks, n) = @views mul!(BlockGram.PAP[1:n, 1:n], adjoint(PBlocks.block[:, 1:n]), PBlocks.B_block[:, 1:n])
274274

275275
function I!(G, xr)
276276
@inbounds for j in xr, i in xr
@@ -283,22 +283,22 @@ function (g::BlockGram)(gram, lambda, n1::Int, n2::Int, n3::Int)
283283
xr = 1:n1
284284
rr = n1+1:n1+n2
285285
pr = n1+n2+1:n1+n2+n3
286-
@inbounds begin
286+
@inbounds @views begin
287287
if n1 > 0
288-
#gram[xr, xr] .= view(g.XAX, 1:n1, 1:n1)
289-
gram[xr, xr] .= Diagonal(view(lambda, 1:n1))
288+
#gram[xr, xr] .= g.XAX[1:n1, 1:n1]
289+
gram[xr, xr] .= Diagonal(lambda[1:n1])
290290
end
291291
if n2 > 0
292-
gram[rr, rr] .= view(g.RAR, 1:n2, 1:n2)
293-
gram[xr, rr] .= view(g.XAR, 1:n1, 1:n2)
294-
conj!(transpose!(view(gram, rr, xr), view(g.XAR, 1:n1, 1:n2)))
292+
gram[rr, rr] .= g.RAR[1:n2, 1:n2]
293+
gram[xr, rr] .= g.XAR[1:n1, 1:n2]
294+
conj!(transpose!(gram[rr, xr], g.XAR[1:n1, 1:n2]))
295295
end
296296
if n3 > 0
297-
gram[pr, pr] .= view(g.PAP, 1:n3, 1:n3)
298-
gram[rr, pr] .= view(g.RAP, 1:n2, 1:n3)
299-
gram[xr, pr] .= view(g.XAP, 1:n1, 1:n3)
300-
conj!(transpose!(view(gram, pr, rr), view(g.RAP, 1:n2, 1:n3)))
301-
conj!(transpose!(view(gram, pr, xr), view(g.XAP, 1:n1, 1:n3)))
297+
gram[pr, pr] .= g.PAP[1:n3, 1:n3]
298+
gram[rr, pr] .= g.RAP[1:n2, 1:n3]
299+
gram[xr, pr] .= g.XAP[1:n1, 1:n3]
300+
conj!(transpose!(gram[pr, rr], g.RAP[1:n2, 1:n3]))
301+
conj!(transpose!(gram[pr, xr], g.XAP[1:n1, 1:n3]))
302302
end
303303
end
304304
return
@@ -307,32 +307,32 @@ function (g::BlockGram)(gram, n1::Int, n2::Int, n3::Int, normalized::Bool=true)
307307
xr = 1:n1
308308
rr = n1+1:n1+n2
309309
pr = n1+n2+1:n1+n2+n3
310-
if n1 > 0
310+
@views if n1 > 0
311311
if normalized
312312
I!(gram, xr)
313313
#else
314-
# @inbounds gram[xr, xr] .= view(g.XAX, 1:n1, 1:n1)
314+
# @inbounds gram[xr, xr] .= g.XAX[1:n1, 1:n1]
315315
end
316316
end
317-
if n2 > 0
317+
@views if n2 > 0
318318
if normalized
319319
I!(gram, rr)
320320
#else
321-
# @inbounds gram[rr, rr] .= view(g.RAR, 1:n2, 1:n2)
321+
# @inbounds gram[rr, rr] .= g.RAR[1:n2, 1:n2]
322322
end
323-
@inbounds gram[xr, rr] .= view(g.XAR, 1:n1, 1:n2)
324-
@inbounds conj!(transpose!(view(gram, rr, xr), view(g.XAR, 1:n1, 1:n2)))
323+
@inbounds gram[xr, rr] .= g.XAR[1:n1, 1:n2]
324+
@inbounds conj!(transpose!(gram[rr, xr], g.XAR[1:n1, 1:n2]))
325325
end
326-
if n3 > 0
326+
@views if n3 > 0
327327
if normalized
328328
I!(gram, pr)
329329
#else
330-
# @inbounds gram[pr, pr] .= view(g.PAP, 1:n3, 1:n3)
330+
# @inbounds gram[pr, pr] .= g.PAP[1:n3, 1:n3]
331331
end
332-
@inbounds gram[rr, pr] .= view(g.RAP, 1:n2, 1:n3)
333-
@inbounds gram[xr, pr] .= view(g.XAP, 1:n1, 1:n3)
334-
@inbounds conj!(transpose!(view(gram, pr, rr), view(g.RAP, 1:n2, 1:n3)))
335-
@inbounds conj!(transpose!(view(gram, pr, xr), view(g.XAP, 1:n1, 1:n3)))
332+
@inbounds gram[rr, pr] .= g.RAP[1:n2, 1:n3]
333+
@inbounds gram[xr, pr] .= g.XAP[1:n1, 1:n3]
334+
@inbounds conj!(transpose!(gram[pr, rr], g.RAP[1:n2, 1:n3]))
335+
@inbounds conj!(transpose!(gram[pr, xr], g.XAP[1:n1, 1:n3]))
336336
end
337337
return
338338
end
@@ -344,12 +344,12 @@ end
344344

345345
function rdiv!(A, B::UpperTriangular)
346346
s = size(A, 2)
347-
@inbounds A[:,1] .= view(A, :, 1) ./ B[1,1]
348-
@inbounds for i in 2:s
347+
@inbounds @views A[:,1] .= A[:, 1] ./ B[1,1]
348+
@inbounds @views for i in 2:s
349349
for j in 1:i-1
350-
A[:,i] .= view(A, :, i) .- view(A, :, j) .* B[j,i]
350+
A[:,i] .= A[:,i] .- A[:,j] .* B[j,i]
351351
end
352-
A[:,i] .= view(A, :, i) ./ B[i,i]
352+
A[:,i] .= A[:,i] ./ B[i,i]
353353
end
354354
return A
355355
end
@@ -370,19 +370,19 @@ function (ortho!::CholQR)(XBlocks::Blocks{Generalized}, sizeX = -1; update_AX=fa
370370
X = XBlocks.block
371371
BX = XBlocks.B_block # Assumes it is premultiplied
372372
AX = XBlocks.A_block
373-
gram_view = view(ortho!.gramVBV, 1:sizeX, 1:sizeX)
374-
if useview
375-
mul!(gram_view, adjoint(view(X, :, 1:sizeX)), view(BX, :, 1:sizeX))
373+
@views gram_view = ortho!.gramVBV[1:sizeX, 1:sizeX]
374+
@views if useview
375+
mul!(gram_view, adjoint(X[:, 1:sizeX]), BX[:, 1:sizeX])
376376
else
377377
mul!(gram_view, adjoint(X), BX)
378378
end
379379
realdiag!(gram_view)
380380
cholf = cholesky!(Hermitian(gram_view))
381381
R = cholf.factors
382-
if useview
383-
rdiv!(view(X, :, 1:sizeX), UpperTriangular(R))
384-
update_AX && rdiv!(view(AX, :, 1:sizeX), UpperTriangular(R))
385-
Generalized && update_BX && rdiv!(view(BX, :, 1:sizeX), UpperTriangular(R))
382+
@views if useview
383+
rdiv!(X[:, 1:sizeX], UpperTriangular(R))
384+
update_AX && rdiv!(AX[:, 1:sizeX], UpperTriangular(R))
385+
Generalized && update_BX && rdiv!(BX[:, 1:sizeX], UpperTriangular(R))
386386
else
387387
rdiv!(X, UpperTriangular(R))
388388
update_AX && rdiv!(AX, UpperTriangular(R))
@@ -532,7 +532,7 @@ function ortho_AB_mul_X!(blocks::Blocks, ortho!, A, B, bs=-1)
532532
end
533533
function residuals!(iterator)
534534
sizeX = size(iterator.XBlocks.block, 2)
535-
mul!(iterator.RBlocks.block, iterator.XBlocks.B_block, Diagonal(view(iterator.ritz_values, 1:sizeX)))
535+
@views mul!(iterator.RBlocks.block, iterator.XBlocks.B_block, Diagonal(iterator.ritz_values[1:sizeX]))
536536
@inbounds iterator.RBlocks.block .= iterator.XBlocks.A_block .- iterator.RBlocks.block
537537
# Finds residual norms
538538
@inbounds for j in 1:size(iterator.RBlocks.block, 2)
@@ -549,22 +549,22 @@ end
549549
function update_mask!(iterator, residualTolerance)
550550
sizeX = size(iterator.XBlocks.block, 2)
551551
# Update active vectors mask
552-
@inbounds iterator.activeMask .= view(iterator.residuals, 1:sizeX) .> residualTolerance
552+
@inbounds @views iterator.activeMask .= iterator.residuals[1:sizeX] .> residualTolerance
553553
iterator.currentBlockSize[] = sum(iterator.activeMask)
554554
return
555555
end
556556

557557
function update_active!(mask, bs::Int, blockPairs...)
558-
@inbounds for (activeblock, block) in blockPairs
559-
activeblock[:, 1:bs] .= view(block, :, mask)
558+
@inbounds @views for (activeblock, block) in blockPairs
559+
activeblock[:, 1:bs] .= block[:, mask]
560560
end
561561
return
562562
end
563563

564564
function precond_constr!(block, temp_block, bs, precond!, constr!)
565-
precond!(view(block, :, 1:bs))
565+
@views precond!(block[:, 1:bs])
566566
# Constrain the active residual vectors to be B-orthogonal to Y
567-
constr!(view(block, :, 1:bs), view(temp_block, :, 1:bs))
567+
@views constr!(block[:, 1:bs], temp_block[:, 1:bs])
568568
return
569569
end
570570
function block_grams_1x1!(iterator)
@@ -578,7 +578,7 @@ function block_grams_2x2!(iterator, bs)
578578
XAR!(iterator.gramABlock, iterator.XBlocks, iterator.activeRBlocks, bs)
579579
RAR!(iterator.gramABlock, iterator.activeRBlocks, bs)
580580
XBR!(iterator.gramBBlock, iterator.XBlocks, iterator.activeRBlocks, bs)
581-
iterator.gramABlock(iterator.gramA, view(iterator.ritz_values, 1:sizeX), sizeX, bs, 0)
581+
@views iterator.gramABlock(iterator.gramA, iterator.ritz_values[1:sizeX], sizeX, bs, 0)
582582
iterator.gramBBlock(iterator.gramB, sizeX, bs, 0, true)
583583

584584
return
@@ -597,7 +597,7 @@ function block_grams_3x3!(iterator, bs)
597597
XBP!(iterator.gramBBlock, iterator.XBlocks, iterator.activePBlocks, bs)
598598
RBP!(iterator.gramBBlock, iterator.activeRBlocks, iterator.activePBlocks, bs)
599599
# Update the gram matrix [X R P]' A [X R P]
600-
iterator.gramABlock(iterator.gramA, view(iterator.ritz_values, 1:sizeX), sizeX, bs, bs)
600+
@views iterator.gramABlock(iterator.gramA, iterator.ritz_values[1:sizeX], sizeX, bs, bs)
601601
# Update the gram matrix [X R P]' B [X R P]
602602
iterator.gramBBlock(iterator.gramB, sizeX, bs, bs, true)
603603

@@ -606,38 +606,40 @@ end
606606

607607
function sub_problem!(iterator, sizeX, bs1, bs2)
608608
subdim = sizeX+bs1+bs2
609-
if bs1 == 0
610-
gramAview = view(iterator.gramABlock.XAX, 1:subdim, 1:subdim)
609+
@views if bs1 == 0
610+
gramAview = iterator.gramABlock.XAX[1:subdim, 1:subdim]
611611
# Source of type instability
612612
realdiag!(gramAview)
613613
eigf = eigen!(Hermitian(gramAview))
614614
else
615-
gramAview = view(iterator.gramA, 1:subdim, 1:subdim)
616-
gramBview = view(iterator.gramB, 1:subdim, 1:subdim)
615+
gramAview = iterator.gramA[1:subdim, 1:subdim]
616+
gramBview = iterator.gramB[1:subdim, 1:subdim]
617617
# Source of type instability
618618
realdiag!(gramAview)
619619
realdiag!(gramBview)
620620
eigf = eigen!(Hermitian(gramAview), Hermitian(gramBview))
621621
end
622622
# Selects extremal eigenvalues and corresponding vectors
623-
partialsortperm!(view(iterator.λperm, 1:subdim), eigf.values, 1:subdim; rev=iterator.largest)
624-
@inbounds iterator.ritz_values[1:sizeX] .= view(eigf.values, view(iterator.λperm, 1:sizeX))
625-
@inbounds iterator.V[1:subdim, 1:sizeX] .= view(eigf.vectors, :, view(iterator.λperm, 1:sizeX))
623+
@views partialsortperm!(iterator.λperm[1:subdim], eigf.values, 1:subdim; rev=iterator.largest)
624+
@inbounds @views iterator.ritz_values[1:sizeX] .= eigf.values[iterator.λperm[1:sizeX]]
625+
@inbounds @views iterator.V[1:subdim, 1:sizeX] .= eigf.vectors[:, iterator.λperm[1:sizeX]]
626626
return
627627
end
628628

629629
function update_X_P!(iterator::LOBPCGIterator{Generalized}, bs1, bs2) where Generalized
630630
sizeX = size(iterator.XBlocks.block, 2)
631-
x_eigview = view(iterator.V, 1:sizeX, 1:sizeX)
632-
r_eigview = view(iterator.V, sizeX+1:sizeX+bs1, 1:sizeX)
633-
p_eigview = view(iterator.V, sizeX+bs1+1:sizeX+bs1+bs2, 1:sizeX)
634-
r_blockview = view(iterator.activeRBlocks.block, :, 1:bs1)
635-
ra_blockview = view(iterator.activeRBlocks.A_block, :, 1:bs1)
636-
p_blockview = view(iterator.activePBlocks.block, :, 1:bs2)
637-
pa_blockview = view(iterator.activePBlocks.A_block, :, 1:bs2)
638-
if Generalized
639-
rb_blockview = view(iterator.activeRBlocks.B_block, :, 1:bs1)
640-
pb_blockview = view(iterator.activePBlocks.B_block, :, 1:bs2)
631+
@views begin
632+
x_eigview = iterator.V[1:sizeX, 1:sizeX]
633+
r_eigview = iterator.V[sizeX+1:sizeX+bs1, 1:sizeX]
634+
p_eigview = iterator.V[sizeX+bs1+1:sizeX+bs1+bs2, 1:sizeX]
635+
r_blockview = iterator.activeRBlocks.block[:, 1:bs1]
636+
ra_blockview = iterator.activeRBlocks.A_block[:, 1:bs1]
637+
p_blockview = iterator.activePBlocks.block[:, 1:bs2]
638+
pa_blockview = iterator.activePBlocks.A_block[:, 1:bs2]
639+
if Generalized
640+
rb_blockview = iterator.activeRBlocks.B_block[:, 1:bs1]
641+
pb_blockview = iterator.activePBlocks.B_block[:, 1:bs2]
642+
end
641643
end
642644
if bs1 > 0
643645
mul!(iterator.PBlocks.block, r_blockview, r_eigview)
@@ -864,8 +866,8 @@ function lobpcg!(iterator::LOBPCGIterator; log=false, maxiter=200, not_zeros=fal
864866
X = iterator.XBlocks.block
865867
iterator.constr!(iterator.XBlocks.block, iterator.tempXBlocks.block)
866868
if !not_zeros
867-
for j in 1:size(X,2)
868-
if all(x -> x==0, view(X, :, j))
869+
@views for j in 1:size(X,2)
870+
if all(x -> x==0, X[:, j])
869871
@inbounds X[:,j] .= rand.()
870872
end
871873
end
@@ -882,9 +884,9 @@ function lobpcg!(iterator::LOBPCGIterator; log=false, maxiter=200, not_zeros=fal
882884
iterator.currentBlockSize[] == 0 && break
883885
iterator.iteration[] += 1
884886
end
885-
@inbounds iterator.λ .= view(iterator.ritz_values, 1:sizeX)
887+
@inbounds @views iterator.λ .= iterator.ritz_values[1:sizeX]
886888

887-
results = LOBPCGResults(iterator.λ, X, tol, iterator.residuals, iterator.iteration[], maxiter, all((x)->(norm(x)<=tol), view(iterator.residuals, 1:sizeX)), iterator.trace)
889+
@views results = LOBPCGResults(iterator.λ, X, tol, iterator.residuals, iterator.iteration[], maxiter, all((x)->(norm(x)<=tol), iterator.residuals[1:sizeX]), iterator.trace)
888890

889891
return results
890892
end
@@ -938,11 +940,11 @@ function lobpcg(A, B, largest::Bool, X0, nev::Int;
938940
append!(r, rnext, 0)
939941
converged_x = sizeX
940942
while converged_x < nev
941-
if nev-converged_x < sizeX
943+
@views if nev-converged_x < sizeX
942944
cutoff = sizeX-(nev-converged_x)
943-
update!(iterator.constr!, view(iterator.XBlocks.block, :, 1:cutoff), view(iterator.XBlocks.B_block, :, 1:cutoff))
944-
X[:, 1:sizeX-cutoff] .= @view X[:, cutoff+1:sizeX]
945-
rand!(view(X, :, cutoff+1:sizeX))
945+
update!(iterator.constr!, iterator.XBlocks.block[:, 1:cutoff], iterator.XBlocks.B_block[:, 1:cutoff])
946+
X[:, 1:sizeX-cutoff] .= X[:, cutoff+1:sizeX]
947+
rand!(X[:, cutoff+1:sizeX])
946948
rnext = lobpcg!(iterator, log=log, tol=tol, maxiter=maxiter, not_zeros=true)
947949
append!(r, rnext, converged_x, sizeX-cutoff)
948950
converged_x += sizeX-cutoff

0 commit comments

Comments
 (0)