diff --git a/docs/changelog.rst b/docs/changelog.rst index 8268fb7..b8e9bf8 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,6 +1,11 @@ Changelog ~~~~~~~~~ +0.31.0 (unreleased) +------------------- + +* add pyquil.gates.XY to the native gateset + 0.30.0 (October 2023) --------------------- diff --git a/pytket/extensions/pyquil/backends/forest.py b/pytket/extensions/pyquil/backends/forest.py index 884f87c..76b5eb5 100644 --- a/pytket/extensions/pyquil/backends/forest.py +++ b/pytket/extensions/pyquil/backends/forest.py @@ -108,7 +108,14 @@ class ForestBackend(Backend): _supports_counts = True _supports_contextual_optimisation = True _persistent_handles = True - _GATE_SET = {OpType.CZ, OpType.Rx, OpType.Rz, OpType.Measure, OpType.Barrier} + _GATE_SET = { + OpType.CZ, + OpType.Rx, + OpType.Rz, + OpType.Measure, + OpType.Barrier, + OpType.ISWAP, + } def __init__(self, qc: QuantumComputer): """Backend for running circuits with the Rigetti QVM. diff --git a/tests/pyquil_convert_test.py b/tests/pyquil_convert_test.py index dd8ac6e..1870b6e 100644 --- a/tests/pyquil_convert_test.py +++ b/tests/pyquil_convert_test.py @@ -37,6 +37,7 @@ CPHASE, SWAP, MEASURE, + XY, ) from pyquil.quilbase import Measurement from sympy import pi, Symbol @@ -78,6 +79,7 @@ def get_test_program(measure: bool = False) -> Program: p += CCNOT(0, 1, 2) p += CPHASE(PI / 4, 2, 1) p += SWAP(0, 3) + p += XY(PI / 3, 2, 1) if measure: ro = p.declare("ro", "BIT", 4) p += MEASURE(0, ro[0]) diff --git a/tests/qvm_backend_test.py b/tests/qvm_backend_test.py index 6b80f4b..f487b4c 100644 --- a/tests/qvm_backend_test.py +++ b/tests/qvm_backend_test.py @@ -390,6 +390,60 @@ def test_shots_bits_edgecases(qvm: None, quilc: None) -> None: assert res.get_counts() == correct_counts +@pytest.mark.skipif( + skip_qvm_tests, reason="Can only run Rigetti QVM if docker is installed" +) +def test_gateset(qvm: None, quilc: None) -> None: + qc = get_qc("9q-square", as_qvm=True) + forest_backend = ForestBackend(qc) + a = [Qubit("node", i) for i in range(6)] + + c = Circuit(0, 6) + for q in a: + c.add_qubit(q) + c.ISWAP(1, a[5], a[4]) + c.ISWAP(2, a[5], a[4]) + c.ISWAP(3, a[5], a[4]) + + c.measure_all() + + h = forest_backend.process_circuit(c, 10) + res = forest_backend.get_result(h) + + correct_shots = np.zeros((10, 6), dtype=int) # type: ignore + correct_counts = Counter({(0,) * 6: 10}) + + assert np.array_equal(res.get_shots(), correct_shots) + assert res.get_shots().shape == (10, 6) + assert res.get_counts() == correct_counts + + +@pytest.mark.skipif( + skip_qvm_tests, reason="Can only run Rigetti QVM if docker is installed" +) +def test_gateset_ii(qvm: None, quilc: None) -> None: + qc = get_qc("9q-square", as_qvm=True) + forest_backend = ForestBackend(qc) + + a = [Qubit("node", i) for i in range(6)] + c = Circuit(0, 6) + for q in a: + c.add_qubit(q) + c.Rx(1.0, a[5]) + c.ISWAP(0.5, a[5], a[4]) + c.Rx(1.0, a[4]) + c.ISWAP(0.5, a[5], a[4]) + c.measure_all() + + h = forest_backend.process_circuit(c, 10) + res = forest_backend.get_result(h) + + assert res.get_shots().shape == (10, 6) + assert ( + res.get_counts()[(0, 0, 0, 0, 0, 0)] + res.get_counts()[(0, 0, 0, 0, 1, 1)] + ) == 10 + + @pytest.mark.skipif( skip_qvm_tests, reason="Can only run Rigetti QVM if docker is installed" )