Skip to content

Commit bada1ee

Browse files
authored
Concrete derivative in Jacobi space (#334)
1 parent 7cbbe4b commit bada1ee

File tree

4 files changed

+30
-46
lines changed

4 files changed

+30
-46
lines changed

src/Spaces/Jacobi/JacobiOperators.jl

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,21 @@
11
## Derivative
22

3-
# specialize Derivative so that this is type-inferred even without constant propagation
4-
Derivative(J::MaybeNormalized{<:Jacobi}) = ConcreteDerivative(J,1)
5-
@inline function _Derivative(J::Jacobi, k::Number)
3+
function Derivative(J::MaybeNormalized{<:Jacobi}, k::Number)
64
assert_integer(k)
7-
if k==1
8-
return ConcreteDerivative(J,1)
9-
else
10-
d = domain(J)
11-
v = [ConcreteDerivative(Jacobi(J.b+i-1, J.a+i-1, d)) for i in k:-1:1]
12-
DerivativeWrapper(TimesOperator(v), k, J)
13-
end
5+
return ConcreteDerivative(J,k)
146
end
15-
@static if VERSION >= v"1.8"
16-
Base.@constprop :aggressive Derivative(J::Jacobi, k::Number) =
17-
_Derivative(J, k)
18-
else
19-
Derivative(J::Jacobi, k::Number) = _Derivative(J, k)
20-
end
21-
227

238
rangespace(D::ConcreteDerivative{<:MaybeNormalized{<:Jacobi}}) = Jacobi(D.space.b+D.order,D.space.a+D.order,domain(D))
249
bandwidths(D::ConcreteDerivative{<:MaybeNormalized{<:Jacobi}}) = -D.order,D.order
2510
isdiag(D::ConcreteDerivative{<:MaybeNormalized{<:Jacobi}}) = false
2611

27-
getindex(T::ConcreteDerivative{<:Jacobi}, k::Integer, j::Integer) =
28-
j==k+1 ? eltype(T)((k+1+T.space.a+T.space.b)/complexlength(domain(T))) : zero(eltype(T))
12+
function getindex(D::ConcreteDerivative{<:Jacobi}, k::Integer, j::Integer)
13+
m = D.order
14+
sp = domainspace(D)
15+
a, b = sp.a, sp.b
16+
x = j + a + b
17+
j == k+m ? eltype(D)(pochhammer(x, m)/complexlength(domain(D))^m) : zero(eltype(D))
18+
end
2919

3020

3121
# Evaluation

test/ChebyshevTest.jl

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -302,16 +302,10 @@ include("testutils.jl")
302302
s1 = NormalizedChebyshev(-1..1)
303303
s2 = NormalizedChebyshev()
304304
@test s1 == s2
305-
D1 = if VERSION >= v"1.8"
306-
@inferred Derivative(s1)
307-
else
308-
Derivative(s1)
309-
end
310-
D2 = if VERSION >= v"1.8"
311-
@inferred Derivative(s2)
312-
else
313-
Derivative(s2)
314-
end
305+
306+
D1 = @inferred Derivative(s1)
307+
D2 = Derivative(s2)
308+
315309
@test D1 isa ApproxFunBase.ConcreteDerivative
316310
@test D2 isa ApproxFunBase.ConcreteDerivative
317311
@test !isdiag(D1)
@@ -323,13 +317,28 @@ include("testutils.jl")
323317
f2 = Fun(f, s2)
324318
@test f1 == f2
325319
@test D1 * f1 == D2 * f2
320+
@test D1 * f1 Fun(x -> 6x + 5, Chebyshev())
326321

327322
if VERSION < v"1.10-"
328323
ElT = @inferred (D1 -> eltype(D1 + D1))(D1)
329324
@test ElT == eltype(D1)
330325
else
331326
@test_broken @inferred((D1 -> eltype(D1 + D1))(D1)) == eltype(D1)
332327
end
328+
329+
ST = Chebyshev
330+
for d in ((), (0..1,))
331+
S1 = ST(d...)
332+
for S in (S1, NormalizedPolynomialSpace(S1))
333+
@test Derivative(S) == Derivative(S,1)
334+
@test Derivative(S)^2 == Derivative(S,2)
335+
f = Fun(x->x^3, S)
336+
@test Derivative(S) * f Fun(x->3x^2, S)
337+
@test Derivative(S,2) * f Fun(x->6x, S)
338+
@test Derivative(S,3) * f Fun(x->6, S)
339+
@test Derivative(S,4) * f zeros(S)
340+
end
341+
end
333342
end
334343

335344
@testset "space promotion" begin

test/JacobiTest.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -792,15 +792,15 @@ include("testutils.jl")
792792
@test Derivative() * g == Derivative() * Fun(space(g), collect(coefficients(g)))
793793
@static if isdefined(FillArrays, :OneElement)
794794
if coefficients(g) isa OneElement
795-
@test_broken coefficients(Derivative() * g) isa OneElement
795+
@test coefficients(Derivative() * g) isa OneElement
796796
end
797797
end
798798

799799
g = NormalizedJacobi(1,2.5)(3)
800800
@test Derivative() * g == Derivative() * Fun(space(g), collect(coefficients(g)))
801801
@static if isdefined(FillArrays, :OneElement)
802802
if coefficients(g) isa OneElement
803-
@test_broken coefficients(Derivative() * g) isa OneElement
803+
@test coefficients(Derivative() * g) isa OneElement
804804
end
805805
end
806806
end

test/MiscAFBTest.jl

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,21 +253,6 @@ Base.:(==)(a::UniqueInterval, b::UniqueInterval) = (@assert a.parentinterval ==
253253

254254
@testset "Derivative" begin
255255
@test Derivative() == Derivative()
256-
for d in Any[(), (0..1,)]
257-
for ST in Any[Chebyshev, Legendre,
258-
(x...) -> Jacobi(2,2,x...), (x...) -> Jacobi(1.5,2.5,x...)]
259-
S1 = ST(d...)
260-
@testset for S in [S1, NormalizedPolynomialSpace(S1)]
261-
@test Derivative(S) == Derivative(S,1)
262-
@test Derivative(S)^2 == Derivative(S,2)
263-
f = Fun(x->x^3, S)
264-
@test Derivative(S) * f Fun(x->3x^2, S)
265-
@test Derivative(S,2) * f Fun(x->6x, S)
266-
@test Derivative(S,3) * f Fun(x->6, S)
267-
@test Derivative(S,4) * f zeros(S)
268-
end
269-
end
270-
end
271256
@test Derivative(Chebyshev()) != Derivative(Chebyshev(), 2)
272257
@test Derivative(Chebyshev()) != Derivative(Legendre())
273258
end

0 commit comments

Comments
 (0)