Skip to content

Commit dc22b7e

Browse files
authored
Merge pull request #60 from JuliaMath/mutate
Add mutating sequence
2 parents 325cb5b + e1241a4 commit dc22b7e

File tree

8 files changed

+45
-23
lines changed

8 files changed

+45
-23
lines changed

src/besseli.jl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ besseli(nu, x::Real) = _besseli(nu, float(x))
169169

170170
_besseli(nu::Union{Int16, Float16}, x::Union{Int16, Float16}) = Float16(_besseli(Float32(nu), Float32(x)))
171171

172+
_besseli(nu::AbstractRange, x::T) where T = besseli!(zeros(T, length(nu)), nu, x)
173+
172174
function _besseli(nu::T, x::T) where T <: Union{Float32, Float64}
173175
isinteger(nu) && return _besseli(Int(nu), x)
174176
~isfinite(x) && return x
@@ -206,11 +208,13 @@ function _besseli(nu::Integer, x::T) where T <: Union{Float32, Float64}
206208
end
207209
end
208210

209-
function _besseli(nu::AbstractRange, x::T) where T
211+
besseli!(out::DenseVector, nu::AbstractRange, x) = _besseli!(out, nu, float(x))
212+
213+
function _besseli!(out::DenseVector{T}, nu::AbstractRange, x::T) where T
210214
(nu[1] >= 0 && step(nu) == 1) || throw(ArgumentError("nu must be >= 0 with step(nu)=1"))
211-
len = length(nu)
212-
isone(len) && return [besseli(nu[1], x)]
213-
out = zeros(T, len)
215+
len = length(out)
216+
!isequal(len, length(nu)) && throw(ArgumentError("out and nu must have the same length"))
217+
214218
k = len
215219
inu = zero(T)
216220
while abs(inu) < floatmin(T)
@@ -225,8 +229,8 @@ function _besseli(nu::AbstractRange, x::T) where T
225229
end
226230
if k > 1
227231
out[k] = _besseli(nu[k], x)
228-
tmp = @view out[1:k+1]
229-
out[1:k+1] = besselk_down_recurrence!(tmp, x, nu[1:k+1])
232+
tmp = @view out[begin:k+1]
233+
besselk_down_recurrence!(tmp, x, nu[begin:k+1])
230234
return out
231235
else
232236
return out

src/besselj.jl

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ besselj(nu, x::Real) = _besselj(nu, float(x))
224224

225225
_besselj(nu::Union{Int16, Float16}, x::Union{Int16, Float16}) = Float16(_besselj(Float32(nu), Float32(x)))
226226

227+
_besselj(nu::AbstractRange, x::T) where T = besselj!(zeros(T, length(nu)), nu, x)
228+
227229
function _besselj(nu::T, x::T) where T <: Union{Float32, Float64}
228230
isinteger(nu) && return _besselj(Int(nu), x)
229231
abs_nu = abs(nu)
@@ -269,14 +271,17 @@ function _besselj(nu::Integer, x::T) where T <: Union{Float32, Float64}
269271
end
270272
end
271273

272-
function _besselj(nu::AbstractRange, x::T) where T
273-
(nu[1] >= 0 && step(nu) == 1) || throw(ArgumentError("nu must be >= 0 with step(nu)=1"))
274-
len = length(nu)
275-
isone(len) && return [besselj(nu[1], x)]
274+
besselj!(out::DenseVector, nu::AbstractRange, x) = _besselj!(out, nu, float(x))
275+
276+
function _besselj!(out::DenseVector{T}, nu::AbstractVector, x::T) where T <: Union{Float32, Float64}
277+
(nu[begin] >= 0 && step(nu) == 1) || throw(ArgumentError("nu must be >= 0 with step(nu)=1"))
278+
len = length(out)
279+
!isequal(len, length(nu)) && throw(ArgumentError("out and nu must have the same length"))
280+
281+
isone(len) && return [besselj(nu[begin], x)]
276282

277-
out = zeros(T, len)
278283
if nu[end] < x
279-
out[1], out[2] = _besselj(nu[1], x), _besselj(nu[2], x)
284+
out[begin], out[begin + 1] = _besselj(nu[begin], x), _besselj(nu[begin + 1], x)
280285
return besselj_up_recurrence!(out, x, nu)
281286
else
282287
k = len
@@ -293,8 +298,8 @@ function _besselj(nu::AbstractRange, x::T) where T
293298
end
294299
if k > 1
295300
out[k] = _besselj(nu[k], x)
296-
tmp = @view out[1:k+1]
297-
besselj_down_recurrence!(tmp, x, nu[1:k+1])
301+
tmp = @view out[begin:k+1]
302+
besselj_down_recurrence!(tmp, x, nu[begin:k+1])
298303
return out
299304
else
300305
return out

src/besselk.jl

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ besselk(nu, x::Real) = _besselk(nu, float(x))
191191

192192
_besselk(nu::Union{Int16, Float16}, x::Union{Int16, Float16}) = Float16(_besselk(Float32(nu), Float32(x)))
193193

194+
_besselk(nu::AbstractRange, x::T) where T = besselk!(zeros(T, length(nu)), nu, x)
195+
194196
function _besselk(nu::T, x::T) where T <: Union{Float32, Float64}
195197
isinteger(nu) && return _besselk(Int(nu), x)
196198
abs_nu = abs(nu)
@@ -216,11 +218,14 @@ function _besselk(nu::Integer, x::T) where T <: Union{Float32, Float64}
216218
end
217219
end
218220

219-
function _besselk(nu::AbstractRange, x::T) where T
221+
besselk!(out::DenseVector, nu::AbstractRange, x) = _besselk!(out, nu, float(x))
222+
223+
function _besselk!(out::DenseVector{T}, nu::AbstractRange, x::T) where T
220224
(nu[1] >= 0 && step(nu) == 1) || throw(ArgumentError("nu must be >= 0 with step(nu)=1"))
221-
len = length(nu)
225+
len = length(out)
226+
!isequal(len, length(nu)) && throw(ArgumentError("out and nu must have the same length"))
222227
isone(len) && return [besselk(nu[1], x)]
223-
out = zeros(T, len)
228+
224229
k = 1
225230
knu = zero(T)
226231
while abs(knu) < floatmin(T)
@@ -236,7 +241,7 @@ function _besselk(nu::AbstractRange, x::T) where T
236241
if k < len
237242
out[k] = _besselk(nu[k], x)
238243
tmp = @view out[k-1:end]
239-
out[k-1:end] = besselk_up_recurrence!(tmp, x, nu[k-1:end])
244+
besselk_up_recurrence!(tmp, x, nu[k-1:end])
240245
return out
241246
else
242247
return out

src/bessely.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ bessely(nu, x::Real) = _bessely(nu, float(x))
261261

262262
_bessely(nu::Union{Int16, Float16}, x::Union{Int16, Float16}) = Float16(_bessely(Float32(nu), Float32(x)))
263263

264+
_bessely(nu::AbstractRange, x::T) where T = bessely!(zeros(T, length(nu)), nu, x)
265+
264266
function _bessely(nu::T, x::T) where T <: Union{Float32, Float64}
265267
isnan(nu) || isnan(x) && return NaN
266268
isinteger(nu) && return _bessely(Int(nu), x)
@@ -310,10 +312,12 @@ function _bessely(nu::Integer, x::T) where T <: Union{Float32, Float64}
310312
end
311313
end
312314

313-
function _bessely(nu::AbstractRange, x::T) where T
314-
(nu[1] >= 0 && step(nu) == 1) || throw(ArgumentError("nu must be >= 0 with step(nu)=1"))
315-
out = Vector{T}(undef, length(nu))
316-
out[1], out[2] = _bessely(nu[1], x), _bessely(nu[2], x)
315+
bessely!(out::DenseVector, nu::AbstractRange, x) = _bessely!(out, nu, float(x))
316+
317+
function _bessely!(out::DenseVector{T}, nu::AbstractRange, x::T) where T
318+
(nu[begin] >= 0 && step(nu) == 1) || throw(ArgumentError("nu must be >= 0 with step(nu)=1"))
319+
!isequal(length(out), length(nu)) && throw(ArgumentError("out and nu must have the same length"))
320+
out[begin], out[begin + 1] = _bessely(nu[begin], x), _bessely(nu[begin + 1], x)
317321
return besselj_up_recurrence!(out, x, nu)
318322
end
319323

