diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 00000000..3ce0b30c --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,4 @@ +# Reference docs at https://docs.codecov.com/docs/codecovyml-reference + +codecov: + require_ci_to_pass: yes diff --git a/.github/workflows/rules.yml b/.github/workflows/rules.yml index 8f956cf4..fe209c76 100644 --- a/.github/workflows/rules.yml +++ b/.github/workflows/rules.yml @@ -1,8 +1,6 @@ -# A single CI script with github workflow -name: Tests -env: - CUDA_PATH: + +name: Tests on: workflow_dispatch: @@ -10,27 +8,14 @@ on: pull_request: types: [labeled] -jobs: - check: - # job to check cuda availability for local gpu host runners - runs-on: ubuntu-latest - steps: - - id: step1 - run: echo "test=${{ env.CUDA_PATH != ''}}" >> "$GITHUB_OUTPUT" - - id: step2 - run: echo "test=${{ contains(github.event.pull_request.labels.*.name, 'run-workflow') || github.event_name == 'push' }}" >> "$GITHUB_OUTPUT" - outputs: - cuda_avail: ${{ fromJSON(steps.step1.outputs.test) && fromJSON(steps.step2.outputs.test) }} +jobs: build: - # job to build - needs: check - if: ${{fromJSON(needs.check.outputs.cuda_avail)}} strategy: matrix: os: [ubuntu-latest] - python-version: [3.9, "3.10", "3.11", "3.12"] - uses: qiboteam/workflows/.github/workflows/rules-poetry.yml@main + python-version: [ 3.9, "3.10", "3.11", "3.12"] + uses: qiboteam/workflows/.github/workflows/rules-poetry.yml@v1 with: os: ${{ matrix.os }} python-version: ${{ matrix.python-version }} diff --git a/poetry.lock b/poetry.lock index 452743d2..d4286a7b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. [[package]] name = "alabaster" @@ -1919,6 +1919,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1926,8 +1927,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1944,6 +1953,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1951,6 +1961,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -1958,13 +1969,13 @@ files = [ [[package]] name = "qibo" -version = "0.2.8" +version = "0.2.11" description = "A framework for quantum computing with hardware acceleration." optional = false python-versions = "<3.13,>=3.9" files = [ - {file = "qibo-0.2.8-py3-none-any.whl", hash = "sha256:27341a0e26340b74be8d3d086d151b0abd9f6913f790a83e1639beeea03431de"}, - {file = "qibo-0.2.8.tar.gz", hash = "sha256:bda628989d7d0b0d19b0d2535557eaffd48aa4c0e76ae158af8e7e9571405ca3"}, + {file = "qibo-0.2.11-py3-none-any.whl", hash = "sha256:67e900364e62642c0c8c3c69fbfaea3e81bef5da53b4547b67516a11dcbe099d"}, + {file = "qibo-0.2.11.tar.gz", hash = "sha256:312037020ddfc82bcb92d698e960e5c3749fbbd61d16944b91d0ba15d6cc7931"}, ] [package.dependencies] @@ -1975,13 +1986,14 @@ networkx = ">=3.2.1,<4.0.0" numpy = ">=1.26.4,<2.0.0" openqasm3 = {version = ">=0.5.0", extras = ["parser"]} scipy = ">=1.10.1,<2.0.0" -setuptools = ">=69.1.1,<70.0.0" +setuptools = ">=69.1.1,<71.0.0" sympy = ">=1.11.1,<2.0.0" tabulate = ">=0.9.0,<0.10.0" [package.extras] +qulacs = ["qulacs (>=0.6.4,<0.7.0)"] tensorflow = ["tensorflow (>=2.16.1,<3.0.0)"] -torch = ["torch (>=2.1.1,<3.0.0)"] +torch = ["torch (>=2.1.1,<2.4)"] [[package]] name = "quimb" diff --git a/pyproject.toml b/pyproject.toml index 39dbe8a8..ec68be08 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ cupy-cuda11x = { version = "^11.6.0", optional = true } cuquantum-python-cu11 = { version = "^23.3.0", optional = true } mpi4py = { version = "^3.1.5", optional = true } + [tool.poetry.extras] cuda = ["cupy-cuda11x", "cuquantum-python-cu11", "mpi4py"] diff --git a/src/qibotn/backends/cutensornet.py b/src/qibotn/backends/cutensornet.py index 1d385207..c2922b61 100644 --- a/src/qibotn/backends/cutensornet.py +++ b/src/qibotn/backends/cutensornet.py @@ -12,6 +12,7 @@ class CuTensorNet(NumpyBackend): # pragma: no cover def __init__(self, runcard): super().__init__() + import cuquantum from cuquantum import cutensornet as cutn # pylint: disable=import-error if runcard is not None: @@ -32,6 +33,7 @@ def __init__(self, runcard): ) else: raise TypeError("expectation_enabled has an unexpected type") + state = np.array(0) mps_enabled_value = runcard.get("MPS_enabled") if mps_enabled_value is True: @@ -192,6 +194,7 @@ def execute_circuit( state = np.array(0) else: raise_error(NotImplementedError, "Compute type not supported.") + state = np.array(0) if return_array: return state.flatten() diff --git a/tests/config.py b/tests/config.py deleted file mode 100644 index 74036736..00000000 --- a/tests/config.py +++ /dev/null @@ -1,12 +0,0 @@ -from dataclasses import dataclass -from typing import Optional - - -@dataclass -class Executor: - backend: str - platform: Optional[str] = None - - -qibo = Executor(backend="qibojit", platform="numpy") -quimb = Executor(backend="numpy") diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..a1cf2a43 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,17 @@ +"""To skip the pytests marked with gpu.""" + +import os + +import pytest + +tt = os.system("nvidia-smi") + + +def pytest_runtest_setup(item): + if tt != 0: + for marker in item.iter_markers(name="gpu"): + pytest.skip(f"test requires gpu") + + +"""Pytest fixtures. +""" diff --git a/tests/test_cuquantum_cutensor_backend.py b/tests/test_cuquantum_cutensor_backend.py index c8f1e199..6f3f728c 100644 --- a/tests/test_cuquantum_cutensor_backend.py +++ b/tests/test_cuquantum_cutensor_backend.py @@ -1,7 +1,5 @@ from timeit import default_timer as timer -import config -import cupy as cp import numpy as np import pytest import qibo @@ -35,7 +33,7 @@ def test_eval(nqubits: int, dtype="complex128"): import qibotn.eval # Test qibo - qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform) + qibo.set_backend("numpy") qibo_time, (qibo_circ, result_sv) = time(lambda: qibo_qft(nqubits, swaps=True)) # Test Cuquantum @@ -43,7 +41,6 @@ def test_eval(nqubits: int, dtype="complex128"): lambda: qibotn.eval.dense_vector_tn(qibo_circ, dtype).flatten() ) - assert 1e-2 * qibo_time < cutn_time < 1e2 * qibo_time assert np.allclose(result_sv, result_tn), "Resulting dense vectors do not match" @@ -57,10 +54,12 @@ def test_mps(nqubits: int, dtype="complex128"): dtype (str): The data type for precision, 'complex64' for single, 'complex128' for double. """ + import cupy as cp + import qibotn.eval # Test qibo - qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform) + qibo.set_backend("numpy") qibo_time, (circ_qibo, result_sv) = time(lambda: qibo_qft(nqubits, swaps=True)) diff --git a/tests/test_quimb_backend.py b/tests/test_quimb_backend.py index e32aefe5..45931c9c 100644 --- a/tests/test_quimb_backend.py +++ b/tests/test_quimb_backend.py @@ -1,7 +1,6 @@ import copy import os -import config import numpy as np import pytest import qibo @@ -42,7 +41,7 @@ def test_eval(nqubits: int, tolerance: float, is_mps: bool): init_state_tn = copy.deepcopy(init_state) # Test qibo - qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform) + qibo.set_backend("numpy") qibo_circ, result_sv = qibo_qft(nqubits, init_state, swaps=True) @@ -58,7 +57,7 @@ def test_eval(nqubits: int, tolerance: float, is_mps: bool): else: gate_opt = None result_tn = qibotn.eval_qu.dense_vector_tn_qu( - qasm_circ, init_state_tn, gate_opt, backend=config.quimb.backend + qasm_circ, init_state_tn, gate_opt, backend="numpy" ).flatten() assert np.allclose(