From 27294c78931ee07714abb4333c9d7e8b2ad85fc4 Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Mon, 7 Feb 2022 13:35:36 +0100 Subject: [PATCH 1/8] Fix distcircuit error message --- src/qibo/core/distcircuit.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/qibo/core/distcircuit.py b/src/qibo/core/distcircuit.py index 86662a85ed..eb611f28eb 100644 --- a/src/qibo/core/distcircuit.py +++ b/src/qibo/core/distcircuit.py @@ -47,8 +47,12 @@ class DistributedCircuit(circuit.Circuit): def __init__(self, nqubits: int, accelerators: Dict[str, int]): if not K.supports_multigpu: # pragma: no cover - raise_error(NotImplementedError, "Distributed circuit is not supported " - f"by the {K.name} backend.") + if K.platform is None: + raise_error(NotImplementedError, "Distributed circuit is not supported " + f"by the {K.name} backend.") + else: + raise_error(NotImplementedError, "Distributed circuit is not supported " + f"by the {K.name} ({K.get_platform()}) backend.") super().__init__(nqubits) self.init_kwargs["accelerators"] = accelerators self.ndevices = sum(accelerators.values()) From 736fd26d4a969154a6bf78dcb7221867a198859d Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Tue, 8 Feb 2022 09:30:44 +0100 Subject: [PATCH 2/8] Fix pylint --- src/qibo/models/qgan.py | 6 +++--- src/qibo/tests/test_models_qgan.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibo/models/qgan.py b/src/qibo/models/qgan.py index fb6bf13427..70df7703ea 100644 --- a/src/qibo/models/qgan.py +++ b/src/qibo/models/qgan.py @@ -69,9 +69,9 @@ def __init__(self, latent_dim, layers=None, circuit=None, set_parameters=None, d def define_discriminator(self, alpha=0.2, dropout=0.2): """Define the standalone discriminator model.""" - from tensorflow.keras.models import Sequential # pylint: disable=E0611 - from tensorflow.keras.optimizers import Adadelta # pylint: disable=E0611 - from tensorflow.keras.layers import Dense, Conv2D, Dropout, Reshape, LeakyReLU, Flatten # pylint: disable=E0611 + from tensorflow.keras.models import Sequential # pylint: disable=E0611,E0401 + from tensorflow.keras.optimizers import Adadelta # pylint: disable=E0611,E0401 + from tensorflow.keras.layers import Dense, Conv2D, Dropout, Reshape, LeakyReLU, Flatten # pylint: disable=E0611,E0401 model = Sequential() model.add(Dense(200, use_bias=False, input_dim=self.nqubits)) diff --git a/src/qibo/tests/test_models_qgan.py b/src/qibo/tests/test_models_qgan.py index 3b79322aa4..56d348fa2d 100644 --- a/src/qibo/tests/test_models_qgan.py +++ b/src/qibo/tests/test_models_qgan.py @@ -124,8 +124,8 @@ def test_qgan_custom_discriminator(): if not K.check_availability("tensorflow"): # pragma: no cover pytest.skip("Skipping StyleQGAN test because tensorflow backend is not available.") - from tensorflow.keras.models import Sequential # pylint: disable=E0611 - from tensorflow.keras.layers import Dense # pylint: disable=E0611 + from tensorflow.keras.models import Sequential # pylint: disable=E0611,E0401 + from tensorflow.keras.layers import Dense # pylint: disable=E0611,E0401 original_backend = qibo.get_backend() qibo.set_backend("tensorflow") reference_distribution = generate_distribution(10) From bb5b2b3002b0d0f8da3fd8e83258211a03c43958 Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Tue, 8 Feb 2022 10:32:51 +0100 Subject: [PATCH 3/8] Removing doctest check for distributed circuit --- doc/source/code-examples/advancedexamples.rst | 8 ++++---- src/qibo/core/distcircuit.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/source/code-examples/advancedexamples.rst b/doc/source/code-examples/advancedexamples.rst index bcd70b6f26..253c5b5db7 100644 --- a/doc/source/code-examples/advancedexamples.rst +++ b/doc/source/code-examples/advancedexamples.rst @@ -108,7 +108,7 @@ Using multiple GPUs Qibo supports distributed circuit execution on multiple GPUs. This feature can be used as follows: -.. testcode:: +.. code-block:: python from qibo.models import Circuit from qibo import gates @@ -118,7 +118,7 @@ be used as follows: # this will use the first GPU three times and the second one time # leading to four total logical devices # construct the distributed circuit for 32 qubits - # c = Circuit(32, accelerators) + c = Circuit(32, accelerators) Gates can then be added normally using ``c.add`` and the circuit can be executed using ``c()``. Note that a ``memory_device`` is passed in the distributed circuit @@ -757,7 +757,7 @@ When Trotter decomposition is used, it is possible to execute the QAOA circuit on multiple devices, by passing an ``accelerators`` dictionary when defining the model. For example the previous example would have to be modified as: -.. testcode:: +.. code-block:: python from qibo import models, hamiltonians @@ -801,7 +801,7 @@ function. final_state = c().state() fidelity = tf.math.abs(tf.reduce_sum(tf.math.conj(target_state) * final_state)) loss = 1 - fidelity - grads = tape.gradient(loss, params) + grads = tape.gradient(loss, params) optimizer.apply_gradients(zip([grads], [params])) diff --git a/src/qibo/core/distcircuit.py b/src/qibo/core/distcircuit.py index eb611f28eb..73a95581a4 100644 --- a/src/qibo/core/distcircuit.py +++ b/src/qibo/core/distcircuit.py @@ -28,7 +28,7 @@ class DistributedCircuit(circuit.Circuit): compilation and callbacks. Example: - .. testcode:: + .. code-block:: python from qibo.models import Circuit # The system has two GPUs and we would like to use each GPU twice From 69b6ab40301969acce903a8504f16117467093ed Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Wed, 9 Feb 2022 09:13:27 +0100 Subject: [PATCH 4/8] Fix coverage --- src/qibo/backends/numpy.py | 6 +++--- src/qibo/models/circuit.py | 2 +- src/qibo/tests/test_models_circuit.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibo/backends/numpy.py b/src/qibo/backends/numpy.py index 2cc7179110..f8e5e2cfd3 100644 --- a/src/qibo/backends/numpy.py +++ b/src/qibo/backends/numpy.py @@ -411,16 +411,16 @@ def density_matrix_collapse(self, gate, state, result): def on_cpu(self): # pragma: no cover return self.device() - def cpu_tensor(self, x, dtype=None): + def cpu_tensor(self, x, dtype=None): # pragma: no cover if dtype is None: dtype = x.dtype return self.np.asarray(x, dtype=dtype) - def cpu_cast(self, x, dtype='DTYPECPX'): + def cpu_cast(self, x, dtype='DTYPECPX'): # pragma: no cover dtype = self._dtypes.get(dtype) return self.np.array(x, dtype=dtype) - def cpu_assign(self, state, i, piece): + def cpu_assign(self, state, i, piece): # pragma: no cover state.pieces[i] = self.to_numpy(piece) def transpose_state(self, pieces, state, nqubits, order): diff --git a/src/qibo/models/circuit.py b/src/qibo/models/circuit.py index 00a54e504a..0cff5ba610 100644 --- a/src/qibo/models/circuit.py +++ b/src/qibo/models/circuit.py @@ -72,7 +72,7 @@ def QFT(nqubits: int, with_swaps: bool = True, return circuit -def _DistributedQFT(nqubits, accelerators=None): +def _DistributedQFT(nqubits, accelerators=None): # pragma: no cover """QFT with the order of gates optimized for reduced multi-device communication.""" from qibo import gates circuit = Circuit(nqubits, accelerators) diff --git a/src/qibo/tests/test_models_circuit.py b/src/qibo/tests/test_models_circuit.py index a2489036ec..7ac87f3d18 100644 --- a/src/qibo/tests/test_models_circuit.py +++ b/src/qibo/tests/test_models_circuit.py @@ -16,7 +16,7 @@ def test_circuit_constructor(): if not K.supports_multigpu: # pragma: no cover with pytest.raises(NotImplementedError): c = models.Circuit(5, accelerators={"/GPU:0": 2}) - else: + else: # pragma: no cover c = models.Circuit(5, accelerators={"/GPU:0": 2}) assert isinstance(c, DistributedCircuit) with pytest.raises(NotImplementedError): From d8326a5265a9cf81d950a1f003e7774a91aec897 Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Wed, 9 Feb 2022 09:16:02 +0100 Subject: [PATCH 5/8] Add removed test in documentation --- doc/source/code-examples/advancedexamples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/code-examples/advancedexamples.rst b/doc/source/code-examples/advancedexamples.rst index 253c5b5db7..c14ef134f9 100644 --- a/doc/source/code-examples/advancedexamples.rst +++ b/doc/source/code-examples/advancedexamples.rst @@ -813,7 +813,7 @@ possible to use :meth:`qibo.abstractions.circuit.AbstractCircuit.set_parameters` circuit needs to be defined inside the compiled ``tf.GradientTape()``. For example: -.. code-block:: python +.. testcode:: import qibo qibo.set_backend("tensorflow") From c4bbada52fe16f53af7dfed7c7906e04deec1e9f Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Wed, 9 Feb 2022 09:36:40 +0100 Subject: [PATCH 6/8] Fix from previous commmit --- doc/source/code-examples/advancedexamples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/code-examples/advancedexamples.rst b/doc/source/code-examples/advancedexamples.rst index c14ef134f9..c65a17714a 100644 --- a/doc/source/code-examples/advancedexamples.rst +++ b/doc/source/code-examples/advancedexamples.rst @@ -813,7 +813,7 @@ possible to use :meth:`qibo.abstractions.circuit.AbstractCircuit.set_parameters` circuit needs to be defined inside the compiled ``tf.GradientTape()``. For example: -.. testcode:: +.. code-block:: python import qibo qibo.set_backend("tensorflow") @@ -834,7 +834,7 @@ For example: final_state = c().state() fidelity = tf.math.abs(tf.reduce_sum(tf.math.conj(target_state) * final_state)) loss = 1 - fidelity - grads = tape.gradient(loss, params) + grads = tape.gradient(loss, params) optimizer.apply_gradients(zip([grads], [params])) for _ in range(nepochs): From 48ba96f63e4fdace7e32812226dd8b613bdfbf9b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 9 Feb 2022 17:21:28 +0400 Subject: [PATCH 7/8] Check coverage --- src/qibo/models/circuit.py | 2 +- src/qibo/tests/test_models_circuit.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibo/models/circuit.py b/src/qibo/models/circuit.py index 0cff5ba610..00a54e504a 100644 --- a/src/qibo/models/circuit.py +++ b/src/qibo/models/circuit.py @@ -72,7 +72,7 @@ def QFT(nqubits: int, with_swaps: bool = True, return circuit -def _DistributedQFT(nqubits, accelerators=None): # pragma: no cover +def _DistributedQFT(nqubits, accelerators=None): """QFT with the order of gates optimized for reduced multi-device communication.""" from qibo import gates circuit = Circuit(nqubits, accelerators) diff --git a/src/qibo/tests/test_models_circuit.py b/src/qibo/tests/test_models_circuit.py index 7ac87f3d18..a2489036ec 100644 --- a/src/qibo/tests/test_models_circuit.py +++ b/src/qibo/tests/test_models_circuit.py @@ -16,7 +16,7 @@ def test_circuit_constructor(): if not K.supports_multigpu: # pragma: no cover with pytest.raises(NotImplementedError): c = models.Circuit(5, accelerators={"/GPU:0": 2}) - else: # pragma: no cover + else: c = models.Circuit(5, accelerators={"/GPU:0": 2}) assert isinstance(c, DistributedCircuit) with pytest.raises(NotImplementedError): From cfa9404d705df2c894ef353888c249ad2da2dee7 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 9 Feb 2022 21:45:50 +0400 Subject: [PATCH 8/8] Fix coverage --- src/qibo/tests/test_models_circuit.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/qibo/tests/test_models_circuit.py b/src/qibo/tests/test_models_circuit.py index a2489036ec..ca22e2418d 100644 --- a/src/qibo/tests/test_models_circuit.py +++ b/src/qibo/tests/test_models_circuit.py @@ -6,14 +6,14 @@ from qibo.tests.utils import random_state -def test_circuit_constructor(): +def test_circuit_constructor(backend): from qibo.core.circuit import Circuit, DensityMatrixCircuit from qibo.core.distcircuit import DistributedCircuit c = models.Circuit(5) assert isinstance(c, Circuit) c = models.Circuit(5, density_matrix=True) assert isinstance(c, DensityMatrixCircuit) - if not K.supports_multigpu: # pragma: no cover + if not K.supports_multigpu: with pytest.raises(NotImplementedError): c = models.Circuit(5, accelerators={"/GPU:0": 2}) else: @@ -66,10 +66,11 @@ def test_qft_execution(backend, accelerators, nqubits, random): K.assert_allclose(final_state, target_state) -def test_qft_errors(): +def test_qft_errors(backend): """Check that ``_DistributedQFT`` raises error if not sufficient qubits.""" from qibo.models.circuit import _DistributedQFT - with pytest.raises(NotImplementedError): - c = _DistributedQFT(2, accelerators={"/GPU:0": 4}) with pytest.raises(NotImplementedError): c = models.QFT(10, with_swaps=False, accelerators={"/GPU:0": 2}) + if K.supports_multigpu: + with pytest.raises(NotImplementedError): + c = _DistributedQFT(2, accelerators={"/GPU:0": 4})