From a90cfdd44ad9e870a2af462879400cdb05652fc7 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra Date: Sat, 17 Oct 2020 20:30:44 +0530 Subject: [PATCH 1/7] unthunk `getindex` and `iterate` on `Composite` objects --- src/differentials/composite.jl | 6 ++++-- test/differentials/composite.jl | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/differentials/composite.jl b/src/differentials/composite.jl index 98a56e259..184131d4e 100644 --- a/src/differentials/composite.jl +++ b/src/differentials/composite.jl @@ -67,7 +67,7 @@ Base.convert(::Type{<:NamedTuple}, comp::Composite{<:Any, <:NamedTuple}) = backi Base.convert(::Type{<:Tuple}, comp::Composite{<:Any, <:Tuple}) = backing(comp) Base.convert(::Type{<:Dict}, comp::Composite{<:Dict, <:Dict}) = backing(comp) -Base.getindex(comp::Composite, idx) = getindex(backing(comp), idx) +Base.getindex(comp::Composite, idx) = unthunk(getindex(backing(comp), idx)) # for Tuple Base.getproperty(comp::Composite, idx::Int) = unthunk(getproperty(backing(comp), idx)) @@ -82,7 +82,9 @@ end Base.keys(comp::Composite) = keys(backing(comp)) Base.propertynames(comp::Composite) = propertynames(backing(comp)) -Base.iterate(comp::Composite, args...) = iterate(backing(comp), args...) +Base.iterate(comp::Composite) = iterate(comp, 1) +Base.iterate(comp::Composite, args...) = (getindex(comp, args[1]), args[1] + 1) +#Base.iterate(comp::Composite, args...) = iterate(backing(comp), args...) Base.length(comp::Composite) = length(backing(comp)) Base.eltype(::Type{<:Composite{<:Any, T}}) where T = eltype(T) diff --git a/test/differentials/composite.jl b/test/differentials/composite.jl index cb872e9a3..4278bcc92 100644 --- a/test/differentials/composite.jl +++ b/test/differentials/composite.jl @@ -55,6 +55,8 @@ end @test getproperty(Composite{Tuple{Float64,}}(2.0), 1) == 2.0 @test getproperty(Composite{Tuple{Float64,}}(@thunk 2.0^2), 1) == 4.0 @test getproperty(Composite{Tuple{Float64,}}(a=(@thunk 2.0^2),), :a) == 4.0 + @test getindex(Composite{Tuple{Float64,}}(@thunk 2.0^2), 1) == 4.0 + @test getindex(Composite{Tuple{Float64,}}(a=(@thunk 2.0^2),), 1) @test length(Composite{Foo}(x=2.5)) == 1 @test length(Composite{Tuple{Float64,}}(2.0)) == 1 From ed24d9705fdf7d88ed36a50df2a0ce4a60b0729b Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra Date: Sun, 18 Oct 2020 14:57:00 +0530 Subject: [PATCH 2/7] add changes to composite.jl --- src/differentials/composite.jl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/differentials/composite.jl b/src/differentials/composite.jl index 184131d4e..a37f948b0 100644 --- a/src/differentials/composite.jl +++ b/src/differentials/composite.jl @@ -83,8 +83,16 @@ Base.keys(comp::Composite) = keys(backing(comp)) Base.propertynames(comp::Composite) = propertynames(backing(comp)) Base.iterate(comp::Composite) = iterate(comp, 1) -Base.iterate(comp::Composite, args...) = (getindex(comp, args[1]), args[1] + 1) -#Base.iterate(comp::Composite, args...) = iterate(backing(comp), args...) + +function Base.iterate(comp::Composite, args...) + idx = args[1] + if idx <= length(comp) + return (getindex(comp, args[1]), args[1] + 1) + else + return nothing + end +end + Base.length(comp::Composite) = length(backing(comp)) Base.eltype(::Type{<:Composite{<:Any, T}}) where T = eltype(T) From c10fc3aa0a1a349afa96cac9d28d6a7b223271fb Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra Date: Sun, 18 Oct 2020 15:26:11 +0530 Subject: [PATCH 3/7] fix test for composite.jl --- src/differentials/composite.jl | 2 +- test/differentials/composite.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/differentials/composite.jl b/src/differentials/composite.jl index a37f948b0..37874ad51 100644 --- a/src/differentials/composite.jl +++ b/src/differentials/composite.jl @@ -87,7 +87,7 @@ Base.iterate(comp::Composite) = iterate(comp, 1) function Base.iterate(comp::Composite, args...) idx = args[1] if idx <= length(comp) - return (getindex(comp, args[1]), args[1] + 1) + return (getindex(comp, idx), idx + 1) else return nothing end diff --git a/test/differentials/composite.jl b/test/differentials/composite.jl index 4278bcc92..d57a99e7a 100644 --- a/test/differentials/composite.jl +++ b/test/differentials/composite.jl @@ -56,7 +56,7 @@ end @test getproperty(Composite{Tuple{Float64,}}(@thunk 2.0^2), 1) == 4.0 @test getproperty(Composite{Tuple{Float64,}}(a=(@thunk 2.0^2),), :a) == 4.0 @test getindex(Composite{Tuple{Float64,}}(@thunk 2.0^2), 1) == 4.0 - @test getindex(Composite{Tuple{Float64,}}(a=(@thunk 2.0^2),), 1) + @test getindex(Composite{Tuple{Float64,}}(a=(@thunk 2.0^2),), 1) == 4.0 @test length(Composite{Foo}(x=2.5)) == 1 @test length(Composite{Tuple{Float64,}}(2.0)) == 1 From a7caf9d7f3b04c999e7de23c6d78a1d522d71e6e Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra Date: Sun, 18 Oct 2020 15:47:30 +0530 Subject: [PATCH 4/7] add test case for `iterate` on thunk object --- test/differentials/composite.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/differentials/composite.jl b/test/differentials/composite.jl index d57a99e7a..20af36c23 100644 --- a/test/differentials/composite.jl +++ b/test/differentials/composite.jl @@ -67,6 +67,8 @@ end # Testing iterate via collect @test collect(Composite{Foo}(x=2.5)) == [2.5] @test collect(Composite{Tuple{Float64,}}(2.0)) == [2.0] + @test collect(Float64, Composite{Tuple{Float64,}}(@thunk 2.0^2)) == [4.0] + @test collect(Float64, Composite{Tuple{Float64,}}(a=(@thunk 2.0^2),)) == [4.0] end @testset "unset properties" begin From 9f0a2dc8c36e592a365e6d0c0f1e592cc507edac Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra Date: Sun, 18 Oct 2020 16:45:31 +0530 Subject: [PATCH 5/7] fix signature of `iterate` --- src/differentials/composite.jl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/differentials/composite.jl b/src/differentials/composite.jl index 37874ad51..3c514f715 100644 --- a/src/differentials/composite.jl +++ b/src/differentials/composite.jl @@ -84,10 +84,9 @@ Base.propertynames(comp::Composite) = propertynames(backing(comp)) Base.iterate(comp::Composite) = iterate(comp, 1) -function Base.iterate(comp::Composite, args...) - idx = args[1] - if idx <= length(comp) - return (getindex(comp, idx), idx + 1) +function Base.iterate(comp::Composite, state::Integer) + if state <= length(comp) + return (getindex(comp, state), state + 1) else return nothing end From fb86f1a0630b3eb9c5107a958c18f74cec1eefd7 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra Date: Tue, 20 Oct 2020 17:56:49 +0530 Subject: [PATCH 6/7] use different approach for iterate --- src/differentials/composite.jl | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/differentials/composite.jl b/src/differentials/composite.jl index 3c514f715..8d726099c 100644 --- a/src/differentials/composite.jl +++ b/src/differentials/composite.jl @@ -82,13 +82,12 @@ end Base.keys(comp::Composite) = keys(backing(comp)) Base.propertynames(comp::Composite) = propertynames(backing(comp)) -Base.iterate(comp::Composite) = iterate(comp, 1) - -function Base.iterate(comp::Composite, state::Integer) - if state <= length(comp) - return (getindex(comp, state), state + 1) +function Base.iterate(comp::Composite, args...) + out = iterate(backing(comp), args...) + if out isa Nothing + return out else - return nothing + return (unthunk(out[1]), out[2]) end end From c3ac7907b4391dbbeb1e917460b5c17bbb01c498 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra Date: Fri, 23 Oct 2020 16:23:04 +0530 Subject: [PATCH 7/7] add iterating support for Dict with thunk values --- src/differentials/composite.jl | 7 ++++++- test/differentials/composite.jl | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/differentials/composite.jl b/src/differentials/composite.jl index 8d726099c..999234f8c 100644 --- a/src/differentials/composite.jl +++ b/src/differentials/composite.jl @@ -87,7 +87,12 @@ function Base.iterate(comp::Composite, args...) if out isa Nothing return out else - return (unthunk(out[1]), out[2]) + element, next_state = out + if comp isa Composite{<:Dict, <:Dict} + return (Pair(element.first, unthunk(element.second)), next_state) + else + return (unthunk(element), next_state) + end end end diff --git a/test/differentials/composite.jl b/test/differentials/composite.jl index 20af36c23..f34d3537f 100644 --- a/test/differentials/composite.jl +++ b/test/differentials/composite.jl @@ -69,6 +69,7 @@ end @test collect(Composite{Tuple{Float64,}}(2.0)) == [2.0] @test collect(Float64, Composite{Tuple{Float64,}}(@thunk 2.0^2)) == [4.0] @test collect(Float64, Composite{Tuple{Float64,}}(a=(@thunk 2.0^2),)) == [4.0] + @test collect(Pair{String, Float64}, Composite{Dict}(Dict([("a", @thunk 2.0^2)]))) == [Pair("a", 4.0)] end @testset "unset properties" begin