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
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
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
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