iqm-pulla 8.2.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.
Files changed (75) hide show
  1. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/CHANGELOG.rst +8 -0
  2. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/PKG-INFO +2 -2
  3. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/pyproject.toml +8 -0
  4. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/requirements/qiskit.txt +2 -2
  5. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/dd.py +2 -2
  6. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/standard_stages.py +12 -9
  7. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/station_settings.py +7 -7
  8. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/pulla.py +4 -4
  9. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/quantum_architecture.py +2 -2
  10. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils.py +4 -4
  11. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils_qir.py +1 -1
  12. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/PKG-INFO +2 -2
  13. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/SOURCES.txt +1 -0
  14. iqm_pulla-8.3.0/tests/__init__.py +0 -0
  15. iqm_pulla-8.3.0/version.txt +1 -0
  16. iqm_pulla-8.2.0/version.txt +0 -1
  17. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/AUTHORS.rst +0 -0
  18. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/LICENSE.txt +0 -0
  19. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/MANIFEST.in +0 -0
  20. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/README.rst +0 -0
  21. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/API.rst +0 -0
  22. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Compilation Stages.ipynb +0 -0
  23. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Configuration and Usage.ipynb +0 -0
  24. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Custom Gates and Implementations.ipynb +0 -0
  25. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Example - Compilation With Local Calibration Set.ipynb +0 -0
  26. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Example - Executing QIR programs.ipynb +0 -0
  27. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Example - Measuring T1.ipynb +0 -0
  28. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Example - Randomized Benchmarking.ipynb +0 -0
  29. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Example - Simple Dynamical Decoupling.ipynb +0 -0
  30. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/Quick Start.ipynb +0 -0
  31. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/_static/images/favicon.ico +0 -0
  32. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/_static/images/logo.png +0 -0
  33. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/_templates/autosummary-class-template.rst +0 -0
  34. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/_templates/autosummary-module-template.rst +0 -0
  35. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/authors.rst +0 -0
  36. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/changelog.rst +0 -0
  37. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/common_errors.rst +0 -0
  38. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/conf.py +0 -0
  39. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/examples.rst +0 -0
  40. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/index.rst +0 -0
  41. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/license.rst +0 -0
  42. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/migration_guide.rst +0 -0
  43. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/readme.rst +0 -0
  44. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/references.bib +0 -0
  45. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/references.rst +0 -0
  46. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/docs/user_guides.rst +0 -0
  47. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/requirements/base.in +0 -0
  48. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/requirements/base.txt +0 -0
  49. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/requirements/notebook.in +0 -0
  50. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/requirements/notebook.txt +0 -0
  51. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/requirements/qir.in +0 -0
  52. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/requirements/qir.txt +0 -0
  53. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/requirements/qiskit.in +0 -0
  54. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/setup.cfg +0 -0
  55. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/setup.py +0 -0
  56. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/__init__.py +0 -0
  57. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/__init__.py +0 -0
  58. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/circuit_compilation_request_handler.py +0 -0
  59. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/compiler.py +0 -0
  60. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/compiler/errors.py +0 -0
  61. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/interface/__init__.py +0 -0
  62. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/interface/compiler.py +0 -0
  63. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/cpc/py.typed +0 -0
  64. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/__init__.py +0 -0
  65. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/calibration.py +0 -0
  66. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/interface.py +0 -0
  67. iqm_pulla-8.2.0/tests/__init__.py → iqm_pulla-8.3.0/src/iqm/pulla/py.typed +0 -0
  68. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils_cirq.py +0 -0
  69. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils_dd.py +0 -0
  70. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm/pulla/utils_qiskit.py +0 -0
  71. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/dependency_links.txt +0 -0
  72. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/requires.txt +1 -1
  73. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/src/iqm_pulla.egg-info/top_level.txt +0 -0
  74. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/tests/.pylintrc +0 -0
  75. {iqm_pulla-8.2.0 → iqm_pulla-8.3.0}/tests/conftest.py +0 -0
@@ -2,6 +2,14 @@
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
+
5
13
  Version 8.2.0 (2025-07-02)
6
14
  ==========================
7
15
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-pulla
3
- Version: 8.2.0
3
+ Version: 8.3.0
4
4
  Summary: Client library for pulse-level access to an IQM quantum computer
5
5
  Author-email: IQM Finland Oy <developers@meetiqm.com>
6
6
  License: Apache License
@@ -239,8 +239,8 @@ Provides-Extra: qiskit
239
239
  Requires-Dist: iqm-exa-common<27,>=26; extra == "qiskit"
240
240
  Requires-Dist: iqm-station-control-client<10,>=9; extra == "qiskit"
241
241
  Requires-Dist: iqm-pulse<10,>=9; extra == "qiskit"
242
- Requires-Dist: iqm-client<30,>=29; extra == "qiskit"
243
242
  Requires-Dist: iqm-client[qiskit]<30,>=29; extra == "qiskit"
243
+ Requires-Dist: iqm-client<30,>=29; extra == "qiskit"
244
244
 
245
245
  IQM Pulla
246
246
  #########
@@ -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",]
@@ -1,5 +1,5 @@
1
1
  iqm-exa-common>=26,<27
2
2
  iqm-station-control-client>=9,<10
3
3
  iqm-pulse>=9,<10
4
- iqm-client>=29,<30
5
- iqm-client[qiskit]>=29,<30
4
+ iqm-client[qiskit]>=29,<30
5
+ iqm-client>=29,<30
@@ -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 for impl_loci in builder.calibration["measure"].values() for locus in impl_loci for q in locus
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)
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-pulla
3
- Version: 8.2.0
3
+ Version: 8.3.0
4
4
  Summary: Client library for pulse-level access to an IQM quantum computer
5
5
  Author-email: IQM Finland Oy <developers@meetiqm.com>
6
6
  License: Apache License
@@ -239,8 +239,8 @@ Provides-Extra: qiskit
239
239
  Requires-Dist: iqm-exa-common<27,>=26; extra == "qiskit"
240
240
  Requires-Dist: iqm-station-control-client<10,>=9; extra == "qiskit"
241
241
  Requires-Dist: iqm-pulse<10,>=9; extra == "qiskit"
242
- Requires-Dist: iqm-client<30,>=29; extra == "qiskit"
243
242
  Requires-Dist: iqm-client[qiskit]<30,>=29; extra == "qiskit"
243
+ Requires-Dist: iqm-client<30,>=29; extra == "qiskit"
244
244
 
245
245
  IQM Pulla
246
246
  #########
@@ -55,6 +55,7 @@ src/iqm/pulla/__init__.py
55
55
  src/iqm/pulla/calibration.py
56
56
  src/iqm/pulla/interface.py
57
57
  src/iqm/pulla/pulla.py
58
+ src/iqm/pulla/py.typed
58
59
  src/iqm/pulla/quantum_architecture.py
59
60
  src/iqm/pulla/utils.py
60
61
  src/iqm/pulla/utils_cirq.py
File without changes
@@ -0,0 +1 @@
1
+ 8.3.0
@@ -1 +0,0 @@
1
- 8.2.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
File without changes
File without changes
File without changes
File without changes
@@ -24,5 +24,5 @@ iqm-qiskit-qir==0.8.0
24
24
  iqm-exa-common<27,>=26
25
25
  iqm-station-control-client<10,>=9
26
26
  iqm-pulse<10,>=9
27
- iqm-client<30,>=29
28
27
  iqm-client[qiskit]<30,>=29
28
+ iqm-client<30,>=29
File without changes
File without changes