diff --git a/src/fillalgebra.jl b/src/fillalgebra.jl index f98ae605..9de95db8 100644 --- a/src/fillalgebra.jl +++ b/src/fillalgebra.jl @@ -18,14 +18,20 @@ for OP in (:transpose, :adjoint) end end -permutedims(a::AbstractFillVector) = fillsimilar(a, (1, length(a))) -permutedims(a::AbstractFillMatrix) = fillsimilar(a, reverse(axes(a))) +permutedims(a::AbstractFillMatrix) = fillsimilar(a, reverse(a.axes)) -function permutedims(B::AbstractFill, perm) - dimsB = size(B) - ndimsB = length(dimsB) + +@static if VERSION >= v"1.9" + Base.@constprop :aggressive permutedims(B::AbstractFill, perm) = _permutedims(B, perm) +else + permutedims(B::AbstractFill, perm) = _permutedims(B, perm) +end + +@inline function _permutedims(B::AbstractFill, perm) + dimsB = axes(B) + ndimsB = ndims(B) (ndimsB == length(perm) && isperm(perm)) || throw(ArgumentError("no valid permutation of dimensions")) - dimsP = ntuple(i->dimsB[perm[i]], ndimsB)::typeof(dimsB) + dimsP = ntuple(i->dimsB[perm[i]], ndimsB) fillsimilar(B, dimsP) end diff --git a/test/runtests.jl b/test/runtests.jl index b3474f05..206e6117 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1458,19 +1458,7 @@ end @test copy(transpose(Ones(5))) ≡ transpose(Ones(5)) @test Fill([1+im 2; 3 4; 5 6], 2,3)' == Fill([1+im 2; 3 4; 5 6]', 3,2) @test transpose(Fill([1+im 2; 3 4; 5 6], 2,3)) == Fill(transpose([1+im 2; 3 4; 5 6]), 3,2) - - @test permutedims(Ones(10)) ≡ Ones(1,10) - @test permutedims(Zeros(10)) ≡ Zeros(1,10) - @test permutedims(Fill(2.0,10)) ≡ Fill(2.0,1,10) - @test permutedims(Ones(10,3)) ≡ Ones(3,10) - @test permutedims(Zeros(10,3)) ≡ Zeros(3,10) - @test permutedims(Fill(2.0,10,3)) ≡ Fill(2.0,3,10) - - @test permutedims(Ones(2,4,5), [3,2,1]) == permutedims(Array(Ones(2,4,5)), [3,2,1]) - @test permutedims(Ones(2,4,5), [3,2,1]) ≡ Ones(5,4,2) - @test permutedims(Zeros(2,4,5), [3,2,1]) ≡ Zeros(5,4,2) - @test permutedims(Fill(2.0,2,4,5), [3,2,1]) ≡ Fill(2.0,5,4,2) - + @testset "recursive" begin S = SMatrix{2,3}(1:6) Z = Zeros(typeof(S), 2, 3) @@ -1483,6 +1471,30 @@ end @test F' == G' @test transpose(F) == transpose(G) end + + @test @inferred(permutedims(Ones(10))) ≡ Ones(1,10) + @test @inferred(permutedims(Zeros(10))) ≡ Zeros(1,10) + @test @inferred(permutedims(Fill(2.0,10))) ≡ Fill(2.0,1,10) + @test @inferred(permutedims(Ones(10,3))) ≡ Ones(3,10) + @test @inferred(permutedims(Zeros(10,3))) ≡ Zeros(3,10) + @test @inferred(permutedims(Fill(2.0,10,3))) ≡ Fill(2.0,3,10) + + @test @inferred(permutedims(Ones(2,4,5), [3,2,1])) == permutedims(Array(Ones(2,4,5)), [3,2,1]) + @test @inferred(permutedims(Ones(2,4,5), [3,2,1])) ≡ Ones(5,4,2) + @test @inferred(permutedims(Zeros(2,4,5), [3,2,1])) ≡ Zeros(5,4,2) + @test @inferred(permutedims(Fill(2.0,2,4,5), [3,2,1])) ≡ Fill(2.0,5,4,2) + + H = @inferred(permutedims(Fill(2, (SOneTo(2), SOneTo(3))))) + @test H === Fill(2, (SOneTo(3), SOneTo(2))) + + # test for inference only if aggressive constant propagation is available + F = Fill(2, (SOneTo(2), SOneTo(3), SOneTo(1))) + H = if VERSION >= v"1.8" + @inferred((F -> permutedims(F, (3,1,2)))(F)) + else + (F -> permutedims(F, (3,1,2)))(F) + end + @test H === Fill(2, (SOneTo(1), SOneTo(2), SOneTo(3))) end @testset "reverse" begin