@@ -8,10 +8,12 @@ using NamedDimsArrays:
8
8
AbstractNamedInteger,
9
9
AbstractNamedUnitRange,
10
10
AbstractNamedVector,
11
+ NamedDimsArray,
11
12
dename,
12
13
dimnames,
13
14
name,
14
15
named,
16
+ nameddimsindices,
15
17
unname
16
18
17
19
@kwdef struct IndexName <: AbstractName
@@ -69,11 +71,65 @@ NamedDimsArrays.nameddimsarraytype(::Type{<:IndexName}) = ITensor
69
71
70
72
Base. ndims (:: Type{<:AbstractITensor} ) = Any
71
73
72
- struct ITensor <: AbstractITensor
74
+ using FillArrays: Zeros
75
+ using UnallocatedArrays: UnallocatedZeros, allocate
76
+ using UnspecifiedTypes: UnspecifiedZero
77
+
78
+ # TODO : Make this more general, maybe with traits `is_unallocated`
79
+ # and `is_eltype_unspecified`.
80
+ function specify_eltype (a:: Zeros{UnspecifiedZero} , elt:: Type )
81
+ return Zeros {elt} (axes (a))
82
+ end
83
+
84
+ # TODO : Use `adapt` to reach down into the storage.
85
+ function specify_eltype! (a:: AbstractITensor , elt:: Type )
86
+ setdenamed! (a, specify_eltype (dename (a), elt))
87
+ return a
88
+ end
89
+
90
+ # Assume it is allocated.
91
+ allocate! (a:: AbstractArray ) = a
92
+
93
+ # TODO : Use `adapt` to reach down into the storage.
94
+ function allocate! (a:: AbstractITensor )
95
+ setdenamed! (a, allocate (dename (a)))
96
+ return a
97
+ end
98
+
99
+ using Derive: @derive , @interface , AbstractArrayInterface
100
+
101
+ abstract type AbstractAllocatableArrayInterface <: AbstractArrayInterface end
102
+ struct AllocatableArrayInterface <: AbstractAllocatableArrayInterface end
103
+
104
+ unallocatable (a:: AbstractITensor ) = NamedDimsArray (a)
105
+
106
+ @interface :: AbstractAllocatableArrayInterface function Base. setindex! (
107
+ a:: AbstractArray , value, I:: Int...
108
+ )
109
+ allocate! (specify_eltype! (a, typeof (value)))
110
+ # TODO : Maybe use `@interface interface(a) a[I...] = value`?
111
+ unallocatable (a)[I... ] = value
112
+ return a
113
+ end
114
+
115
+ @derive AllocatableArrayInterface () (T= AbstractITensor,) begin
116
+ Base. setindex! (:: T , :: Any , :: Int... )
117
+ end
118
+
119
+ mutable struct ITensor <: AbstractITensor
73
120
parent:: AbstractArray
74
121
nameddimsindices
75
122
end
76
123
Base. parent (a:: ITensor ) = a. parent
77
124
NamedDimsArrays. nameddimsindices (a:: ITensor ) = a. nameddimsindices
78
125
126
+ using Accessors: @set
127
+ setdenamed (a:: ITensor , denamed) = (@set a. parent = denamed)
128
+ setdenamed! (a:: ITensor , denamed) = (a. parent = denamed)
129
+
130
+ function ITensor (I1:: Index , I_rest:: Index... )
131
+ I = (I1, I_rest... )
132
+ return ITensor (Zeros {UnspecifiedZero} (length .(dename .(I))... ), I)
133
+ end
134
+
79
135
end
0 commit comments