Пример #1
0
def pad(a):
    b = tuck.tensor()
    b.n = [2 * a.n[0], 2 * a.n[1], 2 * a.n[2]]
    b.r = a.r
    b.u[0] = np.zeros((b.n[0], b.r[0]), dtype=np.complex128)
    b.u[1] = np.zeros((b.n[1], b.r[1]), dtype=np.complex128)
    b.u[2] = np.zeros((b.n[2], b.r[2]), dtype=np.complex128)
    b.u[0][:a.n[0], :] = a.u[0]
    b.u[1][:a.n[1], :] = a.u[1]
    b.u[2][:a.n[2], :] = a.u[2]
    b.core = a.core

    return b
Пример #2
0
def pad(a):
    b = tuck.tensor()
    b.n = [2*a.n[0], 2*a.n[1], 2*a.n[2]]
    b.r = a.r
    b.u[0] = np.zeros((b.n[0], b.r[0]), dtype=np.complex128)
    b.u[1] = np.zeros((b.n[1], b.r[1]), dtype=np.complex128)
    b.u[2] = np.zeros((b.n[2], b.r[2]), dtype=np.complex128)
    b.u[0][:a.n[0], :] = a.u[0]
    b.u[1][:a.n[1], :] = a.u[1]
    b.u[2][:a.n[2], :] = a.u[2] 
    b.core = a.core

    return b
Пример #3
0
def read_psi_old(molecule_name, folder):

    g = np.load(folder+'/'  + molecule_name + '_' + 'g.npy')
    norb = len(g)
    
    psi = [None]*norb
    for i in xrange(norb):
        psi[i] = tuck.tensor()
        psi[i].core = g[i]

        psi[i].u[0] = np.load(folder+'/' + molecule_name + '_' +str(i)+ '_'  + 'u1.npy')
        psi[i].u[1] = np.load(folder+'/' + molecule_name + '_' +str(i)+ '_'  + 'u2.npy')
        psi[i].u[2] = np.load(folder+'/' + molecule_name + '_' +str(i)+ '_'  + 'u3.npy')
    
        psi[i].n = (len(psi[i].u[0]), len(psi[i].u[1]), len(psi[i].u[2]))
        psi[i].r = copy.copy(psi[i].core.shape)

    return psi
Пример #4
0
def read_psi(molecule_name, folder):
    
    #g = np.load(folder+'/'  + molecule_name + '_' + 'g.npy')
    #norb = len(g)
    
    psi = []
    i = 0
    while True:
        try:
            psi.append(tuck.tensor())
            psi[i].core = np.load(folder+'/' + molecule_name + '_' +str(i)+ '_'  + 'g.npy')
        
            psi[i].u[0] = np.load(folder+'/' + molecule_name + '_' +str(i)+ '_'  + 'u1.npy')
            psi[i].u[1] = np.load(folder+'/' + molecule_name + '_' +str(i)+ '_'  + 'u2.npy')
            psi[i].u[2] = np.load(folder+'/' + molecule_name + '_' +str(i)+ '_'  + 'u3.npy')
        
            psi[i].n = (len(psi[i].u[0]), len(psi[i].u[1]), len(psi[i].u[2]))
            psi[i].r = copy.copy(psi[i].core.shape)
            i += 1
        except:
            break

    return psi[:-1]
Пример #5
0
def multifun(X, delta_cross, fun, r_add = 4, y0 = None, pr = None):
    
    # For X = [X_1,...,X_d], where X_i - tensors in the Tucker format
    # cross_func computes y = func(X) == func(x_1,...,x_d) in the Tucker format by using cross3d
    #
    # delta_cross - accuracy for cross3D
    # r_add - number of computed columns on each iteration of cross3d. May be used to improve time performing.
    
    d = len(X)
    if type(r_add) == int:
        r_add = [r_add, r_add, r_add]
    elif len(r_add) == 3:
        None
    else:
        raise Exception('r_add must be of type int or list of len = 3')

    eps_cross = 1
    
    if pr <> None:
        print 'cross multifun... \n'
    
    r = copy.copy(r_add)


    n = X[0].n
    N = int((min(n)+1)/2)

    if y0 <> None:
############################################################
############################################################
############################################################

        Q1, R = np.linalg.qr(y0.u[0]);
        row_order_U1 = np.sort(tuck.mv.maxvol(Q1));
        Q2, R = np.linalg.qr(y0.u[1]);
        row_order_U2 = np.sort(tuck.mv.maxvol(Q2));
        Q3, R = np.linalg.qr(y0.u[2]);
        row_order_U3 = np.sort(tuck.mv.maxvol(Q3));

        r0 = [len(row_order_U1), len(row_order_U2), len(row_order_U3)]

        A = [None]*d


        for alpha in xrange(d):
            A[alpha] = np.tensordot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3,:]), (2, 0))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [2,0,1]), np.transpose(X[alpha].u[1][row_order_U2,:]), (2, 0))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[0][row_order_U1,:]), (2, 0))
            A[alpha] = np.transpose(A[alpha], [2,1,0])
        
        Ar = fun(A)


        A1 = np.reshape(Ar, [r0[0],-1], order='f')
        A1 = np.transpose(A1)
        Q_A1, R = np.linalg.qr(A1)
        column_order_U1 = tuck.mv.maxvol(Q_A1)
        A1_11 = A1[column_order_U1, :]


        A2 = np.reshape(np.transpose(Ar, [1,0,2]), [r0[1],-1], order='f')
        A2 = np.transpose(A2)
        Q_A2, R = np.linalg.qr(A2)
        column_order_U2 = tuck.mv.maxvol(Q_A2)
        A2_11 = A2[column_order_U2, :]


        A3 = np.reshape(np.transpose(Ar, [2,0,1]), [r0[2],-1], order='f')
        A3 = np.transpose(A3)
        Q_A3, R = np.linalg.qr(A3)
        column_order_U3 = tuck.mv.maxvol(Q_A3)
        A3_11 = A3[column_order_U3, :]


        u1 = np.zeros((n[0], r0[0]), dtype=np.complex128)
        for i in xrange(r0[0]):
            for alpha in xrange(d):
                k1_order, j1_order = mod(column_order_U1[i], r0[1])
                A[alpha] = np.dot(X[alpha].core,np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [2,0,1]), np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[0]), (2,0))
                A[alpha] = np.transpose(A[alpha], [2,1,0])[:, 0, 0]
            u1[:,i] = fun(A)


        u2 = np.zeros((n[1], r0[1]), dtype=np.complex128)
        for j in xrange(r0[1]):
            for alpha in xrange(d):
                k1_order, i1_order = mod(column_order_U2[j], r0[0])
                A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [2,1,0]),np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[1]), (2, 0))
                A[alpha] = np.transpose(A[alpha], [1,2,0])[0, :, 0]
            u2[:,j] = fun(A)


        u3 = np.zeros((n[2], r0[2]), dtype=np.complex128)
        for k in xrange(r0[2]):
            for alpha in xrange(d):
                j1_order, i1_order = mod(column_order_U3[k], r0[0])
                A[alpha] = np.dot(np.transpose(X[alpha].core, [2,1,0]),np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [1,2,0]),np.transpose(X[alpha].u[2]), (2, 0))[0,0,:]
            u3[:,k] = fun(A)



    else:
