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.
Files changed (46) hide show
  1. qadence/analog/__init__.py +4 -2
  2. qadence/analog/addressing.py +167 -0
  3. qadence/analog/constants.py +59 -0
  4. qadence/analog/device.py +82 -0
  5. qadence/analog/hamiltonian_terms.py +101 -0
  6. qadence/analog/parse_analog.py +120 -0
  7. qadence/backend.py +27 -1
  8. qadence/backends/braket/backend.py +1 -1
  9. qadence/backends/pulser/__init__.py +0 -1
  10. qadence/backends/pulser/backend.py +30 -15
  11. qadence/backends/pulser/config.py +19 -10
  12. qadence/backends/pulser/devices.py +57 -63
  13. qadence/backends/pulser/pulses.py +70 -12
  14. qadence/backends/pyqtorch/backend.py +2 -3
  15. qadence/backends/pyqtorch/config.py +18 -12
  16. qadence/backends/pyqtorch/convert_ops.py +12 -4
  17. qadence/backends/pytorch_wrapper.py +2 -1
  18. qadence/backends/utils.py +1 -10
  19. qadence/blocks/abstract.py +5 -1
  20. qadence/blocks/analog.py +18 -9
  21. qadence/blocks/block_to_tensor.py +11 -0
  22. qadence/blocks/primitive.py +81 -9
  23. qadence/constructors/__init__.py +4 -0
  24. qadence/constructors/feature_maps.py +84 -60
  25. qadence/constructors/hamiltonians.py +27 -98
  26. qadence/constructors/rydberg_feature_maps.py +113 -0
  27. qadence/divergences.py +12 -0
  28. qadence/draw/utils.py +1 -1
  29. qadence/extensions.py +1 -6
  30. qadence/finitediff.py +47 -0
  31. qadence/mitigations/readout.py +92 -25
  32. qadence/models/qnn.py +88 -23
  33. qadence/operations.py +55 -70
  34. qadence/parameters.py +10 -2
  35. qadence/register.py +91 -43
  36. qadence/transpile/__init__.py +1 -0
  37. qadence/transpile/apply_fn.py +40 -0
  38. qadence/transpile/block.py +15 -7
  39. qadence/types.py +19 -1
  40. qadence/utils.py +35 -0
  41. {qadence-1.1.0.dist-info → qadence-1.2.0.dist-info}/METADATA +2 -2
  42. {qadence-1.1.0.dist-info → qadence-1.2.0.dist-info}/RECORD +44 -38
  43. {qadence-1.1.0.dist-info → qadence-1.2.0.dist-info}/WHEEL +1 -1
  44. qadence/analog/interaction.py +0 -198
  45. qadence/analog/utils.py +0 -132
  46. {qadence-1.1.0.dist-info → qadence-1.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -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
- if (start == min(block.qubit_support)) and (stop == max(block.qubit_support) + 1):
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(range(start, stop)) - set(block.qubit_support))]
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
- if (start == min(block.qubit_support)) and (stop == max(block.qubit_support) + 1):
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(range(start, stop)) - set(block.qubit_support))]
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) + 1) for _ in range(length(block), total)]
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
- bs = [fill_identities(b, min(b.qubit_support), max(b.qubit_support) + 1) for b in block]
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
- bs += [id_chain(i, max_len) for i in (set(range(start, stop)) - set(block.qubit_support))]
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
- - `add_interaction`.
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.1.0
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.1
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=tBvu3P24-LDB56yKdBw-q_dM8BIXQG0GALuJvCuTI5M,14049
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=UQ9u_pyhPCAejKDOy7NFYjSlujEVvUJ3gXiUZoJbFd8,1480
5
+ qadence/divergences.py,sha256=JhpELhWSnuDvQxa9hJp_DE3EQg2Ban-Ta0mHZ_fVrHg,1832
6
6
  qadence/execution.py,sha256=zczhPbBOf91PtAso0fe3uHxnseXyJ5QHMw7melB4XmQ,9134
7
- qadence/extensions.py,sha256=zMXuPhMuIAZ8rWEnL1x69gUsQpCRf8qfu0y_2Eml3b8,3952
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=OnZnhk70Z4ltr3I1oUKPFJwVKg5HYhFURNpNL-Zukhc,37250
10
+ qadence/operations.py,sha256=7xsc3yXzngGoEHF6iaTeIHjrDKRuFhxgcxjPNoeQDH0,37143
10
11
  qadence/overlap.py,sha256=3vsg0HLOO3X8LiVgvjSc5s-cs8Di4TpEA657LWZ5HEY,17294
