iqm-pulla 9.7.0__py3-none-any.whl → 9.9.0__py3-none-any.whl

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.
@@ -93,7 +93,7 @@ def pass_function_idempotent(function: PassFunction) -> PassFunction:
93
93
  return pass_with_idempotency
94
94
 
95
95
 
96
- def compiler_pass(function) -> PassFunction:
96
+ def compiler_pass(function) -> PassFunction: # noqa: ANN001
97
97
  """Convenience wrapper to create a valid compiler pass.
98
98
 
99
99
  When the wrapped function is called, the compilation data (e.g. circuits) is passed as the first argument.
@@ -364,7 +364,7 @@ def _get_op_calibration_errors(calibration: OpCalibrationDataTree, ops: QuantumO
364
364
 
365
365
  """
366
366
 
367
- def diff_dicts(cal_data: dict[str, Any], impl_parameters: dict[str, Any], path) -> None | str:
367
+ def diff_dicts(cal_data: dict[str, Any], impl_parameters: dict[str, Any], path) -> None | str: # noqa: ANN001
368
368
  """Compare the calibration"""
369
369
  full = set(impl_parameters)
370
370
  have = set(cal_data)
@@ -498,7 +498,7 @@ def merge_multiplexed_timeboxes(circuit_box: TimeBox) -> TimeBox:
498
498
  # Passes of the standard stages
499
499
  # CIRCUIT-LEVEL PASSES
500
500
  @compiler_pass
501
- def validate_execution_options(circuits: Iterable[Circuit_], options: CircuitExecutionOptions):
501
+ def validate_execution_options(circuits: Iterable[Circuit_], options: CircuitExecutionOptions): # noqa: ANN201
502
502
  """Validate the circuit execution options (only some combinations make sense)."""