############################################################
############################################################
############################################################
    
    
    
        GG = np.zeros(r, dtype=np.complex128)
    
        u1 = np.zeros((n[0], r_add[0]), dtype=np.complex128)
        u2 = np.zeros((n[1], r_add[1]), dtype=np.complex128)
        u3 = np.zeros((n[2], r_add[2]), dtype=np.complex128)
    
        u1[:N,:] = np.random.random((N,r_add[0]))
        u2[:N,:] = np.random.random((N,r_add[1]))
        u3[:N,:] = np.random.random((N,r_add[2]))
    
        u1, R = np.linalg.qr(u1)
        u2, R = np.linalg.qr(u2)
        u3, R = np.linalg.qr(u3)
    
        row_order_U1 = tuck.mv.maxvol(u1)
        row_order_U2 = tuck.mv.maxvol(u2)
        row_order_U3 = tuck.mv.maxvol(u3)

        r0 = [len(row_order_U1), len(row_order_U1), len(row_order_U1)]
        
        
        A = [None]*d

        for alpha in xrange(d):
            A[alpha] = np.tensordot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3,:]), (2, 0))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [2,0,1]), np.transpose(X[alpha].u[1][row_order_U2,:]), (2, 0))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[0][row_order_U1,:]), (2, 0))
            A[alpha] = np.transpose(A[alpha], [2,1,0])
        Ar = fun(A)

        A1 = np.reshape(Ar, [r0[0],-1], order='f')
        A1 = np.transpose(A1)    
        Q_A1, R = np.linalg.qr(A1)
        column_order_U1 = tuck.mv.maxvol(Q_A1)
        A1_11 = A1[column_order_U1, :]


        A2 = np.reshape(np.transpose(Ar, [1,0,2]), [r0[1],-1], order='f')
        A2 = np.transpose(A2)
        Q_A2, R = np.linalg.qr(A2)
        column_order_U2 = tuck.mv.maxvol(Q_A2)
        A2_11 = A2[column_order_U2, :]


        A3 = np.reshape(np.transpose(Ar, [2,0,1]), [r0[2],-1], order='f')
        A3 = np.transpose(A3)
        Q_A3, R = np.linalg.qr(A3)
        column_order_U3 = tuck.mv.maxvol(Q_A3)
        A3_11 = A3[column_order_U3, :]

