Skip to content

Commit 6a73f96

Browse files
committed
Improve singularities behaviour
1 parent b31ffe2 commit 6a73f96

File tree

3 files changed

+18
-21
lines changed

3 files changed

+18
-21
lines changed

src/ClassicalOrthogonalPolynomials.jl

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -201,21 +201,19 @@ recurrencecoefficients(Q) = recurrencecoefficients_layout(MemoryLayout(Q), Q)
201201
gives the singularity structure of an expansion, e.g.,
202202
`JacobiWeight`.
203203
"""
204-
singularities(::AbstractWeightLayout, w) = w
205-
singularities(lay::BroadcastLayout, a) = singularitiesbroadcast(call(a), map(singularities, arguments(lay, a))...)
206-
singularities(::WeightedBasisLayouts, a) = singularities(BroadcastLayout{typeof(*)}(), a)
207-
singularities(::WeightedOPLayout, a) = singularities(weight(a))
208-
singularities(w) = singularities(MemoryLayout(w), w)
209-
singularities(::ExpansionLayout, f) = singularities(basis(f))
204+
singularities_layout(lay::BroadcastLayout, a) = singularitiesbroadcast(call(a), map(singularities, arguments(lay, a))...)
205+
singularities_layout(::WeightedBasisLayouts, a) = singularities(BroadcastLayout{typeof(*)}(), a)
206+
singularities_layout(::WeightedOPLayout, a) = singularities(weight(a))
207+
singularities_layout(::ExpansionLayout, f) = singularities(basis(f))
208+
singularities_layout(::PolynomialLayout, a) = NoSingularities()
209+
singularities(w) = singularities_layout(MemoryLayout(w), w)
210210

211211
singularitiesview(w, ::Inclusion) = w # for now just assume it doesn't change
212212
singularitiesview(w, ind) = view(w, ind)
213213
singularities(S::SubQuasiArray) = singularitiesview(singularities(parent(S)), parentindices(S)[1])
214214

215215
struct NoSingularities end
216216

217-
basis_singularities(ax, ::NoSingularities) = basis(ax)
218-
basis_singularities(ax, sing) = basis_singularities(sing)
219217
basis_axes(ax::Inclusion{<:Any,<:AbstractInterval}, v) = convert(AbstractQuasiMatrix{eltype(v)}, basis_singularities(ax, singularities(v)))
220218

221219

src/classical/jacobi.jl

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,23 +54,24 @@ hasboundedendpoints(w::AbstractJacobiWeight) = w.a ≥ 0 && w.b ≥ 0
5454
singularities(a::AbstractAffineQuasiVector) = singularities(a.x)
5555

5656

57+
singularities(w::JacobiWeight) = w
58+
59+
5760
## default is to just assume no singularities
5861
singularitiesbroadcast(_...) = NoSingularities()
5962

6063
for op in (:+, :*)
6164
@eval singularitiesbroadcast(::typeof($op), A, B, C, D...) = singularitiesbroadcast(*, singularitiesbroadcast(*, A, B), C, D...)
6265
end
6366

64-
singularitiesbroadcast(::typeof(*), V::Union{NoSingularities,SubQuasiArray}...) = singularitiesbroadcast(*, map(_parent,V)...)[_parentindices(V...)...]
67+
singularitiesbroadcast(::typeof(*), V::SubQuasiArray...) = singularitiesbroadcast(*, map(parent,V)...)[parentindices(V...)...]
68+
6569

6670

67-
_parent(::NoSingularities) = NoSingularities()
68-
_parent(a) = parent(a)
69-
_parentindices(a::NoSingularities, b...) = _parentindices(b...)
70-
_parentindices(a, b...) = parentindices(a)
7171
# for singularitiesbroadcast(literal_pow), ^, ...)
7272
singularitiesbroadcast(F::Function, G::Function, V::SubQuasiArray, K) = singularitiesbroadcast(F, G, parent(V), K)[parentindices(V)...]
73-
singularitiesbroadcast(F, V::Union{NoSingularities,SubQuasiArray}...) = singularitiesbroadcast(F, map(_parent,V)...)[_parentindices(V...)...]
73+
singularitiesbroadcast(F, V::SubQuasiArray...) = singularitiesbroadcast(F, map(parent,V)...)[parentindices(V...)...]
74+
singularitiesbroadcast(F, V::NoSingularities...) = NoSingularities() # default is to assume smooth
7475

7576

7677
abstract type AbstractJacobi{T} <: OrthogonalPolynomial{T} end
@@ -107,10 +108,11 @@ AbstractQuasiMatrix{T}(w::Jacobi) where T = Jacobi{T}(w.a, w.b)
107108

108109
jacobi(a,b) = Jacobi(a,b)
109110
jacobi(a,b, d::AbstractInterval{T}) where T = Jacobi{float(promote_type(eltype(a),eltype(b),T))}(a,b)[affine(d,ChebyshevInterval{T}()), :]
111+
jacobi(a,b, d::ChebyshevInterval{T}) where T = Jacobi{float(promote_type(eltype(a),eltype(b),T))}(a,b)
110112

111113
Jacobi(P::Legendre{T}) where T = Jacobi(zero(T), zero(T))
112114

113-
basis_singularities(w::JacobiWeight) = Weighted(Jacobi(w.a, w.b))
115+
114116

115117

116118
"""

src/classical/legendre.jl

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,10 @@ end
3838
singularitiesbroadcast(::typeof(^), L::LegendreWeight, ::NoSingularities) = L
3939
singularitiesbroadcast(::typeof(/), ::NoSingularities, L::LegendreWeight) = L # can't find roots
4040

41-
singularities(::AbstractJacobi{T}) where T = LegendreWeight{T}()
42-
singularities(::Inclusion{T,<:ChebyshevInterval}) where T = LegendreWeight{T}()
43-
singularities(d::Inclusion{T,<:AbstractInterval}) where T = LegendreWeight{T}()[affine(d,ChebyshevInterval{T}())]
44-
singularities(::AbstractFillLayout, P) = LegendreWeight{eltype(P)}()
4541

46-
basis_singularities(::LegendreWeight{T}) where T = Legendre{T}()
47-
basis_singularities(v::SubQuasiArray) = view(basis_singularities(parent(v)), parentindices(v)[1], :)
42+
singularities(::AbstractFillLayout, P) = LegendreWeight{eltype(P)}()
43+
singularities(::Legendre) = NoSingularities()
44+
basis_singularities(ax::Inclusion, ::NoSingularities) = legendre(ax)
4845

4946
struct Legendre{T} <: AbstractJacobi{T} end
5047
Legendre() = Legendre{Float64}()

0 commit comments

Comments
 (0)