Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extra singleton dimension appears during casting #57

Open
prittjam opened this issue Oct 6, 2022 · 2 comments
Open

Extra singleton dimension appears during casting #57

prittjam opened this issue Oct 6, 2022 · 2 comments
Labels
bug Something isn't working

Comments

@prittjam
Copy link

prittjam commented Oct 6, 2022

using TensorCast, EllipsisNotation

@views project(x) = x ./ x[[end],..]
@views project!(x) = @. x = x / x[[end],..]
euclideanize(x) = project(x)[1:end-1,..]

P = rand(3,4,100)   
@cast u[i,k] := euclideanize(P[:,4,:])[i,k]

The result should be 2 dimensional but it is 3 with a singleton dimension added. Hower, this works as expected,

@cast u[i,k] := Affine.euclideanize(view(P, :, 4, :))[i,k]
@prittjam prittjam changed the title Extra dimension appears Extra singleton dimension appears during casting Oct 6, 2022
@mcabbott
Copy link
Owner

mcabbott commented Oct 6, 2022

Thanks, that's a bug. I think this isolates it to mcabbott/LazyStack.jl#15

julia> euclideanize(P[:,4,:])
2×100 Matrix{Float64}:
 1.93102   1.61322  0.727326  0.626134  1.35614     1.27111   0.463712  2.29733  2.68379
 0.113882  1.52248  1.03129   0.626155  0.292362     0.839144  0.118597  1.97182  6.95894

julia> @cast u[i,k] := euclideanize(P[:,4,:])[i,k]; summary(u)
"2×100×1 lazystack(::Tuple{Matrix{Float64}}) with eltype Float64"

julia> @pretty @cast u[i,k] := euclideanize(P[:,4,:])[i,k]
begin
    @boundscheck ndims(P) == 3 || throw(ArgumentError("expected a 3-tensor P[:, 4, :]"))
    local dolphin = sliceview(view(P, :, 4, :), (:, :))
    local pig = @__dot__(euclideanize(dolphin))
    local armadillo = lazystack(pig)
    u = armadillo
end

julia> TensorCast.sliceview(view(P, :, 4, :), (:, :)) |> summary
"0-dimensional Array{SubArray{Float64, 2, Array{Float64, 3}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64, Base.Slice{Base.OneTo{Int64}}}, false}, 0}"

julia> TensorCast.sliceview(view(P, :, 4, :), (:, :)) .|> euclideanize |> summary
"2×100 Matrix{Float64}"

julia> TensorCast.sliceview(view(P, :, 4, :), (:, :)) .|> euclideanize |> TensorCast.lazystack |> summary
"2×100×1 lazystack(::Tuple{Matrix{Float64}}) with eltype Float64"

Ideally perhaps @cast would recognise that euclideanize(P[:,4,:]) is a function like rand(2,100) which it should pull out, as it contains no indexing that the macro ought to do anything about. But it does not see this.

@mcabbott mcabbott added the bug Something isn't working label Oct 6, 2022
@mcabbott
Copy link
Owner

This is fixed in LazyStack v0.1.1, btw. I leave the issue open as a reminder to add a test here too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants