def test_forme_bidiagonale(epsilon):
    n = rd.randint(1,20)
    m = rd.randint(1,20)
    M = np.asmatrix(np.random.rand(n,m))
    M = 100 * M
    result = p2.forme_bidiagonale (M)
    test_0_bidiagonale(result[1],epsilon)
    for i in range (n):
        for j in range (m):
            assert (np.abs(M[i,j] - (result[0]*result[1]*result[2])[i,j])<epsilon)
def compression_matrice (Mat, k):
    taille_x = Mat.shape[0]
    taille_y = Mat.shape[1]
    assert (k < min(taille_x, taille_y))
    print "Mise sous forme bidiagonale"
    (Ql, BD, Qr) = p2.forme_bidiagonale(Mat)
    print "Diagonalisation"
    (U,S,V,_) = p3.SVD_preliminaire(BD)    
    (U,S) = p3.organisation(U,S)
    nouveau_U = np.asmatrix(Ql*(U[:,0:k]))
    nouveau_S = np.asmatrix(S[0:k,0:k])
    nouveau_V = np.asmatrix((V[0:k,:])*Qr)
    return (nouveau_U, nouveau_S, nouveau_V)
def QR_optimise (A):
    taille_x = A.shape[0]
    taille_y = A.shape[1]
    taille_max = max(taille_x, taille_y)
    AprimTest = mat_identity(taille_x, taille_y)
    AprimTest[:,:]=A[:,:]
    tQ = mat_identity(taille_x, taille_y)
    for i in range (taille_x - 1):
        (Grot,Aprim,_) = p2.forme_bidiagonale( (AprimTest[i:i+2, i:i+2]))             
        Grot = Grot.T
        G = mat_identity(taille_x, taille_x)
        AprimTest[i:i+2,i:i+2]=Aprim
        G[i:i+2, i:i+2] = Grot
        tQ = G*tQ
    Q = np.transpose(tQ)
    return (Q, AprimTest)
def test_SVD (n, len_matrix, activate_plot = False, optimise = False):
    if(n <= 0):
        print("Erreur, veuillez entrer un nombre de test strictement positif\n")
        return "FAILED"
    else :
        Matrix_list = []
        Compare_list_S = []
        Compare_list_V = []
        Compare_list_U = []
        x = range(0,n)
        for i in range(0,n):
            Matrix_list.append(p2.forme_bidiagonale(rand_square_Matrix(len_matrix, 0,100))[2])
        if (optimise == False):
            for i in range(0,n):
                Compare_list_U.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[0]) - (p3.SVD_preliminaire(Matrix_list[i])[0])))
                Compare_list_S.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[1]) - (p3.SVD_preliminaire(Matrix_list[i])[1])))
                Compare_list_V.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[2]) - (p3.SVD_preliminaire(Matrix_list[i])[2])))
            if(activate_plot == True):
                mp.plot(x,Compare_list_U)
                mp.title("Comparaison entre U implemente et celui du svd de numpy")
                mp.show()
                mp.plot(x,Compare_list_S)
                mp.title("Comparaison entre S implemente et celui du svd de numpy")
                mp.show()
                mp.plot(x,Compare_list_V)
                mp.title("Comparaison entre V implemente et celui du svd de numpy")
                mp.show()
        else : 
            Compare_list_U.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[0]) - (SVD_optimise(Matrix_list[i])[0])))
            Compare_list_S.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[1]) - (SVD_optimise(Matrix_list[i])[1])))
            Compare_list_V.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[2]) - (SVD_optimise(Matrix_list[i])[2])))
            if(activate_plot == True):
                mp.plot(x,Compare_list_U)
                mp.title("Comparaison entre U implemente et celui du svd de numpy")
                mp.show()
                mp.plot(x,Compare_list_S)
                mp.title("Comparaison entre S implemente et celui du svd de numpy")
                mp.show()
                mp.plot(x,Compare_list_V)
                mp.title("Comparaison entre V implemente et celui du svd de numpy")
                mp.show()
        return "PASSED"
def test_QR_optimise (n, len_matrix, activate_plot = False):
    if(n <= 0):
        print("Erreur, veuillez entrer un nombre de test strictement positif\n")
        return "FAILED"
    else :
        Matrix_list = []
        Compare_list_Q = []
        Compare_list_R = []
        x = range(0,n)
        for i in range(0,n):
            Matrix_list.append(p2.forme_bidiagonale(rand_square_Matrix(len_matrix, 0,100))[2])
        for i in range(0,n):
            Compare_list_Q.append(np.linalg.norm((np.linalg.qr(Matrix_list[i])[0]) - (p3.QR_optimise(Matrix_list[i])[0])))
            Compare_list_R.append(np.linalg.norm((np.linalg.qr(Matrix_list[i])[1]) - (p3.QR_optimise(Matrix_list[i])[1])))
        if(activate_plot == True):
            mp.plot(x,Compare_list_Q)
            mp.title("Comparaison entre Q implemente et celui de numpy")
            mp.show()
            mp.plot(x,Compare_list_R)
            mp.title("Comparaison entre R implemente et celui de numpy")
            mp.show()
        return "PASSED"