AxisArrays.jl icon indicating copy to clipboard operation
AxisArrays.jl copied to clipboard

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

Open kcajf opened this issue 6 years ago • 5 comments

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.

kcajf avatar Sep 27 '18 16:09 kcajf

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.

timholy avatar Dec 12 '18 15:12 timholy

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 avatar Dec 24 '18 13:12 kcajf

Shall we merge this?

kcajf avatar Jun 21 '19 22:06 kcajf

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 avatar Jan 22 '21 16:01 bgroenks96

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

bgroenks96 avatar Jan 22 '21 16:01 bgroenks96