From 649cead425c00adc824e7e3feeeeb003d51ab741 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Mon, 20 Jul 2020 12:34:32 +0200 Subject: [PATCH 1/9] zero implemented for HybridArray --- Project.toml | 2 +- src/arraymath.jl | 4 ++++ test/arraymath.jl | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 6b3f395..39330b5 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "HybridArrays" uuid = "1baab800-613f-4b0a-84e4-9cd3431bfbb9" authors = ["Mateusz Baran "] -version = "0.3.6" +version = "0.3.7" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" diff --git a/src/arraymath.jl b/src/arraymath.jl index 21f5768..504b63f 100644 --- a/src/arraymath.jl +++ b/src/arraymath.jl @@ -10,3 +10,7 @@ Base.one(A::HA) where {HA<:HybridMatrix} = HA(one(A.data)) end Base.fill!(A::HybridArray, x) = fill!(A.data, x) + +function Base.zero(a::HybridArray{S}) where {S} + return HybridArray{S}(zero(a.data)) +end diff --git a/test/arraymath.jl b/test/arraymath.jl index e62ed5b..0c1eda5 100644 --- a/test/arraymath.jl +++ b/test/arraymath.jl @@ -13,10 +13,11 @@ using StaticArrays, HybridArrays, Test, LinearAlgebra @testset "zero()" begin M = HybridMatrix{2, StaticArrays.Dynamic()}([1 2; 4 5]) @test (@inferred zero(M)) == @SMatrix [0 0; 0 0] - @test isa(one(M), HybridMatrix{2,StaticArrays.Dynamic(),Int}) + @test isa(zero(M), HybridMatrix{2,StaticArrays.Dynamic(),Int}) Mv = view(M, :, SOneTo(2)) @test (@inferred zero(Mv)) === @SMatrix [0 0; 0 0] + end @testset "fill!()" begin From 6669402901223bee42938af2e02e5e2f1de30fc1 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Mon, 20 Jul 2020 12:59:55 +0200 Subject: [PATCH 2/9] forwarding IndexStyle of wrapped array --- src/abstractarray.jl | 3 +++ test/abstractarray.jl | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/src/abstractarray.jl b/src/abstractarray.jl index d96b31c..9a0706d 100644 --- a/src/abstractarray.jl +++ b/src/abstractarray.jl @@ -43,3 +43,6 @@ _h_similar_type(::Type{A},::Type{T},s::Size{S}) where {A<:HybridArray,T,S} = hyb Size(::Type{<:HybridArray{S}}) where {S} = Size(S) + +Base.IndexStyle(a::HybridArray) = Base.IndexStyle(a.data) +Base.IndexStyle(::Type{HA}) where {S,T,N,M,TData,HA<:HybridArray{S,T,N,M,TData}} = Base.IndexStyle(TData) diff --git a/test/abstractarray.jl b/test/abstractarray.jl index b4f680f..7a03092 100644 --- a/test/abstractarray.jl +++ b/test/abstractarray.jl @@ -41,4 +41,11 @@ using StaticArrays, HybridArrays, Test, LinearAlgebra @test isa(@inferred(similar(M, Float64)), HybridMatrix{2, StaticArrays.Dynamic(), Float64}) end + @testset "IndexStyle" begin + M = HybridMatrix{2, StaticArrays.Dynamic(), Int}([1 2; 3 4]) + MT = HybridMatrix{2, StaticArrays.Dynamic(), Int}([1 2; 3 4]') + @test (@inferred IndexStyle(M)) === IndexLinear() + @test (@inferred IndexStyle(MT)) === IndexCartesian() + end + end From 9d249cedbdc9009afaee18ef9ce1ea366198dfb7 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Mon, 20 Jul 2020 13:06:38 +0200 Subject: [PATCH 3/9] more tests for IndexStyle --- test/abstractarray.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/abstractarray.jl b/test/abstractarray.jl index 7a03092..0902481 100644 --- a/test/abstractarray.jl +++ b/test/abstractarray.jl @@ -46,6 +46,8 @@ using StaticArrays, HybridArrays, Test, LinearAlgebra MT = HybridMatrix{2, StaticArrays.Dynamic(), Int}([1 2; 3 4]') @test (@inferred IndexStyle(M)) === IndexLinear() @test (@inferred IndexStyle(MT)) === IndexCartesian() + @test (@inferred IndexStyle(typeof(M))) === IndexLinear() + @test (@inferred IndexStyle(typeof(MT))) === IndexCartesian() end end From 8c3bacea6f2dedea33272be07b31a94611180132 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Mon, 20 Jul 2020 13:43:13 +0200 Subject: [PATCH 4/9] trying testing on Julia 1.5 rc --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3544e8f..937207b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - julia-version: [1.0, 1.1, 1.2, 1.3, 1.4] + julia-version: [1.0, 1.1, 1.2, 1.3, 1.4, '~1.5.0-0'] os: [ubuntu-latest, macOS-latest, windows-latest] steps: - uses: actions/checkout@v2 From e23a1d564c36a45260c510bcdb430dfa4db90222 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Tue, 21 Jul 2020 09:38:43 +0200 Subject: [PATCH 5/9] implementing ArrayInterface --- Project.toml | 1 + src/HybridArrays.jl | 2 ++ src/array_interface_compat.jl | 16 ++++++++++++++++ test/array_interface_compat.jl | 10 ++++++++++ 4 files changed, 29 insertions(+) create mode 100644 src/array_interface_compat.jl create mode 100644 test/array_interface_compat.jl diff --git a/Project.toml b/Project.toml index 39330b5..599d55d 100644 --- a/Project.toml +++ b/Project.toml @@ -4,6 +4,7 @@ authors = ["Mateusz Baran "] version = "0.3.7" [deps] +ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" diff --git a/src/HybridArrays.jl b/src/HybridArrays.jl index 9520969..0af1099 100644 --- a/src/HybridArrays.jl +++ b/src/HybridArrays.jl @@ -24,6 +24,7 @@ using StaticArrays: Dynamic import StaticArrays: _setindex!_scalar, Size using LinearAlgebra +using ArrayInterface @generated function hasdynamic(::Type{Size}) where Size<:Tuple @@ -148,5 +149,6 @@ include("convert.jl") include("indexing.jl") include("linalg.jl") include("utils.jl") +include("array_interface_compat.jl") end # module diff --git a/src/array_interface_compat.jl b/src/array_interface_compat.jl new file mode 100644 index 0000000..60d1122 --- /dev/null +++ b/src/array_interface_compat.jl @@ -0,0 +1,16 @@ + +function ArrayInterface.ismutable(::Type{HybridArray{S,T,N,M,TData}}) where {S,T,N,M,TData} + return ArrayInterface.ismutable(TData) +end + +function ArrayInterface.can_setindex(::Type{HybridArray{S,T,N,M,TData}}) where {S,T,N,M,TData} + return ArrayInterface.can_setindex(TData) +end + +function ArrayInterface.parent_type(::Type{HybridArray{S,T,N,M,TData}}) where {S,T,N,M,TData} + return TData +end + +function ArrayInterface.restructure(x::HybridArray{S}, y) where {S} + return HybridArray{S}(reshape(convert(Array, y), size(x)...)) +end diff --git a/test/array_interface_compat.jl b/test/array_interface_compat.jl new file mode 100644 index 0000000..7d4aba5 --- /dev/null +++ b/test/array_interface_compat.jl @@ -0,0 +1,10 @@ + +using HybridArrays, ArrayInterface, Test, StaticArrays + +@testset "ArrayInterface compatibility" begin + M = HybridMatrix{2, StaticArrays.Dynamic()}([1 2; 4 5]) + @test ArrayInterface.ismutable(M) + @test ArrayInterface.can_setindex(M) + @test ArrayInterface.parent_type(M) === Matrix{Int} + @test ArrayInterface.restructure(M, [2, 4, 6, 8]) == HybridMatrix{2, StaticArrays.Dynamic()}([2 6; 4 8]) +end From 907a8fbe3e93ecf765faba0faeb6fea8d38b0df6 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Tue, 21 Jul 2020 09:40:09 +0200 Subject: [PATCH 6/9] one more test --- test/array_interface_compat.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/array_interface_compat.jl b/test/array_interface_compat.jl index 7d4aba5..6782ab0 100644 --- a/test/array_interface_compat.jl +++ b/test/array_interface_compat.jl @@ -7,4 +7,5 @@ using HybridArrays, ArrayInterface, Test, StaticArrays @test ArrayInterface.can_setindex(M) @test ArrayInterface.parent_type(M) === Matrix{Int} @test ArrayInterface.restructure(M, [2, 4, 6, 8]) == HybridMatrix{2, StaticArrays.Dynamic()}([2 6; 4 8]) + @test isa(ArrayInterface.restructure(M, [2, 4, 6, 8]), HybridMatrix{2, StaticArrays.Dynamic()}) end From cc0499c8c9f4cf90ed7388f3126e607b5be278f3 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Tue, 21 Jul 2020 11:43:06 +0200 Subject: [PATCH 7/9] making ArrayInterface optional --- Project.toml | 6 ++++-- src/HybridArrays.jl | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Project.toml b/Project.toml index 599d55d..290c046 100644 --- a/Project.toml +++ b/Project.toml @@ -4,17 +4,19 @@ authors = ["Mateusz Baran "] version = "0.3.7" [deps] -ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Requires = "ae029012-a4dd-5104-9daa-d747884805df" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" [compat] +Requires = "1" StaticArrays = "=0.12.4" julia = "1" [extras] +ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "Random"] +test = ["Test", "Random", "ArrayInterface"] diff --git a/src/HybridArrays.jl b/src/HybridArrays.jl index 0af1099..b537d91 100644 --- a/src/HybridArrays.jl +++ b/src/HybridArrays.jl @@ -24,7 +24,7 @@ using StaticArrays: Dynamic import StaticArrays: _setindex!_scalar, Size using LinearAlgebra -using ArrayInterface +using Requires @generated function hasdynamic(::Type{Size}) where Size<:Tuple @@ -149,6 +149,11 @@ include("convert.jl") include("indexing.jl") include("linalg.jl") include("utils.jl") -include("array_interface_compat.jl") + +function __init__() + @require ArrayInterface="4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" begin + include("array_interface_compat.jl") + end +end end # module From b5f133e9dbc11d0a7ea68fdea906509c7bc8aea9 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Tue, 21 Jul 2020 12:49:49 +0200 Subject: [PATCH 8/9] implementing vec --- src/abstractarray.jl | 2 ++ test/abstractarray.jl | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/abstractarray.jl b/src/abstractarray.jl index 9a0706d..92d1421 100644 --- a/src/abstractarray.jl +++ b/src/abstractarray.jl @@ -46,3 +46,5 @@ Size(::Type{<:HybridArray{S}}) where {S} = Size(S) Base.IndexStyle(a::HybridArray) = Base.IndexStyle(a.data) Base.IndexStyle(::Type{HA}) where {S,T,N,M,TData,HA<:HybridArray{S,T,N,M,TData}} = Base.IndexStyle(TData) + +Base.vec(a::HybridArray) = vec(a.data) diff --git a/test/abstractarray.jl b/test/abstractarray.jl index 0902481..9fe0b37 100644 --- a/test/abstractarray.jl +++ b/test/abstractarray.jl @@ -50,4 +50,10 @@ using StaticArrays, HybridArrays, Test, LinearAlgebra @test (@inferred IndexStyle(typeof(MT))) === IndexCartesian() end + @testset "vec" begin + M = HybridMatrix{2, StaticArrays.Dynamic(), Int}([1 2; 3 4]) + @test vec(M) == [1, 3, 2, 4] + @test vec(M) isa Vector{Int} + end + end From 4a922432568f6dfb504dfff412f9ab16057bf9e4 Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Tue, 21 Jul 2020 12:53:40 +0200 Subject: [PATCH 9/9] one more test for vec --- test/abstractarray.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/abstractarray.jl b/test/abstractarray.jl index 9fe0b37..cc091f5 100644 --- a/test/abstractarray.jl +++ b/test/abstractarray.jl @@ -52,8 +52,11 @@ using StaticArrays, HybridArrays, Test, LinearAlgebra @testset "vec" begin M = HybridMatrix{2, StaticArrays.Dynamic(), Int}([1 2; 3 4]) - @test vec(M) == [1, 3, 2, 4] - @test vec(M) isa Vector{Int} + Mv = vec(M) + @test Mv == [1, 3, 2, 4] + @test Mv isa Vector{Int} + Mv[2] = 100 + @test M[2, 1] == 100 end end