Esempio n. 1
0
# 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'])
Esempio n. 2
0
    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
Esempio n. 3
0
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
Esempio n. 4
0
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'])
Esempio n. 5
0
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'],