@@ -8,10 +8,12 @@ using NamedDimsArrays:
88 AbstractNamedInteger,
99 AbstractNamedUnitRange,
1010 AbstractNamedVector,
11+ NamedDimsArray,
1112 dename,
1213 dimnames,
1314 name,
1415 named,
16+ nameddimsindices,
1517 unname
1618
1719@kwdef struct IndexName <: AbstractName
@@ -69,11 +71,65 @@ NamedDimsArrays.nameddimsarraytype(::Type{<:IndexName}) = ITensor
6971
7072Base. ndims (:: Type{<:AbstractITensor} ) = Any
7173
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
73120 parent:: AbstractArray
74121 nameddimsindices
75122end
76123Base. parent (a:: ITensor ) = a. parent
77124NamedDimsArrays. nameddimsindices (a:: ITensor ) = a. nameddimsindices
78125
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+
79135end
0 commit comments