tfim.py 4.15 KB
Newer Older
mgassner's avatar
mgassner committed
1
2
3
4
5
6
7
8
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

mgassner's avatar
mgassner committed
9
10
11
12
13
14
15
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--set_number_spins", "-d", dest='number_spins',type=int, required=False)
parser.add_argument("--set_param_range_and_steps", '-pr', dest='param_range', nargs='+', type=float, required=False)
parser.add_argument("--boundary_condition", "-b", dest='periodic' ,type=bool, required=False)
args = parser.parse_args()

mgassner's avatar
mgassner committed
16
17
def test_tfim():
    model_name = 'tfim'
mgassner's avatar
mgassner committed
18
    number_spins = 8
mgassner's avatar
mgassner committed
19
    periodic = True
mgassner's avatar
mgassner committed
20
21
    hamming_weight = number_spins // 2
    param = 0.5
mgassner's avatar
mgassner committed
22
    spin_inversion= None
mgassner's avatar
mgassner committed
23
    model = spin_model(model_name=model_name, number_spins=number_spins, periodic=periodic, 
mgassner's avatar
mgassner committed
24
                            param=param, hamming_weight=None, spin_inversion=spin_inversion)
mgassner's avatar
mgassner committed
25
26
    model.compute_ew_and_ev()
    print('EIGENSTATE at h/J = ', param, 'is: ', model.eigenstates[:,0])
mgassner's avatar
mgassner committed
27
28
    sub_dims = np.arange(1, number_spins)
    bipartite_entropies = []
mgassner's avatar
mgassner committed
29
30
    gs = model.eigenstates[:,0]
    basis_states = model.basis.states
mgassner's avatar
mgassner committed
31
32
33
34
35
36
37
38
    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, spin_inversion)
        bipartite_entropies.append(compute_entropy(rhos))
    del model
    print(sub_dims, bipartite_entropies)
    
mgassner's avatar
mgassner committed
39

mgassner's avatar
mgassner committed
40
def test_area_law(number_spins, periodic, param_range):
mgassner's avatar
mgassner committed
41
    model_name = 'tfim'
mgassner's avatar
mgassner committed
42
43
    spin_inversion = None
    params = np.linspace(param_range[0], param_range[1], int(param_range[2]))
mgassner's avatar
mgassner committed
44
    hamming_weight = None # TODO: ?????
mgassner's avatar
mgassner committed
45
46
47
48
49
    entropies = {}
    sub_dims = [i for i in range(1,number_spins)]
    for param in params:
        bipartite_entropies = []
        model = spin_model(model_name=model_name, number_spins=number_spins, periodic=periodic, 
mgassner's avatar
mgassner committed
50
                                param=param, hamming_weight=hamming_weight, spin_inversion=spin_inversion)
mgassner's avatar
mgassner committed
51
52
53
54
55
56
        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)
mgassner's avatar
mgassner committed
57
58
            rhos = reduced_dm(sub_dim, number_spins, hamming_weight, gs, basis_states)
            bipartite_entropies.append(compute_entropy(rhos))
mgassner's avatar
mgassner committed
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
        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_tfim_' + 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
mgassner's avatar
mgassner committed
79
80
81
    x = np.array(sub_dims)/number_spins
    if spin_inversion:
        x -= 1/number_spins
mgassner's avatar
mgassner committed
82
83
    for key in entropies:
        if i % 5 == 0:
mgassner's avatar
mgassner committed
84
            plt.plot(np.array(sub_dims)/number_spins, entropies[key], label='h over J:' + key)
mgassner's avatar
mgassner committed
85
86
87
88
89
90
91
92
93
94
        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')


mgassner's avatar
mgassner committed
95
    plt.figure(figsize=(12,12))
mgassner's avatar
mgassner committed
96
97
    half_chain_ee = []
    for key in entropies:
mgassner's avatar
mgassner committed
98
        half_chain_ee.append(entropies[key][number_spins // 2 - 1])
mgassner's avatar
mgassner committed
99
    plt.plot(params, half_chain_ee, label='h over J:' + key)
mgassner's avatar
mgassner committed
100
101
102
103
104
105
106
    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_tfim_' + timestr + '.jpg')
mgassner's avatar
mgassner committed
107
108
109
110
111

if __name__ == "__main__":
    param_range = args.param_range
    number_spins = args.number_spins
    periodic = args.periodic
mgassner's avatar
mgassner committed
112
113
    #test_area_law(number_spins, periodic, param_range)
    test_tfim()