qadence 1.11.3__tar.gz → 1.11.5__tar.gz

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 (167) hide show
  1. {qadence-1.11.3 → qadence-1.11.5}/PKG-INFO +13 -3
  2. {qadence-1.11.3 → qadence-1.11.5}/README.md +10 -0
  3. {qadence-1.11.3 → qadence-1.11.5}/pyproject.toml +3 -3
  4. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/tensors.py +9 -0
  5. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/trainer.py +5 -2
  6. {qadence-1.11.3 → qadence-1.11.5}/qadence/states.py +129 -0
  7. {qadence-1.11.3 → qadence-1.11.5}/.coveragerc +0 -0
  8. {qadence-1.11.3 → qadence-1.11.5}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  9. {qadence-1.11.3 → qadence-1.11.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  10. {qadence-1.11.3 → qadence-1.11.5}/.github/ISSUE_TEMPLATE/new-feature.yml +0 -0
  11. {qadence-1.11.3 → qadence-1.11.5}/.github/workflows/build_docs.yml +0 -0
  12. {qadence-1.11.3 → qadence-1.11.5}/.github/workflows/lint.yml +0 -0
  13. {qadence-1.11.3 → qadence-1.11.5}/.github/workflows/test_all.yml +0 -0
  14. {qadence-1.11.3 → qadence-1.11.5}/.github/workflows/test_examples.yml +0 -0
  15. {qadence-1.11.3 → qadence-1.11.5}/.github/workflows/test_fast.yml +0 -0
  16. {qadence-1.11.3 → qadence-1.11.5}/.gitignore +0 -0
  17. {qadence-1.11.3 → qadence-1.11.5}/.pre-commit-config.yaml +0 -0
  18. {qadence-1.11.3 → qadence-1.11.5}/LICENSE +0 -0
  19. {qadence-1.11.3 → qadence-1.11.5}/MANIFEST.in +0 -0
  20. {qadence-1.11.3 → qadence-1.11.5}/mkdocs.yml +0 -0
  21. {qadence-1.11.3 → qadence-1.11.5}/qadence/__init__.py +0 -0
  22. {qadence-1.11.3 → qadence-1.11.5}/qadence/analog/__init__.py +0 -0
  23. {qadence-1.11.3 → qadence-1.11.5}/qadence/analog/addressing.py +0 -0
  24. {qadence-1.11.3 → qadence-1.11.5}/qadence/analog/constants.py +0 -0
  25. {qadence-1.11.3 → qadence-1.11.5}/qadence/analog/device.py +0 -0
  26. {qadence-1.11.3 → qadence-1.11.5}/qadence/analog/hamiltonian_terms.py +0 -0
  27. {qadence-1.11.3 → qadence-1.11.5}/qadence/analog/parse_analog.py +0 -0
  28. {qadence-1.11.3 → qadence-1.11.5}/qadence/backend.py +0 -0
  29. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/__init__.py +0 -0
  30. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/agpsr_utils.py +0 -0
  31. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/api.py +0 -0
  32. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/horqrux/__init__.py +0 -0
  33. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/horqrux/backend.py +0 -0
  34. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/horqrux/config.py +0 -0
  35. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/horqrux/convert_ops.py +0 -0
  36. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/jax_utils.py +0 -0
  37. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/parameter_shift_rules.py +0 -0
  38. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/__init__.py +0 -0
  39. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/backend.py +0 -0
  40. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/channels.py +0 -0
  41. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/cloud.py +0 -0
  42. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/config.py +0 -0
  43. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/convert_ops.py +0 -0
  44. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/devices.py +0 -0
  45. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/pulses.py +0 -0
  46. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pulser/waveforms.py +0 -0
  47. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pyqtorch/__init__.py +0 -0
  48. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pyqtorch/backend.py +0 -0
  49. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pyqtorch/config.py +0 -0
  50. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/pyqtorch/convert_ops.py +0 -0
  51. {qadence-1.11.3 → qadence-1.11.5}/qadence/backends/utils.py +0 -0
  52. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/__init__.py +0 -0
  53. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/abstract.py +0 -0
  54. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/analog.py +0 -0
  55. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/block_to_tensor.py +0 -0
  56. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/composite.py +0 -0
  57. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/embedding.py +0 -0
  58. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/manipulate.py +0 -0
  59. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/matrix.py +0 -0
  60. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/primitive.py +0 -0
  61. {qadence-1.11.3 → qadence-1.11.5}/qadence/blocks/utils.py +0 -0
  62. {qadence-1.11.3 → qadence-1.11.5}/qadence/circuit.py +0 -0
  63. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/__init__.py +0 -0
  64. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/ala.py +0 -0
  65. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/daqc/__init__.py +0 -0
  66. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/daqc/daqc.py +0 -0
  67. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/daqc/gen_parser.py +0 -0
  68. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/daqc/utils.py +0 -0
  69. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/feature_maps.py +0 -0
  70. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/hamiltonians.py +0 -0
  71. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/hea.py +0 -0
  72. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/iia.py +0 -0
  73. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/qft.py +0 -0
  74. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/rydberg_feature_maps.py +0 -0
  75. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/rydberg_hea.py +0 -0
  76. {qadence-1.11.3 → qadence-1.11.5}/qadence/constructors/utils.py +0 -0
  77. {qadence-1.11.3 → qadence-1.11.5}/qadence/decompose.py +0 -0
  78. {qadence-1.11.3 → qadence-1.11.5}/qadence/divergences.py +0 -0
  79. {qadence-1.11.3 → qadence-1.11.5}/qadence/draw/__init__.py +0 -0
  80. {qadence-1.11.3 → qadence-1.11.5}/qadence/draw/assets/dark/measurement.png +0 -0
  81. {qadence-1.11.3 → qadence-1.11.5}/qadence/draw/assets/dark/measurement.svg +0 -0
  82. {qadence-1.11.3 → qadence-1.11.5}/qadence/draw/assets/light/measurement.png +0 -0
  83. {qadence-1.11.3 → qadence-1.11.5}/qadence/draw/assets/light/measurement.svg +0 -0
  84. {qadence-1.11.3 → qadence-1.11.5}/qadence/draw/themes.py +0 -0
  85. {qadence-1.11.3 → qadence-1.11.5}/qadence/draw/utils.py +0 -0
  86. {qadence-1.11.3 → qadence-1.11.5}/qadence/draw/vizbackend.py +0 -0
  87. {qadence-1.11.3 → qadence-1.11.5}/qadence/engines/__init__.py +0 -0
  88. {qadence-1.11.3 → qadence-1.11.5}/qadence/engines/differentiable_backend.py +0 -0
  89. {qadence-1.11.3 → qadence-1.11.5}/qadence/engines/jax/__init__.py +0 -0
  90. {qadence-1.11.3 → qadence-1.11.5}/qadence/engines/jax/differentiable_backend.py +0 -0
  91. {qadence-1.11.3 → qadence-1.11.5}/qadence/engines/jax/differentiable_expectation.py +0 -0
  92. {qadence-1.11.3 → qadence-1.11.5}/qadence/engines/torch/__init__.py +0 -0
  93. {qadence-1.11.3 → qadence-1.11.5}/qadence/engines/torch/differentiable_backend.py +0 -0
  94. {qadence-1.11.3 → qadence-1.11.5}/qadence/engines/torch/differentiable_expectation.py +0 -0
  95. {qadence-1.11.3 → qadence-1.11.5}/qadence/exceptions/__init__.py +0 -0
  96. {qadence-1.11.3 → qadence-1.11.5}/qadence/exceptions/exceptions.py +0 -0
  97. {qadence-1.11.3 → qadence-1.11.5}/qadence/execution.py +0 -0
  98. {qadence-1.11.3 → qadence-1.11.5}/qadence/extensions.py +0 -0
  99. {qadence-1.11.3 → qadence-1.11.5}/qadence/libs.py +0 -0
  100. {qadence-1.11.3 → qadence-1.11.5}/qadence/log_config.yaml +0 -0
  101. {qadence-1.11.3 → qadence-1.11.5}/qadence/logger.py +0 -0
  102. {qadence-1.11.3 → qadence-1.11.5}/qadence/measurements/__init__.py +0 -0
  103. {qadence-1.11.3 → qadence-1.11.5}/qadence/measurements/protocols.py +0 -0
  104. {qadence-1.11.3 → qadence-1.11.5}/qadence/measurements/samples.py +0 -0
  105. {qadence-1.11.3 → qadence-1.11.5}/qadence/measurements/shadow.py +0 -0
  106. {qadence-1.11.3 → qadence-1.11.5}/qadence/measurements/tomography.py +0 -0
  107. {qadence-1.11.3 → qadence-1.11.5}/qadence/measurements/utils.py +0 -0
  108. {qadence-1.11.3 → qadence-1.11.5}/qadence/mitigations/__init__.py +0 -0
  109. {qadence-1.11.3 → qadence-1.11.5}/qadence/mitigations/analog_zne.py +0 -0
  110. {qadence-1.11.3 → qadence-1.11.5}/qadence/mitigations/protocols.py +0 -0
  111. {qadence-1.11.3 → qadence-1.11.5}/qadence/mitigations/readout.py +0 -0
  112. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/__init__.py +0 -0
  113. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/callbacks/__init__.py +0 -0
  114. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/callbacks/callback.py +0 -0
  115. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/callbacks/callbackmanager.py +0 -0
  116. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/callbacks/saveload.py +0 -0
  117. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/callbacks/writer_registry.py +0 -0
  118. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/config.py +0 -0
  119. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/constructors.py +0 -0
  120. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/data.py +0 -0
  121. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/information/__init__.py +0 -0
  122. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/information/information_content.py +0 -0
  123. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/loss/__init__.py +0 -0
  124. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/loss/loss.py +0 -0
  125. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/models.py +0 -0
  126. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/optimize_step.py +0 -0
  127. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/parameters.py +0 -0
  128. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/qcnn_model.py +0 -0
  129. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/stages.py +0 -0
  130. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/train_utils/__init__.py +0 -0
  131. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/train_utils/accelerator.py +0 -0
  132. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/train_utils/base_trainer.py +0 -0
  133. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/train_utils/config_manager.py +0 -0
  134. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/train_utils/distribution.py +0 -0
  135. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/train_utils/execution.py +0 -0
  136. {qadence-1.11.3 → qadence-1.11.5}/qadence/ml_tools/utils.py +0 -0
  137. {qadence-1.11.3 → qadence-1.11.5}/qadence/model.py +0 -0
  138. {qadence-1.11.3 → qadence-1.11.5}/qadence/noise/__init__.py +0 -0
  139. {qadence-1.11.3 → qadence-1.11.5}/qadence/noise/protocols.py +0 -0
  140. {qadence-1.11.3 → qadence-1.11.5}/qadence/operations/__init__.py +0 -0
  141. {qadence-1.11.3 → qadence-1.11.5}/qadence/operations/analog.py +0 -0
  142. {qadence-1.11.3 → qadence-1.11.5}/qadence/operations/control_ops.py +0 -0
  143. {qadence-1.11.3 → qadence-1.11.5}/qadence/operations/ham_evo.py +0 -0
  144. {qadence-1.11.3 → qadence-1.11.5}/qadence/operations/parametric.py +0 -0
  145. {qadence-1.11.3 → qadence-1.11.5}/qadence/operations/primitive.py +0 -0
  146. {qadence-1.11.3 → qadence-1.11.5}/qadence/overlap.py +0 -0
  147. {qadence-1.11.3 → qadence-1.11.5}/qadence/parameters.py +0 -0
  148. {qadence-1.11.3 → qadence-1.11.5}/qadence/pasqal_cloud_connection.py +0 -0
  149. {qadence-1.11.3 → qadence-1.11.5}/qadence/protocols.py +0 -0
  150. {qadence-1.11.3 → qadence-1.11.5}/qadence/py.typed +0 -0
  151. {qadence-1.11.3 → qadence-1.11.5}/qadence/qubit_support.py +0 -0
  152. {qadence-1.11.3 → qadence-1.11.5}/qadence/register.py +0 -0
  153. {qadence-1.11.3 → qadence-1.11.5}/qadence/serial_expr_grammar.peg +0 -0
  154. {qadence-1.11.3 → qadence-1.11.5}/qadence/serialization.py +0 -0
  155. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/__init__.py +0 -0
  156. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/apply_fn.py +0 -0
  157. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/block.py +0 -0
  158. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/circuit.py +0 -0
  159. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/digitalize.py +0 -0
  160. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/flatten.py +0 -0
  161. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/invert.py +0 -0
  162. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/noise.py +0 -0
  163. {qadence-1.11.3 → qadence-1.11.5}/qadence/transpile/transpile.py +0 -0
  164. {qadence-1.11.3 → qadence-1.11.5}/qadence/types.py +0 -0
  165. {qadence-1.11.3 → qadence-1.11.5}/qadence/utils.py +0 -0
  166. {qadence-1.11.3 → qadence-1.11.5}/renovate.json +0 -0
  167. {qadence-1.11.3 → qadence-1.11.5}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qadence
3
- Version: 1.11.3
3
+ Version: 1.11.5
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>, Gergana Velikova <gergana.velikova@pasqal.com>, Eduardo Maschio <eduardo.maschio@pasqal.com>, Smit Chaudhary <smit.chaudhary@pasqal.com>, Ignacio Fernández Graña <ignacio.fernandez-grana@pasqal.com>, Charles Moussa <charles.moussa@pasqal.com>, Giorgio Tosti Balducci <giorgio.tosti-balducci@pasqal.com>, Daniele Cucurachi <daniele.cucurachi@pasqal.com>, Pim Venderbosch <pim.venderbosch@pasqal.com>, Manu Lahariya <manu.lahariya@pasqal.com>, Sungwoo Ahn <sungwoo.ahn@pasqal.com>
6
6
  License: PASQAL OPEN-SOURCE SOFTWARE LICENSE (MIT-derived)
@@ -24,7 +24,7 @@ Requires-Dist: nevergrad
24
24
  Requires-Dist: numpy
25
25
  Requires-Dist: openfermion
26
26
  Requires-Dist: pasqal-cloud
27
- Requires-Dist: pyqtorch==1.7.6
27
+ Requires-Dist: pyqtorch==1.7.7
28
28
  Requires-Dist: pyyaml
29
29
  Requires-Dist: rich
30
30
  Requires-Dist: scipy
@@ -44,7 +44,7 @@ Requires-Dist: nvidia-pyindex; extra == 'dlprof'
44
44
  Provides-Extra: horqrux
45
45
  Requires-Dist: einops; extra == 'horqrux'
46
46
  Requires-Dist: flax; extra == 'horqrux'
47
- Requires-Dist: horqrux==0.8.1; extra == 'horqrux'
47
+ Requires-Dist: horqrux==0.9.0; extra == 'horqrux'
48
48
  Requires-Dist: jax; extra == 'horqrux'
49
49
  Requires-Dist: jaxopt; extra == 'horqrux'
50
50
  Requires-Dist: optax; extra == 'horqrux'
@@ -225,5 +225,15 @@ doi = {10.1109/MS.2025.3536607}
225
225
  }
