Skip to content

Commit 861797d

Browse files
authored
Better support for lowering conversions (#5)
* Better support for lowering conversions * Update lanczos.jl * Update lanczos.jl * Update Project.toml * Update ci.yml * tests pass on 1.6 * Update Project.toml
1 parent bb2a9f1 commit 861797d

16 files changed

+92
-36
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ jobs:
1111
matrix:
1212
version:
1313
- '1.5'
14+
- '^1.6.0-0'
1415
os:
1516
- ubuntu-latest
1617
- macOS-latest

Project.toml

Lines changed: 4 additions & 4 deletions
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.1.0"
4+
version = "0.1.1"
55

66
[deps]
77
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -24,7 +24,7 @@ SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
2424

2525
[compat]
2626
ArrayLayouts = "0.5.3"
27-
BandedMatrices = "0.16.2"
27+
BandedMatrices = "0.16.4"
2828
BlockArrays = "0.14.1"
2929
BlockBandedMatrices = "0.10"
3030
ContinuumArrays = "0.5"
@@ -36,8 +36,8 @@ FillArrays = "0.11"
3636
InfiniteArrays = "0.9"
3737
InfiniteLinearAlgebra = "0.4.6"
3838
IntervalSets = "0.3.1, 0.4, 0.5"
39-
LazyArrays = "0.20.4"
40-
QuasiArrays = "0.4.2"
39+
LazyArrays = "0.20.5"
40+
QuasiArrays = "0.4.5"
4141
SpecialFunctions = "0.10, 1"
4242
julia = "1.5"
4343

src/ClassicalOrthogonalPolynomials.jl

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,15 @@ export OrthogonalPolynomial, Normalized, orthonormalpolynomial, LanczosPolynomia
4040
WeightedUltraspherical, WeightedChebyshev, WeightedChebyshevT, WeightedChebyshevU, WeightedJacobi,
4141
∞, Derivative, .., Inclusion, chebyshevt, chebyshevu, legendre, jacobi, legendrep, jacobip, ultrasphericalp, jacobimatrix, jacobiweight, legendreweight, chebyshevtweight, chebyshevuweight
4242

43+
if VERSION < v"1.6-"
44+
oneto(n) = Base.OneTo(n)
45+
else
46+
import Base: oneto
47+
end
48+
4349

4450
include("interlace.jl")
45-
51+
4652

4753
cardinality(::FullSpace{<:AbstractFloat}) = ℵ₁
4854
cardinality(::EuclideanDomain) = ℵ₁
@@ -75,7 +81,7 @@ function adaptivetransform_ldiv(A::AbstractQuasiArray{U}, f::AbstractQuasiArray{
7581
tol = 20eps(real(T))
7682

7783
for n = 2 .^ (4:∞)
78-
An = A[:,OneTo(n)]
84+
An = A[:,oneto(n)]
7985
cfs = An \ f
8086
maxabsc = maximum(abs, cfs)
8187
if maxabsc == 0 && maxabsfr == 0
@@ -121,9 +127,9 @@ satisfying for `x in axes(P,1)`
121127
P[x,2] == (A[1]*x + B[1])*P[x,1]
122128
P[x,n+1] == (A[n]*x + B[n])*P[x,n] - C[n]*P[x,n-1]
123129
```
124-
Note that `C[1]`` is unused.
130+
Note that `C[1]`` is unused.
125131
126-
The relationship with the Jacobi matrix is:
132+
The relationship with the Jacobi matrix is:
127133
```julia
128134
1/A[n] == X[n+1,n]
129135
-B[n]/A[n] == X[n,n]
@@ -234,7 +240,7 @@ factorize(L::SubQuasiArray{T,2,<:OrthogonalPolynomial,<:Tuple{<:Inclusion,<:OneT
234240

235241
function factorize(L::SubQuasiArray{T,2,<:OrthogonalPolynomial,<:Tuple{<:Inclusion,<:AbstractUnitRange}}) where T
236242
_,jr = parentindices(L)
237-
ProjectionFactorization(factorize(parent(L)[:,Base.OneTo(maximum(jr))]), jr)
243+
ProjectionFactorization(factorize(parent(L)[:,oneto(maximum(jr))]), jr)
238244
end
239245

240246
function \(A::SubQuasiArray{<:Any,2,<:OrthogonalPolynomial}, B::SubQuasiArray{<:Any,2,<:OrthogonalPolynomial})

src/chebyshev.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ function \(w_A::WeightedChebyshevT, w_B::WeightedChebyshevU)
173173
_BandedMatrix(Vcat(Fill(one(T)/2, 1, ∞), Zeros{T}(1, ∞), Fill(-one(T)/2, 1, ∞)), ∞, 2, 0)
174174
end
175175

176+
\(T::ChebyshevT, U::ChebyshevU) = inv(U \ T)
176177

177178
####
178179
# interrelationships

src/clenshaw.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,17 @@ end
6767
getindex(P::OrthogonalPolynomial, x::Number, n::AbstractVector) = layout_getindex(P, x, n)
6868
getindex(P::OrthogonalPolynomial, x::AbstractVector, n::AbstractVector) = layout_getindex(P, x, n)
6969
getindex(P::SubArray{<:Any,1,<:OrthogonalPolynomial}, x::AbstractVector) = layout_getindex(P, x)
70-
getindex(P::OrthogonalPolynomial, x::Number, n::Number) = P[x,OneTo(n)][end]
70+
getindex(P::OrthogonalPolynomial, x::Number, n::Number) = P[x,oneto(n)][end]
7171

7272
unsafe_layout_getindex(A...) = sub_materialize(Base.unsafe_view(A...))
7373

7474
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, n::AbstractUnitRange) = unsafe_layout_getindex(P, x, n)
7575
Base.unsafe_getindex(P::OrthogonalPolynomial, x::AbstractVector, n::AbstractUnitRange) = unsafe_layout_getindex(P, x, n)
76-
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, n::AbstractVector) = Base.unsafe_getindex(P,x,OneTo(maximum(n)))[n]
77-
Base.unsafe_getindex(P::OrthogonalPolynomial, x::AbstractVector, n::AbstractVector) = Base.unsafe_getindex(P,x,OneTo(maximum(n)))[:,n]
76+
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, n::AbstractVector) = Base.unsafe_getindex(P,x,oneto(maximum(n)))[n]
77+
Base.unsafe_getindex(P::OrthogonalPolynomial, x::AbstractVector, n::AbstractVector) = Base.unsafe_getindex(P,x,oneto(maximum(n)))[:,n]
7878
Base.unsafe_getindex(P::OrthogonalPolynomial, x::AbstractVector, n::Number) = Base.unsafe_getindex(P, x, 1:n)[:,end]
7979
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, ::Colon) = Base.unsafe_getindex(P, x, axes(P,2))
80-
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, n::Number) = Base.unsafe_getindex(P,x,OneTo(n))[end]
80+
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, n::Number) = Base.unsafe_getindex(P,x,oneto(n))[end]
8181

