iqm-pulse 10.4.0__tar.gz → 11.0.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.
Files changed (82) hide show
  1. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/CHANGELOG.rst +16 -0
  2. {iqm_pulse-10.4.0/src/iqm_pulse.egg-info → iqm_pulse-11.0.0}/PKG-INFO +1 -1
  3. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/pyproject.toml +3 -3
  4. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/base_utils.py +1 -1
  5. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/builder.py +1 -1
  6. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/circuit_operations.py +7 -7
  7. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/default_gates.py +10 -1
  8. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/reset.py +3 -9
  9. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/rz.py +1 -1
  10. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/channel.py +1 -1
  11. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/instructions.py +3 -3
  12. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/schedule.py +3 -3
  13. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/visualisation/base.py +2 -2
  14. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/waveforms.py +1 -1
  15. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/validation.py +3 -3
  16. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0/src/iqm_pulse.egg-info}/PKG-INFO +1 -1
  17. iqm_pulse-11.0.0/version.txt +1 -0
  18. iqm_pulse-10.4.0/version.txt +0 -1
  19. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/LICENSE.txt +0 -0
  20. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/MANIFEST.in +0 -0
  21. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/README.rst +0 -0
  22. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/API.rst +0 -0
  23. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/Makefile +0 -0
  24. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_static/.gitignore +0 -0
  25. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_static/css/custom.css +0 -0
  26. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_static/images/favicon.ico +0 -0
  27. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_static/images/feedback_timing.svg +0 -0
  28. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_static/images/logo.png +0 -0
  29. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_static/images/playlist_breakdown.svg +0 -0
  30. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_static/images/pulse_timing.svg +0 -0
  31. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_static/images/readout_timing.svg +0 -0
  32. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_templates/autosummary-class-template.rst +0 -0
  33. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/_templates/autosummary-module-template.rst +0 -0
  34. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/changelog.rst +0 -0
  35. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/concepts.rst +0 -0
  36. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/conf.py +0 -0
  37. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/custom_gates.rst +0 -0
  38. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/index.rst +0 -0
  39. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/license.rst +0 -0
  40. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/pulse_timing.rst +0 -0
  41. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/references.bib +0 -0
  42. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/references.rst +0 -0
  43. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/docs/using_builder.rst +0 -0
  44. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/requirements/base.in +0 -0
  45. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/requirements/base.txt +0 -0
  46. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/setup.cfg +0 -0
  47. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/setup.py +0 -0
  48. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/__init__.py +0 -0
  49. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gate_implementation.py +0 -0
  50. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/__init__.py +0 -0
  51. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/barrier.py +0 -0
  52. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/conditional.py +0 -0
  53. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/cz.py +0 -0
  54. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/delay.py +0 -0
  55. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/enums.py +0 -0
  56. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/flux_multiplexer.py +0 -0
  57. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/measure.py +0 -0
  58. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/move.py +0 -0
  59. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/prx.py +0 -0
  60. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/sx.py +0 -0
  61. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/gates/u.py +0 -0
  62. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/__init__.py +0 -0
  63. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/fast_drag.py +0 -0
  64. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/hd_drag.py +0 -0
  65. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/playlist.py +0 -0
  66. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/visualisation/__init__.py +0 -0
  67. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/visualisation/templates/playlist_inspection.jinja2 +0 -0
  68. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/visualisation/templates/static/logo.png +0 -0
  69. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/visualisation/templates/static/moment.min.js +0 -0
  70. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/visualisation/templates/static/vis-timeline-graph2d.min.css +0 -0
  71. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/playlist/visualisation/templates/static/vis-timeline-graph2d.min.js +0 -0
  72. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/py.typed +0 -0
  73. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/quantum_ops.py +0 -0
  74. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/scheduler.py +0 -0
  75. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/timebox.py +0 -0
  76. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm/pulse/utils.py +0 -0
  77. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm_pulse.egg-info/SOURCES.txt +0 -0
  78. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm_pulse.egg-info/dependency_links.txt +0 -0
  79. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm_pulse.egg-info/requires.txt +0 -0
  80. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/src/iqm_pulse.egg-info/top_level.txt +0 -0
  81. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/tests/.pylintrc +0 -0
  82. {iqm_pulse-10.4.0 → iqm_pulse-11.0.0}/tests/__init__.py +0 -0
