Skip to content

Commit cf6b071

Browse files
authored
Merge branch 'main' into add-editorconfig-toml
2 parents f858827 + aa9a4da commit cf6b071

File tree

8 files changed

+75
-44
lines changed

8 files changed

+75
-44
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ jobs:
6363
- name: Set up Python environment
6464
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
6565
with:
66-
python-version: '3.14'
66+
python-version: '3.11'
6767
architecture: 'x64'
6868
- name: Install dependencies
6969
run: pip install -r dev_tools/requirements/deps/format.txt

.github/workflows/scorecard-scanner.yaml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,23 @@ jobs:
6161
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
6262
with:
6363
# Save the results
64-
results_file: scorecard-results.sarif
64+
results_file: raw-scorecard-results.sarif
6565
results_format: sarif
6666
# See https://github.com/ossf/scorecard-action#publishing-results.
6767
publish_results: true
6868

69+
- name: Filter results
70+
uses: advanced-security/filter-sarif@2da736ff05ef065cb2894ac6892e47b5eac2c3c0 # v1.1
71+
with:
72+
# The cifuzz action version cannot be pinned to a hash. Filter out those results to avoid
73+
# repeated warnings that we can't do anything about.
74+
patterns: |
75+
-.github/workflows/cifuzz.yml:actions/unpinned-tag
76+
input: raw-scorecard-results.sarif
77+
output: scorecard-results.sarif
78+
6979
- name: Upload results to code-scanning dashboard
7080
# yamllint disable rule:line-length
71-
uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
81+
uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
7282
with:
7383
sarif_file: scorecard-results.sarif

