Ejemplo n.º 1
0
def assert_bidiagonalized_by(m,
                             p,
                             q,
                             rtol: float = DEFAULT_RTOL,
                             atol: float = DEFAULT_ATOL):
    d = p.dot(m).dot(q)

    try:
        assert predicates.is_orthogonal(p)
        assert predicates.is_orthogonal(q)
        assert predicates.is_diagonal(d, rtol=rtol, atol=atol)
    except AssertionError:
        # coverage: ignore

        print("m.round(3)")
        print(np.round(m, 3))

        print("p.round(3)")
        print(np.round(p, 3))

        print("q.round(3)")
        print(np.round(q, 3))

        print("np.log10(np.abs(p @ m @ q)).round(2)")
        print(np.log10(np.abs(d)).round(2))

        raise
Ejemplo n.º 2
0
def test_is_orthogonal_tolerance():
    tol = Tolerance(atol=0.5)

    # Pays attention to specified tolerance.
    assert predicates.is_orthogonal(np.array([[1, 0], [-0.5, 1]]), tol)
    assert not predicates.is_orthogonal(np.array([[1, 0], [-0.6, 1]]), tol)

    # Error isn't accumulated across entries.
    assert predicates.is_orthogonal(
        np.array([[1.2, 0, 0], [0, 1.2, 0], [0, 0, 1.2]]), tol)
    assert not predicates.is_orthogonal(
        np.array([[1.2, 0, 0], [0, 1.3, 0], [0, 0, 1.2]]), tol)
Ejemplo n.º 3
0
def diagonalize_real_symmetric_matrix(
        matrix: np.ndarray,
        tolerance: Tolerance = Tolerance.DEFAULT) -> np.ndarray:
    """Returns an orthogonal matrix that diagonalizes the given matrix.

    Args:
        matrix: A real symmetric matrix to diagonalize.
        tolerance: Numeric error thresholds.

    Returns:
        An orthogonal matrix P such that P.T @ matrix @ P is diagonal.

    Raises:
        ValueError: Matrix isn't real symmetric.
        ArithmeticError: Failed to meet specified tolerance.
    """

    if np.any(np.imag(matrix) != 0) or not predicates.is_hermitian(matrix):
        raise ValueError('Input must be real and symmetric.')

    _, result = np.linalg.eigh(matrix)

    # Check acceptability vs tolerances.
    if (not predicates.is_orthogonal(result, tolerance)
            or not predicates.is_diagonal(
                result.T.dot(matrix).dot(result), tolerance)):
        raise ArithmeticError('Failed to diagonalize to specified tolerance.')

    return result
Ejemplo n.º 4
0
def diagonalize_real_symmetric_matrix(
        matrix: np.ndarray,
        tolerance: Tolerance = Tolerance.DEFAULT
) -> np.ndarray:
    """Returns an orthogonal matrix that diagonalizes the given matrix.

    Args:
        matrix: A real symmetric matrix to diagonalize.
        tolerance: Numeric error thresholds.

    Returns:
        An orthogonal matrix P such that P.T @ matrix @ P is diagonal.

    Raises:
        ValueError: Matrix isn't real symmetric.
        ArithmeticError: Failed to meet specified tolerance.
    """

    if np.any(np.imag(matrix) != 0) or not predicates.is_hermitian(matrix):
        raise ValueError('Input must be real and symmetric.')

    _, result = np.linalg.eigh(matrix)

    # Check acceptability vs tolerances.
    if (not predicates.is_orthogonal(result, tolerance) or
            not predicates.is_diagonal(result.T.dot(matrix).dot(result),
                                        tolerance)):
        raise ArithmeticError('Failed to diagonalize to specified tolerance.')

    return result
Ejemplo n.º 5
0
def assertdiagonalized_by(m, p, tol=Tolerance.DEFAULT):
    d = p.T.dot(m).dot(p)

    try:
        assert predicates.is_orthogonal(p)
        assert predicates.is_diagonal(d, tol)
    except AssertionError:
        # coverage: ignore

        print("m.round(3)")
        print(np.round(m, 3))

        print("p.round(3)")
        print(np.round(p, 3))

        print("np.log10(np.abs(p.T @ m @ p)).round(2)")
        print(np.log10(np.abs(d)).round(2))

        raise
Ejemplo n.º 6
0
def test_is_orthogonal():
    assert predicates.is_orthogonal(np.empty((0, 0)))
    assert not predicates.is_orthogonal(np.empty((1, 0)))
    assert not predicates.is_orthogonal(np.empty((0, 1)))

    assert predicates.is_orthogonal(np.array([[1]]))
    assert predicates.is_orthogonal(np.array([[-1]]))
    assert not predicates.is_orthogonal(np.array([[1j]]))
    assert not predicates.is_orthogonal(np.array([[5]]))
    assert not predicates.is_orthogonal(np.array([[3j]]))

    assert not predicates.is_orthogonal(np.array([[1, 0]]))
    assert not predicates.is_orthogonal(np.array([[1], [0]]))

    assert not predicates.is_orthogonal(np.array([[1, 0], [0, -2]]))
    assert predicates.is_orthogonal(np.array([[1, 0], [0, -1]]))
    assert not predicates.is_orthogonal(np.array([[1j, 0], [0, 1]]))
    assert not predicates.is_orthogonal(np.array([[1, 0], [1, 1]]))
    assert not predicates.is_orthogonal(np.array([[1, 1], [0, 1]]))
    assert not predicates.is_orthogonal(np.array([[1, 1], [1, 1]]))
    assert not predicates.is_orthogonal(np.array([[1, -1], [1, 1]]))
    assert predicates.is_orthogonal\
        (np.array([[1, -1], [1, 1]]) * np.sqrt(0.5))
    assert not predicates.is_orthogonal(
        np.array([[1, 1j], [1j, 1]]) * np.sqrt(0.5))
    assert not predicates.is_orthogonal(
        np.array([[1, -1j], [1j, 1]]) * np.sqrt(0.5))

    assert predicates.is_orthogonal(np.array([[1, 1e-11], [0, 1 + 1e-11]]))