|
| 1 | +using DiagonalArrays: δ |
| 2 | +using Graphs: edges, ne, nv, vertices |
| 3 | +using ITensorBase: Index |
| 4 | +using ITensorNetworksNext: contract_network |
| 5 | +using ITensorNetworksNext.TensorNetworkGenerators: delta_network, ising_network |
| 6 | +using NamedDimsArrays: inds |
| 7 | +using NamedGraphs.GraphsExtensions: arranged_edges, incident_edges |
| 8 | +using NamedGraphs.NamedGraphGenerators: named_grid |
| 9 | +using Test: @test, @testset |
| 10 | + |
| 11 | +module TestUtils |
| 12 | + using QuadGK: quadgk |
| 13 | + # Exact critical inverse temperature for 2D square lattice Ising model. |
| 14 | + βc() = 0.5 * log(1 + √2) |
| 15 | + # Exact infinite volume free energy density for 2D square lattice Ising model. |
| 16 | + function ising_free_energy_density(β::Real) |
| 17 | + κ = 2sinh(2β) / cosh(2β)^2 |
| 18 | + integrand(θ) = log(0.5 * (1 + sqrt(abs(1 - (κ * sin(θ))^2)))) |
| 19 | + integral, _ = quadgk(integrand, 0, π) |
| 20 | + return (-log(2cosh(2β)) - (1 / (2π)) * integral) / β |
| 21 | + end |
| 22 | +end |
| 23 | + |
| 24 | +@testset "TensorNetworkGenerators" begin |
| 25 | + @testset "Delta Network" begin |
| 26 | + dims = (3, 3) |
| 27 | + g = named_grid(dims) |
| 28 | + ldict = Dict(e => Index(2) for e in edges(g)) |
| 29 | + l(e) = get(() -> ldict[reverse(e)], ldict, e) |
| 30 | + tn = delta_network(l, g) |
| 31 | + @test nv(tn) == 9 |
| 32 | + @test ne(tn) == ne(g) |
| 33 | + @test issetequal(vertices(tn), vertices(g)) |
| 34 | + @test issetequal(arranged_edges(tn), arranged_edges(g)) |
| 35 | + for v in vertices(tn) |
| 36 | + is = l.(incident_edges(g, v)) |
| 37 | + @test tn[v] == δ(Tuple(is)) |
| 38 | + end |
| 39 | + end |
| 40 | + @testset "Ising Network" begin |
| 41 | + dims = (4, 4) |
| 42 | + β = TestUtils.βc() |
| 43 | + g = named_grid(dims; periodic = true) |
| 44 | + ldict = Dict(e => Index(2) for e in edges(g)) |
| 45 | + l(e) = get(() -> ldict[reverse(e)], ldict, e) |
| 46 | + tn = ising_network(l, β, g) |
| 47 | + @test nv(tn) == 16 |
| 48 | + @test ne(tn) == ne(g) |
| 49 | + @test issetequal(vertices(tn), vertices(g)) |
| 50 | + @test issetequal(arranged_edges(tn), arranged_edges(g)) |
| 51 | + for v in vertices(tn) |
| 52 | + is = l.(incident_edges(g, v)) |
| 53 | + @test issetequal(is, inds(tn[v])) |
| 54 | + @test tn[v] ≠ δ(Tuple(is)) |
| 55 | + end |
| 56 | + # TODO: Use eager contraction sequence finding. |
| 57 | + z = contract_network(tn; alg = "exact")[] |
| 58 | + f = -log(z) / (β * nv(g)) |
| 59 | + f_inf = TestUtils.ising_free_energy_density(β) |
| 60 | + @test f ≈ f_inf rtol = 1.0e-1 |
| 61 | + end |
| 62 | +end |
0 commit comments