iqm-pulla 8.1.0__tar.gz → 8.3.0__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.
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/CHANGELOG.rst +16 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/PKG-INFO +1 -1
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/pyproject.toml +8 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/dd.py +2 -2
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/standard_stages.py +12 -9
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/station_settings.py +7 -7
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/interface/compiler.py +15 -15
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/pulla.py +4 -4
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/quantum_architecture.py +2 -2
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils.py +4 -4
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils_qir.py +1 -1
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/PKG-INFO +1 -1
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/SOURCES.txt +1 -0
- iqm_pulla-8.3.0/tests/__init__.py +0 -0
- iqm_pulla-8.3.0/version.txt +1 -0
- iqm_pulla-8.1.0/version.txt +0 -1
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/AUTHORS.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/LICENSE.txt +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/MANIFEST.in +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/README.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/API.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Compilation Stages.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Configuration and Usage.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Custom Gates and Implementations.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Example - Compilation With Local Calibration Set.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Example - Executing QIR programs.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Example - Measuring T1.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Example - Randomized Benchmarking.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Example - Simple Dynamical Decoupling.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Quick Start.ipynb +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/_static/images/favicon.ico +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/_static/images/logo.png +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/_templates/autosummary-class-template.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/_templates/autosummary-module-template.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/authors.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/changelog.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/common_errors.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/conf.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/examples.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/index.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/license.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/migration_guide.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/readme.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/references.bib +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/references.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/user_guides.rst +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/requirements/base.in +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/requirements/base.txt +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/requirements/notebook.in +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/requirements/notebook.txt +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/requirements/qir.in +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/requirements/qir.txt +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/requirements/qiskit.in +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/requirements/qiskit.txt +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/setup.cfg +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/setup.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/__init__.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/__init__.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/circuit_compilation_request_handler.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/compiler.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/errors.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/interface/__init__.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/py.typed +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/__init__.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/calibration.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/interface.py +0 -0
- /iqm_pulla-8.1.0/tests/__init__.py → /iqm_pulla-8.3.0/src/iqm/pulla/py.typed +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils_cirq.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils_dd.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils_qiskit.py +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/dependency_links.txt +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/requires.txt +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/top_level.txt +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/tests/.pylintrc +0 -0
- {iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/tests/conftest.py +0 -0
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
Changelog
|
|
3
3
|
=========
|
|
4
4
|
|
|
5
|
+
Version 8.3.0 (2025-07-09)
|
|
6
|
+
==========================
|
|
7
|
+
|
|
8
|
+
Features
|
|
9
|
+
--------
|
|
10
|
+
|
|
11
|
+
- Enable mypy type checking in CI and add temporary type ignores to the source code. :issue:`SW-1615`
|
|
12
|
+
|
|
13
|
+
Version 8.2.0 (2025-07-02)
|
|
14
|
+
==========================
|
|
15
|
+
|
|
16
|
+
Bug fixes
|
|
17
|
+
---------
|
|
18
|
+
|
|
19
|
+
- Fix type errors raised by mypy.
|
|
20
|
+
|
|
5
21
|
Version 8.1.0 (2025-06-18)
|
|
6
22
|
==========================
|
|
7
23
|
|
|
@@ -21,6 +21,14 @@ file = "LICENSE.txt"
|
|
|
21
21
|
Documentation = "https://iqm-finland.github.io/docs/iqm-pulla/"
|
|
22
22
|
Homepage = "https://pypi.org/project/iqm-pulla/"
|
|
23
23
|
|
|
24
|
+
[tool.mypy]
|
|
25
|
+
explicit_package_bases = true
|
|
26
|
+
mypy_path = "$MYPY_CONFIG_FILE_DIR/src"
|
|
27
|
+
namespace_packages = true
|
|
28
|
+
[[tool.mypy.overrides]]
|
|
29
|
+
module = [ "iqm.data_definitions.*", "iqm.models.*", "daemon.*", "quimb.*", "qiskit.*", "qiskit_aer.*", "grpc.*", "lmfit.*", "emukit.*", "mockito.*", "sklearn.*", "dill.*", "uncertainties.*", "GPy.*", "pythonjsonlogger.*",]
|
|
30
|
+
ignore_missing_imports = true
|
|
31
|
+
|
|
24
32
|
[tool.ruff]
|
|
25
33
|
exclude = [ "*.ipynb", "*.rst",]
|
|
26
34
|
extend-include = [ "sub-setup-py.template",]
|
|
@@ -515,7 +515,7 @@ def insert_dd_sequences(
|
|
|
515
515
|
wait_duration = wait.duration
|
|
516
516
|
|
|
517
517
|
# NOTE: Duration is always calculated using "X"
|
|
518
|
-
prx_duration = _get_channel_segment(builder, prx.rx(math.pi), channel_name).duration
|
|
518
|
+
prx_duration = _get_channel_segment(builder, prx.rx(math.pi), channel_name).duration # type: ignore[attr-defined]
|
|
519
519
|
calculated_ratio = wait_duration / prx_duration
|
|
520
520
|
|
|
521
521
|
cpc_logger.debug(
|
|
@@ -531,7 +531,7 @@ def insert_dd_sequences(
|
|
|
531
531
|
# each PRX gate in the sequence must be implementable using a single drive channel segment
|
|
532
532
|
dd_segments = []
|
|
533
533
|
for theta, phi in prx_args:
|
|
534
|
-
seg = _get_channel_segment(builder, prx(theta, phi), channel_name)
|
|
534
|
+
seg = _get_channel_segment(builder, prx(theta, phi), channel_name) # type: ignore[arg-type]
|
|
535
535
|
dd_segments.append(seg)
|
|
536
536
|
|
|
537
537
|
cpc_logger.debug(
|
|
@@ -232,7 +232,7 @@ def _fix_implementation_and_locus(
|
|
|
232
232
|
inst.locus = locus
|
|
233
233
|
circuit_components.update(locus)
|
|
234
234
|
if op.arity == 2:
|
|
235
|
-
circuit_component_pairs.add(locus)
|
|
235
|
+
circuit_component_pairs.add(locus) # type: ignore[arg-type]
|
|
236
236
|
circuit_gate_loci.setdefault(inst.name, {}).setdefault(inst.implementation, Counter()).update([locus])
|
|
237
237
|
|
|
238
238
|
return CircuitMetrics(
|
|
@@ -274,7 +274,10 @@ def _build_readout_mappings(
|
|
|
274
274
|
|
|
275
275
|
# find out which components have measurement data
|
|
276
276
|
components_that_can_be_measured = frozenset(
|
|
277
|
-
q
|
|
277
|
+
q
|
|
278
|
+
for impl_loci in builder.calibration["measure"].values()
|
|
279
|
+
for locus in impl_loci
|
|
280
|
+
for q in locus # type: ignore[union-attr]
|
|
278
281
|
)
|
|
279
282
|
|
|
280
283
|
# Figure out which qubits should always be measured on the QPU in the final measurement.
|
|
@@ -411,22 +414,22 @@ def _get_op_calibration_errors(calibration: OpCalibrationDataTree, ops: QuantumO
|
|
|
411
414
|
# since OILCalibrationData can have nested dicts, we do a recursive diff
|
|
412
415
|
error = diff_dicts(merge_dicts(default_cal_data, cal_data), impl.parameters, [])
|
|
413
416
|
if error is not None:
|
|
414
|
-
errors[(op_name, impl_name, locus)] = error
|
|
417
|
+
errors[(op_name, impl_name, locus)] = error # type: ignore[index]
|
|
415
418
|
continue
|
|
416
419
|
|
|
417
420
|
n_components = len(locus)
|
|
418
421
|
arity = op.arity
|
|
419
422
|
if arity == 0:
|
|
420
423
|
if n_components != 1:
|
|
421
|
-
errors[(op_name, impl_name, locus)] = (
|
|
424
|
+
errors[(op_name, impl_name, locus)] = ( # type: ignore[index]
|
|
422
425
|
f"{op_name}.{impl_name} at {locus}: for zero-arity operations, "
|
|
423
426
|
"calibration data must be provided for single-component loci only"
|
|
424
427
|
)
|
|
425
428
|
elif n_components != arity:
|
|
426
|
-
errors[(op_name, impl_name, locus)] = (
|
|
429
|
+
errors[(op_name, impl_name, locus)] = ( # type: ignore[index]
|
|
427
430
|
f"{op_name}.{impl_name} at {locus}: locus must have {arity} component(s)"
|
|
428
431
|
)
|
|
429
|
-
return errors
|
|
432
|
+
return errors # type: ignore[return-value]
|
|
430
433
|
|
|
431
434
|
|
|
432
435
|
def merge_multiplexed_timeboxes(circuit_box: TimeBox) -> TimeBox:
|
|
@@ -469,7 +472,7 @@ def merge_multiplexed_timeboxes(circuit_box: TimeBox) -> TimeBox:
|
|
|
469
472
|
if pending:
|
|
470
473
|
if disjoint_boxes(pending, gate_box):
|
|
471
474
|
# Pending box and new candidate have disjoint loci, merge is possible.
|
|
472
|
-
pending = pending + gate_box.children[0]
|
|
475
|
+
pending = pending + gate_box.children[0] # type: ignore[assignment]
|
|
473
476
|
continue
|
|
474
477
|
# Pending box collides with the new candidate, so we must place it immediately and continue with
|
|
475
478
|
# the new candidate.
|
|
@@ -480,7 +483,7 @@ def merge_multiplexed_timeboxes(circuit_box: TimeBox) -> TimeBox:
|
|
|
480
483
|
if pending and not disjoint_boxes(pending, gate_box):
|
|
481
484
|
placed_boxes.append(pending)
|
|
482
485
|
pending = None
|
|
483
|
-
placed_boxes.append(gate_box)
|
|
486
|
+
placed_boxes.append(gate_box) # type: ignore[arg-type]
|
|
484
487
|
|
|
485
488
|
if pending:
|
|
486
489
|
placed_boxes.append(pending)
|
|
@@ -540,7 +543,7 @@ def map_components(
|
|
|
540
543
|
_map_components_in_instructions(
|
|
541
544
|
component_mapping,
|
|
542
545
|
c.instructions,
|
|
543
|
-
device_components=device_components,
|
|
546
|
+
device_components=device_components, # type: ignore[arg-type]
|
|
544
547
|
)
|
|
545
548
|
except CircuitError as exc:
|
|
546
549
|
raise CircuitError(f"Circuit {idx}: {exc}") from exc
|
|
@@ -140,7 +140,7 @@ def find_observation(
|
|
|
140
140
|
obs_value = calibration_set.get(observation_path)
|
|
141
141
|
if obs_value is None and required:
|
|
142
142
|
raise CalibrationError(f"Missing calibration observation: {observation_path}")
|
|
143
|
-
return obs_value
|
|
143
|
+
return obs_value # type: ignore[return-value]
|
|
144
144
|
|
|
145
145
|
|
|
146
146
|
# TODO until station type records (defining the instrumentation for each chip component) are available,
|
|
@@ -363,28 +363,28 @@ def build_station_settings(
|
|
|
363
363
|
# Then add the required static settings for circuit execution.
|
|
364
364
|
for qubit in circuit_qubits:
|
|
365
365
|
apply_observations(qubit, _per_qubit)
|
|
366
|
-
_apply_static_settings(qubit, _per_qubit_static, root)
|
|
366
|
+
_apply_static_settings(qubit, _per_qubit_static, root) # type: ignore[arg-type]
|
|
367
367
|
if qubit in flux_pulsed_qubits:
|
|
368
368
|
apply_observations(qubit, _per_flux_pulsed_qubit)
|
|
369
|
-
_apply_static_settings(qubit, _per_flux_pulsed_qubit_static, root)
|
|
369
|
+
_apply_static_settings(qubit, _per_flux_pulsed_qubit_static, root) # type: ignore[arg-type]
|
|
370
370
|
|
|
371
371
|
for coupler in circuit_couplers:
|
|
372
372
|
apply_observations(coupler, _per_coupler)
|
|
373
|
-
_apply_static_settings(coupler, _per_coupler_static, root)
|
|
373
|
+
_apply_static_settings(coupler, _per_coupler_static, root) # type: ignore[arg-type]
|
|
374
374
|
|
|
375
375
|
for pl in measured_probe_lines:
|
|
376
376
|
apply_observations(pl, _per_probe_line)
|
|
377
|
-
_apply_static_settings(pl, _per_probe_line_static, root)
|
|
377
|
+
_apply_static_settings(pl, _per_probe_line_static, root) # type: ignore[arg-type]
|
|
378
378
|
|
|
379
379
|
for qubit in boundary_qubits:
|
|
380
380
|
apply_observations(qubit, _per_boundary_qubit)
|
|
381
381
|
_apply_static_settings(qubit, _per_boundary_qubit_static, root)
|
|
382
382
|
if qubit in flux_pulsed_qubits:
|
|
383
|
-
_apply_static_settings(qubit, _per_boundary_flux_pulsed_qubit_static, root)
|
|
383
|
+
_apply_static_settings(qubit, _per_boundary_flux_pulsed_qubit_static, root) # type: ignore[arg-type]
|
|
384
384
|
|
|
385
385
|
for coupler in boundary_couplers:
|
|
386
386
|
apply_observations(coupler, _per_boundary_coupler)
|
|
387
|
-
_apply_static_settings(coupler, _per_boundary_coupler_static, root)
|
|
387
|
+
_apply_static_settings(coupler, _per_boundary_coupler_static, root) # type: ignore[arg-type]
|
|
388
388
|
|
|
389
389
|
# QPU-wide options
|
|
390
390
|
apply_observations("", _per_qpu)
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
from collections import Counter
|
|
17
17
|
from dataclasses import dataclass, field
|
|
18
18
|
from enum import StrEnum
|
|
19
|
-
from typing import
|
|
19
|
+
from typing import TypeAlias
|
|
20
20
|
|
|
21
21
|
from exa.common.data.setting_node import SettingNode
|
|
22
22
|
from iqm.pulse.builder import CircuitOperation, Locus
|
|
@@ -44,10 +44,10 @@ class MeasurementMode(StrEnum):
|
|
|
44
44
|
Measurement results which are not required by the circuits to be executed are discarded.
|
|
45
45
|
"""
|
|
46
46
|
|
|
47
|
-
CIRCUIT
|
|
47
|
+
CIRCUIT = "circuit"
|
|
48
48
|
"""In each circuit separately, measure only the components that have final measurement
|
|
49
49
|
operations on them."""
|
|
50
|
-
ALL
|
|
50
|
+
ALL = "all"
|
|
51
51
|
"""Measure all the components on the QPU that have measurement data in the calset.
|
|
52
52
|
This is typically how measurement is calibrated."""
|
|
53
53
|
|
|
@@ -55,9 +55,9 @@ class MeasurementMode(StrEnum):
|
|
|
55
55
|
class HeraldingMode(StrEnum):
|
|
56
56
|
"""Heralding mode for circuit execution."""
|
|
57
57
|
|
|
58
|
-
NONE
|
|
58
|
+
NONE = "none"
|
|
59
59
|
"""Do not do any heralding."""
|
|
60
|
-
ZEROS
|
|
60
|
+
ZEROS = "zeros"
|
|
61
61
|
"""Perform a heralding measurement on all the components used in each circuit (if they have
|
|
62
62
|
measurement data available in the calset), only retain shots where all the components
|
|
63
63
|
are measured to be in the zero state."""
|
|
@@ -66,9 +66,9 @@ class HeraldingMode(StrEnum):
|
|
|
66
66
|
class DDMode(StrEnum):
|
|
67
67
|
"""Dynamical Decoupling (DD) mode for circuit execution."""
|
|
68
68
|
|
|
69
|
-
DISABLED
|
|
69
|
+
DISABLED = "disabled"
|
|
70
70
|
"""Do not apply dynamical decoupling."""
|
|
71
|
-
ENABLED
|
|
71
|
+
ENABLED = "enabled"
|
|
72
72
|
"""Apply dynamical decoupling."""
|
|
73
73
|
|
|
74
74
|
|
|
@@ -127,7 +127,7 @@ class DDStrategy:
|
|
|
127
127
|
class CircuitBoundaryMode(StrEnum):
|
|
128
128
|
"""Circuit boundary mode for circuit compilation."""
|
|
129
129
|
|
|
130
|
-
NEIGHBOUR
|
|
130
|
+
NEIGHBOUR = "neighbour"
|
|
131
131
|
"""
|
|
132
132
|
Circuit boundary consists of those QPU elements (qubits and couplers) that
|
|
133
133
|
are adjacent to the qubits and couplers used by the circuit, but do not belong to them.
|
|
@@ -136,33 +136,33 @@ class CircuitBoundaryMode(StrEnum):
|
|
|
136
136
|
* Boundary qubits are connected to a circuit qubit by any coupler, but are not circuit qubits themselves.
|
|
137
137
|
* Boundary couplers are connected to at least one circuit qubit, but are not used in the circuit themselves.
|
|
138
138
|
"""
|
|
139
|
-
ALL
|
|
139
|
+
ALL = "all"
|
|
140
140
|
"""Circuit boundary consists of all the QPU elements that are not used in the circuit."""
|
|
141
141
|
|
|
142
142
|
|
|
143
143
|
class MoveGateValidationMode(StrEnum):
|
|
144
144
|
"""MOVE gate validation mode for circuit compilation."""
|
|
145
145
|
|
|
146
|
-
STRICT
|
|
146
|
+
STRICT = "strict"
|
|
147
147
|
"""Perform standard MOVE gate validation: MOVE(qubit, resonator) gates must only
|
|
148
148
|
appear in sandwiches (pairs). Inside a sandwich there must be no gates acting on the
|
|
149
149
|
MOVE qubit, and no other MOVE gates acting on the resonator."""
|
|
150
|
-
ALLOW_PRX
|
|
150
|
+
ALLOW_PRX = "allow_prx"
|
|
151
151
|
"""Allow PRX gates on the MOVE qubit inside MOVE sandwiches during validation."""
|
|
152
|
-
NONE
|
|
152
|
+
NONE = "none"
|
|
153
153
|
"""Do not perform any MOVE gate validation."""
|
|
154
154
|
|
|
155
155
|
|
|
156
156
|
class MoveGateFrameTrackingMode(StrEnum):
|
|
157
157
|
"""MOVE gate frame tracking mode for circuit compilation."""
|
|
158
158
|
|
|
159
|
-
FULL
|
|
159
|
+
FULL = "full"
|
|
160
160
|
"""Perform complete MOVE gate frame tracking, applying both the explicit z rotations
|
|
161
161
|
on the resonator and the dynamic phase correction due to qubit-resonator detuning to
|
|
162
162
|
the qubit at the end of a MOVE sandwich."""
|
|
163
|
-
NO_DETUNING_CORRECTION
|
|
163
|
+
NO_DETUNING_CORRECTION = "no_detuning_correction"
|
|
164
164
|
"""Do not apply the detuning correction at the end of a MOVE sandwich."""
|
|
165
|
-
NONE
|
|
165
|
+
NONE = "none"
|
|
166
166
|
"""Do not perform any MOVE gate frame tracking."""
|
|
167
167
|
|
|
168
168
|
|
|
@@ -251,10 +251,10 @@ class Pulla:
|
|
|
251
251
|
sweep_data = self._station_control.get_sweep(job_id)
|
|
252
252
|
sc_result = StationControlResult(sweep_id=job_id, task_id=job_id, status=TaskStatus.PENDING)
|
|
253
253
|
|
|
254
|
-
if sweep_data.job_status <= JobExecutorStatus.EXECUTION_STARTED:
|
|
254
|
+
if sweep_data.job_status <= JobExecutorStatus.EXECUTION_STARTED: # type: ignore[operator]
|
|
255
255
|
# Wait in the task queue while showing a progress bar
|
|
256
256
|
|
|
257
|
-
interrupted = self._station_control._wait_job_completion(str(job_id), get_progress_bar_callback())
|
|
257
|
+
interrupted = self._station_control._wait_job_completion(str(job_id), get_progress_bar_callback()) # type: ignore[attr-defined]
|
|
258
258
|
if interrupted:
|
|
259
259
|
raise KeyboardInterrupt
|
|
260
260
|
|
|
@@ -285,7 +285,7 @@ class Pulla:
|
|
|
285
285
|
)
|
|
286
286
|
sc_result.end_time = sweep_data.end_timestamp.isoformat() if sweep_data.end_timestamp else None
|
|
287
287
|
job = self._station_control.get_job(job_id)
|
|
288
|
-
sc_result.message = job["job_error"]
|
|
288
|
+
sc_result.message = job["job_error"] # type: ignore[index]
|
|
289
289
|
logger.error("Submission failed! Error: %s", sc_result.message)
|
|
290
290
|
return sc_result
|
|
291
291
|
|
|
@@ -296,7 +296,7 @@ class Pulla:
|
|
|
296
296
|
)
|
|
297
297
|
sc_result.end_time = sweep_data.end_timestamp.isoformat() if sweep_data.end_timestamp else None
|
|
298
298
|
job = self._station_control.get_job(job_id)
|
|
299
|
-
sc_result.message = job["job_error"]
|
|
299
|
+
sc_result.message = job["job_error"] # type: ignore[index]
|
|
300
300
|
logger.error("Submission was revoked!")
|
|
301
301
|
return sc_result
|
|
302
302
|
|
|
@@ -40,8 +40,8 @@ def create_static_quantum_architecture(chip_topology: ChipTopology) -> StaticQua
|
|
|
40
40
|
# The components in each connection are already sorted, now we sort the connections
|
|
41
41
|
connectivity = sorted(unsorted_connections, key=sort_key)
|
|
42
42
|
return StaticQuantumArchitecture(
|
|
43
|
-
qubits=chip_topology.qubits_sorted,
|
|
44
|
-
computational_resonators=chip_topology.computational_resonators_sorted,
|
|
43
|
+
qubits=chip_topology.qubits_sorted, # type: ignore[arg-type]
|
|
44
|
+
computational_resonators=chip_topology.computational_resonators_sorted, # type: ignore[arg-type]
|
|
45
45
|
connectivity=connectivity,
|
|
46
46
|
)
|
|
47
47
|
|
|
@@ -421,7 +421,7 @@ def calset_to_cal_data_tree(calibration_set: CalibrationSet) -> OpCalibrationDat
|
|
|
421
421
|
locus = tuple(path[3].split(LOCUS_SEPARATOR))
|
|
422
422
|
locus = () if locus == ("",) else locus
|
|
423
423
|
# mypy likes this
|
|
424
|
-
set_path(tree.setdefault(path[1], {}).setdefault(path[2], {}).setdefault(locus, {}), path[4:], value)
|
|
424
|
+
set_path(tree.setdefault(path[1], {}).setdefault(path[2], {}).setdefault(locus, {}), path[4:], value) # type: ignore[arg-type]
|
|
425
425
|
return tree
|
|
426
426
|
|
|
427
427
|
|
|
@@ -483,7 +483,7 @@ def _update_channel_props_from_calibration(
|
|
|
483
483
|
f"No calibration value found for the center frequency or local oscillator frequency of {component}."
|
|
484
484
|
)
|
|
485
485
|
channel_name = channels["readout"]
|
|
486
|
-
replacements[channel_name] = replace(channel_properties[channel_name], center_frequency=center_frequency)
|
|
486
|
+
replacements[channel_name] = replace(channel_properties[channel_name], center_frequency=center_frequency) # type: ignore[call-arg]
|
|
487
487
|
|
|
488
488
|
return channel_properties | replacements
|
|
489
489
|
|
|
@@ -518,8 +518,8 @@ def find_circuit_boundary(
|
|
|
518
518
|
}
|
|
519
519
|
elif mode == CircuitBoundaryMode.ALL:
|
|
520
520
|
# maybe safer/better: all unused locus components/couplers are considered boundary
|
|
521
|
-
boundary_components = (device.qubits | device.computational_resonators) - circuit_components
|
|
522
|
-
boundary_couplers = device.couplers - circuit_couplers
|
|
521
|
+
boundary_components = (device.qubits | device.computational_resonators) - circuit_components # type: ignore[assignment]
|
|
522
|
+
boundary_couplers = device.couplers - circuit_couplers # type: ignore[assignment]
|
|
523
523
|
else:
|
|
524
524
|
raise UnknownCircuitExecutionOptionError(f"Unknown circuit boundary mode '{str(mode)}'")
|
|
525
525
|
return boundary_components, boundary_couplers
|
|
@@ -111,7 +111,7 @@ def _gate_inst_to_str(inst: Call) -> CircuitOperation | None:
|
|
|
111
111
|
try:
|
|
112
112
|
qir_logger.debug("Processing %s with args: %s", operation, inst.args)
|
|
113
113
|
params = operation_handlers[operation](inst.args)
|
|
114
|
-
return CircuitOperation(**params)
|
|
114
|
+
return CircuitOperation(**params) # type: ignore[arg-type] # type: ignore[arg-type] # type: ignore[arg-type] # type: ignore[arg-type]
|
|
115
115
|
except (IndexError, ValueError, AttributeError) as e:
|
|
116
116
|
qir_logger.error("Error processing operation %s: %s", operation, e)
|
|
117
117
|
raise ValueError(f"Error processing operation {operation}: {e}") from e
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
8.3.0
|
iqm_pulla-8.1.0/version.txt
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
8.1.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/docs/Example - Compilation With Local Calibration Set.ipynb
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
|
|
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
|
{iqm_pulla-8.1.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/circuit_compilation_request_handler.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
|