# This code is part of qredtea.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
"""
Exception classes for quantum red tea.
"""
import importlib
__all__ = [
"QRedTeaError",
"QRedTeaEmptyTensorError",
"QRedTeaLinkError",
"QRedTeaRankError",
"QRedTeaAbelianSymError",
"QRedTeaDeviceError",
"QRedTeaDataTypeError",
"QRedTeaBackendLibraryImportError",
"QRedTeaLinAlgError",
"assert_module_available",
"get_error_tensor_class",
]
[docs]
class QRedTeaError(Exception):
"""Generic error for the qredtea library."""
[docs]
class QRedTeaEmptyTensorError(QRedTeaError):
"""Erros induced by empty tensors, parsed or generated."""
[docs]
class QRedTeaLinkError(QRedTeaError):
"""Errors induced by problems with the link."""
[docs]
class QRedTeaRankError(QRedTeaError):
"""Errors induced by passing the wrong rank of a tensor."""
[docs]
class QRedTeaAbelianSymError(QRedTeaError):
"""Errors induced by symmetries."""
[docs]
class QRedTeaDeviceError(QRedTeaError):
"""Errors induced by device selection, conversion."""
[docs]
class QRedTeaDataTypeError(QRedTeaError):
"""Errors induced by device conversion of data types."""
[docs]
class QRedTeaBackendLibraryImportError(QRedTeaError, ImportError):
"""Errors induced by not being able to import a library."""
[docs]
class QRedTeaLinAlgError(QRedTeaError):
"""Errors introduced by linear algebra routines."""
[docs]
def assert_module_available(*args, **kwargs):
"""Function to punish those that try to use JAX without installing it."""
module = kwargs.get("module", "numpy")
if importlib.util.find_spec(module) is None:
raise QRedTeaBackendLibraryImportError(f"{module} could not be imported.")
[docs]
def get_error_tensor_class(error_function):
"""Return a class that gives errors when any of the class/static methods are called"""
class ErrorTensor:
"""
Class to handle all the possible
"""
func = error_function
def __init__(self, *args, **kwargs):
self.func()
@staticmethod
def convert_operator_dict(*args, **kwargs):
"""Raise the error"""
error_function()
@staticmethod
def dummy_link(*args, **kwargs):
"""Raise the error"""
error_function()
@staticmethod
def set_missing_link(*args, **kwargs):
"""Raise the error"""
error_function()
@staticmethod
def device_str(*args, **kwargs):
"""Raise the error"""
error_function()
@staticmethod
def dtype_to_numpy(*args, **kwargs):
"""Raise the error"""
error_function()
@classmethod
def from_qteatensor(cls, *args, **kwargs):
"""Raise the error"""
cls.func()
@classmethod
def read(cls, *args, **kwargs):
"""Raise the error"""
cls.func()
@classmethod
def mpi_recv(cls, *args, **kwargs):
"""Raise the error"""
cls.func()
@classmethod
def from_elem_array(cls, *args, **kwargs):
"""Raise the error"""
cls.func()
return ErrorTensor