heisenberg.py 3.28 KB
Newer Older
mgassner's avatar
mgassner committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import numpy as np
import yaml
import time
import matplotlib.pyplot as plt

from create_model import spin_model
from entropy_new import reduced_dm, compute_entropy

def test_xxx():
    model_name = 'xxz'
    number_spins = 4
    periodic = True
    param = -2.0
    if param < -3.0:
        hamming_weight = 0
    else: 
        hamming_weight=None
    model = spin_model(model_name=model_name, number_spins=number_spins, periodic=periodic, 
                            param=param, hamming_weight=hamming_weight)
    model.compute_ew_and_ev()
    print('EIGENSTATE at h/J = ', param, 'is: ', model.eigenstates[:,0])
    sub_dim = 2
    number_spins = model.number_spins()
    basis_states = model.basis.states
    gs = model.eigenstates[:,0]
    print('Number Spins: ', model.basis.number_spins)
    print('States', model.basis.states)
    rhos = reduced_dm(sub_dim, number_spins, hamming_weight, gs, basis_states)
    print(rhos)
    entropy = compute_entropy(rhos)
    print(entropy)

def test_area_law():
    model_name = 'xxz'
    number_spins = 12
    periodic = True
    hamming_weight = number_spins // 2
    params = np.linspace(-4.0, 4.0, 41)
    
    entropies = {}
    sub_dims = [i for i in range(2,number_spins-1)]
    for param in params:
        bipartite_entropies = []
        model = spin_model(model_name=model_name, number_spins=number_spins, periodic=periodic, 
                                param=param, hamming_weight=hamming_weight)
        model.compute_ew_and_ev()
        gs = model.eigenstates[:,0]
        basis_states = model.basis.states
        for sub_dim in sub_dims:
            print('----------------------------------')
            print('Sub Dimension is ', sub_dim)
            rhos = reduced_dm(sub_dim, number_spins, hamming_weight, gs, basis_states)
            bipartite_entropies.append(compute_entropy(rhos))
        entropies[str(param)] = bipartite_entropies
        del model
    
    data = {
        'Model': model_name,
        'Number_spins': number_spins,
        'Periodic': periodic,
        'Hamming_weight': hamming_weight,
        'Sub_dims': sub_dims,
        'Delta_over_J': params,
        'Entropies': entropies
    }

    timestr = time.strftime("%Y%m%d-%H%M%S")
    filename = 'test_area_law_' + timestr
    with open('output/' + filename + '.yaml', 'w') as outfile:
        yaml.dump(data, outfile, default_flow_style=False)
    print(filename)
    plt.figure(figsize=(12,12))
    i = 0
    for key in entropies:
        if i % 5 == 0:
            plt.plot(np.array(sub_dims)/number_spins, entropies[key], label='Delta_over_J:' + key)
        i += 1
    plt.legend()
    plt.xlabel('x/L')
    plt.ylabel('Bipartite Entanglement Entropy')
    plt.title('Model:' + model_name + ' Number spins:' + str(number_spins))#, ' Periodic:' + str(periodic))
    plt.grid(True)

    plt.savefig('output/' + filename + '.jpg')


    plt.figure(figsize=(20,20))
    half_chain_ee = []
    for key in entropies:
        half_chain_ee.append(entropies[key][7])
    plt.plot(params, half_chain_ee, label='Delta_over_J:' + key)
    plt.legend()
    plt.xlabel('Delta / J')
    plt.ylabel('Bipartite Entanglement Entropy')
    plt.title('Model:' + model_name + ' Number spins:' + str(number_spins))#, ' Periodic:' + str(periodic))
    plt.grid(True)

    plt.savefig('output/' + 'entropy' + timestr + '.jpg')