JuliaArrays / AxisArrays.jl

Performant arrays where each dimension can have a named axis with values
http://JuliaArrays.github.io/AxisArrays.jl/latest/
Other
200 stars 41 forks source link

Propagate AxisArray copy / view down to taking copies / views of its axes as well #148

Open kcajf opened 5 years ago

kcajf commented 5 years ago

This is my attempt at addressing #147

All the tests appear to pass. I'm new to Julia and wasn't quite sure on the best way implement this, but doing it via Value types seemed efficient and easy. The only issue was that, in order to resolve the following method ambiguity:

  LoadError: MethodError: AxisArrays._new_axes(::Axis{:y,Base.OneTo{Int64}}, ::Val{false}, ::AxisArray{Int64,1,Base.OneTo{Int64},Tuple{Axis{:y,Base.OneTo{Int64}}}}) is ambiguous. Candidates:
    _new_axes(ax::Axis{name,T} where T, copy::Val, idx::AxisArray{#s19,N,D,Ax} where Ax where D where #s19) where {name, N} in AxisArrays at /data/home/jfrigaa/AxisArrays.jl/src/indexing.jl:96
    _new_axes(ax::Axis{name,T} where T, copy::Val{false}, idx::AbstractArray{T,1} where T) where name in AxisArrays at /data/home/jfrigaa/AxisArrays.jl/src/indexing.jl:81

I had to duplicate _new_axes on line 95 with the copy parameter as both Val{true} and Val{false} (whereas I originally just had the argument as copy::Val). I couldn't work out another way to get it to compile, but no doubt someone will be able to suggest a better way to avoid this ambiguity without duplicating code.

timholy commented 5 years ago

Didn't notice how long ago this came. It's been hard for folks to find time to review PRs here. Sorry for the delay.

kcajf commented 5 years ago

Ended up adding a CopyStyle trait for safety to avoid the case of e.g. passing copy=Val(123) and hitting an unspecialized method rather than erroring.

kcajf commented 5 years ago

Shall we merge this?

bgroenks96 commented 3 years ago

Uh hey, yeah, this would be really nice to have. I assume this is the reason that AxisArrays cause allocation to occur when taking subarrays, e.g toy example:

function testalloc(x,interval)
    @view x[interval];
    nothing
end

causes allocation when x is an AxisArray but not when it's a normal array. This is true regardless of whether interval is a Range or an array of indices.

bgroenks96 commented 3 years ago

I'll create a separate issue for this and then link to this PR.