test/besseli_test.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ end
109109
# test nu_range
110110
@test besseli(0:250, 2.0) SpecialFunctions.besseli.(0:250, 2.0) rtol=1e-13
111111
@test besseli(0.5:1:10.5, 2.0) SpecialFunctions.besseli.(0.5:1:10.5, 2.0) rtol=1e-13
112+
@test Bessels.besseli!(zeros(Float64, 10), 1:10, 1.0) besseli(1:10, 1.0)
112113

113114
### need to fix method ambiguities for other functions ######
114115

test/besselj_test.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ end
124124
@test besselj(0:95, 100.0) SpecialFunctions.besselj.(0:95, 100.0) rtol=1e-11
125125
@test besselj(0.5:1:150.5, 2.0) SpecialFunctions.besselj.(0.5:1:150.5, 2.0) rtol=1e-11
126126
@test besselj(0.5:1:10.5, 40.0) SpecialFunctions.besselj.(0.5:1:10.5, 40.0) rtol=1e-11
127+
@test Bessels.besselj!(zeros(Float64, 10), 1:10, 1.0) besselj(1:10, 1.0)
127128

128129
# test Float16 and Float32
129130
@test besselj(Int16(10), Float16(1.0)) isa Float16

test/besselk_test.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ end
130130
@test besselk(0:50, 2.0) SpecialFunctions.besselk.(0:50, 2.0) rtol=1e-13
131131
@test besselk(0.5:1:10.5, 12.0) SpecialFunctions.besselk.(0.5:1:10.5, 12.0) rtol=1e-13
132132
@test besselk(1:700, 800.0) SpecialFunctions.besselk.(1:700, 800.0)
133+
@test Bessels.besselk!(zeros(Float64, 10), 1:10, 1.0) besselk(1:10, 1.0)
133134

134135
# test Float16
135136
@test besselk(Int16(10), Float16(1.0)) isa Float16

test/bessely_test.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ end
8888

8989
# test decimal orders
9090
# SpecialFunctions.jl can give errors over 1e-12 so need to soften tolerance to match
91-
# need to switch tests over to ArbNumerics.jl for better precision tests
91+
# need to switch tests over to ArbNumerics.jl for better precision tests
9292
x = [0.05, 0.1, 0.2, 0.25, 0.3, 0.4, 0.5,0.55, 0.6,0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.92, 0.95, 0.97, 0.99, 1.0, 1.01, 1.05, 1.08, 1.1, 1.2, 1.4, 1.5, 1.6, 1.8, 2.0, 2.5, 3.0, 4.0, 4.5, 4.99, 5.1]
9393
nu = [0.1, 0.4567, 0.8123, 1.5, 2.5, 4.1234, 6.8, 12.3, 18.9, 28.2345, 38.1235, 51.23, 72.23435, 80.5, 98.5, 104.2]
9494
for v in nu, xx in x
@@ -104,6 +104,7 @@ end
104104
@test bessely(0:50, 100.0) SpecialFunctions.bessely.(0:50, 100.0) rtol=1e-11
105105
@test bessely(0.5:1:10.5, 2.0) SpecialFunctions.bessely.(0.5:1:10.5, 2.0) rtol=1e-11
106106
@test bessely(0.5:1:10.5, 40.0) SpecialFunctions.bessely.(0.5:1:10.5, 40.0) rtol=1e-11
107+
@test Bessels.bessely!(zeros(Float64, 10), 1:10, 1.0) bessely(1:10, 1.0)
107108

108109
# test Float16
109110
@test bessely(Int16(10), Float16(1.0)) isa Float16

0 commit comments

Comments
 (0)