503
503
  if options.move_gate_frame_tracking == MoveGateFrameTrackingMode.FULL and options.move_gate_validation not in [
504
504
  MoveGateValidationMode.STRICT,
@@ -510,7 +510,7 @@ def validate_execution_options(circuits: Iterable[Circuit_], options: CircuitExe
510
510
 
511
511
 
512
512
  @compiler_pass
513
- def map_old_operations(circuits: Iterable[Circuit_]):
513
+ def map_old_operations(circuits: Iterable[Circuit_]): # noqa: ANN201
514
514
  """Map backwards-compatible aliases for quantum operation names into the current name."""
515
515
  for c in circuits:
516
516
  _map_old_operation_names(c.instructions)
@@ -519,7 +519,7 @@ def map_old_operations(circuits: Iterable[Circuit_]):
519
519
 
520
520
 
521
521
  @compiler_pass
522
- def validate_circuits(circuits: Iterable[Circuit_], builder: ScheduleBuilder):
522
+ def validate_circuits(circuits: Iterable[Circuit_], builder: ScheduleBuilder): # noqa: ANN201
523
523
  """Validate the contents of the quantum circuits."""
524
524
  for idx, c in enumerate(circuits):
525
525
  try:
@@ -530,7 +530,7 @@ def validate_circuits(circuits: Iterable[Circuit_], builder: ScheduleBuilder):
530
530
 
531
531
 
532
532
  @compiler_pass
533
- def map_components(
533
+ def map_components( # noqa: ANN201
534
534
  circuits: Iterable[Circuit_],
535
535
  builder: ScheduleBuilder,
536
536
  component_mapping: dict[str, str],
@@ -609,7 +609,7 @@ def resolve_circuits(circuits: Iterable[Circuit_], builder: ScheduleBuilder) ->
609
609
 
610
610
  # TIMEBOX-LEVEL PASSES
611
611
  @compiler_pass
612
- def multiplex_readout(timeboxes: Iterable[TimeBox]):
612
+ def multiplex_readout(timeboxes: Iterable[TimeBox]): # noqa: ANN201
613
613
  """Merge any MultiplexedProbeTimeBoxes inside a TimeBox representing a circuit."""
614
614
  return [merge_multiplexed_timeboxes(circuit_box) for circuit_box in timeboxes]
615
615
 
iqm/pulla/pulla.py CHANGED
@@ -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
 
iqm/pulla/utils.py CHANGED
@@ -456,7 +456,7 @@ def initialize_schedule_builder(
456
456
  return builder
457
457
 
458
458
 
459
- def _update_channel_props_from_calibration(
459
+ def _update_channel_props_from_calibration( # noqa: ANN202
460
460
  channel_properties: dict[str, ChannelProperties],
461
461
  component_channels: dict[str, dict[str, str]],
462
462
  calset: CalibrationSet,
iqm/pulla/utils_cirq.py CHANGED
@@ -15,6 +15,6 @@
15
15
  """Utilities for working with Cirq objects."""
16
16
 
17
17
 
18
- def cirq_to_cpc():
18
+ def cirq_to_cpc(): # noqa: ANN201
19
19
  """Convert a Cirq Circuit to an IQM CPC Circuit."""
20
20
  raise NotImplementedError("Cirq to IQM conversion is not yet implemented.")
iqm/pulla/utils_qir.py CHANGED
@@ -118,14 +118,14 @@ def _gate_inst_to_str(inst: Call) -> CircuitOperation | None:
118
118
  raise ValueError(f"Error processing operation {operation}: {e}") from e
119
119
 
120
120
 
121
- def _find_arg_by_type(args, type_check_func):
121
+ def _find_arg_by_type(args, type_check_func): # noqa: ANN001, ANN202
122
122
  for arg in args:
123
123
  if type_check_func(arg.type):
124
124
  return arg
125
125
  raise ValueError(f"Expected exactly one argument of type {type_check_func}")
126
126
 
127
127
 
128
- def _find_args_by_type(args, type_check_func):
128
+ def _find_args_by_type(args, type_check_func): # noqa: ANN001, ANN202
129
129
  matches = []
130
130
  for arg in args:
131
131
  if type_check_func(arg.type):
@@ -133,7 +133,7 @@ def _find_args_by_type(args, type_check_func):
133
133
  return matches
134
134
 
135
135
 
136
- def _find_double_args(args):
136
+ def _find_double_args(args): # noqa: ANN001, ANN202
137
137
  """Return non-qubit, non-result arguments which should be doubles."""
138
138
  return [arg for arg in args if arg.type.is_double]
139
139
 
iqm/pulla/utils_qiskit.py CHANGED
@@ -231,7 +231,7 @@ class IQMPullaBackend(IQMBackendBase):
231
231
  self.name = "IQMPullaBackend"
232
232
  self.compiler = compiler
233
233
 
234
- def run(self, run_input, **options):
234
+ def run(self, run_input, **options): # noqa: ANN001, ANN201
235
235
  # Convert Qiskit circuits to Pulla circuits
236
236
  pulla_circuits = qiskit_circuits_to_pulla(run_input, self._idx_to_qb)
237
237
 
@@ -266,15 +266,15 @@ class DummyJob(JobV1):
266
266
  The ``job_id`` is the same as the ``sweep_id`` of the ``StationControlResult``.
267
267
  """
268
268
 
269
- def __init__(self, backend, qiskit_result):
269
+ def __init__(self, backend, qiskit_result): # noqa: ANN001
270
270
  super().__init__(backend=backend, job_id=qiskit_result.job_id)
271
271
  self.qiskit_result = qiskit_result
272
272
 
273
- def result(self):
273
+ def result(self): # noqa: ANN201
274
274
  return self.qiskit_result
275
275
 
276
- def status(self):
276
+ def status(self): # noqa: ANN201
277
277
  return JobStatus.DONE
278
278
 
279
- def submit(self):
279
+ def submit(self): # noqa: ANN201
280
280
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-pulla
3
- Version: 9.7.0
3
+ Version: 9.9.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 <31,>=30 ; extra == 'qiskit'
243
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,27 +1,27 @@
1
1
  iqm/cpc/__init__.py,sha256=qw_SFgwld1YOYYyBE-NSticm60xx5aCAw5LJJzjou8Y,1745
2
2
  iqm/cpc/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  iqm/cpc/compiler/__init__.py,sha256=ieYyHzb2IyevDm5swU--rPMsh5GdUtLrw8773Cd0ens,678
4
- iqm/cpc/compiler/compiler.py,sha256=KsxRrpfPawZYqg3gvTYch58GXlSW8mr3p-11hejbZ_0,20383
4
+ iqm/cpc/compiler/compiler.py,sha256=EZvMwkAHgRMGKNsoUQykPPfe6b5WOlyxHuoabvYS35k,20399
5
5
  iqm/cpc/compiler/dd.py,sha256=j4onTod24RPxRwwsM3EMBBgX4hDO0k_nW9R762AocXo,21674
6
6
  iqm/cpc/compiler/errors.py,sha256=tz-8g1QtDvCAPmAjjCYK3FoULrazkpSTmXIvyqukaT4,1949
7
- iqm/cpc/compiler/standard_stages.py,sha256=W3CizQJDpxyz_4iHsQ-dxv7DxGxL_MMwOlIiiBjO6KY,33858
7
+ iqm/cpc/compiler/standard_stages.py,sha256=YnLfbq0Shfg-zzVzvIqydcnNA022jDg6ehPPz1-Mhts,33954
8
8
  iqm/cpc/compiler/station_settings.py,sha256=l4cJYcNtMar_BoChJaUbmVfpXv7liTCeLWpSv7fAipg,16903
9
9
  iqm/cpc/interface/__init__.py,sha256=mvhNx1I9K5Sg40CwPntWj35M3Bni__23PWEw_qYaXtQ,611
10
10
  iqm/cpc/interface/compiler.py,sha256=2x3ZhL4WcyjwlSoZ3KhlmRcLxboz_ptS0M_rdX1z0c8,9861
11
11
  iqm/pulla/__init__.py,sha256=fj5Qh8R9K-z6q5g9-CySBZsG8d33nU7hCHrqIIB8_-0,901
12
12
  iqm/pulla/calibration.py,sha256=c_SNlTxXC0y-ahDY7JY53N7SofU5WUWMrNBogtdfHl4,4523
13
13
  iqm/pulla/interface.py,sha256=yymQo4REHYcUOWgPxPYq9IixS9bBZ27LXLQgJhzET58,5400
14
- iqm/pulla/pulla.py,sha256=IpW6VLbpx7Qroy47sbybmNmv4jVr2fyd_zx-sdKMklA,14109
14
+ iqm/pulla/pulla.py,sha256=RWsUgtCy_wAgm8TDk6uZEmaG_v-lTBFzx43qpA1CfQU,14243
15
15
  iqm/pulla/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  iqm/pulla/quantum_architecture.py,sha256=mJH9e9fdkblg6LrgN7qd-Ui3Igawf-hGd2Z7ZclQg04,6260
17
- iqm/pulla/utils.py,sha256=TTAOFhNW59VFAjnu6ZicmHXvp-GI_f66oh6IC1zFQKE,24732
18
- iqm/pulla/utils_cirq.py,sha256=8SBy6w7cr4AmnCgKwh7dBWwBGfGKxnoEMv9-1yfKs0A,777
17
+ iqm/pulla/utils.py,sha256=xVu4jLlSHX-_YQT1kB-zBiGy4wNy0YyOKZg4AGMB5DE,24748
18
+ iqm/pulla/utils_cirq.py,sha256=VtdO356D2RAh2lSVdaPm3ClJ9-nvC4jzhR9hP5QSQhI,793
19
19
  iqm/pulla/utils_dd.py,sha256=SxYAuRBgvYELKjeXpFbP4mM0xCCivDk7WUHw7oEXfMo,1695
20
- iqm/pulla/utils_qir.py,sha256=SKQyYwqluMOqfts6jdhP6ik8BvAIppwaq6-_sY0MO8M,11503
21
- iqm/pulla/utils_qiskit.py,sha256=RBrAf_KbxlL8DI078mtN8nK1pdfAbd4yk7DJSZVEFSs,10397
22
- iqm_pulla-9.7.0.dist-info/AUTHORS.rst,sha256=iCStz7WP5Jk7uMnn9jRA4ybS14X4yeUW2SsWE-OTaRk,328
23
- iqm_pulla-9.7.0.dist-info/LICENSE.txt,sha256=cCj_biRA4Q8A77vxR8AuvAf-DZ5G79yxR_3lYY6TrmA,11333
24
- iqm_pulla-9.7.0.dist-info/METADATA,sha256=mSSW_T5amveL2CvjouRXL_IoyUQ5My2r5D4JgyZqyrQ,17695
25
- iqm_pulla-9.7.0.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
26
- iqm_pulla-9.7.0.dist-info/top_level.txt,sha256=NB4XRfyDS6_wG9gMsyX-9LTU7kWnTQxNvkbzIxGv3-c,4
27
- iqm_pulla-9.7.0.dist-info/RECORD,,
20
+ iqm/pulla/utils_qir.py,sha256=SJK8N8xZyv9seXj1lJJfyt3YMht50VzUxzm8NiblSEw,11575
21
+ iqm/pulla/utils_qiskit.py,sha256=4NTNDWICFh3B0v509w3CfBHrB-GzBm-2TMlKRfgkTTI,10485
22
+ iqm_pulla-9.9.0.dist-info/AUTHORS.rst,sha256=iCStz7WP5Jk7uMnn9jRA4ybS14X4yeUW2SsWE-OTaRk,328
23
+ iqm_pulla-9.9.0.dist-info/LICENSE.txt,sha256=cCj_biRA4Q8A77vxR8AuvAf-DZ5G79yxR_3lYY6TrmA,11333
24
+ iqm_pulla-9.9.0.dist-info/METADATA,sha256=XoPOJJpIKqvquNfQnuNwB2h-7d8Zbe7TQ0WwXd7Whp0,17695
25
+ iqm_pulla-9.9.0.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
26
+ iqm_pulla-9.9.0.dist-info/top_level.txt,sha256=NB4XRfyDS6_wG9gMsyX-9LTU7kWnTQxNvkbzIxGv3-c,4
27
+ iqm_pulla-9.9.0.dist-info/RECORD,,