Example #1
0
def test_rand():
    dp = [1, 5, 4, 2, 4]
    mps = dMPX.rand(dp, 7, bc="obc")
    mps_res_shape = [(1, 1, 1),
                     (1, 5, 5),
                     (5, 4, 7),
                     (7, 2, 4),
                     (4, 4, 1)]
    for i, x in enumerate(mps):
        assert(np.allclose(x.shape, mps_res_shape[i]))

    dp = [1, 5, 4, 2, 4]
    mps = dMPX.rand(dp, 7, bc="pbc")
    mps_res_shape = [(7, 1, 7),
                     (7, 5, 7),
                     (7, 4, 7),
                     (7, 2, 7),
                     (7, 4, 7)]
    
    for i, x in enumerate(mps):
        assert(np.allclose(x.shape, mps_res_shape[i]))
    
    print "mps"
    
    dp = [(1,2), (5,3), (4,4)]
    mpo = dMPX.rand(dp, 4, bc="obc")
    mpo_res_shape = [(1, 1, 2, 2),
                     (2, 5, 3, 4),
                     (4, 4, 4, 1)]
    
    print "mpo"
    for i, x in enumerate(mpo):
        print x.shape
        assert(np.allclose(x.shape, mpo_res_shape[i]))
Example #2
0
def test_mul2():
    dp = [1, 5, 4, 2, 4]
    mps = dMPX.rand(dp, 7, bc="obc")
    alpha1 = np.random.random() - 0.5
    res = MPX.mul(alpha1, mps)
    mps_f = MPX.asfull(mps)
    res_from_mps_f = mps_f * alpha1
    res_f = MPX.asfull(res)
    assert(np.allclose(res_f, res_from_mps_f))
   
    dp = [1, 2]
    mps = dMPX.rand(dp, 2, bc="obc", dtype=np.complex)
    alpha1 = 1j
    print mps[0].dtype
    res = MPX.mul(alpha1, mps)
    mps_f = MPX.asfull(mps)
    res_from_mps_f = mps_f * alpha1
    res_f = MPX.asfull(res)

    dp = [1, 2]
    mps = dMPX.rand(dp, 2, bc="pbc", dtype=np.complex)
    alpha1 = 1j
    res = MPX.mul(alpha1, mps)
    mps_f = MPX.asfull(mps)
    res_from_mps_f = mps_f * alpha1
    res_f = MPX.asfull(res)
    assert(np.allclose(res_f, res_from_mps_f))
Example #3
0
def test_dot():
    dp = (4, 5, 3)

    # test mpo x mpo 
    mpo = dMPX.rand(zip(dp, dp), D=3, bc="obc")
    mat = MPX.asfull(mpo)
    
    mpo2 = MPX.dot(mpo, mpo)
    mat2 = np.dot(mat, mat)

    print np.linalg.norm(mat2)
    print np.linalg.norm(MPX.asfull(mpo2))
    
    assert np.linalg.norm(mat2 - MPX.asfull(mpo2)) < 1.e-9

    # test mpo x mps
    mps = dMPX.rand(dp, D=3, bc="pbc")
    vec = MPX.asfull(mps)
    matvec = np.dot(mat, vec)
    mps1 = MPX.dot(mpo, mps)

    assert np.linalg.norm(matvec - MPX.asfull(mps1)) < 1.e-9

    # test mps x mpo
    mps1 = MPX.dot(mps, mpo)
    vecmat = np.dot(vec, mat)
    assert np.linalg.norm(vecmat - MPX.asfull(mps1)) < 1.e-9
    
    # test mps x mps
    norm1 = MPX.dot(mps, mps)
    norm = np.dot(vec, vec)
    assert abs(norm - norm1) < 1.e-9
Example #4
0
def test_dot2():
    dps = [1,4,4,2]
    mps1 = dMPX.rand(dps,4,bc="obc")
    mps2 = dMPX.rand(dps,3,bc="pbc")

    dps_o = [(d,d) for d in dps]
    mpo1 = dMPX.rand(dps_o,4,bc="pbc")
    mpo2 = dMPX.rand(dps_o,3,bc="obc")

    mpo3 = dMPX.rand(dps_o,3,bc="pbc")
    ## <mps1|mps2>
    ss11 = MPX.dot(mps1,mps1)
    ss12 = MPX.dot(mps1,mps2)
    ss22 = MPX.dot(mps2,mps2)
    assert np.allclose(ss11, np.dot(MPX.asfull(mps1), MPX.asfull(mps1)))
    assert np.allclose(ss12, np.dot(MPX.asfull(mps1), MPX.asfull(mps2)))
    assert np.allclose(ss22, np.dot(MPX.asfull(mps2), MPX.asfull(mps2)))

    ## mpo1|mps1>
    os11 = MPX.dot(mpo1,mps1)
    assert np.allclose(MPX.asfull(os11), np.dot(MPX.asfull(mpo1), MPX.asfull(mps1)))

    ## mpo2*mpo1
    oo21 = MPX.dot(mpo2,mpo1)
    assert np.allclose(MPX.asfull(oo21), np.dot(MPX.asfull(mpo2), MPX.asfull(mpo1)))

    ## <mps1|mpo1
    so11 = MPX.dot(mps1,mpo1)
    os32 = MPX.dot(mpo3,mps2)
    so23 = MPX.dot(mps2,mpo3)

    assert np.allclose(MPX.asfull(so11), np.dot(MPX.asfull(mps1), MPX.asfull(mpo1)))
    assert np.allclose(MPX.asfull(os32), np.dot(MPX.asfull(mpo3), MPX.asfull(mps2)))
    assert np.allclose(MPX.asfull(so23), np.dot(MPX.asfull(mps2), MPX.asfull(mpo3)))
