@@ -23,7 +23,8 @@ using ITensorNetworks:
2323 tensornetwork,
2424 update,
2525 update_factor,
26- update_message
26+ update_message,
27+ message_diff
2728using ITensors: ITensors, ITensor, combiner, dag, inds, inner, op, prime, random_itensor
2829using ITensorNetworks. ModelNetworks: ModelNetworks
2930using ITensors. NDTensors: array
@@ -34,50 +35,56 @@ using NamedGraphs.PartitionedGraphs: PartitionVertex, partitionedges
3435using SplitApplyCombine: group
3536using StableRNGs: StableRNG
3637using Test: @test , @testset
37- @testset " belief_propagation" begin
38- ITensors. disable_warn_order ()
39- g = named_grid ((3 , 3 ))
40- s = siteinds (" S=1/2" , g)
41- χ = 2
42- rng = StableRNG (1234 )
43- ψ = random_tensornetwork (rng, s; link_space= χ)
44- ψψ = ψ ⊗ prime (dag (ψ); sites= [])
45- bpc = BeliefPropagationCache (ψψ)
46- bpc = update (bpc; maxiter= 50 , tol= 1e-10 )
47- # Test messages are converged
48- for pe in partitionedges (partitioned_tensornetwork (bpc))
49- @test update_message (bpc, pe) ≈ message (bpc, pe) atol = 1e-8
50- end
51- # Test updating the underlying tensornetwork in the cache
52- v = first (vertices (ψψ))
53- rng = StableRNG (1234 )
54- new_tensor = random_itensor (rng, inds (ψψ[v]))
55- bpc_updated = update_factor (bpc, v, new_tensor)
56- ψψ_updated = tensornetwork (bpc_updated)
57- @test ψψ_updated[v] == new_tensor
5838
59- # Test forming a two-site RDM. Check it has the correct size, trace 1 and is PSD
60- vs = [(2 , 2 ), (2 , 3 )]
39+ @testset " belief_propagation (eltype=$elt )" for elt in (
40+ Float32, Float64, Complex{Float32}, Complex{Float64}
41+ )
42+ begin
43+ ITensors. disable_warn_order ()
44+ g = named_grid ((3 , 3 ))
45+ s = siteinds (" S=1/2" , g)
46+ χ = 2
47+ rng = StableRNG (1234 )
48+ ψ = random_tensornetwork (rng, elt, s; link_space= χ)
49+ ψψ = ψ ⊗ prime (dag (ψ); sites= [])
50+ bpc = BeliefPropagationCache (ψψ, group (v -> first (v), vertices (ψψ)))
51+ bpc = update (bpc; maxiter= 25 , tol= eps (real (elt)))
52+ # Test messages are converged
53+ for pe in partitionedges (partitioned_tensornetwork (bpc))
54+ @test message_diff (update_message (bpc, pe), message (bpc, pe)) < 10 * eps (real (elt))
55+ @test eltype (only (message (bpc, pe))) == elt
56+ end
57+ # Test updating the underlying tensornetwork in the cache
58+ v = first (vertices (ψψ))
59+ rng = StableRNG (1234 )
60+ new_tensor = random_itensor (rng, inds (ψψ[v]))
61+ bpc_updated = update_factor (bpc, v, new_tensor)
62+ ψψ_updated = tensornetwork (bpc_updated)
63+ @test ψψ_updated[v] == new_tensor
64+
65+ # Test forming a two-site RDM. Check it has the correct size, trace 1 and is PSD
66+ vs = [(2 , 2 ), (2 , 3 )]
6167
62- ψψsplit = split_index (ψψ, NamedEdge .([(v, 1 ) => (v, 2 ) for v in vs]))
63- env_tensors = environment (bpc, [(v, 2 ) for v in vs])
64- rdm = contract (vcat (env_tensors, ITensor[ψψsplit[vp] for vp in [(v, 2 ) for v in vs]]))
68+ ψψsplit = split_index (ψψ, NamedEdge .([(v, 1 ) => (v, 2 ) for v in vs]))
69+ env_tensors = environment (bpc, [(v, 2 ) for v in vs])
70+ rdm = contract (vcat (env_tensors, ITensor[ψψsplit[vp] for vp in [(v, 2 ) for v in vs]]))
6571
66- rdm = array ((rdm * combiner (inds (rdm; plev= 0 )... )) * combiner (inds (rdm; plev= 1 )... ))
67- rdm /= tr (rdm)
72+ rdm = array ((rdm * combiner (inds (rdm; plev= 0 )... )) * combiner (inds (rdm; plev= 1 )... ))
73+ rdm /= tr (rdm)
6874
69- eigs = eigvals (rdm)
70- @test size (rdm) == (2 ^ length (vs), 2 ^ length (vs))
75+ eigs = eigvals (rdm)
76+ @test size (rdm) == (2 ^ length (vs), 2 ^ length (vs))
7177
72- @test all (eig -> imag (eig) ≈ 0 , eigs)
73- @test all (eig -> real (eig) >= - eps (eltype (eig )), eigs)
78+ @test all (eig -> abs ( imag (eig)) <= eps ( real (elt)) , eigs)
79+ @test all (eig -> real (eig) >= - eps (real (elt )), eigs)
7480
75- # Test edge case of network which evalutes to 0
76- χ = 2
77- g = named_grid ((3 , 1 ))
78- rng = StableRNG (1234 )
79- ψ = random_tensornetwork (rng, ComplexF64, g; link_space= χ)
80- ψ[(1 , 1 )] = 0.0 * ψ[(1 , 1 )]
81- @test iszero (scalar (ψ; alg= " bp" ))
81+ # Test edge case of network which evalutes to 0
82+ χ = 2
83+ g = named_grid ((3 , 1 ))
84+ rng = StableRNG (1234 )
85+ ψ = random_tensornetwork (rng, elt, g; link_space= χ)
86+ ψ[(1 , 1 )] = 0 * ψ[(1 , 1 )]
87+ @test iszero (scalar (ψ; alg= " bp" ))
88+ end
8289end
8390end
0 commit comments