11using BackendSelection: @Algorithm_str , Algorithm
22
3- default_sequence_alg = " leftassociative"
3+ default_contract_alg = nothing
4+
5+ # Algorithmic defaults
6+ default_sequence (:: Algorithm"exact" ) = " leftassociative"
7+ function set_default_kwargs (alg:: Algorithm"exact" )
8+ sequence = get (alg, :sequence , default_sequence (alg))
9+ return Algorithm (" exact" ; sequence)
10+ end
411
512function contraction_sequence (:: Algorithm"leftassociative" , tn:: Vector{<:AbstractArray} )
613 return Any[i for i in 1 : length (tn)]
2027rearrange (tn:: Vector{<:AbstractArray} , i:: Integer ) = tn[i]
2128rearrange (tn:: Vector{<:AbstractArray} , v:: AbstractVector ) = [rearrange (tn, s) for s in v]
2229
23- function contractnetwork (tn:: Vector{<:AbstractArray} ; sequence = default_sequence_alg )
24- contract_sequence = isa (sequence, String) ? contraction_sequence (tn; alg= sequence) : sequence
30+ function contractnetwork (alg :: Algorithm"exact" , tn:: Vector{<:AbstractArray} )
31+ contract_sequence = isa (alg . sequence, String) ? contraction_sequence (tn; alg= alg . sequence) : sequence
2532 return recursive_contractnetwork (rearrange (tn, contract_sequence))
2633end
2734
28- function contractnetwork (tn:: AbstractTensorNetwork ; sequence = default_sequence_alg )
29- return contractnetwork ([tn[v] for v in vertices (tn)]; sequence )
35+ function contractnetwork (alg :: Algorithm"exact" , tn:: AbstractTensorNetwork )
36+ return contractnetwork (alg, [tn[v] for v in vertices (tn)])
3037end
38+
39+ function contractnetwork (tn:: Union{AbstractTensorNetwork, Vector{<:AbstractArray}} ; alg = default_contract_alg, kwargs... )
40+ alg == nothing && error (" Must specify an algorithm to contract the network with" )
41+ return contractnetwork (set_default_kwargs (Algorithm (alg; kwargs... )), tn)
42+ end
0 commit comments