11
- qadence/parameters.py,sha256=zc4HLmHQpBoIm5ww1DdQW7DpnWrT6HKnS6Vog66jp_8,11833
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=CKLPiJzDLMp1hkeJgY3OX3LVG3Q5-EaEuMPWWVMWtpk,9172
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=LuXxzHhUApm0rA1sSgFpTAGfzyscaxar9Fo-zK2yQ6w,8938
18
- qadence/utils.py,sha256=QE2SvQnrKH0WijOeDjwZQfv_GCqKNbN5WSktZBLP5Vo,6818
19
- qadence/analog/__init__.py,sha256=emAi8xEwuwAQKENkD6ePbTeSMmWJG-tudpZ1stnmc7M,108
20
- qadence/analog/interaction.py,sha256=PiYORiIZUVggWXSNljyvb_-VCHRLt76TJ8OxzgKri0Y,7440
21
- qadence/analog/utils.py,sha256=5uSBZq16nMtsEY27zzqtnMasefreVFhR0XEvUSWTudc,3564
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=PoyglpSg6YGjm2P6y7-urB-oVx_Uq3HoMoyP43sFYuc,15344
27
- qadence/backends/utils.py,sha256=O8PD-8kPaGaSlxJ9cgP-gDlWb8qVmipXFoOk6whEl-w,6530
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=X94HzXBsdeV6STFNFHTR8PdajNYMxSiLFvzpJB6RCSU,8560
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=D53znqi5Ltxl1rHZ6NeltRhwwEhicrD-jI_QtKBvj1g,144
33
- qadence/backends/pulser/backend.py,sha256=qZ1k7TMOoeUFfWF_Oc2f3iIMNgtM8idXP1CAa-qJOCg,12693
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=qprNFI_ZRG-GA5ipQrJkuvpt0dgkw7JiZxrx1woMjHM,2852
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=i2vj0uWBSZ_oajJfjVE3ZOC_nre7H0eYLohK1_kjngI,2266
39
- qadence/backends/pulser/pulses.py,sha256=C9dYyIuVbj8N7pdmOsBKVXD6FqY3rzNEFShaH3kjtdo,9377
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=U0cuJtClhsYFOykTQOxpKF_mCooHkZxK-mrsWph8KKI,9418
43
- qadence/backends/pyqtorch/config.py,sha256=6g14PV8Mw7171AAiyi3-9CAiJOhky1dvolbIs_kSwBg,1722
44
- qadence/backends/pyqtorch/convert_ops.py,sha256=S3nrBI_BsgtonZ9Tzp5PDEmVi0G7uuyh5d5YH2ne2Js,15130
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=khWoHxsv-wkNMTB7lrZZ0e9LmCeBXu6z_zH9pCd5stQ,11701
47
- qadence/blocks/analog.py,sha256=qS3Hy5Hnk4935WQ3hV0LY_OSTj-1HHZDx_2GXThYO8M,10328
48
- qadence/blocks/block_to_tensor.py,sha256=d6RqRTLXFpgZT2fQVGlr4xJBWhD1uh-7BbWq0fYt6do,15972
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=yfY7UWQmkaOSgNBV5-Tnq8cI95ARflTputRhQftcAX0,14642
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=IgujYHDgyRmxECLOyt4yv4wbBTAUfu_nRX_PytkurMw,965
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=O4QkvCDDRk6yazzDe52YEchM15yMBzNdvjGVUZAa7_I,9808
58
- qadence/constructors/hamiltonians.py,sha256=nn3f93JZwTD3ALo_zxpU64gBw7jrvx11BkTObiN0ctQ,11380
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=nSIVWDta9ZA5zRBP1DoqKtD-Z1CkA4sTcZOAQ1UQmtg,12083
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=qSGly-yfYMX8QX_uGBvFKidUCOn3h0ybb3KiprVCF2k,3978
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=_SkW76jFSyuXRhUlP5lmGQZlg0Y8vgiVkxz6gYuI1Hs,5833
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=NMCoKsy9vKoKycBxtD9oa1CYtmgG9U9XeTDFsOTq1_4,416
104
- qadence/transpile/block.py,sha256=n6JU6OIpSRJ1z_2psn7d4OPzQHZe0eofM4D7Kc5ci0c,11456
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.1.0.dist-info/METADATA,sha256=DKQKf3JbXasFNaEfAtCbgKbqv48-MNLww5B_c2DIn7Q,6755
111
- qadence-1.1.0.dist-info/WHEEL,sha256=9QBuHhg6FNW7lppboF2vKVbCGTVzsFykgRQjjlajrhA,87
112
- qadence-1.1.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
113
- qadence-1.1.0.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.18.0
2
+ Generator: hatchling 1.19.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -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]