cirq-ionq/cirq_ionq/serializer_test.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def test_serialize_many_circuits():
146146
'qubits': 3,
147147
'circuits': [{'circuit': [{'gate': 'x', 'targets': [2]}]}],
148148
},
149-
metadata={'measurements': '[{}]', 'qubit_numbers': '[3]'},
149+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([3])},
150150
settings={"foo": "bar", "key": "heart"},
151151
compilation={"opt": 3, "precision": "1E-4"},
152152
error_mitigation={'debiasing': False},
@@ -194,7 +194,7 @@ def test_serialize_single_circuit_metadata_is_updated():
194194
result = serializer.serialize_single_circuit(circuit, metadata={'foo': 'bar'})
195195
assert result == ionq.SerializedProgram(
196196
input={'gateset': 'qis', 'qubits': 1, 'circuit': [{'gate': 'x', 'targets': [0]}]},
197-
metadata={'foo': 'bar', 'measurement0': 'result\x1f0'},
197+
metadata={'foo': 'bar', 'measurement0': f'result{chr(31)}0'},
198198
settings={},
199199
compilation={},
200200
error_mitigation={},
@@ -216,8 +216,8 @@ def test_serialize_many_circuits_metadata_is_updated():
216216
},
217217
metadata={
218218
'foo': 'bar',
219-
'measurements': '[{"measurement0": "result\\u001f0"}]',
220-
'qubit_numbers': '[1]',
219+
'measurements': json.dumps([{"measurement0": f"result{chr(31)}0"}]),
220+
'qubit_numbers': json.dumps([1]),
221221
},
222222
settings={},
223223
compilation={},
@@ -264,7 +264,7 @@ def test_serialize_many_circuits_pow_gates():
264264
{'circuit': [{'gate': name, 'targets': [0], 'rotation': exponent * np.pi}]}
265265
],
266266
},
267-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
267+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
268268
settings={},
269269
compilation={},
270270
error_mitigation={},
@@ -302,7 +302,7 @@ def test_serialize_many_circuits_pauli_gates():
302302
'qubits': 1,
303303
'circuits': [{'circuit': [{'gate': name, 'targets': [0]}]}],
304304
},
305-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
305+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
306306
settings={},
307307
compilation={},
308308
error_mitigation={},
@@ -349,7 +349,7 @@ def test_serialize_many_circuits_sqrt_x_gate():
349349
'qubits': 1,
350350
'circuits': [{'circuit': [{'gate': 'v', 'targets': [0]}]}],
351351
},
352-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
352+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
353353
settings={},
354354
compilation={},
355355
error_mitigation={},
@@ -364,7 +364,7 @@ def test_serialize_many_circuits_sqrt_x_gate():
364364
'qubits': 1,
365365
'circuits': [{'circuit': [{'gate': 'vi', 'targets': [0]}]}],
366366
},
367-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
367+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
368368
settings={},
369369
compilation={},
370370
error_mitigation={},
@@ -411,7 +411,7 @@ def test_serialize_many_circuits_s_gate():
411411
'qubits': 1,
412412
'circuits': [{'circuit': [{'gate': 's', 'targets': [0]}]}],
413413
},
414-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
414+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
415415
settings={},
416416
compilation={},
417417
error_mitigation={},
@@ -426,7 +426,7 @@ def test_serialize_many_circuits_s_gate():
426426
'qubits': 1,
427427
'circuits': [{'circuit': [{'gate': 'si', 'targets': [0]}]}],
428428
},
429-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
429+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
430430
settings={},
431431
compilation={},
432432
error_mitigation={},
@@ -466,7 +466,7 @@ def test_serialize_many_circuits_h_gate():
466466
'qubits': 1,
467467
'circuits': [{'circuit': [{'gate': 'h', 'targets': [0]}]}],
468468
},
469-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
469+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
470470
settings={},
471471
compilation={},
472472
error_mitigation={},
@@ -517,7 +517,7 @@ def test_serialize_many_circuits_t_gate():
517517
'qubits': 1,
518518
'circuits': [{'circuit': [{'gate': 't', 'targets': [0]}]}],
519519
},
520-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
520+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
521521
settings={},
522522
compilation={},
523523
error_mitigation={},
@@ -532,7 +532,7 @@ def test_serialize_many_circuits_t_gate():
532532
'qubits': 1,
533533
'circuits': [{'circuit': [{'gate': 'ti', 'targets': [0]}]}],
534534
},
535-
metadata={'measurements': '[{}]', 'qubit_numbers': '[1]'},
535+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([1])},
536536
settings={},
537537
compilation={},
538538
error_mitigation={},
@@ -582,7 +582,7 @@ def test_serialize__many_circuits_parity_pow_gate():
582582
}
583583
],
584584
},
585-
metadata={'measurements': '[{}]', 'qubit_numbers': '[2]'},
585+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([2])},
586586
settings={},
587587
compilation={},
588588
error_mitigation={},
@@ -626,7 +626,7 @@ def test_serialize_many_circuits_cnot_gate():
626626
'qubits': 2,
627627
'circuits': [{'circuit': [{'gate': 'cnot', 'control': 0, 'target': 1}]}],
628628
},
629-
metadata={'measurements': '[{}]', 'qubit_numbers': '[2]'},
629+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([2])},
630630
settings={},
631631
compilation={},
632632
error_mitigation={},
@@ -670,7 +670,7 @@ def test_serialize_many_circuits_swap_gate():
670670
'qubits': 2,
671671
'circuits': [{'circuit': [{'gate': 'swap', 'targets': [0, 1]}]}],
672672
},
673-
metadata={'measurements': '[{}]', 'qubit_numbers': '[2]'},
673+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([2])},
674674
settings={},
675675
compilation={},
676676
error_mitigation={},
@@ -766,7 +766,7 @@ def test_serialize_many_circuits_pauli_string_phasor_gate():
766766
},
767767
],
768768
},
769-
metadata={'measurements': '[{}, {}]', 'qubit_numbers': '[4, 3]'},
769+
metadata={'measurements': json.dumps([{}, {}]), 'qubit_numbers': json.dumps([4, 3])},
770770
settings={},
771771
compilation={},
772772
error_mitigation={},
@@ -824,8 +824,8 @@ def test_serialize_many_circuits_measurement_gate():
824824
assert result == ionq.SerializedProgram(
825825
input={'gateset': 'native', 'qubits': 1, 'circuits': [{'circuit': []}]},
826826
metadata={
827-
'measurements': '[{"measurement0": "tomyheart\\u001f0"}]',
828-
'qubit_numbers': '[1]',
827+
'measurements': json.dumps([{"measurement0": f"tomyheart{chr(31)}0"}]),
828+
'qubit_numbers': json.dumps([1]),
829829
},
830830
settings={},
831831
compilation={},
@@ -859,8 +859,8 @@ def test_serialize_many_circuits_measurement_gate_target_order():
859859
assert result == ionq.SerializedProgram(
860860
input={'gateset': 'native', 'qubits': 3, 'circuits': [{'circuit': []}]},
861861
metadata={
862-
'measurements': '[{"measurement0": "tomyheart\\u001f2,0"}]',
863-
'qubit_numbers': '[3]',
862+
'measurements': json.dumps([{"measurement0": f"tomyheart{chr(31)}2,0"}]),
863+
'qubit_numbers': json.dumps([3]),
864864
},
865865
settings={},
866866
compilation={},
@@ -940,7 +940,7 @@ def test_serialize_many_circuits_native_gates():
940940
}
941941
],
942942
},
943-
metadata={'measurements': '[{}]', 'qubit_numbers': '[3]'},
943+
metadata={'measurements': json.dumps([{}]), 'qubit_numbers': json.dumps([3])},
944944
settings={},
945945
compilation={},
946946
error_mitigation={},
@@ -991,8 +991,8 @@ def test_serialize_many_circuits_measurement_gate_multiple_keys():
991991
assert result == ionq.SerializedProgram(
992992
input={'gateset': 'native', 'qubits': 2, 'circuits': [{'circuit': []}]},
993993
metadata={
994-
'measurements': '[{"measurement0": "a\\u001f0\\u001eb\\u001f1"}]',
995-
'qubit_numbers': '[2]',
994+
'measurements': json.dumps([{"measurement0": f"a{chr(31)}0{chr(30)}b{chr(31)}1"}]),
995+
'qubit_numbers': json.dumps([2]),
996996
},
997997
settings={},
998998
compilation={},

cirq-ionq/cirq_ionq/service_test.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,10 @@ def test_service_run_batch(target, expected_results1, expected_results2):
8080
'backend': target,
8181
'metadata': {
8282
'shots': '4',
83-
'measurements': (
84-
"[{\"measurement0\": \"a\\u001f0\"}, {\"measurement0\": \"b\\u001f0\"}]"
83+
'measurements': json.dumps(
84+
[{"measurement0": f"a{chr(31)}0"}, {"measurement0": f"b{chr(31)}0"}]
8585
),
86-
'qubit_numbers': '[1, 1]',
86+
'qubit_numbers': json.dumps([1, 1]),
8787
},
8888
'stats': {'qubits': '1'},
8989
}
@@ -115,8 +115,10 @@ def test_service_run_batch(target, expected_results1, expected_results2):
115115
# Serialization induces a float, so we don't validate full circuit.
116116
assert create_job_kwargs['serialized_program'].input['qubits'] == 1
117117
assert create_job_kwargs['serialized_program'].metadata == {
118-
'measurements': "[{\"measurement0\": \"a\\u001f0\"}, {\"measurement0\": \"b\\u001f0\"}]",
119-
'qubit_numbers': '[1, 1]',
118+
'measurements': json.dumps(
119+
[{"measurement0": f"a{chr(31)}0"}, {"measurement0": f"b{chr(31)}0"}]
120+
),
121+
'qubit_numbers': json.dumps([1, 1]),
120122
}
121123
assert create_job_kwargs['repetitions'] == 4
122124
assert create_job_kwargs['target'] == target
@@ -350,7 +352,7 @@ def test_run_batch_preserves_order(target):
350352
"qubits": "1",
351353
"metadata": {
352354
"shots": "1",
353-
"measurements": json.dumps([{"measurement0": f"{k}\u001f0"} for k in keys]),
355+
"measurements": json.dumps([{"measurement0": f"{k}{chr(31)}0"} for k in keys]),
354356
"qubit_numbers": json.dumps([1, 1, 1]),
355357
},
356358
}

