|
1 | 1 | @eval module $(gensym()) |
2 | 2 | using ITensorNetworks.ITensorsExtensions: eigendecomp, map_eigvals |
3 | | -using ITensors: ITensors, ITensor, Index, QN, apply, dag, delta, inds, mapprime, noprime, |
4 | | - norm, op, permute, prime, random_itensor, replaceind, replaceinds, sim, swapprime |
| 3 | +using ITensors.NDTensors: with_auto_fermion |
| 4 | +using ITensors: ITensor, Index, QN, apply, dag, delta, inds, mapprime, noprime, norm, op, |
| 5 | + permute, prime, random_itensor, replaceind, replaceinds, sim, swapprime |
5 | 6 | using StableRNGs: StableRNG |
6 | 7 | using Test: @test, @testset |
7 | 8 | @testset "ITensorsExtensions" begin |
@@ -61,64 +62,75 @@ using Test: @test, @testset |
61 | 62 | end |
62 | 63 |
|
63 | 64 | @testset "Fermionic eigendecomp" begin |
64 | | - ITensors.enable_auto_fermion() |
65 | | - s1 = Index([QN("Nf", 0, -1) => 2, QN("Nf", 1, -1) => 2], "Site,Fermion,n=1") |
66 | | - s2 = Index([QN("Nf", 0, -1) => 2, QN("Nf", 1, -1) => 2], "Site,Fermion,n=2") |
67 | | - |
68 | | - # Make a random Hermitian matrix-like 4th order ITensor |
69 | | - T = random_itensor(s1', s2', dag(s2), dag(s1)) |
70 | | - T = apply(T, swapprime(dag(T), 0 => 1)) |
71 | | - @test T ≈ swapprime(dag(T), 0 => 1) # check Hermitian |
72 | | - |
73 | | - Ul, D, Ur = eigendecomp(T, [s1', s2'], [dag(s1), dag(s2)]; ishermitian = true) |
74 | | - |
75 | | - @test Ul * D * Ur ≈ T |
76 | | - ITensors.disable_auto_fermion() |
| 65 | + with_auto_fermion() do |
| 66 | + s1 = Index( |
| 67 | + [QN("Nf", 0, -1) => 2, QN("Nf", 1, -1) => 2], "Site,Fermion,n=1" |
| 68 | + ) |
| 69 | + s2 = Index( |
| 70 | + [QN("Nf", 0, -1) => 2, QN("Nf", 1, -1) => 2], "Site,Fermion,n=2" |
| 71 | + ) |
| 72 | + |
| 73 | + # Make a random Hermitian matrix-like 4th order ITensor |
| 74 | + T = random_itensor(s1', s2', dag(s2), dag(s1)) |
| 75 | + T = apply(T, swapprime(dag(T), 0 => 1)) |
| 76 | + @test T ≈ swapprime(dag(T), 0 => 1) # check Hermitian |
| 77 | + |
| 78 | + Ul, D, Ur = eigendecomp(T, [s1', s2'], [dag(s1), dag(s2)]; ishermitian = true) |
| 79 | + |
| 80 | + @test Ul * D * Ur ≈ T |
| 81 | + end |
77 | 82 | end |
78 | 83 |
|
79 | 84 | @testset "Fermionic map eigvals tests" begin |
80 | | - ITensors.enable_auto_fermion() |
81 | | - s1 = Index([QN("Nf", 0, -1) => 2, QN("Nf", 1, -1) => 2], "Site,Fermion,n=1") |
82 | | - s2 = Index([QN("Nf", 0, -1) => 2, QN("Nf", 1, -1) => 2], "Site,Fermion,n=2") |
83 | | - |
84 | | - # Make a random Hermitian matrix ITensor |
85 | | - M = random_itensor(s1', dag(s1)) |
86 | | - #M = mapprime(prime(M)*swapprime(dag(M),0=>1),2=>1) |
87 | | - M = apply(M, swapprime(dag(M), 0 => 1)) |
88 | | - |
89 | | - # Make a random Hermitian matrix-like 4th order ITensor |
90 | | - T = random_itensor(s1', s2', dag(s2), dag(s1)) |
91 | | - T = apply(T, swapprime(dag(T), 0 => 1)) |
92 | | - |
93 | | - # Matrix test |
94 | | - sqrtM = map_eigvals(sqrt, M, [s1'], [dag(s1)]; ishermitian = true) |
95 | | - @test M ≈ apply(sqrtM, sqrtM) |
96 | | - |
97 | | - ## Tensor test |
98 | | - sqrtT = map_eigvals(sqrt, T, [s1', s2'], [dag(s1), dag(s2)]; ishermitian = true) |
99 | | - @test T ≈ apply(sqrtT, sqrtT) |
100 | | - |
101 | | - # Permute and test again |
102 | | - T = permute(T, dag(s2), s2', dag(s1), s1') |
103 | | - sqrtT = map_eigvals(sqrt, T, [s1', s2'], [dag(s1), dag(s2)]; ishermitian = true) |
104 | | - @test T ≈ apply(sqrtT, sqrtT) |
105 | | - |
106 | | - ## Explicitly passing indices in different, valid orders |
107 | | - sqrtT = map_eigvals(sqrt, T, [s2', s1'], [dag(s2), dag(s1)]; ishermitian = true) |
108 | | - @test T ≈ apply(sqrtT, sqrtT) |
109 | | - sqrtT = map_eigvals(sqrt, T, [dag(s2), dag(s1)], [s2', s1'], ; ishermitian = true) |
110 | | - @test T ≈ apply(sqrtT, sqrtT) |
111 | | - sqrtT = map_eigvals(sqrt, T, [dag(s1), dag(s2)], [s1', s2'], ; ishermitian = true) |
112 | | - @test T ≈ apply(sqrtT, sqrtT) |
113 | | - |
114 | | - # Test bosonic index case while fermion system is enabled |
115 | | - b = Index([QN("Nb", 0) => 2, QN("Nb", 1) => 2]) |
116 | | - T = random_itensor(b', dag(b)) |
117 | | - T = apply(T, swapprime(dag(T), 0 => 1)) |
118 | | - sqrtT = map_eigvals(sqrt, T, [b'], [dag(b)]; ishermitian = true) |
119 | | - @test T ≈ apply(sqrtT, sqrtT) |
120 | | - |
121 | | - ITensors.disable_auto_fermion() |
| 85 | + with_auto_fermion() do |
| 86 | + s1 = Index( |
| 87 | + [QN("Nf", 0, -1) => 2, QN("Nf", 1, -1) => 2], "Site,Fermion,n=1" |
| 88 | + ) |
| 89 | + s2 = Index( |
| 90 | + [QN("Nf", 0, -1) => 2, QN("Nf", 1, -1) => 2], "Site,Fermion,n=2" |
| 91 | + ) |
| 92 | + |
| 93 | + # Make a random Hermitian matrix ITensor |
| 94 | + M = random_itensor(s1', dag(s1)) |
| 95 | + #M = mapprime(prime(M)*swapprime(dag(M),0=>1),2=>1) |
| 96 | + M = apply(M, swapprime(dag(M), 0 => 1)) |
| 97 | + |
| 98 | + # Make a random Hermitian matrix-like 4th order ITensor |
| 99 | + T = random_itensor(s1', s2', dag(s2), dag(s1)) |
| 100 | + T = apply(T, swapprime(dag(T), 0 => 1)) |
| 101 | + |
| 102 | + # Matrix test |
| 103 | + sqrtM = map_eigvals(sqrt, M, [s1'], [dag(s1)]; ishermitian = true) |
| 104 | + @test M ≈ apply(sqrtM, sqrtM) |
| 105 | + |
| 106 | + ## Tensor test |
| 107 | + sqrtT = map_eigvals(sqrt, T, [s1', s2'], [dag(s1), dag(s2)]; ishermitian = true) |
| 108 | + @test T ≈ apply(sqrtT, sqrtT) |
| 109 | + |
| 110 | + # Permute and test again |
| 111 | + T = permute(T, dag(s2), s2', dag(s1), s1') |
| 112 | + sqrtT = map_eigvals(sqrt, T, [s1', s2'], [dag(s1), dag(s2)]; ishermitian = true) |
| 113 | + @test T ≈ apply(sqrtT, sqrtT) |
| 114 | + |
| 115 | + ## Explicitly passing indices in different, valid orders |
| 116 | + sqrtT = map_eigvals(sqrt, T, [s2', s1'], [dag(s2), dag(s1)]; ishermitian = true) |
| 117 | + @test T ≈ apply(sqrtT, sqrtT) |
| 118 | + sqrtT = map_eigvals( |
| 119 | + sqrt, T, [dag(s2), dag(s1)], [s2', s1'], ; ishermitian = true |
| 120 | + ) |
| 121 | + @test T ≈ apply(sqrtT, sqrtT) |
| 122 | + sqrtT = map_eigvals( |
| 123 | + sqrt, T, [dag(s1), dag(s2)], [s1', s2'], ; ishermitian = true |
| 124 | + ) |
| 125 | + @test T ≈ apply(sqrtT, sqrtT) |
| 126 | + |
| 127 | + # Test bosonic index case while fermion system is enabled |
| 128 | + b = Index([QN("Nb", 0) => 2, QN("Nb", 1) => 2]) |
| 129 | + T = random_itensor(b', dag(b)) |
| 130 | + T = apply(T, swapprime(dag(T), 0 => 1)) |
| 131 | + sqrtT = map_eigvals(sqrt, T, [b'], [dag(b)]; ishermitian = true) |
| 132 | + @test T ≈ apply(sqrtT, sqrtT) |
| 133 | + end |
122 | 134 | end |
123 | 135 | end |
124 | 136 | end |
0 commit comments