qadence 1.1.0__py3-none-any.whl → 1.2.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.
- qadence/analog/__init__.py +4 -2
- qadence/analog/addressing.py +167 -0
- qadence/analog/constants.py +59 -0
- qadence/analog/device.py +82 -0
- qadence/analog/hamiltonian_terms.py +101 -0
- qadence/analog/parse_analog.py +120 -0
- qadence/backend.py +27 -1
- qadence/backends/braket/backend.py +1 -1
- qadence/backends/pulser/__init__.py +0 -1
- qadence/backends/pulser/backend.py +30 -15
- qadence/backends/pulser/config.py +19 -10
- qadence/backends/pulser/devices.py +57 -63
- qadence/backends/pulser/pulses.py +70 -12
- qadence/backends/pyqtorch/backend.py +2 -3
- qadence/backends/pyqtorch/config.py +18 -12
- qadence/backends/pyqtorch/convert_ops.py +12 -4
- qadence/backends/pytorch_wrapper.py +2 -1
- qadence/backends/utils.py +1 -10
- qadence/blocks/abstract.py +5 -1
- qadence/blocks/analog.py +18 -9
- qadence/blocks/block_to_tensor.py +11 -0
- qadence/blocks/primitive.py +81 -9
- qadence/constructors/__init__.py +4 -0
- qadence/constructors/feature_maps.py +84 -60
- qadence/constructors/hamiltonians.py +27 -98
- qadence/constructors/rydberg_feature_maps.py +113 -0
- qadence/divergences.py +12 -0
- qadence/draw/utils.py +1 -1
- qadence/extensions.py +1 -6
- qadence/finitediff.py +47 -0
- qadence/mitigations/readout.py +92 -25
- qadence/models/qnn.py +88 -23
- qadence/operations.py +55 -70
- qadence/parameters.py +10 -2
- qadence/register.py +91 -43
- qadence/transpile/__init__.py +1 -0
- qadence/transpile/apply_fn.py +40 -0
- qadence/transpile/block.py +15 -7
- qadence/types.py +19 -1
- qadence/utils.py +35 -0
- {qadence-1.1.0.dist-info → qadence-1.2.0.dist-info}/METADATA +2 -2
- {qadence-1.1.0.dist-info → qadence-1.2.0.dist-info}/RECORD +44 -38
- {qadence-1.1.0.dist-info → qadence-1.2.0.dist-info}/WHEEL +1 -1
- qadence/analog/interaction.py +0 -198
- qadence/analog/utils.py +0 -132
- {qadence-1.1.0.dist-info → qadence-1.2.0.dist-info}/licenses/LICENSE +0 -0
qadence/transpile/block.py
CHANGED
@@ -236,11 +236,12 @@ def fill_identities(block: AbstractBlock, start: int, stop: int) -> AbstractBloc
|
|
236
236
|
|
237
237
|
@fill_identities.register
|
238
238
|
def _(block: PrimitiveBlock, start: int, stop: int) -> AbstractBlock:
|
239
|
-
|
239
|
+
full_support = tuple(range(start, stop + 1))
|
240
|
+
if block.qubit_support == full_support:
|
240
241
|
return block
|
241
242
|
tag = block.tag
|
242
243
|
block.tag = None
|
243
|
-
bs = [block] + [I(i) for i in (set(
|
244
|
+
bs = [block] + [I(i) for i in (set(full_support) - set(block.qubit_support))]
|
244
245
|
b = kron(*sorted(bs, key=lambda x: x.qubit_support))
|
245
246
|
b.tag = tag
|
246
247
|
return b
|
@@ -248,11 +249,12 @@ def _(block: PrimitiveBlock, start: int, stop: int) -> AbstractBlock:
|
|
248
249
|
|
249
250
|
@fill_identities.register
|
250
251
|
def _(block: SWAP, start: int, stop: int) -> AbstractBlock:
|
251
|
-
|
252
|
+
full_support = tuple(range(start, stop + 1))
|
253
|
+
if block.qubit_support == full_support:
|
252
254
|
return block
|
253
255
|
tag = block.tag
|
254
256
|
block.tag = None
|
255
|
-
bs = [block] + [chain(I(i), I(i)) for i in (set(
|
257
|
+
bs = [block] + [chain(I(i), I(i)) for i in (set(full_support) - set(block.qubit_support))]
|
256
258
|
b = kron(*sorted(bs, key=lambda x: x.qubit_support))
|
257
259
|
b.tag = tag
|
258
260
|
return b
|
@@ -278,17 +280,23 @@ def _fill_kron(block: KronBlock, start: int, stop: int) -> list[AbstractBlock]:
|
|
278
280
|
|
279
281
|
def append_ids(block: AbstractBlock, total: int) -> AbstractBlock:
|
280
282
|
qs = block.qubit_support
|
281
|
-
ids = [I(i) for i in range(min(qs), max(qs)
|
283
|
+
ids = [I(i) for i in range(min(qs), max(qs)) for _ in range(length(block), total)]
|
282
284
|
bs = [block] + ids
|
283
285
|
return chain(*bs)
|
284
286
|
|
285
287
|
def id_chain(i: int, max_len: int) -> AbstractBlock:
|
286
288
|
return chain(I(i) for _ in range(max_len))
|
287
289
|
|
288
|
-
|
290
|
+
# fill subblocks with identities
|
291
|
+
bs = [fill_identities(b, min(b.qubit_support), max(b.qubit_support)) for b in block]
|
292
|
+
|
293
|
+
# make all subblocks equally "long" horizontally
|
289
294
|
max_len = length(bs)
|
290
295
|
bs = [append_ids(b, max_len) for b in bs]
|
291
|
-
|
296
|
+
|
297
|
+
# fill potentially completely empty wires
|
298
|
+
bs += [id_chain(i, max_len) for i in (set(range(start, stop + 1)) - set(block.qubit_support))]
|
299
|
+
|
292
300
|
return sorted(bs, key=lambda x: x.qubit_support)
|
293
301
|
|
294
302
|
|
qadence/types.py
CHANGED
@@ -39,6 +39,7 @@ __all__ = [
|
|
39
39
|
"DiffMode",
|
40
40
|
"BackendName",
|
41
41
|
"Interaction",
|
42
|
+
"DeviceType",
|
42
43
|
"OverlapMethod",
|
43
44
|
"AlgoHEvo",
|
44
45
|
"SerializationFormat",
|
@@ -163,7 +164,7 @@ class QubitSupportType(StrEnum):
|
|
163
164
|
class Interaction(StrEnum):
|
164
165
|
"""Interaction types used in.
|
165
166
|
|
166
|
-
- `
|
167
|
+
- `RydbergDevice`.
|
167
168
|
- [`hamiltonian_factory`][qadence.constructors.hamiltonians.hamiltonian_factory].
|
168
169
|
"""
|
169
170
|
|
@@ -177,6 +178,16 @@ class Interaction(StrEnum):
|
|
177
178
|
"""XYZ Interaction."""
|
178
179
|
|
179
180
|
|
181
|
+
class DeviceType(StrEnum):
|
182
|
+
"""Supported types of devices for Pulser backend."""
|
183
|
+
|
184
|
+
IDEALIZED = "IdealDevice"
|
185
|
+
"""Idealized device, least realistic."""
|
186
|
+
|
187
|
+
REALISTIC = "RealisticDevice"
|
188
|
+
"""Device with realistic specs."""
|
189
|
+
|
190
|
+
|
180
191
|
class _BackendName(StrEnum):
|
181
192
|
"""The available backends for running circuits."""
|
182
193
|
|
@@ -368,3 +379,10 @@ class OpName(StrEnum):
|
|
368
379
|
"""The entanglement operation."""
|
369
380
|
WAIT = "wait"
|
370
381
|
"""The wait operation."""
|
382
|
+
PROJ = "Projector"
|
383
|
+
"""The projector operation."""
|
384
|
+
|
385
|
+
|
386
|
+
class ReadOutOptimization(StrEnum):
|
387
|
+
MLE = "mle"
|
388
|
+
CONSTRAINED = "constrained"
|
qadence/utils.py
CHANGED
@@ -205,3 +205,38 @@ def _round_complex(t: torch.Tensor, decimals: int = 4) -> torch.Tensor:
|
|
205
205
|
|
206
206
|
fn = torch.vmap(_round)
|
207
207
|
return fn(t)
|
208
|
+
|
209
|
+
|
210
|
+
def is_qadence_shape(state: torch.Tensor, n_qubits: int) -> bool:
|
211
|
+
if len(state.size()) < 2:
|
212
|
+
raise ValueError(
|
213
|
+
f"Provided state is required to have atleast two dimensions. Got shape {state.shape}"
|
214
|
+
)
|
215
|
+
return state.shape[1] == 2**n_qubits # type: ignore[no-any-return]
|
216
|
+
|
217
|
+
|
218
|
+
def infer_batchsize(param_values: dict[str, torch.Tensor] = None) -> int:
|
219
|
+
"""Infer the batch_size through the length of the parameter tensors."""
|
220
|
+
try:
|
221
|
+
return max([len(tensor) for tensor in param_values.values()]) if param_values else 1
|
222
|
+
except Exception:
|
223
|
+
return 1
|
224
|
+
|
225
|
+
|
226
|
+
def validate_values_and_state(
|
227
|
+
state: torch.Tensor | None, n_qubits: int, param_values: dict[str, torch.Tensor] = None
|
228
|
+
) -> None:
|
229
|
+
if state is not None:
|
230
|
+
batch_size_state = (
|
231
|
+
state.shape[0] if is_qadence_shape(state, n_qubits=n_qubits) else state.size(-1)
|
232
|
+
)
|
233
|
+
batch_size_values = infer_batchsize(param_values)
|
234
|
+
if batch_size_state != batch_size_values and (
|
235
|
+
batch_size_values > 1 and batch_size_state > 1
|
236
|
+
):
|
237
|
+
raise ValueError(
|
238
|
+
"Batching of parameter values and states is only valid for the cases:\
|
239
|
+
(1) batch_size_values == batch_size_state\
|
240
|
+
(2) batch_size_values == 1 and batch_size_state > 1\
|
241
|
+
(3) batch_size_values > 1 and batch_size_state == 1."
|
242
|
+
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: qadence
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.2.0
|
4
4
|
Summary: Pasqal interface for circuit-based quantum computing SDKs
|
5
5
|
Author-email: Aleksander Wennersteen <aleksander.wennersteen@pasqal.com>, Gert-Jan Both <gert-jan.both@pasqal.com>, Niklas Heim <niklas.heim@pasqal.com>, Mario Dagrada <mario.dagrada@pasqal.com>, Vincent Elfving <vincent.elfving@pasqal.com>, Dominik Seitz <dominik.seitz@pasqal.com>, Roland Guichard <roland.guichard@pasqal.com>, "Joao P. Moutinho" <joao.moutinho@pasqal.com>, Vytautas Abramavicius <vytautas.abramavicius@pasqal.com>
|
6
6
|
License: Apache 2.0
|
@@ -19,7 +19,7 @@ Requires-Dist: jsonschema
|
|
19
19
|
Requires-Dist: matplotlib
|
20
20
|
Requires-Dist: nevergrad
|
21
21
|
Requires-Dist: openfermion
|
22
|
-
Requires-Dist: pyqtorch==1.0.
|
22
|
+
Requires-Dist: pyqtorch==1.0.3
|
23
23
|
Requires-Dist: rich
|
24
24
|
Requires-Dist: scipy
|
25
25
|
Requires-Dist: sympytorch>=0.1.2
|
@@ -1,63 +1,68 @@
|
|
1
1
|
qadence/__init__.py,sha256=me88jOt3wtGMiobi1-956mO5sCyWYvcspbKmwADnV-4,1684
|
2
|
-
qadence/backend.py,sha256=
|
2
|
+
qadence/backend.py,sha256=qfhRqtRcPFHjiyIxnnRH0Fr87cQ5IOQS2W4Dv0sS4BY,15146
|
3
3
|
qadence/circuit.py,sha256=DbRHKAqiClEUOsiuQN_EaoI4xScK2_sGk1VkOnX-NpE,7071
|
4
4
|
qadence/decompose.py,sha256=_L0hI3SbYErXEDp-aXFeNk0JR9ffJ_JD_EnRJbJKT20,5230
|
5
|
-
qadence/divergences.py,sha256=
|
5
|
+
qadence/divergences.py,sha256=JhpELhWSnuDvQxa9hJp_DE3EQg2Ban-Ta0mHZ_fVrHg,1832
|
6
6
|
qadence/execution.py,sha256=zczhPbBOf91PtAso0fe3uHxnseXyJ5QHMw7melB4XmQ,9134
|
7
|
-
qadence/extensions.py,sha256=
|
7
|
+
qadence/extensions.py,sha256=WNDdPPjfVzSueTIv__7eV27avxFPQ2uUgUC4Vl5Le8s,3861
|
8
|
+
qadence/finitediff.py,sha256=TijuaWUbX9VlbLyMYco6HkK9eCoRTVnKug4Ekd6mlTI,1592
|
8
9
|
qadence/logger.py,sha256=mdTr52nL30ipPRwp11nIHKLEoB3hqs7J-Mric5KVfyM,912
|
9
|
-
qadence/operations.py,sha256=
|
10
|
+
qadence/operations.py,sha256=7xsc3yXzngGoEHF6iaTeIHjrDKRuFhxgcxjPNoeQDH0,37143
|
10
11
|
qadence/overlap.py,sha256=3vsg0HLOO3X8LiVgvjSc5s-cs8Di4TpEA657LWZ5HEY,17294
|
11
|
-
qadence/parameters.py,sha256=
|
12
|
+
qadence/parameters.py,sha256=wyBWcsXynSKV92dyYolYc6__q9QzTXjIoqsMW19gnJA,12103
|
12
13
|
qadence/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
14
|
qadence/qubit_support.py,sha256=Nkn1Q01RVViTcggSIom7EFKdWpAuM4TMGwBZ5feCUxA,2120
|
14
|
-
qadence/register.py,sha256=
|
15
|
+
qadence/register.py,sha256=cBMzwZ7GWZ5ieuFt0bpproEI6a2ncNwfjj7ic379zyg,10276
|
15
16
|
qadence/serialization.py,sha256=BmBCFVAeLOL7KCYhUIN38cA43mA0tc5R7l0Fm2xtABU,11702
|
16
17
|
qadence/states.py,sha256=p5J4-aceTHxLK89DLC191K1H5c3y6gb2dd-I5YPqBMo,14343
|
17
|
-
qadence/types.py,sha256=
|
18
|
-
qadence/utils.py,sha256=
|
19
|
-
qadence/analog/__init__.py,sha256=
|
20
|
-
qadence/analog/
|
21
|
-
qadence/analog/
|
18
|
+
qadence/types.py,sha256=mEoP-T-QS9kVVDVF6Vtr4qrGT5El8cqpYtOOT40YupU,9334
|
19
|
+
qadence/utils.py,sha256=sWHQ8C6CVhXsaZif0jKnkiOaxKTG5EXSMDfk_lXmgRE,8257
|
20
|
+
qadence/analog/__init__.py,sha256=BCyS9R4KUjzUXN0Ax3b0eMo8ZAuSkGoJQVtZ4_pvAFs,279
|
21
|
+
qadence/analog/addressing.py,sha256=9KsZnmf-UDCy0rco2gvatd8ERlZd0QZGwt7SS_a_DZo,6410
|
22
|
+
qadence/analog/constants.py,sha256=B2phQoN1ASL8CwM-Dsa1rbraYwGwwPSeiB3HbVe-MPA,1243
|
23
|
+
qadence/analog/device.py,sha256=nY6esVJEHHJjK2tRZVMjdNy0SHcP3eSGh1Zi55KcX_4,2430
|
24
|
+
qadence/analog/hamiltonian_terms.py,sha256=9LKidqqEMJTTdXeaxkxP_otTmcv9i4yeJ-JKCLOCK3Y,3421
|
25
|
+
qadence/analog/parse_analog.py,sha256=L2mh0uU4JwTteInR07pe5gPM4kQz17y9yS2O7n8u-SU,4070
|
22
26
|
qadence/backends/__init__.py,sha256=cg7wolh0jKwwE_6JZpSFaS7GOPIr6rdYobTQnvAAwqQ,291
|
23
27
|
qadence/backends/adjoint.py,sha256=kX4QX_6UjVJcochm6dSjFHpFYmdV0DQRfXqybNnlRcU,6788
|
24
28
|
qadence/backends/api.py,sha256=sfPGj2-NYHHKD64Z9Emg5oFa-Y4dvPUKycSNdhYaRoY,2358
|
25
29
|
qadence/backends/gpsr.py,sha256=nGNdXJi59vmEhrkysRscVQbWZs34A8YW9FlD1lolt4o,4356
|
26
|
-
qadence/backends/pytorch_wrapper.py,sha256=
|
27
|
-
qadence/backends/utils.py,sha256=
|
30
|
+
qadence/backends/pytorch_wrapper.py,sha256=tN_G7SzPndInLq8oUGzoKTv7WlbT66MjVX-EZtaLNmI,15369
|
31
|
+
qadence/backends/utils.py,sha256=atY8AYZiCHd5QdLP8xRsq7g9-2610u8Q0DosEVvFQow,6179
|
28
32
|
qadence/backends/braket/__init__.py,sha256=eruyDZKMqkh1LE7eJ980vcrLJbia35uUX6krAP78clI,121
|
29
|
-
qadence/backends/braket/backend.py,sha256=
|
33
|
+
qadence/backends/braket/backend.py,sha256=wAAYczd3tJ0YEvl3FlYSUu6FW63KWZEqi953ZoY9Bsk,8561
|
30
34
|
qadence/backends/braket/config.py,sha256=b9aIdma0DRwC_3A6xUSLdXMCZe6z6kDcAgkp6MxcXIk,603
|
31
35
|
qadence/backends/braket/convert_ops.py,sha256=D-hHfYkvxZtMaiK3I286CSsBg8vf854dEigeFgxaQ5Y,3422
|
32
|
-
qadence/backends/pulser/__init__.py,sha256=
|
33
|
-
qadence/backends/pulser/backend.py,sha256=
|
36
|
+
qadence/backends/pulser/__init__.py,sha256=capQ-eHqwtOeLf4mWsI0BIseAHhiLGie5cFD4-iVhUo,116
|
37
|
+
qadence/backends/pulser/backend.py,sha256=ZU-qqikSqZpPr6eJeAigPzX4VJDil-7yc7Y_stCy5qw,13457
|
34
38
|
qadence/backends/pulser/channels.py,sha256=ZF0yEXUFHAmi3IdeXjzdTNGR5NzaRRFTiUpUGVg2sO4,329
|
35
39
|
qadence/backends/pulser/cloud.py,sha256=0uUluvbFV9sOuCPraE-9uiVtC3Q8QaDY1IJMDi8grDM,2057
|
36
|
-
qadence/backends/pulser/config.py,sha256=
|
40
|
+
qadence/backends/pulser/config.py,sha256=DdboScn5TrtVwCcsHgZjNCQmWy46aSrf44FhOTJRxaw,3038
|
37
41
|
qadence/backends/pulser/convert_ops.py,sha256=0HGWe5kIwI1ZALHf2j68B8aBOhwFNZV-mDy1_6zsF5g,1227
|
38
|
-
qadence/backends/pulser/devices.py,sha256=
|
39
|
-
qadence/backends/pulser/pulses.py,sha256=
|
42
|
+
qadence/backends/pulser/devices.py,sha256=KBgyBbdL1ZLllHHoWY5W6Z_aALhxFZMlXABkN7tQsmQ,2439
|
43
|
+
qadence/backends/pulser/pulses.py,sha256=KwhiW3vcA7bKyYgADA2mHuUiah8J5Ytw2eocmAlasiA,11685
|
40
44
|
qadence/backends/pulser/waveforms.py,sha256=0uz95b7rUaUUtN0tuHBZmJ0H6UBmfHST_59ozwsRCzg,2227
|
41
45
|
qadence/backends/pyqtorch/__init__.py,sha256=0OdVy6cq0oQggV48LO1WXdaZuSkDkz7OYNEPIkNAmfk,140
|
42
|
-
qadence/backends/pyqtorch/backend.py,sha256=
|
43
|
-
qadence/backends/pyqtorch/config.py,sha256=
|
44
|
-
qadence/backends/pyqtorch/convert_ops.py,sha256=
|
46
|
+
qadence/backends/pyqtorch/backend.py,sha256=J8xNtFEop-B7bPaTg2zj-Y5ALOa3LJj90cUrXw6aSyg,9415
|
47
|
+
qadence/backends/pyqtorch/config.py,sha256=f5BjWehCqm9do2OahNWrv2w55y3orkw0Wj2f6flwRaU,1907
|
48
|
+
qadence/backends/pyqtorch/convert_ops.py,sha256=ZksUC1liV52DLrRMAS7Lu1_cXI99y8APOxDDDDmyrb0,15543
|
45
49
|
qadence/blocks/__init__.py,sha256=SXj5NbnJkFcsEeyP4WJ2EfV-frmoL3qzz0XTExpMQpg,940
|
46
|
-
qadence/blocks/abstract.py,sha256=
|
47
|
-
qadence/blocks/analog.py,sha256=
|
48
|
-
qadence/blocks/block_to_tensor.py,sha256=
|
50
|
+
qadence/blocks/abstract.py,sha256=35RcVlNvD1BmBoJ8bbYJ3LrdU72wixt9ZmTbCtEwNus,11796
|
51
|
+
qadence/blocks/analog.py,sha256=ySzvniSF89dsTd_GzgAESkv3OVseBgUKkKTAQK7sqVc,10655
|
52
|
+
qadence/blocks/block_to_tensor.py,sha256=bt28er90ltu1GzRQCz4hziBLKoBgQhC8VZwKTziM1JE,16279
|
49
53
|
qadence/blocks/composite.py,sha256=z_lXRBVnh-DdvfZdv6T0ZEmVhlU76zBt72P_FGGa-PQ,8897
|
50
54
|
qadence/blocks/embedding.py,sha256=wNpvk3EG1ex9gJ0o_RI4ztIvlzMCK5GocgXV1WS8TMA,5670
|
51
55
|
qadence/blocks/manipulate.py,sha256=kPmzej7mnWFoqTJA2CkGulT7hcPha0GGPARC8rjZltg,2387
|
52
56
|
qadence/blocks/matrix.py,sha256=XQI6D4CWhCf3j-hvA0jRKOgprs0RA6su7OythCoH6Ls,3785
|
53
|
-
qadence/blocks/primitive.py,sha256=
|
57
|
+
qadence/blocks/primitive.py,sha256=rM-l5wvf3nGCrYFMJ6cI2ULPv_vhw1gxt1zd-77bupM,16716
|
54
58
|
qadence/blocks/utils.py,sha256=pj0b3yEQ3wpiK_mdpkBS8shAPyaeHZii2bCjtts8jVE,15729
|
55
|
-
qadence/constructors/__init__.py,sha256=
|
59
|
+
qadence/constructors/__init__.py,sha256=d4ndrNCTCDS_kUYeigGFQOUFSAMaPKL--_FcdZy7eQo,1152
|
56
60
|
qadence/constructors/ansatze.py,sha256=PWC6ILioReF6vlS22UevCSLIHGR1HMQpUVPlCyZ4rNY,12026
|
57
|
-
qadence/constructors/feature_maps.py,sha256=
|
58
|
-
qadence/constructors/hamiltonians.py,sha256=
|
61
|
+
qadence/constructors/feature_maps.py,sha256=PgbbwYcq2TrvJmn8BZefX2j20BTrVd7axmSVldbJxPk,10569
|
62
|
+
qadence/constructors/hamiltonians.py,sha256=d-rdOSsI7gEp9pn89M60EYierBpPFmEP3Y3W7BrdbMM,8327
|
59
63
|
qadence/constructors/iia.py,sha256=12Dizl1BZwktmp4h4FNm-ISFCRVFkW_EsIAg7rqAo1E,4720
|
60
64
|
qadence/constructors/qft.py,sha256=h_wVAEvb6kIr_pzx9RWK8PVsosqDB8np3qvZFkFmbf4,7508
|
65
|
+
qadence/constructors/rydberg_feature_maps.py,sha256=u_BTGfsgXqKSJb72DP_CyqBCfoSQFI6GRsc-Fqiuw5E,4729
|
61
66
|
qadence/constructors/rydberg_hea.py,sha256=GrIrboyjEe1fJEbhtRYeCZ5dYzDVpMt-SQucS9UyNtw,8372
|
62
67
|
qadence/constructors/utils.py,sha256=PKVkxD2Ev2OVl-aCC9jl6rTET6iEhDXOWIdXf30w4iw,3073
|
63
68
|
qadence/constructors/daqc/__init__.py,sha256=50_4Ak32d5A4CZeR65l0s-0lUsxgKerWNDK7GDmkNY4,140
|
@@ -66,7 +71,7 @@ qadence/constructors/daqc/gen_parser.py,sha256=sRVs6dgyELkQAMgH3zxsti2RVl31cNr5P
|
|
66
71
|
qadence/constructors/daqc/utils.py,sha256=Nm_H0CzQOrmMkgrkzeQCW2pRyUQ2II6jJ-LnNLTpQ0o,1076
|
67
72
|
qadence/draw/__init__.py,sha256=A2lU7_CfCjwZCnMRojG5CsoWm-7aWKpUYGyaJ9qBZIQ,2319
|
68
73
|
qadence/draw/themes.py,sha256=VV4YtC8X3UI63AuJO2D0fLMTLbdDUjIyXQcKuDuIVmI,5533
|
69
|
-
qadence/draw/utils.py,sha256=
|
74
|
+
qadence/draw/utils.py,sha256=BW-eGHQmxlPvtUUOiMnHQpthQTQbW9Lu4-nvhKnryjY,12087
|
70
75
|
qadence/draw/vizbackend.py,sha256=BKq1fjW7zgEhaIhrmi-i6XV9ZWY7NmlmdDo9-tfP0Hk,14997
|
71
76
|
qadence/draw/assets/dark/measurement.png,sha256=hSMhZZCFKHNO2tCpYTTSYIF-nsAfNalRunRUIyhygC0,502
|
72
77
|
qadence/draw/assets/dark/measurement.svg,sha256=6ALGjaCX3xZ1NqB6RW6yzOchzZV-j8ukW4aGhEWe4Lk,7282
|
@@ -81,7 +86,7 @@ qadence/measurements/tomography.py,sha256=TiD6xwD9b7hK0cKoMccAZwpz56rCLz2xb-dZai
|
|
81
86
|
qadence/mitigations/__init__.py,sha256=RzaxYJftePFMloGhBVSixZ8fSe-ps_Jc-EyPm6xz-bs,159
|
82
87
|
qadence/mitigations/analog_zne.py,sha256=6B_rb0Od8sOvzyVwjAb6hM3hCe5Xcr1LnsxL3L9byRk,3579
|
83
88
|
qadence/mitigations/protocols.py,sha256=Jq9MyLujfTyWmc7XVUGYVRUkJT1MmZw-GgmWpVjmX2Y,1608
|
84
|
-
qadence/mitigations/readout.py,sha256=
|
89
|
+
qadence/mitigations/readout.py,sha256=HPfYmdjRlieUdOBMZTghFK4DRWfveM4KkDkEI0bMI0E,6262
|
85
90
|
qadence/ml_tools/__init__.py,sha256=_H5A_BWZRZVGoJszb9s8XRJnLnJxUNfYjuT9HT2yASo,786
|
86
91
|
qadence/ml_tools/config.py,sha256=X8dHyjq4D9-ITjs7UQo0vjJTcHkpbZC0gChH5eEN2G8,2356
|
87
92
|
qadence/ml_tools/data.py,sha256=GptMgStgpyLM0nLWT_SCWSkW8DWuhU7EcYEDgUTXXzs,3191
|
@@ -95,19 +100,20 @@ qadence/ml_tools/train_grad.py,sha256=wKltZZQ911tsUucjZp1uuqng_Zdr1D3vFmlqhqdXEc
|
|
95
100
|
qadence/ml_tools/train_no_grad.py,sha256=erwus-pUOg8q6WgoQsDW6MeH80wlRPBh69W1ZMHKoL8,4714
|
96
101
|
qadence/ml_tools/utils.py,sha256=_GZSN5Flk1nRFutkXih397Q3cWKdX0UP8c9CRXpUL7c,1654
|
97
102
|
qadence/models/__init__.py,sha256=0nZzAC2TGr8Yuf40-R7m2cSsr_BlNq_GsMOwaOYZLqM,193
|
98
|
-
qadence/models/qnn.py,sha256=
|
103
|
+
qadence/models/qnn.py,sha256=ne261gZn-1JDhCL2rzj-PykhkhP2MWhFlX7Ok7eCqFQ,8586
|
99
104
|
qadence/models/quantum_model.py,sha256=WmQVIbpdmDVIgcVPzRgoHDdCB0D0GCOqBroP0NcHrEw,11575
|
100
105
|
qadence/noise/__init__.py,sha256=r0nR8uEZeB1M9pI2UisjWq0bjw50fPFfVGzIMev923g,147
|
101
106
|
qadence/noise/protocols.py,sha256=-aZ06JvMnpxCeT5v5lI_RNPOLbb9Ju1Pi1AB6uAXxVE,1653
|
102
107
|
qadence/noise/readout.py,sha256=BqBIZbPXWqZaKi6EpBSpXXQ9NhQXdQ-YL6ZmwbSjgfE,6736
|
103
|
-
qadence/transpile/__init__.py,sha256=
|
104
|
-
qadence/transpile/
|
108
|
+
qadence/transpile/__init__.py,sha256=lb5LwsYb6lN5YFBsU3YBey7-0OcUQpYa3Q4hG6zmgi0,457
|
109
|
+
qadence/transpile/apply_fn.py,sha256=glZo2_wMOjw7_KgWKYbqg8j-9SDs-RefWIfxWgdQK8I,1336
|
110
|
+
qadence/transpile/block.py,sha256=kuDATVQm-e1EbI22_bl4KzSpby5jfzMtboC_k8T8n6g,11591
|
105
111
|
qadence/transpile/circuit.py,sha256=KTh6Gv1czZddFuA1JhNNszheZbwViVixiGh4rGvIgTM,451
|
106
112
|
qadence/transpile/digitalize.py,sha256=iWRwYAYQsD2INHj0HNbGJriv_3fRCuBW1nDBrwtKSuI,1523
|
107
113
|
qadence/transpile/flatten.py,sha256=EdhSG5WyF56nbnxINNLqrHgY84MRM1YFjT3fR4aph5Q,3427
|
108
114
|
qadence/transpile/invert.py,sha256=KAefHTG2AWr39aengVhXrzCtJPhrZC-ZnL6vYvmbnY0,4867
|
109
115
|
qadence/transpile/transpile.py,sha256=6MRRkk1OS279L1fwUQjazA6qlfpbd-T_EJMKT8hAhOU,2721
|
110
|
-
qadence-1.
|
111
|
-
qadence-1.
|
112
|
-
qadence-1.
|
113
|
-
qadence-1.
|
116
|
+
qadence-1.2.0.dist-info/METADATA,sha256=GDCLHPrzxXBlvil4e8WZTAVCDaL3gOjLsUwT6oiNV1I,6755
|
117
|
+
qadence-1.2.0.dist-info/WHEEL,sha256=Gw8jIuTWkPakxikG-6o91zOxTjpZNZ00Qw8KZLqAprY,87
|
118
|
+
qadence-1.2.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
119
|
+
qadence-1.2.0.dist-info/RECORD,,
|
qadence/analog/interaction.py
DELETED
@@ -1,198 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from copy import deepcopy
|
4
|
-
from functools import singledispatch
|
5
|
-
from itertools import product
|
6
|
-
from typing import Any, Callable, Union, overload
|
7
|
-
|
8
|
-
import torch
|
9
|
-
|
10
|
-
from qadence.analog.utils import ising_interaction, rot_generator, xy_interaction
|
11
|
-
from qadence.blocks.abstract import AbstractBlock
|
12
|
-
from qadence.blocks.analog import (
|
13
|
-
AnalogBlock,
|
14
|
-
AnalogChain,
|
15
|
-
AnalogKron,
|
16
|
-
ConstantAnalogRotation,
|
17
|
-
Interaction,
|
18
|
-
WaitBlock,
|
19
|
-
)
|
20
|
-
from qadence.blocks.composite import CompositeBlock
|
21
|
-
from qadence.blocks.primitive import PrimitiveBlock, ScaleBlock
|
22
|
-
from qadence.blocks.utils import _construct, add, chain, kron
|
23
|
-
from qadence.circuit import QuantumCircuit
|
24
|
-
from qadence.operations import HamEvo, I, wait
|
25
|
-
from qadence.qubit_support import QubitSupport
|
26
|
-
from qadence.register import Register
|
27
|
-
from qadence.transpile.transpile import blockfn_to_circfn
|
28
|
-
|
29
|
-
INTERACTIONS = {Interaction.NN: ising_interaction, Interaction.XY: xy_interaction}
|
30
|
-
|
31
|
-
|
32
|
-
@overload
|
33
|
-
def add_interaction(circuit: QuantumCircuit, **kwargs: Any) -> QuantumCircuit:
|
34
|
-
...
|
35
|
-
|
36
|
-
|
37
|
-
@overload
|
38
|
-
def add_interaction(block: AbstractBlock, **kwargs: Any) -> AbstractBlock:
|
39
|
-
...
|
40
|
-
|
41
|
-
|
42
|
-
@overload
|
43
|
-
def add_interaction(register: Register, block: AbstractBlock, **kwargs: Any) -> AbstractBlock:
|
44
|
-
...
|
45
|
-
|
46
|
-
|
47
|
-
@singledispatch
|
48
|
-
def add_interaction(
|
49
|
-
x: Register | QuantumCircuit | AbstractBlock,
|
50
|
-
*args: Any,
|
51
|
-
interaction: Interaction | Callable = Interaction.NN,
|
52
|
-
) -> QuantumCircuit | AbstractBlock:
|
53
|
-
"""Turns blocks or circuits into (a chain of) `HamEvo` blocks.
|
54
|
-
|
55
|
-
This includes a chosen interaction term.
|
56
|
-
|
57
|
-
This is a `@singledipatch`ed function which can be called in three ways:
|
58
|
-
|
59
|
-
* With a `QuantumCircuit` which contains all necessary information: `add_interaction(circuit)`
|
60
|
-
* With a `Register` and an `AbstractBlock`: `add_interaction(reg, block)`
|
61
|
-
* With an `AbstractBlock` only: `add_interaction(block)`
|
62
|
-
|
63
|
-
See the section about [analog blocks](/digital_analog_qc/analog-basics.md) for
|
64
|
-
detailed information about how which types of blocks are translated.
|
65
|
-
|
66
|
-
Arguments:
|
67
|
-
x: Circuit or block to be emulated. See the examples on which argument
|
68
|
-
combinations are accepted.
|
69
|
-
interaction: Type of interaction that is added. Can also be a function that accepts a
|
70
|
-
register and a list of edges that define which qubits interact (see the examples).
|
71
|
-
|
72
|
-
Examples:
|
73
|
-
```python exec="on" source="material-block" result="json"
|
74
|
-
from qadence import QuantumCircuit, AnalogRX, add_interaction
|
75
|
-
|
76
|
-
c = QuantumCircuit(2, AnalogRX(2.0))
|
77
|
-
e = add_interaction(c)
|
78
|
-
print(str(e.block.generator)) # markdown-exec: hide
|
79
|
-
```
|
80
|
-
You can also use `add_interaction` directly on a block, but you have to provide either
|
81
|
-
the `Register` or define a non-global qubit support.
|
82
|
-
```python exec="on" source="material-block" result="json"
|
83
|
-
from qadence import AnalogRX, Register, add_interaction
|
84
|
-
|
85
|
-
b = AnalogRX(2.0)
|
86
|
-
r = Register(1)
|
87
|
-
e = add_interaction(r, b)
|
88
|
-
print(e.generator) # markdown-exec: hide
|
89
|
-
|
90
|
-
# or provide only the block with local qubit support
|
91
|
-
# in this case the register is created via `Register(b.n_qubits)`
|
92
|
-
e = add_interaction(AnalogRX(2.0, qubit_support=(0,)))
|
93
|
-
print(e.generator)
|
94
|
-
```
|
95
|
-
You can specify a custom `interaction` function which has to accept a `Register` and a list
|
96
|
-
of `edges: list[tuple[int, int]]`:
|
97
|
-
```python exec="on" source="material-block" result="json"
|
98
|
-
from qadence import AnalogRX, Register, add_interaction
|
99
|
-
from qadence.analog.utils import ising_interaction
|
100
|
-
|
101
|
-
def int_fn(r: Register, pairs: list[tuple[int, int]]) -> AbstractBlock:
|
102
|
-
# do either something completely custom
|
103
|
-
# ...
|
104
|
-
# or e.g. change the default kwargs to `ising_interaction`
|
105
|
-
return ising_interaction(r, pairs, rydberg_level=70)
|
106
|
-
|
107
|
-
b = AnalogRX(2.0)
|
108
|
-
r = Register(1)
|
109
|
-
e = add_interaction(r, b, interaction=int_fn)
|
110
|
-
```
|
111
|
-
"""
|
112
|
-
raise ValueError(f"`add_interaction` is not implemented for {type(x)}")
|
113
|
-
|
114
|
-
|
115
|
-
@add_interaction.register # type: ignore[attr-defined]
|
116
|
-
def _(circuit: QuantumCircuit, **kwargs: Any) -> QuantumCircuit:
|
117
|
-
reg = circuit.register
|
118
|
-
return blockfn_to_circfn(lambda b: add_interaction(reg, b, **kwargs))(circuit)
|
119
|
-
|
120
|
-
|
121
|
-
@add_interaction.register # type: ignore[attr-defined]
|
122
|
-
def _(block: AbstractBlock, **kwargs: Any) -> AbstractBlock:
|
123
|
-
return add_interaction(Register(block.n_qubits), block, **kwargs)
|
124
|
-
|
125
|
-
|
126
|
-
@add_interaction.register # type: ignore[attr-defined]
|
127
|
-
def _(
|
128
|
-
register: Register,
|
129
|
-
block: AbstractBlock,
|
130
|
-
interaction: Union[Interaction, Callable] = Interaction.NN,
|
131
|
-
) -> AbstractBlock:
|
132
|
-
try:
|
133
|
-
fn = interaction if callable(interaction) else INTERACTIONS[Interaction(interaction)]
|
134
|
-
except KeyError:
|
135
|
-
raise KeyError(
|
136
|
-
"Function `add_interaction` only supports NN and XY, or a custom callable function."
|
137
|
-
)
|
138
|
-
return _add_interaction(block, register, fn) # type: ignore[arg-type]
|
139
|
-
|
140
|
-
|
141
|
-
@singledispatch
|
142
|
-
def _add_interaction(b: AbstractBlock, r: Register, interaction: Callable) -> AbstractBlock:
|
143
|
-
raise NotImplementedError(f"Cannot emulate {type(b)}")
|
144
|
-
|
145
|
-
|
146
|
-
@_add_interaction.register
|
147
|
-
def _(b: CompositeBlock, r: Register, i: Callable) -> AbstractBlock:
|
148
|
-
return _construct(type(b), tuple(map(lambda b: _add_interaction(b, r, i), b.blocks)))
|
149
|
-
|
150
|
-
|
151
|
-
@_add_interaction.register
|
152
|
-
def _(block: ScaleBlock, register: Register, interaction: Callable) -> AbstractBlock:
|
153
|
-
if isinstance(block.block, AnalogBlock):
|
154
|
-
raise NotImplementedError("Scaling emulated analog blocks is not implemented.")
|
155
|
-
return block
|
156
|
-
|
157
|
-
|
158
|
-
@_add_interaction.register
|
159
|
-
def _(block: PrimitiveBlock, register: Register, interaction: Callable) -> AbstractBlock:
|
160
|
-
return block
|
161
|
-
|
162
|
-
|
163
|
-
@_add_interaction.register
|
164
|
-
def _(block: WaitBlock, register: Register, interaction: Callable) -> AbstractBlock:
|
165
|
-
duration = block.parameters.duration
|
166
|
-
|
167
|
-
support = tuple(range(register.n_qubits))
|
168
|
-
assert support == block.qubit_support if not block.qubit_support.is_global else True
|
169
|
-
pairs = list(filter(lambda x: x[0] < x[1], product(support, support)))
|
170
|
-
|
171
|
-
return HamEvo(interaction(register, pairs), duration / 1000) if len(pairs) else I(0)
|
172
|
-
|
173
|
-
|
174
|
-
@_add_interaction.register
|
175
|
-
def _(block: ConstantAnalogRotation, register: Register, interaction: Callable) -> AbstractBlock:
|
176
|
-
# convert "global" to indexed qubit suppport so that we can re-use `kron` dispatched function
|
177
|
-
b = deepcopy(block)
|
178
|
-
b.qubit_support = QubitSupport(*range(register.n_qubits))
|
179
|
-
return _add_interaction(kron(b), register, interaction)
|
180
|
-
|
181
|
-
|
182
|
-
@_add_interaction.register
|
183
|
-
def _(block: AnalogKron, register: Register, interaction: Callable) -> AbstractBlock:
|
184
|
-
from qadence import block_to_tensor
|
185
|
-
|
186
|
-
w_block = wait(duration=block.duration, qubit_support=block.qubit_support)
|
187
|
-
i_terms = add_interaction(register, w_block, interaction=interaction)
|
188
|
-
|
189
|
-
generator = add(rot_generator(b) for b in block.blocks if isinstance(b, ConstantAnalogRotation))
|
190
|
-
generator = generator if i_terms == I(0) else generator + i_terms.generator # type: ignore[attr-defined] # noqa: E501
|
191
|
-
|
192
|
-
norm = torch.norm(block_to_tensor(generator)).item()
|
193
|
-
return HamEvo(generator / norm, norm * block.duration / 1000)
|
194
|
-
|
195
|
-
|
196
|
-
@_add_interaction.register
|
197
|
-
def _(block: AnalogChain, register: Register, interaction: Callable) -> AbstractBlock:
|
198
|
-
return chain(add_interaction(register, b, interaction=interaction) for b in block.blocks)
|
qadence/analog/utils.py
DELETED
@@ -1,132 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from math import dist as euclidean_distance
|
4
|
-
|
5
|
-
from sympy import cos, sin
|
6
|
-
|
7
|
-
from qadence.blocks.abstract import AbstractBlock
|
8
|
-
from qadence.blocks.analog import (
|
9
|
-
ConstantAnalogRotation,
|
10
|
-
)
|
11
|
-
from qadence.blocks.utils import add, kron
|
12
|
-
from qadence.operations import N, X, Y
|
13
|
-
from qadence.register import Register
|
14
|
-
|
15
|
-
# Ising coupling coefficient depending on the Rydberg level
|
16
|
-
# Include a normalization to the Planck constant hbar
|
17
|
-
# In units of [rad . µm^6 / µs]
|
18
|
-
|
19
|
-
C6_DICT = {
|
20
|
-
50: 96120.72,
|
21
|
-
51: 122241.6,
|
22
|
-
52: 154693.02,
|
23
|
-
53: 194740.36,
|
24
|
-
54: 243973.91,
|
25
|
-
55: 304495.01,
|
26
|
-
56: 378305.98,
|
27
|
-
57: 468027.05,
|
28
|
-
58: 576714.85,
|
29
|
-
59: 707911.38,
|
30
|
-
60: 865723.02,
|
31
|
-
61: 1054903.11,
|
32
|
-
62: 1281042.11,
|
33
|
-
63: 1550531.15,
|
34
|
-
64: 1870621.31,
|
35
|
-
65: 2249728.57,
|
36
|
-
66: 2697498.69,
|
37
|
-
67: 3224987.51,
|
38
|
-
68: 3844734.37,
|
39
|
-
69: 4571053.32,
|
40
|
-
70: 5420158.53,
|
41
|
-
71: 6410399.4,
|
42
|
-
72: 7562637.31,
|
43
|
-
73: 8900342.14,
|
44
|
-
74: 10449989.62,
|
45
|
-
75: 12241414.53,
|
46
|
-
76: 14308028.03,
|
47
|
-
77: 16687329.94,
|
48
|
-
78: 19421333.62,
|
49
|
-
79: 22557029.94,
|
50
|
-
80: 26146720.74,
|
51
|
-
81: 30248886.65,
|
52
|
-
82: 34928448.69,
|
53
|
-
83: 40257623.67,
|
54
|
-
84: 46316557.88,
|
55
|
-
85: 53194043.52,
|
56
|
-
86: 60988354.64,
|
57
|
-
87: 69808179.15,
|
58
|
-
88: 79773468.88,
|
59
|
-
89: 91016513.07,
|
60
|
-
90: 103677784.57,
|
61
|
-
91: 117933293.96,
|
62
|
-
92: 133943541.9,
|
63
|
-
93: 151907135.94,
|
64
|
-
94: 172036137.34,
|
65
|
-
95: 194562889.89,
|
66
|
-
96: 219741590.56,
|
67
|
-
97: 247850178.91,
|
68
|
-
98: 279192193.77,
|
69
|
-
99: 314098829.39,
|
70
|
-
100: 352931119.11,
|
71
|
-
}
|
72
|
-
|
73
|
-
|
74
|
-
def _qubitposition(register: Register, i: int) -> tuple[int, int]:
|
75
|
-
(x, y) = list(register.coords.values())[i]
|
76
|
-
return (x, y)
|
77
|
-
|
78
|
-
|
79
|
-
def ising_interaction(
|
80
|
-
register: Register, pairs: list[tuple[int, int]], rydberg_level: int = 60
|
81
|
-
) -> AbstractBlock:
|
82
|
-
"""
|
83
|
-
Computes the Rydberg Ising interaction Hamiltonian for a register of qubits.
|
84
|
-
|
85
|
-
H_int = ∑_(j<i) (C_6 / R**6) * kron(N_i, N_j)
|
86
|
-
|
87
|
-
Args:
|
88
|
-
register: the register of qubits.
|
89
|
-
pairs: a list of all pairs of interacting qubits.
|
90
|
-
rydberg_level: determines the value of C_6
|
91
|
-
"""
|
92
|
-
c6 = C6_DICT[rydberg_level]
|
93
|
-
|
94
|
-
def term(i: int, j: int) -> AbstractBlock:
|
95
|
-
qi, qj = _qubitposition(register, i), _qubitposition(register, j)
|
96
|
-
rij = euclidean_distance(qi, qj)
|
97
|
-
return (c6 / rij**6) * kron(N(i), N(j))
|
98
|
-
|
99
|
-
return add(term(i, j) for (i, j) in pairs)
|
100
|
-
|
101
|
-
|
102
|
-
def xy_interaction(
|
103
|
-
register: Register, pairs: list[tuple[int, int]], c3: float = 3700.0
|
104
|
-
) -> AbstractBlock:
|
105
|
-
"""
|
106
|
-
Computes the Rydberg XY interaction Hamiltonian for a register of qubits.
|
107
|
-
|
108
|
-
H_int = ∑_(j<i) (C_3 / R**3) * (kron(X_i, X_j) + kron(Y_i, Y_j))
|
109
|
-
|
110
|
-
Args:
|
111
|
-
register: the register of qubits.
|
112
|
-
pairs: a list of all pairs of interacting qubits.
|
113
|
-
c3: the coefficient value of C_3 in units of [rad . µm^3 / µs]
|
114
|
-
"""
|
115
|
-
|
116
|
-
def term(i: int, j: int) -> AbstractBlock:
|
117
|
-
qi, qj = _qubitposition(register, i), _qubitposition(register, j)
|
118
|
-
rij = euclidean_distance(qi, qj)
|
119
|
-
return (c3 / rij**3) * (kron(X(i), X(j)) + kron(Y(i), Y(j)))
|
120
|
-
|
121
|
-
return add(term(i, j) for (i, j) in pairs)
|
122
|
-
|
123
|
-
|
124
|
-
def rot_generator(block: ConstantAnalogRotation) -> AbstractBlock:
|
125
|
-
omega = block.parameters.omega
|
126
|
-
delta = block.parameters.delta
|
127
|
-
phase = block.parameters.phase
|
128
|
-
support = block.qubit_support
|
129
|
-
|
130
|
-
x_terms = (omega / 2) * add(cos(phase) * X(i) - sin(phase) * Y(i) for i in support)
|
131
|
-
z_terms = delta * add(N(i) for i in support)
|
132
|
-
return x_terms - z_terms # type: ignore[no-any-return]
|
File without changes
|