@@ -63,23 +63,19 @@ function delbeta! end
6363
6464function delbeta! (p:: DensePredQR{T,<:QRCompactWY} , r:: Vector{T} ) where T<: BlasReal
6565 rnk = rank (p. qr. R)
66- rnk == length (p. delbeta) || throw (RankDeficientException (rnk))
67- p. delbeta = p. qr\ r
68- mul! (p. scratchm1, Diagonal (ones (size (r))), p. X)
66+ p. delbeta = p. qr \ r
6967 return p
7068end
7169
7270function delbeta! (p:: DensePredQR{T,<:QRCompactWY} , r:: Vector{T} , wt:: Vector{T} ) where T<: BlasReal
7371 rnk = rank (p. qr. R)
74- rnk == length (p. delbeta) || throw (RankDeficientException (rnk))
7572 X = p. X
7673 W = Diagonal (wt)
7774 sqrtW = Diagonal (sqrt .(wt))
7875 mul! (p. scratchm1, sqrtW, X)
79- mul! (p. delbeta, X' W, r)
80- qnr = qr (p. scratchm1)
81- Rinv = inv (qnr. R)
82- p. delbeta = Rinv * Rinv' * p. delbeta
76+ ỹ = sqrtW * r
77+ p. qr = qr! (p. scratchm1)
78+ p. delbeta = p. qr \ ỹ
8379 return p
8480end
8581
@@ -88,44 +84,32 @@ function delbeta!(p::DensePredQR{T,<:QRPivoted}, r::Vector{T}) where T<:BlasReal
8884 if rnk == length (p. delbeta)
8985 p. delbeta = p. qr\ r
9086 else
91- R = @view p. qr. R[:, 1 : rnk]
92- Q = @view p. qr. Q[:, 1 : size (R, 1 )]
87+ R = UpperTriangular (view (parent (p. qr. R), 1 : rnk, 1 : rnk))
9388 piv = p. qr. p
94- p . delbeta = zeros ( size ( p. delbeta) )
95- p. delbeta[1 : rnk] = R \ Q' r
89+ fill! ( p. delbeta, 0 )
90+ p. delbeta[1 : rnk] = R \ view (p . qr . Q' r, 1 : rnk)
9691 invpermute! (p. delbeta, piv)
9792 end
98- mul! (p. scratchm1, Diagonal (ones (size (r))), p. X)
9993 return p
10094end
10195
10296function delbeta! (p:: DensePredQR{T,<:QRPivoted} , r:: Vector{T} , wt:: Vector{T} ) where T<: BlasReal
103- rnk = rank (p. qr. R)
10497 X = p. X
10598 W = Diagonal (wt)
10699 sqrtW = Diagonal (sqrt .(wt))
107- delbeta = p. delbeta
108- scratchm2 = similar (X, T)
109100 mul! (p. scratchm1, sqrtW, X)
110- mul! (scratchm2, W, X)
111- mul! (delbeta, transpose (scratchm2), r)
112-
113- if rnk == length (p. delbeta)
114- qnr = qr (p. scratchm1)
115- Rinv = inv (qnr. R)
116- p. delbeta = Rinv * Rinv' * delbeta
117- else
118- qnr = pivoted_qr! (copy (p. scratchm1))
119- R = @view qnr. R[1 : rnk, 1 : rnk]
120- Rinv = inv (R)
121- piv = qnr. p
122- permute! (delbeta, piv)
123- for k= (rnk+ 1 ): length (delbeta)
124- delbeta[k] = - zero (T)
125- end
126- p. delbeta[1 : rnk] = Rinv * Rinv' * view (delbeta, 1 : rnk)
127- invpermute! (delbeta, piv)
101+ r̃ = sqrtW * r
102+
103+ p. qr = pivoted_qr! (copy (p. scratchm1))
104+ rnk = rank (p. qr. R) # FIXME ! Don't use svd for this
105+ R = UpperTriangular (view (parent (p. qr. R), 1 : rnk, 1 : rnk))
106+ permute! (p. delbeta, p. qr. p)
107+ for k = (rnk + 1 ): length (p. delbeta)
108+ p. delbeta[k] = - zero (T)
128109 end
110+ p. delbeta[1 : rnk] = R \ (p. qr. Q' * r̃)[1 : rnk]
111+ invpermute! (p. delbeta, p. qr. p)
112+
129113 return p
130114end
131115
@@ -279,27 +263,25 @@ end
279263LinearAlgebra. cholesky (p:: SparsePredChol{T} ) where {T} = copy (p. chol)
280264LinearAlgebra. cholesky! (p:: SparsePredChol{T} ) where {T} = p. chol
281265
282- function invqr (x:: DensePredQR{T,<: QRCompactWY} ) where T
283- Q,R = qr (x. scratchm1)
284- Rinv = inv (R)
266+ function invqr (p:: DensePredQR{T,<: QRCompactWY} ) where T
267+ Rinv = inv (p. qr. R)
285268 Rinv* Rinv'
286269end
287270
288- function invqr (x:: DensePredQR{T,<: QRPivoted} ) where T
289- Q,R,pv = pivoted_qr! (copy (x. scratchm1))
290- rnk = rank (R)
291- p = length (x. delbeta)
292- if rnk == p
293- Rinv = inv (R)
271+ function invqr (p:: DensePredQR{T,<: QRPivoted} ) where T
272+ rnk = rank (p. qr. R)
273+ k = length (p. delbeta)
274+ if rnk == k
275+ Rinv = inv (p. qr. R)
294276 xinv = Rinv* Rinv'
295- ipiv = invperm (pv )
277+ ipiv = invperm (p . qr . p )
296278 return xinv[ipiv, ipiv]
297279 else
298- Rsub = R[ 1 : rnk, 1 : rnk]
280+ Rsub = UpperTriangular ( view (p . qr . R, 1 : rnk, 1 : rnk))
299281 RsubInv = inv (Rsub)
300- xinv = fill (convert (T, NaN ), (p,p ))
282+ xinv = fill (convert (T, NaN ), (k, k ))
301283 xinv[1 : rnk, 1 : rnk] = RsubInv* RsubInv'
302- ipiv = invperm (pv )
284+ ipiv = invperm (p . qr . p )
303285 return xinv[ipiv, ipiv]
304286 end
305287end
0 commit comments