Merge pull request #58 from qiboteam/list_backends

`MetaBackend`
This commit is contained in:
Stefano Carrazza
2024-05-23 07:24:10 +02:00
committed by GitHub
4 changed files with 69 additions and 18 deletions

14
poetry.lock generated
View File

@@ -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]

View File

@@ -1,3 +1,5 @@
import importlib.metadata as im
from qibotn.backends import MetaBackend
__version__ = im.version(__package__)

View File

@@ -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

View File

@@ -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.")