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/cirq_iqm/examples/demo_iqm_execution.py +3 -3
- iqm/iqm_client/api.py +24 -121
- iqm/iqm_client/authentication.py +1 -1
- iqm/iqm_client/iqm_client.py +284 -569
- iqm/iqm_client/models.py +0 -1
- iqm/iqm_client/transpile.py +3 -3
- iqm/iqm_client/validation.py +276 -0
- iqm/qiskit_iqm/examples/resonance_example.py +4 -0
- iqm/qiskit_iqm/iqm_circuit_validation.py +3 -2
- {iqm_client-28.0.0.dist-info → iqm_client-29.1.0.dist-info}/METADATA +9 -1
- {iqm_client-28.0.0.dist-info → iqm_client-29.1.0.dist-info}/RECORD +16 -15
- {iqm_client-28.0.0.dist-info → iqm_client-29.1.0.dist-info}/AUTHORS.rst +0 -0
- {iqm_client-28.0.0.dist-info → iqm_client-29.1.0.dist-info}/LICENSE.txt +0 -0
- {iqm_client-28.0.0.dist-info → iqm_client-29.1.0.dist-info}/WHEEL +0 -0
- {iqm_client-28.0.0.dist-info → iqm_client-29.1.0.dist-info}/entry_points.txt +0 -0
- {iqm_client-28.0.0.dist-info → iqm_client-29.1.0.dist-info}/top_level.txt +0 -0
iqm/iqm_client/models.py
CHANGED
iqm/iqm_client/transpile.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
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=
|
|
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=
|
|
22
|
-
iqm/iqm_client/authentication.py,sha256=
|
|
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=
|
|
25
|
-
iqm/iqm_client/models.py,sha256=
|
|
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
|
|
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=
|
|
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=
|
|
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-
|
|
60
|
-
iqm_client-
|
|
61
|
-
iqm_client-
|
|
62
|
-
iqm_client-
|
|
63
|
-
iqm_client-
|
|
64
|
-
iqm_client-
|
|
65
|
-
iqm_client-
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|