@@ -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