NetKet 3.11.2__tar.gz → 3.11.4__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 (307) hide show
  1. {netket-3.11.2 → netket-3.11.4}/PKG-INFO +4 -3
  2. {netket-3.11.2 → netket-3.11.4}/netket/_version.py +2 -2
  3. {netket-3.11.2 → netket-3.11.4}/netket/driver/abstract_variational_driver.py +1 -1
  4. {netket-3.11.2 → netket-3.11.4}/netket/errors.py +4 -4
  5. {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/tdvp.py +1 -1
  6. {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/tdvp_common.py +1 -1
  7. {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/tdvp_schmitt.py +1 -1
  8. {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/vmc_srt.py +1 -1
  9. {netket-3.11.2 → netket-3.11.4}/netket/experimental/dynamics/_rk_solver_structures.py +2 -2
  10. {netket-3.11.2 → netket-3.11.4}/netket/experimental/dynamics/_rk_tableau.py +7 -7
  11. {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/renyi2/exact.py +6 -0
  12. {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/_fermion_operator_2nd_base.py +38 -18
  13. {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/_fermion_operator_2nd_utils.py +21 -5
  14. {netket-3.11.2 → netket-3.11.4}/netket/experimental/qsr/driver.py +2 -2
  15. {netket-3.11.2 → netket-3.11.4}/netket/experimental/qsr/logic_helpers.py +3 -3
  16. {netket-3.11.2 → netket-3.11.4}/netket/jax/_chunk_utils.py +1 -1
  17. {netket-3.11.2 → netket-3.11.4}/netket/jax/_grad.py +3 -1
  18. {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/jacobian_pytree.py +2 -2
  19. {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/logic.py +14 -10
  20. {netket-3.11.2 → netket-3.11.4}/netket/jax/_scanmap.py +5 -3
  21. {netket-3.11.2 → netket-3.11.4}/netket/jax/_utils_random.py +4 -2
  22. {netket-3.11.2 → netket-3.11.4}/netket/jax/_utils_tree.py +18 -10
  23. {netket-3.11.2 → netket-3.11.4}/netket/jax/_vmap_chunked.py +9 -3
  24. {netket-3.11.2 → netket-3.11.4}/netket/jax/sharding.py +4 -2
  25. {netket-3.11.2 → netket-3.11.4}/netket/operator/_discrete_operator_jax.py +25 -0
  26. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/common.py +6 -4
  27. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_jacobian_common.py +3 -3
  28. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_jacobian_dense.py +1 -1
  29. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_jacobian_pytree.py +6 -6
  30. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_jacobian_pytree_logic.py +3 -3
  31. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_onthefly.py +1 -1
  32. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_onthefly_logic.py +2 -2
  33. {netket-3.11.2 → netket-3.11.4}/netket/utils/holomorphic.py +6 -6
  34. {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/pytree.py +14 -9
  35. {netket-3.11.2 → netket-3.11.4}/netket/vqs/base.py +1 -1
  36. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/common.py +1 -1
  37. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_forces.py +5 -1
  38. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_grad.py +2 -2
  39. {netket-3.11.2 → netket-3.11.4}/pyproject.toml +2 -1
  40. {netket-3.11.2 → netket-3.11.4}/.gitignore +0 -0
  41. {netket-3.11.2 → netket-3.11.4}/LICENSE +0 -0
  42. {netket-3.11.2 → netket-3.11.4}/README.md +0 -0
  43. {netket-3.11.2 → netket-3.11.4}/netket/__init__.py +0 -0
  44. {netket-3.11.2 → netket-3.11.4}/netket/callbacks/__init__.py +0 -0
  45. {netket-3.11.2 → netket-3.11.4}/netket/callbacks/convergence_stopping.py +0 -0
  46. {netket-3.11.2 → netket-3.11.4}/netket/callbacks/earlystopping.py +0 -0
  47. {netket-3.11.2 → netket-3.11.4}/netket/callbacks/invalidlossstopping.py +0 -0
  48. {netket-3.11.2 → netket-3.11.4}/netket/callbacks/timeout.py +0 -0
  49. {netket-3.11.2 → netket-3.11.4}/netket/driver/__init__.py +0 -0
  50. {netket-3.11.2 → netket-3.11.4}/netket/driver/steady_state.py +0 -0
  51. {netket-3.11.2 → netket-3.11.4}/netket/driver/vmc.py +0 -0
  52. {netket-3.11.2 → netket-3.11.4}/netket/driver/vmc_common.py +0 -0
  53. {netket-3.11.2 → netket-3.11.4}/netket/exact.py +0 -0
  54. {netket-3.11.2 → netket-3.11.4}/netket/experimental/__init__.py +0 -0
  55. {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/__init__.py +0 -0
  56. {netket-3.11.2 → netket-3.11.4}/netket/experimental/dynamics/__init__.py +0 -0
  57. {netket-3.11.2 → netket-3.11.4}/netket/experimental/dynamics/_rk_solver.py +0 -0
  58. {netket-3.11.2 → netket-3.11.4}/netket/experimental/hilbert/__init__.py +0 -0
  59. {netket-3.11.2 → netket-3.11.4}/netket/experimental/hilbert/spin_orbital_fermions.py +0 -0
  60. {netket-3.11.2 → netket-3.11.4}/netket/experimental/logging/__init__.py +0 -0
  61. {netket-3.11.2 → netket-3.11.4}/netket/experimental/logging/hdf5_log.py +0 -0
  62. {netket-3.11.2 → netket-3.11.4}/netket/experimental/models/__init__.py +0 -0
  63. {netket-3.11.2 → netket-3.11.4}/netket/experimental/models/fast_rnn.py +0 -0
  64. {netket-3.11.2 → netket-3.11.4}/netket/experimental/models/rnn.py +0 -0
  65. {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/__init__.py +0 -0
  66. {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/__init__.py +0 -0
  67. {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/cells.py +0 -0
  68. {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/layers.py +0 -0
  69. {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/layers_fast.py +0 -0
  70. {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/ordering.py +0 -0
  71. {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/__init__.py +0 -0
  72. {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/renyi2/S2_operator.py +0 -0
  73. {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/renyi2/__init__.py +0 -0
  74. {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/renyi2/expect.py +0 -0
  75. {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/__init__.py +0 -0
  76. {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/_fermion_operator_2nd_jax.py +0 -0
  77. {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/_fermion_operator_2nd_numba.py +0 -0
  78. {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/fermion.py +0 -0
  79. {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/pyscf.py +0 -0
  80. {netket-3.11.2 → netket-3.11.4}/netket/experimental/qsr/__init__.py +0 -0
  81. {netket-3.11.2 → netket-3.11.4}/netket/experimental/qsr/dataset.py +0 -0
  82. {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/__init__.py +0 -0
  83. {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/metropolis.py +0 -0
  84. {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/metropolis_pmap.py +0 -0
  85. {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/metropolis_pt.py +0 -0
  86. {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/rules/__init__.py +0 -0
  87. {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/rules/fermion_2nd.py +0 -0
  88. {netket-3.11.2 → netket-3.11.4}/netket/experimental/vqs/__init__.py +0 -0
  89. {netket-3.11.2 → netket-3.11.4}/netket/experimental/vqs/io.py +0 -0
  90. {netket-3.11.2 → netket-3.11.4}/netket/graph/__init__.py +0 -0
  91. {netket-3.11.2 → netket-3.11.4}/netket/graph/_lattice_edge_logic.py +0 -0
  92. {netket-3.11.2 → netket-3.11.4}/netket/graph/abstract_graph.py +0 -0
  93. {netket-3.11.2 → netket-3.11.4}/netket/graph/common_lattices.py +0 -0
  94. {netket-3.11.2 → netket-3.11.4}/netket/graph/graph.py +0 -0
  95. {netket-3.11.2 → netket-3.11.4}/netket/graph/lattice.py +0 -0
  96. {netket-3.11.2 → netket-3.11.4}/netket/graph/space_group.py +0 -0
  97. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/__init__.py +0 -0
  98. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/abstract_hilbert.py +0 -0
  99. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/continuous_hilbert.py +0 -0
  100. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/custom_hilbert.py +0 -0
  101. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/discrete_hilbert.py +0 -0
  102. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/doubled_hilbert.py +0 -0
  103. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/fock.py +0 -0
  104. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/homogeneous.py +0 -0
  105. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/index/__init__.py +0 -0
  106. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/index/base.py +0 -0
  107. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/index/constrained.py +0 -0
  108. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/index/unconstrained.py +0 -0
  109. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/particle.py +0 -0
  110. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/qubit.py +0 -0
  111. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/__init__.py +0 -0
  112. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/base.py +0 -0
  113. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/custom.py +0 -0
  114. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/doubled.py +0 -0
  115. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/fock.py +0 -0
  116. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/particle.py +0 -0
  117. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/qubit.py +0 -0
  118. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/spin.py +0 -0
  119. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/tensor_hilbert.py +0 -0
  120. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/spin.py +0 -0
  121. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/tensor_hilbert.py +0 -0
  122. {netket-3.11.2 → netket-3.11.4}/netket/hilbert/tensor_hilbert_discrete.py +0 -0
  123. {netket-3.11.2 → netket-3.11.4}/netket/jax/__init__.py +0 -0
  124. {netket-3.11.2 → netket-3.11.4}/netket/jax/_expect.py +0 -0
  125. {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/__init__.py +0 -0
  126. {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/default_mode.py +0 -0
  127. {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/jacobian_dense.py +0 -0
  128. {netket-3.11.2 → netket-3.11.4}/netket/jax/_math.py +0 -0
  129. {netket-3.11.2 → netket-3.11.4}/netket/jax/_utils_dtype.py +0 -0
  130. {netket-3.11.2 → netket-3.11.4}/netket/jax/_vjp.py +0 -0
  131. {netket-3.11.2 → netket-3.11.4}/netket/jax/_vjp_chunked.py +0 -0
  132. {netket-3.11.2 → netket-3.11.4}/netket/logging/__init__.py +0 -0
  133. {netket-3.11.2 → netket-3.11.4}/netket/logging/base.py +0 -0
  134. {netket-3.11.2 → netket-3.11.4}/netket/logging/json_log.py +0 -0
  135. {netket-3.11.2 → netket-3.11.4}/netket/logging/runtime_log.py +0 -0
  136. {netket-3.11.2 → netket-3.11.4}/netket/logging/state_log.py +0 -0
  137. {netket-3.11.2 → netket-3.11.4}/netket/logging/tensorboard.py +0 -0
  138. {netket-3.11.2 → netket-3.11.4}/netket/models/README.md +0 -0
  139. {netket-3.11.2 → netket-3.11.4}/netket/models/__init__.py +0 -0
  140. {netket-3.11.2 → netket-3.11.4}/netket/models/autoreg.py +0 -0
  141. {netket-3.11.2 → netket-3.11.4}/netket/models/deepset.py +0 -0
  142. {netket-3.11.2 → netket-3.11.4}/netket/models/equivariant.py +0 -0
  143. {netket-3.11.2 → netket-3.11.4}/netket/models/fast_autoreg.py +0 -0
  144. {netket-3.11.2 → netket-3.11.4}/netket/models/full_space.py +0 -0
  145. {netket-3.11.2 → netket-3.11.4}/netket/models/gaussian.py +0 -0
  146. {netket-3.11.2 → netket-3.11.4}/netket/models/jastrow.py +0 -0
  147. {netket-3.11.2 → netket-3.11.4}/netket/models/mlp.py +0 -0
  148. {netket-3.11.2 → netket-3.11.4}/netket/models/mps.py +0 -0
  149. {netket-3.11.2 → netket-3.11.4}/netket/models/ndm.py +0 -0
  150. {netket-3.11.2 → netket-3.11.4}/netket/models/rbm.py +0 -0
  151. {netket-3.11.2 → netket-3.11.4}/netket/models/slater.py +0 -0
  152. {netket-3.11.2 → netket-3.11.4}/netket/models/utils.py +0 -0
  153. {netket-3.11.2 → netket-3.11.4}/netket/nn/__init__.py +0 -0
  154. {netket-3.11.2 → netket-3.11.4}/netket/nn/activation.py +0 -0
  155. {netket-3.11.2 → netket-3.11.4}/netket/nn/blocks/__init__.py +0 -0
  156. {netket-3.11.2 → netket-3.11.4}/netket/nn/blocks/deepset.py +0 -0
  157. {netket-3.11.2 → netket-3.11.4}/netket/nn/blocks/mlp.py +0 -0
  158. {netket-3.11.2 → netket-3.11.4}/netket/nn/blocks/symmetry_sum.py +0 -0
  159. {netket-3.11.2 → netket-3.11.4}/netket/nn/deprecation.py +0 -0
  160. {netket-3.11.2 → netket-3.11.4}/netket/nn/fast_masked_linear.py +0 -0
  161. {netket-3.11.2 → netket-3.11.4}/netket/nn/initializers.py +0 -0
  162. {netket-3.11.2 → netket-3.11.4}/netket/nn/masked_linear.py +0 -0
  163. {netket-3.11.2 → netket-3.11.4}/netket/nn/symmetric_linear.py +0 -0
  164. {netket-3.11.2 → netket-3.11.4}/netket/nn/utils.py +0 -0
  165. {netket-3.11.2 → netket-3.11.4}/netket/operator/__init__.py +0 -0
  166. {netket-3.11.2 → netket-3.11.4}/netket/operator/_abstract_observable.py +0 -0
  167. {netket-3.11.2 → netket-3.11.4}/netket/operator/_abstract_operator.py +0 -0
  168. {netket-3.11.2 → netket-3.11.4}/netket/operator/_abstract_super_operator.py +0 -0
  169. {netket-3.11.2 → netket-3.11.4}/netket/operator/_bose_hubbard.py +0 -0
  170. {netket-3.11.2 → netket-3.11.4}/netket/operator/_continuous_operator.py +0 -0
  171. {netket-3.11.2 → netket-3.11.4}/netket/operator/_discrete_operator.py +0 -0
  172. {netket-3.11.2 → netket-3.11.4}/netket/operator/_graph_operator.py +0 -0
  173. {netket-3.11.2 → netket-3.11.4}/netket/operator/_hamiltonian.py +0 -0
  174. {netket-3.11.2 → netket-3.11.4}/netket/operator/_heisenberg.py +0 -0
  175. {netket-3.11.2 → netket-3.11.4}/netket/operator/_ising/__init__.py +0 -0
  176. {netket-3.11.2 → netket-3.11.4}/netket/operator/_ising/base.py +0 -0
  177. {netket-3.11.2 → netket-3.11.4}/netket/operator/_ising/jax.py +0 -0
  178. {netket-3.11.2 → netket-3.11.4}/netket/operator/_ising/numba.py +0 -0
  179. {netket-3.11.2 → netket-3.11.4}/netket/operator/_kinetic.py +0 -0
  180. {netket-3.11.2 → netket-3.11.4}/netket/operator/_lazy.py +0 -0
  181. {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_liouvillian.py +0 -0
  182. {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/__init__.py +0 -0
  183. {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/base.py +0 -0
  184. {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/compile_helpers.py +0 -0
  185. {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/convert.py +0 -0
  186. {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/helpers.py +0 -0
  187. {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/jax.py +0 -0
  188. {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/numba.py +0 -0
  189. {netket-3.11.2 → netket-3.11.4}/netket/operator/_pauli_strings/__init__.py +0 -0
  190. {netket-3.11.2 → netket-3.11.4}/netket/operator/_pauli_strings/base.py +0 -0
  191. {netket-3.11.2 → netket-3.11.4}/netket/operator/_pauli_strings/jax.py +0 -0
  192. {netket-3.11.2 → netket-3.11.4}/netket/operator/_pauli_strings/numba.py +0 -0
  193. {netket-3.11.2 → netket-3.11.4}/netket/operator/_potential.py +0 -0
  194. {netket-3.11.2 → netket-3.11.4}/netket/operator/_sumoperators.py +0 -0
  195. {netket-3.11.2 → netket-3.11.4}/netket/operator/boson.py +0 -0
  196. {netket-3.11.2 → netket-3.11.4}/netket/operator/spin.py +0 -0
  197. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/__init__.py +0 -0
  198. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/linear_operator.py +0 -0
  199. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/preconditioner.py +0 -0
  200. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/__init__.py +0 -0
  201. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/default.py +0 -0
  202. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/solver/__init__.py +0 -0
  203. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/solver/solvers.py +0 -0
  204. {netket-3.11.2 → netket-3.11.4}/netket/optimizer/sr.py +0 -0
  205. {netket-3.11.2 → netket-3.11.4}/netket/sampler/__init__.py +0 -0
  206. {netket-3.11.2 → netket-3.11.4}/netket/sampler/autoreg.py +0 -0
  207. {netket-3.11.2 → netket-3.11.4}/netket/sampler/base.py +0 -0
  208. {netket-3.11.2 → netket-3.11.4}/netket/sampler/exact.py +0 -0
  209. {netket-3.11.2 → netket-3.11.4}/netket/sampler/metropolis.py +0 -0
  210. {netket-3.11.2 → netket-3.11.4}/netket/sampler/metropolis_numpy.py +0 -0
  211. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/__init__.py +0 -0
  212. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/base.py +0 -0
  213. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/continuous_gaussian.py +0 -0
  214. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/custom_numpy.py +0 -0
  215. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/exchange.py +0 -0
  216. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/fixed.py +0 -0
  217. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/hamiltonian.py +0 -0
  218. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/hamiltonian_numpy.py +0 -0
  219. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/langevin.py +0 -0
  220. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/local.py +0 -0
  221. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/local_numpy.py +0 -0
  222. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/multiple.py +0 -0
  223. {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/tensor.py +0 -0
  224. {netket-3.11.2 → netket-3.11.4}/netket/stats/__init__.py +0 -0
  225. {netket-3.11.2 → netket-3.11.4}/netket/stats/_autocorr.py +0 -0
  226. {netket-3.11.2 → netket-3.11.4}/netket/stats/mc_stats.py +0 -0
  227. {netket-3.11.2 → netket-3.11.4}/netket/stats/mc_stats_old.py +0 -0
  228. {netket-3.11.2 → netket-3.11.4}/netket/stats/mpi_stats.py +0 -0
  229. {netket-3.11.2 → netket-3.11.4}/netket/tools/__init__.py +0 -0
  230. {netket-3.11.2 → netket-3.11.4}/netket/tools/_common.py +0 -0
  231. {netket-3.11.2 → netket-3.11.4}/netket/tools/_cpu_info.py +0 -0
  232. {netket-3.11.2 → netket-3.11.4}/netket/tools/_mpi_info.py +0 -0
  233. {netket-3.11.2 → netket-3.11.4}/netket/tools/check_mpi.py +0 -0
  234. {netket-3.11.2 → netket-3.11.4}/netket/tools/info.py +0 -0
  235. {netket-3.11.2 → netket-3.11.4}/netket/utils/__init__.py +0 -0
  236. {netket-3.11.2 → netket-3.11.4}/netket/utils/_dependencies_check.py +0 -0
  237. {netket-3.11.2 → netket-3.11.4}/netket/utils/array.py +0 -0
  238. {netket-3.11.2 → netket-3.11.4}/netket/utils/config_flags.py +0 -0
  239. {netket-3.11.2 → netket-3.11.4}/netket/utils/deprecation.py +0 -0
  240. {netket-3.11.2 → netket-3.11.4}/netket/utils/dispatch.py +0 -0
  241. {netket-3.11.2 → netket-3.11.4}/netket/utils/float.py +0 -0
  242. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/__init__.py +0 -0
  243. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/_group.py +0 -0
  244. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/_permutation_group.py +0 -0
  245. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/_point_group.py +0 -0
  246. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/_semigroup.py +0 -0
  247. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/axial.py +0 -0
  248. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/cubic.py +0 -0
  249. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/icosa.py +0 -0
  250. {netket-3.11.2 → netket-3.11.4}/netket/utils/group/planar.py +0 -0
  251. {netket-3.11.2 → netket-3.11.4}/netket/utils/history.py +0 -0
  252. {netket-3.11.2 → netket-3.11.4}/netket/utils/jax.py +0 -0
  253. {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/__init__.py +0 -0
  254. {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/base.py +0 -0
  255. {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/flax.py +0 -0
  256. {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/haiku.py +0 -0
  257. {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/jax.py +0 -0
  258. {netket-3.11.2 → netket-3.11.4}/netket/utils/moduletools.py +0 -0
  259. {netket-3.11.2 → netket-3.11.4}/netket/utils/mpi/__init__.py +0 -0
  260. {netket-3.11.2 → netket-3.11.4}/netket/utils/mpi/mpi.py +0 -0
  261. {netket-3.11.2 → netket-3.11.4}/netket/utils/mpi/primitives.py +0 -0
  262. {netket-3.11.2 → netket-3.11.4}/netket/utils/numbers.py +0 -0
  263. {netket-3.11.2 → netket-3.11.4}/netket/utils/optional_deps.py +0 -0
  264. {netket-3.11.2 → netket-3.11.4}/netket/utils/partial.py +0 -0
  265. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/__init__.py +0 -0
  266. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/_version.py +0 -0
  267. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/alias.py +0 -0
  268. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/autoreload.py +0 -0
  269. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/dispatcher.py +0 -0
  270. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/function.py +0 -0
  271. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/method.py +0 -0
  272. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/overload.py +0 -0
  273. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/parametric.py +0 -0
  274. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/promotion.py +0 -0
  275. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/py.typed +0 -0
  276. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/repr.py +0 -0
  277. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/resolver.py +0 -0
  278. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/signature.py +0 -0
  279. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/type.py +0 -0
  280. {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/util.py +0 -0
  281. {netket-3.11.2 → netket-3.11.4}/netket/utils/seed.py +0 -0
  282. {netket-3.11.2 → netket-3.11.4}/netket/utils/static_number.py +0 -0
  283. {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/__init__.py +0 -0
  284. {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/dataclass.py +0 -0
  285. {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/fields.py +0 -0
  286. {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/utils.py +0 -0
  287. {netket-3.11.2 → netket-3.11.4}/netket/utils/summation.py +0 -0
  288. {netket-3.11.2 → netket-3.11.4}/netket/utils/types.py +0 -0
  289. {netket-3.11.2 → netket-3.11.4}/netket/utils/version_check.py +0 -0
  290. {netket-3.11.2 → netket-3.11.4}/netket/vqs/__init__.py +0 -0
  291. {netket-3.11.2 → netket-3.11.4}/netket/vqs/deprecated.py +0 -0
  292. {netket-3.11.2 → netket-3.11.4}/netket/vqs/experimental.py +0 -0
  293. {netket-3.11.2 → netket-3.11.4}/netket/vqs/full_summ/__init__.py +0 -0
  294. {netket-3.11.2 → netket-3.11.4}/netket/vqs/full_summ/expect.py +0 -0
  295. {netket-3.11.2 → netket-3.11.4}/netket/vqs/full_summ/state.py +0 -0
  296. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/__init__.py +0 -0
  297. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/kernels.py +0 -0
  298. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_mixed_state/__init__.py +0 -0
  299. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_mixed_state/expect.py +0 -0
  300. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_mixed_state/expect_chunked.py +0 -0
  301. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_mixed_state/state.py +0 -0
  302. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/__init__.py +0 -0
  303. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect.py +0 -0
  304. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_chunked.py +0 -0
  305. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_forces_chunked.py +0 -0
  306. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_grad_chunked.py +0 -0
  307. {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/state.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: NetKet
3
- Version: 3.11.2
3
+ Version: 3.11.4
4
4
  Summary: Netket : Machine Learning toolbox for many-body quantum systems.
5
5
  Project-URL: homepage, https://www.netket.org
6
6
  Project-URL: documentation, https://netket.readthedocs.io/en/latest/#
@@ -26,7 +26,7 @@ Requires-Dist: jaxlib<0.5,>=0.4.3
26
26
  Requires-Dist: numba4jax<0.1,>=0.0.10.post1
27
27
  Requires-Dist: numba<0.60,>=0.52
28
28
  Requires-Dist: numpy~=1.20
29
- Requires-Dist: optax<0.2,>=0.1.3
29
+ Requires-Dist: optax<0.3,>=0.1.3
30
30
  Requires-Dist: orjson<4,>=3.4
31
31
  Requires-Dist: rich>=10.0
32
32
  Requires-Dist: scipy<2,>=1.5.3
@@ -44,6 +44,7 @@ Requires-Dist: pytest-cov>=2.10.1; extra == 'dev'
44
44
  Requires-Dist: pytest-json-report>=1.3; extra == 'dev'
45
45
  Requires-Dist: pytest-xdist[psutil]>=2; extra == 'dev'
46
46
  Requires-Dist: pytest>=6; extra == 'dev'
47
+ Requires-Dist: qutip>=5; extra == 'dev'
47
48
  Requires-Dist: ruff==0.1.0; extra == 'dev'
48
49
  Requires-Dist: wheel; extra == 'dev'
49
50
  Provides-Extra: docs
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '3.11.2'
16
- __version_tuple__ = version_tuple = (3, 11, 2)
15
+ __version__ = version = '3.11.4'
16
+ __version_tuple__ = version_tuple = (3, 11, 4)
@@ -376,7 +376,7 @@ class AbstractVariationalDriver(abc.ABC):
376
376
 
377
377
  # Do not unpack operators, even if they are pytrees!
378
378
  # this is necessary to support jax operators.
379
- return jax.tree_map(
379
+ return jax.tree_util.tree_map(
380
380
  self._estimate_stats,
381
381
  observables,
382
382
  is_leaf=lambda x: isinstance(x, AbstractObservable),
@@ -587,7 +587,7 @@ class RealQGTComplexDomainError(NetketError):
587
587
  >>> _, vec = vstate.expect_and_grad(nk.operator.spin.sigmax(vstate.hilbert, 1))
588
588
  >>> G = nk.optimizer.qgt.QGTOnTheFly(vstate, holomorphic=False)
589
589
  >>>
590
- >>> vec_real = jax.tree_map(lambda x: x.real, vec)
590
+ >>> vec_real = jax.tree.map(lambda x: x.real, vec)
591
591
  >>> sol = G@vec_real
592
592
 
593
593
  Or, if you used the QGT in a linear solver, try using:
@@ -601,7 +601,7 @@ class RealQGTComplexDomainError(NetketError):
601
601
  >>> _, vec = vstate.expect_and_grad(nk.operator.spin.sigmax(vstate.hilbert, 1))
602
602
  >>>
603
603
  >>> G = nk.optimizer.qgt.QGTOnTheFly(vstate, holomorphic=False)
604
- >>> vec_real = jax.tree_map(lambda x: x.real, vec)
604
+ >>> vec_real = jax.tree.map(lambda x: x.real, vec)
605
605
  >>>
606
606
  >>> linear_solver = jax.scipy.sparse.linalg.cg
607
607
  >>> solution, info = G.solve(linear_solver, vec_real)
@@ -624,14 +624,14 @@ class RealQGTComplexDomainError(NetketError):
624
624
 
625
625
  .. code:: python
626
626
 
627
- >>> vec_real = jax.tree_map(lambda x: x.real, vec)
627
+ >>> vec_real = jax.tree_util.tree_map(lambda x: x.real, vec)
628
628
  >>> G@vec_real
629
629
 
630
630
  If you used the QGT in a linear solver, try using:
631
631
 
632
632
  .. code:: python
633
633
 
634
- >>> vec_real = jax.tree_map(lambda x: x.real, vec)
634
+ >>> vec_real = jax.tree_util.tree_map(lambda x: x.real, vec)
635
635
  >>> G.solve(linear_solver, vec_real)
636
636
 
637
637
  to fix this error.
@@ -162,7 +162,7 @@ def odefun_tdvp( # noqa: F811
162
162
 
163
163
  @partial(jax.jit, static_argnums=(3, 4))
164
164
  def _map_parameters(forces, parameters, loss_grad_factor, propagation_type, state_T):
165
- forces = jax.tree_map(
165
+ forces = jax.tree_util.tree_map(
166
166
  lambda x, target: loss_grad_factor * x,
167
167
  forces,
168
168
  parameters,
@@ -478,7 +478,7 @@ def odefun_host_callback(state, driver, *args, **kwargs):
478
478
  if config.netket_experimental_disable_ode_jit:
479
479
  return odefun(state, driver, *args, **kwargs)
480
480
 
481
- result_shape = jax.tree_map(
481
+ result_shape = jax.tree_util.tree_map(
482
482
  lambda x: jax.ShapeDtypeStruct(x.shape, x.dtype),
483
483
  state.parameters,
484
484
  )
@@ -280,7 +280,7 @@ def odefun_schmitt(state: MCState, self: TDVPSchmitt, t, w, *, stage=0): # noqa
280
280
 
281
281
  @partial(jax.jit, static_argnums=(3, 4))
282
282
  def _map_parameters(forces, parameters, loss_grad_factor, propagation_type, state_T):
283
- forces = jax.tree_map(
283
+ forces = jax.tree_util.tree_map(
284
284
  lambda x, target: loss_grad_factor * x,
285
285
  forces,
286
286
  parameters,
@@ -210,7 +210,7 @@ class VMC_SRt(AbstractVariationalDriver):
210
210
  self.jacobian_mode = jacobian_mode
211
211
  self._linear_solver_fn = linear_solver_fn
212
212
 
213
- self._params_structure = jax.tree_map(
213
+ self._params_structure = jax.tree_util.tree_map(
214
214
  lambda x: jax.ShapeDtypeStruct(x.shape, x.dtype), self.state.parameters
215
215
  )
216
216
  if not nkjax.tree_ishomogeneous(self._params_structure):
@@ -104,7 +104,7 @@ def euclidean_norm(x: Union[PyTree, Array]):
104
104
  return jnp.sqrt(
105
105
  jax.tree_util.tree_reduce(
106
106
  lambda x, y: x + y,
107
- jax.tree_map(lambda x: jnp.sum(jnp.abs(x) ** 2), x),
107
+ jax.tree_util.tree_map(lambda x: jnp.sum(jnp.abs(x) ** 2), x),
108
108
  )
109
109
  )
110
110
 
@@ -119,7 +119,7 @@ def maximum_norm(x: Union[PyTree, Array]):
119
119
  return jnp.sqrt(
120
120
  jax.tree_util.tree_reduce(
121
121
  jnp.maximum,
122
- jax.tree_map(lambda x: jnp.max(jnp.abs(x)), x),
122
+ jax.tree_util.tree_map(lambda x: jnp.max(jnp.abs(x)), x),
123
123
  )
124
124
  )
125
125
 
@@ -32,7 +32,7 @@ def expand_dim(tree: PyTree, sz: int):
32
32
  def _expand(x):
33
33
  return jnp.zeros((sz, *x.shape), dtype=x.dtype)
34
34
 
35
- return jax.tree_map(_expand, tree)
35
+ return jax.tree_util.tree_map(_expand, tree)
36
36
 
37
37
 
38
38
  @dataclass
@@ -114,19 +114,19 @@ class TableauRKExplicit:
114
114
 
115
115
  k = expand_dim(y_t, self.stages)
116
116
  for l in range(self.stages):
117
- dy_l = jax.tree_map(
117
+ dy_l = jax.tree_util.tree_map(
118
118
  lambda k: jnp.tensordot(
119
119
  jnp.asarray(self.a[l], dtype=k.dtype), k, axes=1
120
120
  ),
121
121
  k,
122
122
  )
123
- y_l = jax.tree_map(
123
+ y_l = jax.tree_util.tree_map(
124
124
  lambda y_t, dy_l: jnp.asarray(y_t + dt * dy_l, dtype=dy_l.dtype),
125
125
  y_t,
126
126
  dy_l,
127
127
  )
128
128
  k_l = f(times[l], y_l, stage=l)
129
- k = jax.tree_map(lambda k, k_l: k.at[l].set(k_l), k, k_l)
129
+ k = jax.tree_util.tree_map(lambda k, k_l: k.at[l].set(k_l), k, k_l)
130
130
 
131
131
  return k
132
132
 
@@ -141,7 +141,7 @@ class TableauRKExplicit:
141
141
  k = self._compute_slopes(f, t, dt, y_t)
142
142
 
143
143
  b = self.b[0] if self.b.ndim == 2 else self.b
144
- y_tp1 = jax.tree_map(
144
+ y_tp1 = jax.tree_util.tree_map(
145
145
  lambda y_t, k: y_t
146
146
  + jnp.asarray(dt, dtype=y_t.dtype)
147
147
  * jnp.tensordot(jnp.asarray(b, dtype=k.dtype), k, axes=1),
@@ -167,7 +167,7 @@ class TableauRKExplicit:
167
167
 
168
168
  k = self._compute_slopes(f, t, dt, y_t)
169
169
 
170
- y_tp1 = jax.tree_map(
170
+ y_tp1 = jax.tree_util.tree_map(
171
171
  lambda y_t, k: y_t
172
172
  + jnp.asarray(dt, dtype=y_t.dtype)
173
173
  * jnp.tensordot(jnp.asarray(self.b[0], dtype=k.dtype), k, axes=1),
@@ -175,7 +175,7 @@ class TableauRKExplicit:
175
175
  k,
176
176
  )
177
177
  db = self.b[0] - self.b[1]
178
- y_err = jax.tree_map(
178
+ y_err = jax.tree_util.tree_map(
179
179
  lambda k: jnp.asarray(dt, dtype=k.dtype)
180
180
  * jnp.tensordot(jnp.asarray(db, dtype=k.dtype), k, axes=1),
181
181
  k,
@@ -16,6 +16,7 @@ import numpy as np
16
16
 
17
17
  from netket.vqs import FullSumState, expect
18
18
  from netket.stats import Stats
19
+ from netket.utils import module_version
19
20
 
20
21
  from .S2_operator import Renyi2EntanglementEntropy
21
22
 
@@ -37,6 +38,11 @@ def Renyi2(vstate: FullSumState, op: Renyi2EntanglementEntropy):
37
38
 
38
39
  rdm = state_qutip.ptrace(np.arange(N)[mask])
39
40
 
41
+ # TODO: when we drop support for qutip older versions, always keep this
42
+ # qutip 5 was released in march 2024
43
+ if module_version("qutip") >= (5, 0, 0):
44
+ rdm = rdm.data.to_array()
45
+
40
46
  n = 2
41
47
  out = np.log2(np.trace(np.linalg.matrix_power(rdm, n))) / (1 - n)
42
48
  out = np.absolute(out.real)
@@ -19,9 +19,9 @@ import numpy as np
19
19
  from numbers import Number
20
20
 
21
21
  from netket.utils.types import DType
22
- from netket.operator._discrete_operator import DiscreteOperator
22
+ from netket.operator import DiscreteOperator, Transpose
23
23
  from netket.operator._pauli_strings.base import _count_of_locations
24
- from netket.hilbert.abstract_hilbert import AbstractHilbert
24
+ from netket.hilbert import AbstractHilbert
25
25
  from netket.utils.numbers import is_scalar, dtype as _dtype
26
26
  from netket.utils.optional_deps import import_optional_dependency
27
27
 
@@ -31,7 +31,7 @@ from ._fermion_operator_2nd_utils import (
31
31
  _convert_terms_to_spin_blocks,
32
32
  _canonicalize_input,
33
33
  _check_hermitian,
34
- _herm_conj,
34
+ transpose_term,
35
35
  _remove_dict_zeros,
36
36
  _verify_input,
37
37
  OperatorDict,
@@ -267,10 +267,18 @@ class FermionOperator2ndBase(DiscreteOperator):
267
267
  def operators(self) -> OperatorDict:
268
268
  """Returns a dictionary with (term, weight) key-value pairs, with terms in tuple notation.
269
269
 
270
- The constant diagonal shift of the operator is associated with a term represented as an empty tuple.
270
+ The constant diagonal shift of the operator is associated with a term represented as an
271
+ empty tuple.
271
272
  """
272
273
  return self._operators
273
274
 
275
+ @property
276
+ def cutoff(self) -> float:
277
+ """Threshold for the weights, if the absolute value of a weight is below the
278
+ cutoff, it's discarded.
279
+ """
280
+ return self._cutoff
281
+
274
282
  def copy(self, *, dtype: Optional[DType] = None, cutoff=None):
275
283
  """
276
284
  Creates a deep copy of this operator, potentially changing the dtype of the
@@ -458,23 +466,35 @@ class FermionOperator2ndBase(DiscreteOperator):
458
466
  op = self.copy(dtype=dtype)
459
467
  return op.__imul__(scalar)
460
468
 
469
+ def transpose(self, *, concrete=False):
470
+ r"""Returns the transpose of this operator.
471
+
472
+ For real operators, this is equivalent to complex conjugation.
473
+ This implementation always returns the concrete version of the operator.
474
+ """
475
+ if concrete:
476
+ new = type(self)(self.hilbert, dtype=self.dtype, cutoff=self._cutoff)
477
+ # operators (c,c†) are real already. Only conjugate coefficients if needed.
478
+ new._operators = {transpose_term(k): v for k, v in self._operators.items()}
479
+ return new
480
+ else:
481
+ return Transpose(self)
482
+
461
483
  def conjugate(self, *, concrete=False):
462
- r"""Returns the complex conjugate of this operator."""
484
+ r"""Returns the complex conjugate of this operator.
463
485
 
464
- terms = list(self._operators.keys())
465
- weights = list(self._operators.values())
466
- terms, weights = _herm_conj(terms, weights) # changes also the terms
486
+ This implementation always returns the concrete version of the operator.
487
+ """
488
+ del concrete
467
489
 
468
- cls = type(self)
469
- new = cls(
470
- self.hilbert,
471
- dtype=self.dtype,
472
- )
473
- new._operators, _ = _canonicalize_input(
474
- terms, weights, self.dtype, self._cutoff
475
- )
476
- new._cutoff = self._cutoff
477
- return new
490
+ # if operator is real dtype, then just return a copy
491
+ if not np.issubdtype(self.dtype, np.complex_):
492
+ return self.copy()
493
+ else:
494
+ new = type(self)(self.hilbert, dtype=self.dtype, cutoff=self._cutoff)
495
+ # operators (c,c†) are real already. Only conjugate coefficients if needed.
496
+ new._operators = {k: np.conjugate(v) for k, v in self._operators.items()}
497
+ return new
478
498
 
479
499
  def to_normal_order(self):
480
500
  """Reoder the operators to normal order.
@@ -224,13 +224,29 @@ def _herm_conj(
224
224
  terms: OperatorTermsList, weights: OperatorWeightsList = 1
225
225
  ) -> tuple[OperatorTermsList, OperatorWeightsList]:
226
226
  """Returns the hermitian conjugate of the terms and weights."""
227
+ conj_term = transpose_terms(terms)
228
+ conj_weight = [np.conjugate(weight) for weight in weights]
229
+ return conj_term, conj_weight
230
+
231
+
232
+ def transpose_terms(terms: OperatorTermsList) -> OperatorTermsList:
233
+ """Returns the transpose of the terms (creation/destruction operators).
234
+ The transpose is equivalent to the hermitian transpose because they are
235
+ real.
236
+ """
227
237
  conj_term = []
228
- conj_weight = []
229
- # loop over all terms and weights and get the hermitian conjugate
230
- for term, weight in zip(terms, weights):
238
+ for term in terms:
231
239
  conj_term.append([(op, 1 - int(dag)) for (op, dag) in reversed(term)])
232
- conj_weight.append(np.conjugate(weight))
233
- return conj_term, conj_weight
240
+ return conj_term
241
+
242
+
243
+ def transpose_term(term: OperatorTerm) -> OperatorTerm:
244
+ """Returns the transpose of a single term (creation/destruction operators).
245
+ The transpose is equivalent to the hermitian transpose because they are
246
+ real.
247
+ """
248
+ # equivalent to transpose_terms
249
+ return tuple((op, 1 - int(dag)) for (op, dag) in reversed(term))
234
250
 
235
251
 
236
252
  def _convert_terms_to_spin_blocks(
@@ -268,7 +268,7 @@ class QSR(AbstractVariationalDriver):
268
268
 
269
269
  # gather gradient
270
270
  # grad <- grad - grad_cv + E[grad_cv]
271
- self._grad_pos = jax.tree_map(
271
+ self._grad_pos = jax.tree_util.tree_map(
272
272
  lambda x, y, Ey: x - y + Ey,
273
273
  self._grad_pos,
274
274
  self._grad_pos_cv,
@@ -281,7 +281,7 @@ class QSR(AbstractVariationalDriver):
281
281
 
282
282
  # restore the square in prob = |psi|^2
283
283
  if not self.mixed_states:
284
- self._loss_grad = jax.tree_map(lambda x: x * 2.0, self._loss_grad)
284
+ self._loss_grad = jax.tree_util.tree_map(lambda x: x * 2.0, self._loss_grad)
285
285
 
286
286
  # If parameters are real, then take only real part of the gradient (if it's complex)
287
287
  self._loss_grad = tree_cast(self._loss_grad, self.state.parameters)
@@ -49,7 +49,7 @@ def _avg_O(afun, pars, model_state, sigma):
49
49
  sigma = sigma.reshape((-1, sigma.shape[-1]))
50
50
  _, vjp = nkjax.vjp(lambda W: afun({"params": W, **model_state}, sigma), pars)
51
51
  (O_avg,) = vjp(jnp.ones(sigma.shape[0]) / sigma.shape[0])
52
- return jax.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
52
+ return jax.tree_util.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
53
53
 
54
54
 
55
55
  @dispatch
@@ -84,7 +84,7 @@ def _avg_O_exact(hilbert: AbstractHilbert, afun, pars, model_state):
84
84
  psi_2 = jnp.abs(jnp.exp(afun({"params": pars, **model_state}, sigma))) ** 2
85
85
  psi_2 /= jnp.sum(psi_2)
86
86
  (O_avg,) = vjp(psi_2)
87
- return jax.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
87
+ return jax.tree_util.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
88
88
 
89
89
 
90
90
  @dispatch
@@ -181,7 +181,7 @@ def _grad_local_value_rotated(log_psi, pars, model_state, sigma_p, mel, secs):
181
181
 
182
182
  (O_avg,) = vjp(jnp.ones_like(log_val_rotated) / log_val_rotated.size)
183
183
 
184
- O_avg = jax.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
184
+ O_avg = jax.tree_util.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
185
185
 
186
186
  return log_val_rotated, O_avg
187
187
 
@@ -4,7 +4,7 @@ from functools import partial
4
4
 
5
5
  def _treeify(f):
6
6
  def _f(x, *args, **kwargs):
7
- return jax.tree_map(lambda y: f(y, *args, **kwargs), x)
7
+ return jax.tree_util.tree_map(lambda y: f(y, *args, **kwargs), x)
8
8
 
9
9
  return _f
10
10
 
@@ -188,7 +188,9 @@ def value_and_grad(
188
188
  )(*args, **kwargs)
189
189
 
190
190
  out = out_r + 1j * out_j
191
- grad = jax.tree_map(lambda re, im: re + 1j * im, grad_r, grad_j)
191
+ grad = jax.tree_util.tree_map(
192
+ lambda re, im: re + 1j * im, grad_r, grad_j
193
+ )
192
194
 
193
195
  if has_aux:
194
196
  return out, grad, aux
@@ -50,7 +50,7 @@ def _jacobian_cplx(
50
50
  params: PyTree,
51
51
  samples: Array,
52
52
  *,
53
- _build_fn: Callable = partial(jax.tree_map, jax.lax.complex),
53
+ _build_fn: Callable = partial(jax.tree_util.tree_map, jax.lax.complex),
54
54
  ) -> PyTree:
55
55
  """Calculates Jacobian entries by vmapping grad.
56
56
  Assumes the function is R→C, backpropagates 1 and -1j
@@ -85,7 +85,7 @@ def stack_jacobian_tuple(ok_re_im):
85
85
  centered_oks_re_im : a tuple (ΔOᵣ, ΔOᵢ) of two PyTrees representing the real and imag part of ΔOⱼₖ
86
86
  """
87
87
  re, im = ok_re_im
88
- return jax.tree_map(lambda re, im: jnp.stack([re, im], axis=0), re, im)
88
+ return jax.tree_util.tree_map(lambda re, im: jnp.stack([re, im], axis=0), re, im)
89
89
 
90
90
 
91
91
  jacobian_real_holo_fun = jacobian_real_holo
@@ -158,7 +158,7 @@ def jacobian(
158
158
  .. code:: python
159
159
 
160
160
  samples = samples.reshape(-1, samples.shape[-1])
161
- parameters = jax.tree_map(lambda x: x.real, parameters)
161
+ parameters = jax.tree_util.tree_map(lambda x: x.real, parameters)
162
162
  O_k = jax.jacrev(lambda pars: logpsi(pars, samples).real, parameters)
163
163
 
164
164
  The jacobian that is returned is a PyTree with the same shape
@@ -201,7 +201,7 @@ def jacobian(
201
201
  samples = samples.reshape(-1, samples.shape[-1])
202
202
  Or_k = jax.jacrev(lambda pars: logpsi(pars, samples).real, parameters)
203
203
  Oi_k = jax.jacrev(lambda pars: logpsi(pars, samples).imag, parameters)
204
- O_k = jax.tree_map(lambda jr, ji: jnp.concatenate([jr, ji]], axis=1),
204
+ O_k = jax.tree_util.tree_map(lambda jr, ji: jnp.concatenate([jr, ji]], axis=1),
205
205
  Or_k, Oi_k)
206
206
 
207
207
  As both :code:`Or_k` and :code:`Oi_k` are real, instead of concatenating we
@@ -220,7 +220,7 @@ def jacobian(
220
220
 
221
221
  .. code:: python
222
222
 
223
- O_k_cmplx = jax.tree_map(lambda jri: jri[:, 0, :] + 1j* jri[:, 1, :], O_k)
223
+ O_k_cmplx = jax.tree_util.tree_map(lambda jri: jri[:, 0, :] + 1j* jri[:, 1, :], O_k)
224
224
 
225
225
 
226
226
  **If some parameters** :math:`\theta_k` **are complex**, this mode splits the
@@ -249,13 +249,13 @@ def jacobian(
249
249
 
250
250
  samples = samples.reshape(-1, samples.shape[-1])
251
251
  # tree_to_real splits the parameters in a tuple like
252
- # {'real': jax.tree_map(jnp.real, pars), 'imag': jax.tree_map(jnp.imag, pars)}
252
+ # {'real': jax.tree.map(jnp.real, pars), 'imag': jax.tree.map(jnp.imag, pars)}
253
253
  pars_real, reconstruct = nk.jax.tree_to_real(parameters)
254
254
  Or_k = jax.jacrev(lambda pars_re: logpsi(reconstruct(pars_re), samples).real,
255
255
  pars_real)
256
256
  Oi_k = jax.jacrev(lambda pars_re: logpsi(reconstruct(pars_re), samples).imag,
257
257
  pars_real)
258
- O_k = jax.tree_map(lambda jr, ji: jnp.concatenate([jr, ji]], axis=1),
258
+ O_k = jax.tree_util.tree_map(lambda jr, ji: jnp.concatenate([jr, ji]], axis=1),
259
259
  Or_k, Oi_k)
260
260
 
261
261
  This code is also valid if all parameters are real, in which case :code:`O_k.real`
@@ -352,20 +352,24 @@ def jacobian(
352
352
 
353
353
  if pdf is None:
354
354
  if center:
355
- jacobians = jax.tree_map(lambda x: subtract_mean(x, axis=0), jacobians)
355
+ jacobians = jax.tree_util.tree_map(
356
+ lambda x: subtract_mean(x, axis=0), jacobians
357
+ )
356
358
 
357
359
  if _sqrt_rescale:
358
360
  sqrt_n_samp = math.sqrt(
359
361
  samples.shape[0] * mpi.n_nodes
360
362
  ) # maintain weak type
361
- jacobians = jax.tree_map(lambda x: x / sqrt_n_samp, jacobians)
363
+ jacobians = jax.tree_util.tree_map(lambda x: x / sqrt_n_samp, jacobians)
362
364
 
363
365
  else:
364
366
  if center:
365
- jacobians_avg = jax.tree_map(
367
+ jacobians_avg = jax.tree_util.tree_map(
366
368
  partial(sum_mpi, axis=0), _multiply_by_pdf(jacobians, pdf)
367
369
  )
368
- jacobians = jax.tree_map(lambda x, y: x - y, jacobians, jacobians_avg)
370
+ jacobians = jax.tree_util.tree_map(
371
+ lambda x, y: x - y, jacobians, jacobians_avg
372
+ )
369
373
 
370
374
  if _sqrt_rescale:
371
375
  jacobians = _multiply_by_pdf(jacobians, jnp.sqrt(pdf))
@@ -379,7 +383,7 @@ def _multiply_by_pdf(oks, pdf):
379
383
  Used to multiply the log-derivatives by the probability density.
380
384
  """
381
385
 
382
- return jax.tree_map(
386
+ return jax.tree_util.tree_map(
383
387
  lambda x: jax.lax.broadcast_in_dim(pdf, x.shape, (0,)) * x,
384
388
  oks,
385
389
  )
@@ -10,8 +10,10 @@ if jax.__version_info__ >= (0, 4, 16):
10
10
  else:
11
11
  from jax import linear_util as lu
12
12
 
13
- _tree_add = partial(jax.tree_map, jax.lax.add)
14
- _tree_zeros_like = partial(jax.tree_map, lambda x: jnp.zeros(x.shape, dtype=x.dtype))
13
+ _tree_add = partial(jax.tree_util.tree_map, jax.lax.add)
14
+ _tree_zeros_like = partial(
15
+ jax.tree_util.tree_map, lambda x: jnp.zeros(x.shape, dtype=x.dtype)
16
+ )
15
17
 
16
18
 
17
19
  # TODO put it somewhere
@@ -62,7 +64,7 @@ def scan_append_reduce(f, x, append_cond, op=_tree_add, zero_fun=_tree_zeros_lik
62
64
  """
63
65
  # TODO: different op for each result
64
66
 
65
- x0 = jax.tree_map(lambda x: x[0], x)
67
+ x0 = jax.tree_util.tree_map(lambda x: x[0], x)
66
68
 
67
69
  # special code path if there is only one element
68
70
  # to avoid having to rely on xla/llvm to optimize the overhead away
@@ -36,7 +36,9 @@ def PRNGKey(
36
36
  else:
37
37
  key = seed
38
38
 
39
- key = jax.tree_map(lambda k: mpi.mpi_bcast_jax(k, root=root, comm=comm)[0], key)
39
+ key = jax.tree_util.tree_map(
40
+ lambda k: mpi.mpi_bcast_jax(k, root=root, comm=comm)[0], key
41
+ )
40
42
 
41
43
  return key
42
44
 
@@ -90,7 +92,7 @@ def mpi_split(key, *, root=0, comm=MPI_jax_comm) -> PRNGKeyT:
90
92
  # on all MPI nodes?
91
93
  keys = jax.random.split(key, mpi.n_nodes)
92
94
 
93
- keys = jax.tree_map(lambda k: mpi.mpi_bcast_jax(k, root=root)[0], keys)
95
+ keys = jax.tree_util.tree_map(lambda k: mpi.mpi_bcast_jax(k, root=root)[0], keys)
94
96
 
95
97
  return keys[mpi.rank]
96
98
 
@@ -76,14 +76,16 @@ def tree_leaf_iscomplex(pars: PyTree) -> bool:
76
76
  """
77
77
  Returns true if at least one leaf in the tree has complex dtype.
78
78
  """
79
- return any(jax.tree_util.tree_leaves(jax.tree_map(jnp.iscomplexobj, pars)))
79
+ return any(
80
+ jax.tree_util.tree_leaves(jax.tree_util.tree_map(jnp.iscomplexobj, pars))
81
+ )
80
82
 
81
83
 
82
84
  def tree_leaf_isreal(pars: PyTree) -> bool:
83
85
  """
84
86
  Returns true if at least one leaf in the tree has real dtype.
85
87
  """
86
- return any(jax.tree_util.tree_leaves(jax.tree_map(jnp.isrealobj, pars)))
88
+ return any(jax.tree_util.tree_leaves(jax.tree_util.tree_map(jnp.isrealobj, pars)))
87
89
 
88
90
 
89
91
  def tree_ishomogeneous(pars: PyTree) -> bool:
@@ -100,7 +102,9 @@ def tree_conj(t: PyTree) -> PyTree:
100
102
  Args:
101
103
  t: pytree
102
104
  """
103
- return jax.tree_map(lambda x: jax.lax.conj(x) if jnp.iscomplexobj(x) else x, t)
105
+ return jax.tree_util.tree_map(
106
+ lambda x: jax.lax.conj(x) if jnp.iscomplexobj(x) else x, t
107
+ )
104
108
 
105
109
 
106
110
  @jax.jit
@@ -116,7 +120,9 @@ def tree_dot(a: PyTree, b: PyTree) -> Scalar:
116
120
  """
117
121
  return jax.tree_util.tree_reduce(
118
122
  jax.numpy.add,
119
- jax.tree_map(jax.numpy.sum, jax.tree_map(jax.numpy.multiply, a, b)),
123
+ jax.tree_util.tree_map(
124
+ jax.numpy.sum, jax.tree_util.tree_map(jax.numpy.multiply, a, b)
125
+ ),
120
126
  )
121
127
 
122
128
 
@@ -135,7 +141,7 @@ def tree_cast(x: PyTree, target: PyTree) -> PyTree:
135
141
  """
136
142
  # astype alone would also work, however that raises ComplexWarning when casting complex to real
137
143
  # therefore the real is taken first where needed
138
- return jax.tree_map(
144
+ return jax.tree_util.tree_map(
139
145
  lambda x, target: (x if jnp.iscomplexobj(target) else x.real).astype(
140
146
  target.dtype
141
147
  ),
@@ -157,9 +163,9 @@ def tree_axpy(a: Scalar, x: PyTree, y: PyTree) -> PyTree:
157
163
  where the leaves of x are first scaled with a.
158
164
  """
159
165
  if is_scalar(a):
160
- return jax.tree_map(lambda x_, y_: a * x_ + y_, x, y)
166
+ return jax.tree_util.tree_map(lambda x_, y_: a * x_ + y_, x, y)
161
167
  else:
162
- return jax.tree_map(lambda a_, x_, y_: a_ * x_ + y_, a, x, y)
168
+ return jax.tree_util.tree_map(lambda a_, x_, y_: a_ * x_ + y_, a, x, y)
163
169
 
164
170
 
165
171
  class RealImagTuple(tuple):
@@ -188,8 +194,8 @@ def _tree_to_real(x):
188
194
  if tree_leaf_iscomplex(x):
189
195
  # TODO find a way to make it a nop?
190
196
  # return jax.vmap(lambda y: jnp.array((y.real, y.imag)))(x)
191
- r = jax.tree_map(lambda x: x.real if jnp.iscomplexobj(x) else x, x)
192
- i = jax.tree_map(lambda x: x.imag if jnp.iscomplexobj(x) else None, x)
197
+ r = jax.tree_util.tree_map(lambda x: x.real if jnp.iscomplexobj(x) else x, x)
198
+ i = jax.tree_util.tree_map(lambda x: x.imag if jnp.iscomplexobj(x) else None, x)
193
199
  return RealImagTuple((r, i))
194
200
  else:
195
201
  return x
@@ -198,7 +204,9 @@ def _tree_to_real(x):
198
204
  def _tree_to_real_inverse(x):
199
205
  if isinstance(x, RealImagTuple):
200
206
  # not using jax.lax.complex because it would convert scalars to arrays
201
- return jax.tree_map(lambda re, im: re + 1j * im if im is not None else re, *x)
207
+ return jax.tree_util.tree_map(
208
+ lambda re, im: re + 1j * im if im is not None else re, *x
209
+ )
202
210
  else:
203
211
  return x
204
212