Skip to content

Commit 864d832

Browse files
authored
constprop in jacobi derivative (#170)
* constprop in jacobi derivative * specialize Derivative * Version bump to v0.6.2
1 parent 3ecea6c commit 864d832

File tree

3 files changed

+19
-8
lines changed

3 files changed

+19
-8
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ApproxFunOrthogonalPolynomials"
22
uuid = "b70543e2-c0d9-56b8-a290-0d4d6d4de211"
3-
version = "0.6.1"
3+
version = "0.6.2"
44

55
[deps]
66
ApproxFunBase = "fbd15aa5-315a-5a7d-a8a4-24992e37be05"

src/Spaces/Jacobi/JacobiOperators.jl

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

3-
function Derivative(J::Jacobi,k::Number)
3+
# specialize Derivative so that this is type-inferred even without constant propagation
4+
Derivative(J::Jacobi) = ConcreteDerivative(J,1)
5+
@inline function _Derivative(J::Jacobi, k::Number)
46
assert_integer(k)
57
k==1 ? ConcreteDerivative(J,1) :
68
DerivativeWrapper(
79
TimesOperator(
810
Derivative(Jacobi(J.b+1,J.a+1,J.domain),k-1),ConcreteDerivative(J,1)),
911
J, k)
1012
end
11-
13+
@static if VERSION >= v"1.8"
14+
Base.@constprop :aggressive Derivative(J::Jacobi, k::Number) =
15+
_Derivative(J, k)
16+
else
17+
Derivative(J::Jacobi, k::Number) = _Derivative(J, k)
18+
end
1219

1320

1421
rangespace(D::ConcreteDerivative{J}) where {J<:Jacobi}=Jacobi(D.space.b+D.order,D.space.a+D.order,domain(D))

test/JacobiTest.jl

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,19 @@ using StaticArrays: SVector
110110
end
111111

112112
@testset "Derivative" begin
113-
D=Derivative(Jacobi(0.,1.,Segment(1.,0.)))
113+
D = @inferred Derivative(Jacobi(0.,1.,Segment(1.,0.)))
114+
if VERSION >= v"1.8"
115+
D2 = @inferred (() -> Derivative(Jacobi(0.,1.,Segment(1.,0.)), 1))()
116+
@test D2 == D
117+
end
114118
@time testbandedoperator(D)
115119
# only one band should be populated
116120
@test bandwidths(D, 1) == -bandwidths(D, 2)
117121

118122
@testset for d in [-1..1, 0..1]
119123
f = Fun(x->x^2, Chebyshev(d))
120124
C = space(f)
121-
for J = Any[Jacobi(-0.5, -0.5, d), Legendre(d)]
125+
for J = (Jacobi(-0.5, -0.5, d), Legendre(d))
122126
g = (Derivative(J) * Conversion(C, J)) * f
123127
h = Derivative(C) * f
124128
@test g h
@@ -128,9 +132,9 @@ using StaticArrays: SVector
128132
@test g h
129133
end
130134
end
131-
@testset for S1 in Any[Jacobi(0,0),
132-
Jacobi(0,0,1..2), Jacobi(2,2,1..2), Jacobi(0.5,2.5,1..2)],
133-
S in Any[S1, NormalizedPolynomialSpace(S1)]
135+
@testset for S1 in (Jacobi(0,0), Jacobi(0,0,1..2),
136+
Jacobi(2,2,1..2), Jacobi(0.5,2.5,1..2)),
137+
S in (S1, NormalizedPolynomialSpace(S1))
134138
f = Fun(x->x^3 + 4x^2 + 2x + 6, S)
135139
@test Derivative(S) * f Fun(x->3x^2 + 8x + 2, S)
136140
@test Derivative(S)^2 * f Fun(x->6x+8, S)

0 commit comments

Comments
 (0)