qcs-sdk-python 0.26.1rc1__tar.gz → 0.26.2rc0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/Cargo.lock +1 -1
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/PKG-INFO +1 -1
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/CHANGELOG.md +28 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/Cargo.toml +2 -2
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/errors.rs +8 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/api/mod.rs +5 -1
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/isa/python.rs +35 -3
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/mod.rs +52 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/mocked_qpu.rs +12 -3
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/conftest.py +16 -5
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/qpu/test_isa.py +8 -1
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/pyproject.toml +1 -1
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qpu/api.pyi +1 -1
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qpu/isa.pyi +26 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/Cargo.toml +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/README-py.md +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/THIRDPARTY.yaml +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/.flake8 +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/Makefile.toml +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/README-py.md +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/README.md +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/THIRDPARTY.yaml +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/build.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/examples/delayed_job_retrieval.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/examples/execute.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/examples/libquil.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/examples/local.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/examples/parametric_compilation.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/examples/quil_t.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/poetry.lock +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/poetry.toml +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/python/stubtest-allowlist +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/scripts/check-py-api.sh +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/scripts/lint-bindings.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/scripts/patch_grpc_web.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/bin/diagnostics.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/bin/stub_gen.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/client.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/isa/edge.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/isa/mod.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/isa/operator.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/isa/qubit.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/libquil.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/mod.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/python.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/quilc.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/rpcq.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/diagnostics/mod.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/diagnostics/python.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/executable.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/execution_data.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/lib.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/client.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/executable.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/execution_data.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/mod.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/nonzero.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/register_data.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/api/python.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/execution.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/experimental/mod.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/experimental/python.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/experimental/random.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/isa/mod.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/python.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/result_data.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/snapshots/qcs__qpu__rewrite_arithmetic__describe_rewrite_arithmetic__it_allocates_for_multiple_expressions-2.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/snapshots/qcs__qpu__rewrite_arithmetic__describe_rewrite_arithmetic__it_allocates_for_multiple_expressions.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/snapshots/qcs__qpu__rewrite_arithmetic__describe_rewrite_arithmetic__it_converts_frequency_expressions-2.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/snapshots/qcs__qpu__rewrite_arithmetic__describe_rewrite_arithmetic__it_converts_frequency_expressions.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/snapshots/qcs__qpu__rewrite_arithmetic__describe_rewrite_arithmetic__it_converts_phases.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/snapshots/qcs__qpu__rewrite_arithmetic__describe_rewrite_arithmetic__it_converts_set_scale_units.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/snapshots/qcs__qpu__rewrite_arithmetic__describe_rewrite_arithmetic__it_substitutes_and_reuses_gate_expressions.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/snapshots/qcs__qpu__rewrite_arithmetic__describe_rewrite_arithmetic__it_substitutes_gate_parameters.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/translation/mod.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/translation/python.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qvm/execution.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qvm/http.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qvm/libquil.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qvm/mod.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qvm/python.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qvm/snapshots/qcs__qvm__test__apply_valid_parameters_to_program.snap +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/register_data.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/aspen_9_isa.json +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/basic_qvm.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/bell_state_response_data.hex +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/compiler-isa-Aspen-8.json +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/parametric_compilation.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/prng_test_cases.json +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/qcs-isa-Aspen-8.json +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/qvm_api.rs +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/qvm_isa.json +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/settings.toml +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/_fixtures/aspen-m-3.json +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/_fixtures/device-2q.json +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/_qcs_config/secrets.toml +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/_qcs_config/settings.toml +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/compiler/__snapshots__/test_quilc.ambr +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/compiler/test_quilc.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/execution_data/test_execution_data.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/qpu/experimental/test_random.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/qpu/test_api.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/qpu/test_qpu.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/qpu/test_translation.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/qvm/test_qvm.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/test_client.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/test_diagnostics.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/test_executable.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/test_logging.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/test_tracing_subscriber.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/__init__.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/__init__.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/common/__init__.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/common/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/layers/__init__.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/layers/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.py +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/client.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/compiler/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/compiler/quilc.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/diagnostics.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qpu/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qpu/experimental/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qpu/experimental/random.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qpu/translation.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qvm/__init__.pyi +0 -0
- {qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qvm/api.pyi +0 -0
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
## 0.26.2-rc.0 (2026-04-22)
|
|
2
|
+
|
|
3
|
+
### Fixes
|
|
4
|
+
|
|
5
|
+
- expose list_isas and use it in Python tests (#585)
|
|
6
|
+
|
|
7
|
+
## 0.26.1 (2026-03-30)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
- upgrade qcs-api-client dependencies (#581)
|
|
12
|
+
|
|
13
|
+
### Fixes
|
|
14
|
+
|
|
15
|
+
- selecting an accessor should not prefer None to Some({ rank: None }) (#579)
|
|
16
|
+
- use gzip compression for grpc (#526)
|
|
17
|
+
|
|
18
|
+
## 0.26.1-rc.2 (2026-03-30)
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
- upgrade qcs-api-client dependencies (#581)
|
|
23
|
+
|
|
24
|
+
### Fixes
|
|
25
|
+
|
|
26
|
+
- selecting an accessor should not prefer None to Some({ rank: None }) (#579)
|
|
27
|
+
- use gzip compression for grpc (#526)
|
|
28
|
+
|
|
1
29
|
## 0.26.1-rc.1 (2026-03-20)
|
|
2
30
|
|
|
3
31
|
### Features
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "qcs"
|
|
3
3
|
description = "High level interface for running Quil on a QPU"
|
|
4
|
-
version = "0.26.
|
|
4
|
+
version = "0.26.2-rc.0"
|
|
5
5
|
edition = "2018"
|
|
6
6
|
license = "Apache-2.0"
|
|
7
7
|
repository = "https://github.com/rigetti/qcs-sdk-rust"
|
|
@@ -88,7 +88,7 @@ thiserror.workspace = true
|
|
|
88
88
|
tokio = { workspace = true, features = ["fs", "rt-multi-thread"] }
|
|
89
89
|
tokio-util = { workspace = true }
|
|
90
90
|
toml = "0.9.8"
|
|
91
|
-
tonic = { version = "0.13.1", features = ["tls-aws-lc", "tls-native-roots"] }
|
|
91
|
+
tonic = { version = "0.13.1", features = ["tls-aws-lc", "tls-native-roots", "gzip"] }
|
|
92
92
|
uuid = { version = "1.10.0", features = ["v4"] }
|
|
93
93
|
zmq = { version = "0.10.0" }
|
|
94
94
|
|
|
@@ -151,6 +151,14 @@ exception!(
|
|
|
151
151
|
"Errors raised due to failure to get an ISA."
|
|
152
152
|
);
|
|
153
153
|
|
|
154
|
+
exception!(
|
|
155
|
+
crate::qpu::ListISAsError,
|
|
156
|
+
qcs_sdk.qpu.isa,
|
|
157
|
+
ListISAsError,
|
|
158
|
+
QcsSdkError,
|
|
159
|
+
"API Errors encountered when trying to list available ISAs."
|
|
160
|
+
);
|
|
161
|
+
|
|
154
162
|
exception!(
|
|
155
163
|
crate::qpu::isa::python::SerializeIsaError,
|
|
156
164
|
qcs_sdk.qpu.isa,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
//! This module provides access to the QCS QPU API
|
|
2
2
|
use std::{convert::TryFrom, fmt, time::Duration};
|
|
3
3
|
|
|
4
|
+
use tonic::codec::CompressionEncoding;
|
|
5
|
+
|
|
4
6
|
#[cfg(feature = "stubs")]
|
|
5
7
|
use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pyclass_complex_enum, gen_stub_pymethods};
|
|
6
8
|
|
|
@@ -627,7 +629,9 @@ pub trait ExecutionTarget<'a> {
|
|
|
627
629
|
.max_encoding_message_size(MAX_CONTROLLER_OUTBOUND_REQUEST_SIZE)
|
|
628
630
|
// do not limit the received response size, although practically the limit is 4Gb due
|
|
629
631
|
// to the frame_length of the message being a u32.
|
|
630
|
-
.max_decoding_message_size(u32::MAX as usize)
|
|
632
|
+
.max_decoding_message_size(u32::MAX as usize)
|
|
633
|
+
.accept_compressed(CompressionEncoding::Gzip)
|
|
634
|
+
.send_compressed(CompressionEncoding::Gzip))
|
|
631
635
|
}
|
|
632
636
|
|
|
633
637
|
/// Get a GRPC connection to a QPU, without specifying the API to use.
|
|
@@ -10,7 +10,11 @@ use pyo3_stub_gen::{
|
|
|
10
10
|
|
|
11
11
|
use qcs_api_client_openapi::models;
|
|
12
12
|
|
|
13
|
-
use crate::{
|
|
13
|
+
use crate::{
|
|
14
|
+
client::Qcs,
|
|
15
|
+
python::errors,
|
|
16
|
+
qpu::{get_isa, list_isas},
|
|
17
|
+
};
|
|
14
18
|
|
|
15
19
|
create_init_submodule! {
|
|
16
20
|
classes: [
|
|
@@ -24,8 +28,17 @@ create_init_submodule! {
|
|
|
24
28
|
OperationSite,
|
|
25
29
|
Parameter
|
|
26
30
|
],
|
|
27
|
-
errors: [
|
|
28
|
-
|
|
31
|
+
errors: [
|
|
32
|
+
errors::SerializeISAError,
|
|
33
|
+
errors::GetISAError,
|
|
34
|
+
errors::ListISAsError
|
|
35
|
+
],
|
|
36
|
+
funcs: [
|
|
37
|
+
py_get_instruction_set_architecture,
|
|
38
|
+
py_get_instruction_set_architecture_async,
|
|
39
|
+
py_list_instruction_set_architectures,
|
|
40
|
+
py_list_instruction_set_architectures_async
|
|
41
|
+
],
|
|
29
42
|
}
|
|
30
43
|
|
|
31
44
|
impl_repr!(Architecture);
|
|
@@ -622,3 +635,22 @@ py_function_sync_async! {
|
|
|
622
635
|
.map_err(Into::into)
|
|
623
636
|
}
|
|
624
637
|
}
|
|
638
|
+
|
|
639
|
+
py_function_sync_async! {
|
|
640
|
+
/// Fetch the names of available ``InstructionSetArchitecture``s (ISAs) from the QCS API.
|
|
641
|
+
///
|
|
642
|
+
/// :param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
|
|
643
|
+
///
|
|
644
|
+
/// :raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
|
|
645
|
+
/// :raises ListISAsError: If there was an issue fetching the ISAs from the QCS API.
|
|
646
|
+
#[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.isa"))]
|
|
647
|
+
#[pyfunction]
|
|
648
|
+
#[pyo3(signature = (client = None))]
|
|
649
|
+
async fn list_instruction_set_architectures(client: Option<Qcs>) -> PyResult<Vec<String>> {
|
|
650
|
+
let client = client.unwrap_or_else(Qcs::load);
|
|
651
|
+
|
|
652
|
+
list_isas(&client, None)
|
|
653
|
+
.await
|
|
654
|
+
.map_err(Into::into)
|
|
655
|
+
}
|
|
656
|
+
}
|
|
@@ -107,3 +107,55 @@ pub async fn list_quantum_processors(
|
|
|
107
107
|
})
|
|
108
108
|
.await?
|
|
109
109
|
}
|
|
110
|
+
|
|
111
|
+
/// API Errors encountered when trying to list available ISAs.
|
|
112
|
+
#[derive(Debug, thiserror::Error)]
|
|
113
|
+
pub enum ListISAsError {
|
|
114
|
+
/// Failed the http call
|
|
115
|
+
#[error("Failed to list processors via API: {0}")]
|
|
116
|
+
ApiError(#[from] OpenApiError<quantum_processors_api::ListInstructionSetArchitecturesError>),
|
|
117
|
+
|
|
118
|
+
/// Pagination did not finish before timeout
|
|
119
|
+
#[error("API pagination did not finish before timeout.")]
|
|
120
|
+
TimeoutError(#[from] Elapsed),
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// Query QCS for the names of all available ISAs.
|
|
124
|
+
pub async fn list_isas(
|
|
125
|
+
client: &Qcs,
|
|
126
|
+
timeout: Option<Duration>,
|
|
127
|
+
) -> Result<Vec<String>, ListISAsError> {
|
|
128
|
+
#[cfg(feature = "tracing")]
|
|
129
|
+
tracing::debug!("listing instruction set architectures");
|
|
130
|
+
|
|
131
|
+
let timeout = timeout.unwrap_or(DEFAULT_HTTP_API_TIMEOUT);
|
|
132
|
+
|
|
133
|
+
tokio::time::timeout(timeout, async move {
|
|
134
|
+
let mut quantum_processors = vec![];
|
|
135
|
+
let mut page_token = None;
|
|
136
|
+
|
|
137
|
+
loop {
|
|
138
|
+
let result = quantum_processors_api::list_instruction_set_architectures(
|
|
139
|
+
&client.get_openapi_client(),
|
|
140
|
+
Some(5),
|
|
141
|
+
page_token.as_deref(),
|
|
142
|
+
)
|
|
143
|
+
.await?;
|
|
144
|
+
|
|
145
|
+
let mut data = result
|
|
146
|
+
.instruction_set_architectures
|
|
147
|
+
.into_iter()
|
|
148
|
+
.map(|isa| isa.name)
|
|
149
|
+
.collect::<Vec<_>>();
|
|
150
|
+
quantum_processors.append(&mut data);
|
|
151
|
+
|
|
152
|
+
page_token = result.next_page_token;
|
|
153
|
+
if page_token.is_none() {
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
Ok(quantum_processors)
|
|
159
|
+
})
|
|
160
|
+
.await?
|
|
161
|
+
}
|
|
@@ -272,6 +272,7 @@ mod translation {
|
|
|
272
272
|
TranslateQuilToEncryptedControllerJobRequest,
|
|
273
273
|
TranslateQuilToEncryptedControllerJobResponse,
|
|
274
274
|
};
|
|
275
|
+
use tonic::codec::CompressionEncoding;
|
|
275
276
|
use tonic::{transport::Server, Request};
|
|
276
277
|
use tonic::{Response, Status};
|
|
277
278
|
|
|
@@ -315,7 +316,11 @@ mod translation {
|
|
|
315
316
|
pub(crate) async fn run() {
|
|
316
317
|
let service = TranslationService::default();
|
|
317
318
|
Server::builder()
|
|
318
|
-
.add_service(
|
|
319
|
+
.add_service(
|
|
320
|
+
TranslationServer::new(service)
|
|
321
|
+
.accept_compressed(CompressionEncoding::Gzip)
|
|
322
|
+
.send_compressed(CompressionEncoding::Gzip),
|
|
323
|
+
)
|
|
319
324
|
.serve("127.0.0.1:8003".parse().expect("address can be parsed"))
|
|
320
325
|
.await
|
|
321
326
|
.expect("service runs without errors");
|
|
@@ -339,7 +344,7 @@ mod qpu {
|
|
|
339
344
|
GetControllerJobStatusResponse,
|
|
340
345
|
},
|
|
341
346
|
};
|
|
342
|
-
use tonic::{transport::Server, Request, Response, Status};
|
|
347
|
+
use tonic::{codec::CompressionEncoding, transport::Server, Request, Response, Status};
|
|
343
348
|
|
|
344
349
|
#[derive(Default, Debug)]
|
|
345
350
|
pub struct ControllerService {}
|
|
@@ -412,7 +417,11 @@ mod qpu {
|
|
|
412
417
|
pub(crate) async fn run() {
|
|
413
418
|
let service = ControllerService::default();
|
|
414
419
|
Server::builder()
|
|
415
|
-
.add_service(
|
|
420
|
+
.add_service(
|
|
421
|
+
ControllerServer::new(service)
|
|
422
|
+
.accept_compressed(CompressionEncoding::Gzip)
|
|
423
|
+
.send_compressed(CompressionEncoding::Gzip),
|
|
424
|
+
)
|
|
416
425
|
// port must match MOCK_QPU_ADDRESS
|
|
417
426
|
.serve("127.0.0.1:8002".parse().expect("address can be parsed"))
|
|
418
427
|
.await
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import asyncio
|
|
1
2
|
import datetime
|
|
2
3
|
import os
|
|
3
4
|
from typing import List
|
|
@@ -8,12 +9,14 @@ from _pytest.config.argparsing import Parser
|
|
|
8
9
|
from _pytest.nodes import Item
|
|
9
10
|
|
|
10
11
|
from qcs_sdk.client import QCSClient
|
|
11
|
-
from qcs_sdk.qpu.api import APIExecutionOptions,
|
|
12
|
-
from qcs_sdk.qpu.isa import
|
|
12
|
+
from qcs_sdk.qpu.api import APIExecutionOptions, ExecutionOptions
|
|
13
|
+
from qcs_sdk.qpu.isa import (
|
|
14
|
+
list_instruction_set_architectures_async,
|
|
15
|
+
InstructionSetArchitecture
|
|
16
|
+
)
|
|
13
17
|
from qcs_sdk.qvm import QVMClient
|
|
14
18
|
from qcs_sdk.compiler.quilc import QuilcClient
|
|
15
19
|
|
|
16
|
-
|
|
17
20
|
TEST_ROOT_DIR = os.path.dirname(os.path.realpath(__file__))
|
|
18
21
|
TEST_CONFIG_DIR = os.path.join(TEST_ROOT_DIR, "./_qcs_config")
|
|
19
22
|
TEST_FIXTURE_DIR = os.path.join(TEST_ROOT_DIR, "./_fixtures")
|
|
@@ -61,9 +64,17 @@ def _read_fixture(relpath: str) -> str:
|
|
|
61
64
|
return contents
|
|
62
65
|
|
|
63
66
|
|
|
67
|
+
@pytest.fixture(scope="session")
|
|
68
|
+
def available_ids() -> list[str]:
|
|
69
|
+
async def _list_isas():
|
|
70
|
+
return await list_instruction_set_architectures_async(client=QCSClient())
|
|
71
|
+
return asyncio.run(_list_isas())
|
|
72
|
+
|
|
73
|
+
|
|
64
74
|
@pytest.fixture
|
|
65
|
-
def quantum_processor_id() -> str:
|
|
66
|
-
|
|
75
|
+
def quantum_processor_id(available_ids: list[str]) -> str:
|
|
76
|
+
default = "Cepheus-1-108Q" if len(available_ids) == 0 else available_ids[0]
|
|
77
|
+
return os.getenv("TEST_LIVE_QUANTUM_PROCESSOR_ID", default)
|
|
67
78
|
|
|
68
79
|
|
|
69
80
|
@pytest.fixture
|
|
@@ -34,8 +34,15 @@ def test_instruction_set_architecture_serialization_error():
|
|
|
34
34
|
InstructionSetArchitecture.from_raw('{ "fail": true }')
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
def
|
|
37
|
+
def test_get_instruction_set_architecture_public(quantum_processor_id: str):
|
|
38
38
|
"""Successfully get a known public ISA without authentication."""
|
|
39
39
|
isa = get_instruction_set_architecture(quantum_processor_id, client=QCSClient())
|
|
40
40
|
assert type(isa) is InstructionSetArchitecture
|
|
41
41
|
|
|
42
|
+
|
|
43
|
+
@pytest.mark.asyncio
|
|
44
|
+
async def test_get_instruction_set_architecture_public_async(quantum_processor_id: str):
|
|
45
|
+
"""Successfully get a known public ISA without authentication."""
|
|
46
|
+
isa = await get_instruction_set_architecture_async(quantum_processor_id, client=QCSClient())
|
|
47
|
+
assert type(isa) is InstructionSetArchitecture
|
|
48
|
+
|
|
@@ -125,7 +125,7 @@ class ConnectionStrategy:
|
|
|
125
125
|
def __getitem__(self, key: builtins.int) -> typing.Any: ...
|
|
126
126
|
def __len__(self) -> builtins.int: ...
|
|
127
127
|
def __new__(cls, _0: builtins.str) -> ConnectionStrategy.EndpointAddress: ...
|
|
128
|
-
|
|
128
|
+
|
|
129
129
|
@typing.final
|
|
130
130
|
class EndpointId(ConnectionStrategy):
|
|
131
131
|
r"""
|
|
@@ -263,6 +263,12 @@ class InstructionSetArchitecture:
|
|
|
263
263
|
Returns [`SerializeIsaError`] if the ISA could not be serialized.
|
|
264
264
|
"""
|
|
265
265
|
|
|
266
|
+
class ListISAsError(QcsSdkError):
|
|
267
|
+
r"""
|
|
268
|
+
API Errors encountered when trying to list available ISAs.
|
|
269
|
+
"""
|
|
270
|
+
...
|
|
271
|
+
|
|
266
272
|
@typing.final
|
|
267
273
|
class Node:
|
|
268
274
|
r"""
|
|
@@ -470,3 +476,23 @@ def get_instruction_set_architecture_async(quantum_processor_id: builtins.str, c
|
|
|
470
476
|
:raises GetISAError: If there was an issue fetching the ISA from the QCS API.
|
|
471
477
|
"""
|
|
472
478
|
|
|
479
|
+
def list_instruction_set_architectures(client: typing.Optional[QCSClient] = None) -> builtins.list[builtins.str]:
|
|
480
|
+
r"""
|
|
481
|
+
Fetch the names of available ``InstructionSetArchitecture``s (ISAs) from the QCS API.
|
|
482
|
+
|
|
483
|
+
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
|
|
484
|
+
|
|
485
|
+
:raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
|
|
486
|
+
:raises ListISAsError: If there was an issue fetching the ISAs from the QCS API.
|
|
487
|
+
"""
|
|
488
|
+
|
|
489
|
+
def list_instruction_set_architectures_async(client: typing.Optional[QCSClient] = None) -> collections.abc.Awaitable[builtins.list[builtins.str]]:
|
|
490
|
+
r"""
|
|
491
|
+
Fetch the names of available ``InstructionSetArchitecture``s (ISAs) from the QCS API.
|
|
492
|
+
|
|
493
|
+
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
|
|
494
|
+
|
|
495
|
+
:raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
|
|
496
|
+
:raises ListISAsError: If there was an issue fetching the ISAs from the QCS API.
|
|
497
|
+
"""
|
|
498
|
+
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/examples/delayed_job_retrieval.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/examples/parametric_compilation.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/compiler/isa/operator.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/execution_data.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/python/register_data.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/experimental/mod.rs
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/experimental/python.rs
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/experimental/random.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/src/qpu/translation/python.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/bell_state_response_data.hex
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/compiler-isa-Aspen-8.json
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests/parametric_compilation.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/_fixtures/aspen-m-3.json
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/_fixtures/device-2q.json
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/_qcs_config/secrets.toml
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/_qcs_config/settings.toml
RENAMED
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/compiler/test_quilc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/qpu/test_translation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/test_diagnostics.py
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/test_executable.py
RENAMED
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/crates/lib/tests_py/test_tracing_subscriber.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/_tracing_subscriber/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qpu/experimental/__init__.pyi
RENAMED
|
File without changes
|
{qcs_sdk_python-0.26.1rc1 → qcs_sdk_python-0.26.2rc0}/python/qcs_sdk/qpu/experimental/random.pyi
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|