11using BackendSelection: @Algorithm_str , Algorithm
2+ using ITensorNetworksNext. LazyNamedDimsArrays: LazyNamedDimsArray, nested_array_to_lazy_multiply, substitute_lazy, materialize
23
34default_contract_alg = nothing
45
@@ -10,26 +11,20 @@ function set_default_kwargs(alg::Algorithm"exact")
1011end
1112
1213function contraction_sequence (:: Algorithm"leftassociative" , tn:: Vector{<:AbstractArray} )
13- return Any[i for i in 1 : length (tn)]
14+ return nested_array_to_lazy_multiply ( collect .( 1 : length (tn)))
1415end
1516
1617function contraction_sequence (tn:: Vector{<:AbstractArray} ; alg = default_sequence_alg)
1718 return contraction_sequence (Algorithm (alg), tn)
1819end
1920
20- # Internal recursive worker
21- function recursive_contractnetwork (tn:: Union{AbstractVector, AbstractNamedDimsArray} )
22- tn isa AbstractVector && return prod (recursive_contractnetwork, tn)
23- return tn
24- end
25-
26- # Recursive worker for ordering the tensors according to the sequence
27- rearrange (tn:: Vector{<:AbstractArray} , i:: Integer ) = tn[i]
28- rearrange (tn:: Vector{<:AbstractArray} , v:: AbstractVector ) = [rearrange (tn, s) for s in v]
29-
3021function contractnetwork (alg:: Algorithm"exact" , tn:: Vector{<:AbstractArray} )
3122 contract_sequence = isa (alg. sequence, String) ? contraction_sequence (tn; alg = alg. sequence) : sequence
32- return recursive_contractnetwork (rearrange (tn, contract_sequence))
23+ @show contract_sequence
24+ @show materialize (contract_sequence)
25+ contract_sequence = substitute_lazy (contract_sequence, Dict (i => lazy (tn[i]) for i in 1 : length (tn)))
26+ @show contract_sequence
27+ # return materialize(substitute_lazy(contract_sequence, Dict(i => tn[i] for i in 1:length(tn))))
3328end
3429
3530function contractnetwork (alg:: Algorithm"exact" , tn:: AbstractTensorNetwork )
0 commit comments