# num_samples = 100 # h1 = np.random.rand(num_samples, 1) * delta # h2 = np.random.rand(num_samples, 1) * delta + (0.82 - delta) # h = np.vstack((h1, h2)) gap = [0.5] for delta in gap: num_samples = 100 h1 = np.random.rand(num_samples, 1) * delta h2 = np.random.rand(num_samples, 1) * delta + (1 - delta) h = np.vstack((h1, h2)) j = [1] tol = 1e-4 # to judge if the state has two-fold degeneracy lattice = 'chain' para = pm.generate_parameters_dmrg(lattice) para['spin'] = 'one' para['bound_cond'] = 'periodic' para['chi'] = 128 para['l'] = 12 para['jxy'] = 1 para['hx'] = 0 model = 'Spin_' + para['spin'] + '_' + lattice # para['data_path'] = '..\\dataQubism\\states_' + model + '\\' para['data_path'] = 'E:\\tmpData\\states_' + model + '\\' para[ 'image_path'] = '..\\dataQubism\\images_' + model + '\\train 0-' + str( delta) mkdir(para['data_path']) mkdir(para['image_path'])
fidelities_to_original_state, act_umpo_on_mps from library.TensorBasicModule import open_mps_product_state_spin_up import copy, sys length = np.arange(4, 156, 4, dtype=int) pre_fix = path.basename(__file__)[:-3] + '_' num_len = length.size fid = np.zeros((num_len, )) fid_prod0 = np.zeros((num_len, )) ent0_mid = np.zeros((num_len, )) fid_ini = np.zeros((num_len,)) lattice = 'chain' para_dmrg = Pm.generate_parameters_dmrg(lattice) para_dmrg['spin'] = 'half' para_dmrg['bound_cond'] = 'open' para_dmrg['chi'] = 100 para_dmrg['l'] = 12 para_dmrg['jxy'] = 0 para_dmrg['jz'] = 1 para_dmrg['hx'] = 0.5 para_dmrg['hz'] = 0 para_dmrg = Pm.make_consistent_parameter_dmrg(para_dmrg) para_dmps = parameters_dmps() para_dmps['num_layers'] = 1 para_dmps['chi_overlap'] = 256 para_dmps['theta'] = 0 para_dmps['num_theta'] = 1
def dmrg_finite_size(para=None): from library.MPSClass import MpsOpenBoundaryClass as Mob t_start = time.time() info = dict() print('Preparing the parameters and MPS') if para is None: para = pm.generate_parameters_dmrg() # Initialize MPS is_parallel = para['isParallel'] if is_parallel or para['isParallelEnvLMR']: par_pool = dict() par_pool['n'] = n_nodes par_pool['pool'] = ThreadPool(n_nodes) else: par_pool = None A = Mob(length=para['l'], d=para['d'], chi=para['chi'], way='qr', ini_way='r', operators=para['op'], debug=is_debug, is_parallel=para['isParallel'], par_pool=par_pool, is_save_op=para['is_save_op'], eig_way=para['eigWay'], is_env_parallel_lmr=para['isParallelEnvLMR']) A.correct_orthogonal_center(para['ob_position']) print('Starting to sweep ...') e0_per_site = 0 info['convergence'] = 1 ob = dict() for t in range(0, para['sweep_time']): if_ob = ((t + 1) % para['dt_ob'] == 0) or t == (para['sweep_time'] - 1) if if_ob: print('In the %d-th round of sweep ...' % (t + 1)) for n in range(para['ob_position'] + 1, para['l']): if para['if_print_detail']: print('update the %d-th tensor from left to right...' % n) A.update_tensor_eigs(n, para['index1'], para['index2'], para['coeff1'], para['coeff2'], para['tau'], para['is_real'], tol=para['eigs_tol']) for n in range(para['l'] - 2, -1, -1): if para['if_print_detail']: print('update the %d-th tensor from right to left...' % n) A.update_tensor_eigs(n, para['index1'], para['index2'], para['coeff1'], para['coeff2'], para['tau'], para['is_real'], tol=para['eigs_tol']) for n in range(1, para['ob_position']): if para['if_print_detail']: print('update the %d-th tensor from left to right...' % n) A.update_tensor_eigs(n, para['index1'], para['index2'], para['coeff1'], para['coeff2'], para['tau'], para['is_real'], tol=para['eigs_tol']) if if_ob: ob['eb_full'] = A.observe_bond_energy(para['index2'], para['coeff2']) ob['mx'] = A.observe_magnetization(1) ob['mz'] = A.observe_magnetization(3) ob['e_per_site'] = (sum(ob['eb_full']) - para['hx'] * sum(ob['mx']) - para['hz'] * sum(ob['mz'])) / A.length # if para['lattice'] in ('square', 'chain'): # ob['e_per_site'] = (sum(ob['eb_full']) - para['hx']*sum(ob['mx']) - para['hz'] * # sum(ob['mz']))/A.length # else: # ob['e_per_site'] = sum(ob['eb_full']) # for n in range(0, para['l']): # ob['e_per_site'] += para['hx'][n] * ob['mx'][n] # ob['e_per_site'] += para['hz'][n] * ob['mz'][n] # ob['e_per_site'] /= A.length info['convergence'] = abs(ob['e_per_site'] - e0_per_site) if info['convergence'] < para['break_tol']: print( 'Converged at the %d-th sweep with error = %g of energy per site.' % (t + 1, info['convergence'])) break else: print('Convergence error of energy per site = %g' % info['convergence']) e0_per_site = ob['e_per_site'] if t == para['sweep_time'] - 1 and info['convergence'] > para[ 'break_tol']: print('Not converged with error = %g of eb per bond' % info['convergence']) print('Consider to increase para[\'sweep_time\']') ob['eb'] = get_bond_energies(ob['eb_full'], para['positions_h2'], para['index2']) A.calculate_entanglement_spectrum() A.calculate_entanglement_entropy() ob['corr_x'] = A.observe_correlators_from_middle(1, 1) ob['corr_z'] = A.observe_correlators_from_middle(3, 3) info['t_cost'] = time.time() - t_start print('Simulation finished in %g seconds' % info['t_cost']) A.clean_to_save() if A._is_parallel: par_pool['pool'].close() return ob, A, info, para
from algorithms.DMRG_anyH import dmrg_finite_size from library import Parameters as Pm para = Pm.generate_parameters_dmrg('husimi') para['spin'] = 'half' para['depth'] = 2 # The interactions are assumed to be uniform; if not, use parameter_dmrg_arbitrary instead para['jxy'] = 1 para['jz'] = 1 para['hx'] = 0 para['hz'] = 0 para['chi'] = 32 # Virtual bond dimension cut-off para['eigWay'] = 1 para = Pm.make_consistent_parameter_dmrg(para) ob, A, info1, para1 = dmrg_finite_size(para) print(ob['e_per_site'])
from algorithms.DMRG_anyH import dmrg_finite_size from library import Parameters as Pm import numpy as np from os import path from library.BasicFunctions import load_pr, save_pr, plot, output_txt, get_size from algorithms.DeepMPSfinite import parameters_dmps, deep_mps_qubit, \ fidelities_to_original_state, act_umpo_on_mps from library.TensorBasicModule import open_mps_product_state_spin_up """ NOTE: for Linux, add the fold "T-Nalg" in your system path """ para_dmrg = Pm.generate_parameters_dmrg( 'chain') # set default parameters of DMRG para_dmrg['spin'] = 'half' # spin-half model para_dmrg['bound_cond'] = 'open' # open boundary condition para_dmrg['chi'] = 48 # dimension cut-off of DMRG para_dmrg['l'] = 48 # system size para_dmrg['jxy'] = 0 # coupling constant - jx and jy in the Heisenberg model para_dmrg['jz'] = 1 # coupling constant - jz in the Heisenberg model para_dmrg['hx'] = 0.3 # magnetic field in the x direction para_dmrg['hz'] = 0 # magnetic field in the z direction para_dmrg = Pm.make_consistent_parameter_dmrg( para_dmrg) # check consistency of the parameters para_dmps = parameters_dmps() # set default parameters of MPS encoding para_dmps['num_layers'] = 9 # number of the MPU layers in the circuit para_dmps['chi_overlap'] = 256 # dimension cut-off of the disentangled MPS # calculate the ground state by DMRG pre_fix = path.basename(__file__)[:-3] + '_' if path.isfile(path.join(para_dmrg['data_path'],