From c902ab75a4644b2fa4b16e13b2176c487a7df51d Mon Sep 17 00:00:00 2001 From: marquessv Date: Thu, 29 Jun 2023 15:03:38 -0700 Subject: [PATCH 1/6] fix: Partial QCS configs will fallback on defaults for omitted fields --- poetry.lock | 28 ++++++++++++++-------------- pyproject.toml | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/poetry.lock b/poetry.lock index 898630623..4edda0a4b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2012,24 +2012,24 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "qcs-sdk-python" -version = "0.9.0rc0" +version = "0.9.0" description = "Python interface for the QCS Rust SDK" category = "main" optional = false python-versions = "*" files = [ - {file = "qcs_sdk_python-0.9.0rc0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e9fd065c0f9a46f94c07c8c64594a94ea15965629f123284fa86addd84a18a66"}, - {file = "qcs_sdk_python-0.9.0rc0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bdbaec2841396ab8a870514da06b4c06c4ff6951622de5dcabf5ec5fb873b50"}, - {file = "qcs_sdk_python-0.9.0rc0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb89a33317bcd4f589b21911df2f65ab65bb8ee6620ce3f1e10939e17c8c6e22"}, - {file = "qcs_sdk_python-0.9.0rc0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:522afaad4af57bf4d3d3ef254f50530e2d7b07172786a3126dea1dabe60483a4"}, - {file = "qcs_sdk_python-0.9.0rc0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c48d4c220694cd8dd2053f1d9f2e7a8cc503f308938d27a6fcb923ec62e578f"}, - {file = "qcs_sdk_python-0.9.0rc0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a99b0c62b6af0bc6dbd5ce6db1304095875bea64b653aaec7090170370c5a8"}, - {file = "qcs_sdk_python-0.9.0rc0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9e1a61f0039e5783c0db0c49f12698b6acfa4cea4dad53adf01ae7ef98d81703"}, - {file = "qcs_sdk_python-0.9.0rc0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5efe83d7332d59b145376ad7c24230921f9b39d94abf4a2510946bde038af277"}, - {file = "qcs_sdk_python-0.9.0rc0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f3dd3a359771815a2a334643af14d5efdad490deaedfdfb88dcb0e0da291232"}, - {file = "qcs_sdk_python-0.9.0rc0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:69143666f4dd5365e9b86ddff33140e6213341afb526b592f9525dfba3a5ca09"}, - {file = "qcs_sdk_python-0.9.0rc0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93711fcf384fdf380b4eeaa6663596a1ce18699d7608e07ad26c852e2380a655"}, - {file = "qcs_sdk_python-0.9.0rc0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2994fd6544e8e2ac471d5a2ed131c1483ccf31432c1dac47372c7f7a07fbf6f6"}, + {file = "qcs_sdk_python-0.9.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:645ef6cc694e9630dd99c94cb1c3f699bc0374841bdda649478937ec8e2534c3"}, + {file = "qcs_sdk_python-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb7e1e5be90807dbfc83691820a25a9daa3b3523edd748541fdbd2dfc0f472f"}, + {file = "qcs_sdk_python-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7efce206e3b3739f51b56267c4de00c729ebfd3894b2194acb5491fe60f3652"}, + {file = "qcs_sdk_python-0.9.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4858cebedf94942bda0169440ae8e23ba5af3ed63f6646e5ddb8e292a972206f"}, + {file = "qcs_sdk_python-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f897465ec71951dfac4712f5145a77558147033d0eada05176660c17f3ae90f7"}, + {file = "qcs_sdk_python-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27278555012bfebe6fd3f6b28b7af52dfbeb1346f9179d8fe786654222bb078f"}, + {file = "qcs_sdk_python-0.9.0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5b2930cbb77a3998dec1aa32ef380c3dda87ed7f831cefe05781e09f86d3183d"}, + {file = "qcs_sdk_python-0.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5b39ea51b08c331731ad5fddf8b6af3115b1ee2b338dd4bb9e02fd6d4d5479b"}, + {file = "qcs_sdk_python-0.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38550aa8e2f27f059cc3a97282fbdbbf2a0806ce4e89abec4d8a85cc252274e2"}, + {file = "qcs_sdk_python-0.9.0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4bfb9ef9464ade9fd5fae7c2ded7ad6cab534fd920f93874e21ac9157676ecb3"}, + {file = "qcs_sdk_python-0.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d9334af9bb3fd14595aa4b208add1ab6c0c6569cb7cf52148415f8f99c44120"}, + {file = "qcs_sdk_python-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e37b2e58bac172984cd003a13bb257c4a51b744b8f73208b467661d9a5c01ebd"}, ] [[package]] @@ -2715,4 +2715,4 @@ latex = ["ipython"] [metadata] lock-version = "2.0" python-versions = "^3.8,<4.0" -content-hash = "bee6797f70b67eba6964b6925a12ffebc07500e7bbfbbb3ad41e0f9b980c14e2" +content-hash = "43e8ddaeb37fb051acf9e00e0a754918cb022aab9a7db84f50662b9a5b0ae1a9" diff --git a/pyproject.toml b/pyproject.toml index 0ba7dc335..c0c60d8a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ rpcq = "^3.10.0" pydantic = "^1.10.7" networkx = ">=2.5" importlib-metadata = { version = ">=3.7.3,<5", python = "<3.8" } -qcs-sdk-python = "0.9.0-rc.0" +qcs-sdk-python = "0.9.0" tenacity = "^8.2.2" types-python-dateutil = "^2.8.19" types-retry = "^0.9.9" From 7413ef49ff8d72bda44c1ff27d5cfaa8344824c8 Mon Sep 17 00:00:00 2001 From: marquessv Date: Thu, 29 Jun 2023 15:11:45 -0700 Subject: [PATCH 2/6] add options fields to QVM api calls --- pyquil/api/_qvm.py | 5 ++++- pyquil/api/_wavefunction_simulator.py | 12 +++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pyquil/api/_qvm.py b/pyquil/api/_qvm.py index c93873435..a86c8f5bf 100644 --- a/pyquil/api/_qvm.py +++ b/pyquil/api/_qvm.py @@ -19,6 +19,7 @@ import numpy as np from qcs_sdk import QCSClient, qvm +from qcs_sdk.qvm import QVMOptions from pyquil._version import pyquil_version from pyquil.api import QAM, QuantumExecutable, QAMExecutionResult, MemoryMap @@ -107,12 +108,13 @@ def __init__( else: raise TypeError("random_seed should be None or a non-negative int") + self.timeout = timeout self._client = client_configuration or QCSClient.load() self.connect() def connect(self) -> None: try: - version = qvm.api.get_version_info(client=self._client) + version = qvm.api.get_version_info(client=self._client, options=QVMOptions(timeout=self.timeout)) check_qvm_version(version) except ConnectionError: raise QVMNotRunning(f"No QVM server running at {self._client.qvm_url}") from ConnectionError @@ -144,6 +146,7 @@ def execute( self.gate_noise, self.random_seed, self._client, + options=QVMOptions(timeout_seconds=self.timeout), ) memory = {name: np.asarray(data.inner()) for name, data in result.memory.items()} diff --git a/pyquil/api/_wavefunction_simulator.py b/pyquil/api/_wavefunction_simulator.py index 0a274b1e2..324566f4e 100644 --- a/pyquil/api/_wavefunction_simulator.py +++ b/pyquil/api/_wavefunction_simulator.py @@ -18,6 +18,7 @@ import numpy as np from qcs_sdk import QCSClient, qvm +from qcs_sdk.qvm import QVMOptions from pyquil.api import MemoryMap from pyquil.api._qvm import ( @@ -65,6 +66,7 @@ def __init__( else: raise TypeError("random_seed should be None or a non-negative int") + self.timeout = timeout self._client = client_configuration or QCSClient.load() def wavefunction(self, quil_program: Program, memory_map: Optional[MemoryMap] = None) -> Wavefunction: @@ -96,7 +98,9 @@ def wavefunction(self, quil_program: Program, memory_map: Optional[MemoryMap] = self.gate_noise, self.random_seed, ) - wavefunction = bytes(qvm.api.get_wavefunction(request, self._client)) + wavefunction = bytes( + qvm.api.get_wavefunction(request, self._client, options=QVMOptions(timeout_seconds=self.timeout)) + ) return Wavefunction.from_bit_packed_string(wavefunction) def expectation( @@ -141,7 +145,9 @@ def expectation( prep_prog = self.augment_program_with_memory_values(prep_prog, memory_map) request = qvm.api.ExpectationRequest(prep_prog.out(), [prog.out() for prog in progs]) - expectations = qvm.api.measure_expectation(request, self._client) + expectations = qvm.api.measure_expectation( + request, self._client, options=QVMOptions(timeout_seconds=self.timeout) + ) bare_results = np.asarray(expectations) results = coeffs * bare_results if is_pauli_sum: @@ -196,7 +202,7 @@ def run_and_measure( trials, qubits, ) - measured_qubits = qvm.api.run_and_measure(request) + measured_qubits = qvm.api.run_and_measure(request, options=QVMOptions(timeout_seconds=self.timeout)) return np.asarray(measured_qubits) @staticmethod From dcc6f5e3cf50f5e9292575413c763d71a6d9ecbf Mon Sep 17 00:00:00 2001 From: marquessv Date: Thu, 29 Jun 2023 15:12:50 -0700 Subject: [PATCH 3/6] correct param name --- pyquil/api/_qvm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyquil/api/_qvm.py b/pyquil/api/_qvm.py index a86c8f5bf..9deb0e798 100644 --- a/pyquil/api/_qvm.py +++ b/pyquil/api/_qvm.py @@ -114,7 +114,7 @@ def __init__( def connect(self) -> None: try: - version = qvm.api.get_version_info(client=self._client, options=QVMOptions(timeout=self.timeout)) + version = qvm.api.get_version_info(client=self._client, options=QVMOptions(timeout_seconds=self.timeout)) check_qvm_version(version) except ConnectionError: raise QVMNotRunning(f"No QVM server running at {self._client.qvm_url}") from ConnectionError From a8a675399e702c6a3d96c650b6784d8809c2e2c4 Mon Sep 17 00:00:00 2001 From: marquessv Date: Thu, 29 Jun 2023 15:18:13 -0700 Subject: [PATCH 4/6] ignore call arg err --- pyquil/api/_wavefunction_simulator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyquil/api/_wavefunction_simulator.py b/pyquil/api/_wavefunction_simulator.py index 324566f4e..9ef30d8aa 100644 --- a/pyquil/api/_wavefunction_simulator.py +++ b/pyquil/api/_wavefunction_simulator.py @@ -202,7 +202,7 @@ def run_and_measure( trials, qubits, ) - measured_qubits = qvm.api.run_and_measure(request, options=QVMOptions(timeout_seconds=self.timeout)) + measured_qubits = qvm.api.run_and_measure(request, options=QVMOptions(timeout_seconds=self.timeout)) # type: ignore[call-arg] return np.asarray(measured_qubits) @staticmethod From 14d5150aed4ab2d257c720dc00b94f7f1accb08e Mon Sep 17 00:00:00 2001 From: marquessv Date: Thu, 29 Jun 2023 15:22:14 -0700 Subject: [PATCH 5/6] style --- pyquil/api/_wavefunction_simulator.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyquil/api/_wavefunction_simulator.py b/pyquil/api/_wavefunction_simulator.py index 9ef30d8aa..d11578c4f 100644 --- a/pyquil/api/_wavefunction_simulator.py +++ b/pyquil/api/_wavefunction_simulator.py @@ -202,7 +202,9 @@ def run_and_measure( trials, qubits, ) - measured_qubits = qvm.api.run_and_measure(request, options=QVMOptions(timeout_seconds=self.timeout)) # type: ignore[call-arg] + measured_qubits = qvm.api.run_and_measure( + request, options=QVMOptions(timeout_seconds=self.timeout) # type: ignore[call-arg] + ) return np.asarray(measured_qubits) @staticmethod From f12fef088a9c424fe512b9143857236bf961a396 Mon Sep 17 00:00:00 2001 From: marquessv Date: Thu, 29 Jun 2023 15:29:38 -0700 Subject: [PATCH 6/6] consolidate get_version_info_requests --- pyquil/api/_qvm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyquil/api/_qvm.py b/pyquil/api/_qvm.py index 9deb0e798..8c5706158 100644 --- a/pyquil/api/_qvm.py +++ b/pyquil/api/_qvm.py @@ -114,7 +114,7 @@ def __init__( def connect(self) -> None: try: - version = qvm.api.get_version_info(client=self._client, options=QVMOptions(timeout_seconds=self.timeout)) + version = self.get_version_info() check_qvm_version(version) except ConnectionError: raise QVMNotRunning(f"No QVM server running at {self._client.qvm_url}") from ConnectionError @@ -166,7 +166,7 @@ def get_version_info(self) -> str: :return: String with version information """ - return qvm.api.get_version_info(self._client) + return qvm.api.get_version_info(self._client, options=QVMOptions(timeout_seconds=self.timeout)) def validate_noise_probabilities(noise_parameter: Optional[Tuple[float, float, float]]) -> None: