Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions cirq-core/cirq/protocols/hash_from_pickle_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@
"cirq/protocols/json_test_data/sympy.Indexed.json",
"cirq/protocols/json_test_data/sympy.IndexedBase.json",
"cirq/protocols/json_test_data/sympy.pi.json",
# Cirq-Rigetti is deprecated per #7058
# Instead of handling deprecation-in-test errors we exclude
# all cirq_rigetti classes here.
"cirq_rigetti/json_test_data/AspenQubit.json",
"cirq_rigetti/json_test_data/OctagonalQubit.json",
# RigettiQCSAspenDevice does not pickle
"cirq_rigetti/json_test_data/RigettiQCSAspenDevice.json",
)
Expand Down
8 changes: 8 additions & 0 deletions cirq-rigetti/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
<div align="center">

| ⚠️ WARNING |
|:----------:|
| Cirq-Rigetti is deprecated. For more details or to provide feedback see https://github.com/quantumlib/Cirq/issues/7058 |

</div>

<div align="center">
<img width="190px" alt="Cirq logo"
src="https://raw.githubusercontent.com/quantumlib/Cirq/refs/heads/main/docs/images/Cirq_logo_color.svg"
Expand Down
8 changes: 8 additions & 0 deletions cirq-rigetti/cirq_rigetti/aspen_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,20 @@
from pyquil.quantum_processor import QCSQuantumProcessor
from qcs_sdk.client import QCSClient
from qcs_sdk.qpu.isa import get_instruction_set_architecture, InstructionSetArchitecture, Family
from cirq_rigetti.deprecation import deprecated_cirq_rigetti_class, deprecated_cirq_rigetti_function


@deprecated_cirq_rigetti_class()
class UnsupportedQubit(ValueError):
pass


@deprecated_cirq_rigetti_class()
class UnsupportedRigettiQCSOperation(ValueError):
pass


@deprecated_cirq_rigetti_class()
class UnsupportedRigettiQCSQuantumProcessor(ValueError):
pass

Expand All @@ -45,6 +49,7 @@ class UnsupportedRigettiQCSQuantumProcessor(ValueError):
_reverse_line_qubit_mapping = [1, 0, 7, 6]


@deprecated_cirq_rigetti_class()
@cirq.value.value_equality
class RigettiQCSAspenDevice(cirq.devices.Device):
"""A cirq.Qid supporting Rigetti QCS Aspen device topology."""
Expand Down Expand Up @@ -232,6 +237,7 @@ def _from_json_dict_(cls, isa, **kwargs):
return cls(isa=InstructionSetArchitecture.from_raw(json.dumps(isa)))


@deprecated_cirq_rigetti_function()
def get_rigetti_qcs_aspen_device(
quantum_processor_id: str, client: Optional[QCSClient] = None
) -> RigettiQCSAspenDevice:
Expand All @@ -254,6 +260,7 @@ def get_rigetti_qcs_aspen_device(
return RigettiQCSAspenDevice(isa=isa)


@deprecated_cirq_rigetti_class()
class OctagonalQubit(cirq.ops.Qid):
"""A cirq.Qid supporting Octagonal indexing."""

Expand Down Expand Up @@ -369,6 +376,7 @@ def _json_dict_(self):
return {'octagon_position': self.octagon_position}


@deprecated_cirq_rigetti_class()
class AspenQubit(OctagonalQubit):
def __init__(self, octagon: int, octagon_position: int):
super(AspenQubit, self).__init__(octagon_position)
Expand Down
40 changes: 40 additions & 0 deletions cirq-rigetti/cirq_rigetti/aspen_device_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# pylint: disable=wrong-or-nonexistent-copyright-notice
import os
import warnings
from unittest.mock import patch, PropertyMock
from math import sqrt
import pathlib
Expand All @@ -12,32 +13,52 @@
UnsupportedQubit,
UnsupportedRigettiQCSOperation,
)
from cirq_rigetti.deprecation import allow_deprecated_cirq_rigetti_use_in_tests
from qcs_sdk.qpu.isa import InstructionSetArchitecture, Family
import numpy as np
from cirq._compat import ALLOW_DEPRECATION_IN_TEST
from cirq_rigetti.deprecation import allow_deprecated_cirq_rigetti_use_in_tests

dir_path = pathlib.Path(os.path.dirname(os.path.realpath(__file__)))
fixture_path = dir_path / '__fixtures__'