226
226
  ```
227
227
 
228
+ If you use the approximate Generalized parameter shift rule for your publication, we kindly ask you to cite:
229
+ ```latex
230
+ @misc{2505.18090,
231
+ Author = {Vytautas Abramavicius and Evan Philip and Kaonan Micadei and Charles Moussa and Mario Dagrada and Vincent E. Elfving and Panagiotis Barkoutsos and Roland Guichard},
232
+ Title = {Evaluation of derivatives using approximate generalized parameter shift rule},
233
+ Year = {2025},
234
+ Eprint = {arXiv:2505.18090},
235
+ }
236
+ ```
237
+
228
238
  ## License
229
239
  Qadence is a free and open source software package, released under the PASQAL OPEN-SOURCE SOFTWARE LICENSE (MIT-derived).
@@ -150,5 +150,15 @@ doi = {10.1109/MS.2025.3536607}
150
150
  }
151
151
  ```
152
152
 
153
+ If you use the approximate Generalized parameter shift rule for your publication, we kindly ask you to cite:
154
+ ```latex
155
+ @misc{2505.18090,
156
+ Author = {Vytautas Abramavicius and Evan Philip and Kaonan Micadei and Charles Moussa and Mario Dagrada and Vincent E. Elfving and Panagiotis Barkoutsos and Roland Guichard},
157
+ Title = {Evaluation of derivatives using approximate generalized parameter shift rule},
158
+ Year = {2025},
159
+ Eprint = {arXiv:2505.18090},
160
+ }
161
+ ```
162
+
153
163
  ## License
