Skip to content

Commit e7c9b6b

Browse files
author
mohamed82008
committed
Fix complex number support
1 parent 28cb758 commit e7c9b6b

File tree

2 files changed

+34
-21
lines changed

2 files changed

+34
-21
lines changed

src/lobpcg.jl

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ function Constraint(Y, B, X)
7575
BY = similar(B)
7676
A_mul_B!(BY, B, Y)
7777
end
78-
gramYBY = At_mul_B(Y, BY)
78+
gramYBY = Ac_mul_B(Y, BY)
79+
realdiag!(gramYBY)
7980
gramYBY_chol = cholfact!(Hermitian(gramYBY))
8081
gramYBV = zeros(T, size(Y, 2), size(X, 2))
8182
tmp = similar(gramYBV)
@@ -91,7 +92,7 @@ function (constr!::Constraint)(X)
9192
sizeX = size(X, 2)
9293
sizeY = size(constr!.Y, 2)
9394
gramYBV_view = view(constr!.gramYBV, 1:sizeY, 1:sizeX)
94-
At_mul_B!(gramYBV_view, constr!.BY, X)
95+
Ac_mul_B!(gramYBV_view, constr!.BY, X)
9596
tmp_view = view(constr!.tmp, 1:sizeY, 1:sizeX)
9697
A_ldiv_B!(tmp_view, gram_chol, gramYBV_view)
9798
A_mul_B!(X, constr!.Y, tmp_view)
@@ -135,18 +136,18 @@ function BlockGram(XBlocks::Blocks{Generalized, T}) where {Generalized, T}
135136
PAP = zeros(T, sizeX, sizeX)
136137
return BlockGram{Generalized, Matrix{T}}(XAX, XAR, XAP, RAR, RAP, PAP)
137138
end
138-
XAX!(BlockGram, XBlocks) = At_mul_B!(BlockGram.XAX, XBlocks.block, XBlocks.A_block)
139-
XAP!(BlockGram, XBlocks, PBlocks, n) = At_mul_B!(view(BlockGram.XAP, :, 1:n), XBlocks.block, view(PBlocks.A_block, :, 1:n))
140-
XAR!(BlockGram, XBlocks, RBlocks, n) = At_mul_B!(view(BlockGram.XAR, :, 1:n), XBlocks.block, view(RBlocks.A_block, :, 1:n))
141-
RAR!(BlockGram, RBlocks, n) = At_mul_B!(view(BlockGram.RAR, 1:n, 1:n), view(RBlocks.block, :, 1:n), view(RBlocks.A_block, :, 1:n))
142-
RAP!(BlockGram, RBlocks, PBlocks, n) = At_mul_B!(view(BlockGram.RAP, 1:n, 1:n), view(RBlocks.A_block, :, 1:n), view(PBlocks.block, :, 1:n))
143-
PAP!(BlockGram, PBlocks, n) = At_mul_B!(view(BlockGram.PAP, 1:n, 1:n), view(PBlocks.block, :, 1:n), view(PBlocks.A_block, :, 1:n))
144-
XBP!(BlockGram, XBlocks, PBlocks, n) = At_mul_B!(view(BlockGram.XAP, :, 1:n), XBlocks.block, view(PBlocks.B_block, :, 1:n))
145-
XBR!(BlockGram, XBlocks, RBlocks, n) = At_mul_B!(view(BlockGram.XAR, :, 1:n), XBlocks.block, view(RBlocks.B_block, :, 1:n))
146-
RBP!(BlockGram, RBlocks, PBlocks, n) = At_mul_B!(view(BlockGram.RAP, 1:n, 1:n), view(RBlocks.B_block, :, 1:n), view(PBlocks.block, :, 1:n))
147-
XBX!(BlockGram, XBlocks) = At_mul_B!(BlockGram.XAX, XBlocks.block, XBlocks.B_block)
148-
RBR!(BlockGram, RBlocks, n) = At_mul_B!(view(BlockGram.RAR, 1:n, 1:n), view(RBlocks.block, :, 1:n), view(RBlocks.B_block, :, 1:n))
149-
PBP!(BlockGram, PBlocks, n) = At_mul_B!(view(BlockGram.PAP, 1:n, 1:n), view(PBlocks.block, :, 1:n), view(PBlocks.B_block, :, 1:n))
139+
XAX!(BlockGram, XBlocks) = Ac_mul_B!(BlockGram.XAX, XBlocks.block, XBlocks.A_block)
140+
XAP!(BlockGram, XBlocks, PBlocks, n) = Ac_mul_B!(view(BlockGram.XAP, :, 1:n), XBlocks.block, view(PBlocks.A_block, :, 1:n))
141+
XAR!(BlockGram, XBlocks, RBlocks, n) = Ac_mul_B!(view(BlockGram.XAR, :, 1:n), XBlocks.block, view(RBlocks.A_block, :, 1:n))
142+
RAR!(BlockGram, RBlocks, n) = Ac_mul_B!(view(BlockGram.RAR, 1:n, 1:n), view(RBlocks.block, :, 1:n), view(RBlocks.A_block, :, 1:n))
143+
RAP!(BlockGram, RBlocks, PBlocks, n) = Ac_mul_B!(view(BlockGram.RAP, 1:n, 1:n), view(RBlocks.A_block, :, 1:n), view(PBlocks.block, :, 1:n))
144+
PAP!(BlockGram, PBlocks, n) = Ac_mul_B!(view(BlockGram.PAP, 1:n, 1:n), view(PBlocks.block, :, 1:n), view(PBlocks.A_block, :, 1:n))
145+
XBP!(BlockGram, XBlocks, PBlocks, n) = Ac_mul_B!(view(BlockGram.XAP, :, 1:n), XBlocks.block, view(PBlocks.B_block, :, 1:n))
146+
XBR!(BlockGram, XBlocks, RBlocks, n) = Ac_mul_B!(view(BlockGram.XAR, :, 1:n), XBlocks.block, view(RBlocks.B_block, :, 1:n))
147+
RBP!(BlockGram, RBlocks, PBlocks, n) = Ac_mul_B!(view(BlockGram.RAP, 1:n, 1:n), view(RBlocks.B_block, :, 1:n), view(PBlocks.block, :, 1:n))
148+
XBX!(BlockGram, XBlocks) = Ac_mul_B!(BlockGram.XAX, XBlocks.block, XBlocks.B_block)
149+
RBR!(BlockGram, RBlocks, n) = Ac_mul_B!(view(BlockGram.RAR, 1:n, 1:n), view(RBlocks.block, :, 1:n), view(RBlocks.B_block, :, 1:n))
150+
PBP!(BlockGram, PBlocks, n) = Ac_mul_B!(view(BlockGram.PAP, 1:n, 1:n), view(PBlocks.block, :, 1:n), view(PBlocks.B_block, :, 1:n))
150151