8282
getindex(P::OrthogonalPolynomial, x::Number, jr::AbstractInfUnitRange{Int}) = view(P, x, jr)
8383
Base.unsafe_getindex(P::OrthogonalPolynomial{T}, x::Number, jr::AbstractInfUnitRange{Int}) where T =

src/hermite.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ struct Hermite{T} <: OrthogonalPolynomial{T} end
1212
Hermite() = Hermite{Float64}()
1313

1414
==(::Hermite, ::Hermite) = true
15-
axes(::Hermite{T}) where T = (Inclusion(ℝ), OneTo(∞))
15+
axes(::Hermite{T}) where T = (Inclusion(ℝ), oneto(∞))
1616

1717
# H_{n+1} = 2x H_n - 2n H_{n-1}
1818
# 1/2 * H_{n+1} + n H_{n-1} = x H_n

src/jacobi.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ WeightedJacobi(a,b) = JacobiWeight(a,b) .* Jacobi(a,b)
141141
WeightedJacobi{T}(a,b) where T = JacobiWeight{T}(a,b) .* Jacobi{T}(a,b)
142142

143143

144-
axes(::AbstractJacobi{T}) where T = (Inclusion{T}(ChebyshevInterval{real(T)}()), OneTo(∞))
144+
axes(::AbstractJacobi{T}) where T = (Inclusion{T}(ChebyshevInterval{real(T)}()), oneto(∞))
145145
==(P::Jacobi, Q::Jacobi) = P.a == Q.a && P.b == Q.b
146146
==(P::Legendre, Q::Jacobi) = Jacobi(P) == Q
147147
==(P::Jacobi, Q::Legendre) = P == Jacobi(Q)
@@ -276,6 +276,8 @@ function \(A::Jacobi, B::Jacobi)
276276
elseif A.b b+1
277277
J = Jacobi(a,b+1)
278278
(A \ J) * (J \ B)
279+
elseif isinteger(A.a-a) && isinteger(A.b-b)
280+
inv(B \ A)
279281
else
280282
error("not implemented for $A and $B")
281283
end

