コード例 #1
0
def update_core_right(nd, fun, kickrank=1, tau=1.1, rf=2):
    fun_ev = 0
    cr = nd.core
    r1, n, r2 = cr.shape

    i_left = nd.edges[0].ind_left
    i_right = nd.edges[1].ind_right

    p = np.arange(n, dtype=np.int32)
    p = reshape(p, (-1, 1))

    J = index_merge(i_left, p, i_right)

    #J = np.hstack((w1, w3, w2))

    cr = fun(J)
    fun_ev += cr.size
    cr = reshape(cr, (r1, -1))
    cr = cr.T
    q, s1, v1 = la.svd(cr, full_matrices=False)
    #rr = my_chop2(s1, c.eps * la.norm(s1))
    #q = q[:, :rr]
    R = np.diag(s1).dot(v1)
    ind_new, C = rect_maxvol(q,
                             1.1,
                             q.shape[1] + kickrank + rf,
                             min_add_K=kickrank)
    nd.core = C

    #ind_new = maxvol(q)
    #nd.core = np.linalg.solve(q[ind_new, :].T, q.T).T
    nd.core = reshape(nd.core.T, (-1, n, r2))
    Rv = q[ind_new, :].dot(R)

    try:
        nd.edges[0].Rv = np.dot(nd.edges[0].Rv, Rv.T)
    except:
        nd.edges[0].Rv = Rv.T.copy()
    """ Finally, update indices """
    i_right = nd.edges[1].ind_right
    w1 = mkron(np.ones((r2, 1), dtype=np.int32),
               reshape(np.arange(n, dtype=np.int32), (-1, 1)))
    try:
        w2 = mkron(i_right, np.ones((n, 1), dtype=np.int32))
        i_next = np.hstack((w1, w2))
    except:
        i_next = w1

    i_next = reshape(i_next, (n * r2, -1))
    nd.edges[0].ind_right = i_next[ind_new, :].copy()
    return fun_ev
コード例 #2
0
def update_core_right(nd, fun, kickrank=1, tau=1.1, rf=2):
    fun_ev = 0
    cr = nd.core
    r1, n, r2 = cr.shape

    i_left = nd.edges[0].ind_left
    i_right = nd.edges[1].ind_right
    
    p = np.arange(n, dtype=np.int32); p = reshape(p, (-1, 1))
    
    J = index_merge(i_left, p, i_right)
    
    
    #J = np.hstack((w1, w3, w2))
    
    cr = fun(J)
    fun_ev += cr.size
    cr = reshape(cr, (r1, -1))
    cr = cr.T
    q, s1, v1 = la.svd(cr, full_matrices=False)
    #rr = my_chop2(s1, c.eps * la.norm(s1))
    #q = q[:, :rr]
    R = np.diag(s1).dot(v1)
    ind_new, C = rect_maxvol(q, 1.1, q.shape[1] + kickrank + rf, min_add_K = kickrank)
    nd.core = C

    #ind_new = maxvol(q)
    #nd.core = np.linalg.solve(q[ind_new, :].T, q.T).T
    nd.core = reshape(nd.core.T, (-1, n, r2))
    Rv = q[ind_new, :].dot(R)

    try:
        nd.edges[0].Rv = np.dot(nd.edges[0].Rv, Rv.T)
    except:
        nd.edges[0].Rv = Rv.T.copy()

    
    """ Finally, update indices """
    i_right = nd.edges[1].ind_right
    w1 = mkron(np.ones((r2, 1), dtype=np.int32), reshape(np.arange(n, dtype=np.int32),(-1, 1)))
    try:
        w2 = mkron(i_right, np.ones((n, 1), dtype=np.int32))
        i_next = np.hstack((w1, w2))
    except:
        i_next = w1
    
    
    i_next = reshape(i_next, (n * r2, -1))
    nd.edges[0].ind_right = i_next[ind_new, :].copy()
    return fun_ev
