@@ -20,8 +20,20 @@ DerivableInterfaces.interface(::Type{<:AbstractNamedDimsArray}) = NamedDimsArray
2020
2121# Output the dimension names.
2222nameddimsindices (a:: AbstractArray ) = throw (MethodError (nameddimsindices, Tuple{typeof (a)}))
23- # Unwrapping the names
24- Base. parent (a:: AbstractNamedDimsArray ) = throw (MethodError (parent, Tuple{typeof (a)}))
23+ # Unwrapping the names (`NamedDimsArrays.jl` interface).
24+ # TODO : Use `IsNamed` trait?
25+ dename (a:: AbstractNamedDimsArray ) = throw (MethodError (dename, Tuple{typeof (a)}))
26+ function dename (a:: AbstractNamedDimsArray , nameddimsindices)
27+ return dename (aligndims (a, nameddimsindices))
28+ end
29+ function denamed (a:: AbstractNamedDimsArray , nameddimsindices)
30+ return dename (aligneddims (a, nameddimsindices))
31+ end
32+
33+ unname (a:: AbstractArray , nameddimsindices) = dename (a, nameddimsindices)
34+ unnamed (a:: AbstractArray , nameddimsindices) = denamed (a, nameddimsindices)
35+
36+ isnamed (:: Type{<:AbstractNamedDimsArray} ) = true
2537
2638nameddimsindices (a:: AbstractArray , dim:: Int ) = nameddimsindices (a)[dim]
2739
@@ -109,21 +121,6 @@ function to_nameddimsindices(a::AbstractNamedDimsArray, dims)
109121 return map (dim -> to_dimname (a, dim), dims)
110122end
111123
112- # Unwrapping the names (`NamedDimsArrays.jl` interface).
113- # TODO : Use `IsNamed` trait?
114- dename (a:: AbstractNamedDimsArray ) = parent (a)
115- function dename (a:: AbstractNamedDimsArray , nameddimsindices)
116- return dename (aligndims (a, nameddimsindices))
117- end
118- function denamed (a:: AbstractNamedDimsArray , nameddimsindices)
119- return dename (aligneddims (a, nameddimsindices))
120- end
121-
122- unname (a:: AbstractArray , nameddimsindices) = dename (a, nameddimsindices)
123- unnamed (a:: AbstractArray , nameddimsindices) = denamed (a, nameddimsindices)
124-
125- isnamed (:: Type{<:AbstractNamedDimsArray} ) = true
126-
127124# TODO : Move to `utils.jl` file.
128125# TODO : Use `Base.indexin`?
129126function getperm (x, y; isequal= isequal)
@@ -148,6 +145,36 @@ function Base.copy(a::AbstractNamedDimsArray)
148145 return constructorof (typeof (a))(copy (dename (a)), nameddimsindices (a))
149146end
150147
148+ function Base. copyto! (a_dest:: AbstractNamedDimsArray , a_src:: AbstractNamedDimsArray )
149+ a′_dest = dename (a_dest)
150+ # TODO : Use `denamed` to do the permutations lazily.
151+ a′_src = dename (a_src, nameddimsindices (a_dest))
152+ copyto! (a′_dest, a′_src)
153+ return a_dest
154+ end
155+
156+ # Conversion
157+
158+ # Copied from `Base` (defined in abstractarray.jl).
159+ @noinline _checkaxs (axd, axs) =
160+ axd == axs || throw (DimensionMismatch (" axes must agree, got $axd and $axs " ))
161+ function copyto_axcheck! (dest, src)
162+ _checkaxs (axes (dest), axes (src))
163+ return copyto! (dest, src)
164+ end
165+
166+ # These are defined since the Base versions assume the eltype and ndims are known
167+ # at compile time, which isn't true for ITensors.
168+ Base. Array (a:: AbstractNamedDimsArray ) = Array (dename (a))
169+ Base. Array {T} (a:: AbstractNamedDimsArray ) where {T} = Array {T} (dename (a))
170+ Base. Array {T,N} (a:: AbstractNamedDimsArray ) where {T,N} = Array {T,N} (dename (a))
171+ Base. AbstractArray {T} (a:: AbstractNamedDimsArray ) where {T} = AbstractArray {T,ndims(a)} (a)
172+ function Base. AbstractArray {T,N} (a:: AbstractNamedDimsArray ) where {T,N}
173+ dest = similar (a, T)
174+ copyto_axcheck! (dename (dest), dename (a))
175+ return dest
176+ end
177+
151178const NamedDimsIndices = Union{
152179 AbstractNamedUnitRange{<: Integer },AbstractNamedArray{<: Integer }
153180}
@@ -380,7 +407,7 @@ function Base.getindex(a::NamedDimsCartesianIndices{N}, I::Vararg{Int,N}) where
380407end
381408
382409nameddimsindices (I:: NamedDimsCartesianIndices ) = name .(I. indices)
383- function Base . parent (I:: NamedDimsCartesianIndices )
410+ function dename (I:: NamedDimsCartesianIndices )
384411 return CartesianIndices (dename .(I. indices))
385412end
386413
0 commit comments