iqm-pulla 9.6.0__tar.gz → 9.8.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-9.6.0 → iqm_pulla-9.8.0}/CHANGELOG.rst +16 -0
  2. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/PKG-INFO +3 -3
  3. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/qiskit.txt +2 -2
  4. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/pulla.py +44 -44
  5. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm_pulla.egg-info/PKG-INFO +3 -3
  6. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm_pulla.egg-info/requires.txt +2 -2
  7. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/tests/conftest.py +6 -3
  8. iqm_pulla-9.8.0/version.txt +1 -0
  9. iqm_pulla-9.6.0/version.txt +0 -1
  10. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/AUTHORS.rst +0 -0
  11. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/LICENSE.txt +0 -0
  12. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/MANIFEST.in +0 -0
  13. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/README.rst +0 -0
  14. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/API.rst +0 -0
  15. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Compilation Stages.ipynb +0 -0
  16. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Configuration and Usage.ipynb +0 -0
  17. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Custom Gates and Implementations.ipynb +0 -0
  18. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Example - Compilation With Local Calibration Set.ipynb +0 -0
  19. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Example - Executing QIR programs.ipynb +0 -0
  20. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Example - Measuring T1.ipynb +0 -0
  21. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Example - Randomized Benchmarking.ipynb +0 -0
  22. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Example - Simple Dynamical Decoupling.ipynb +0 -0
  23. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/Quick Start.ipynb +0 -0
  24. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/_static/images/favicon.ico +0 -0
  25. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/_static/images/logo.png +0 -0
  26. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/_templates/autosummary-class-template.rst +0 -0
  27. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/_templates/autosummary-module-template.rst +0 -0
  28. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/authors.rst +0 -0
  29. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/changelog.rst +0 -0
  30. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/common_errors.rst +0 -0
  31. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/conf.py +0 -0
  32. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/examples.rst +0 -0
  33. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/index.rst +0 -0
  34. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/license.rst +0 -0
  35. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/migration_guide.rst +0 -0
  36. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/readme.rst +0 -0
  37. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/references.bib +0 -0
  38. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/references.rst +0 -0
  39. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/docs/user_guides.rst +0 -0
  40. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/pyproject.toml +0 -0
  41. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/base.in +0 -0
  42. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/base.in.internal +0 -0
  43. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/base.txt +0 -0
  44. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/notebook.in +0 -0
  45. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/notebook.txt +0 -0
  46. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/qir.in +0 -0
  47. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/qir.txt +0 -0
  48. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/requirements/qiskit.in.internal +0 -0
  49. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/setup.cfg +0 -0
  50. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/setup.py +0 -0
  51. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/__init__.py +0 -0
  52. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/compiler/__init__.py +0 -0
  53. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/compiler/compiler.py +0 -0
  54. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/compiler/dd.py +0 -0
  55. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/compiler/errors.py +0 -0
  56. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/compiler/standard_stages.py +0 -0
  57. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/compiler/station_settings.py +0 -0
  58. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/interface/__init__.py +0 -0
  59. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/interface/compiler.py +0 -0
  60. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/cpc/py.typed +0 -0
  61. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/__init__.py +0 -0
  62. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/calibration.py +0 -0
  63. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/interface.py +0 -0
  64. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/py.typed +0 -0
  65. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/quantum_architecture.py +0 -0
  66. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/utils.py +0 -0
  67. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/utils_cirq.py +0 -0
  68. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/utils_dd.py +0 -0
  69. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/utils_qir.py +0 -0
  70. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm/pulla/utils_qiskit.py +0 -0
  71. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm_pulla.egg-info/SOURCES.txt +0 -0
  72. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm_pulla.egg-info/dependency_links.txt +0 -0
  73. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/src/iqm_pulla.egg-info/top_level.txt +0 -0
  74. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/tests/.pylintrc +0 -0
  75. {iqm_pulla-9.6.0 → iqm_pulla-9.8.0}/tests/__init__.py +0 -0
@@ -2,6 +2,22 @@
2
2
  Changelog
3
3
  =========
4
4
 
5
+ Version 9.8.0 (2025-08-21)
6
+ ==========================
7
+
8
+ Bug fixes
9
+ ---------
10
+
11
+ - FIx Pulla.execute crashing when there are jobs in the queue
12
+
13
+ Version 9.7.0 (2025-08-20)
14
+ ==========================
15
+
16
+ Features
17
+ --------
18
+
19
+ Fix qiskit-to-pulla tests so they don't initialize IQMBackend with metrics :issue:`SW-769`.
20
+
5
21
  Version 9.6.0 (2025-08-20)
