@@ -20,8 +20,20 @@ DerivableInterfaces.interface(::Type{<:AbstractNamedDimsArray}) = NamedDimsArray
20
20
21
21
# Output the dimension names.
22
22
nameddimsindices (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
25
37
26
38
nameddimsindices (a:: AbstractArray , dim:: Int ) = nameddimsindices (a)[dim]
27
39
@@ -109,21 +121,6 @@ function to_nameddimsindices(a::AbstractNamedDimsArray, dims)
109
121
return map (dim -> to_dimname (a, dim), dims)
110
122
end
111
123
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
-
127
124
# TODO : Move to `utils.jl` file.
128
125
# TODO : Use `Base.indexin`?
129
126
function getperm (x, y; isequal= isequal)
@@ -148,6 +145,36 @@ function Base.copy(a::AbstractNamedDimsArray)
148
145
return constructorof (typeof (a))(copy (dename (a)), nameddimsindices (a))
149
146
end
150
147
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
+
151
178
const NamedDimsIndices = Union{
152
179
AbstractNamedUnitRange{<: Integer },AbstractNamedArray{<: Integer }
153
180
}
@@ -380,7 +407,7 @@ function Base.getindex(a::NamedDimsCartesianIndices{N}, I::Vararg{Int,N}) where
380
407
end
381
408
382
409
nameddimsindices (I:: NamedDimsCartesianIndices ) = name .(I. indices)
383
- function Base . parent (I:: NamedDimsCartesianIndices )
410
+ function dename (I:: NamedDimsCartesianIndices )
384
411
return CartesianIndices (dename .(I. indices))
385
412
end
386
413
0 commit comments