11using MapBroadcast: Mapped
22using NamedDimsArrays:
3- NamedDimsArrays,
4- AbstractNamedDimsArray,
5- NamedDimsArray,
6- dename,
7- dimnames,
8- mapnameddimsindices,
9- nameddimsindices,
10- replacenameddimsindices,
11- setnameddimsindices
12-
13- abstract type AbstractITensor <: AbstractNamedDimsArray{Any,Any} end
3+ NamedDimsArrays,
4+ AbstractNamedDimsArray,
5+ NamedDimsArray,
6+ dename,
7+ dimnames,
8+ mapnameddimsindices,
9+ nameddimsindices,
10+ replacenameddimsindices,
11+ setnameddimsindices
12+
13+ abstract type AbstractITensor <: AbstractNamedDimsArray{Any, Any} end
1414
1515NamedDimsArrays. nameddimsarraytype (:: Type{<:IndexName} ) = ITensor
1616
@@ -23,128 +23,128 @@ using UnspecifiedTypes: UnspecifiedZero
2323# TODO : Make this more general, maybe with traits `is_unallocated`
2424# and `is_eltype_unspecified`.
2525function specify_eltype (a:: Zeros{UnspecifiedZero} , elt:: Type )
26- return Zeros {elt} (axes (a))
26+ return Zeros {elt} (axes (a))
2727end
2828function specify_eltype (a:: AbstractArray , elt:: Type )
29- return a
29+ return a
3030end
3131
3232# TODO : Use `adapt` to reach down into the storage.
3333function specify_eltype! (a:: AbstractITensor , elt:: Type )
34- setdenamed! (a, specify_eltype (dename (a), elt))
35- return a
34+ setdenamed! (a, specify_eltype (dename (a), elt))
35+ return a
3636end
3737
3838# Assume it is allocated.
3939allocate! (a:: AbstractArray ) = a
4040
4141# TODO : Use `adapt` to reach down into the storage.
4242function allocate! (a:: AbstractITensor )
43- setdenamed! (a, allocate (dename (a)))
44- return a
43+ setdenamed! (a, allocate (dename (a)))
44+ return a
4545end
4646
4747using DerivableInterfaces: @derive , @interface , AbstractArrayInterface
4848
4949abstract type AbstractAllocatableArrayInterface{N} <: AbstractArrayInterface{N} end
5050struct AllocatableArrayInterface{N} <: AbstractAllocatableArrayInterface{N} end
51- AllocatableArrayInterface {M} (:: Val{N} ) where {M,N} = AllocatableArrayInterface {N} ()
51+ AllocatableArrayInterface {M} (:: Val{N} ) where {M, N} = AllocatableArrayInterface {N} ()
5252AllocatableArrayInterface (:: Val{N} ) where {N} = AllocatableArrayInterface {N} ()
5353AllocatableArrayInterface () = AllocatableArrayInterface {Any} ()
5454
5555unallocatable (a:: AbstractITensor ) = NamedDimsArray (a)
5656
5757function setindex_allocatable! (a:: AbstractArray , value, I... )
58- allocate! (specify_eltype! (a, typeof (value)))
59- # TODO : Maybe use `@interface interface(a) a[I...] = value`?
60- unallocatable (a)[I... ] = value
61- return a
58+ allocate! (specify_eltype! (a, typeof (value)))
59+ # TODO : Maybe use `@interface interface(a) a[I...] = value`?
60+ unallocatable (a)[I... ] = value
61+ return a
6262end
6363
6464# TODO : Combine these by using `Base.to_indices`.
6565@interface :: AbstractAllocatableArrayInterface function Base. setindex! (
66- a:: AbstractArray , value, I:: Int...
67- )
68- setindex_allocatable! (a, value, I... )
69- return a
66+ a:: AbstractArray , value, I:: Int...
67+ )
68+ setindex_allocatable! (a, value, I... )
69+ return a
7070end
7171@interface :: AbstractAllocatableArrayInterface function Base. setindex! (
72- a:: AbstractArray , value, I:: AbstractNamedInteger...
73- )
74- setindex_allocatable! (a, value, I... )
75- return a
72+ a:: AbstractArray , value, I:: AbstractNamedInteger...
73+ )
74+ setindex_allocatable! (a, value, I... )
75+ return a
7676end
7777
78- @derive AllocatableArrayInterface () (T= AbstractITensor,) begin
79- Base. setindex! (:: T , :: Any , :: Int... )
80- Base. setindex! (:: T , :: Any , :: AbstractNamedInteger... )
78+ @derive AllocatableArrayInterface () (T = AbstractITensor,) begin
79+ Base. setindex! (:: T , :: Any , :: Int... )
80+ Base. setindex! (:: T , :: Any , :: AbstractNamedInteger... )
8181end
8282
8383mutable struct ITensor <: AbstractITensor
84- parent:: AbstractArray
85- nameddimsindices
86- function ITensor (parent:: AbstractArray , dims)
87- # This checks the shapes of the inputs.
88- nameddimsindices = NamedDimsArrays. to_nameddimsindices (parent, dims)
89- return new (parent, nameddimsindices)
90- end
84+ parent:: AbstractArray
85+ nameddimsindices
86+ function ITensor (parent:: AbstractArray , dims)
87+ # This checks the shapes of the inputs.
88+ nameddimsindices = NamedDimsArrays. to_nameddimsindices (parent, dims)
89+ return new (parent, nameddimsindices)
90+ end
9191end
9292Base. parent (a:: ITensor ) = getfield (a, :parent )
9393NamedDimsArrays. nameddimsindices (a:: ITensor ) = getfield (a, :nameddimsindices )
9494NamedDimsArrays. dename (a:: ITensor ) = parent (a)
9595
9696function ITensor (parent:: AbstractArray , i1:: Index , i_rest:: Index... )
97- return ITensor (parent, (i1, i_rest... ))
97+ return ITensor (parent, (i1, i_rest... ))
9898end
9999function ITensor (parent:: AbstractArray )
100- return ITensor (parent, ())
100+ return ITensor (parent, ())
101101end
102102
103103using Accessors: @set
104104setdenamed (a:: ITensor , denamed) = (@set a. parent = denamed)
105105setdenamed! (a:: ITensor , denamed) = (a. parent = denamed)
106106
107107function ITensor (elt:: Type , I1:: Index , I_rest:: Index... )
108- I = (I1, I_rest... )
109- # TODO : Use `FillArrays.Zeros`.
110- return ITensor (zeros (elt, length .(dename .(I))... ), I)
108+ I = (I1, I_rest... )
109+ # TODO : Use `FillArrays.Zeros`.
110+ return ITensor (zeros (elt, length .(dename .(I))... ), I)
111111end
112112
113113function ITensor (I1:: Index , I_rest:: Index... )
114- I = (I1, I_rest... )
115- return ITensor (Zeros {UnspecifiedZero} (length .(dename .(I))... ), I)
114+ I = (I1, I_rest... )
115+ return ITensor (Zeros {UnspecifiedZero} (length .(dename .(I))... ), I)
116116end
117117
118118function ITensor ()
119- return ITensor (Zeros {UnspecifiedZero} (), ())
119+ return ITensor (Zeros {UnspecifiedZero} (), ())
120120end
121121
122122inds (a:: AbstractITensor ) = nameddimsindices (a)
123123setinds (a:: AbstractITensor , inds) = setnameddimsindices (a, inds)
124124
125125function uniqueinds (a1:: AbstractITensor , a_rest:: AbstractITensor... )
126- return setdiff (inds (a1), inds .(a_rest)... )
126+ return setdiff (inds (a1), inds .(a_rest)... )
127127end
128128function uniqueind (a1:: AbstractITensor , a_rest:: AbstractITensor... )
129- return only (uniqueinds (a1, a_rest... ))
129+ return only (uniqueinds (a1, a_rest... ))
130130end
131131
132132function commoninds (a1:: AbstractITensor , a_rest:: AbstractITensor... )
133- return intersect (inds (a1), inds .(a_rest)... )
133+ return intersect (inds (a1), inds .(a_rest)... )
134134end
135135function commonind (a1:: AbstractITensor , a_rest:: AbstractITensor... )
136- return only (commoninds (a1, a_rest... ))
136+ return only (commoninds (a1, a_rest... ))
137137end
138138
139139function replaceinds (a:: AbstractITensor , replacements:: Pair... )
140- return replacenameddimsindices (a, replacements... )
140+ return replacenameddimsindices (a, replacements... )
141141end
142142function replaceinds (f, a:: AbstractITensor )
143- return replacenameddimsindices (f, a)
143+ return replacenameddimsindices (f, a)
144144end
145145
146146function mapinds (f, a:: AbstractITensor )
147- return mapnameddimsindices (f, a)
147+ return mapnameddimsindices (f, a)
148148end
149149
150150prime (a:: AbstractITensor ) = replaceinds (prime, a)
0 commit comments