def reduceUBM(ubm, nh_factor=1, nsteps=300, nsweeps=200, learning_rate=1e-2):

    # create and initialize rbm wave function
    rbm = nqs.brbm_nqs(ubm.nv, int(ubm.nh*nh_factor))
    rbm.setRandomParams()

    rbm.a = np.real(ubm.a) + 0j
    rbm.b[:ubm.nh] = np.real(ubm.b) + 0j
    rbm.W[:ubm.nh,:ubm.nv] = np.real(ubm.W) + 0j
    rbm.Y[:ubm.nv,:ubm.nv] = np.real(ubm.Y) + 0j

    print(np.real(ubm.Y))

    # optimize with real parameters to adjust the absolute value
    # of each coefficient in the ubm
    S = sampler.metropolis(wf=rbm)
    O = optimize.fidelity_GA(S, ubm)
    O.opt(nsteps,nsweeps,learning_rate)

    # now I have to take care of the phases of the coefficients
#    a, Y = optimize.opt_phases(ubm.logPsi_dict, ubm.nv, 1000, 1e-2)

    # create a new ubm
    new = rbm.asUBM()
#    new.Y = 1j*Y
#    new.a += 1j*a

    return new, O.fidelity[-1]
def det_reduceUBM(ubm, nsteps=60, learning_rate=.1):

    # create and initialize rbm wave function
    rbm = nqs.brbm_nqs(ubm.nv, ubm.nh)
    rbm.setRandomParams()

    rbm.a = ubm.a
    rbm.b = ubm.b
    rbm.W = ubm.W
    rbm.Y = ubm.Y

#    rbm.a = np.real(ubm.a) + 0j
#    rbm.b[:ubm.nh] = np.real(ubm.b) + 0j
#    rbm.W[:ubm.nh,:ubm.nv] = np.real(ubm.W) + 0j
#    rbm.Y[:ubm.nv,:ubm.nv] = np.real(ubm.Y) + 0j

    # optimization
    O = optimize.det_fidelity_GA(rbm, ubm)
    #O = optimize.det_rel_entropy_GD(rbm, ubm)
    O.opt(nsteps,learning_rate)

    new = rbm.asUBM()

    # now I have to take care of the phases of the coefficients
#    a, Y = optimize.opt_phases(ubm.logPsi_dict, ubm.nv, 5000, 1e-2,1)
#
#    new.Y += 1j*Y
#    new.a += 1j*a

#    return new, O.rel_entropy[-1], a, Y, ubm
    return new, O.fidelity[-1]
Beispiel #3
0
def run_inf_trotter(N, h, st, dt, init_wf=None):

    trotter_st = st
    trotter_dt = dt
    decay_rate = 1

    mod = models.TransIsing1D(N, h, pbc=True)

    if init_wf == None:
        wf = nqs.brbm_nqs(N, N)
        wf.W[:N, :] = .1 * np.eye(N, dtype=complex)
    else:
        wf = init_wf

    meanS = []
    stdS = []

    print("Applying Trotter Evolution...")
    for k in range(trotter_st):

        print(k)
        if True:  #k%5==0:#True:#k==trotter_st-1:
            print("Measuring SigmaX...")
            M = {'E': 0, 'E2': 0}
            S = sampler.metropolis(wf=wf)
            S.afterSweep = lambda S: measure_sigmax(M, mod, S)
            S.run(nsweeps=5000, output=False)
            print(M['E'], np.sqrt(M['E2'] - M['E']**2))
            meanS.append(M['E'][0, 0])
            stdS.append(np.sqrt(M['E2'] - M['E']**2)[0, 0])

        tao = trotter_dt * (decay_rate**(k / trotter_st))
        mod.applyTrotterStep(wf, tao, inf=True)

    return mod, wf, meanS, stdS
Beispiel #4
0
def run_inf_trotter(N, h, st, dt, init_wf=None):

    trotter_st = st
    trotter_dt = dt
    decay_rate = 1

    mod = models.TransIsing1D(N, h, pbc=True)

    if init_wf == None:
        wf = nqs.brbm_nqs(N, N)
        #wf.W = .1*np.random.rand(N,N).astype(complex)
        wf.W[:N, :] = .1 * np.eye(N, dtype=complex)
        #        for k in range(N):
        #            wf.W[N+k,k] = .2
        #        for k in range(N-1):
        #            wf.W[N+k,k+1] = .2
    else:
        wf = init_wf

    meanE = []
    stdE = []

    print("Applying Trotter Evolution...")
    for k in range(trotter_st):

        #        print('a', wf.nh)
        #        wf.rmVisibleInt()
        #        print('b', wf.nh)
        #        wf.rmHiddenNodes(keep=4*N)

        print(k)
        if k % 5 == 0:  #True:#k==trotter_st-1:
            print("Measuring Energy...")
            M = {'E': 0, 'E2': 0, 'C': 0}
            S = sampler.metropolis(wf=wf)
            S.afterSweep = lambda S: measure(M, mod, S)
            S.run(nsweeps=1000, output=False)
            print(M['E'], np.sqrt(M['E2'] - M['E']**2))
            meanE.append(M['E'][0, 0])
            stdE.append(np.sqrt(M['E2'] - M['E']**2)[0, 0])

        tao = trotter_dt * (decay_rate**(k / trotter_st))
        mod.applyTrotterStep(wf, -1j * tao, inf=True)

    return mod, wf, meanE, stdE
Beispiel #5
0
def run_inf_trotter2(N, h, st, dt, init_wf=None):

    trotter_st = st
    trotter_dt = dt
    decay_rate = 1

    mod = models.TransIsing1D(N, h, pbc=True)

    if init_wf == None:
        wf = nqs.brbm_nqs(N, 0)
    else:
        wf = init_wf

    meanE = []
    stdE = []

    print("Applying Trotter Evolution...")
    for k in range(trotter_st):

        #        wf.rmHiddenNodes(keep=4*N)

        print(k)
        if True:  #k==trotter_st-1:
            print("Measuring Energy...")
            M = {'E': 0, 'E2': 0, 'C': 0}
            S = sampler.metropolis(wf=wf)
            S.afterSweep = lambda S: measure(M, mod, S)
            S.run(nsweeps=1000, output=False)
            print(M['E'], np.sqrt(M['E2'] - M['E']**2))
            meanE.append(M['E'][0, 0])
            stdE.append(np.sqrt(M['E2'] - M['E']**2)[0, 0])

        tao = trotter_dt * (decay_rate**(k / trotter_st))
        mod.applyTrotterStep(wf, -1j * tao, inf=True, hidden_crz=True)

    return mod, wf, meanE, stdE
Beispiel #6
0
import numpy as np

import nqs
import models
import sampler
import optimize

#wf = nqs.ti_brbm_nqs(nv=10,nf=1)
wf = nqs.brbm_nqs(nv=10, nh=10)
wf.setRandomParams()

TI = models.TransIsing1D(nspins=10, hfield=.1)

S = sampler.metropolis(wf=wf)

O = optimize.energy_GD(S, TI)