From 51b31ffab755f6629eae341af97d635f73368790 Mon Sep 17 00:00:00 2001 From: Frank Harkins Date: Mon, 4 Mar 2024 15:53:07 +0000 Subject: [PATCH 1/5] Update for Qiskit 1.0 --- docs/examples/GettingStarted.ipynb | 8 ++++---- docs/examples/QAOA.ipynb | 1 - qiskit_rigetti/gates/_can.py | 2 +- qiskit_rigetti/gates/_cphase.py | 2 +- qiskit_rigetti/gates/_pswap.py | 2 +- qiskit_rigetti/gates/_xy.py | 2 +- qiskit_rigetti/hooks/pre_compilation.py | 3 +-- tests/test_qcs_backend.py | 19 +++++++++---------- 8 files changed, 18 insertions(+), 21 deletions(-) diff --git a/docs/examples/GettingStarted.ipynb b/docs/examples/GettingStarted.ipynb index fed1d8d..1d77358 100644 --- a/docs/examples/GettingStarted.ipynb +++ b/docs/examples/GettingStarted.ipynb @@ -21,7 +21,7 @@ " QuantumCircuit,\n", " QuantumRegister,\n", " ClassicalRegister,\n", - " execute\n", + " transpile\n", ")\n", "from qiskit_rigetti import RigettiQCSProvider" ] @@ -103,7 +103,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The circuit can now be run against the backend with Qiskit's `execute()` function:" + "The circuit can now be run against the backend:" ] }, { @@ -120,7 +120,7 @@ } ], "source": [ - "job = execute(circuit, backend, shots=1000)\n", + "job = backend.run(transpile(circuit, backend), shots=1000)\n", "result = job.result()\n", "counts = result.get_counts()\n", "print(\"Counts for experiment:\", counts)" @@ -144,7 +144,7 @@ } ], "source": [ - "from qiskit.tools.visualization import plot_histogram\n", + "from qiskit.visualization import plot_histogram\n", "\n", "plot_histogram(counts)" ] diff --git a/docs/examples/QAOA.ipynb b/docs/examples/QAOA.ipynb index e3d45f3..96327de 100644 --- a/docs/examples/QAOA.ipynb +++ b/docs/examples/QAOA.ipynb @@ -199,7 +199,6 @@ ], "source": [ "from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister\n", - "from qiskit import Aer, execute\n", "from qiskit.circuit import Parameter\n", "\n", "# Adjacency is essentially a matrix which tells you which nodes are\n", diff --git a/qiskit_rigetti/gates/_can.py b/qiskit_rigetti/gates/_can.py index 2c8298f..773433a 100644 --- a/qiskit_rigetti/gates/_can.py +++ b/qiskit_rigetti/gates/_can.py @@ -16,7 +16,7 @@ __all__ = ["CanonicalGate"] import numpy as np -from qiskit.extensions import UnitaryGate +from qiskit.circuit.library import UnitaryGate class CanonicalGate(UnitaryGate): diff --git a/qiskit_rigetti/gates/_cphase.py b/qiskit_rigetti/gates/_cphase.py index 0dfd454..053a3f3 100644 --- a/qiskit_rigetti/gates/_cphase.py +++ b/qiskit_rigetti/gates/_cphase.py @@ -20,7 +20,7 @@ ] from pyquil.simulation.matrices import CPHASE00, CPHASE01, CPHASE10 -from qiskit.extensions import UnitaryGate +from qiskit.circuit.library import UnitaryGate class CPhase00Gate(UnitaryGate): diff --git a/qiskit_rigetti/gates/_pswap.py b/qiskit_rigetti/gates/_pswap.py index cce6575..ffe0ec5 100644 --- a/qiskit_rigetti/gates/_pswap.py +++ b/qiskit_rigetti/gates/_pswap.py @@ -16,7 +16,7 @@ __all__ = ["PSwapGate"] from pyquil.simulation.matrices import PSWAP -from qiskit.extensions import UnitaryGate +from qiskit.circuit.library import UnitaryGate class PSwapGate(UnitaryGate): diff --git a/qiskit_rigetti/gates/_xy.py b/qiskit_rigetti/gates/_xy.py index 59cf3cb..3439741 100644 --- a/qiskit_rigetti/gates/_xy.py +++ b/qiskit_rigetti/gates/_xy.py @@ -16,7 +16,7 @@ __all__ = ["XYGate"] from pyquil.simulation.matrices import XY -from qiskit.extensions import UnitaryGate +from qiskit.circuit.library import UnitaryGate class XYGate(UnitaryGate): diff --git a/qiskit_rigetti/hooks/pre_compilation.py b/qiskit_rigetti/hooks/pre_compilation.py index 87d6052..9f1e44c 100644 --- a/qiskit_rigetti/hooks/pre_compilation.py +++ b/qiskit_rigetti/hooks/pre_compilation.py @@ -19,7 +19,6 @@ def set_rewiring(rewiring: str) -> PreCompilationHook: Examples: Applying rewiring to a program:: - >>> from qiskit import execute >>> from qiskit_rigetti import RigettiQCSProvider, QuilCircuit >>> from qiskit_rigetti.hooks.pre_compilation import set_rewiring @@ -27,7 +26,7 @@ def set_rewiring(rewiring: str) -> PreCompilationHook: >>> backend = p.get_simulator(num_qubits=2, noisy=True) >>> circuit = QuilCircuit(2, 2) >>> _ = circuit.measure([0, 1], [0, 1]) - >>> job = execute(circuit, backend, shots=10, before_compile=[set_rewiring("NAIVE")]) + >>> job = backend.run(circuit, shots=10, before_compile=[set_rewiring("NAIVE")]) """ def fn(qasm: str) -> str: diff --git a/tests/test_qcs_backend.py b/tests/test_qcs_backend.py index 5be757d..c586070 100644 --- a/tests/test_qcs_backend.py +++ b/tests/test_qcs_backend.py @@ -14,7 +14,7 @@ # limitations under the License. ############################################################################## import pytest -from qiskit import execute, QuantumCircuit, QuantumRegister, ClassicalRegister, transpile +from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile from qiskit.providers import JobStatus from qiskit.circuit import Parameter, Qubit from qiskit.circuit.library import CZGate @@ -26,7 +26,7 @@ def test_run(backend: RigettiQCSBackend): circuit = make_circuit() - job = execute(circuit, backend, shots=10) + job = backend.run(circuit, shots=10) assert job.backend() is backend result = job.result() @@ -41,7 +41,7 @@ def test_run__multiple_circuits(backend: RigettiQCSBackend): circuit1 = make_circuit(num_qubits=2) circuit2 = make_circuit(num_qubits=3) - job = execute([circuit1, circuit2], backend, shots=10) + job = backend.run([circuit1, circuit2], shots=10) assert job.backend() is backend result = job.result() @@ -70,9 +70,8 @@ def test_run__parametric_circuits(backend: RigettiQCSBackend): circuit2.ry(t, 0) circuit2.measure([0], [0]) - job = execute( + job = backend.run( [circuit1, circuit2], - backend, shots=1000, parameter_binds=[ {t: 1.0}, @@ -105,7 +104,7 @@ def test_run__readout_register_not_named_ro(backend: RigettiQCSBackend): circuit.measure([0, 1], [0, 1]) qasm_before = circuit.qasm() - job = execute(circuit, backend, shots=10) + job = backend.run(circuit, shots=10) assert circuit.qasm() == qasm_before, "should not modify original circuit" @@ -124,7 +123,7 @@ def test_run__multiple_registers__single_readout(backend: RigettiQCSBackend): circuit.measure([0, 1], [readout_reg[0], readout_reg[1]]) qasm_before = circuit.qasm() - job = execute(circuit, backend, shots=10) + job = backend.run(circuit, shots=10) assert circuit.qasm() == qasm_before, "should not modify original circuit" @@ -145,7 +144,7 @@ def test_run__multiple_readout_registers(backend: RigettiQCSBackend): circuit.measure([qr[0], qr[1]], [cr[0], cr2[0]]) with pytest.raises(RuntimeError, match="Multiple readout registers are unsupported on QCSBackend; found c, c2"): - execute(circuit, backend, shots=10) + backend.run(circuit, shots=10) def test_run__no_measurments(backend: RigettiQCSBackend): @@ -154,7 +153,7 @@ def test_run__no_measurments(backend: RigettiQCSBackend): circuit = QuantumCircuit(qr, cr) with pytest.raises(RuntimeError, match="Circuit has no measurements"): - execute(circuit, backend, shots=10) + backend.run(circuit, shots=10) def test_run__backend_coupling_map(): @@ -171,7 +170,7 @@ def test_decomposition(backend: RigettiQCSBackend): circuit.measure_all() circuit = transpile(circuit, backend=backend) - job = execute(circuit, backend, shots=1) + job = backend.run(circuit, shots=1) job.result() # Just make sure nothing throws an exception so the circuit is valid assert job.status() == JobStatus.DONE From 23ec0c864df66928de753de0e9f8c1d39cd3cd22 Mon Sep 17 00:00:00 2001 From: Frank Harkins Date: Mon, 4 Mar 2024 15:58:32 +0000 Subject: [PATCH 2/5] Always transpile --- qiskit_rigetti/hooks/pre_compilation.py | 2 ++ tests/test_qcs_backend.py | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/qiskit_rigetti/hooks/pre_compilation.py b/qiskit_rigetti/hooks/pre_compilation.py index 9f1e44c..c8e19cb 100644 --- a/qiskit_rigetti/hooks/pre_compilation.py +++ b/qiskit_rigetti/hooks/pre_compilation.py @@ -19,6 +19,7 @@ def set_rewiring(rewiring: str) -> PreCompilationHook: Examples: Applying rewiring to a program:: + >>> from qiskit import transpile >>> from qiskit_rigetti import RigettiQCSProvider, QuilCircuit >>> from qiskit_rigetti.hooks.pre_compilation import set_rewiring @@ -26,6 +27,7 @@ def set_rewiring(rewiring: str) -> PreCompilationHook: >>> backend = p.get_simulator(num_qubits=2, noisy=True) >>> circuit = QuilCircuit(2, 2) >>> _ = circuit.measure([0, 1], [0, 1]) + >>> circuit = transpile(circuit, backend) >>> job = backend.run(circuit, shots=10, before_compile=[set_rewiring("NAIVE")]) """ diff --git a/tests/test_qcs_backend.py b/tests/test_qcs_backend.py index c586070..ee7267b 100644 --- a/tests/test_qcs_backend.py +++ b/tests/test_qcs_backend.py @@ -26,6 +26,7 @@ def test_run(backend: RigettiQCSBackend): circuit = make_circuit() + circuit = transpile(circuit, backend) job = backend.run(circuit, shots=10) assert job.backend() is backend @@ -41,7 +42,8 @@ def test_run__multiple_circuits(backend: RigettiQCSBackend): circuit1 = make_circuit(num_qubits=2) circuit2 = make_circuit(num_qubits=3) - job = backend.run([circuit1, circuit2], shots=10) + circuits_list = transpile([circuit1, circuit2], backend) + job = backend.run(circuits_list, shots=10) assert job.backend() is backend result = job.result() @@ -71,7 +73,7 @@ def test_run__parametric_circuits(backend: RigettiQCSBackend): circuit2.measure([0], [0]) job = backend.run( - [circuit1, circuit2], + transpile([circuit1, circuit2], backend), shots=1000, parameter_binds=[ {t: 1.0}, @@ -104,6 +106,7 @@ def test_run__readout_register_not_named_ro(backend: RigettiQCSBackend): circuit.measure([0, 1], [0, 1]) qasm_before = circuit.qasm() + circuit = transpile(circuit, backend) job = backend.run(circuit, shots=10) assert circuit.qasm() == qasm_before, "should not modify original circuit" @@ -123,6 +126,7 @@ def test_run__multiple_registers__single_readout(backend: RigettiQCSBackend): circuit.measure([0, 1], [readout_reg[0], readout_reg[1]]) qasm_before = circuit.qasm() + circuit = transpile(circuit, backend) job = backend.run(circuit, shots=10) assert circuit.qasm() == qasm_before, "should not modify original circuit" @@ -143,6 +147,7 @@ def test_run__multiple_readout_registers(backend: RigettiQCSBackend): circuit = QuantumCircuit(qr, cr, cr2) circuit.measure([qr[0], qr[1]], [cr[0], cr2[0]]) + circuit = transpile(circuit, backend) with pytest.raises(RuntimeError, match="Multiple readout registers are unsupported on QCSBackend; found c, c2"): backend.run(circuit, shots=10) @@ -152,6 +157,7 @@ def test_run__no_measurments(backend: RigettiQCSBackend): cr = ClassicalRegister(1, "c") circuit = QuantumCircuit(qr, cr) + circuit = transpile(circuit, backend) with pytest.raises(RuntimeError, match="Circuit has no measurements"): backend.run(circuit, shots=10) From 4accc82232469df91c72a437ebfb3bceba6b5185 Mon Sep 17 00:00:00 2001 From: Frank Harkins Date: Fri, 8 Mar 2024 11:15:20 +0000 Subject: [PATCH 3/5] Add backwards compatibility --- qiskit_rigetti/gates/_can.py | 7 ++++++- qiskit_rigetti/gates/_cphase.py | 7 ++++++- qiskit_rigetti/gates/_pswap.py | 6 +++++- qiskit_rigetti/gates/_xy.py | 7 ++++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/qiskit_rigetti/gates/_can.py b/qiskit_rigetti/gates/_can.py index 773433a..c0d6105 100644 --- a/qiskit_rigetti/gates/_can.py +++ b/qiskit_rigetti/gates/_can.py @@ -16,7 +16,12 @@ __all__ = ["CanonicalGate"] import numpy as np -from qiskit.circuit.library import UnitaryGate + +try: + # qiskit>=1.0 + from qiskit.circuit.library import UnitaryGate +except ImportError: + from qiskit.extensions import UnitaryGate class CanonicalGate(UnitaryGate): diff --git a/qiskit_rigetti/gates/_cphase.py b/qiskit_rigetti/gates/_cphase.py index 053a3f3..2dfb910 100644 --- a/qiskit_rigetti/gates/_cphase.py +++ b/qiskit_rigetti/gates/_cphase.py @@ -20,7 +20,12 @@ ] from pyquil.simulation.matrices import CPHASE00, CPHASE01, CPHASE10 -from qiskit.circuit.library import UnitaryGate + +try: + # qiskit>=1.0 + from qiskit.circuit.library import UnitaryGate +except ImportError: + from qiskit.extensions import UnitaryGate class CPhase00Gate(UnitaryGate): diff --git a/qiskit_rigetti/gates/_pswap.py b/qiskit_rigetti/gates/_pswap.py index ffe0ec5..f7d4f58 100644 --- a/qiskit_rigetti/gates/_pswap.py +++ b/qiskit_rigetti/gates/_pswap.py @@ -16,8 +16,12 @@ __all__ = ["PSwapGate"] from pyquil.simulation.matrices import PSWAP -from qiskit.circuit.library import UnitaryGate +try: + # qiskit>=1.0 + from qiskit.circuit.library import UnitaryGate +except ImportError: + from qiskit.extensions import UnitaryGate class PSwapGate(UnitaryGate): """ diff --git a/qiskit_rigetti/gates/_xy.py b/qiskit_rigetti/gates/_xy.py index 3439741..66c462c 100644 --- a/qiskit_rigetti/gates/_xy.py +++ b/qiskit_rigetti/gates/_xy.py @@ -16,7 +16,12 @@ __all__ = ["XYGate"] from pyquil.simulation.matrices import XY -from qiskit.circuit.library import UnitaryGate + +try: + # qiskit>=1.0 + from qiskit.circuit.library import UnitaryGate +except ImportError: + from qiskit.extensions import UnitaryGate class XYGate(UnitaryGate): From 9ca8842f6db00c5d7d2e8fd0ad2e01d96bc13746 Mon Sep 17 00:00:00 2001 From: Frank Harkins Date: Fri, 8 Mar 2024 11:15:49 +0000 Subject: [PATCH 4/5] black --- qiskit_rigetti/gates/_pswap.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qiskit_rigetti/gates/_pswap.py b/qiskit_rigetti/gates/_pswap.py index f7d4f58..6d66592 100644 --- a/qiskit_rigetti/gates/_pswap.py +++ b/qiskit_rigetti/gates/_pswap.py @@ -23,6 +23,7 @@ except ImportError: from qiskit.extensions import UnitaryGate + class PSwapGate(UnitaryGate): """ Class for representing a parametric Swap gate From a121974d243655d769667f1dc671a33a109e8dd8 Mon Sep 17 00:00:00 2001 From: Frank Harkins Date: Mon, 17 Jun 2024 13:48:53 +0100 Subject: [PATCH 5/5] Empty commit to re-run CI tests The logs have expired