Skip to content

Commit 1b419ff

Browse files
authored
Use lazy Cumsum for InfRanges (#35)
* Use lazy Cumsum for InfRanges * v0.7.2
1 parent 4645f9c commit 1b419ff

File tree

3 files changed

+35
-18
lines changed

3 files changed

+35
-18
lines changed

Project.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "InfiniteArrays"
22
uuid = "4858937d-0d70-526a-a4dd-2d5cb5dd786c"
3-
version = "0.7.1"
3+
version = "0.7.2"
44

55
[deps]
66
DSP = "717857b8-e6f2-59f4-9121-6e50c889abd2"
@@ -13,12 +13,12 @@ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
1313
[compat]
1414
DSP = "0.6"
1515
FillArrays = "0.8.10"
16-
LazyArrays = "0.16.11"
16+
LazyArrays = "0.16.12"
1717
julia = "1.2"
1818

1919
[extras]
20-
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
2120
BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
21+
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
2222
LazyBandedMatrices = "d7e5e226-e90b-4449-9968-0f923699bf6f"
2323
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
2424

src/infrange.jl

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ _range(a::AbstractFloat, ::Nothing, ::Nothing, len::Infinity) = _range(a
2828
_rangestyle(::Ordered, ::ArithmeticWraps, a::T, step::S, len::Infinity) where {T,S} =
2929
InfStepRange{T,S}(a, step)
3030
_rangestyle(::Ordered, ::ArithmeticUnknown, a::T, step::S, len::Infinity) where {T,S} =
31-
InfStepRange{T,S}(a, step)
31+
InfStepRange{T,S}(a, step)
3232
_range(a::T, st::T, ::Nothing, ::Infinity) where T<:Union{Float16,Float32,Float64} =
3333
InfStepRange{T,T}(a, st)
3434
_range(a::T, st::T, ::Nothing, ::Infinity) where T<:AbstractFloat =
@@ -395,7 +395,19 @@ broadcast(f, r::Adjoint{<:Any,<:InfRanges}, a::Number) = broadcast(f,parent(r),a
395395
broadcast(f, r::Transpose{<:Any,<:InfRanges}, a::Number) = transpose(broadcast(f,parent(r),a))
396396

397397

398-
cumsum(r::InfRanges) = OneToInf() .* (first(r) .+ r) 2
398+
# cumsum(r::InfRanges) = OneToInf() .* (first(r) .+ r) .÷ 2
399+
400+
cumsum(r::InfRanges) = Cumsum(r)
401+
function getindex(c::Cumsum{<:Integer,1,<:InfStepRange}, k::Integer)
402+
r = c.v
403+
k * (first(r) + r[k]) ÷ 2
404+
end
405+
function getindex(c::Cumsum{<:Integer,1,<:AbstractInfUnitRange}, k::Integer)
406+
r = c.v
407+
k * (2first(r) + k - 1) ÷ 2
408+
end
409+
getindex(c::Cumsum{<:Integer,1,<:OneToInf}, k::Integer) = k * (k+1) ÷ 2
410+
399411

400412
diff(r::InfRanges) = Fill(step(r),∞)
401413
diff(r::OneToInf{T}) where T = Ones{T}(∞)
@@ -418,22 +430,22 @@ conv(::Ones{Bool,1,<:Tuple{<:OneToInf}}, ::Ones{Bool,1,<:Tuple{<:OneToInf}}) =
418430
conv(::Ones{T,1,<:Tuple{<:OneToInf}}, ::Ones{V,1,<:Tuple{<:OneToInf}}) where {T,V} =
419431
one(promote_type(T,V)):
420432

421-
function conv(::Ones{T,1,<:Tuple{<:OneToInf}}, a::AbstractVector{V}) where {T,V}
433+
function conv(::Ones{T,1,<:Tuple{<:OneToInf}}, a::AbstractVector{V}) where {T,V}
422434
cs = cumsum(convert(AbstractVector{promote_type(T,V)}, a))
423435
Vcat(cs, Fill(last(cs), ∞))
424436
end
425437

426-
function conv(::Ones{T,1,<:Tuple{<:OneToInf}}, a::Vector{V}) where {T,V}
438+
function conv(::Ones{T,1,<:Tuple{<:OneToInf}}, a::Vector{V}) where {T,V}
427439
cs = cumsum(convert(AbstractVector{promote_type(T,V)}, a))
428440
Vcat(cs, Fill(last(cs), ∞))
429441
end
430442

431-
function conv(a::AbstractVector{V}, ::Ones{T,1,<:Tuple{<:OneToInf}}) where {T,V}
443+
function conv(a::AbstractVector{V}, ::Ones{T,1,<:Tuple{<:OneToInf}}) where {T,V}
432444
cs = cumsum(convert(AbstractVector{promote_type(T,V)}, a))
433445
Vcat(cs, Fill(last(cs), ∞))
434446
end
435447

436-
function conv(a::Vector{V}, ::Ones{T,1,<:Tuple{<:OneToInf}}) where {T,V}
448+
function conv(a::Vector{V}, ::Ones{T,1,<:Tuple{<:OneToInf}}) where {T,V}
437449
cs = cumsum(convert(AbstractVector{promote_type(T,V)}, a))
438450
Vcat(cs, Fill(last(cs), ∞))
439451
end
@@ -493,16 +505,16 @@ function _step_findfirst(p, r::InfStepRange{T,S}) where {T,S}
493505
end
494506

495507
for op in (:isequal, :(==))
496-
@eval begin
508+
@eval begin
497509
findfirst(p::Fix2{typeof($op),T}, r::InfStepRange{T,S}) where {T,S} =
498510
_step_findfirst(p, r)
499511

500-
findfirst(p::Fix2{typeof($op),T}, r::InfStepRange{T,<:Integer}) where {T<:Integer} =
512+
findfirst(p::Fix2{typeof($op),T}, r::InfStepRange{T,<:Integer}) where {T<:Integer} =
513+
_step_findfirst(p, r)
514+
515+
findfirst(p::Fix2{typeof($op),<:Integer}, r::InfStepRange{<:Integer,<:Integer}) =
501516
_step_findfirst(p, r)
502517

503-
findfirst(p::Fix2{typeof($op),<:Integer}, r::InfStepRange{<:Integer,<:Integer}) =
504-
_step_findfirst(p, r)
505-
506518
function findfirst(p::Fix2{typeof($op),<:Integer}, r::AbstractInfUnitRange{<:Integer})
507519
first(r) <= p.x || return nothing
508520
p.x - first(r) + 1
@@ -511,6 +523,6 @@ for op in (:isequal, :(==))
511523
findfirst(p::Fix2{typeof($op),<:Number}, r::AbstractInfUnitRange{<:Integer}) =
512524
isinteger(p.x) ? findfirst($op(convert(Integer, p.x)), r) : nothing
513525
findfirst(p::Fix2{typeof($op),<:Number}, r::InfStepRange{<:Integer,<:Integer}) =
514-
isinteger(p.x) ? findfirst($op(convert(V, p.x)), r) : nothing
526+
isinteger(p.x) ? findfirst($op(convert(V, p.x)), r) : nothing
515527
end
516528
end

test/runtests.jl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using LinearAlgebra, SparseArrays, InfiniteArrays, FillArrays, LazyArrays, Statistics, DSP, BandedMatrices, LazyBandedMatrices, Test, Base64
2-
import InfiniteArrays: OrientedInfinity, SignedInfinity, OneToInf, InfUnitRange, InfStepRange, OneToInf
2+
import InfiniteArrays: OrientedInfinity, SignedInfinity, InfUnitRange, InfStepRange, OneToInf
33
import LazyArrays: CachedArray, MemoryLayout, LazyLayout, DiagonalLayout, LazyArrayStyle, colsupport
44
import BandedMatrices: _BandedMatrix, BandedColumns
55
import Base.Broadcast: broadcasted, Broadcasted, instantiate
@@ -663,8 +663,13 @@ end
663663

664664
@test cumsum(x).args[2] 8:12
665665
@test last(y.args) == sum(x[1:9]):2:
666-
r = (3:4:∞)
667-
@test cumsum(r)[1:20] == cumsum(r[1:20])
666+
667+
for r in (3:4:∞, 2:∞, Base.OneTo(∞))
668+
c = cumsum(r)
669+
@test c isa Cumsum
670+
@test c[1:20] == [c[k] for k=1:20] == cumsum(r[1:20])
671+
@test c == c
672+
end
668673
end
669674

670675
@testset "Sub-array" begin

0 commit comments

Comments
 (0)