@@ -2,6 +2,22 @@
2
2
  Changelog
3
3
  =========
4
4
 
5
+ Version 11.0.0 (2025-09-08)
6
+ ===========================
7
+
8
+ Features
9
+ --------
10
+
11
+ - Split the measure QuantumOp into measure (QND mid-circuit-measure) and measure_fidelity (terminal measure that might not be QND)
12
+
13
+ Version 10.5.0 (2025-09-03)
14
+ ===========================
15
+
16
+ Features
17
+ --------
18
+
19
+ - Enable ruff rule for missing annotations and mark exemptions.
20
+
5
21
  Version 10.4.0 (2025-08-12)
6
22
  ===========================
7
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-pulse
3
- Version: 10.4.0
3
+ Version: 11.0.0
4
4
  Summary: A Python-based project for providing interface and implementations for control pulses.
5
5
  Author-email: IQM Finland Oy <info@meetiqm.com>
6
6
  License: Apache License
@@ -52,7 +52,7 @@ nb_diff_ignore = [ "/metadata/language_info", "/metadata/widgets", "/cells/*/exe
52
52
 
53
53
  [tool.ruff.lint]
54
54
  ignore = [ "D203", "D213",]
55
- select = [ "E4", "E7", "E9", "E5", "F", "Q", "PL", "I", "D", "UP007", "UP006", "UP035",]
55
+ select = [ "E4", "E7", "E9", "E5", "F", "Q", "PL", "I", "D", "UP007", "UP006", "UP035", "ANN001", "ANN201", "ANN202",]
56
56
  unfixable = [ "F401",]
57
57
 
58
58
  [tool.ruff.lint.isort]
@@ -65,9 +65,9 @@ relative-imports-order = "closest-to-furthest"
65
65
  [tool.ruff.lint.per-file-ignores]
66
66
  "**/__init__.py" = [ "F401", "PLR0402",]
67
67
  "**/docs/*" = [ "E402", "D100",]
68
- "**/setup.py" = [ "D100", "D103", "I001",]
68
+ "**/setup.py" = [ "D100", "D103", "I001", "ANN201",]
69
69
  "**/src/*" = [ "PLR2004", "D400", "D415", "D205", "D401", "D417", "D100", "D101", "D107", "D102", "D105", "D103", "D404", "D104",]
70
- "**/tests/*" = [ "F632", "PLR2004", "PLR0402", "PLC0414", "D",]
70
+ "**/tests/*" = [ "F632", "PLR2004", "PLR0402", "PLC0414", "D", "ANN001", "ANN201", "ANN202",]
71
71
 
72
72
  [tool.ruff.lint.pylint]
73
73
  max-args = 8
@@ -24,7 +24,7 @@ from typing import Any
24
24
  import numpy as np
25
25
 
26
26
 
27
- def merge_dicts(A: dict, B: dict, path=(), merge_nones: bool = True) -> dict:
27
+ def merge_dicts(A: dict, B: dict, path=(), merge_nones: bool = True) -> dict: # noqa: ANN001
28
28
  """Merge two dictionaries recursively, leaving the originals unchanged.
29
29
 
30
30
  Args:
@@ -1496,7 +1496,7 @@ class ScheduleBuilder:
1496
1496
  """
1497
1497
 
1498
1498
  def _shortcut_mthd(
1499
- self,
1499
+ self, # noqa: ANN001
1500
1500
  locus: Iterable[str],
1501
1501
  impl_name: str | None = None,
1502
1502
  *,
@@ -145,7 +145,7 @@ def get_unitary_from_circuit(
145
145
  return unitary
146
146
 
147
147
 
148
- def _get_qubit_order_from_circuit(circuit: list[CircuitOperation]):
148
+ def _get_qubit_order_from_circuit(circuit: list[CircuitOperation]): # noqa: ANN202
149
149
  """Get all qubits which are in the circuit in order."""
150
150
  # unique items, in the same order
151
151
  return list(dict.fromkeys(qb for op in circuit for qb in op.locus))
@@ -278,7 +278,7 @@ class CircuitOperationList(list):
278
278
  if self.table[op_name].arity:
279
279
  self._set_specific_operation_shortcut(op_name)
280
280
 
281
- def __getitem__(self, item) -> CircuitOperationList | CircuitOperation: # type: ignore[override] # type: ignore[override] # type: ignore[override]
281
+ def __getitem__(self, item) -> CircuitOperationList | CircuitOperation: # type: ignore[override] # type: ignore[override] # type: ignore[override] # noqa: ANN001
282
282
  """For the builtin list, this method is used both for accessing a single element: ``mylist[0]`` and accessing
283
283
  a slice: ``mylist[1:3]``. The latter should generate a new CircuitOperationList, so we override the method to
284
284
  ensure that it does.
@@ -290,12 +290,12 @@ class CircuitOperationList(list):
290
290
 
291
291
  return result
292
292
 
293
- def __add__(self, other) -> CircuitOperationList:
293
+ def __add__(self, other) -> CircuitOperationList: # noqa: ANN001
294
294
  new = CircuitOperationList(list.__add__(self, other), qubits=self.qubits, table=self.table)
295
295
 
296
296
  return new
297
297
 
298
- def __mul__(self, other) -> CircuitOperationList:
298
+ def __mul__(self, other) -> CircuitOperationList: # noqa: ANN001
299
299
  new = CircuitOperationList(list.__mul__(self, other), qubits=self.qubits, table=self.table)
300
300
  return new
301
301
 
@@ -377,7 +377,7 @@ class CircuitOperationList(list):
377
377
 
378
378
  def compose(
379
379
  self,
380
- other,
380
+ other, # noqa: ANN001
381
381
  locus_indices: list[int] | None = None,
382
382
  ) -> Self:
383
383
  """A safer way to add circuits together, but will probably take time.
@@ -482,8 +482,8 @@ class CircuitOperationList(list):
482
482
  num_params = len(op.params)
483
483
  arity = op.arity
484
484
 
485
- def _add_specific_op(
486
- self,
485
+ def _add_specific_op( # noqa: ANN202
486
+ self, # noqa: ANN001
487
487
  *args_and_locus,
488
488
  impl_name: str | None = None,
489
489
  ):
@@ -68,7 +68,9 @@ _implementation_library: dict[str, dict[str, type[GateImplementation]]] = {
68
68
  "delay": {"wait": Delay},
69
69
  "measure": {
70
70
  "constant": Measure_Constant,
71
- "constant_qnd": Measure_Constant,
71
+ },
72
+ "measure_fidelity": {
73
+ "constant": Measure_Constant,
72
74
  "shelved_constant": Shelved_Measure_Constant,
73
75
  },
74
76
  "prx": {
@@ -134,6 +136,13 @@ _quantum_ops_library = {
134
136
  implementations=_implementation_library["measure"],
135
137
  factorizable=True,
136
138
  ),
139
+ QuantumOp(
140
+ "measure_fidelity",
141
+ 0,
142
+ ("key",),
143
+ implementations=_implementation_library["measure_fidelity"],
144
+ factorizable=True,
145
+ ),
137
146
  QuantumOp(
138
147
  "prx",
139
148
  1,
@@ -62,15 +62,9 @@ class Reset_Conditional(CompositeGate):
62
62
  for q in self.locus
63
63
  if "drive" in self.builder.component_channels[q] and q in self.builder.chip_topology.component_to_probe_line
64
64
  )
65
- # try to get a qnd measurement, otherwise use default one
66
- try: # TODO: should the QND measurement be its own QuantumOp instead?
67
- probe_timebox = self.build("measure", resettable, impl_name="constant_qnd").probe_timebox( # type: ignore[attr-defined]
68
- RESET_MEASUREMENT_KEY, feedback_key=RESET_FEEDBACK_KEY
69
- )
70
- except (ValueError, KeyError):
71
- probe_timebox = self.build("measure", resettable).probe_timebox( # type: ignore[attr-defined]
72
- RESET_MEASUREMENT_KEY, feedback_key=RESET_FEEDBACK_KEY
73
- )
65
+ probe_timebox = self.build("measure", resettable).probe_timebox( # type: ignore[attr-defined]
66
+ RESET_MEASUREMENT_KEY, feedback_key=RESET_FEEDBACK_KEY
67
+ )
74
68
  virtual_channels = set()
75
69
  probes = set()
76
70
  resets = []
@@ -253,7 +253,7 @@ class RZ_PRX_Composite(CompositeGate):
253
253
 
254
254
  registered_gates = ("prx",)
255
255
 
256
- def __init__(self, parent, name, locus, calibration_data, builder):
256
+ def __init__(self, parent, name, locus, calibration_data, builder): # noqa: ANN001
257
257
  super().__init__(parent, name, locus, calibration_data, builder)
258
258
 
259
259
  def __call__(self, angle: float) -> TimeBox:
@@ -272,7 +272,7 @@ class ChannelDescription:
272
272
  self.waveform_table.append(wave)
273
273
  return idx
274
274
 
275
- def _lookup_or_insert_instruction(self, instruction) -> int:
275
+ def _lookup_or_insert_instruction(self, instruction) -> int: # noqa: ANN001
276
276
  new_idx = len(self.instruction_table)
277
277
  idx = self._reverse_instruction_index.setdefault(instruction, new_idx)
278
278
  if idx == new_idx:
@@ -103,7 +103,7 @@ class RealPulse(Instruction):
103
103
  scale: float
104
104
  """Scaling factor for the waveform."""
105
105
 
106
- def validate(self):
106
+ def validate(self): # noqa: ANN201
107
107
  super().validate()
108
108
  if abs(self.scale) > 1.0:
109
109
  raise ValueError(f"RealPulse.scale {self.scale} not in [-1, 1].")
@@ -149,7 +149,7 @@ class IQPulse(Instruction):
149
149
  all pulses that are played after it on the channel, in radians.
150
150
  """
151
151
 
152
- def validate(self):
152
+ def validate(self): # noqa: ANN201
153
153
  super().validate()
154
154
  if abs(self.scale_i) > 1.0:
155
155
  raise ValueError(f"IQPulse.scale_i {self.scale_i} not in [-1, 1].")
@@ -169,7 +169,7 @@ class ConditionalInstruction(Instruction):
169
169
  outcomes: tuple[Instruction, ...]
170
170
  """Maps possible outcomes of the condition to the corresponding instructions."""
171
171
 
172
- def validate(self):
172
+ def validate(self): # noqa: ANN201
173
173
  super().validate()
174
174
  if not self.outcomes:
175
175
  raise ValueError("There must be at least one outcome.")
@@ -78,7 +78,7 @@ class Segment:
78
78
  def __len__(self) -> int:
79
79
  return len(self._instructions)
80
80
 
81
- def __getitem__(self, key):
81
+ def __getitem__(self, key): # noqa: ANN001
82
82
  return self._instructions[key]
83
83
 
84
84
  def __reversed__(self):
@@ -229,7 +229,7 @@ class Schedule:
229
229
  s += "|\n"
230
230
  return s
231
231
 
232
- def items(self):
232
+ def items(self): # noqa: ANN201
233
233
  """Iterator over the schedule channel names and segments."""
234
234
  return self._contents.items()
235
235
 
@@ -313,7 +313,7 @@ class Schedule:
313
313
  }
314
314
  return self
315
315
 
316
- def front_pad_in_seconds(self, to_duration: float, channel_properties: dict[str, ChannelProperties]):
316
+ def front_pad_in_seconds(self, to_duration: float, channel_properties: dict[str, ChannelProperties]): # noqa: ANN201
317
317
  """Modifies the schedule in place by front-padding it with :class:`.Wait` instructions.
318
318
 
319
319
  The new duration is given in seconds, and this method works also with variable sample rates.
@@ -31,7 +31,7 @@ import numpy as np
31
31
  from iqm.pulse.playlist.playlist import Playlist
32
32
 
33
33
 
34
- def _numpy_to_builtin_types(data: list[tuple[str, Any]]):
34
+ def _numpy_to_builtin_types(data: list[tuple[str, Any]]): # noqa: ANN202
35
35
  """Convert selected ``numpy`` types to Python's built-in types.
36
36
 
37
37
  This helper function is to be used for converting dataclasses into
@@ -57,7 +57,7 @@ def _numpy_to_builtin_types(data: list[tuple[str, Any]]):
57
57
  def _get_waveform(wave: Waveform, scale: float, wave_q: Waveform | None = None, scale_q: float | None = None) -> str:
58
58
  import matplotlib.pyplot as plt
59
59
 
60
- def fig_to_base64(fig):
60
+ def fig_to_base64(fig): # noqa: ANN001, ANN202
61
61
  img = io.BytesIO()
62
62
  fig.savefig(img, format="png", bbox_inches="tight")
63
63
  img.seek(0)
@@ -364,7 +364,7 @@ class Chirp(Waveform):
364
364
  alpha: float = 0.05
365
365
  phase: float = 0
366
366
 
367
- def _sample(self, sample_coords):
367
+ def _sample(self, sample_coords): # noqa: ANN001, ANN202
368
368
  chirpfreq = np.linspace(self.freq_start, self.freq_stop, len(sample_coords))
369
369
  chirpphase = 2 * np.pi * np.cumsum(chirpfreq) + self.phase
370
370
  wave = np.exp(1j * chirpphase) * ss.windows.tukey(len(sample_coords), self.alpha)
@@ -126,7 +126,7 @@ class AWGScheduleValidationError(Exception):
126
126
  class InvalidInstructionError(Exception):
127
127
  """Error raised when encountering an invalid instruction."""
128
128
 
129
- def __init__(self, instruction, issue_string="unknown reason"):
129
+ def __init__(self, instruction, issue_string="unknown reason"): # noqa: ANN001
130
130
  self.issue_string = issue_string
131
131
  self.instruction = instruction
132
132
  super().__init__(issue_string)
@@ -135,7 +135,7 @@ class InvalidInstructionError(Exception):
135
135
  return f"{self.issue_string} (in {self.instruction})"
136
136
 
137
137
 
138
- def validate_instruction_and_wf_length(instruction: Instruction):
138
+ def validate_instruction_and_wf_length(instruction: Instruction): # noqa: ANN201
139
139
  """Validate that instruction and waveform lengths match
140
140
 
141
141
  Args:
@@ -156,7 +156,7 @@ def validate_instruction_and_wf_length(instruction: Instruction):
156
156
  raise InvalidInstructionError(instruction, "scale not in -1..1")
157
157
 
158
158
 
159
- def validate_awg_and_schedule_compatibility(
159
+ def validate_awg_and_schedule_compatibility( # noqa: ANN201
160
160
  channel_description: ChannelDescription, device_constraints: AWGScheduleValidationData
161
161
  ):
162
162
  """Validates that the given playlist is compatible with the provided AWG data.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-pulse
3
- Version: 10.4.0
3
+ Version: 11.0.0
4
4
  Summary: A Python-based project for providing interface and implementations for control pulses.
5
5
  Author-email: IQM Finland Oy <info@meetiqm.com>
6
6
  License: Apache License
@@ -0,0 +1 @@
1
+ 11.0.0
@@ -1 +0,0 @@
1
- 10.4.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
File without changes
File without changes
File without changes
File without changes
File without changes