#!/usr/bin/env python
# encoding: utf-8
"""
Methods that wrap common computations.
"""
[docs]
class Backend:
def __init__(self):
self.backend_name = None
self.backend = None
[docs]
def set_backend(self, backend_name="numpy"):
self.backend_name = backend_name
self.backend = self.get_backend(backend_name)
# Set constants
self.pi = self.backend.pi
# Return backend instance
return self.backend
[docs]
def get_backend(self, backend_name):
"""
Returns an instance of the specified backend class.
This function creates and returns an instance of the backend class specified by the
`backend_name` argument. Currently supported backends are "numpy" and others can be
added as needed.
Args:
backend_name (str, optional): The name of the backend for which an instance is to be created.
Defaults to "numpy".
Raises:
ValueError: If the specified `backend_name` is not supported.
Returns:
object: An instance of the specified backend class.
"""
backends = {
"numpy": NumpyBackend,
# Add other backends here as needed
}
if backend_name not in backends:
raise ValueError(f"Unsupported backend: {backend_name}")
return backends[backend_name]()
[docs]
def abs(self, *args, **kwargs):
return self.backend.abs(*args, **kwargs)
[docs]
def absolute(self, *args, **kwargs):
return self.backend.absolute(*args, **kwargs)
[docs]
def any(self, *args, **kwargs):
return self.backend.any(*args, **kwargs)
[docs]
def apply_along_axis(self, *args, **kwargs):
return self.backend.apply_along_axis(*args, **kwargs)
[docs]
def apply_over_axes(self, *args, **kwargs):
return self.backend.apply_over_axes(*args, **kwargs)
[docs]
def arange(self, *args, **kwargs):
return self.backend.arange(*args, **kwargs)
[docs]
def around(self, *args, **kwargs):
return self.backend.around(*args, **kwargs)
[docs]
def array(self, *args, **kwargs):
return self.backend.array(*args, **kwargs)
[docs]
def array_equal(self, *args, **kwargs):
return self.backend.array_equal(*args, **kwargs)
[docs]
def asarray(self, *args, **kwargs):
return self.backend.asarray(*args, **kwargs)
[docs]
def atleast_1d(self, *args, **kwargs):
return self.backend.atleast_1d(*args, **kwargs)
[docs]
def atleast_2d(self, *args, **kwargs):
return self.backend.atleast_2d(*args, **kwargs)
[docs]
def convolve(self, *args, **kwargs):
return self.backend.convolve(*args, **kwargs)
[docs]
def copy(self, *args, **kwargs):
return self.backend.copy(*args, **kwargs)
[docs]
def cos(self, *args, **kwargs):
return self.backend.cos(*args, **kwargs)
[docs]
def diag(self, *args, **kwargs):
return self.backend.diag(*args, **kwargs)
[docs]
def dot(self, *args, **kwargs):
return self.backend.dot(*args, **kwargs)
[docs]
def dtype(self, *args, **kwargs):
return self.backend.dtype(*args, **kwargs)
[docs]
def empty(self, *args, **kwargs):
return self.backend.empty(*args, **kwargs)
[docs]
def empty_like(self, *args, **kwargs):
return self.backend.empty_like(*args, **kwargs)
[docs]
def exp(self, *args, **kwargs):
return self.backend.exp(*args, **kwargs)
[docs]
def fromiter(self, *args, **kwargs):
return self.backend.fromiter(*args, **kwargs)
[docs]
def lib_stride_tricks_as_strided(self, *args, **kwargs):
return self.backend.lib_stride_tricks_as_strided(*args, **kwargs)
[docs]
def linspace(self, *args, **kwargs):
return self.backend.linspace(*args, **kwargs)
[docs]
def log(self, *args, **kwargs):
return self.backend.log(*args, **kwargs)
[docs]
def log2(self, *args, **kwargs):
return self.backend.log2(*args, **kwargs)
[docs]
def mat(self, *args, **kwargs):
return self.backend.mat(*args, **kwargs)
[docs]
def max(self, *args, **kwargs):
return self.backend.max(*args, **kwargs)
[docs]
def meshgrid(self, *args, **kwargs):
return self.backend.meshgrid(*args, **kwargs)
[docs]
def min(self, *args, **kwargs):
return self.backend.min(*args, **kwargs)
[docs]
def ndarray(self, *args, **kwargs):
return self.backend.ndarray(*args, **kwargs)
[docs]
def nonzero(self, *args, **kwargs):
return self.backend.nonzero(*args, **kwargs)
[docs]
def ones(self, *args, **kwargs):
return self.backend.ones(*args, **kwargs)
[docs]
def ones_like(self, *args, **kwargs):
return self.backend.ones_like(*args, **kwargs)
[docs]
def power(self, *args, **kwargs):
return self.backend.power(*args, **kwargs)
[docs]
def real(self, *args, **kwargs):
return self.backend.real(*args, **kwargs)
[docs]
def reshape(self, *args, **kwargs):
return self.backend.reshape(*args, **kwargs)
[docs]
def savetxt(self, *args, **kwargs):
return self.backend.savetxt(*args, **kwargs)
[docs]
def set_printoptions(self, *args, **kwargs):
return self.backend.set_printoptions(*args, **kwargs)
[docs]
def sin(self, *args, **kwargs):
return self.backend.sin(*args, **kwargs)
[docs]
def sqrt(self, *args, **kwargs):
return self.backend.sqrt(*args, **kwargs)
[docs]
def squeeze(self, *args, **kwargs):
return self.backend.squeeze(*args, **kwargs)
[docs]
def sum(self, *args, **kwargs):
return self.backend.sum(*args, **kwargs)
[docs]
def tan(self, *args, **kwargs):
return self.backend.tan(*args, **kwargs)
[docs]
def union1d(self, *args, **kwargs):
return self.backend.union1d(*args, **kwargs)
[docs]
def vectorize(self, *args, **kwargs):
return self.backend.vectorize(*args, **kwargs)
[docs]
def where(self, *args, **kwargs):
return self.backend.where(*args, **kwargs)
[docs]
def zeros(self, *args, **kwargs):
return self.backend.zeros(*args, **kwargs)
[docs]
def zeros_like(self, *args, **kwargs):
return self.backend.zeros_like(*args, **kwargs)
[docs]
class BackendBase:
def __init__(self):
pass
# ################################################################################
# # NumPy implementation
# ################################################################################
[docs]
class NumpyBackend(BackendBase):
def __init__(self):
# print("Initialising Numpy Backend")
try:
import numpy as np
except ImportError:
raise ImportError(
"NumPy library is not installed. Please install NumPy to use this function."
)
self.np = np
# Constants
self.pi = np.pi
# Datatypes
self.float64 = np.float64
self.complex128 = np.complex128
# Array class
self.ndarray = np.ndarray
# Misc
self.index_exp = np.index_exp
[docs]
def abs(self, *args, **kwargs):
return self.np.abs(*args, **kwargs)
[docs]
def absolute(self, *args, **kwargs):
return self.np.absolute(*args, **kwargs)
[docs]
def any(self, *args, **kwargs):
return self.np.any(*args, **kwargs)
[docs]
def apply_along_axis(self, *args, **kwargs):
return self.np.apply_along_axis(*args, **kwargs)
[docs]
def apply_over_axes(self, *args, **kwargs):
return self.np.apply_over_axes(*args, **kwargs)
[docs]
def arange(self, *args, **kwargs):
return self.np.arange(*args, **kwargs)
[docs]
def around(self, *args, **kwargs):
return self.np.around(*args, **kwargs)
[docs]
def array(self, *args, **kwargs):
return self.np.array(*args, **kwargs)
[docs]
def array_equal(self, *args, **kwargs):
return self.np.array_equal(*args, **kwargs)
[docs]
def asarray(self, *args, **kwargs):
return self.np.asarray(*args, **kwargs)
[docs]
def atleast_1d(self, *args, **kwargs):
return self.np.atleast_1d(*args, **kwargs)
[docs]
def atleast_2d(self, *args, **kwargs):
return self.np.atleast_2d(*args, **kwargs)
[docs]
def convolve(self, *args, **kwargs):
return self.np.convolve(*args, **kwargs)
[docs]
def copy(self, *args, **kwargs):
return self.np.copy(*args, **kwargs)
[docs]
def cos(self, *args, **kwargs):
return self.np.cos(*args, **kwargs)
[docs]
def diag(self, *args, **kwargs):
return self.np.diag(*args, **kwargs)
[docs]
def dot(self, *args, **kwargs):
return self.np.dot(*args, **kwargs)
[docs]
def dtype(self, *args, **kwargs):
return self.np.dtype(*args, **kwargs)
[docs]
def empty(self, *args, **kwargs):
return self.np.empty(*args, **kwargs)
[docs]
def empty_like(self, *args, **kwargs):
return self.np.empty_like(*args, **kwargs)
[docs]
def exp(self, *args, **kwargs):
return self.np.exp(*args, **kwargs)
[docs]
def fromiter(self, *args, **kwargs):
return self.np.fromiter(*args, **kwargs)
def lib_stride_tricks_as_strided(self, *args, **kwargs):
return self.np.lib_stride_tricks_as_strided(*args, **kwargs)
[docs]
def linspace(self, *args, **kwargs):
return self.np.linspace(*args, **kwargs)
[docs]
def log(self, *args, **kwargs):
return self.np.log(*args, **kwargs)
[docs]
def log2(self, *args, **kwargs):
return self.np.log2(*args, **kwargs)
[docs]
def mat(self, *args, **kwargs):
return self.np.mat(*args, **kwargs)
[docs]
def max(self, *args, **kwargs):
return self.np.max(*args, **kwargs)
[docs]
def meshgrid(self, *args, **kwargs):
return self.np.meshgrid(*args, **kwargs)
[docs]
def min(self, *args, **kwargs):
return self.np.min(*args, **kwargs)
[docs]
def ndarray(self, *args, **kwargs):
return self.np.ndarray(*args, **kwargs)
[docs]
def nonzero(self, *args, **kwargs):
return self.np.nonzero(*args, **kwargs)
[docs]
def ones(self, *args, **kwargs):
return self.np.ones(*args, **kwargs)
[docs]
def ones_like(self, *args, **kwargs):
return self.np.ones_like(*args, **kwargs)
[docs]
def power(self, *args, **kwargs):
return self.np.power(*args, **kwargs)
[docs]
def real(self, *args, **kwargs):
return self.np.real(*args, **kwargs)
[docs]
def reshape(self, *args, **kwargs):
return self.np.reshape(*args, **kwargs)
[docs]
def savetxt(self, *args, **kwargs):
return self.np.savetxt(*args, **kwargs)
[docs]
def set_printoptions(self, *args, **kwargs):
return self.np.set_printoptions(*args, **kwargs)
[docs]
def sin(self, *args, **kwargs):
return self.np.sin(*args, **kwargs)
[docs]
def sqrt(self, *args, **kwargs):
return self.np.sqrt(*args, **kwargs)
[docs]
def squeeze(self, *args, **kwargs):
return self.np.squeeze(*args, **kwargs)
[docs]
def sum(self, *args, **kwargs):
return self.np.sum(*args, **kwargs)
[docs]
def tan(self, *args, **kwargs):
return self.np.tan(*args, **kwargs)
[docs]
def union1d(self, *args, **kwargs):
return self.np.union1d(*args, **kwargs)
[docs]
def vectorize(self, *args, **kwargs):
return self.np.vectorize(*args, **kwargs)
[docs]
def where(self, *args, **kwargs):
return self.np.where(*args, **kwargs)
[docs]
def zeros(self, *args, **kwargs):
return self.np.zeros(*args, **kwargs)
[docs]
def zeros_like(self, *args, **kwargs):
return self.np.zeros_like(*args, **kwargs)
[docs]
def lib_stride_tricks_as_strided(self, x, shape=None, strides=None, writeable=True):
return self.np.lib.stride_tricks.as_strided(
x, shape=shape, strides=strides, writeable=writeable
)