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 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() def test_tfim(number_spins, param_range, periodic = False): model_name = 'tfim' hamming_weight = None #number_spins // 2 spin_inversion= None params = np.linspace(param_range[0], param_range[1], int(param_range[2])) entropies = [] for param in params: 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]) gs = model.eigenstates[:,0] basis_states = model.basis.states sub_dim = number_spins // 2 first_trace_spin = None #number_spins // 4 rhos = reduced_dm(sub_dim, number_spins, hamming_weight, gs, basis_states, first_trace_spin=first_trace_spin) entropies.append(compute_entropy(rhos)) del model plt.figure(figsize=(12, 12)) plt.plot(params, entropies, label="half chain entropy") plt.legend() plt.xlabel('h / J') plt.ylabel('Bipartite Entanglement Entropy') plt.title('Model:' + model_name + str(number_spins) + str(periodic)) plt.grid(True) timestr = time.strftime("%Y%m%d-%H%M%S") plt.savefig('output/' + timestr + 'entropytest.jpg') def test_area_law(number_spins, periodic, param_range): model_name = 'tfim' spin_inversion = None params = np.linspace(param_range[0], param_range[1], int(param_range[2])) hamming_weight = None # TODO: ????? 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, param=param, hamming_weight=hamming_weight, spin_inversion=spin_inversion) 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_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 x = np.array(sub_dims)/number_spins if spin_inversion: x -= 1/number_spins for key in entropies: if i % 5 == 0: plt.plot(np.array(sub_dims)/number_spins, entropies[key], label='h 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=(12,12)) half_chain_ee = [] for key in entropies: half_chain_ee.append(entropies[key][number_spins // 2 - 1]) plt.plot(params, half_chain_ee, label='h 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_tfim_' + timestr + '.jpg') if __name__ == "__main__": param_range = args.param_range number_spins = args.number_spins periodic = args.periodic #test_area_law(number_spins, periodic, param_range) test_tfim(number_spins, param_range)