1- using MapBroadcast: Mapped
21using NamedDimsArrays: NamedDimsArrays, AbstractNamedDimsArray, NamedDimsArray, denamed,
32 dimnames, inds, mapinds
43
@@ -8,52 +7,7 @@ NamedDimsArrays.nameddimsconstructor(::Type{<:IndexName}) = ITensor
87
98Base. ndims (:: Type{<:AbstractITensor} ) = Any
109
11- using FillArrays: Zeros
12- using UnallocatedArrays: UnallocatedZeros, allocate
13- using UnspecifiedTypes: UnspecifiedZero
14-
15- # TODO : Make this more general, maybe with traits `is_unallocated`
16- # and `is_eltype_unspecified`.
17- function specify_eltype (a:: Zeros{UnspecifiedZero} , elt:: Type )
18- return Zeros {elt} (axes (a))
19- end
20- specify_eltype (a:: AbstractArray , elt:: Type ) = a
21-
22- # TODO : Use `adapt` to reach down into the storage.
23- function specify_eltype! (a:: AbstractITensor , elt:: Type )
24- setdenamed! (a, specify_eltype (denamed (a), elt))
25- return a
26- end
27-
28- # Assume it is allocated.
29- allocate! (a:: AbstractArray ) = a
30-
31- # TODO : Use `adapt` to reach down into the storage.
32- function allocate! (a:: AbstractITensor )
33- setdenamed! (a, allocate (denamed (a)))
34- return a
35- end
36-
37- unallocatable (a:: AbstractITensor ) = NamedDimsArray (a)
38-
39- function setindex_allocatable! (a:: AbstractArray , value, I... )
40- allocate! (specify_eltype! (a, typeof (value)))
41- # TODO : Maybe use `@interface interface(a) a[I...] = value`?
42- unallocatable (a)[I... ] = value
43- return a
44- end
45-
46- # TODO : Combine these by using `Base.to_indices`.
47- function Base. setindex! (a:: AbstractITensor , value, I:: Int... )
48- setindex_allocatable! (a, value, I... )
49- return a
50- end
51- function Base. setindex! (a:: AbstractITensor , value, I:: AbstractNamedInteger... )
52- setindex_allocatable! (a, value, I... )
53- return a
54- end
55-
56- mutable struct ITensor <: AbstractITensor
10+ struct ITensor <: AbstractITensor
5711 parent:: AbstractArray
5812 inds
5913 function ITensor (parent:: AbstractArray , dims)
7226function ITensor (parent:: AbstractArray )
7327 return ITensor (parent, ())
7428end
75-
76- using Accessors: @set
77- setdenamed (a:: ITensor , denamed) = (@set a. parent = denamed)
78- setdenamed! (a:: ITensor , denamed) = (a. parent = denamed)
79-
80- function ITensor (elt:: Type , I1:: Index , I_rest:: Index... )
81- I = (I1, I_rest... )
82- # TODO : Use `FillArrays.Zeros`.
83- return ITensor (zeros (elt, length .(denamed .(I))... ), I)
84- end
85-
86- function ITensor (I1:: Index , I_rest:: Index... )
87- I = (I1, I_rest... )
88- return ITensor (Zeros {UnspecifiedZero} (length .(denamed .(I))... ), I)
89- end
90-
91- function ITensor ()
92- return ITensor (Zeros {UnspecifiedZero} (), ())
93- end
0 commit comments