6
22
  ==========================
7
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-pulla
3
- Version: 9.6.0
3
+ Version: 9.8.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<11,>=10; extra == "qiskit"
242
- Requires-Dist: iqm-client[qiskit]<30,>=29; extra == "qiskit"
243
- Requires-Dist: iqm-client<30,>=29; extra == "qiskit"
242
+ Requires-Dist: iqm-client[qiskit]<31,>=30; extra == "qiskit"
243
+ Requires-Dist: iqm-client<31,>=30; extra == "qiskit"
244
244
 
245
245
  IQM Pulla
246
246
  #########
@@ -1,5 +1,5 @@
1
1
  iqm-exa-common>=26,<27
2
2
  iqm-station-control-client>=9,<10
3
3
  iqm-pulse>=10,<11
4
- iqm-client[qiskit]>=29,<30
5
- iqm-client>=29,<30
4
+ iqm-client[qiskit]>=30,<31
5
+ iqm-client>=30,<31
@@ -248,57 +248,57 @@ class Pulla:
248
248
  logger.info("Waiting for the job to finish...")
249
249
 
250
250
  while True:
251
- sweep_data = self._station_control.get_sweep(job_id)
251
+ job_data = self._station_control.get_job(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: # type: ignore[operator]
254
+ if job_data.job_status <= JobExecutorStatus.EXECUTION_STARTED: # type: ignore[operator]
255
255
  # Wait in the task queue while showing a progress bar
256
256
 
257
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
-
261
- elif sweep_data.job_status == JobExecutorStatus.READY:
262
- logger.info("Sweep status: %s", str(sweep_data.job_status))
263
-
264
- sc_result.status = TaskStatus.READY
265
- sc_result.result = map_sweep_results_to_logical_qubits(
266
- self._station_control.get_sweep_results(job_id),
267
- context["readout_mappings"],
268
- context["options"].heralding_mode,
269
- )
270
- sc_result.start_time = (
271
- sweep_data.begin_timestamp.isoformat() if sweep_data.begin_timestamp else None
272
- )
273
- sc_result.end_time = sweep_data.end_timestamp.isoformat() if sweep_data.end_timestamp else None
274
-
275
- if verbose:
276
- # TODO: Consider using just 'logger.debug' here and remove 'verbose'
277
- logger.info(sc_result.result)
278
-
279
- return sc_result
280
-
281
- elif sweep_data.job_status == JobExecutorStatus.FAILED:
282
- sc_result.status = TaskStatus.FAILED
283
- sc_result.start_time = (
284
- sweep_data.begin_timestamp.isoformat() if sweep_data.begin_timestamp else None
285
- )
286
- sc_result.end_time = sweep_data.end_timestamp.isoformat() if sweep_data.end_timestamp else None
287
- job = self._station_control.get_job(job_id)
288
- sc_result.message = job["job_error"] # type: ignore[index]
289
- logger.error("Submission failed! Error: %s", sc_result.message)
290
- return sc_result
291
-
292
- elif sweep_data.job_status == JobExecutorStatus.ABORTED:
293
- sc_result.status = TaskStatus.FAILED
294
- sc_result.start_time = (
295
- sweep_data.begin_timestamp.isoformat() if sweep_data.begin_timestamp else None
296
- )
297
- sc_result.end_time = sweep_data.end_timestamp.isoformat() if sweep_data.end_timestamp else None
298
- job = self._station_control.get_job(job_id)
299
- sc_result.message = job["job_error"] # type: ignore[index]
300
- logger.error("Submission was revoked!")
301
- return sc_result
260
+ else:
261
+ # job is not in queue or executing, so we can query the sweep
262
+ sweep_data = self._station_control.get_sweep(job_id)
263
+ if job_data.job_status == JobExecutorStatus.READY:
264
+ logger.info("Sweep status: %s", str(sweep_data.job_status))
265
+
266
+ sc_result.status = TaskStatus.READY
267
+ sc_result.result = map_sweep_results_to_logical_qubits(
268
+ self._station_control.get_sweep_results(job_id),
269
+ context["readout_mappings"],
270
+ context["options"].heralding_mode,
271
+ )
272
+ sc_result.start_time = (
273
+ sweep_data.begin_timestamp.isoformat() if sweep_data.begin_timestamp else None
274
+ )
275
+ sc_result.end_time = sweep_data.end_timestamp.isoformat() if sweep_data.end_timestamp else None
276
+
277
+ if verbose:
278
+ # TODO: Consider using just 'logger.debug' here and remove 'verbose'
279
+ logger.info(sc_result.result)
280
+
281
+ return sc_result
282
+
283
+ if job_data.job_status == JobExecutorStatus.FAILED:
284
+ sc_result.status = TaskStatus.FAILED
285
+ sc_result.start_time = (
286
+ sweep_data.begin_timestamp.isoformat() if sweep_data.begin_timestamp else None
287
+ )
288
+ sc_result.end_time = sweep_data.end_timestamp.isoformat() if sweep_data.end_timestamp else None
289
+ sc_result.message = str(job_data.job_error)
290
+ logger.error("Submission failed! Error: %s", sc_result.message)
291
+ return sc_result
292
+
293
+ if job_data.job_status == JobExecutorStatus.ABORTED:
294
+ sc_result.status = TaskStatus.FAILED
295
+ sc_result.start_time = (
296
+ sweep_data.begin_timestamp.isoformat() if sweep_data.begin_timestamp else None
297
+ )
298
+ sc_result.end_time = sweep_data.end_timestamp.isoformat() if sweep_data.end_timestamp else None
299
+ sc_result.message = str(job_data.job_error)
300
+ logger.error("Submission was revoked!")
301
+ return sc_result
302
302
 
303
303
  time.sleep(1)
304
304
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-pulla
3
- Version: 9.6.0
3
+ Version: 9.8.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<11,>=10; extra == "qiskit"
242
- Requires-Dist: iqm-client[qiskit]<30,>=29; extra == "qiskit"
243
- Requires-Dist: iqm-client<30,>=29; extra == "qiskit"
242
+ Requires-Dist: iqm-client[qiskit]<31,>=30; extra == "qiskit"
243
+ Requires-Dist: iqm-client<31,>=30; extra == "qiskit"
244
244
 
245
245
  IQM Pulla
246
246
  #########
@@ -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<11,>=10
27
- iqm-client[qiskit]<30,>=29
28
- iqm-client<30,>=29
27
+ iqm-client[qiskit]<31,>=30
28
+ iqm-client<31,>=30
@@ -16,7 +16,6 @@
16
16
  from http import HTTPStatus
17
17
  from importlib.metadata import version
18
18
  import json
19
- import os
20
19
  from pathlib import Path
21
20
  from unittest.mock import Mock
22
21
  from uuid import UUID
@@ -43,7 +42,7 @@ from iqm.station_control.client.iqm_server import proto
43
42
  from iqm.station_control.client.iqm_server.testing.iqm_server_mock import IqmServerMockBase
44
43
  from iqm.station_control.client.station_control import StationControlClient
45
44
 
46
- RESOURCES = Path(os.path.abspath(__name__)).parent / "tests" / "resources"
45
+ RESOURCES = Path(__file__).parent / "resources"
47
46
 
48
47
 
49
48
  @pytest.fixture(scope="module")
@@ -106,6 +105,10 @@ def pulla_on_spark(request, monkeypatch):
106
105
  response = Response()
107
106
  response.status_code = HTTPStatus.INTERNAL_SERVER_ERROR
108
107
  return response
108
+ if args[0].startswith(f"{root_url}/station/jobs/"):
109
+ response = Response()
110
+ response.status_code = HTTPStatus.INTERNAL_SERVER_ERROR
111
+ return response
109
112
 
110
113
  return HTTPResponse(404)
111
114
 
@@ -241,7 +244,7 @@ def qiskit_backend_spark(monkeypatch) -> IQMBackend:
241
244
  when(mock_about_response).json().thenReturn({})
242
245
  when(requests).get(f"{root_url}/station/about", headers=ANY).thenReturn(mock_about_response)
243
246
  iqm_client = IQMClient(f"{root_url}/station", client_signature="test fixture")
244
- return IQMBackend(iqm_client, calibration_set_id=calset_id)
247
+ return IQMBackend(iqm_client, calibration_set_id=calset_id, use_metrics=False)
245
248
 
246
249
 
247
250
  @pytest.fixture
@@ -0,0 +1 @@
1
+ 9.8.0
@@ -1 +0,0 @@
1
- 9.6.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
File without changes
File without changes
File without changes