diff --git a/poetry.lock b/poetry.lock index 9b2eac8..ac5d49a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1039,13 +1039,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.4.0" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" files = [ - {file = "joblib-1.4.0-py3-none-any.whl", hash = "sha256:42942470d4062537be4d54c83511186da1fc14ba354961a2114da91efa9a4ed7"}, - {file = "joblib-1.4.0.tar.gz", hash = "sha256:1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c"}, + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] [[package]] @@ -1994,7 +1994,7 @@ torch = ["torch (>=2.1.1,<3.0.0)"] type = "git" url = "https://github.com/qiboteam/qibo.git" reference = "HEAD" -resolved_reference = "036e882adfd7878b566e90eae02ff2c72e16e296" +resolved_reference = "703af36f06afff6dbc4a629a66b17671a8d8bd92" [[package]] name = "quimb" @@ -2396,13 +2396,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.2" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, - {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] diff --git a/src/qibotn/__init__.py b/src/qibotn/__init__.py index dc57e90..4942a45 100644 --- a/src/qibotn/__init__.py +++ b/src/qibotn/__init__.py @@ -1,3 +1,5 @@ import importlib.metadata as im +from qibotn.backends import MetaBackend + __version__ = im.version(__package__) diff --git a/src/qibotn/backends/__init__.py b/src/qibotn/backends/__init__.py index e69de29..48a1570 100644 --- a/src/qibotn/backends/__init__.py +++ b/src/qibotn/backends/__init__.py @@ -0,0 +1,47 @@ +from typing import Union + +from qibo.config import raise_error + +from qibotn.backends.cutensornet import CuTensorNet # pylint: disable=E0401 +from qibotn.backends.quimb import QuimbBackend # pylint: disable=E0401 + +QibotnBackend = Union[CuTensorNet, QuimbBackend] + +PLATFORMS = ("cutensornet", "qutensornet") + + +class MetaBackend: + """Meta-backend class which takes care of loading the qibotn backends.""" + + @staticmethod + def load(platform: str, runcard: dict = None) -> QibotnBackend: + """Loads the backend. + + Args: + platform (str): Name of the backend to load: either `cutensornet` or `qutensornet`. + runcard (dict): Dictionary containing the simulation settings. + Returns: + qibo.backends.abstract.Backend: The loaded backend. + """ + + if platform == "cutensornet": # pragma: no cover + return CuTensorNet(runcard) + elif platform == "qutensornet": # pragma: no cover + return QuimbBackend(runcard) + else: + raise_error( + NotImplementedError, + f"Unsupported platform {platform}, please pick one in (`cutensornet`, `qutensornet)", + ) + + def list_available(self) -> dict: + """Lists all the available qibotn backends.""" + available_backends = {} + for platform in PLATFORMS: + try: + MetaBackend.load(platform=platform) + available = True + except: + available = False + available_backends[platform] = available + return available_backends diff --git a/src/qibotn/backends/cutensornet.py b/src/qibotn/backends/cutensornet.py index c8341bd..1d38520 100644 --- a/src/qibotn/backends/cutensornet.py +++ b/src/qibotn/backends/cutensornet.py @@ -1,19 +1,9 @@ -import cuquantum # pylint: disable=import-error import numpy as np from qibo.backends.numpy import NumpyBackend from qibo.config import raise_error from qibo.result import QuantumState -CUDA_TYPES = { - "complex64": ( - cuquantum.cudaDataType.CUDA_C_32F, - cuquantum.ComputeType.COMPUTE_32F, - ), - "complex128": ( - cuquantum.cudaDataType.CUDA_C_64F, - cuquantum.ComputeType.COMPUTE_64F, - ), -} +CUDA_TYPES = {} class CuTensorNet(NumpyBackend): # pragma: no cover @@ -75,6 +65,18 @@ class CuTensorNet(NumpyBackend): # pragma: no cover self.supports_multigpu = True self.handle = self.cutn.create() + global CUDA_TYPES + CUDA_TYPES = { + "complex64": ( + self.cuquantum.cudaDataType.CUDA_C_32F, + self.cuquantum.ComputeType.COMPUTE_32F, + ), + "complex128": ( + self.cuquantum.cudaDataType.CUDA_C_64F, + self.cuquantum.ComputeType.COMPUTE_64F, + ), + } + def apply_gate(self, gate, state, nqubits): # pragma: no cover raise_error(NotImplementedError, "QiboTN cannot apply gates directly.")