Skip to content

Commit c068d2b

Browse files
authored
Allocation free evaluations (#140) (#141)
* Allocation free evaluations (#140) * Update ci.yml * Update test_chebyshev.jl
1 parent 526dc6d commit c068d2b

File tree

3 files changed

+10
-3
lines changed

3 files changed

+10
-3
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
fail-fast: false
1111
matrix:
1212
version:
13-
- '^1.9.0-0'
13+
- '1.9'
1414
os:
1515
- ubuntu-latest
1616
- macOS-latest

src/clenshaw.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ _p0(A) = one(eltype(A))
1414
function initiateforwardrecurrence(N, A, B, C, x, μ)
1515
T = promote_type(eltype(A), eltype(B), eltype(C), typeof(x))
1616
p0 = convert(T, μ)
17+
N == 0 && return zero(T), p0
1718
p1 = convert(T, muladd(A[1],x,B[1])*p0)
1819
@inbounds for n = 2:N
1920
p1,p0 = _forwardrecurrence_next(n, A, B, C, x, p0, p1),p1
@@ -69,7 +70,11 @@ end
6970
getindex(P::OrthogonalPolynomial, x::Number, n::AbstractVector) = layout_getindex(P, x, n)
7071
getindex(P::OrthogonalPolynomial, x::AbstractVector, n::AbstractVector) = layout_getindex(P, x, n)
7172
getindex(P::SubArray{<:Any,1,<:OrthogonalPolynomial}, x::AbstractVector) = layout_getindex(P, x)
72-
getindex(P::OrthogonalPolynomial, x::Number, n::Number) = P[x,oneto(n)][end]
73+
Base.@propagate_inbounds function getindex(P::OrthogonalPolynomial, x::Number, n::Number)
74+
@boundscheck checkbounds(P, x, n)
75+
Base.unsafe_getindex(P, x, n)
76+
end
77+
7378

7479
unsafe_layout_getindex(A...) = sub_materialize(Base.unsafe_view(A...))
7580

@@ -79,7 +84,7 @@ Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, n::AbstractVector) = Ba
7984
Base.unsafe_getindex(P::OrthogonalPolynomial, x::AbstractVector, n::AbstractVector) = Base.unsafe_getindex(P,x,oneto(maximum(n)))[:,n]
8085
Base.unsafe_getindex(P::OrthogonalPolynomial, x::AbstractVector, n::Number) = Base.unsafe_getindex(P, x, 1:n)[:,end]
8186
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, ::Colon) = Base.unsafe_getindex(P, x, axes(P,2))
82-
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, n::Number) = Base.unsafe_getindex(P,x,oneto(n))[end]
87+
Base.unsafe_getindex(P::OrthogonalPolynomial, x::Number, n::Number) = initiateforwardrecurrence(n-1, recurrencecoefficients(P)..., x, _p0(P))[end]
8388

8489
getindex(P::OrthogonalPolynomial, x::Number, jr::AbstractInfUnitRange{Int}) = view(P, x, jr)
8590
getindex(P::OrthogonalPolynomial, x::AbstractVector, jr::AbstractInfUnitRange{Int}) = view(P, x, jr)

test/test_chebyshev.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import ContinuumArrays: MappedWeightedBasisLayout, Map, WeightedBasisLayout
3838
@test axes(T[1:1,:]) === (oneto(1), oneto(∞))
3939
@test T[1:1,:][:,1:5] == ones(1,5)
4040
@test T[0.1,:][1:10] T[0.1,1:10] (T')[1:10,0.1]
41+
@test T[0.1,10] cos(9acos(0.1))
42+
@test @allocated(T[0.1,10]) 32
4143

4244
@testset "inf-range-indexing" begin
4345
@test T[[begin,end],2:∞][:,2:5] == T[[-1,1],3:6]

0 commit comments

Comments
 (0)