@@ -118,6 +118,10 @@ function LinearAlgebra.promote_leaf_eltypes(tn::AbstractITensorNetwork)
118118 return LinearAlgebra. promote_leaf_eltypes (itensors (tn))
119119end
120120
121+ function trivial_space (tn:: AbstractITensorNetwork )
122+ return trivial_space (tn[first (vertices (tn))])
123+ end
124+
121125function ITensors. promote_itensor_eltype (tn:: AbstractITensorNetwork )
122126 return LinearAlgebra. promote_leaf_eltypes (tn)
123127end
@@ -133,13 +137,18 @@ function ITensors.convert_leaf_eltype(eltype::Type, tn::AbstractITensorNetwork)
133137 return tn
134138end
135139
136- # TODO : mimic ITensors.AbstractMPS implementation using map
140+ # TODO : Mimic ITensors.AbstractMPS implementation using map
141+ # TODO : Implement using `adapt`
137142function NDTensors. convert_scalartype (eltype:: Type{<:Number} , tn:: AbstractITensorNetwork )
138143 tn = copy (tn)
139144 vertex_data (tn) .= ITensors. adapt .(Ref (eltype), vertex_data (tn))
140145 return tn
141146end
142147
148+ function Base. complex (tn:: AbstractITensorNetwork )
149+ return NDTensors. convert_scalartype (complex (LinearAlgebra. promote_leaf_eltypes (tn)), tn)
150+ end
151+
143152#
144153# Conversion to Graphs
145154#
@@ -168,22 +177,48 @@ function IndsNetwork(tn::AbstractITensorNetwork)
168177 return is
169178end
170179
171- function siteinds (tn:: AbstractITensorNetwork )
180+ # Alias
181+ indsnetwork (tn:: AbstractITensorNetwork ) = IndsNetwork (tn)
182+
183+ function external_indsnetwork (tn:: AbstractITensorNetwork )
172184 is = IndsNetwork (underlying_graph (tn))
173185 for v in vertices (tn)
174186 is[v] = uniqueinds (tn, v)
175187 end
176188 return is
177189end
178190
179- function linkinds (tn:: AbstractITensorNetwork )
191+ # For backwards compatibility
192+ # TODO : Delete this
193+ siteinds (tn:: AbstractITensorNetwork ) = external_indsnetwork (tn)
194+
195+ # External indsnetwork of the flattened network, with vertices
196+ # mapped back to `tn1`.
197+ function flatten_external_indsnetwork (
198+ tn1:: AbstractITensorNetwork ,
199+ tn2:: AbstractITensorNetwork ,
200+ )
201+ is = external_indsnetwork (sim (tn1; sites= []) ⊗ tn2)
202+ flattened_is = IndsNetwork (underlying_graph (tn1))
203+ for v in vertices (flattened_is)
204+ # setindex_preserve_graph!(flattened_is, unioninds(is[v, 1], is[v, 2]), v)
205+ flattened_is[v] = unioninds (is[v, 1 ], is[v, 2 ])
206+ end
207+ return flattened_is
208+ end
209+
210+ function internal_indsnetwork (tn:: AbstractITensorNetwork )
180211 is = IndsNetwork (underlying_graph (tn))
181212 for e in edges (tn)
182213 is[e] = commoninds (tn, e)
183214 end
184215 return is
185216end
186217
218+ # For backwards compatibility
219+ # TODO : Delete this
220+ linkinds (tn:: AbstractITensorNetwork ) = internal_indsnetwork (tn)
221+
187222#
188223# Index access
189224#
313348# TODO : how to define this lazily?
314349# norm(tn::AbstractITensorNetwork) = sqrt(inner(tn, tn))
315350
351+ function isapprox (
352+ x:: AbstractITensorNetwork ,
353+ y:: AbstractITensorNetwork ;
354+ atol:: Real = 0 ,
355+ rtol:: Real = Base. rtoldefault (
356+ LinearAlgebra. promote_leaf_eltypes (x), LinearAlgebra. promote_leaf_eltypes (y), atol
357+ ),
358+ )
359+ error (" Not implemented" )
360+ d = norm (x - y)
361+ if ! isfinite (d)
362+ error (" In `isapprox(x::AbstractITensorNetwork, y::AbstractITensorNetwork)`, `norm(x - y)` is not finite" )
363+ end
364+ return d <= max (atol, rtol * max (norm (x), norm (y)))
365+ end
366+
316367function contract (tn:: AbstractITensorNetwork ; sequence= vertices (tn), kwargs... )
317368 sequence_linear_index = deepmap (v -> vertex_to_parent_vertex (tn, v), sequence)
318369 return contract (Vector {ITensor} (tn); sequence= sequence_linear_index, kwargs... )
@@ -739,6 +790,23 @@ function site_combiners(tn::AbstractITensorNetwork{V}) where {V}
739790 return Cs
740791end
741792
793+ function insert_missing_internal_inds (tn:: AbstractITensorNetwork , edges; internal_inds_space= trivial_space (tn))
794+ tn = copy (tn)
795+ for e in edges
796+ if ! hascommoninds (tn[src (e)], tn[dst (e)])
797+ iₑ = Index (internal_inds_space, edge_tag (e))
798+ X = onehot (iₑ => 1 )
799+ tn[src (e)] *= X
800+ tn[dst (e)] *= dag (X)
801+ end
802+ end
803+ return tn
804+ end
805+
806+ function insert_missing_internal_inds (tn:: AbstractITensorNetwork ; internal_inds_space= trivial_space (tn))
807+ return insert_internal_inds (tn, edges (tn); internal_inds_space)
808+ end
809+
742810# # # TODO : should this make sure that internal indices
743811# # # don't clash?
744812# # function hvncat(
0 commit comments