From 302d0d1600aede2d307868bc7f523d2515a06f5e Mon Sep 17 00:00:00 2001 From: strickek Date: Tue, 15 Jan 2019 18:50:18 +0100 Subject: [PATCH 1/2] Implement new iteraterprotocol for RepeatedRangeMatrix Now about 12 times faster in 1.0 (same speed as 0.6) --- src/repeatedrange.jl | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/repeatedrange.jl b/src/repeatedrange.jl index 9c1dbc9..3baebc4 100644 --- a/src/repeatedrange.jl +++ b/src/repeatedrange.jl @@ -17,7 +17,6 @@ Base.IndexStyle(::Type{<:RepeatedRangeMatrix}) = IndexCartesian() if VERSION < v"0.7.0-DEV.5126" # This coupled iteration over the two fields is 10-20x faster than Cartesian iteration -# TODO: re-implement in the new iteration protocol @inline function Base.start(R::RepeatedRangeMatrix) is = start(R.r) idone = done(R.r, is) @@ -39,6 +38,29 @@ end return (val, (next(R.r, is), (j, js), false)) end @inline Base.done(R::RepeatedRangeMatrix, state) = state[end] + +else + +@inline function Base.iterate(R::RepeatedRangeMatrix) + j, js = iterate(R.r) + i, is = iterate(R.at) + return i + j, (is, j, js) +end + +@inline function Base.iterate(R::RepeatedRangeMatrix, state) + is, j, js = state + iit = iterate(R.r, is) + if iit === nothing + jit = iterate(R.at, js) + jit === nothing && return nothing + j, js = jit + i, is = iterate(R.r) + else + i, is = iit + end + return i + j, (is, j, js) +end + end # Scalar indexing From 435d6317694f1d13cd265dada9722aadc5df5ec9 Mon Sep 17 00:00:00 2001 From: strickek Date: Wed, 16 Jan 2019 10:32:07 +0100 Subject: [PATCH 2/2] Update repeatedrange.jl --- src/repeatedrange.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/repeatedrange.jl b/src/repeatedrange.jl index 3baebc4..ee700bd 100644 --- a/src/repeatedrange.jl +++ b/src/repeatedrange.jl @@ -42,8 +42,8 @@ end else @inline function Base.iterate(R::RepeatedRangeMatrix) - j, js = iterate(R.r) - i, is = iterate(R.at) + i, is = iterate(R.r) + j, js = iterate(R.at) return i + j, (is, j, js) end