151152
function I!(G, xr)
152153
for j in xr, i in xr
@@ -228,6 +229,15 @@ function A_rdiv_B!(A, B::UpperTriangular)
228229
return
229230
end
230231

232+
realdiag!(M) = nothing
233+
function realdiag!(M::AbstractMatrix{TC}) where TC <: Complex
234+
T = real(eltype(M))
235+
for i in 1:size(M, 1)
236+
M[i,i] = Complex(real(M[i,i]), zero(T))
237+
end
238+
return
239+
end
240+
231241
function (ortho!::CholQR)(XBlocks::Blocks{Generalized}, sizeX = -1; update_AX=false, update_BX=false) where Generalized
232242
useview = sizeX != -1
233243
if sizeX == -1
@@ -238,10 +248,11 @@ function (ortho!::CholQR)(XBlocks::Blocks{Generalized}, sizeX = -1; update_AX=fa
238248
AX = XBlocks.A_block
239249
gram_view = view(ortho!.gramVBV, 1:sizeX, 1:sizeX)
240250
if useview
241-
At_mul_B!(gram_view, view(X, :, 1:sizeX), view(BX, :, 1:sizeX))
251+
Ac_mul_B!(gram_view, view(X, :, 1:sizeX), view(BX, :, 1:sizeX))
242252
else
243-
At_mul_B!(gram_view, X, BX)
253+
Ac_mul_B!(gram_view, X, BX)
244254
end
255+
realdiag!(gram_view)
245256
cholf = cholfact!(Hermitian(gram_view))
246257
R = cholf.factors
247258
if useview
@@ -384,7 +395,7 @@ end
384395
function update_mask!(iterator, residualTolerance)
385396
sizeX = size(iterator.XBlocks.block, 2)
386397
# Update active vectors mask
387-
iterator.activeMask .= view(iterator.residuals, 1:sizeX) .> residualTolerance
398+
iterator.activeMask .= norm.(view(iterator.residuals, 1:sizeX)) .> residualTolerance
388399
iterator.currentBlockSize[] = sum(iterator.activeMask)
389400
return
390401
end
@@ -444,11 +455,14 @@ function sub_problem!(iterator, sizeX, bs1, bs2)
444455
if bs1 == 0
445456
gramAview = view(iterator.gramABlock.XAX, 1:subdim, 1:subdim)
446457
# Source of type instability
458+
realdiag!(gramAview)
447459
eigf = eigfact!(Hermitian(gramAview))
448460
else
449461
gramAview = view(iterator.gramA, 1:subdim, 1:subdim)
450462
gramBview = view(iterator.gramB, 1:subdim, 1:subdim)
451463
# Source of type instability
464+
realdiag!(gramAview)
465+
realdiag!(gramBview)
452466
eigf = eigfact!(Hermitian(gramAview), Hermitian(gramBview))
453467
end
454468
# Selects extremal eigenvalues and corresponding vectors
@@ -590,9 +604,12 @@ function dense_solver(A, B, X, largest)
590604
eigvals = largest ? (n - sizeX + 1, n) : (1, sizeX)
591605
A_dense = A*eye(n)
592606
if B isa Void
607+
realdiag!(A_dense)
593608
return eig(Hermitian(A_dense))
594609
else
595610
B_dense = B*eye(n)
611+
realdiag!(A_dense)
612+
realdiag!(B_dense)
596613
return eig(Hermitian(A_dense), Hermitian(B_dense))
597614
end
598615
end

test/lobpcg.jl

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,10 @@ end
4848
tol = eps(real(T))
4949

5050
λ, x, ch = lobpcg(A, B, largest, b; tol=tol, maxiter=Inf, log=true)
51-
@show max_err(A*x - B*x*diagm(λ)), tol
5251
@test max_err(A*x - B*x*diagm(λ)) tol
5352

5453
# If you start from the exact solution, you should converge immediately
5554
λ, x, ch = lobpcg(A, B, largest, x; tol=10tol, log=true)
56-
@show length(ch)
5755
@test length(ch) 1
5856
end
5957
end
@@ -105,12 +103,10 @@ end
105103
tol = eps(real(T))
106104

107105
λ, x, ch = lobpcg(A, B, largest, b; tol=tol, maxiter=Inf, log=true)
108-
@show max_err(A*x - B*x*diagm(λ)), tol
109106
@test max_err(A*x - B*x*diagm(λ)) tol
110107

111108
# If you start from the exact solution, you should converge immediately
112109
λ, x, ch = lobpcg(A, B, largest, x; tol=10tol, log=true)
113-
@show length(ch)
114110
@test length(ch) 1
115111
end
116112
end

0 commit comments

Comments
 (0)