Skip to content

Commit 5788c9f

Browse files
committed
work on singularities
1 parent 6a73f96 commit 5788c9f

File tree

7 files changed

+18
-14
lines changed

7 files changed

+18
-14
lines changed

src/ClassicalOrthogonalPolynomials.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,14 +205,17 @@ singularities_layout(lay::BroadcastLayout, a) = singularitiesbroadcast(call(a),
205205
singularities_layout(::WeightedBasisLayouts, a) = singularities(BroadcastLayout{typeof(*)}(), a)
206206
singularities_layout(::WeightedOPLayout, a) = singularities(weight(a))
207207
singularities_layout(::ExpansionLayout, f) = singularities(basis(f))
208-
singularities_layout(::PolynomialLayout, a) = NoSingularities()
208+
singularities_layout(lay, a) = NoSingularities() # assume no singularities
209209
singularities(w) = singularities_layout(MemoryLayout(w), w)
210210

211+
struct NoSingularities end
212+
211213
singularitiesview(w, ::Inclusion) = w # for now just assume it doesn't change
212214
singularitiesview(w, ind) = view(w, ind)
215+
singularitiesview(::NoSingularities, ind) = NoSingularities()
216+
singularitiesview(::NoSingularities, ::Inclusion) = NoSingularities()
213217
singularities(S::SubQuasiArray) = singularitiesview(singularities(parent(S)), parentindices(S)[1])
214218

215-
struct NoSingularities end
216219

217220
basis_axes(ax::Inclusion{<:Any,<:AbstractInterval}, v) = convert(AbstractQuasiMatrix{eltype(v)}, basis_singularities(ax, singularities(v)))
218221

src/choleskyQR.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ orthogonalityweight(Q::ConvertedOrthogonalPolynomial) = Q.weight
1919
# transform to P * U if needed for differentiation, etc.
2020
arguments(::ApplyLayout{typeof(*)}, Q::ConvertedOrthogonalPolynomial) = Q.P, ApplyArray(inv, Q.U)
2121

22-
OrthogonalPolynomial(w::AbstractQuasiVector) = OrthogonalPolynomial(w, orthogonalpolynomial(singularities(w)))
22+
OrthogonalPolynomial(w::AbstractQuasiVector) = OrthogonalPolynomial(w, orthogonalpolynomial(axes(w,1), singularities(w)))
2323
function OrthogonalPolynomial(w::AbstractQuasiVector, P::AbstractQuasiMatrix)
2424
Q = normalized(P)
2525
X = cholesky_jacobimatrix(w, Q)
@@ -32,6 +32,9 @@ orthogonalpolynomial(w::SubQuasiArray) = orthogonalpolynomial(parent(w))[parenti
3232
OrthogonalPolynomial(w::Function, P::AbstractQuasiMatrix) = OrthogonalPolynomial(w.(axes(P,1)), P)
3333
orthogonalpolynomial(w::Function, P::AbstractQuasiMatrix) = orthogonalpolynomial(w.(axes(P,1)), P)
3434

35+
orthogonalpolynomial(ax, ::NoSingularities) = legendre(ax)
36+
orthogonalpolynomial(ax, w) = orthogonalpolynomial(w)
37+
3538

3639
"""
3740
cholesky_jacobimatrix(w, P)

src/classical/jacobi.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,18 @@ singularities(a::AbstractAffineQuasiVector) = singularities(a.x)
5656

5757
singularities(w::JacobiWeight) = w
5858

59-
6059
## default is to just assume no singularities
6160
singularitiesbroadcast(_...) = NoSingularities()
6261

6362
for op in (:+, :*)
6463
@eval singularitiesbroadcast(::typeof($op), A, B, C, D...) = singularitiesbroadcast(*, singularitiesbroadcast(*, A, B), C, D...)
64+
@eval singularitiesbroadcast(::typeof($op), ::NoSingularities, ::NoSingularities) = NoSingularities()
65+
@eval singularitiesbroadcast(::typeof($op), ::NoSingularities, ::NoSingularities, ::NoSingularities) = NoSingularities()
6566
end
6667

6768
singularitiesbroadcast(::typeof(*), V::SubQuasiArray...) = singularitiesbroadcast(*, map(parent,V)...)[parentindices(V...)...]
68-
69+
singularitiesbroadcast(::typeof(*), ::NoSingularities, b) = b
70+
singularitiesbroadcast(::typeof(*), a, ::NoSingularities) = a
6971

7072

7173
# for singularitiesbroadcast(literal_pow), ^, ...)
@@ -90,9 +92,6 @@ size(P::JacobiTransformPlan, k...) = size(P.chebtransform, k...)
9092

9193
include("legendre.jl")
9294

93-
singularitiesbroadcast(::typeof(*), ::LegendreWeight, b::AbstractJacobiWeight) = b
94-
singularitiesbroadcast(::typeof(*), a::AbstractJacobiWeight, ::LegendreWeight) = a
95-
9695

9796
struct Jacobi{T} <: AbstractJacobi{T}
9897
a::T

src/classical/legendre.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ singularitiesbroadcast(::typeof(/), ::NoSingularities, L::LegendreWeight) = L #
4040

4141

4242
singularities(::AbstractFillLayout, P) = LegendreWeight{eltype(P)}()
43-
singularities(::Legendre) = NoSingularities()
4443
basis_singularities(ax::Inclusion, ::NoSingularities) = legendre(ax)
4544

4645
struct Legendre{T} <: AbstractJacobi{T} end

src/lanczos.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ function LanczosPolynomial(w_in::AbstractQuasiVector, P::AbstractQuasiMatrix)
165165
LanczosPolynomial(w, Q, LanczosData(w, Q))
166166
end
167167

168-
LanczosPolynomial(w::AbstractQuasiVector) = LanczosPolynomial(w, normalized(orthogonalpolynomial(singularities(w))))
168+
LanczosPolynomial(w::AbstractQuasiVector) = LanczosPolynomial(w, normalized(orthogonalpolynomial(axes(w,1), singularities(w))))
169169

170170
==(A::LanczosPolynomial, B::LanczosPolynomial) = A.w == B.w
171171
==(::LanczosPolynomial, ::OrthogonalPolynomial) = false # TODO: fix

test/runtests.jl

Lines changed: 3 additions & 3 deletions
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 ClassicalOrthogonalPolynomials: oneto
11+
import ClassicalOrthogonalPolynomials: oneto, NoSingularities
1212
import InfiniteLinearAlgebra: KronTrav, Block
1313
import FastTransforms: clenshaw!
1414

@@ -18,15 +18,15 @@ Random.seed!(0)
1818
x = Inclusion(ChebyshevInterval())
1919
@test singularities(x) == singularities(exp.(x)) == singularities(x.^2) ==
2020
singularities(x .+ 1) == singularities(1 .+ x) == singularities(x .+ x) ==
21-
LegendreWeight()
21+
NoSingularities()
2222
@test singularities(exp.(x) .* JacobiWeight(0.1,0.2)) ==
2323
singularities(JacobiWeight(0.1,0.2) .* exp.(x)) ==
2424
JacobiWeight(0.1,0.2)
2525

2626
x = Inclusion(0..1)
2727
@test singularities(x) == singularities(exp.(x)) == singularities(x.^2) ==
2828
singularities(x .+ 1) == singularities(1 .+ x) == singularities(x .+ x) ==
29-
legendreweight(0..1)
29+
NoSingularities()
3030
end
3131

3232
include("test_chebyshev.jl")

test/test_chebyshev.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ ContinuumArrays.invmap(::InvQuadraticMap{T}) where T = QuadraticMap{T}()
612612
g = chebyshevt(0..1) * [1:3; zeros(∞)]
613613
@test_broken (f + g)[0.1] f[0.1] + g[0.1] # ContinuumArrays needs to check maps are equal
614614

615-
@test ClassicalOrthogonalPolynomials.singularities(T) === LegendreWeight()[QuadraticMap()]
615+
@test ClassicalOrthogonalPolynomials.singularities(T) isa NoSingularities
616616
end
617617

618618
@testset "block structure" begin

0 commit comments

Comments
 (0)