AxisArrays.jl
AxisArrays.jl copied to clipboard
Propagate AxisArray copy / view down to taking copies / views of its axes as well
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.
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.
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.
Shall we merge this?
Uh hey, yeah, this would be really nice to have. I assume this is the reason that AxisArray
s 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.
I'll create a separate issue for this and then link to this PR.