From 5c564279e9f4f2b3fb8002d0aca6e381e45aab8f Mon Sep 17 00:00:00 2001 From: Marquess Valdez Date: Wed, 22 Mar 2023 09:31:15 -0700 Subject: [PATCH] BREAKING CHANGE: A `Program` that uses qubit or label placeholders cannot be pickled --- poetry.lock | 26 ++++++++++++++++++---- pyproject.toml | 2 +- pyquil/api/_abstract_compiler.py | 9 ++++---- pyquil/quil.py | 4 ++-- pyquil/quilatom.py | 4 ++-- pyquil/quilbase.py | 6 ++--- pyquil/quiltcalibrations.py | 4 ++-- test/unit/__snapshots__/test_quilbase.ambr | 20 ----------------- test/unit/test_operator_estimation.py | 1 - test/unit/test_quantum_computer.py | 6 ++--- test/unit/test_quil.py | 2 +- 11 files changed, 41 insertions(+), 43 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7100543ed..6f8bb659f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1897,7 +1897,7 @@ toml = ">=0.10.2,<0.11.0" [[package]] name = "qcs-sdk-python" -version = "0.5.0-rc.8" +version = "0.5.0-rc.11" description = "Python interface for the QCS Rust SDK" category = "main" optional = false @@ -1905,13 +1905,31 @@ python-versions = "^3.8" files = [] develop = false +[package.dependencies] +quil = {git = "https://github.com/rigetti/quil-rs", branch = "1455-python-support-for-program-and-beyond"} + [package.source] type = "git" url = "https://github.com/rigetti/qcs-sdk-rust" -reference = "reexport-quil-py" -resolved_reference = "97692714637d3ae121537a6f10d734a526b3943f" +reference = "specify-quil-as-a-dependency" +resolved_reference = "eeabbd3af08e2fd93beee1e68a619a69a4421115" subdirectory = "crates/python" +[[package]] +name = "quil" +version = "0.1.0" +description = "A Python package for building and parsing Quil programs." +category = "main" +optional = false +python-versions = "^3.8" +files = [] +develop = false +[package.source] +type = "git" +url = "https://github.com/rigetti/quil-rs" +reference = "1455-python-support-for-program-and-beyond" +resolved_reference = "ccb803e40e51cc33b977df88d154221edee045aa" +subdirectory = "quil-py" [[package]] name = "recommonmark" version = "0.7.1" @@ -2560,4 +2578,4 @@ latex = ["ipython"] [metadata] lock-version = "2.0" python-versions = "^3.8,<3.11" -content-hash = "1f2de6d8dccda55ef48bcf43175b557ee3ae00d64370b37e80a0422833b43c03" +content-hash = "2015363db62d4a9de3a07394bec65dae98e5b20b6cb5185e175b7f3abe5fd538" diff --git a/pyproject.toml b/pyproject.toml index 075939942..ed6862f5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ lark = "^0.11.1" rpcq = "^3.10.0" networkx = "^2.5" importlib-metadata = { version = ">=3.7.3,<5", python = "<3.8" } -qcs-sdk-python = { git = "https://github.com/rigetti/qcs-sdk-rust", subdirectory = "crates/python", branch = "reexport-quil-py" } +qcs-sdk-python = { git = "https://github.com/rigetti/qcs-sdk-rust", subdirectory = "crates/python", branch = "specify-quil-as-a-dependency" } qcs-api-client = ">=0.21.0,<0.22.0" retry = "^0.9.2" types-python-dateutil = "^2.8.19" diff --git a/pyquil/api/_abstract_compiler.py b/pyquil/api/_abstract_compiler.py index 8a5c02e81..ff0303ff2 100644 --- a/pyquil/api/_abstract_compiler.py +++ b/pyquil/api/_abstract_compiler.py @@ -20,7 +20,8 @@ import asyncio import json -import qcs_sdk +from qcs_sdk.compiler.quilc import compile_program, CompilerOpts, TargetDevice +from qcs_sdk.qpu.isa import InstructionSetArchitecture from pyquil._memory import Memory from pyquil._version import pyquil_version @@ -129,10 +130,10 @@ def quil_to_native_quil(self, program: Program, *, protoquil: Optional[bool] = N # This will have to be addressed as part of this issue: https://github.com/rigetti/pyquil/issues/1496 target_device = compiler_isa_to_target_quantum_processor(self.quantum_processor.to_compiler_isa()) - native_quil = qcs_sdk.compile( + native_quil = compile_program( program.out(calibrations=False), - json.dumps(target_device.asdict(), indent=2), # type: ignore - timeout=self._compiler_client.timeout, + TargetDevice.from_json(json.dumps(target_device.asdict())), + options=CompilerOpts(timeout=self._compiler_client.timeout, protoquil=protoquil), ) native_program = Program(native_quil) diff --git a/pyquil/quil.py b/pyquil/quil.py index 4afee703d..683227963 100644 --- a/pyquil/quil.py +++ b/pyquil/quil.py @@ -86,8 +86,8 @@ _convert_to_calibration_match, ) -from qcs_sdk.quil.program import Program as RSProgram -import qcs_sdk.quil.instructions as quil_rs +from quil.program import Program as RSProgram +import quil.instructions as quil_rs InstructionDesignator = Union[ AbstractInstruction, diff --git a/pyquil/quilatom.py b/pyquil/quilatom.py index 5a75e1e75..a79da3584 100644 --- a/pyquil/quilatom.py +++ b/pyquil/quilatom.py @@ -36,8 +36,8 @@ import numpy as np -import qcs_sdk.quil.instructions as quil_rs -import qcs_sdk.quil.expression as quil_rs_expr +import quil.instructions as quil_rs +import quil.expression as quil_rs_expr class QuilAtom(object): diff --git a/pyquil/quilbase.py b/pyquil/quilbase.py index 2a6c52914..1a12cd1a2 100644 --- a/pyquil/quilbase.py +++ b/pyquil/quilbase.py @@ -75,8 +75,8 @@ from dataclasses import dataclass -import qcs_sdk.quil.instructions as quil_rs -import qcs_sdk.quil.expression as quil_rs_expr +import quil.instructions as quil_rs +import quil.expression as quil_rs_expr class _InstructionMeta(abc.ABCMeta): @@ -150,7 +150,7 @@ def _convert_to_py_instruction(instr: quil_rs.Instruction) -> AbstractInstructio instr = instr.inner() if isinstance(instr, quil_rs.Declaration): return Declare._from_rs_declaration(instr) - if isinstance(instr, quil_rs.DefCalibration): + if isinstance(instr, quil_rs.Calibration): return DefCalibration._from_rs_calibration(instr) if isinstance(instr, quil_rs.Gate): return Gate._from_rs_gate(instr) diff --git a/pyquil/quiltcalibrations.py b/pyquil/quiltcalibrations.py index 4440854cd..c5a79eabf 100644 --- a/pyquil/quiltcalibrations.py +++ b/pyquil/quiltcalibrations.py @@ -41,8 +41,8 @@ _convert_to_py_qubit, ) -from qcs_sdk.quil.program import CalibrationSet -import qcs_sdk.quil.instructions as quil_rs +from quil.program import CalibrationSet +import quil.instructions as quil_rs class CalibrationError(Exception): diff --git a/test/unit/__snapshots__/test_quilbase.ambr b/test/unit/__snapshots__/test_quilbase.ambr index dde5140f2..ded7a1316 100644 --- a/test/unit/__snapshots__/test_quilbase.ambr +++ b/test/unit/__snapshots__/test_quilbase.ambr @@ -128,20 +128,6 @@ '\tSAMPLE-RATE: 44.1', }) # --- -# name: TestDefMeasureCalibration.test_out[MemoryReference] - ''' - DEFCAL MEASURE 1 theta: - X 0 - - ''' -# --- -# name: TestDefMeasureCalibration.test_out[No-MemoryReference] - ''' - DEFCAL MEASURE 0 : - X 0 - - ''' -# --- # name: TestDefMeasureCalibration.test_out[qubit0-memory_reference0-instrs0] ''' DEFCAL MEASURE 0 theta: @@ -209,18 +195,12 @@ # name: TestGate.test_str[X-Gate] 'X 0' # --- -# name: TestMeasurement.test_out[FormalArgument] - 'MEASURE q theta' -# --- # name: TestMeasurement.test_out[MemoryReference] 'MEASURE 1 theta[0]' # --- # name: TestMeasurement.test_out[No-MemoryReference] 'MEASURE 0' # --- -# name: TestMeasurement.test_str[FormalArgument] - 'MEASURE q theta' -# --- # name: TestMeasurement.test_str[MemoryReference] 'MEASURE 1 theta[0]' # --- diff --git a/test/unit/test_operator_estimation.py b/test/unit/test_operator_estimation.py index a16a5d98c..57d971ffb 100644 --- a/test/unit/test_operator_estimation.py +++ b/test/unit/test_operator_estimation.py @@ -36,7 +36,6 @@ from pyquil.quilbase import Pragma -# TODO: pickle compatibility def test_measure_observables(client_configuration: QCSClientConfiguration): expts = [ ExperimentSetting(TensorProductState(), o1 * o2) diff --git a/test/unit/test_quantum_computer.py b/test/unit/test_quantum_computer.py index e4ce7c68b..313a04de7 100644 --- a/test/unit/test_quantum_computer.py +++ b/test/unit/test_quantum_computer.py @@ -143,7 +143,7 @@ def test_construct_strength_two_orthogonal_array(): assert np.allclose(_construct_strength_two_orthogonal_array(3), answer) -# TODO: pickle compatibility +# TODO: Review PyQVM def test_measure_bitstrings(client_configuration: QCSClientConfiguration): quantum_processor = NxQuantumProcessor(nx.complete_graph(2)) dummy_compiler = DummyCompiler(quantum_processor=quantum_processor, client_configuration=client_configuration) @@ -466,7 +466,7 @@ def test_qc_error(client_configuration: QCSClientConfiguration): get_qc("5q", as_qvm=False, client_configuration=client_configuration) -# TODO: pickle compatibility +# TODOV4: Write memory values @pytest.mark.parametrize("param", [np.pi, [np.pi], np.array([np.pi])]) def test_run_with_parameters(client_configuration: QCSClientConfiguration, param): quantum_processor = NxQuantumProcessor(nx.complete_graph(3)) @@ -508,7 +508,7 @@ def test_run_with_bad_parameters(client_configuration: QCSClientConfiguration, p executable.write_memory(region_name="theta", value=param) -# TODO: pickle compatibility +# TODOV4: Write Memory values def test_reset(client_configuration: QCSClientConfiguration): quantum_processor = NxQuantumProcessor(nx.complete_graph(3)) qc = QuantumComputer( diff --git a/test/unit/test_quil.py b/test/unit/test_quil.py index b68c86aed..9459a1c07 100644 --- a/test/unit/test_quil.py +++ b/test/unit/test_quil.py @@ -21,7 +21,7 @@ import numpy as np import pytest from syrupy.assertion import SnapshotAssertion -import qcs_sdk.quil.instructions as quil_rs +import quil.instructions as quil_rs from pyquil.gates import ( I,