iqm-client 28.0.0__py3-none-any.whl → 29.1.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.
iqm/iqm_client/models.py CHANGED
@@ -1176,4 +1176,3 @@ class ClientLibrary(BaseModel):
1176
1176
 
1177
1177
 
1178
1178
  ClientLibraryDict = TypeAdapter(dict[str, ClientLibrary])
1179
- DictDict = TypeAdapter(dict[str, dict])
@@ -66,9 +66,9 @@ from iqm.iqm_client import (
66
66
  CircuitValidationError,
67
67
  DynamicQuantumArchitecture,
68
68
  Instruction,
69
- IQMClient,
70
69
  )
71
70
  from iqm.iqm_client.models import GateImplementationInfo, GateInfo, Locus, _op_is_symmetric
71
+ from iqm.iqm_client.validation import validate_circuit_moves, validate_instruction
72
72
 
73
73
  Resolution = tuple[str, str, str]
74
74
  """A (gate qubit, move qubit, resonator) triple that represents a resolution of a fictional
@@ -592,7 +592,7 @@ class _ResonatorStateTracker:
592
592
  for idx, inst in enumerate(instructions):
593
593
  locus = inst.qubits
594
594
  try:
595
- IQMClient._validate_instruction(architecture=arch, instruction=inst)
595
+ validate_instruction(architecture=arch, instruction=inst)
596
596
  # inst can be applied as is on locus, but we may first need to use MOVEs to make
597
597
  # sure the locus qubits contain their states
598
598
 
@@ -780,7 +780,7 @@ def transpile_insert_moves(
780
780
  # convert to physical qubit names
781
781
  phys_instructions = _map_loci(circuit.instructions, qubit_mapping)
782
782
  try:
783
- IQMClient._validate_circuit_moves(
783
+ validate_circuit_moves(
784
784
  arch,
785
785
  Circuit(name=circuit.name, instructions=phys_instructions, metadata=circuit.metadata),
786
786
  )
@@ -0,0 +1,276 @@
1
+ # ********************************************************************************
2
+ # Copyright (c) 2019-2025 IQM Finland Oy.
3
+ # All rights reserved. Confidential and proprietary.
4
+ #
5
+ # Distribution or reproduction of any information contained herein
6
+ # is prohibited without IQM Finland Oy’s prior written permission.
7
+ # ********************************************************************************
8
+ """Validation related helper functions for IQMClient."""
9
+
10
+ from collections.abc import Iterable
11
+ import itertools
12
+
13
+ from iqm.iqm_client.errors import CircuitValidationError
14
+ from iqm.iqm_client.models import (
15
+ _SUPPORTED_OPERATIONS,
16
+ Circuit,
17
+ CircuitBatch,
18
+ DynamicQuantumArchitecture,
19
+ Instruction,
20
+ MoveGateValidationMode,
21
+ )
22
+
23
+
24
+ def validate_qubit_mapping(
25
+ architecture: DynamicQuantumArchitecture,
26
+ circuits: CircuitBatch,
27
+ qubit_mapping: dict[str, str] | None = None,
28
+ ) -> None:
29
+ """Validate the given qubit mapping.
30
+
31
+ Args:
32
+ architecture: Quantum architecture to check against.
33
+ circuits: Circuits to be checked.
34
+ qubit_mapping: Mapping of logical qubit names to physical qubit names.
35
+ Can be set to ``None`` if all ``circuits`` already use physical qubit names.
36
+ Note that the ``qubit_mapping`` is used for all ``circuits``.
37
+
38
+ Raises:
39
+ CircuitValidationError: There was something wrong with ``circuits``.
40
+
41
+ """
42
+ if qubit_mapping is None:
43
+ return
44
+
45
+ # check if qubit mapping is injective
46
+ target_qubits = set(qubit_mapping.values())
47
+ if not len(target_qubits) == len(qubit_mapping):
48
+ raise CircuitValidationError("Multiple logical qubits map to the same physical qubit.")
49
+
50
+ # check if qubit mapping covers all qubits in the circuits
51
+ for i, circuit in enumerate(circuits):
52
+ diff = circuit.all_qubits() - set(qubit_mapping)
53
+ if diff:
54
+ raise CircuitValidationError(
55
+ f"The qubits {diff} in circuit '{circuit.name}' at index {i} "
56
+ f"are not found in the provided qubit mapping."
57
+ )
58
+
59
+ # check that each mapped qubit is defined in the quantum architecture
60
+ for _logical, physical in qubit_mapping.items():
61
+ if physical not in architecture.components:
62
+ raise CircuitValidationError(f"Component {physical} not present in dynamic quantum architecture")
63
+
64
+
65
+ def validate_circuit_instructions(
66
+ architecture: DynamicQuantumArchitecture,
67
+ circuits: CircuitBatch,
68
+ qubit_mapping: dict[str, str] | None = None,
69
+ validate_moves: MoveGateValidationMode = MoveGateValidationMode.STRICT,
70
+ *,
71
+ must_close_sandwiches: bool = True,
72
+ ) -> None:
73
+ """Validate the given circuits against the given quantum architecture.
74
+
75
+ Args:
76
+ architecture: Quantum architecture to check against.
77
+ circuits: Circuits to be checked.
78
+ qubit_mapping: Mapping of logical qubit names to physical qubit names.
79
+ Can be set to ``None`` if all ``circuits`` already use physical qubit names.
80
+ Note that the ``qubit_mapping`` is used for all ``circuits``.
81
+ validate_moves: Determines how MOVE gate validation works.
82
+ must_close_sandwiches: Iff True, MOVE sandwiches cannot be left open when the circuit ends.
83
+
84
+ Raises:
85
+ CircuitValidationError: validation failed
86
+
87
+ """
88
+ for index, circuit in enumerate(circuits):
89
+ measurement_keys: set[str] = set()
90
+ for instr in circuit.instructions:
91
+ validate_instruction(architecture, instr, qubit_mapping)
92
+ # check measurement key uniqueness
93
+ if instr.name in {"measure", "measurement"}:
94
+ key = instr.args["key"]
95
+ if key in measurement_keys:
96
+ raise CircuitValidationError(f"Circuit {index}: {instr!r} has a non-unique measurement key.")
97
+ measurement_keys.add(key)
98
+ validate_circuit_moves(
99
+ architecture,
100
+ circuit,
101
+ qubit_mapping,
102
+ validate_moves=validate_moves,
103
+ must_close_sandwiches=must_close_sandwiches,
104
+ )
105
+
106
+
107
+ def validate_instruction(
108
+ architecture: DynamicQuantumArchitecture,
109
+ instruction: Instruction,
110
+ qubit_mapping: dict[str, str] | None = None,
111
+ ) -> None:
112
+ """Validate an instruction against the dynamic quantum architecture.
113
+
114
+ Checks that the instruction uses a valid implementation, and targets a valid locus.
115
+
116
+ Args:
117
+ architecture: Quantum architecture to check against.
118
+ instruction: Instruction to check.
119
+ qubit_mapping: Mapping of logical qubit names to physical qubit names.
120
+ Can be set to ``None`` if ``instruction`` already uses physical qubit names.
121
+
122
+ Raises:
123
+ CircuitValidationError: validation failed
124
+
125
+ """
126
+ op_info = _SUPPORTED_OPERATIONS.get(instruction.name)
127
+ if op_info is None:
128
+ raise CircuitValidationError(f"Unknown quantum operation '{instruction.name}'.")
129
+
130
+ # apply the qubit mapping if any
131
+ mapped_qubits = tuple(qubit_mapping[q] for q in instruction.qubits) if qubit_mapping else instruction.qubits
132
+
133
+ def check_locus_components(allowed_components: Iterable[str], msg: str) -> None:
134
+ """Checks that the instruction locus consists of the allowed components only."""
135
+ for q, mapped_q in zip(instruction.qubits, mapped_qubits):
136
+ if mapped_q not in allowed_components:
137
+ raise CircuitValidationError(
138
+ f"{instruction!r}: Component {q} = {mapped_q} {msg}."
139
+ if qubit_mapping
140
+ else f"{instruction!r}: Component {q} {msg}."
141
+ )
142
+
143
+ if op_info.no_calibration_needed:
144
+ # all QPU loci are allowed
145
+ check_locus_components(architecture.components, msg="does not exist on the QPU")
146
+ return
147
+
148
+ gate_info = architecture.gates.get(instruction.name)
149
+ if gate_info is None:
150
+ raise CircuitValidationError(
151
+ f"Operation '{instruction.name}' is not supported by the dynamic quantum architecture."
152
+ )
153
+
154
+ if instruction.implementation is not None:
155
+ # specific implementation requested
156
+ impl_info = gate_info.implementations.get(instruction.implementation)
157
+ if impl_info is None:
158
+ raise CircuitValidationError(
159
+ f"Operation '{instruction.name}' implementation '{instruction.implementation}' "
160
+ f"is not supported by the dynamic quantum architecture."
161
+ )
162
+ allowed_loci = impl_info.loci
163
+ instruction_name = f"{instruction.name}.{instruction.implementation}"
164
+ else:
165
+ # any implementation is fine
166
+ allowed_loci = gate_info.loci
167
+ instruction_name = f"{instruction.name}"
168
+
169
+ if op_info.factorizable:
170
+ # Check that all the locus components are allowed by the architecture
171
+ check_locus_components(
172
+ {q for locus in allowed_loci for q in locus}, msg=f"is not allowed as locus for '{instruction_name}'"
173
+ )
174
+ return
175
+
176
+ # Check that locus matches one of the allowed loci
177
+ all_loci = (
178
+ tuple(tuple(x) for locus in allowed_loci for x in itertools.permutations(locus))
179
+ if op_info.symmetric
180
+ else allowed_loci
181
+ )
182
+ if mapped_qubits not in all_loci:
183
+ raise CircuitValidationError(
184
+ f"{instruction.qubits} = {tuple(mapped_qubits)} is not allowed as locus for '{instruction_name}'"
185
+ if qubit_mapping
186
+ else f"{instruction.qubits} is not allowed as locus for '{instruction_name}'"
187
+ )
188
+
189
+
190
+ def validate_circuit_moves(
191
+ architecture: DynamicQuantumArchitecture,
192
+ circuit: Circuit,
193
+ qubit_mapping: dict[str, str] | None = None,
194
+ validate_moves: MoveGateValidationMode = MoveGateValidationMode.STRICT,
195
+ *,
196
+ must_close_sandwiches: bool = True,
197
+ ) -> None:
198
+ """Raise an error if the MOVE gates in the circuit are not valid in the given architecture.
199
+
200
+ Args:
201
+ architecture: Quantum architecture to check against.
202
+ circuit: Quantum circuit to validate.
203
+ qubit_mapping: Mapping of logical qubit names to physical qubit names.
204
+ Can be set to ``None`` if the ``circuit`` already uses physical qubit names.
205
+ validate_moves: Option for bypassing full or partial MOVE gate validation.
206
+ must_close_sandwiches: Iff True, MOVE sandwiches cannot be left open when the circuit ends.
207
+
208
+ Raises:
209
+ CircuitValidationError: validation failed
210
+
211
+ """
212
+ if validate_moves == MoveGateValidationMode.NONE:
213
+ return
214
+ move_gate = "move"
215
+ # Check if MOVE gates are allowed on this architecture
216
+ if move_gate not in architecture.gates:
217
+ if any(i.name == move_gate for i in circuit.instructions):
218
+ raise CircuitValidationError("MOVE instruction is not supported by the given device architecture.")
219
+ return
220
+
221
+ # some gates are allowed in MOVE sandwiches
222
+ allowed_gates = {"barrier"}
223
+ if validate_moves == MoveGateValidationMode.ALLOW_PRX:
224
+ allowed_gates.add("prx")
225
+
226
+ all_resonators = set(architecture.computational_resonators)
227
+ all_qubits = set(architecture.qubits)
228
+ if qubit_mapping:
229
+ reverse_mapping = {phys: log for log, phys in qubit_mapping.items()}
230
+ all_resonators = {reverse_mapping[q] if q in reverse_mapping else q for q in all_resonators}
231
+ all_qubits = {reverse_mapping[q] if q in reverse_mapping else q for q in all_qubits}
232
+
233
+ # Mapping from resonator to the qubit whose state it holds. Resonators not in the map hold no qubit state.
234
+ resonator_occupations: dict[str, str] = {}
235
+ # Qubits whose states are currently moved to a resonator
236
+ moved_qubits: set[str] = set()
237
+
238
+ for inst in circuit.instructions:
239
+ if inst.name == "move":
240
+ qubit, resonator = inst.qubits
241
+ if not (qubit in all_qubits and resonator in all_resonators):
242
+ raise CircuitValidationError(
243
+ f"MOVE instructions are only allowed between qubit and resonator, not {inst.qubits}."
244
+ )
245
+
246
+ if (resonator_qubit := resonator_occupations.get(resonator)) is None:
247
+ # Beginning MOVE: check that the qubit hasn't been moved to another resonator
248
+ if qubit in moved_qubits:
249
+ raise CircuitValidationError(
250
+ f"MOVE instruction {inst.qubits}: state of {qubit} is "
251
+ f"in another resonator: {resonator_occupations}."
252
+ )
253
+ resonator_occupations[resonator] = qubit
254
+ moved_qubits.add(qubit)
255
+ else:
256
+ # Ending MOVE: check that the qubit matches to the qubit that was moved to the resonator
257
+ if resonator_qubit != qubit:
258
+ raise CircuitValidationError(
259
+ f"MOVE instruction {inst.qubits} to an already occupied resonator: {resonator_occupations}."
260
+ )
261
+ del resonator_occupations[resonator]
262
+ moved_qubits.remove(qubit)
263
+ elif moved_qubits:
264
+ # Validate that moved qubits are not used during MOVE operations
265
+ if inst.name not in allowed_gates:
266
+ if overlap := set(inst.qubits) & moved_qubits:
267
+ raise CircuitValidationError(
268
+ f"Instruction {inst.name} acts on {inst.qubits} while the state(s) of {overlap} "
269
+ f"are in a resonator. Current resonator occupation: {resonator_occupations}."
270
+ )
271
+
272
+ # Finally validate that all MOVE sandwiches have been ended before the circuit ends
273
+ if must_close_sandwiches and resonator_occupations:
274
+ raise CircuitValidationError(
275
+ f"Circuit ends while qubit state(s) are still in a resonator: {resonator_occupations}."
276
+ )
@@ -39,6 +39,10 @@ def resonance_example(server_url: str, api_token: str | None) -> dict[str, int]:
39
39
  # Initialize a backend
40
40
  backend = IQMProvider(server_url, token=api_token).get_backend()
41
41
 
42
+ # Just to make sure that "get_static_quantum_architecture" method works
43
+ static_quantum_architecture = backend.client.get_static_quantum_architecture()
44
+ print(f"static_quantum_architecture={static_quantum_architecture}")
45
+
42
46
  # Define a quantum circuit
43
47
  num_qb = min(backend.num_qubits, 5) # use at most 5 qubits
44
48
  qc = QuantumCircuit(num_qb)
@@ -14,7 +14,8 @@
14
14
  """Helper functions for circuit validation."""
15
15
 
16
16
  from iqm.iqm_client import Circuit as IQMClientCircuit
17
- from iqm.iqm_client import IQMClient, MoveGateValidationMode
17
+ from iqm.iqm_client import MoveGateValidationMode
18
+ from iqm.iqm_client.validation import validate_circuit_instructions
18
19
  from iqm.qiskit_iqm.iqm_backend import IQMBackendBase
19
20
  from iqm.qiskit_iqm.qiskit_to_iqm import serialize_instructions
20
21
  from qiskit import QuantumCircuit
@@ -35,7 +36,7 @@ def validate_circuit(
35
36
  )
36
37
  if validate_moves is None:
37
38
  validate_moves = MoveGateValidationMode.STRICT
38
- IQMClient._validate_circuit_instructions(
39
+ validate_circuit_instructions(
39
40
  architecture=backend.architecture,
40
41
  circuits=[new_circuit],
41
42
  validate_moves=validate_moves,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-client
3
- Version: 28.0.0
3
+ Version: 29.1.0
4
4
  Summary: Client library for accessing an IQM quantum computer
5
5
  Author-email: IQM Finland Oy <developers@meetiqm.com>
6
6
  License: Apache License
@@ -216,19 +216,27 @@ Requires-Python: <3.13,>=3.10
216
216
  Description-Content-Type: text/x-rst
217
217
  License-File: LICENSE.txt
218
218
  License-File: AUTHORS.rst
219
+ Requires-Dist: iqm-station-control-client <10,>=9
220
+ Requires-Dist: iqm-exa-common <27,>=26
219
221
  Requires-Dist: numpy <3.0,>=1.26.4
220
222
  Requires-Dist: packaging ==24.1
221
223
  Requires-Dist: pydantic <3.0,>=2.9.2
222
224
  Requires-Dist: requests ==2.32.3
223
225
  Provides-Extra: cirq
226
+ Requires-Dist: iqm-station-control-client <10,>=9 ; extra == 'cirq'
227
+ Requires-Dist: iqm-exa-common <27,>=26 ; extra == 'cirq'
224
228
  Requires-Dist: cirq-core[contrib] ~=1.2 ; extra == 'cirq'
225
229
  Requires-Dist: ply ==3.11 ; extra == 'cirq'
226
230
  Provides-Extra: cli
231
+ Requires-Dist: iqm-station-control-client <10,>=9 ; extra == 'cli'
232
+ Requires-Dist: iqm-exa-common <27,>=26 ; extra == 'cli'
227
233
  Requires-Dist: click <9,>=8.1.6 ; extra == 'cli'
228
234
  Requires-Dist: jsonschema >=4.6.0 ; extra == 'cli'
229
235
  Requires-Dist: psutil >=5.9.2 ; extra == 'cli'
230
236
  Requires-Dist: python-daemon >=2.3.0 ; extra == 'cli'
231
237
  Provides-Extra: qiskit
238
+ Requires-Dist: iqm-station-control-client <10,>=9 ; extra == 'qiskit'
239
+ Requires-Dist: iqm-exa-common <27,>=26 ; extra == 'qiskit'
232
240
  Requires-Dist: qiskit <1.3,>=1.0 ; extra == 'qiskit'
233
241
  Requires-Dist: qiskit-aer <0.16,>=0.13.1 ; extra == 'qiskit'
234
242
 
@@ -15,17 +15,18 @@ iqm/cirq_iqm/devices/iqm_device_metadata.py,sha256=J_mBU6gJx34tcmX_He0c7nSV5Sb9o
15
15
  iqm/cirq_iqm/examples/demo_adonis.py,sha256=rbLEs_CPO-J4OGnYLrlWismzVB6jT026F_X8epNxt0s,1726
16
16
  iqm/cirq_iqm/examples/demo_apollo.py,sha256=S9HEE_TzSRlh0lfv57c9lFmrJZzAZtnRAkXjfgMSSGU,1749
17
17
  iqm/cirq_iqm/examples/demo_common.py,sha256=8Drw_GGpHoloCZ3etq-2T9Z2ZTaV2RrpxeowNPxmTnc,8480
18
- iqm/cirq_iqm/examples/demo_iqm_execution.py,sha256=6NTEMbrWInA5kW44ajzEam3PBITCOFGCQUSKwXPaygA,2464
18
+ iqm/cirq_iqm/examples/demo_iqm_execution.py,sha256=Gy5evjrBj1P9-wH--MOLV1WLSuDtRir082Xtt8EH99Q,2481
19
19
  iqm/cirq_iqm/examples/usage.ipynb,sha256=Kyfyu_MwqzTavHVNjgrWJo1tZPeJwTw7ExcU0MFYNRk,34208
20
20
  iqm/iqm_client/__init__.py,sha256=D-8W54EcQIxk_1JZo_86GYlR1YitHhPIiFwwLJ2IfGE,1411
21
- iqm/iqm_client/api.py,sha256=V57vslYSn5g1IgXWtWuxp3hD1DbY18dKUexRdxEuX78,8268
22
- iqm/iqm_client/authentication.py,sha256=4MO7VRIH1cIkjidIDqGfnemvc04UHEAfs-sZWXwBcLw,12258
21
+ iqm/iqm_client/api.py,sha256=07K_vRtKv1EGNNVhMLsEYn0FCEXaGTp0uNtfmKc_0mY,3079
22
+ iqm/iqm_client/authentication.py,sha256=kHFqPI6w3OAk9k5ioPxi-FrD2EP-vjn8Z_wZYccJVyE,12259
23
23
  iqm/iqm_client/errors.py,sha256=ty2P-sg80zlAoL3_kC3PlprgDUv4PI-KFhmmxaaapS0,1429
24
- iqm/iqm_client/iqm_client.py,sha256=pebXRxGivTeQptsiszNQwhKCqFxVLjSKKZjmU-RPmuQ,50028
25
- iqm/iqm_client/models.py,sha256=3YTqdY_Ab6fHLiB1Rh8jem-TwiTdwZAI-Xf_5mfblEA,50890
24
+ iqm/iqm_client/iqm_client.py,sha256=blaTt4lBcgn8bpPkvS1-zCRxUWXBGIjGg5o5sUsynf8,39302
25
+ iqm/iqm_client/models.py,sha256=X_RSjAcOC-ygALQYVQw0yPxXG5nv7-_oWMrW-thDwds,50850
26
26
  iqm/iqm_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- iqm/iqm_client/transpile.py,sha256=-iIZaxaTaQLy6pMkRG15VN8X1ZE_iNhX3pjsNjqg6P8,36935
27
+ iqm/iqm_client/transpile.py,sha256=eEv9eY5QG94Lke7Xp6BkQapl1rvlmlVQ_IkQFopPNQ8,36981
28
28
  iqm/iqm_client/util.py,sha256=FLRUhhi0YDxomVtilCVPJLixyijFtU10PVefIx-eelw,1516
29
+ iqm/iqm_client/validation.py,sha256=vIwRx9ZjMpR2lciWX0Dlexoozv_KRrZXbu0whvcxIq4,11772
29
30
  iqm/iqm_client/cli/__init__.py,sha256=zzLDDz5rc3lJke3OKU8zxR5zQyQoM9oI2bLJ2YKk_zQ,692
30
31
  iqm/iqm_client/cli/auth.py,sha256=-esyrltJ5E5MRmVdJcvL5Sanpfr6OzKG_66G1NfwFAA,6238
31
32
  iqm/iqm_client/cli/cli.py,sha256=YhTgOGrvNXPwCdCKHcwLHeE_6C3n91MxFhvgQYT78C4,28633
@@ -35,7 +36,7 @@ iqm/iqm_client/cli/token_manager.py,sha256=e8M3UihnawxGlajAw5AP6x4TEH5PaCRQ4ADNn
35
36
  iqm/qiskit_iqm/__init__.py,sha256=Mv9V_r8ZcmGC8Ke5S8-7yLOx02vjZ1qiVx8mtbOpwnY,1420
36
37
  iqm/qiskit_iqm/iqm_backend.py,sha256=LhyhccB9u_Y4lyFTzAQkYfX7CI_hbBx3CQHwbwR3wlA,13975
37
38
  iqm/qiskit_iqm/iqm_circuit.py,sha256=fFQW8SRlgZjqZUOLfyuJhhXEDp5I1jopFWa1k4rb7ac,1384
38
- iqm/qiskit_iqm/iqm_circuit_validation.py,sha256=88cwQsqWbN0qNumwe1lRiLXyrQgYzIj5EhNFf_oauLE,1652
39
+ iqm/qiskit_iqm/iqm_circuit_validation.py,sha256=5VSlgpS6sxZ4xYFxF8cJiFOrsC9FEW1vLqU77Ig55-w,1698
39
40
  iqm/qiskit_iqm/iqm_job.py,sha256=_JF2DANalsRu4b0r-XxMmTNOqmaShjp1rmU7h44DKRo,11466
40
41
  iqm/qiskit_iqm/iqm_move_layout.py,sha256=pHqV1G4bri3rFEsMBN6FrtQ0FXVNQG-Ymm4v7zdnilQ,10787
41
42
  iqm/qiskit_iqm/iqm_naive_move_pass.py,sha256=zH2GHH85cRspRvWb8vPbweUo1e-FG8sMbDgEMqxmVJY,12359
@@ -47,7 +48,7 @@ iqm/qiskit_iqm/qiskit_to_iqm.py,sha256=9JGcR_7K1Y5W6_PBP1bVCZqy7khCOa-BU9m1I9MJB
47
48
  iqm/qiskit_iqm/transpiler_plugins.py,sha256=w0TXrAqtMZsPgGC1YcwiLvlBYVKDtpaCi_lnlLjTD2c,8717
48
49
  iqm/qiskit_iqm/examples/__init__.py,sha256=M4ElQHCo-WxtVXK39bF3QiFT3IGXPtZ1khqexHiTBEc,20
49
50
  iqm/qiskit_iqm/examples/bell_measure.py,sha256=iMZB_MNMf2XP6Eiv2XbhtNs4bXbMGQeMw7ohw2JWKS8,1903
50
- iqm/qiskit_iqm/examples/resonance_example.py,sha256=Hbu2cmCCfgHE0sS6-hlXR9UotSU0pkVBIhDdUZStd1k,2629
51
+ iqm/qiskit_iqm/examples/resonance_example.py,sha256=wzWOP4oob-Ckl-LR3LXznb_-cA-m7XY9FmU2Ua9nB3c,2861
51
52
  iqm/qiskit_iqm/examples/transpile_example.py,sha256=hUxGPD_eLaZFFHAbegcjT9lNq7UAvGCzHfZFnuF6cbE,2099
52
53
  iqm/qiskit_iqm/fake_backends/__init__.py,sha256=fkw2UHT-3aJbAKvR1WYUN7_4N5Gdwpx9bm6vlWj1tm0,874
53
54
  iqm/qiskit_iqm/fake_backends/fake_adonis.py,sha256=OV66SmtEuA9CV7VpWV1T-U5H5XBtCK2SQJ2UlRwW4CU,2189
@@ -56,10 +57,10 @@ iqm/qiskit_iqm/fake_backends/fake_apollo.py,sha256=eT2vd3kQBi1rrvxCpePymBCfFK84d
56
57
  iqm/qiskit_iqm/fake_backends/fake_deneb.py,sha256=RzQXmLXmBARDiMKVxk5Aw9fVbc6IYlW0A5jibk9iYD0,3156
57
58
  iqm/qiskit_iqm/fake_backends/fake_garnet.py,sha256=GI0xafTCj1Um09qVuccO6GPOGBm6ygul_O40Wu220Ys,5555
58
59
  iqm/qiskit_iqm/fake_backends/iqm_fake_backend.py,sha256=wJtfsxjPYbDKmzaz5R4AuaXvvPHa21WyPtRgNctL9eY,16785
59
- iqm_client-28.0.0.dist-info/AUTHORS.rst,sha256=qsxeK5A3-B_xK3hNbhFHEIkoHNpo7sdzYyRTs7Bdtm8,795
60
- iqm_client-28.0.0.dist-info/LICENSE.txt,sha256=2DXrmQtVVUV9Fc9RBFJidMiTEaQlG2oAtlC9PMrEwTk,11333
61
- iqm_client-28.0.0.dist-info/METADATA,sha256=CmNaxqabNuEwVAircIfTnqA86ZcAh7cCG_QntBy3_jE,17079
62
- iqm_client-28.0.0.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
63
- iqm_client-28.0.0.dist-info/entry_points.txt,sha256=Kk2qfRwk8vbIJ7qCAvmaUogfRRn6t92_hBFhe6kqAE4,1317
64
- iqm_client-28.0.0.dist-info/top_level.txt,sha256=NB4XRfyDS6_wG9gMsyX-9LTU7kWnTQxNvkbzIxGv3-c,4
65
- iqm_client-28.0.0.dist-info/RECORD,,
60
+ iqm_client-29.1.0.dist-info/AUTHORS.rst,sha256=qsxeK5A3-B_xK3hNbhFHEIkoHNpo7sdzYyRTs7Bdtm8,795
61
+ iqm_client-29.1.0.dist-info/LICENSE.txt,sha256=2DXrmQtVVUV9Fc9RBFJidMiTEaQlG2oAtlC9PMrEwTk,11333
62
+ iqm_client-29.1.0.dist-info/METADATA,sha256=IMLhmpI7dEgOuw2XcUTGD6_v-z3pl2_IxzpcifpiYP0,17545
63
+ iqm_client-29.1.0.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
64
+ iqm_client-29.1.0.dist-info/entry_points.txt,sha256=Kk2qfRwk8vbIJ7qCAvmaUogfRRn6t92_hBFhe6kqAE4,1317
65
+ iqm_client-29.1.0.dist-info/top_level.txt,sha256=NB4XRfyDS6_wG9gMsyX-9LTU7kWnTQxNvkbzIxGv3-c,4
66
+ iqm_client-29.1.0.dist-info/RECORD,,