154
164
  Qadence is a free and open source software package, released under the PASQAL OPEN-SOURCE SOFTWARE LICENSE (MIT-derived).
@@ -29,7 +29,7 @@ authors = [
29
29
  ]
30
30
  requires-python = ">=3.9"
31
31
  license = { text = "PASQAL OPEN-SOURCE SOFTWARE LICENSE (MIT-derived)" }
32
- version = "1.11.3"
32
+ version = "1.11.5"
33
33
  classifiers = [
34
34
  "License :: Other/Proprietary License",
35
35
  "Programming Language :: Python",
@@ -54,7 +54,7 @@ dependencies = [
54
54
  "jsonschema",
55
55
  "nevergrad",
56
56
  "scipy",
57
- "pyqtorch==1.7.6",
57
+ "pyqtorch==1.7.7",
58
58
  "pyyaml",
59
59
  "matplotlib",
60
60
  "Arpeggio==2.0.2",
@@ -78,7 +78,7 @@ visualization = [
78
78
  # "scour",
79
79
  ]
80
80
  horqrux = [
81
- "horqrux==0.8.1",
81
+ "horqrux==0.9.0",
82
82
  "jax",
83
83
  "flax",
84
84
  "optax",
@@ -39,3 +39,12 @@ def promote_to(x: Tensor, dtype: Any) -> float | np.ndarray | Tensor:
39
39
  return x
40
40
  else:
41
41
  raise ValueError(f"Don't know how to convert Tensor to {dtype}")
42
+
43
+
44
+ def detach_loss_metrics(
45
+ loss_metrics: tuple[torch.Tensor, dict[str, Any]],
46
+ ) -> tuple[torch.Tensor, dict[str, Any]]:
47
+ """Detach the tensors contained in the loss and metrics history."""
48
+ loss, metrics = loss_metrics
49
+ detached_metrics = {k: v.detach() if isinstance(v, Tensor) else v for k, v in metrics.items()}
50
+ return loss.detach(), detached_metrics
@@ -15,6 +15,7 @@ from qadence.ml_tools.data import DictDataLoader, OptimizeResult, data_to_device
15
15
  from qadence.ml_tools.information import InformationContent
16
16
  from qadence.ml_tools.optimize_step import optimize_step, update_ng_parameters
17
17
  from qadence.ml_tools.stages import TrainingStage
18
+ from qadence.ml_tools.tensors import detach_loss_metrics
18
19
 
19
20
  from .train_utils.base_trainer import BaseTrainer
20
21
  from .train_utils.accelerator import Accelerator
@@ -654,6 +655,8 @@ class Trainer(BaseTrainer):
654
655
  All metrics are prefixed with the proper state of the training process
655
656
  - "train_" or "val_" or "test_"
656
657
  A "{state}_loss" is added to metrics.
658
+ In order to save memory, all tensors are detached so that gradients
659
+ are not tracked.
657
660
 
658
661
  Args:
659
662
  loss_metrics (tuple[torch.Tensor, dict[str, Any]]): Original loss and metrics.
@@ -666,8 +669,8 @@ class Trainer(BaseTrainer):
666
669
  loss, metrics = loss_metrics
667
670
  updated_metrics = {f"{phase}_{key}": value for key, value in metrics.items()}
668
671
  updated_metrics[f"{phase}_loss"] = loss
669
- return loss, updated_metrics
670
- return loss_metrics
672
+ loss_metrics = (loss, updated_metrics)
673
+ return detach_loss_metrics(loss_metrics)
671
674
 
672
675
  def _aggregate_result(
673
676
  self, result: tuple[torch.Tensor, dict[str, Any]]
@@ -41,6 +41,10 @@ __all__ = [
41
41
  "DensityMatrix",
42
42
  "density_mat",
43
43
  "overlap",
44
+ "partial_trace",
45
+ "von_neumann_entropy",
46
+ "purity",
47
+ "fidelity",
44
48
  ]
45
49
 
46
50
  ATOL_64 = 1e-14 # 64 bit precision
@@ -589,3 +593,128 @@ def equivalent_state(
589
593
  fidelity = overlap(s0, s1)
590
594
  expected = torch.ones_like(fidelity)
591
595
  return torch.allclose(fidelity, expected, rtol=rtol, atol=atol) # type: ignore[no-any-return]
596
+
597
+
598
+ # DensityMatrix utility functions
599
+
600
+
601
+ def partial_trace(rho: DensityMatrix, keep_indices: list[int]) -> DensityMatrix:
602
+ """
603
+ Compute the partial trace of a density matrix for a system of several qubits with batch size.
604
+
605
+ This function also permutes qubits according to the order specified in keep_indices.
606
+
607
+ Args:
608
+ rho (DensityMatrix) : Density matrix of shape [batch_size, 2**n_qubits, 2**n_qubits].
609
+ keep_indices (list[int]): Index of the qubit subsystems to keep.
610
+
611
+ Returns:
612
+ DensityMatrix: Reduced density matrix after the partial trace,
613
+ of shape [batch_size, 2**n_keep, 2**n_keep].
614
+ """
615
+ from pyqtorch.utils import dm_partial_trace
616
+
617
+ return dm_partial_trace(rho.permute((1, 2, 0)), keep_indices).permute((2, 0, 1))
618
+
619
+
620
+ def von_neumann_entropy(rho: DensityMatrix, eps: float = 1e-12) -> torch.Tensor:
621
+ """Calculate the von Neumann entropy of a quantum density matrix.
622
+
623
+ The von Neumann entropy is defined as S(ρ) = -Tr(ρ log₂ ρ) = -∑ᵢ λᵢ log₂ λᵢ,
624
+ where λᵢ are the eigenvalues of ρ.
625
+
626
+ Args:
627
+ rho: Density matrix of shape [batch_size, dim, dim]
628
+ eps: Small value to avoid log(0) for zero eigenvalues
629
+
630
+ Returns:
631
+ Von Neumann entropy for each density matrix in the batch, shape [batch_size]
632
+ """
633
+
634
+ # Compute eigenvalues for each density matrix in the batch
635
+ # For a Hermitian density matrix, eigenvalues should be real and non-negative
636
+ eigenvalues = torch.linalg.eigvalsh(rho)
637
+
638
+ # Normalize eigenvalues to ensure they sum to 1 (trace preservation)
639
+ # This step might be redundant but helps with numerical stability
640
+ eigenvalues = eigenvalues / torch.sum(eigenvalues, dim=1, keepdim=True)
641
+
642
+ # Filter out very small eigenvalues to avoid numerical issues
643
+ valid_eigenvalues = eigenvalues.clone()
644
+ valid_eigenvalues[valid_eigenvalues < eps] = eps
645
+
646
+ # Compute the entropy: -∑ᵢ λᵢ log₂ λᵢ
647
+ # Using natural logarithm and converting to base 2
648
+ log_base_conversion = torch.log(torch.tensor(2.0, device=rho.device))
649
+ entropy = -torch.sum(
650
+ valid_eigenvalues * torch.log(valid_eigenvalues) / log_base_conversion, dim=1
651
+ )
652
+
653
+ return entropy
654
+
655
+
656
+ def purity(rho: DensityMatrix, order: int = 2) -> Tensor:
657
+ """Compute the n-th purity of a density matrix.
658
+
659
+ Args:
660
+ rho (DensityMatrix): Density matrix.
661
+ order (int, optional): Exponent n.
662
+
663
+ Returns:
664
+ Tensor: Tr[rho ** n]
665
+ """
666
+ # Compute eigenvalues
667
+ eigenvalues = torch.linalg.eigvalsh(rho)
668
+
669
+ # Compute the sum of eigenvalues raised to power n
670
+ return torch.sum(eigenvalues**order, dim=1)
671
+
672
+
673
+ def fidelity(rho: DensityMatrix, sigma: DensityMatrix) -> Tensor:
674
+ """Calculate the fidelity between two quantum states represented by density matrices.
675
+
676
+ The fidelity is defined as F(ρ,σ) = Tr[√(√ρ σ √ρ)], or equivalently,
677
+ F(ρ,σ) = ||√ρ·√σ||₁ where ||·||₁ is the trace norm.
678
+
679
+ Args:
680
+ rho: First density matrix of shape [batch_size, dim, dim]
681
+ sigma: Second density matrix of shape [batch_size, dim, dim]
682
+
683
+ Returns:
684
+ Fidelity between each pair of density matrices in the batch, shape [batch_size]
685
+ """
686
+
687
+ # Compute square root of rho
688
+ rho_eigvals, rho_eigvecs = torch.linalg.eigh(rho)
689
+
690
+ # Ensure non-negative eigenvalues
691
+ rho_eigvals = torch.clamp(rho_eigvals, min=0)
692
+
693
+ # Compute square root using eigendecomposition
694
+ sqrt_eigvals = torch.sqrt(rho_eigvals)
695
+
696
+ # Compute √ρ for each batch element
697
+ sqrt_rho = torch.zeros_like(rho)
698
+ for i in range(rho.shape[0]):
699
+ sqrt_rho[i] = torch.mm(
700
+ rho_eigvecs[i],
701
+ torch.mm(
702
+ torch.diag(sqrt_eigvals[i]).to(dtype=rho_eigvecs.dtype), rho_eigvecs[i].t().conj()
703
+ ),
704
+ )
705
+
706
+ # Compute √ρ σ √ρ for each batch element
707
+ inner_product = torch.zeros_like(rho)
708
+ for i in range(rho.shape[0]):
709
+ inner_product[i] = torch.mm(sqrt_rho[i], torch.mm(sigma[i], sqrt_rho[i]))
710
+
711
+ # Compute eigenvalues of inner product
712
+ inner_eigvals = torch.linalg.eigvalsh(inner_product)
713
+
714
+ # Ensure non-negative eigenvalues
715
+ inner_eigvals = torch.clamp(inner_eigvals, min=0)
716
+
717
+ # Compute the fidelity as the sum of the square roots of eigenvalues
718
+ fidelity_values = torch.sum(torch.sqrt(inner_eigvals), dim=1)
719
+
720
+ return fidelity_values
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes