qadence 1.11.0__tar.gz → 1.11.1__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 (165) hide show
  1. {qadence-1.11.0 → qadence-1.11.1}/PKG-INFO +3 -3
  2. {qadence-1.11.0 → qadence-1.11.1}/pyproject.toml +3 -3
  3. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/hamiltonians.py +10 -1
  4. {qadence-1.11.0 → qadence-1.11.1}/qadence/draw/utils.py +2 -1
  5. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/constructors.py +7 -2
  6. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/models.py +2 -7
  7. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/trainer.py +1 -9
  8. {qadence-1.11.0 → qadence-1.11.1}/qadence/model.py +23 -0
  9. {qadence-1.11.0 → qadence-1.11.1}/qadence/register.py +5 -1
  10. {qadence-1.11.0 → qadence-1.11.1}/.coveragerc +0 -0
  11. {qadence-1.11.0 → qadence-1.11.1}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  12. {qadence-1.11.0 → qadence-1.11.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  13. {qadence-1.11.0 → qadence-1.11.1}/.github/ISSUE_TEMPLATE/new-feature.yml +0 -0
  14. {qadence-1.11.0 → qadence-1.11.1}/.github/workflows/build_docs.yml +0 -0
  15. {qadence-1.11.0 → qadence-1.11.1}/.github/workflows/lint.yml +0 -0
  16. {qadence-1.11.0 → qadence-1.11.1}/.github/workflows/test_all.yml +0 -0
  17. {qadence-1.11.0 → qadence-1.11.1}/.github/workflows/test_examples.yml +0 -0
  18. {qadence-1.11.0 → qadence-1.11.1}/.github/workflows/test_fast.yml +0 -0
  19. {qadence-1.11.0 → qadence-1.11.1}/.gitignore +0 -0
  20. {qadence-1.11.0 → qadence-1.11.1}/.pre-commit-config.yaml +0 -0
  21. {qadence-1.11.0 → qadence-1.11.1}/LICENSE +0 -0
  22. {qadence-1.11.0 → qadence-1.11.1}/MANIFEST.in +0 -0
  23. {qadence-1.11.0 → qadence-1.11.1}/README.md +0 -0
  24. {qadence-1.11.0 → qadence-1.11.1}/mkdocs.yml +0 -0
  25. {qadence-1.11.0 → qadence-1.11.1}/qadence/__init__.py +0 -0
  26. {qadence-1.11.0 → qadence-1.11.1}/qadence/analog/__init__.py +0 -0
  27. {qadence-1.11.0 → qadence-1.11.1}/qadence/analog/addressing.py +0 -0
  28. {qadence-1.11.0 → qadence-1.11.1}/qadence/analog/constants.py +0 -0
  29. {qadence-1.11.0 → qadence-1.11.1}/qadence/analog/device.py +0 -0
  30. {qadence-1.11.0 → qadence-1.11.1}/qadence/analog/hamiltonian_terms.py +0 -0
  31. {qadence-1.11.0 → qadence-1.11.1}/qadence/analog/parse_analog.py +0 -0
  32. {qadence-1.11.0 → qadence-1.11.1}/qadence/backend.py +0 -0
  33. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/__init__.py +0 -0
  34. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/api.py +0 -0
  35. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/gpsr.py +0 -0
  36. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/horqrux/__init__.py +0 -0
  37. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/horqrux/backend.py +0 -0
  38. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/horqrux/config.py +0 -0
  39. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/horqrux/convert_ops.py +0 -0
  40. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/jax_utils.py +0 -0
  41. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/__init__.py +0 -0
  42. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/backend.py +0 -0
  43. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/channels.py +0 -0
  44. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/cloud.py +0 -0
  45. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/config.py +0 -0
  46. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/convert_ops.py +0 -0
  47. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/devices.py +0 -0
  48. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/pulses.py +0 -0
  49. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pulser/waveforms.py +0 -0
  50. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pyqtorch/__init__.py +0 -0
  51. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pyqtorch/backend.py +0 -0
  52. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pyqtorch/config.py +0 -0
  53. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/pyqtorch/convert_ops.py +0 -0
  54. {qadence-1.11.0 → qadence-1.11.1}/qadence/backends/utils.py +0 -0
  55. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/__init__.py +0 -0
  56. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/abstract.py +0 -0
  57. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/analog.py +0 -0
  58. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/block_to_tensor.py +0 -0
  59. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/composite.py +0 -0
  60. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/embedding.py +0 -0
  61. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/manipulate.py +0 -0
  62. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/matrix.py +0 -0
  63. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/primitive.py +0 -0
  64. {qadence-1.11.0 → qadence-1.11.1}/qadence/blocks/utils.py +0 -0
  65. {qadence-1.11.0 → qadence-1.11.1}/qadence/circuit.py +0 -0
  66. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/__init__.py +0 -0
  67. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/ala.py +0 -0
  68. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/daqc/__init__.py +0 -0
  69. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/daqc/daqc.py +0 -0
  70. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/daqc/gen_parser.py +0 -0
  71. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/daqc/utils.py +0 -0
  72. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/feature_maps.py +0 -0
  73. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/hea.py +0 -0
  74. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/iia.py +0 -0
  75. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/qft.py +0 -0
  76. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/rydberg_feature_maps.py +0 -0
  77. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/rydberg_hea.py +0 -0
  78. {qadence-1.11.0 → qadence-1.11.1}/qadence/constructors/utils.py +0 -0
  79. {qadence-1.11.0 → qadence-1.11.1}/qadence/decompose.py +0 -0
  80. {qadence-1.11.0 → qadence-1.11.1}/qadence/divergences.py +0 -0
  81. {qadence-1.11.0 → qadence-1.11.1}/qadence/draw/__init__.py +0 -0
  82. {qadence-1.11.0 → qadence-1.11.1}/qadence/draw/assets/dark/measurement.png +0 -0
  83. {qadence-1.11.0 → qadence-1.11.1}/qadence/draw/assets/dark/measurement.svg +0 -0
  84. {qadence-1.11.0 → qadence-1.11.1}/qadence/draw/assets/light/measurement.png +0 -0
  85. {qadence-1.11.0 → qadence-1.11.1}/qadence/draw/assets/light/measurement.svg +0 -0
  86. {qadence-1.11.0 → qadence-1.11.1}/qadence/draw/themes.py +0 -0
  87. {qadence-1.11.0 → qadence-1.11.1}/qadence/draw/vizbackend.py +0 -0
  88. {qadence-1.11.0 → qadence-1.11.1}/qadence/engines/__init__.py +0 -0
  89. {qadence-1.11.0 → qadence-1.11.1}/qadence/engines/differentiable_backend.py +0 -0
  90. {qadence-1.11.0 → qadence-1.11.1}/qadence/engines/jax/__init__.py +0 -0
  91. {qadence-1.11.0 → qadence-1.11.1}/qadence/engines/jax/differentiable_backend.py +0 -0
  92. {qadence-1.11.0 → qadence-1.11.1}/qadence/engines/jax/differentiable_expectation.py +0 -0
  93. {qadence-1.11.0 → qadence-1.11.1}/qadence/engines/torch/__init__.py +0 -0
  94. {qadence-1.11.0 → qadence-1.11.1}/qadence/engines/torch/differentiable_backend.py +0 -0
  95. {qadence-1.11.0 → qadence-1.11.1}/qadence/engines/torch/differentiable_expectation.py +0 -0
  96. {qadence-1.11.0 → qadence-1.11.1}/qadence/exceptions/__init__.py +0 -0
  97. {qadence-1.11.0 → qadence-1.11.1}/qadence/exceptions/exceptions.py +0 -0
  98. {qadence-1.11.0 → qadence-1.11.1}/qadence/execution.py +0 -0
  99. {qadence-1.11.0 → qadence-1.11.1}/qadence/extensions.py +0 -0
  100. {qadence-1.11.0 → qadence-1.11.1}/qadence/libs.py +0 -0
  101. {qadence-1.11.0 → qadence-1.11.1}/qadence/log_config.yaml +0 -0
  102. {qadence-1.11.0 → qadence-1.11.1}/qadence/logger.py +0 -0
  103. {qadence-1.11.0 → qadence-1.11.1}/qadence/measurements/__init__.py +0 -0
  104. {qadence-1.11.0 → qadence-1.11.1}/qadence/measurements/protocols.py +0 -0
  105. {qadence-1.11.0 → qadence-1.11.1}/qadence/measurements/samples.py +0 -0
  106. {qadence-1.11.0 → qadence-1.11.1}/qadence/measurements/shadow.py +0 -0
  107. {qadence-1.11.0 → qadence-1.11.1}/qadence/measurements/tomography.py +0 -0
  108. {qadence-1.11.0 → qadence-1.11.1}/qadence/measurements/utils.py +0 -0
  109. {qadence-1.11.0 → qadence-1.11.1}/qadence/mitigations/__init__.py +0 -0
  110. {qadence-1.11.0 → qadence-1.11.1}/qadence/mitigations/analog_zne.py +0 -0
  111. {qadence-1.11.0 → qadence-1.11.1}/qadence/mitigations/protocols.py +0 -0
  112. {qadence-1.11.0 → qadence-1.11.1}/qadence/mitigations/readout.py +0 -0
  113. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/__init__.py +0 -0
  114. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/callbacks/__init__.py +0 -0
  115. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/callbacks/callback.py +0 -0
  116. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/callbacks/callbackmanager.py +0 -0
  117. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/callbacks/saveload.py +0 -0
  118. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/callbacks/writer_registry.py +0 -0
  119. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/config.py +0 -0
  120. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/data.py +0 -0
  121. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/information/__init__.py +0 -0
  122. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/information/information_content.py +0 -0
  123. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/loss/__init__.py +0 -0
  124. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/loss/loss.py +0 -0
  125. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/optimize_step.py +0 -0
  126. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/parameters.py +0 -0
  127. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/stages.py +0 -0
  128. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/tensors.py +0 -0
  129. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/train_utils/__init__.py +0 -0
  130. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/train_utils/accelerator.py +0 -0
  131. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/train_utils/base_trainer.py +0 -0
  132. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/train_utils/config_manager.py +0 -0
  133. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/train_utils/distribution.py +0 -0
  134. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/train_utils/execution.py +0 -0
  135. {qadence-1.11.0 → qadence-1.11.1}/qadence/ml_tools/utils.py +0 -0
  136. {qadence-1.11.0 → qadence-1.11.1}/qadence/noise/__init__.py +0 -0
  137. {qadence-1.11.0 → qadence-1.11.1}/qadence/noise/protocols.py +0 -0
  138. {qadence-1.11.0 → qadence-1.11.1}/qadence/operations/__init__.py +0 -0
  139. {qadence-1.11.0 → qadence-1.11.1}/qadence/operations/analog.py +0 -0
  140. {qadence-1.11.0 → qadence-1.11.1}/qadence/operations/control_ops.py +0 -0
  141. {qadence-1.11.0 → qadence-1.11.1}/qadence/operations/ham_evo.py +0 -0
  142. {qadence-1.11.0 → qadence-1.11.1}/qadence/operations/parametric.py +0 -0
  143. {qadence-1.11.0 → qadence-1.11.1}/qadence/operations/primitive.py +0 -0
  144. {qadence-1.11.0 → qadence-1.11.1}/qadence/overlap.py +0 -0
  145. {qadence-1.11.0 → qadence-1.11.1}/qadence/parameters.py +0 -0
  146. {qadence-1.11.0 → qadence-1.11.1}/qadence/pasqal_cloud_connection.py +0 -0
  147. {qadence-1.11.0 → qadence-1.11.1}/qadence/protocols.py +0 -0
  148. {qadence-1.11.0 → qadence-1.11.1}/qadence/py.typed +0 -0
  149. {qadence-1.11.0 → qadence-1.11.1}/qadence/qubit_support.py +0 -0
  150. {qadence-1.11.0 → qadence-1.11.1}/qadence/serial_expr_grammar.peg +0 -0
  151. {qadence-1.11.0 → qadence-1.11.1}/qadence/serialization.py +0 -0
  152. {qadence-1.11.0 → qadence-1.11.1}/qadence/states.py +0 -0
  153. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/__init__.py +0 -0
  154. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/apply_fn.py +0 -0
  155. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/block.py +0 -0
  156. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/circuit.py +0 -0
  157. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/digitalize.py +0 -0
  158. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/flatten.py +0 -0
  159. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/invert.py +0 -0
  160. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/noise.py +0 -0
  161. {qadence-1.11.0 → qadence-1.11.1}/qadence/transpile/transpile.py +0 -0
  162. {qadence-1.11.0 → qadence-1.11.1}/qadence/types.py +0 -0
  163. {qadence-1.11.0 → qadence-1.11.1}/qadence/utils.py +0 -0
  164. {qadence-1.11.0 → qadence-1.11.1}/renovate.json +0 -0
  165. {qadence-1.11.0 → qadence-1.11.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qadence
3
- Version: 1.11.0
3
+ Version: 1.11.1
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>
6
6
  License: Apache 2.0
@@ -23,7 +23,7 @@ Requires-Dist: nevergrad
23
23
  Requires-Dist: numpy
24
24
  Requires-Dist: openfermion
25
25
  Requires-Dist: pasqal-cloud
26
- Requires-Dist: pyqtorch==1.7.1
26
+ Requires-Dist: pyqtorch==1.7.2
27
27
  Requires-Dist: pyyaml
28
28
  Requires-Dist: rich
29
29
  Requires-Dist: scipy
@@ -55,7 +55,7 @@ Requires-Dist: mlflow; extra == 'mlflow'
55
55
  Provides-Extra: protocols
56
56
  Requires-Dist: qadence-protocols; extra == 'protocols'
57
57
  Provides-Extra: pulser
58
- Requires-Dist: pasqal-cloud==0.13.0; extra == 'pulser'
58
+ Requires-Dist: pasqal-cloud==0.20.2; extra == 'pulser'
59
59
  Requires-Dist: pulser-core==1.3.0; extra == 'pulser'
60
60
  Requires-Dist: pulser-simulation==1.3.0; extra == 'pulser'
61
61
  Provides-Extra: visualization
@@ -28,7 +28,7 @@ authors = [
28
28
  ]
29
29
  requires-python = ">=3.9"
30
30
  license = { text = "Apache 2.0" }
31
- version = "1.11.0"
31
+ version = "1.11.1"
32
32
  classifiers = [
33
33
  "License :: OSI Approved :: Apache Software License",
34
34
  "Programming Language :: Python",
@@ -52,7 +52,7 @@ dependencies = [
52
52
  "jsonschema",
53
53
  "nevergrad",
54
54
  "scipy",
55
- "pyqtorch==1.7.1",
55
+ "pyqtorch==1.7.2",
56
56
  "pyyaml",
57
57
  "matplotlib",
58
58
  "Arpeggio==2.0.2",
@@ -67,7 +67,7 @@ allow-ambiguous-features = true
67
67
  pulser = [
68
68
  "pulser-core==1.3.0",
69
69
  "pulser-simulation==1.3.0",
70
- "pasqal-cloud==0.13.0",
70
+ "pasqal-cloud==0.20.2",
71
71
  ]
72
72
  visualization = [
73
73
  "graphviz",
@@ -281,6 +281,12 @@ class ObservableConfig:
281
281
  If True, the scale and shift are VariationalParameter.
282
282
  If False, the scale and shift are FeatureParameter.
283
283
  """
284
+ tag: str | None = None
285
+ """
286
+ String to indicate the name tag of the observable.
287
+
288
+ Defaults to None, in which case no tag will be applied.
289
+ """
284
290
 
285
291
  def __post_init__(self) -> None:
286
292
  if self.interaction is None and self.detuning is None:
@@ -313,6 +319,7 @@ def total_magnetization_config(
313
319
  scale=scale,
314
320
  shift=shift,
315
321
  trainable_transform=trainable_transform,
322
+ tag="Total Magnetization",
316
323
  )
317
324
 
318
325
 
@@ -327,6 +334,7 @@ def zz_hamiltonian_config(
327
334
  scale=scale,
328
335
  shift=shift,
329
336
  trainable_transform=trainable_transform,
337
+ tag="ZZ Hamiltonian",
330
338
  )
331
339
 
332
340
 
@@ -348,8 +356,9 @@ def ising_hamiltonian_config(
348
356
 
349
357
  return ObservableConfig(
350
358
  interaction=ZZ_Z_hamiltonian,
351
- detuning=Z,
359
+ detuning=X,
352
360
  scale=scale,
353
361
  shift=shift,
354
362
  trainable_transform=trainable_transform,
363
+ tag="Ising Hamiltonian",
355
364
  )
@@ -147,7 +147,8 @@ def _(model: QuantumModel, *args: Any, **kwargs: Any) -> QuantumCircuitDiagram:
147
147
  raise ValueError("Cannot visualize QuantumModel with more than one observable.")
148
148
 
149
149
  obs = deepcopy(model._observable[0].original) # type: ignore [index]
150
- obs.tag = "Obs."
150
+ if not isinstance(obs.tag, str):
151
+ obs.tag = "Obs."
151
152
 
152
153
  block: AbstractBlock = chain(model._circuit.original.block, obs)
153
154
  else:
@@ -733,7 +733,13 @@ def create_observable(
733
733
  interaction=config.interaction,
734
734
  detuning=config.detuning,
735
735
  )
736
- return add(shifting_term, detuning_hamiltonian)
736
+
737
+ obs: AbstractBlock = add(shifting_term, detuning_hamiltonian)
738
+
739
+ if isinstance(config.tag, str):
740
+ tag(obs, config.tag)
741
+
742
+ return obs
737
743
 
738
744
 
739
745
  def build_qnn_from_configs(
@@ -795,7 +801,6 @@ def build_qnn_from_configs(
795
801
  if isinstance(observable_config, list)
796
802
  else create_observable(register=register, config=observable_config)
797
803
  )
798
-
799
804
  ufa = QNN(
800
805
  circ,
801
806
  observable,
@@ -360,13 +360,8 @@ class QNN(QuantumModel):
360
360
  )
361
361
  observable_str = ""
362
362
  if self._observable:
363
- observable_str = (
364
- "observable_config = [\n"
365
- + "\n".join(
366
- (block_to_mathematical_expression(obs.original) for obs in self._observable)
367
- )
368
- + "\n]"
369
- )
363
+ observable_str = f"observable_config = {self.observables_to_expression()}"
364
+
370
365
  return f"{type(self).__name__}(\n{configs_str}\n{observable_str}\n)"
371
366
 
372
367
  return super().__str__()
@@ -530,15 +530,7 @@ class Trainer(BaseTrainer):
530
530
  self.ng_params = ng_params
531
531
  loss_metrics = loss, metrics
532
532
 
533
- # --------------------- FIX: Post-Optimization Loss --------------------- #
534
- # Because the loss/metrics are returned before the optimization. To sync
535
- # model state and current loss/metrics we calculate them again after optimization.
536
- # This is not strictly necessary.
537
- # TODO: Should be removed if loss can be logged at an unoptimized model state
538
- with torch.no_grad():
539
- post_update_loss_metrics = self.loss_fn(self.model, batch)
540
-
541
- return self._modify_batch_end_loss_metrics(post_update_loss_metrics)
533
+ return self._modify_batch_end_loss_metrics(loss_metrics)
542
534
 
543
535
  @BaseTrainer.callback("val_epoch")
544
536
  def run_validation(self, dataloader: DataLoader) -> list[tuple[torch.Tensor, dict[str, Any]]]:
@@ -27,6 +27,7 @@ from qadence.mitigations import Mitigations
27
27
  from qadence.noise import NoiseHandler
28
28
  from qadence.parameters import Parameter
29
29
  from qadence.types import DiffMode, Endianness
30
+ from qadence.utils import block_to_mathematical_expression
30
31
 
31
32
  logger = getLogger(__name__)
32
33
 
@@ -568,6 +569,28 @@ class QuantumModel(nn.Module):
568
569
  logger.warning(f"Unable to move {self} to {args}, {kwargs} due to {e}.")
569
570
  return self
570
571
 
572
+ def observables_to_expression(self) -> dict[str, str] | str:
573
+ """
574
+ Convert the observable to a dictionary representation of Pauli terms.
575
+
576
+ If no observable is set, returns an empty dictionary. Each observable is
577
+ represented by its tag (if available) as the key and its mathematical expression
578
+ as the value.
579
+
580
+ Returns:
581
+ dict[str, str]: A dictionary where the keys are observable tags (or "Obs." if not provided)
582
+ and the values are the corresponding mathematical expressions.
583
+ """
584
+ if self._observable is None:
585
+ return "No observable set."
586
+ else:
587
+ return {
588
+ obs.original.tag if obs.original.tag else "Obs.": block_to_mathematical_expression(
589
+ obs.original
590
+ )
591
+ for obs in self._observable
592
+ }
593
+
571
594
  @property
572
595
  def device(self) -> torch.device:
573
596
  """Get device.
@@ -329,8 +329,12 @@ class Register:
329
329
  return Register(g, spacing=None, device_specs=self.device_specs)
330
330
 
331
331
  def _to_dict(self) -> dict:
332
+ try:
333
+ graph_data = nx.node_link_data(self.graph, edges="links")
334
+ except TypeError: # For Python 3.9 support
335
+ graph_data = nx.node_link_data(self.graph)
332
336
  return {
333
- "graph": nx.node_link_data(self.graph),
337
+ "graph": graph_data,
334
338
  "device_specs": self.device_specs._to_dict(),
335
339
  }
336
340
 
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