#################################################################################


    U1 = u1
    U2 = u2
    U3 = u3

    U1_hat = np.linalg.solve(U1[row_order_U1, :].T, U1.T).T
    U2_hat = np.linalg.solve(U2[row_order_U2, :].T, U2.T).T
    U3_hat = np.linalg.solve(U3[row_order_U3, :].T, U3.T).T

    u1 = np.random.random((n[0],r_add[0]))
    u2 = np.random.random((n[1],r_add[1]))
    u3 = np.random.random((n[2],r_add[2]))
  

    UU1, ind_update_1 = column_update(U1_hat, u1, row_order_U1)
    UU2, ind_update_2 = column_update(U2_hat, u2, row_order_U2)
    UU3, ind_update_3 = column_update(U3_hat, u3, row_order_U3)

    U1 = np.concatenate((U1, u1), 1)
    U2 = np.concatenate((U2, u2), 1)
    U3 = np.concatenate((U3, u3), 1)

    A1_12 = np.zeros((r0[0], r_add[0]),dtype=np.complex128)
    for ii in xrange(r0[0]):
        for alpha in xrange(d):
            k1_order, j1_order = mod(column_order_U1[ii], r0[1])
            A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [2,0,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[0][ind_update_1, :]), (2, 0))
            A[alpha] = np.transpose(A[alpha], [2,1,0])[:,0,0]
        A1_12[ii,:] = fun(A)


    A2_12 = np.zeros((r0[1], r_add[1]),dtype=np.complex128)
    for ii in xrange(r0[1]):
        for alpha in xrange(d):
            k1_order, i1_order = mod(column_order_U2[ii], r0[0])
            A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [2,1,0]), np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[1][ind_update_2, :]), (2, 0))
            A[alpha] = np.transpose(A[alpha], [1,2,0])[0,:,0]
        A2_12[ii, :] = fun(A)


    A3_12 = np.zeros((r0[2], r_add[2]),dtype=np.complex128)
    for ii in xrange(r0[2]):
        for alpha in xrange(d):
            j1_order, i1_order = mod(column_order_U3[ii], r0[0])
            A[alpha] = np.dot(np.transpose(X[alpha].core, [2,1,0]),np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [1,2,0]),np.transpose(X[alpha].u[2][ind_update_3, :]), (2, 0))[0,0,:]
        A3_12[ii, :] = fun(A)


    r[0] = r0[0]+r_add[0]
    r[1] = r0[1]+r_add[1]
    r[2] = r0[2]+r_add[2]
    
    
    
    while True:
        
        for alpha in xrange(d):
            A[alpha] = np.dot(np.transpose(X[alpha].core, [2,1,0]), np.transpose(X[alpha].u[0][ind_update_1,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[1][row_order_U2,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [1,2,0]), np.transpose(X[alpha].u[2][row_order_U3,:]))
        Ar_1 = np.concatenate((Ar, fun(A)), 0)
        
        row_order_U1 = np.concatenate((row_order_U1, ind_update_1))
        
        for alpha in xrange(d):
            A[alpha] = np.dot(np.transpose(X[alpha].core, [0,2,1]), np.transpose(X[alpha].u[1][ind_update_2,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[2][row_order_U3,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [2,1,0]), np.transpose(X[alpha].u[0][row_order_U1,:]))
            A[alpha] = np.transpose(A[alpha], [2,1,0])
        Ar_2 = np.concatenate((Ar_1, fun(A)), 1)
        
        row_order_U2 = np.concatenate((row_order_U2, ind_update_2))
        
        for alpha in xrange(d):
            A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][ind_update_3,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [2,0,1]),np.transpose(X[alpha].u[1][row_order_U2,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[0][row_order_U1,:]))
            A[alpha] = np.transpose(A[alpha], [2,1,0])
        Ar = np.concatenate((Ar_2, fun(A)), 2)
        
        row_order_U3 = np.concatenate((row_order_U3, ind_update_3))
        
        
        
        A1 = np.reshape(Ar, [r[0],-1], order='f')
        A1 = np.transpose(A1)
        column_order_update_U1 = tuck.mv.maxvol( schur_comp(A1, A1_11, A1_12) )
        r_add[0] = len(column_order_update_U1)
        
        A2 = np.reshape(np.transpose(Ar, [1,0,2]), [r[1],-1], order='f')
        A2 = np.transpose(A2)
        column_order_update_U2 = tuck.mv.maxvol( schur_comp(A2, A2_11, A2_12) )
        r_add[1] = len(column_order_update_U2)
        
        A3 = np.reshape(np.transpose(Ar, [2,0,1]), [r[2],-1], order='f')
        A3 = np.transpose(A3)
        column_order_update_U3 = tuck.mv.maxvol( schur_comp(A3, A3_11, A3_12) )
        r_add[2] = len(column_order_update_U3)
        
        
        
        u1_approx = np.zeros((n[0], r_add[0]), dtype=np.complex128)
        u1 = np.zeros((n[0], r_add[0]), dtype=np.complex128)
        for i in xrange(r_add[0]):
            for alpha in xrange(d):
                k1_order, j1_order = mod(column_order_update_U1[i], r[1])
                A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [2,0,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[0]), (2, 0))
                A[alpha] = np.transpose(A[alpha], [2,1,0])[:,0,0]
            u1[:,i] = fun(A)
            
            u1_approx_i = np.dot(Ar, np.transpose(UU3[row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
            u1_approx_i = np.dot(np.transpose(u1_approx_i,[2,0,1]),np.transpose(UU2[row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
            u1_approx_i = np.tensordot(np.transpose(u1_approx_i,[0,2,1]),np.transpose(UU1), (2, 0))
            u1_approx_i = np.transpose(u1_approx_i,[2,1,0])
            u1_approx[:,i] = u1_approx_i[:, 0, 0]
        
        
        u2_approx = np.zeros((n[1], r_add[1]), dtype=np.complex128)
        u2 = np.zeros((n[1], r_add[1]), dtype=np.complex128)
        for j in xrange(r_add[1]):
            for alpha in xrange(d):
                k1_order, i1_order = mod(column_order_update_U2[j], r[0])
                A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [2,1,0]), np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[1]), (2, 0))
                A[alpha] = np.transpose(A[alpha], [1,2,0])[0,:,0]
            u2[:,j] = fun(A)
            
            u2_approx_j = np.dot(Ar,np.transpose(UU3[row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
            u2_approx_j = np.dot(np.transpose(u2_approx_j,[2,1,0]),np.transpose(UU1[row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
            u2_approx_j = np.tensordot(np.transpose(u2_approx_j,[0,2,1]),np.transpose(UU2), (2, 0))
            u2_approx[:,j] = u2_approx_j[0, 0, :]
        
        u3_approx = np.zeros((n[2], r_add[2]), dtype=np.complex128)
        u3 = np.zeros((n[2], r_add[2]), dtype=np.complex128)
        for k in xrange(r_add[2]):
            for alpha in xrange(d):
                j1_order, i1_order = mod(column_order_update_U3[k], r[0])
                A[alpha] = np.dot(np.transpose(X[alpha].core, [2,1,0]),np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [1,2,0]),np.transpose(X[alpha].u[2]), (2, 0))[0,0,:]
            u3[:,k] = fun(A)
            
            u3_approx_k = np.dot(np.transpose(Ar,[2,1,0]),np.transpose(UU1[row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
            u3_approx_k = np.dot(np.transpose(u3_approx_k,[0,2,1]),np.transpose(UU2[row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
            u3_approx_k = np.tensordot(np.transpose(u3_approx_k,[1,2,0]),np.transpose(UU3), (2, 0))
            u3_approx[:,k] = u3_approx_k[0, 0, :]
        
        
        eps_cross = 1./3*(  np.linalg.norm(u1_approx - u1)/ np.linalg.norm(u1) +
                          np.linalg.norm(u2_approx - u2)/ np.linalg.norm(u2) +
                          np.linalg.norm(u3_approx - u3)/ np.linalg.norm(u3)   )
        if pr <> None:
            print 'relative accuracy = %s' % (eps_cross), 'ranks = %s' % r
        
        if eps_cross < delta_cross:
            break
        
        #print np.linalg.norm( full(G, U1, U2, U3) - C_toch )/np.linalg.norm(C_toch)
        
        
        UU1, ind_update_1 = column_update(UU1, u1, row_order_U1)
        UU2, ind_update_2 = column_update(UU2, u2, row_order_U2)
        UU3, ind_update_3 = column_update(UU3, u3, row_order_U3)
        
        
        U1 = np.concatenate((U1, u1), 1)
        U2 = np.concatenate((U2, u2), 1)
        U3 = np.concatenate((U3, u3), 1)
        
        
        A1_11 = np.concatenate((A1_11, A1_12), 1)
        A1_11 = np.concatenate((A1_11, A1[column_order_update_U1,:]) )
        
        A2_11 = np.concatenate((A2_11, A2_12), 1)
        A2_11 = np.concatenate((A2_11, A2[column_order_update_U2,:]) )
        
        A3_11 = np.concatenate((A3_11, A3_12), 1)
        A3_11 = np.concatenate((A3_11, A3[column_order_update_U3,:]) )
        
        A1_12 = U1[ind_update_1, r_add[0]:].T
        A2_12 = U2[ind_update_2, r_add[1]:].T
        A3_12 = U3[ind_update_3, r_add[2]:].T
        
        r[0] = r[0]+r_add[0]
        r[1] = r[1]+r_add[1]
        r[2] = r[2]+r_add[2]
    
    

    U1, R1 = np.linalg.qr(UU1)
    U2, R2 = np.linalg.qr(UU2)
    U3, R3 = np.linalg.qr(UU3)
    
    
    GG = np.tensordot(np.transpose(Ar,[2,1,0]),np.transpose(R1), (2, 0))
    GG = np.tensordot(np.transpose(GG,[0,2,1]),np.transpose(R2), (2, 0))
    GG = np.transpose(GG,[1,2,0])
    G = np.tensordot(GG,np.transpose(R3), (2, 0))

    G_Tucker = tuck.tensor(G, delta_cross)
    if pr <> None:
        print 'ranks after rounding = %s' % G_Tucker.r[0], G_Tucker.r[1], G_Tucker.r[2]
    
    
    fun = tuck.tensor()
    fun.core = G_Tucker.core
    fun.u[0] = np.dot(U1, G_Tucker.u[0])
    fun.u[1] = np.dot(U2, G_Tucker.u[1])
    fun.u[2] = np.dot(U3, G_Tucker.u[2])
    fun.r =  G_Tucker.r
    fun.n = n

    return fun
Пример #6
0
def cross3d(func, M, eps_init, delta_add=1e-5):

    N = int((M + 1) / 2)

    r1 = 2
    r2 = 2
    r3 = 2

    GG = np.zeros((r1, r2, r3), dtype=np.complex128)

    U1 = np.zeros((M, r1), dtype=np.complex128)
    U2 = np.zeros((M, r2), dtype=np.complex128)
    U3 = np.zeros((M, r3), dtype=np.complex128)

    U1[:N, :] = np.random.random((N, r1))
    U2[:N, :] = np.random.random((N, r2))
    U3[:N, :] = np.random.random((N, r3))

    U1, R = np.linalg.qr(U1)
    U2, R = np.linalg.qr(U2)
    U3, R = np.linalg.qr(U3)

    eps_cross = 1

    while True:

        row_order_U1 = tuck.mv.maxvol(U1)
        row_order_U2 = tuck.mv.maxvol(U2)
        row_order_U3 = tuck.mv.maxvol(U3)

        Ar = np.zeros((r1, r2, r3), dtype=np.complex128)

        for i in xrange(r1):
            for j in xrange(r2):
                for k in xrange(r3):
                    Ar[i, j, k] = func(
                        (row_order_U1[i], row_order_U2[j], row_order_U3[k]))

        U1_r = U1[row_order_U1, :]
        U2_r = U2[row_order_U2, :]
        U3_r = U3[row_order_U3, :]

        G_UV = np.linalg.solve(
            U3_r,
            np.reshape(np.transpose(Ar, [2, 0, 1]), (r3, r1 * r2), order='f'))
        G_UV = np.reshape(G_UV, (r3, r1, r2), order='f')
        G_UV = np.transpose(G_UV, [1, 2, 0])

        G_U = np.linalg.solve(
            U2_r,
            np.reshape(np.transpose(G_UV, [1, 2, 0]), (r2, r1 * r3),
                       order='f'))
        G_U = np.reshape(G_U, (r2, r3, r1), order='f')
        G_U = np.transpose(G_U, [2, 0, 1])

        G = np.linalg.solve(U1_r, np.reshape(G_U, (r1, r2 * r3), order='f'))
        G = np.reshape(G, (r1, r2, r3), order='f')

        norm = np.linalg.norm(G)
        eps_cross = (np.linalg.norm(GG - G)) / norm
        #print 'relative accuracy = %s' % (eps_cross), 'ranks = %s' % r1, r2, r3
        G_Tucker = tuck.tensor(G, eps_init / 10)

        G = G_Tucker.core

        U1 = np.dot(U1, G_Tucker.u[0])
        U2 = np.dot(U2, G_Tucker.u[1])
        U3 = np.dot(U3, G_Tucker.u[2])

        (r1, r2, r3) = G_Tucker.r

        if eps_cross < eps_init:
            break

        row_order_U1 = tuck.mv.maxvol(U1)
        row_order_U2 = tuck.mv.maxvol(U2)
        row_order_U3 = tuck.mv.maxvol(U3)

        Ar = np.zeros((r1, r2, r3), dtype=np.complex128)

        for i in xrange(r1):
            for j in xrange(r2):
                for k in xrange(r3):
                    Ar[i, j, k] = func(
                        (row_order_U1[i], row_order_U2[j], row_order_U3[k]))

        A1 = np.reshape(Ar, [r1, -1], order='f')
        A1_r = np.transpose(A1)
        A1_r, R = np.linalg.qr(A1_r)
        column_order_U1 = tuck.mv.maxvol(A1_r)

        A2 = np.reshape(np.transpose(Ar, [1, 0, 2]), [r2, -1], order='f')
        A2_r = np.transpose(A2)
        A2_r, R = np.linalg.qr(A2_r)
        column_order_U2 = tuck.mv.maxvol(A2_r)

        A3 = np.reshape(np.transpose(Ar, [2, 0, 1]), [r3, -1], order='f')
        A3_r = np.transpose(A3)
        A3_r, R = np.linalg.qr(A3_r)
        column_order_U3 = tuck.mv.maxvol(A3_r)

        u1 = np.zeros((M, r1), dtype=np.complex128)
        for i in xrange(r1):
            for ii in xrange(M):
                k1_order, j1_order = mod(column_order_U1[i], r2)
                u1[ii, i] = func(
                    (ii, row_order_U2[j1_order], row_order_U3[k1_order]))

        u2 = np.zeros((M, r2), dtype=np.complex128)
        for j in xrange(r2):
            for jj in xrange(M):
                k1_order, i1_order = mod(column_order_U2[j], r1)
                u2[jj, j] = func(
                    (row_order_U1[i1_order], jj, row_order_U3[k1_order]))

        u3 = np.zeros((M, r3), dtype=np.complex128)
        for k in xrange(r3):
            for kk in xrange(M):
                j1_order, i1_order = mod(column_order_U3[k], r1)
                u3[kk, k] = func(
                    (row_order_U1[i1_order], row_order_U2[j1_order], kk))

        u1, v, r11 = round_matrix(u1, delta_add)
        u2, v, r22 = round_matrix(u2, delta_add)
        u3, v, r33 = round_matrix(u3, delta_add)

        u1 = u1[:, :r11]
        u2 = u2[:, :r22]
        u3 = u3[:, :r33]

        U1_0 = np.zeros((M, r1 + r11), dtype=np.complex128)
        U2_0 = np.zeros((M, r2 + r22), dtype=np.complex128)
        U3_0 = np.zeros((M, r3 + r33), dtype=np.complex128)

        U1_0[:, :r1] = U1.copy()
        U2_0[:, :r2] = U2.copy()
        U3_0[:, :r3] = U3.copy()

        U1_0[:, r1:r1 + r11] = u1
        U2_0[:, r2:r2 + r22] = u2
        U3_0[:, r3:r3 + r33] = u3

        U1 = U1_0.copy()
        U2 = U2_0.copy()
        U3 = U3_0.copy()

        r1 = r1 + r11
        r2 = r2 + r22
        r3 = r3 + r33

        U1, R1 = np.linalg.qr(U1)
        U2, R2 = np.linalg.qr(U2)
        U3, R3 = np.linalg.qr(U3)

        GG = np.zeros((r1, r2, r3), dtype=np.complex128)
        GG[:(r1 - r11), :(r2 - r22), :(r3 - r33)] = G.copy()

        GG = np.dot(np.transpose(GG, [2, 1, 0]), np.transpose(R1))
        GG = np.dot(np.transpose(GG, [0, 2, 1]), np.transpose(R2))
        GG = np.transpose(GG, [1, 2, 0])
        GG = np.dot(GG, np.transpose(R3))

        #print 'ranks after rounding = %s' % r1, r2, r3
    G_Tucker.n = (M, M, M)
    G_Tucker.u[0] = U1
    G_Tucker.u[1] = U2
    G_Tucker.u[2] = U3
    G_Tucker.r = [r1, r2, r3]

    return tuck.round(G_Tucker, eps_init)
Пример #7
0
def multifun(X, delta_cross, fun, r_add=4, y0=None, rmax=100, pr=None):
    
    # For X = [X_1,...,X_d], where X_i - tensors in the Tucker format
    # cross_func computes y = func(X) == func(x_1,...,x_d) in the Tucker format by using cross3d
    #
    # delta_cross - accuracy for cross3D
    # r_add - number of computed columns on each iteration of cross3d. May be used to improve time performing.
    
    d = len(X)
    if type(r_add) == int:
        r_add = [r_add, r_add, r_add]
    elif len(r_add) == 3:
        None
    else:
        raise Exception('r_add must be of type int or list of len = 3')

    eps_cross = 1
    
    if pr <> None:
        print 'cross multifun... \n'
    
    r = copy.copy(r_add)


    n = X[0].n
    N = int((min(n)+1)/2)

    # Type check
    list = [X[i].u[0][0,0] for i in xrange(len(X))]
    if type(np.sum(list)) is np.complex128:
        dtype = np.complex128
    else:
        dtype = np.float64

    if pr <> None:
        print 'data type is', dtype

    # if there is initial guess
    if y0 <> None:
############################################################
############################################################
############################################################

        Q1, R = np.linalg.qr(y0.u[0]);
        row_order_U1 = np.sort(tuck.mv.maxvol(Q1));
        Q2, R = np.linalg.qr(y0.u[1]);
        row_order_U2 = np.sort(tuck.mv.maxvol(Q2));
        Q3, R = np.linalg.qr(y0.u[2]);
        row_order_U3 = np.sort(tuck.mv.maxvol(Q3));

        r0 = [len(row_order_U1), len(row_order_U2), len(row_order_U3)]

        A = [None]*d


        for alpha in xrange(d):
            A[alpha] = np.tensordot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3,:]), (2, 0))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [2,0,1]), np.transpose(X[alpha].u[1][row_order_U2,:]), (2, 0))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[0][row_order_U1,:]), (2, 0))
            A[alpha] = np.transpose(A[alpha], [2,1,0])
        
        Ar = fun(A)


        A1 = np.reshape(Ar, [r0[0],-1], order='f')
        A1 = np.transpose(A1)
        Q_A1, R = np.linalg.qr(A1)
        column_order_U1 = tuck.mv.maxvol(Q_A1)
        A1_11 = A1[column_order_U1, :]


        A2 = np.reshape(np.transpose(Ar, [1,0,2]), [r0[1],-1], order='f')
        A2 = np.transpose(A2)
        Q_A2, R = np.linalg.qr(A2)
        column_order_U2 = tuck.mv.maxvol(Q_A2)
        A2_11 = A2[column_order_U2, :]


        A3 = np.reshape(np.transpose(Ar, [2,0,1]), [r0[2],-1], order='f')
        A3 = np.transpose(A3)
        Q_A3, R = np.linalg.qr(A3)
        column_order_U3 = tuck.mv.maxvol(Q_A3)
        A3_11 = A3[column_order_U3, :]


        u1 = np.zeros((n[0], r0[0]), dtype=dtype)
        for i in xrange(r0[0]):
            for alpha in xrange(d):
                k1_order, j1_order = mod(column_order_U1[i], r0[1])
                A[alpha] = np.dot(X[alpha].core,np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [2,0,1]), np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[0]), (2,0))
                A[alpha] = np.transpose(A[alpha], [2,1,0])[:, 0, 0]
            u1[:,i] = fun(A)


        u2 = np.zeros((n[1], r0[1]), dtype=dtype)
        for j in xrange(r0[1]):
            for alpha in xrange(d):
                k1_order, i1_order = mod(column_order_U2[j], r0[0])
                A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [2,1,0]),np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[1]), (2, 0))
                A[alpha] = np.transpose(A[alpha], [1,2,0])[0, :, 0]
            u2[:,j] = fun(A)


        u3 = np.zeros((n[2], r0[2]), dtype=dtype)
        for k in xrange(r0[2]):
            for alpha in xrange(d):
                j1_order, i1_order = mod(column_order_U3[k], r0[0])
                A[alpha] = np.dot(np.transpose(X[alpha].core, [2,1,0]),np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [1,2,0]),np.transpose(X[alpha].u[2]), (2, 0))[0,0,:]
            u3[:,k] = fun(A)



    else:
############################################################
############################################################
############################################################
    
    
    
        GG = np.zeros(r, dtype=dtype)
    
        u1 = np.zeros((n[0], r_add[0]), dtype=dtype)
        u2 = np.zeros((n[1], r_add[1]), dtype=dtype)
        u3 = np.zeros((n[2], r_add[2]), dtype=dtype)
    
        u1[:N,:] = np.random.random((N,r_add[0]))
        u2[:N,:] = np.random.random((N,r_add[1]))
        u3[:N,:] = np.random.random((N,r_add[2]))
    
        u1, R = np.linalg.qr(u1)
        u2, R = np.linalg.qr(u2)
        u3, R = np.linalg.qr(u3)
    
        row_order_U1 = tuck.mv.maxvol(u1)
        row_order_U2 = tuck.mv.maxvol(u2)
        row_order_U3 = tuck.mv.maxvol(u3)

        r0 = [len(row_order_U1), len(row_order_U1), len(row_order_U1)]
        
        
        A = [None]*d

        for alpha in xrange(d):
            A[alpha] = np.tensordot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3,:]), (2, 0))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [2,0,1]), np.transpose(X[alpha].u[1][row_order_U2,:]), (2, 0))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[0][row_order_U1,:]), (2, 0))
            A[alpha] = np.transpose(A[alpha], [2,1,0])
        Ar = fun(A)

        A1 = np.reshape(Ar, [r0[0],-1], order='f')
        A1 = np.transpose(A1)    
        Q_A1, R = np.linalg.qr(A1)
        column_order_U1 = tuck.mv.maxvol(Q_A1)
        A1_11 = A1[column_order_U1, :]


        A2 = np.reshape(np.transpose(Ar, [1,0,2]), [r0[1],-1], order='f')
        A2 = np.transpose(A2)
        Q_A2, R = np.linalg.qr(A2)
        column_order_U2 = tuck.mv.maxvol(Q_A2)
        A2_11 = A2[column_order_U2, :]


        A3 = np.reshape(np.transpose(Ar, [2,0,1]), [r0[2],-1], order='f')
        A3 = np.transpose(A3)
        Q_A3, R = np.linalg.qr(A3)
        column_order_U3 = tuck.mv.maxvol(Q_A3)
        A3_11 = A3[column_order_U3, :]

