def test_Givens_rotation_definition():
    'verify if Givens rotation satisfies its definition'
    np.random.rand(3)
    # general a and b
    a = 10*np.random.rand()
    b = 10*np.random.rand()
    c, s = qra.Givens_rotation(a=a, b=b)
    G = np.array([[ c, s],
                  [-s, c]])
    v = np.array([a, b])
    Gv = np.dot(G.T, v)
    aae(Gv[1], 0, decimal=10)
    # b = 0
    a = 10*np.random.rand()
    b = 0
    c, s = qra.Givens_rotation(a=a, b=b)
    G = np.array([[ c, s],
                  [-s, c]])
    v = np.array([a, b])
    Gv = np.dot(G.T, v)
    aae(Gv[1], 0, decimal=10)
    # |b| > |a|
    a = 7*np.random.rand()
    b = 10*np.random.rand()
    c, s = qra.Givens_rotation(a=a, b=b)
    G = np.array([[ c, s],
                  [-s, c]])
    v = np.array([a, b])
    Gv = np.dot(G.T, v)
    aae(Gv[1], 0, decimal=10)
def test_Givens_matvec_matmat():
    'verify matrix-matrix product with Givens rotations'
    np.random.seed(3)
    M = 5
    N = 7
    A = np.round(np.random.rand(M,N), decimals=3)
    i = 2
    k = 3
    c, s = qra.Givens_rotation(a=A[i,3], b=A[k,3])
    # verify product GTA
    G = np.identity(M)
    G[i,i] = c
    G[i,k] = s
    G[k,i] = -s
    G[k,k] = c
    A2 = A.copy()
    qra.Givens_matvec(A=A2, c=c, s=s, i=i, k=k, order='GTA')
    aae(A2, np.dot(G.T,A), decimal=10)
    # verify AG
    G = np.identity(N)
    G[i,i] = c
    G[i,k] = s
    G[k,i] = -s
    G[k,k] = c
    A2 = A.copy()
    qra.Givens_matvec(A=A2, c=c, s=s, i=i, k=k, order='AG')
    aae(A2, np.dot(A,G), decimal=10)
def test_Givens_cs2rho_Givens_rho2cs():
    'verify consistency'
    np.random.seed(11)
    a = 10*np.random.rand()
    b = 10*np.random.rand()
    c, s = qra.Givens_rotation(a=a, b=b)
    rho = qra.Givens_cs2rho(c=c, s=s)
    c2, s2 = qra.Givens_rho2cs(rho=rho)
    aae(c, c2, decimal=10)
    aae(s, s2, decimal=10)