# test parameterization uses deprecated classes, therefore we need to have
# ALLOW_DEPRECATION_IN_TEST set during import time. The initial environment
# is restored at the end of the module.

_SAVE_ENVIRON = {k: os.environ[k] for k in [ALLOW_DEPRECATION_IN_TEST] if k in os.environ}
os.environ[ALLOW_DEPRECATION_IN_TEST] = "True"

warnings.filterwarnings(
"ignore",
message="(.|\n)*Cirq-Rigetti is deprecated.",
category=DeprecationWarning,
module=__name__,
)


@pytest.fixture
def qcs_aspen8_isa() -> InstructionSetArchitecture:
with open(fixture_path / 'QCS-Aspen-8-ISA.json', 'r') as f:
return InstructionSetArchitecture.from_raw(f.read())


@allow_deprecated_cirq_rigetti_use_in_tests
def test_octagonal_qubit_index():
"""test that OctagonalQubit properly calculates index and uses it for comparison"""
qubit0 = OctagonalQubit(0)
assert qubit0.index == 0
assert OctagonalQubit(1) > qubit0


@allow_deprecated_cirq_rigetti_use_in_tests
def test_octagonal_qubit_repr():
"""test OctagonalQubit.__repr__"""
qubit5 = OctagonalQubit(5)
assert "cirq_rigetti.OctagonalQubit(octagon_position=5)" == repr(qubit5)


@allow_deprecated_cirq_rigetti_use_in_tests
def test_octagonal_qubit_positions():
"""test OctagonalQubit 2D position and distance calculations"""
qubit0 = OctagonalQubit(0)
Expand Down Expand Up @@ -77,25 +98,29 @@ def test_octagonal_qubit_positions():
_ = qubit0.distance(AspenQubit(0, 0))


@allow_deprecated_cirq_rigetti_use_in_tests
def test_octagonal_position_validation():
"""test OctagonalQubit validates octagon position when initialized"""
with pytest.raises(ValueError):
_ = OctagonalQubit(8)


@allow_deprecated_cirq_rigetti_use_in_tests
def test_aspen_qubit_index():
"""test that AspenQubit properly calculates index and uses it for comparison"""
qubit10 = AspenQubit(1, 0)
assert qubit10.index == 10
assert qubit10 > AspenQubit(0, 5)


@allow_deprecated_cirq_rigetti_use_in_tests
def test_aspen_qubit_repr():
"""test AspenQubit.__repr__"""
qubit10 = AspenQubit(1, 0)
assert "cirq_rigetti.AspenQubit(octagon=1, octagon_position=0)" == repr(qubit10)


@allow_deprecated_cirq_rigetti_use_in_tests
def test_aspen_qubit_positions_and_distance():
"""test AspenQubit 2D position and distance calculations"""
qubit10 = AspenQubit(1, 0)
Expand Down Expand Up @@ -131,6 +156,7 @@ def test_aspen_qubit_positions_and_distance():
_ = AspenQubit(1, 9)


@allow_deprecated_cirq_rigetti_use_in_tests
def test_aspen_qubit_qid_conversions():
"""test AspenQubit conversion to and from other `cirq.Qid` implementations"""
qubit10 = AspenQubit(1, 0)
Expand All @@ -152,6 +178,7 @@ def test_aspen_qubit_qid_conversions():
_ = AspenQubit.from_grid_qubit(cirq.GridQubit(3, 4))