コード例 #3
0
def update_core_left(nd, fun, kickrank=3, tau=1.1, rf=2):
    fun_ev = 0
    cr = nd.core.copy()
    r1, n, r2 = cr.shape
    i_left = nd.edges[0].ind_left
    i_right = nd.edges[1].ind_right
    p = np.arange(n, dtype=np.int32)
    p = reshape(p, (-1, 1))
    J = index_merge(i_left, p, i_right)
    cr = fun(J)
    fun_ev += cr.size
    cr = reshape(cr, (-1, r2))
    #q, s1, v1 = la.svd(cr, full_matrices=False)
    #rr = my_chop2(s1, c.eps * la.norm(s1))
    #q = q[:, :rr]
    #R = np.diag(s1[:rr]).dot(v1[:rr, :])

    q, s1, v1 = la.svd(cr, full_matrices=False)
    R = np.diag(s1).dot(v1)

    #ind_new = maxvol(q)
    #nd.core = reshape(np.linalg.solve(q[ind_new, :].T, q.T).T, (r1, n, -1))
    ind_new, C = rect_maxvol(q,
                             tau,
                             maxK=q.shape[1] + kickrank + rf,
                             min_add_K=kickrank)
    nd.core = reshape(C, (r1, n, -1))
    #QR = QQ^{-1}Q R
    #Ru = q[ind_new, :].dot(r)
    Ru = q[ind_new, :].dot(R)
    #And also recompute the next index
    i_left = nd.edges[0].ind_left
    #Update index full
    w1 = mkron(np.ones((n, 1), dtype=np.int32), i_left)
    w2 = mkron(reshape(np.arange(n, dtype=np.int32), (-1, 1)),
               np.ones((r1, 1), dtype=np.int32))

    i_next = np.hstack((w1, w2))

    i_next = reshape(i_next, (r1 * n, -1))

    nd.edges[1].ind_left = i_next[ind_new, :].copy()
    try:
        nd.edges[1].Ru = np.dot(Ru, nd.edges[1].Ru)
    except:
        nd.edges[1].Ru = Ru.copy()

    return fun_ev
コード例 #4
0
def update_core_left(nd, fun, kickrank=3, tau=1.1, rf=2):
    fun_ev = 0
    cr = nd.core.copy()
    r1, n, r2 = cr.shape
    i_left = nd.edges[0].ind_left
    i_right = nd.edges[1].ind_right
    p = np.arange(n, dtype=np.int32); p = reshape(p, (-1, 1))
    J = index_merge(i_left, p, i_right)
    cr = fun(J)
    fun_ev += cr.size
    cr = reshape(cr, (-1, r2))
    #q, s1, v1 = la.svd(cr, full_matrices=False)
    #rr = my_chop2(s1, c.eps * la.norm(s1))
    #q = q[:, :rr]
    #R = np.diag(s1[:rr]).dot(v1[:rr, :])

    q, s1, v1 = la.svd(cr, full_matrices=False)
    R = np.diag(s1).dot(v1)

    #ind_new = maxvol(q)
    #nd.core = reshape(np.linalg.solve(q[ind_new, :].T, q.T).T, (r1, n, -1))
    ind_new, C = rect_maxvol(q, tau, maxK = q.shape[1] + kickrank + rf, min_add_K=kickrank)
    nd.core = reshape(C, (r1, n, -1))
    #QR = QQ^{-1}Q R
    #Ru = q[ind_new, :].dot(r)
    Ru = q[ind_new, :].dot(R)
    #And also recompute the next index
    i_left = nd.edges[0].ind_left
    #Update index full
    w1 = mkron(np.ones((n, 1), dtype=np.int32), i_left)
    w2 = mkron(reshape(np.arange(n, dtype=np.int32), (-1, 1)), np.ones((r1, 1), dtype=np.int32))
    
    i_next = np.hstack((w1, w2))
    
    i_next = reshape(i_next, (r1 * n, -1))
    
    nd.edges[1].ind_left = i_next[ind_new, :].copy()
    try:
        nd.edges[1].Ru = np.dot(Ru, nd.edges[1].Ru)
    except:
        nd.edges[1].Ru = Ru.copy()

    return fun_ev