dev_tools/notebooks/isolated_notebook_test.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,18 @@
4646
# by the notebooks in question when adding notebooks to this list.
4747
# For more information, please see the section "Lifecycle" in docs/dev/notebooks.md.
4848

49-
NOTEBOOKS_DEPENDING_ON_UNRELEASED_FEATURES: list[str] = []
49+
NOTEBOOKS_DEPENDING_ON_UNRELEASED_FEATURES: list[str] = [
50+
# needs https://github.com/quantumlib/Cirq/pull/7972
51+
'docs/hardware/pasqal/getting_started.ipynb'
52+
]
5053

5154
# By default all notebooks should be tested, however, this list contains exceptions to the rule
5255
# please always add a reason for skipping.
5356
SKIP_NOTEBOOKS = [
54-
# skipping vendor notebooks as we don't have auth sorted out
57+
# skipping vendor notebooks where we need to have auth sorted out
5558
'**/aqt/*.ipynb',
5659
'**/azure-quantum/*.ipynb',
5760
'**/ionq/*.ipynb',
58-
'**/pasqal/*.ipynb',
5961
# skipping quantum utility simulation (too large)
6062
'examples/advanced/*quantum_utility*',
6163
# tutorials that use QCS and arent skipped due to one or more cleared output cells
@@ -137,6 +139,9 @@ def _rewrite_and_run_notebook(notebook_path, cloned_env):
137139
notebook_file = os.path.basename(notebook_path)
138140
notebook_rel_dir = os.path.dirname(os.path.relpath(notebook_path, REPO_ROOT))
139141
out_path = f"out/{notebook_rel_dir}/{notebook_file[:-6]}.out.ipynb"
142+
# ensure papermill will have CLOUDSDK_CONFIG set per dev_tools/conftest.py
143+
env = {'CLOUDSDK_CONFIG': os.environ['CLOUDSDK_CONFIG'], 'PIP_CONFIG_FILE': '/dev/null'}
144+
assert os.path.isdir(env["CLOUDSDK_CONFIG"])
140145
notebook_env = cloned_env("isolated_notebook_tests", *PACKAGES)
141146

142147
notebook_file = os.path.basename(notebook_path)
@@ -145,9 +150,10 @@ def _rewrite_and_run_notebook(notebook_path, cloned_env):
145150

146151
REPO_ROOT.joinpath("out", notebook_rel_dir).mkdir(parents=True, exist_ok=True)
147152
cmd = f"""
148-
. ./bin/activate
149-
pip list
150-
papermill {rewritten_notebook_path} {REPO_ROOT/out_path}"""
153+
. ./bin/activate
154+
pip list
155+
papermill "{rewritten_notebook_path}" "{REPO_ROOT/out_path}"
156+
"""
151157
result = shell_tools.run(
152158
cmd,
153159
log_run_to_stderr=False,
@@ -158,7 +164,7 @@ def _rewrite_and_run_notebook(notebook_path, cloned_env):
158164
# Important to get rid of PYTHONPATH specifically, which contains
159165
# the Cirq repo path due to check/pytest. Also isolate the execution
160166
# from pip settings in local configuration files or environment.
161-
env={'PIP_CONFIG_FILE': '/dev/null'},
167+
env=env,
162168
)
163169

164170
if result.returncode != 0:

dev_tools/notebooks/notebook_test.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,10 @@
3434
from dev_tools.test_utils import only_on_posix
3535

3636
SKIP_NOTEBOOKS = [
37-
# skipping vendor notebooks as we don't have auth sorted out
37+
# skipping vendor notebooks where we need to have auth sorted out
3838
'**/aqt/*.ipynb',
3939
'**/azure-quantum/*.ipynb',
4040
'**/ionq/*.ipynb',
41-
'**/pasqal/*.ipynb',
4241
# skipping quantum utility simulation (too large)
4342
'examples/advanced/*quantum_utility*',
4443
# tutorials that use QCS and arent skipped due to one or more cleared output cells
@@ -118,7 +117,9 @@ def test_notebooks_against_cirq_head(
118117
out_path = f"out/{notebook_rel_dir}/{notebook_file[:-6]}.out.ipynb"
119118
rewritten_notebook_path = rewrite_notebook(notebook_path)
120119
papermill_flags = "--no-request-save-on-cell-execute --autosave-cell-every 0"
121-
cmd = f"papermill {rewritten_notebook_path} {REPO_ROOT/out_path} {papermill_flags}"
120+
cmd = f'papermill "{rewritten_notebook_path}" "{REPO_ROOT/out_path}" {papermill_flags}'
121+
# ensure papermill will have CLOUDSDK_CONFIG set per dev_tools/conftest.py
122+
assert os.path.isdir(env_with_temporary_pip_target["CLOUDSDK_CONFIG"])
122123

123124
REPO_ROOT.joinpath("out", notebook_rel_dir).mkdir(parents=True, exist_ok=True)
124125
result = shell_tools.run(

docs/hardware/pasqal/getting_started.ipynb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@
6262
"</table>"
6363
]
6464
},
65+
{
66+
"cell_type": "markdown",
67+
"metadata": {
68+
"id": "98bffd06e567"
69+
},
70+
"source": [
71+
"## Setup\n",
72+
"\n",
73+
"Note: this notebook relies on unreleased Cirq features. If you want to try these features, make sure you install cirq via `pip install --upgrade cirq~=1.0.dev`."
74+
]
75+
},
6576
{
6677
"cell_type": "code",
6778
"execution_count": null,
@@ -74,7 +85,7 @@
7485
" import cirq\n",
7586
"except ImportError:\n",
7687
" print(\"installing cirq...\")\n",
77-
" !pip install --quiet cirq\n",
88+
" !pip install --upgrade --quiet cirq~=1.0.dev\n",
7889
" print(\"installed cirq.\")\n",
7990
" import cirq\n",
8091
"import cirq_pasqal\n",

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ requires = ["setuptools >= 70.0.0"]
33
build-backend = "setuptools.build_meta"
44

55
[tool.black]
6+
fast = true
67
line-length = 100
78
target_version = ['py311', 'py312', 'py313', 'py314']
89
skip-string-normalization = true

0 commit comments

Comments
 (0)