@allow_deprecated_cirq_rigetti_use_in_tests
def test_rigetti_qcs_aspen_device_topology(qcs_aspen8_isa: InstructionSetArchitecture):
"""test RigettiQCSAspenDevice topological nodes and edges"""
device = RigettiQCSAspenDevice(isa=qcs_aspen8_isa)
Expand All @@ -171,6 +198,7 @@ def test_rigetti_qcs_aspen_device_topology(qcs_aspen8_isa: InstructionSetArchite
OctagonalQubit(6),
],
)
@allow_deprecated_cirq_rigetti_use_in_tests
def test_rigetti_qcs_aspen_device_valid_qubit(
qubit: cirq.Qid, qcs_aspen8_isa: InstructionSetArchitecture
):
Expand All @@ -191,6 +219,7 @@ def test_rigetti_qcs_aspen_device_valid_qubit(
AspenQubit(4, 0),
],
)
@allow_deprecated_cirq_rigetti_use_in_tests
def test_rigetti_qcs_aspen_device_invalid_qubit(
qubit: cirq.Qid, qcs_aspen8_isa: InstructionSetArchitecture
):
Expand All @@ -212,6 +241,7 @@ def test_rigetti_qcs_aspen_device_invalid_qubit(
cirq.CNOT(AspenQubit(0, 1), AspenQubit(1, 1)),
],
)
@allow_deprecated_cirq_rigetti_use_in_tests
def test_rigetti_qcs_aspen_device_invalid_operation(
operation: cirq.Operation, qcs_aspen8_isa: InstructionSetArchitecture
):
Expand All @@ -224,6 +254,7 @@ def test_rigetti_qcs_aspen_device_invalid_operation(


@pytest.mark.parametrize('operation', [cirq.CNOT(AspenQubit(0, 1), AspenQubit(0, 2))])
@allow_deprecated_cirq_rigetti_use_in_tests
def test_rigetti_qcs_aspen_device_valid_operation(
operation: cirq.Operation, qcs_aspen8_isa: InstructionSetArchitecture
):
Expand All @@ -234,6 +265,7 @@ def test_rigetti_qcs_aspen_device_valid_operation(
device.validate_operation(operation)


@allow_deprecated_cirq_rigetti_use_in_tests
def test_rigetti_qcs_aspen_device_qubits(qcs_aspen8_isa: InstructionSetArchitecture):
"""test RigettiQCSAspenDevice returns accurate set of qubits"""
device = RigettiQCSAspenDevice(isa=qcs_aspen8_isa)
Expand All @@ -244,12 +276,14 @@ def test_rigetti_qcs_aspen_device_qubits(qcs_aspen8_isa: InstructionSetArchitect
assert expected_qubits == set(device.qubits())


@allow_deprecated_cirq_rigetti_use_in_tests
def test_rigetti_qcs_aspen_device_repr(qcs_aspen8_isa: InstructionSetArchitecture):
"""test RigettiQCSAspenDevice.__repr__"""
device = RigettiQCSAspenDevice(isa=qcs_aspen8_isa)
assert f'cirq_rigetti.RigettiQCSAspenDevice(isa={qcs_aspen8_isa!r})' == repr(device)


@allow_deprecated_cirq_rigetti_use_in_tests
def test_rigetti_qcs_aspen_device_family_validation(qcs_aspen8_isa: InstructionSetArchitecture):
"""test RigettiQCSAspenDevice validates architecture family on initialization"""
non_aspen_isa = InstructionSetArchitecture.from_raw(qcs_aspen8_isa.json())
Expand All @@ -260,10 +294,16 @@ def test_rigetti_qcs_aspen_device_family_validation(qcs_aspen8_isa: InstructionS
), 'ISA family is read-only and should still be Aspen'


@allow_deprecated_cirq_rigetti_use_in_tests
def test_get_rigetti_qcs_aspen_device(qcs_aspen8_isa: InstructionSetArchitecture):
with patch('cirq_rigetti.aspen_device.get_instruction_set_architecture') as mock:
mock.return_value = qcs_aspen8_isa

from cirq_rigetti.aspen_device import get_rigetti_qcs_aspen_device

assert get_rigetti_qcs_aspen_device('Aspen-8') == RigettiQCSAspenDevice(isa=qcs_aspen8_isa)


# clean up extra environment variable
del os.environ[ALLOW_DEPRECATION_IN_TEST]
os.environ.update(_SAVE_ENVIRON)
5 changes: 5 additions & 0 deletions cirq-rigetti/cirq_rigetti/circuit_sweep_executors.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from typing_extensions import Protocol
from cirq_rigetti.logging import logger
from cirq_rigetti import circuit_transformers as transformers
from cirq_rigetti.deprecation import deprecated_cirq_rigetti_class, deprecated_cirq_rigetti_function


def _execute_and_read_result(
Expand Down Expand Up @@ -128,6 +129,7 @@ def _prepend_real_declarations(
return program


@deprecated_cirq_rigetti_class()
class CircuitSweepExecutor(Protocol):
"""A type definition for circuit sweep execution functions."""

Expand Down Expand Up @@ -158,6 +160,7 @@ def __call__(
"""


@deprecated_cirq_rigetti_function()
def without_quilc_compilation(
*,
quantum_computer: QuantumComputer,
Expand Down Expand Up @@ -199,6 +202,7 @@ def without_quilc_compilation(
return cirq_results


@deprecated_cirq_rigetti_function()
def with_quilc_compilation_and_cirq_parameter_resolution(
*,
quantum_computer: QuantumComputer,
Expand Down Expand Up @@ -242,6 +246,7 @@ def with_quilc_compilation_and_cirq_parameter_resolution(
return cirq_results


@deprecated_cirq_rigetti_function()
def with_quilc_parametric_compilation(
*,
quantum_computer: QuantumComputer,
Expand Down
6 changes: 6 additions & 0 deletions cirq-rigetti/cirq_rigetti/circuit_sweep_executors_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
import numpy as np
import sympy
from cirq_rigetti import circuit_sweep_executors as executors, circuit_transformers
from cirq_rigetti.deprecation import allow_deprecated_cirq_rigetti_use_in_tests


@allow_deprecated_cirq_rigetti_use_in_tests
def test_with_quilc_compilation_and_cirq_parameter_resolution(
mock_qpu_implementer: Any, parametric_circuit_with_params: Tuple[cirq.Circuit, cirq.Sweepable]
) -> None:
Expand Down Expand Up @@ -46,6 +48,7 @@ def test_with_quilc_compilation_and_cirq_parameter_resolution(


@pytest.mark.parametrize('pass_dict', [True, False])
@allow_deprecated_cirq_rigetti_use_in_tests
def test_with_quilc_parametric_compilation(
mock_qpu_implementer: Any,
parametric_circuit_with_params: Tuple[cirq.Circuit, cirq.Linspace],
Expand Down Expand Up @@ -88,6 +91,7 @@ def test_with_quilc_parametric_compilation(
), "should return an ordered list of results with correct set of measurements"


@allow_deprecated_cirq_rigetti_use_in_tests
def test_parametric_with_symbols(
mock_qpu_implementer: Any, parametric_circuit_with_params: Tuple[cirq.Circuit, cirq.Linspace]
):
Expand All @@ -106,6 +110,7 @@ def test_parametric_with_symbols(
)


@allow_deprecated_cirq_rigetti_use_in_tests
def test_without_quilc_compilation(
mock_qpu_implementer: Any, parametric_circuit_with_params: Tuple[cirq.Circuit, cirq.Sweepable]
) -> None:
Expand Down Expand Up @@ -143,6 +148,7 @@ def test_without_quilc_compilation(
), "should return an ordered list of results with correct set of measurements"


@allow_deprecated_cirq_rigetti_use_in_tests
def test_invalid_pyquil_region_measurement(
mock_qpu_implementer: Any, parametric_circuit_with_params: Tuple[cirq.Circuit, cirq.Sweepable]
) -> None:
Expand Down
5 changes: 5 additions & 0 deletions cirq-rigetti/cirq_rigetti/circuit_transformers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@
import cirq
from cirq_rigetti.quil_output import RigettiQCSQuilOutput
from typing_extensions import Protocol
from cirq_rigetti.deprecation import deprecated_cirq_rigetti_class, deprecated_cirq_rigetti_function


@deprecated_cirq_rigetti_class()
class _PostTransformationHook(Protocol):
def __call__(
self, *, program: Program, measurement_id_map: Dict[str, str]
Expand Down Expand Up @@ -57,6 +59,7 @@ def _transform_cirq_circuit_to_pyquil_program(
return program, measurement_id_map


@deprecated_cirq_rigetti_class()
class CircuitTransformer(Protocol):
"""A type definition for `cirq.Circuit` to `pyquil.Program` transformer functions."""

Expand All @@ -72,6 +75,7 @@ def __call__(self, *, circuit: cirq.Circuit) -> Tuple[Program, Dict[str, str]]:
"""


@deprecated_cirq_rigetti_function()
def build(
*,
qubits: Optional[Tuple[cirq.Qid, ...]] = None,
Expand Down Expand Up @@ -111,6 +115,7 @@ def transformer(*, circuit: cirq.Circuit) -> Tuple[Program, Dict[str, str]]:
return cast(CircuitTransformer, transformer)


@deprecated_cirq_rigetti_function()
def default(*, circuit: cirq.Circuit) -> Tuple[Program, Dict[str, str]]:
"""The default `CircuitTransformer` uses the default behavior of cirq's Quil
protocol to transform a `cirq.Circuit` into a `pyquil.Program`.
Expand Down
Loading