Example #5
0
def test_add():
    dps = (2,2,2,2)
    #np.random.seed(417)
    mps_obc = dMPX.rand(dps, D=2, bc="obc")
    mps_obc2 = dMPX.rand(dps, D=2, bc="obc")
    mps_pbc = dMPX.rand(dps, D=2, bc="pbc")
    mps_pbc2 = dMPX.rand(dps, D=2, bc="pbc")
    
    assert np.allclose(np.linalg.norm(MPX.asfull(mps_obc)+MPX.asfull(mps_obc2)),
                       MPX.norm(dMPX.add(mps_obc,mps_obc2)))
    assert np.allclose(np.linalg.norm(MPX.asfull(mps_pbc)+MPX.asfull(mps_pbc2)),
                       MPX.norm(dMPX.add(mps_pbc,mps_pbc2)))
    assert np.allclose(np.linalg.norm(MPX.asfull(mps_obc)+MPX.asfull(mps_pbc2)),
                       MPX.norm(dMPX.add(mps_obc,mps_pbc2)))
Example #6
0
def test_dotcompress():
    dps = [1,2,3,4,2]
    dpo = [(d,d) for d in dps]
    mps = dMPX.rand(dps)
    mpo = dMPX.rand(dpo)
 
    mps2 = MPX.dot(mpo,mps)
    mpsc, errc = MPX.compress(mps2,4)

    mpsdc, errdc = MPX.dot_compress(mpo,mps,4)

    print errc, errdc, errdc-errc

    diff_mps = dMPX.add(MPX.mul(-1,mpsc),mpsdc)
    assert(MPX.norm(diff_mps) < 1.0e-8), MPX.norm(diff_mps)
Example #7
0
def initialize_heisenberg(N, h, J, M):
    """
    Initialize the MPS, MPO, lopr and ropr.
    """
    # MPS
    mpss = dMPX.rand([2] * N, D=M, bc='obc', seed=0)
    normalize_factor = 1.0 / MPSblas.norm(mpss)
    mpss = MPSblas.mul(normalize_factor, mpss)

    # make MPS right canonical
    for i in xrange(N - 1, 0, -1):
        mpss[i], gaug = canonicalize(0, mpss[i], M=M)
        mpss[i - 1] = einsum("ijk, kl -> ijl", mpss[i - 1], gaug)

    # MPO
    mpos = np.asarray(heisenberg_mpo(N, h, J))

    # lopr
    loprs = [np.array([[[1.0]]])]
    # ropr
    roprs = [np.array([[[1.0]]])]
    for i in xrange(N - 1, 0, -1):
        roprs.append(
            renormalize(0, mpos[i], roprs[-1], mpss[i].conj(), mpss[i]))

    # NOTE the loprs and roprs should be list currently to support pop()!
    return mpss, mpos, loprs, roprs
Example #8
0
def test_compress_obc():
    dps = [1,3,2,2]
    mps1 = dMPX.rand(dps, D=7, bc="obc")

    print [m.shape for m in mps1]
    
    mps_diff1 = dMPX.add(MPX.mul(-1,mps1), mps1)
    assert not(np.isnan(MPX.norm(mps1))), MPX.norm(mps1)
    assert MPX.norm(mps_diff1)<1.0e-12, MPX.norm(mps_diff1)

    # check dimension preserving
    mps11 = dMPX.add(mps1,mps1)
    mps11,dwt = MPX.compress(mps11,0,preserve_dim="true")
    mps11_,dwt = MPX.compress(mps11,0,preserve_dim="false")
    print [m.shape for m in mps11]
    print [m.shape for m in mps11_]
    print [m.shape for m in mps1]
    
    print MPX.norm(mps11)
    assert(dwt == 0), dwt
    
    mps_diff = dMPX.add(MPX.mul(-2,mps1),mps11)
    print abs(MPX.norm(mps_diff)/MPX.norm(mps11))<1.0e-7, MPX.norm(mps_diff)

    mps_diff = dMPX.add(MPX.mul(-2,mps1),mps11_)
    print abs(MPX.norm(mps_diff)/MPX.norm(mps11_))<1.0e-7, MPX.norm(mps_diff)
Example #9
0
def test_overwrite():
    dp = (1,3,2,2)
    np.random.seed(417)
    mps_obc = dMPX.rand(dp, D=7, bc="obc")
    mps_pbc = dMPX.zeros(dp, D=7, bc="pbc")
    dMPX.overwrite(mps_obc, out=mps_pbc)

    for occ in np.ndindex(dp):
        assert np.allclose(MPX.element(mps_obc, occ), MPX.element(mps_pbc, occ))
