@@ -75,7 +75,8 @@ function Constraint(Y, B, X)
75
75
BY = similar (B)
76
76
A_mul_B! (BY, B, Y)
77
77
end
78
- gramYBY = At_mul_B (Y, BY)
78
+ gramYBY = Ac_mul_B (Y, BY)
79
+ realdiag! (gramYBY)
79
80
gramYBY_chol = cholfact! (Hermitian (gramYBY))
80
81
gramYBV = zeros (T, size (Y, 2 ), size (X, 2 ))
81
82
tmp = similar (gramYBV)
@@ -91,7 +92,7 @@ function (constr!::Constraint)(X)
91
92
sizeX = size (X, 2 )
92
93
sizeY = size (constr!. Y, 2 )
93
94
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)
95
96
tmp_view = view (constr!. tmp, 1 : sizeY, 1 : sizeX)
96
97
A_ldiv_B! (tmp_view, gram_chol, gramYBV_view)
97
98
A_mul_B! (X, constr!. Y, tmp_view)
@@ -135,18 +136,18 @@ function BlockGram(XBlocks::Blocks{Generalized, T}) where {Generalized, T}
135
136
PAP = zeros (T, sizeX, sizeX)
136
137
return BlockGram {Generalized, Matrix{T}} (XAX, XAR, XAP, RAR, RAP, PAP)
137
138
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))
150
151
151
152
function I! (G, xr)
152
153
for j in xr, i in xr
@@ -228,6 +229,15 @@ function A_rdiv_B!(A, B::UpperTriangular)
228
229
return
229
230
end
230
231
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
+
231
241
function (ortho!:: CholQR )(XBlocks:: Blocks{Generalized} , sizeX = - 1 ; update_AX= false , update_BX= false ) where Generalized
232
242
useview = sizeX != - 1
233
243
if sizeX == - 1
@@ -238,10 +248,11 @@ function (ortho!::CholQR)(XBlocks::Blocks{Generalized}, sizeX = -1; update_AX=fa
238
248
AX = XBlocks. A_block
239
249
gram_view = view (ortho!. gramVBV, 1 : sizeX, 1 : sizeX)
240
250
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))
242
252
else
243
- At_mul_B ! (gram_view, X, BX)
253
+ Ac_mul_B ! (gram_view, X, BX)
244
254
end
255
+ realdiag! (gram_view)
245
256
cholf = cholfact! (Hermitian (gram_view))
246
257
R = cholf. factors
247
258
if useview
384
395
function update_mask! (iterator, residualTolerance)
385
396
sizeX = size (iterator. XBlocks. block, 2 )
386
397
# Update active vectors mask
387
- iterator. activeMask .= view (iterator. residuals, 1 : sizeX) .> residualTolerance
398
+ iterator. activeMask .= norm .( view (iterator. residuals, 1 : sizeX) ) .> residualTolerance
388
399
iterator. currentBlockSize[] = sum (iterator. activeMask)
389
400
return
390
401
end
@@ -444,11 +455,14 @@ function sub_problem!(iterator, sizeX, bs1, bs2)
444
455
if bs1 == 0
445
456
gramAview = view (iterator. gramABlock. XAX, 1 : subdim, 1 : subdim)
446
457
# Source of type instability
458
+ realdiag! (gramAview)
447
459
eigf = eigfact! (Hermitian (gramAview))
448
460
else
449
461
gramAview = view (iterator. gramA, 1 : subdim, 1 : subdim)
450
462
gramBview = view (iterator. gramB, 1 : subdim, 1 : subdim)
451
463
# Source of type instability
464
+ realdiag! (gramAview)
465
+ realdiag! (gramBview)
452
466
eigf = eigfact! (Hermitian (gramAview), Hermitian (gramBview))
453
467
end
454
468
# Selects extremal eigenvalues and corresponding vectors
@@ -590,9 +604,12 @@ function dense_solver(A, B, X, largest)
590
604
eigvals = largest ? (n - sizeX + 1 , n) : (1 , sizeX)
591
605
A_dense = A* eye (n)
592
606
if B isa Void
607
+ realdiag! (A_dense)
593
608
return eig (Hermitian (A_dense))
594
609
else
595
610
B_dense = B* eye (n)
611
+ realdiag! (A_dense)
612
+ realdiag! (B_dense)
596
613
return eig (Hermitian (A_dense), Hermitian (B_dense))
597
614
end
598
615
end
0 commit comments