Source code for toqito.matrix_props.is_nonnegative

"""Checks if the matrix is nonnegative or doubly nonnegative."""

import numpy as np

from toqito.matrix_props import is_positive_semidefinite


[docs] def is_nonnegative(input_mat: np.ndarray, mat_type: str = "nonnegative") -> bool: r"""Check if the matrix is nonnegative. When all the entries in the matrix are larger than or equal to zero the matrix of interest is a nonnegative matrix [@WikiNonNegative]. When a matrix is nonegative and positive semidefinite [@WikiPosDef], the matrix is doubly nonnegative. Examples: We expect an identity matrix to be nonnegative. ```python exec="1" source="above" import numpy as np from toqito.matrix_props import is_nonnegative print(is_nonnegative(np.eye(2))) print(is_nonnegative(np.eye(2), "doubly")) print(is_nonnegative(np.array([[1, -1], [1, 1]]))) ``` Raises: TypeError: If something other than `"doubly"`or `"nonnegative"` is used for `mat_type`. Args: input_mat: np.ndarray Matrix of interest. mat_type: Type of nonnegative matrix. `"nonnegative"` for a nonnegative matrix and `"doubly"` for a doubly nonnegative matrix. """ valid_types = {"nonnegative", "doubly"} if mat_type not in valid_types: raise TypeError(f"Invalid matrix check type: {mat_type}. Must be one of: {valid_types}.") is_entrywise_nonnegative = bool(np.all(input_mat >= 0)) if mat_type == "doubly": return is_entrywise_nonnegative and is_positive_semidefinite(input_mat) else: return is_entrywise_nonnegative