Skip to content

Commit f193783

Browse files
authored
BigFloat compatibility for qr_jacobimatrix (#146)
* fix QR-X BigFloat issue * add test and broken test for Cholesky * fix test * fix isa vs == * use zeros for length 2 * up version a bit * use isprimitivetype
1 parent aaa182b commit f193783

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ClassicalOrthogonalPolynomials"
22
uuid = "b30e2e7b-c4ee-47da-9d5f-2c5c27239acd"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "0.11"
4+
version = "0.11.1"
55

66
[deps]
77
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

src/choleskyQR.jl

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ end
6666

6767
# Computes the initial data for the Jacobi operator bands
6868
function CholeskyJacobiData(U::AbstractMatrix{T}, UX) where T
69-
dv = Vector{T}(undef,2) # compute a length 2 vector on first go
70-
ev = Vector{T}(undef,2)
69+
# compute a length 2 vector on first go and circumvent BigFloat issue
70+
dv = zeros(T,2)
71+
ev = zeros(T,2)
7172
dv[1] = UX[1,1]/U[1,1] # this is dot(view(UX,1,1), U[1,1] \ [one(T)])
7273
dv[2] = -U[1,2]*UX[2,1]/(U[1,1]*U[2,2])+UX[2,2]/U[2,2] # this is dot(view(UX,2,1:2), U[1:2,1:2] \ [zero(T); one(T)])
7374
ev[1] = -UX[1,1]*U[1,2]/(U[1,1]*U[2,2])+UX[1,2]/U[2,2] # this is dot(view(UX,1,1:2), U[1:2,1:2] \ [zero(T); one(T)])
@@ -148,10 +149,10 @@ end
148149
function QRJacobiData{:Q,T}(F, P) where T
149150
b = 3+bandwidths(F.R)[2]÷2
150151
X = jacobimatrix(P)
151-
# we fill 1 entry on the first run
152-
dv = zeros(T,2)
152+
# we fill 1 entry on the first run and circumvent BigFloat issue
153+
dv = zeros(T,2)
153154
ev = zeros(T,1)
154-
# fill first entry (special case)
155+
# fill first entry (special case)
155156
M = Matrix(X[1:b,1:b])
156157
resizedata!(F.factors,b,b)
157158
# special case for first entry double Householder product
@@ -176,8 +177,9 @@ function QRJacobiData{:R,T}(F, P) where T
176177
U = ApplyArray(*,Diagonal(sign.(view(U,band(0)))),U) # QR decomposition does not force positive diagonals on R by default
177178
X = jacobimatrix(P)
178179
UX = ApplyArray(*,U,X)
179-
dv = Vector{T}(undef,2) # compute a length 2 vector on first go
180-
ev = Vector{T}(undef,2)
180+
# compute a length 2 vector on first go and circumvent BigFloat issue
181+
dv = zeros(T,2)
182+
ev = zeros(T,2)
181183
dv[1] = UX[1,1]/U[1,1] # this is dot(view(UX,1,1), U[1,1] \ [one(T)])
182184
dv[2] = -U[1,2]*UX[2,1]/(U[1,1]*U[2,2])+UX[2,2]/U[2,2] # this is dot(view(UX,2,1:2), U[1:2,1:2] \ [zero(T); one(T)])
183185
ev[1] = -UX[1,1]*U[1,2]/(U[1,1]*U[2,2])+UX[1,2]/U[2,2] # this is dot(view(UX,1,1:2), U[1:2,1:2] \ [zero(T); one(T)])
@@ -216,7 +218,12 @@ function _fillqrbanddata!(J::QRJacobiData{:Q,T}, inds::UnitRange{Int}) where T
216218
resizedata!(J.U.τ,m)
217219
K, τ, F, dv, ev = J.UX, J.U.τ, J.U.factors, J.dv, J.ev
218220
D = sign.(view(J.U.R,band(0)).*view(J.U.R,band(0))[2:end])
219-
M = Matrix{T}(undef,b+3,b+3)
221+
M = zeros(T,b+3,b+3)
222+
if isprimitivetype(T)
223+
M = Matrix{T}(undef,b+3,b+3)
224+
else
225+
M = zeros(T,b+3,b+3)
226+
end
220227
@inbounds for n in jj
221228
dv[n] = K[1,1] # no sign correction needed on diagonal entry due to cancellation
222229
# doublehouseholderapply!(K,τ[n+1],view(F,n+2:n+b+2,n+1),w)
@@ -243,4 +250,4 @@ function _fillqrbanddata!(J::QRJacobiData{:R,T}, inds::UnitRange{Int}) where T
243250
dv[k] = -U[k-1,k]*UX[k,k-1]/(U[k-1,k-1]*U[k,k])+UX[k,k]./U[k,k] # this is dot(view(UX,k,k-1:k), U[k-1:k,k-1:k] \ ek)
244251
ev[k] = UX[k,k-1]/U[k+1,k+1]*(-U[k-1,k+1]/U[k-1,k-1]+U[k-1,k]*U[k,k+1]/(U[k-1,k-1]*U[k,k]))+UX[k,k]/U[k+1,k+1]*(-U[k,k+1]/U[k,k])+UX[k,k+1]/U[k+1,k+1] # this is dot(view(UX,k,k-1:k+1), U[k-1:k+1,k-1:k+1] \ ek)
245252
end
246-
end
253+
end

test/test_choleskyQR.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,15 @@ import LazyArrays: AbstractCachedMatrix, resizedata!
205205
@test JqrQ[1:20,1:20] F[1:20,1:20]
206206
@test JqrQ[50:70,50:70] F[50:70,50:70]
207207
end
208+
@testset "BigFloat returns correct values" begin
209+
t = BigFloat("1.1")
210+
P = Normalized(legendre(big(0)..big(1)))
211+
X = jacobimatrix(P)
212+
Xq = qr_jacobimatrix(t*I-X, P, :Q)
213+
Xr = qr_jacobimatrix(t*I-X, P, :R)
214+
@test Xq[1:20,1:20] Xr[1:20,1:20]
215+
@test_broken Xq[1:20,1:20] cholesky_jacobimatrix(Symmetric((t*I-X)^2), P)[1:20,1:20]
216+
end
208217
end
209218

210219
@testset "ConvertedOP" begin

0 commit comments

Comments
 (0)