#################################################################################


    U1 = u1
    U2 = u2
    U3 = u3

    U1_hat = np.linalg.solve(U1[row_order_U1, :].T, U1.T).T
    U2_hat = np.linalg.solve(U2[row_order_U2, :].T, U2.T).T
    U3_hat = np.linalg.solve(U3[row_order_U3, :].T, U3.T).T

    u1 = np.random.random((n[0],r_add[0]))
    u2 = np.random.random((n[1],r_add[1]))
    u3 = np.random.random((n[2],r_add[2]))
  

    UU1, ind_update_1 = column_update(U1_hat, u1, row_order_U1)
    UU2, ind_update_2 = column_update(U2_hat, u2, row_order_U2)
    UU3, ind_update_3 = column_update(U3_hat, u3, row_order_U3)

    U1 = np.concatenate((U1, u1), 1)
    U2 = np.concatenate((U2, u2), 1)
    U3 = np.concatenate((U3, u3), 1)

    A1_12 = np.zeros((r0[0], r_add[0]),dtype=dtype)
    for ii in xrange(r0[0]):
        for alpha in xrange(d):
            k1_order, j1_order = mod(column_order_U1[ii], r0[1])
            A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [2,0,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[0][ind_update_1, :]), (2, 0))
            A[alpha] = np.transpose(A[alpha], [2,1,0])[:,0,0]
        A1_12[ii,:] = fun(A)


    A2_12 = np.zeros((r0[1], r_add[1]),dtype=dtype)
    for ii in xrange(r0[1]):
        for alpha in xrange(d):
            k1_order, i1_order = mod(column_order_U2[ii], r0[0])
            A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [2,1,0]), np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[1][ind_update_2, :]), (2, 0))
            A[alpha] = np.transpose(A[alpha], [1,2,0])[0,:,0]
        A2_12[ii, :] = fun(A)


    A3_12 = np.zeros((r0[2], r_add[2]),dtype=dtype)
    for ii in xrange(r0[2]):
        for alpha in xrange(d):
            j1_order, i1_order = mod(column_order_U3[ii], r0[0])
            A[alpha] = np.dot(np.transpose(X[alpha].core, [2,1,0]),np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
            A[alpha] = np.tensordot(np.transpose(A[alpha], [1,2,0]),np.transpose(X[alpha].u[2][ind_update_3, :]), (2, 0))[0,0,:]
        A3_12[ii, :] = fun(A)


    r[0] = r0[0]+r_add[0]
    r[1] = r0[1]+r_add[1]
    r[2] = r0[2]+r_add[2]
    
    
    
    while True:
        
        for alpha in xrange(d):
            A[alpha] = np.dot(np.transpose(X[alpha].core, [2,1,0]), np.transpose(X[alpha].u[0][ind_update_1,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[1][row_order_U2,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [1,2,0]), np.transpose(X[alpha].u[2][row_order_U3,:]))
        Ar_1 = np.concatenate((Ar, fun(A)), 0)
        
        row_order_U1 = np.concatenate((row_order_U1, ind_update_1))
        
        for alpha in xrange(d):
            A[alpha] = np.dot(np.transpose(X[alpha].core, [0,2,1]), np.transpose(X[alpha].u[1][ind_update_2,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[2][row_order_U3,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [2,1,0]), np.transpose(X[alpha].u[0][row_order_U1,:]))
            A[alpha] = np.transpose(A[alpha], [2,1,0])
        Ar_2 = np.concatenate((Ar_1, fun(A)), 1)
        
        row_order_U2 = np.concatenate((row_order_U2, ind_update_2))
        
        for alpha in xrange(d):
            A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][ind_update_3,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [2,0,1]),np.transpose(X[alpha].u[1][row_order_U2,:]))
            A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[0][row_order_U1,:]))
            A[alpha] = np.transpose(A[alpha], [2,1,0])
        Ar = np.concatenate((Ar_2, fun(A)), 2)
        
        row_order_U3 = np.concatenate((row_order_U3, ind_update_3))
        
        
        
        A1 = np.reshape(Ar, [r[0],-1], order='f')
        A1 = np.transpose(A1)
        column_order_update_U1 = tuck.mv.maxvol( schur_comp(A1, A1_11, A1_12, dtype) )
        r_add[0] = len(column_order_update_U1)
        
        A2 = np.reshape(np.transpose(Ar, [1,0,2]), [r[1],-1], order='f')
        A2 = np.transpose(A2)
        column_order_update_U2 = tuck.mv.maxvol( schur_comp(A2, A2_11, A2_12, dtype) )
        r_add[1] = len(column_order_update_U2)
        
        A3 = np.reshape(np.transpose(Ar, [2,0,1]), [r[2],-1], order='f')
        A3 = np.transpose(A3)
        column_order_update_U3 = tuck.mv.maxvol( schur_comp(A3, A3_11, A3_12, dtype) )
        r_add[2] = len(column_order_update_U3)
        
        
        
        u1_approx = np.zeros((n[0], r_add[0]), dtype=dtype)
        u1 = np.zeros((n[0], r_add[0]), dtype=dtype)
        for i in xrange(r_add[0]):
            for alpha in xrange(d):
                k1_order, j1_order = mod(column_order_update_U1[i], r[1])
                A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [2,0,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[0]), (2, 0))
                A[alpha] = np.transpose(A[alpha], [2,1,0])[:,0,0]
            u1[:,i] = fun(A)
            
            u1_approx_i = np.dot(Ar, np.transpose(UU3[row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
            u1_approx_i = np.dot(np.transpose(u1_approx_i,[2,0,1]),np.transpose(UU2[row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
            u1_approx_i = np.tensordot(np.transpose(u1_approx_i,[0,2,1]),np.transpose(UU1), (2, 0))
            u1_approx_i = np.transpose(u1_approx_i,[2,1,0])
            u1_approx[:,i] = u1_approx_i[:, 0, 0]
        
        
        u2_approx = np.zeros((n[1], r_add[1]), dtype=dtype)
        u2 = np.zeros((n[1], r_add[1]), dtype=dtype)
        for j in xrange(r_add[1]):
            for alpha in xrange(d):
                k1_order, i1_order = mod(column_order_update_U2[j], r[0])
                A[alpha] = np.dot(X[alpha].core, np.transpose(X[alpha].u[2][row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [2,1,0]), np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [0,2,1]), np.transpose(X[alpha].u[1]), (2, 0))
                A[alpha] = np.transpose(A[alpha], [1,2,0])[0,:,0]
            u2[:,j] = fun(A)
            
            u2_approx_j = np.dot(Ar,np.transpose(UU3[row_order_U3[k1_order]:row_order_U3[k1_order]+1,:]))
            u2_approx_j = np.dot(np.transpose(u2_approx_j,[2,1,0]),np.transpose(UU1[row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
            u2_approx_j = np.tensordot(np.transpose(u2_approx_j,[0,2,1]),np.transpose(UU2), (2, 0))
            u2_approx[:,j] = u2_approx_j[0, 0, :]
        
        u3_approx = np.zeros((n[2], r_add[2]), dtype=dtype)
        u3 = np.zeros((n[2], r_add[2]), dtype=dtype)
        for k in xrange(r_add[2]):
            for alpha in xrange(d):
                j1_order, i1_order = mod(column_order_update_U3[k], r[0])
                A[alpha] = np.dot(np.transpose(X[alpha].core, [2,1,0]),np.transpose(X[alpha].u[0][row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
                A[alpha] = np.dot(np.transpose(A[alpha], [0,2,1]),np.transpose(X[alpha].u[1][row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
                A[alpha] = np.tensordot(np.transpose(A[alpha], [1,2,0]),np.transpose(X[alpha].u[2]), (2, 0))[0,0,:]
            u3[:,k] = fun(A)
            
            u3_approx_k = np.dot(np.transpose(Ar,[2,1,0]),np.transpose(UU1[row_order_U1[i1_order]:row_order_U1[i1_order]+1,:]))
            u3_approx_k = np.dot(np.transpose(u3_approx_k,[0,2,1]),np.transpose(UU2[row_order_U2[j1_order]:row_order_U2[j1_order]+1,:]))
            u3_approx_k = np.tensordot(np.transpose(u3_approx_k,[1,2,0]),np.transpose(UU3), (2, 0))
            u3_approx[:,k] = u3_approx_k[0, 0, :]
        
        
        eps_cross = 1./3*(  np.linalg.norm(u1_approx - u1)/ np.linalg.norm(u1) +
                          np.linalg.norm(u2_approx - u2)/ np.linalg.norm(u2) +
                          np.linalg.norm(u3_approx - u3)/ np.linalg.norm(u3)   )
        if pr <> None:
            print 'relative accuracy = %s' % (eps_cross), 'ranks = %s' % r
        
        if eps_cross < delta_cross:
            break
        elif r[0]>rmax:
            print 'Rank has exceeded rmax value'
            break

        #print np.linalg.norm( full(G, U1, U2, U3) - C_toch )/np.linalg.norm(C_toch)
        
        
        UU1, ind_update_1 = column_update(UU1, u1, row_order_U1)
        UU2, ind_update_2 = column_update(UU2, u2, row_order_U2)
        UU3, ind_update_3 = column_update(UU3, u3, row_order_U3)
        
        
        U1 = np.concatenate((U1, u1), 1)
        U2 = np.concatenate((U2, u2), 1)
        U3 = np.concatenate((U3, u3), 1)
        
        
        A1_11 = np.concatenate((A1_11, A1_12), 1)
        A1_11 = np.concatenate((A1_11, A1[column_order_update_U1,:]) )
        
        A2_11 = np.concatenate((A2_11, A2_12), 1)
        A2_11 = np.concatenate((A2_11, A2[column_order_update_U2,:]) )
        
        A3_11 = np.concatenate((A3_11, A3_12), 1)
        A3_11 = np.concatenate((A3_11, A3[column_order_update_U3,:]) )
        
        A1_12 = U1[ind_update_1, r_add[0]:].T
        A2_12 = U2[ind_update_2, r_add[1]:].T
        A3_12 = U3[ind_update_3, r_add[2]:].T
        
        r[0] = r[0]+r_add[0]
        r[1] = r[1]+r_add[1]
        r[2] = r[2]+r_add[2]
    
    

    U1, R1 = np.linalg.qr(UU1)
    U2, R2 = np.linalg.qr(UU2)
    U3, R3 = np.linalg.qr(UU3)
    
    
    GG = np.tensordot(np.transpose(Ar,[2,1,0]),np.transpose(R1), (2, 0))
    GG = np.tensordot(np.transpose(GG,[0,2,1]),np.transpose(R2), (2, 0))
    GG = np.transpose(GG,[1,2,0])
    G = np.tensordot(GG,np.transpose(R3), (2, 0))

    G_Tucker = tuck.tensor(G, delta_cross)
    if pr <> None:
        print 'ranks after rounding = %s' % G_Tucker.r[0], G_Tucker.r[1], G_Tucker.r[2]
    
    
    fun = tuck.tensor()
    fun.core = G_Tucker.core
    fun.u[0] = np.dot(U1, G_Tucker.u[0])
    fun.u[1] = np.dot(U2, G_Tucker.u[1])
    fun.u[2] = np.dot(U3, G_Tucker.u[2])
    fun.r =  G_Tucker.r
    fun.n = n

    return fun
Пример #8
0
def gto2tuck(w, cf, x, eps):

    n = len(x)
    r = len(cf)

    k = 0
    for alpha in xrange(r):
        k += len(w[alpha].prims)

    U1 = np.zeros((n, k * r))
    U2 = np.zeros((n, k * r))
    U3 = np.zeros((n, k * r))
    c = np.zeros(k * r)

    nG = 0
    for alpha in xrange(r):
        for beta in xrange(len(w[alpha].prims)):
            prim = w[alpha].prims[beta]
            i, j, k = prim.powers
            x0, y0, z0 = prim.origin
            #print [x0,y0,z0]
            U1[:, beta + nG] = pow(x - x0, i) * np.exp(-prim.exp * (x - x0)**2)
            U2[:, beta + nG] = pow(x - y0, j) * np.exp(-prim.exp * (x - y0)**2)
            U3[:, beta + nG] = pow(x - z0, k) * np.exp(-prim.exp * (x - z0)**2)
            c[beta + nG] = w[alpha].norm * prim.norm * prim.coef * cf[alpha]
        nG += len(w[alpha].prims)

    u1, v1 = tuck.cross.cross2d_full(U1, eps)
    u2, v2 = tuck.cross.cross2d_full(U2, eps)
    u3, v3 = tuck.cross.cross2d_full(U3, eps)

    v1 = np.real(H(v1))
    v2 = np.real(H(v2))
    v3 = np.real(H(v3))

    r1 = v1.shape[0]
    r2 = v2.shape[0]
    r3 = v3.shape[0]

    maxrank = max([r1, r2, r3])
    core = np.zeros((maxrank, maxrank, maxrank))
    for a1 in xrange(r1):
        for a2 in xrange(r2):
            for a3 in xrange(r3):
                for a in xrange(len(c)):
                    core[a1, a2,
                         a3] += c[a] * v1[a1, a] * v2[a2, a] * v3[a3, a]

    u1_new = np.zeros((n, maxrank))
    u2_new = np.zeros((n, maxrank))
    u3_new = np.zeros((n, maxrank))

    u1_new[:, :r1] = u1
    u2_new[:, :r2] = u2
    u3_new[:, :r3] = u3

    b = tuck.tensor()
    b.core = core.copy()
    b.u[0] = np.real(u1_new)
    b.u[1] = np.real(u2_new)
    b.u[2] = np.real(u3_new)

    b.r = core.shape
    b.n = (n, n, n)

    return b
Пример #9
0
def cross3d(func, M, eps_init, delta_add = 1e-5):


    N = int((M+1)/2)

    r1 = 2
    r2 = 2
    r3 = 2

    GG = np.zeros((r1,r2,r3),dtype=np.complex128)

    U1 = np.zeros((M,r1),dtype=np.complex128)
    U2 = np.zeros((M,r2),dtype=np.complex128)
    U3 = np.zeros((M,r3),dtype=np.complex128)

    U1[:N,:] = np.random.random((N,r1))
    U2[:N,:] = np.random.random((N,r2))
    U3[:N,:] = np.random.random((N,r3))

    U1, R = np.linalg.qr(U1)
    U2, R = np.linalg.qr(U2)
    U3, R = np.linalg.qr(U3)

    eps_cross = 1

    while True:


        row_order_U1 = tuck.mv.maxvol(U1)
        row_order_U2 = tuck.mv.maxvol(U2)
        row_order_U3 = tuck.mv.maxvol(U3)


        Ar = np.zeros((r1,r2,r3),dtype=np.complex128)

        for i in xrange(r1):
            for j in xrange(r2):
                for k in xrange(r3):
                    Ar[i,j,k] = func((row_order_U1[i],row_order_U2[j],row_order_U3[k]))


        U1_r = U1[row_order_U1,:]
        U2_r = U2[row_order_U2,:]
        U3_r = U3[row_order_U3,:]

        G_UV = np.linalg.solve(U3_r,np.reshape(np.transpose(Ar,[2,0,1]),(r3,r1*r2),order='f'))
        G_UV = np.reshape(G_UV,(r3,r1,r2),order='f')
        G_UV = np.transpose(G_UV,[1,2,0])

        G_U = np.linalg.solve(U2_r,np.reshape(np.transpose(G_UV,[1,2,0]),(r2,r1*r3),order='f'))
        G_U = np.reshape(G_U,(r2,r3,r1),order='f')
        G_U = np.transpose(G_U,[2,0,1])

        G = np.linalg.solve(U1_r,np.reshape(G_U,(r1,r2*r3),order='f'))
        G = np.reshape(G,(r1,r2,r3),order='f')

        norm = np.linalg.norm(G)
        eps_cross = (np.linalg.norm(GG-G))/norm
    #print 'relative accuracy = %s' % (eps_cross), 'ranks = %s' % r1, r2, r3
        G_Tucker = tuck.tensor(G, eps_init/10)


        G = G_Tucker.core

        U1 = np.dot(U1, G_Tucker.u[0])
        U2 = np.dot(U2, G_Tucker.u[1])
        U3 = np.dot(U3, G_Tucker.u[2])

        (r1, r2, r3) = G_Tucker.r

        if eps_cross < eps_init:
            break

        row_order_U1 = tuck.mv.maxvol(U1)
        row_order_U2 = tuck.mv.maxvol(U2)
        row_order_U3 = tuck.mv.maxvol(U3)


        Ar = np.zeros((r1,r2,r3),dtype=np.complex128)

        for i in xrange(r1):
            for j in xrange(r2):
                for k in xrange(r3):
                    Ar[i, j, k] = func((row_order_U1[i], row_order_U2[j], row_order_U3[k]))


        A1 = np.reshape(Ar, [r1,-1], order='f')
        A1_r = np.transpose(A1)
        A1_r,R = np.linalg.qr(A1_r)
        column_order_U1 = tuck.mv.maxvol(A1_r)


        A2 = np.reshape(np.transpose(Ar, [1,0,2]), [r2,-1], order='f')
        A2_r = np.transpose(A2)
        A2_r,R = np.linalg.qr(A2_r)
        column_order_U2 = tuck.mv.maxvol(A2_r)


        A3 = np.reshape(np.transpose(Ar, [2,0,1]), [r3,-1], order='f')
        A3_r = np.transpose(A3)
        A3_r,R = np.linalg.qr(A3_r)
        column_order_U3 = tuck.mv.maxvol(A3_r)


        u1 = np.zeros((M, r1), dtype=np.complex128)
        for i in xrange(r1):
            for ii in xrange(M):
                k1_order, j1_order = mod(column_order_U1[i], r2)
                u1[ii,i] = func((ii, row_order_U2[j1_order], row_order_U3[k1_order]))

        u2 = np.zeros((M, r2), dtype=np.complex128)
        for j in xrange(r2):
            for jj in xrange(M):
                k1_order, i1_order = mod(column_order_U2[j], r1)
                u2[jj,j] = func((row_order_U1[i1_order], jj, row_order_U3[k1_order]))

        u3 = np.zeros((M, r3), dtype=np.complex128)
        for k in xrange(r3):
            for kk in xrange(M):
                j1_order, i1_order = mod(column_order_U3[k], r1)
                u3[kk,k] = func((row_order_U1[i1_order], row_order_U2[j1_order], kk))


        u1, v, r11 = round_matrix(u1, delta_add)
        u2, v, r22 = round_matrix(u2, delta_add)
        u3, v, r33 = round_matrix(u3, delta_add)

        u1 = u1[:,:r11]
        u2 = u2[:,:r22]
        u3 = u3[:,:r33]

        U1_0 = np.zeros((M,r1+r11),dtype=np.complex128)
        U2_0 = np.zeros((M,r2+r22),dtype=np.complex128)
        U3_0 = np.zeros((M,r3+r33),dtype=np.complex128)

        U1_0[:,:r1] = U1.copy()
        U2_0[:,:r2] = U2.copy()
        U3_0[:,:r3] = U3.copy()

        U1_0[:,r1:r1+r11] = u1
        U2_0[:,r2:r2+r22] = u2
        U3_0[:,r3:r3+r33] = u3


        U1 = U1_0.copy()
        U2 = U2_0.copy()
        U3 = U3_0.copy()

        r1 = r1+r11
        r2 = r2+r22
        r3 = r3+r33


        U1, R1 = np.linalg.qr(U1)
        U2, R2 = np.linalg.qr(U2)
        U3, R3 = np.linalg.qr(U3)


        GG = np.zeros((r1,r2,r3),dtype=np.complex128)
        GG[:(r1-r11),:(r2-r22),:(r3-r33)] = G.copy()


        GG = np.dot(np.transpose(GG,[2,1,0]),np.transpose(R1))
        GG = np.dot(np.transpose(GG,[0,2,1]),np.transpose(R2))
        GG = np.transpose(GG,[1,2,0])
        GG = np.dot(GG,np.transpose(R3))

            #print 'ranks after rounding = %s' % r1, r2, r3
    G_Tucker.n = (M, M, M)
    G_Tucker.u[0] = U1
    G_Tucker.u[1] = U2
    G_Tucker.u[2] = U3
    G_Tucker.r = [r1, r2, r3]


    return tuck.round(G_Tucker, eps_init)