Example #10
0
def test_norm():
    dp = (1,3,2,2)
    np.random.seed(417)
    mps_obc = dMPX.rand(dp, D=7, bc="obc")
    mps_pbc = dMPX.zeros(dp, D=7, bc="pbc")
    dMPX.overwrite(mps_obc, out=mps_pbc)
    
    norm_o = np.linalg.norm(MPX.asfull(mps_obc))
    norm_p = np.linalg.norm(MPX.asfull(mps_pbc))

    norm_o1 = MPX.norm(mps_obc)
    norm_p1 = MPX.norm(mps_pbc)
    assert np.allclose(norm_o, norm_o1)
    assert np.allclose(norm_p, norm_p1)
Example #11
0
def test_mul():
    dps = [1, 5, 4]
    mps1 = dMPX.rand(dps, 4, bc="obc")

    alpha = -1
    mps2 = MPX.mul(alpha, mps1)
  
    norm1 = MPX.norm(mps1)
    norm2 = MPX.norm(mps2)
    ovlp  = MPX.dot(mps1.conj(),mps2)

    print 'scaling used: ', np.abs(alpha), np.angle(alpha)
    print 'ratio of norms: ', norm2 / norm1
    print 'scaling', ovlp / (norm1**2)
    assert(np.allclose(norm1, norm2))
    assert(np.allclose(ovlp / (norm1 ** 2), alpha))
Example #12
0
def test_compress_pbc():
    np.random.seed(417)
    
    dps = [1,3,2,2]
    mps_obc = dMPX.rand(dps, D=7, bc="obc")
    print "full dim", MPX.obc_dim(dps)
    mps1 = dMPX.zeros(dps, D=7, bc="pbc")
    dMPX.overwrite(mps_obc, out=mps1)
    print MPX.norm(mps1), MPX.norm(mps_obc)
    
    mps2 = dMPX.add(mps1,mps1)
    mps11_0,dwt = MPX.compress(mps2,0,preserve_dim="true")
    mps11_1,dwt = MPX.compress(mps2,1,preserve_dim="true")
    mps11_2,dwt = MPX.compress(mps2,2,preserve_dim="true")
    mps11_2_,dwt = MPX.compress(mps2,2,preserve_dim="false")
    mps11_4,dwt = MPX.compress(mps2,4,preserve_dim="true")
    mps11_8,dwt = MPX.compress(mps2,8,preserve_dim="false")

    mps_diff0 = dMPX.add(MPX.mul(-1,mps11_0),mps2)
    mps_diff1 = dMPX.add(MPX.mul(-1,mps11_1),mps2)
    mps_diff2 = dMPX.add(MPX.mul(-1,mps11_2),mps2)
    mps_diff2_ = dMPX.add(MPX.mul(-1,mps11_2_),mps2)
    mps_diff4 = dMPX.add(MPX.mul(-1,mps11_4),mps2)
    mps_diff8 = dMPX.add(MPX.mul(-1,mps11_8),mps2)

    mps4o,dwt = MPX.compress(dMPX.add(mps1,mps1), 4)
    mps_diff4o = dMPX.add(MPX.mul(-1,mps4o),mps2)
    
    print "D full", abs(MPX.norm(mps_diff0))
    print "D=1", abs(MPX.norm(mps_diff1))
    print "D=2", abs(MPX.norm(mps_diff2))
    print "D=2 (trunc)", abs(MPX.norm(mps_diff2_))
    print "D=4", abs(MPX.norm(mps_diff4))
    print "D=4 obc", abs(MPX.norm(mps_diff4o))
    print "D=8", abs(MPX.norm(mps_diff8))

    assert(abs(MPX.norm(mps_diff0))<1.0e-7)
Example #13
0
def test_compress():
    #np.random.seed(417)
    dps = [2] * 10
    mps0 = dMPX.rand(dps, D=7, bc="obc")

    smps1 = sMPX.from_dense(mps0)
    print "Check sparse", [m.__class__.__name__ for m in smps1]
    # check dimension preserving
    mps00 = dMPX.add(mps0, mps0)
    smps11 = sMPX.add(smps1, smps1)

    print MPX.norm(mps00), MPX.norm(smps11)

    print "Initial dimensions", [m.shape for m in mps00]
    # compress
    for D in (2, 3, 7):
        mps00c = MPX.compress(mps00, D, preserve_dim="false")
        print "After DENSE compress", D, MPX.norm(mps00c)
        #print "Compressed dimensions", [m.shape for m in mps00c]

    print "IN SPARSE part"
    for D in (2, 3, 7):
        smps11c = MPX.compress(smps11, D, preserve_dim="false")
        print "After SPARSE compress", D, MPX.norm(smps11c)
Example #14
0
def test_flatten():
    dp = [(1,2), (5,3), (4,4)]
    mpos = dMPX.rand(dp, 4)
    mps_out = MPX.flatten(mpos)
    for i in xrange(len(mps_out)):
        assert(mps_out[i].ndim == 3)