src/lanczos.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,12 @@ getindex(R::LanczosConversion, k::AbstractUnitRange, j::AbstractUnitRange) = _la
8282

8383
inv(R::LanczosConversion) = ApplyArray(inv, R)
8484

85+
86+
Base.BroadcastStyle(::Type{<:LanczosConversion}) = LazyArrays.LazyArrayStyle{2}()
87+
8588
struct LanczosConversionLayout <: AbstractLazyLayout end
89+
90+
LazyArrays.simplifiable(::Mul{LanczosConversionLayout,<:PaddedLayout}) = Val(true)
8691
function copy(M::Mul{LanczosConversionLayout,<:PaddedLayout})
8792
resizedata!(M.A.data, maximum(colsupport(M.B)))
8893
M.A.data.R * M.B
@@ -107,7 +112,7 @@ function sub_paddeddata(::LanczosConversionLayout, S::SubArray{<:Any,1,<:Abstrac
107112
P = parent(S)
108113
(kr,j) = parentindices(S)
109114
resizedata!(P.data, j)
110-
paddeddata(view(P.data.R, kr, j))
115+
paddeddata(view(UpperTriangular(P.data.R.data.data), kr, j))
111116
end
112117

113118
# struct LanczosJacobiMatrix{T,XX,WW} <: AbstractBandedMatrix{T}

src/ultraspherical.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ function \(U::Ultraspherical{<:Any,<:Integer}, C::ChebyshevU)
141141
U\Ultraspherical(C)
142142
end
143143

144+
\(T::Chebyshev, C::Ultraspherical) = inv(C \ T)
145+
144146
function \(C2::Ultraspherical{<:Any,<:Integer}, C1::Ultraspherical{<:Any,<:Integer})
145147
λ = C1.λ
146148
T = promote_type(eltype(C2), eltype(C1))
@@ -162,6 +164,11 @@ function \(C2::Ultraspherical, C1::Ultraspherical)
162164
_BandedMatrix( Vcat(-./ ((0:∞) .+ λ))', Zeros(1,∞), (λ ./ ((0:∞) .+ λ))'), ∞, 0, 2)
163165
elseif C2.λ == λ
164166
Eye{T}(∞)
167+
elseif isinteger(C2.λ-λ) && C2.λ > λ
168+
Cm = Ultraspherical{T}+1)
169+
(C2 \ Cm) * (Cm \ C1)
170+
elseif isinteger(C2.λ-λ)
171+
inv(C1 \ C2)
165172
else
166173
error("Not implemented")
167174
end

test/runtests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import ClassicalOrthogonalPolynomials: jacobimatrix, ∞, ChebyshevInterval, Leg
88
import LazyArrays: ApplyStyle, colsupport, MemoryLayout, arguments
99
import SemiseparableMatrices: VcatAlmostBandedLayout
1010
import QuasiArrays: MulQuasiMatrix
11-
import Base: OneTo
11+
import ClassicalOrthogonalPolynomials: oneto
1212
import InfiniteLinearAlgebra: KronTrav, Block
1313
import FastTransforms: clenshaw!
1414

0 commit comments

Comments
 (0)