NetKet 3.12.4__tar.gz → 3.13.0__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 (330) hide show
  1. {netket-3.12.4 → netket-3.13.0}/PKG-INFO +3 -5
  2. {netket-3.12.4 → netket-3.13.0}/netket/_version.py +2 -2
  3. {netket-3.12.4 → netket-3.13.0}/netket/driver/abstract_variational_driver.py +5 -0
  4. {netket-3.12.4 → netket-3.13.0}/netket/experimental/driver/tdvp_common.py +1 -0
  5. {netket-3.12.4 → netket-3.13.0}/netket/experimental/nn/rnn/layers_fast.py +1 -2
  6. {netket-3.12.4 → netket-3.13.0}/netket/experimental/observable/__init__.py +2 -0
  7. netket-3.13.0/netket/experimental/observable/variance/__init__.py +18 -0
  8. netket-3.13.0/netket/experimental/observable/variance/exact.py +94 -0
  9. netket-3.13.0/netket/experimental/observable/variance/expect.py +141 -0
  10. netket-3.13.0/netket/experimental/observable/variance/variance_operator.py +84 -0
  11. netket-3.13.0/netket/experimental/sampler/__init__.py +54 -0
  12. {netket-3.12.4 → netket-3.13.0}/netket/experimental/sampler/rules/fermion_2nd.py +0 -52
  13. {netket-3.12.4 → netket-3.13.0}/netket/graph/common_lattices.py +1 -1
  14. {netket-3.12.4 → netket-3.13.0}/netket/graph/graph.py +19 -3
  15. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/discrete_hilbert.py +36 -1
  16. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/doubled_hilbert.py +11 -0
  17. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/homogeneous.py +30 -0
  18. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/tensor_hilbert_discrete.py +14 -0
  19. {netket-3.12.4 → netket-3.13.0}/netket/jax/__init__.py +3 -2
  20. {netket-3.12.4 → netket-3.13.0}/netket/jax/_chunk_utils.py +2 -0
  21. netket-3.13.0/netket/jax/_expect.py +250 -0
  22. {netket-3.12.4 → netket-3.13.0}/netket/jax/_utils_tree.py +30 -2
  23. {netket-3.12.4 → netket-3.13.0}/netket/jax/_vjp_chunked.py +3 -7
  24. {netket-3.12.4 → netket-3.13.0}/netket/models/slater.py +5 -1
  25. {netket-3.12.4 → netket-3.13.0}/netket/nn/fast_masked_linear.py +4 -6
  26. {netket-3.12.4 → netket-3.13.0}/netket/operator/_discrete_operator_jax.py +8 -9
  27. {netket-3.12.4 → netket-3.13.0}/netket/operator/_local_operator/jax.py +4 -0
  28. {netket-3.12.4 → netket-3.13.0}/netket/operator/spin.py +7 -1
  29. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/preconditioner.py +18 -8
  30. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/qgt/__init__.py +1 -2
  31. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/qgt/default.py +1 -2
  32. netket-3.13.0/netket/optimizer/qgt/qgt_jacobian.py +294 -0
  33. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/qgt/qgt_jacobian_common.py +1 -0
  34. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/qgt/qgt_jacobian_dense.py +2 -136
  35. netket-3.13.0/netket/optimizer/qgt/qgt_jacobian_pytree.py +225 -0
  36. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/qgt/qgt_onthefly.py +57 -27
  37. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/solver/solvers.py +58 -13
  38. {netket-3.12.4 → netket-3.13.0}/netket/sampler/__init__.py +7 -0
  39. {netket-3.12.4 → netket-3.13.0}/netket/sampler/autoreg.py +3 -1
  40. {netket-3.12.4 → netket-3.13.0}/netket/sampler/base.py +18 -9
  41. {netket-3.12.4 → netket-3.13.0}/netket/sampler/metropolis.py +17 -2
  42. {netket-3.12.4 → netket-3.13.0}/netket/sampler/metropolis_numpy.py +20 -7
  43. {netket-3.12.4/netket/experimental → netket-3.13.0/netket}/sampler/metropolis_pt.py +20 -14
  44. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/exchange.py +43 -12
  45. {netket-3.12.4 → netket-3.13.0}/netket/utils/__init__.py +0 -1
  46. {netket-3.12.4 → netket-3.13.0}/netket/utils/_dependencies_check.py +6 -7
  47. netket-3.13.0/netket/utils/api_utils.py +107 -0
  48. {netket-3.12.4 → netket-3.13.0}/netket/utils/deprecation.py +13 -0
  49. {netket-3.12.4 → netket-3.13.0}/netket/utils/dispatch.py +1 -1
  50. {netket-3.12.4 → netket-3.13.0}/netket/utils/history.py +18 -2
  51. {netket-3.12.4 → netket-3.13.0}/netket/utils/mpi/gpu_autorank_util.py +18 -2
  52. {netket-3.12.4 → netket-3.13.0}/netket/utils/mpi/primitives.py +67 -5
  53. {netket-3.12.4 → netket-3.13.0}/netket/utils/version_check.py +6 -1
  54. {netket-3.12.4 → netket-3.13.0}/netket/vqs/__init__.py +10 -2
  55. {netket-3.12.4 → netket-3.13.0}/netket/vqs/full_summ/state.py +3 -2
  56. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_mixed_state/state.py +3 -2
  57. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_state/expect_forces.py +3 -1
  58. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_state/expect_forces_chunked.py +3 -2
  59. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_state/expect_grad.py +5 -4
  60. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_state/state.py +14 -8
  61. {netket-3.12.4 → netket-3.13.0}/pyproject.toml +2 -11
  62. netket-3.12.4/netket/experimental/sampler/__init__.py +0 -29
  63. netket-3.12.4/netket/jax/_expect.py +0 -101
  64. netket-3.12.4/netket/optimizer/qgt/qgt_jacobian_pytree.py +0 -325
  65. netket-3.12.4/netket/optimizer/qgt/qgt_jacobian_pytree_logic.py +0 -70
  66. netket-3.12.4/netket/utils/plum/__init__.py +0 -61
  67. netket-3.12.4/netket/utils/plum/_version.py +0 -17
  68. netket-3.12.4/netket/utils/plum/alias.py +0 -166
  69. netket-3.12.4/netket/utils/plum/autoreload.py +0 -77
  70. netket-3.12.4/netket/utils/plum/dispatcher.py +0 -128
  71. netket-3.12.4/netket/utils/plum/function.py +0 -487
  72. netket-3.12.4/netket/utils/plum/method.py +0 -232
  73. netket-3.12.4/netket/utils/plum/overload.py +0 -9
  74. netket-3.12.4/netket/utils/plum/parametric.py +0 -421
  75. netket-3.12.4/netket/utils/plum/promotion.py +0 -169
  76. netket-3.12.4/netket/utils/plum/py.typed +0 -0
  77. netket-3.12.4/netket/utils/plum/repr.py +0 -179
  78. netket-3.12.4/netket/utils/plum/resolver.py +0 -307
  79. netket-3.12.4/netket/utils/plum/signature.py +0 -424
  80. netket-3.12.4/netket/utils/plum/type.py +0 -296
  81. netket-3.12.4/netket/utils/plum/util.py +0 -170
  82. {netket-3.12.4 → netket-3.13.0}/.gitignore +0 -0
  83. {netket-3.12.4 → netket-3.13.0}/LICENSE +0 -0
  84. {netket-3.12.4 → netket-3.13.0}/README.md +0 -0
  85. {netket-3.12.4 → netket-3.13.0}/netket/__init__.py +0 -0
  86. {netket-3.12.4 → netket-3.13.0}/netket/callbacks/__init__.py +0 -0
  87. {netket-3.12.4 → netket-3.13.0}/netket/callbacks/convergence_stopping.py +0 -0
  88. {netket-3.12.4 → netket-3.13.0}/netket/callbacks/earlystopping.py +0 -0
  89. {netket-3.12.4 → netket-3.13.0}/netket/callbacks/invalidlossstopping.py +0 -0
  90. {netket-3.12.4 → netket-3.13.0}/netket/callbacks/timeout.py +0 -0
  91. {netket-3.12.4 → netket-3.13.0}/netket/driver/__init__.py +0 -0
  92. {netket-3.12.4 → netket-3.13.0}/netket/driver/steady_state.py +0 -0
  93. {netket-3.12.4 → netket-3.13.0}/netket/driver/vmc.py +0 -0
  94. {netket-3.12.4 → netket-3.13.0}/netket/driver/vmc_common.py +0 -0
  95. {netket-3.12.4 → netket-3.13.0}/netket/errors.py +0 -0
  96. {netket-3.12.4 → netket-3.13.0}/netket/exact.py +0 -0
  97. {netket-3.12.4 → netket-3.13.0}/netket/experimental/__init__.py +0 -0
  98. {netket-3.12.4 → netket-3.13.0}/netket/experimental/driver/__init__.py +0 -0
  99. {netket-3.12.4 → netket-3.13.0}/netket/experimental/driver/tdvp.py +0 -0
  100. {netket-3.12.4 → netket-3.13.0}/netket/experimental/driver/tdvp_schmitt.py +0 -0
  101. {netket-3.12.4 → netket-3.13.0}/netket/experimental/driver/vmc_srt.py +0 -0
  102. {netket-3.12.4 → netket-3.13.0}/netket/experimental/dynamics/__init__.py +0 -0
  103. {netket-3.12.4 → netket-3.13.0}/netket/experimental/dynamics/_rk_solver.py +0 -0
  104. {netket-3.12.4 → netket-3.13.0}/netket/experimental/dynamics/_rk_solver_structures.py +0 -0
  105. {netket-3.12.4 → netket-3.13.0}/netket/experimental/dynamics/_rk_tableau.py +0 -0
  106. {netket-3.12.4 → netket-3.13.0}/netket/experimental/hilbert/__init__.py +0 -0
  107. {netket-3.12.4 → netket-3.13.0}/netket/experimental/hilbert/spin_orbital_fermions.py +0 -0
  108. {netket-3.12.4 → netket-3.13.0}/netket/experimental/logging/__init__.py +0 -0
  109. {netket-3.12.4 → netket-3.13.0}/netket/experimental/logging/hdf5_log.py +0 -0
  110. {netket-3.12.4 → netket-3.13.0}/netket/experimental/models/__init__.py +0 -0
  111. {netket-3.12.4 → netket-3.13.0}/netket/experimental/models/fast_rnn.py +0 -0
  112. {netket-3.12.4 → netket-3.13.0}/netket/experimental/models/rnn.py +0 -0
  113. {netket-3.12.4 → netket-3.13.0}/netket/experimental/nn/__init__.py +0 -0
  114. {netket-3.12.4 → netket-3.13.0}/netket/experimental/nn/rnn/__init__.py +0 -0
  115. {netket-3.12.4 → netket-3.13.0}/netket/experimental/nn/rnn/cells.py +0 -0
  116. {netket-3.12.4 → netket-3.13.0}/netket/experimental/nn/rnn/layers.py +0 -0
  117. {netket-3.12.4 → netket-3.13.0}/netket/experimental/nn/rnn/ordering.py +0 -0
  118. {netket-3.12.4 → netket-3.13.0}/netket/experimental/observable/renyi2/S2_operator.py +0 -0
  119. {netket-3.12.4 → netket-3.13.0}/netket/experimental/observable/renyi2/__init__.py +0 -0
  120. {netket-3.12.4 → netket-3.13.0}/netket/experimental/observable/renyi2/exact.py +0 -0
  121. {netket-3.12.4 → netket-3.13.0}/netket/experimental/observable/renyi2/expect.py +0 -0
  122. {netket-3.12.4 → netket-3.13.0}/netket/experimental/operator/__init__.py +0 -0
  123. {netket-3.12.4 → netket-3.13.0}/netket/experimental/operator/_fermion_operator_2nd_base.py +0 -0
  124. {netket-3.12.4 → netket-3.13.0}/netket/experimental/operator/_fermion_operator_2nd_jax.py +0 -0
  125. {netket-3.12.4 → netket-3.13.0}/netket/experimental/operator/_fermion_operator_2nd_numba.py +0 -0
  126. {netket-3.12.4 → netket-3.13.0}/netket/experimental/operator/_fermion_operator_2nd_utils.py +0 -0
  127. {netket-3.12.4 → netket-3.13.0}/netket/experimental/operator/fermion.py +0 -0
  128. {netket-3.12.4 → netket-3.13.0}/netket/experimental/operator/pyscf.py +0 -0
  129. {netket-3.12.4 → netket-3.13.0}/netket/experimental/qsr/__init__.py +0 -0
  130. {netket-3.12.4 → netket-3.13.0}/netket/experimental/qsr/dataset.py +0 -0
  131. {netket-3.12.4 → netket-3.13.0}/netket/experimental/qsr/driver.py +0 -0
  132. {netket-3.12.4 → netket-3.13.0}/netket/experimental/qsr/logic_helpers.py +0 -0
  133. {netket-3.12.4 → netket-3.13.0}/netket/experimental/sampler/metropolis.py +0 -0
  134. {netket-3.12.4 → netket-3.13.0}/netket/experimental/sampler/metropolis_pmap.py +0 -0
  135. {netket-3.12.4 → netket-3.13.0}/netket/experimental/sampler/rules/__init__.py +0 -0
  136. {netket-3.12.4 → netket-3.13.0}/netket/experimental/vqs/__init__.py +0 -0
  137. {netket-3.12.4 → netket-3.13.0}/netket/experimental/vqs/io.py +0 -0
  138. {netket-3.12.4 → netket-3.13.0}/netket/graph/__init__.py +0 -0
  139. {netket-3.12.4 → netket-3.13.0}/netket/graph/_lattice_edge_logic.py +0 -0
  140. {netket-3.12.4 → netket-3.13.0}/netket/graph/abstract_graph.py +0 -0
  141. {netket-3.12.4 → netket-3.13.0}/netket/graph/lattice.py +0 -0
  142. {netket-3.12.4 → netket-3.13.0}/netket/graph/space_group.py +0 -0
  143. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/__init__.py +0 -0
  144. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/abstract_hilbert.py +0 -0
  145. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/continuous_hilbert.py +0 -0
  146. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/custom_hilbert.py +0 -0
  147. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/fock.py +0 -0
  148. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/index/__init__.py +0 -0
  149. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/index/base.py +0 -0
  150. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/index/constraints/__init__.py +0 -0
  151. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/index/constraints/base.py +0 -0
  152. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/index/constraints/sum.py +0 -0
  153. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/index/unconstrained.py +0 -0
  154. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/index/uniform_tensor.py +0 -0
  155. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/particle.py +0 -0
  156. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/qubit.py +0 -0
  157. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/__init__.py +0 -0
  158. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/base.py +0 -0
  159. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/custom.py +0 -0
  160. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/doubled.py +0 -0
  161. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/fock.py +0 -0
  162. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/particle.py +0 -0
  163. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/qubit.py +0 -0
  164. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/spin.py +0 -0
  165. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/random/tensor_hilbert.py +0 -0
  166. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/spin.py +0 -0
  167. {netket-3.12.4 → netket-3.13.0}/netket/hilbert/tensor_hilbert.py +0 -0
  168. {netket-3.12.4 → netket-3.13.0}/netket/jax/_grad.py +0 -0
  169. {netket-3.12.4 → netket-3.13.0}/netket/jax/_jacobian/__init__.py +0 -0
  170. {netket-3.12.4 → netket-3.13.0}/netket/jax/_jacobian/default_mode.py +0 -0
  171. {netket-3.12.4 → netket-3.13.0}/netket/jax/_jacobian/jacobian_dense.py +0 -0
  172. {netket-3.12.4 → netket-3.13.0}/netket/jax/_jacobian/jacobian_pytree.py +0 -0
  173. {netket-3.12.4 → netket-3.13.0}/netket/jax/_jacobian/logic.py +0 -0
  174. {netket-3.12.4 → netket-3.13.0}/netket/jax/_math.py +0 -0
  175. {netket-3.12.4 → netket-3.13.0}/netket/jax/_scanmap.py +0 -0
  176. {netket-3.12.4 → netket-3.13.0}/netket/jax/_sort.py +0 -0
  177. {netket-3.12.4 → netket-3.13.0}/netket/jax/_utils_dtype.py +0 -0
  178. {netket-3.12.4 → netket-3.13.0}/netket/jax/_utils_random.py +0 -0
  179. {netket-3.12.4 → netket-3.13.0}/netket/jax/_vjp.py +0 -0
  180. {netket-3.12.4 → netket-3.13.0}/netket/jax/_vmap_chunked.py +0 -0
  181. {netket-3.12.4 → netket-3.13.0}/netket/jax/sharding.py +0 -0
  182. {netket-3.12.4 → netket-3.13.0}/netket/logging/__init__.py +0 -0
  183. {netket-3.12.4 → netket-3.13.0}/netket/logging/base.py +0 -0
  184. {netket-3.12.4 → netket-3.13.0}/netket/logging/json_log.py +0 -0
  185. {netket-3.12.4 → netket-3.13.0}/netket/logging/runtime_log.py +0 -0
  186. {netket-3.12.4 → netket-3.13.0}/netket/logging/state_log.py +0 -0
  187. {netket-3.12.4 → netket-3.13.0}/netket/logging/tensorboard.py +0 -0
  188. {netket-3.12.4 → netket-3.13.0}/netket/models/README.md +0 -0
  189. {netket-3.12.4 → netket-3.13.0}/netket/models/__init__.py +0 -0
  190. {netket-3.12.4 → netket-3.13.0}/netket/models/autoreg.py +0 -0
  191. {netket-3.12.4 → netket-3.13.0}/netket/models/deepset.py +0 -0
  192. {netket-3.12.4 → netket-3.13.0}/netket/models/equivariant.py +0 -0
  193. {netket-3.12.4 → netket-3.13.0}/netket/models/fast_autoreg.py +0 -0
  194. {netket-3.12.4 → netket-3.13.0}/netket/models/full_space.py +0 -0
  195. {netket-3.12.4 → netket-3.13.0}/netket/models/gaussian.py +0 -0
  196. {netket-3.12.4 → netket-3.13.0}/netket/models/jastrow.py +0 -0
  197. {netket-3.12.4 → netket-3.13.0}/netket/models/mlp.py +0 -0
  198. {netket-3.12.4 → netket-3.13.0}/netket/models/ndm.py +0 -0
  199. {netket-3.12.4 → netket-3.13.0}/netket/models/rbm.py +0 -0
  200. {netket-3.12.4 → netket-3.13.0}/netket/models/tensor_networks/__init__.py +0 -0
  201. {netket-3.12.4 → netket-3.13.0}/netket/models/tensor_networks/mpdo.py +0 -0
  202. {netket-3.12.4 → netket-3.13.0}/netket/models/tensor_networks/mps.py +0 -0
  203. {netket-3.12.4 → netket-3.13.0}/netket/models/utils.py +0 -0
  204. {netket-3.12.4 → netket-3.13.0}/netket/nn/__init__.py +0 -0
  205. {netket-3.12.4 → netket-3.13.0}/netket/nn/activation.py +0 -0
  206. {netket-3.12.4 → netket-3.13.0}/netket/nn/blocks/__init__.py +0 -0
  207. {netket-3.12.4 → netket-3.13.0}/netket/nn/blocks/deepset.py +0 -0
  208. {netket-3.12.4 → netket-3.13.0}/netket/nn/blocks/mlp.py +0 -0
  209. {netket-3.12.4 → netket-3.13.0}/netket/nn/blocks/symmetry_sum.py +0 -0
  210. {netket-3.12.4 → netket-3.13.0}/netket/nn/deprecation.py +0 -0
  211. {netket-3.12.4 → netket-3.13.0}/netket/nn/initializers.py +0 -0
  212. {netket-3.12.4 → netket-3.13.0}/netket/nn/masked_linear.py +0 -0
  213. {netket-3.12.4 → netket-3.13.0}/netket/nn/symmetric_linear.py +0 -0
  214. {netket-3.12.4 → netket-3.13.0}/netket/nn/utils.py +0 -0
  215. {netket-3.12.4 → netket-3.13.0}/netket/operator/__init__.py +0 -0
  216. {netket-3.12.4 → netket-3.13.0}/netket/operator/_abstract_observable.py +0 -0
  217. {netket-3.12.4 → netket-3.13.0}/netket/operator/_abstract_operator.py +0 -0
  218. {netket-3.12.4 → netket-3.13.0}/netket/operator/_abstract_super_operator.py +0 -0
  219. {netket-3.12.4 → netket-3.13.0}/netket/operator/_bose_hubbard/__init__.py +0 -0
  220. {netket-3.12.4 → netket-3.13.0}/netket/operator/_bose_hubbard/base.py +0 -0
  221. {netket-3.12.4 → netket-3.13.0}/netket/operator/_bose_hubbard/jax.py +0 -0
  222. {netket-3.12.4 → netket-3.13.0}/netket/operator/_bose_hubbard/numba.py +0 -0
  223. {netket-3.12.4 → netket-3.13.0}/netket/operator/_continuous_operator.py +0 -0
  224. {netket-3.12.4 → netket-3.13.0}/netket/operator/_discrete_operator.py +0 -0
  225. {netket-3.12.4 → netket-3.13.0}/netket/operator/_graph_operator.py +0 -0
  226. {netket-3.12.4 → netket-3.13.0}/netket/operator/_hamiltonian.py +0 -0
  227. {netket-3.12.4 → netket-3.13.0}/netket/operator/_heisenberg.py +0 -0
  228. {netket-3.12.4 → netket-3.13.0}/netket/operator/_ising/__init__.py +0 -0
  229. {netket-3.12.4 → netket-3.13.0}/netket/operator/_ising/base.py +0 -0
  230. {netket-3.12.4 → netket-3.13.0}/netket/operator/_ising/jax.py +0 -0
  231. {netket-3.12.4 → netket-3.13.0}/netket/operator/_ising/numba.py +0 -0
  232. {netket-3.12.4 → netket-3.13.0}/netket/operator/_kinetic.py +0 -0
  233. {netket-3.12.4 → netket-3.13.0}/netket/operator/_lazy.py +0 -0
  234. {netket-3.12.4 → netket-3.13.0}/netket/operator/_local_liouvillian.py +0 -0
  235. {netket-3.12.4 → netket-3.13.0}/netket/operator/_local_operator/__init__.py +0 -0
  236. {netket-3.12.4 → netket-3.13.0}/netket/operator/_local_operator/base.py +0 -0
  237. {netket-3.12.4 → netket-3.13.0}/netket/operator/_local_operator/compile_helpers.py +0 -0
  238. {netket-3.12.4 → netket-3.13.0}/netket/operator/_local_operator/convert.py +0 -0
  239. {netket-3.12.4 → netket-3.13.0}/netket/operator/_local_operator/helpers.py +0 -0
  240. {netket-3.12.4 → netket-3.13.0}/netket/operator/_local_operator/numba.py +0 -0
  241. {netket-3.12.4 → netket-3.13.0}/netket/operator/_pauli_strings/__init__.py +0 -0
  242. {netket-3.12.4 → netket-3.13.0}/netket/operator/_pauli_strings/base.py +0 -0
  243. {netket-3.12.4 → netket-3.13.0}/netket/operator/_pauli_strings/jax.py +0 -0
  244. {netket-3.12.4 → netket-3.13.0}/netket/operator/_pauli_strings/numba.py +0 -0
  245. {netket-3.12.4 → netket-3.13.0}/netket/operator/_potential.py +0 -0
  246. {netket-3.12.4 → netket-3.13.0}/netket/operator/_sumoperators.py +0 -0
  247. {netket-3.12.4 → netket-3.13.0}/netket/operator/boson.py +0 -0
  248. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/__init__.py +0 -0
  249. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/linear_operator.py +0 -0
  250. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/qgt/common.py +0 -0
  251. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/qgt/qgt_onthefly_logic.py +0 -0
  252. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/solver/__init__.py +0 -0
  253. {netket-3.12.4 → netket-3.13.0}/netket/optimizer/sr.py +0 -0
  254. {netket-3.12.4 → netket-3.13.0}/netket/sampler/exact.py +0 -0
  255. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/__init__.py +0 -0
  256. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/base.py +0 -0
  257. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/continuous_gaussian.py +0 -0
  258. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/custom_numpy.py +0 -0
  259. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/fixed.py +0 -0
  260. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/hamiltonian.py +0 -0
  261. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/hamiltonian_numpy.py +0 -0
  262. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/langevin.py +0 -0
  263. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/local.py +0 -0
  264. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/local_numpy.py +0 -0
  265. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/multiple.py +0 -0
  266. {netket-3.12.4 → netket-3.13.0}/netket/sampler/rules/tensor.py +0 -0
  267. {netket-3.12.4 → netket-3.13.0}/netket/stats/__init__.py +0 -0
  268. {netket-3.12.4 → netket-3.13.0}/netket/stats/_autocorr.py +0 -0
  269. {netket-3.12.4 → netket-3.13.0}/netket/stats/mc_stats.py +0 -0
  270. {netket-3.12.4 → netket-3.13.0}/netket/stats/mc_stats_old.py +0 -0
  271. {netket-3.12.4 → netket-3.13.0}/netket/stats/mpi_stats.py +0 -0
  272. {netket-3.12.4 → netket-3.13.0}/netket/tools/__init__.py +0 -0
  273. {netket-3.12.4 → netket-3.13.0}/netket/tools/_common.py +0 -0
  274. {netket-3.12.4 → netket-3.13.0}/netket/tools/_cpu_info.py +0 -0
  275. {netket-3.12.4 → netket-3.13.0}/netket/tools/_mpi_info.py +0 -0
  276. {netket-3.12.4 → netket-3.13.0}/netket/tools/check_mpi.py +0 -0
  277. {netket-3.12.4 → netket-3.13.0}/netket/tools/info.py +0 -0
  278. {netket-3.12.4 → netket-3.13.0}/netket/utils/array.py +0 -0
  279. {netket-3.12.4 → netket-3.13.0}/netket/utils/config_flags.py +0 -0
  280. {netket-3.12.4 → netket-3.13.0}/netket/utils/display/__init__.py +0 -0
  281. {netket-3.12.4 → netket-3.13.0}/netket/utils/display/repr.py +0 -0
  282. {netket-3.12.4 → netket-3.13.0}/netket/utils/float.py +0 -0
  283. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/__init__.py +0 -0
  284. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/_group.py +0 -0
  285. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/_permutation_group.py +0 -0
  286. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/_point_group.py +0 -0
  287. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/_semigroup.py +0 -0
  288. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/axial.py +0 -0
  289. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/cubic.py +0 -0
  290. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/icosa.py +0 -0
  291. {netket-3.12.4 → netket-3.13.0}/netket/utils/group/planar.py +0 -0
  292. {netket-3.12.4 → netket-3.13.0}/netket/utils/holomorphic.py +0 -0
  293. {netket-3.12.4 → netket-3.13.0}/netket/utils/jax.py +0 -0
  294. {netket-3.12.4 → netket-3.13.0}/netket/utils/model_frameworks/__init__.py +0 -0
  295. {netket-3.12.4 → netket-3.13.0}/netket/utils/model_frameworks/base.py +0 -0
  296. {netket-3.12.4 → netket-3.13.0}/netket/utils/model_frameworks/flax.py +0 -0
  297. {netket-3.12.4 → netket-3.13.0}/netket/utils/model_frameworks/haiku.py +0 -0
  298. {netket-3.12.4 → netket-3.13.0}/netket/utils/model_frameworks/jax.py +0 -0
  299. {netket-3.12.4 → netket-3.13.0}/netket/utils/moduletools.py +0 -0
  300. {netket-3.12.4 → netket-3.13.0}/netket/utils/mpi/__init__.py +0 -0
  301. {netket-3.12.4 → netket-3.13.0}/netket/utils/mpi/mpi.py +0 -0
  302. {netket-3.12.4 → netket-3.13.0}/netket/utils/numbers.py +0 -0
  303. {netket-3.12.4 → netket-3.13.0}/netket/utils/optional_deps.py +0 -0
  304. {netket-3.12.4 → netket-3.13.0}/netket/utils/partial.py +0 -0
  305. {netket-3.12.4 → netket-3.13.0}/netket/utils/seed.py +0 -0
  306. {netket-3.12.4 → netket-3.13.0}/netket/utils/static_number.py +0 -0
  307. {netket-3.12.4 → netket-3.13.0}/netket/utils/static_range.py +0 -0
  308. {netket-3.12.4 → netket-3.13.0}/netket/utils/struct/__init__.py +0 -0
  309. {netket-3.12.4 → netket-3.13.0}/netket/utils/struct/dataclass.py +0 -0
  310. {netket-3.12.4 → netket-3.13.0}/netket/utils/struct/fields.py +0 -0
  311. {netket-3.12.4 → netket-3.13.0}/netket/utils/struct/pytree.py +0 -0
  312. {netket-3.12.4 → netket-3.13.0}/netket/utils/struct/utils.py +0 -0
  313. {netket-3.12.4 → netket-3.13.0}/netket/utils/summation.py +0 -0
  314. {netket-3.12.4 → netket-3.13.0}/netket/utils/timing.py +0 -0
  315. {netket-3.12.4 → netket-3.13.0}/netket/utils/types.py +0 -0
  316. {netket-3.12.4 → netket-3.13.0}/netket/vqs/base.py +0 -0
  317. {netket-3.12.4 → netket-3.13.0}/netket/vqs/deprecated.py +0 -0
  318. {netket-3.12.4 → netket-3.13.0}/netket/vqs/experimental.py +0 -0
  319. {netket-3.12.4 → netket-3.13.0}/netket/vqs/full_summ/__init__.py +0 -0
  320. {netket-3.12.4 → netket-3.13.0}/netket/vqs/full_summ/expect.py +0 -0
  321. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/__init__.py +0 -0
  322. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/common.py +0 -0
  323. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/kernels.py +0 -0
  324. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_mixed_state/__init__.py +0 -0
  325. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_mixed_state/expect.py +0 -0
  326. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_mixed_state/expect_chunked.py +0 -0
  327. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_state/__init__.py +0 -0
  328. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_state/expect.py +0 -0
  329. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_state/expect_chunked.py +0 -0
  330. {netket-3.12.4 → netket-3.13.0}/netket/vqs/mc/mc_state/expect_grad_chunked.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: NetKet
3
- Version: 3.12.4
3
+ Version: 3.13.0
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/#
@@ -18,7 +18,6 @@ Classifier: Operating System :: Unix
18
18
  Classifier: Programming Language :: Python :: 3
19
19
  Classifier: Topic :: Scientific/Engineering :: Physics
20
20
  Requires-Python: >=3.9
21
- Requires-Dist: beartype>=0.16.2
22
21
  Requires-Dist: equinox<0.12,>=0.11.3
23
22
  Requires-Dist: flax<0.9,>=0.7.1
24
23
  Requires-Dist: igraph<0.12.0,>=0.10.0
@@ -26,18 +25,17 @@ Requires-Dist: jax<0.5,>=0.4.16
26
25
  Requires-Dist: jaxlib<0.5,>=0.4.16
27
26
  Requires-Dist: numba4jax<0.1,>=0.0.10.post1
28
27
  Requires-Dist: numba<0.61,>=0.52
29
- Requires-Dist: numpy~=1.20
28
+ Requires-Dist: numpy<3.0,>=1.20
30
29
  Requires-Dist: optax<0.3,>=0.1.3
31
30
  Requires-Dist: orjson<4,>=3.4
31
+ Requires-Dist: plum-dispatch<3,>=2.4
32
32
  Requires-Dist: rich>=10.0
33
33
  Requires-Dist: scipy<2,>=1.5.3
34
34
  Requires-Dist: tqdm<5,>=4.60
35
- Requires-Dist: typing-extensions; python_version <= '3.10'
36
35
  Provides-Extra: dev
37
36
  Requires-Dist: black==23.9.1; extra == 'dev'
38
37
  Requires-Dist: build; extra == 'dev'
39
38
  Requires-Dist: coverage>=5; extra == 'dev'
40
- Requires-Dist: ipython; extra == 'dev'
41
39
  Requires-Dist: matplotlib>=3; extra == 'dev'
42
40
  Requires-Dist: networkx<4,>=2.4; extra == 'dev'
43
41
  Requires-Dist: pre-commit>=2.7; extra == 'dev'
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '3.12.4'
16
- __version_tuple__ = version_tuple = (3, 12, 4)
15
+ __version__ = version = '3.13.0'
16
+ __version_tuple__ = version_tuple = (3, 13, 0)
@@ -161,6 +161,11 @@ class AbstractVariationalDriver(abc.ABC):
161
161
  **modified in-place** adding new keys.
162
162
  step: the current step number.
163
163
  """
164
+ # Always log the acceptance.
165
+ if hasattr(self.state, "sampler_state"):
166
+ acceptance = getattr(self.state.sampler_state, "acceptance", None)
167
+ if acceptance is not None:
168
+ log_dict["acceptance"] = acceptance
164
169
 
165
170
  def reset(self):
166
171
  """
@@ -401,6 +401,7 @@ class TDVPBaseDriver(AbstractVariationalDriver):
401
401
  return loggers
402
402
 
403
403
  def _log_additional_data(self, log_dict, step):
404
+ super()._log_additional_data(log_dict, step)
404
405
  log_dict["t"] = self.t
405
406
 
406
407
  @property
@@ -75,8 +75,7 @@ class FastRNNLayer(RNNLayer):
75
75
  hidden = self._extract_hidden(outputs, index, prev_neighbors)
76
76
  cell_mem, hidden = self.cell(inputs, cell_mem, hidden)
77
77
 
78
- initializing = self.is_mutable_collection("params")
79
- if not initializing:
78
+ if not self.is_initializing():
80
79
  _cell_mem.value = cell_mem
81
80
  _outputs.value = outputs.at[:, index, :].set(hidden)
82
81
 
@@ -15,3 +15,5 @@
15
15
  from netket.operator._abstract_observable import AbstractObservable
16
16
 
17
17
  from .renyi2 import Renyi2EntanglementEntropy
18
+
19
+ from .variance import VarianceObservable
@@ -0,0 +1,18 @@
1
+ # Copyright 2022 The NetKet Authors - All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from .variance_operator import VarianceObservable
16
+
17
+ from . import expect
18
+ from . import exact
@@ -0,0 +1,94 @@
1
+ # Copyright 2022 The NetKet Authors - All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import jax.numpy as jnp
16
+ import jax
17
+ from functools import partial
18
+
19
+ from netket.vqs import FullSumState, expect, expect_and_grad
20
+ import netket.jax as nkjax
21
+ from netket.utils import mpi
22
+ from netket.stats import Stats
23
+
24
+ from .variance_operator import VarianceObservable
25
+
26
+
27
+ @expect.dispatch
28
+ def expect(vstate: FullSumState, variance_operator: VarianceObservable):
29
+ if variance_operator.hilbert != vstate.hilbert:
30
+ raise TypeError("Hilbert spaces should match")
31
+
32
+ operator_mtrx = variance_operator.operator.to_dense()
33
+ operator_squared_mtrx = variance_operator.operator_squared.to_dense()
34
+
35
+ return expect_and_grad_inner_fs(
36
+ vstate._apply_fun,
37
+ vstate.parameters,
38
+ vstate.model_state,
39
+ vstate._all_states,
40
+ operator_mtrx,
41
+ operator_squared_mtrx,
42
+ return_grad=False,
43
+ )
44
+
45
+
46
+ @expect_and_grad.dispatch
47
+ def expect_and_grad(
48
+ vstate: FullSumState,
49
+ variance_operator: VarianceObservable,
50
+ *,
51
+ mutable,
52
+ ):
53
+ if variance_operator.hilbert != vstate.hilbert:
54
+ raise TypeError("Hilbert spaces should match")
55
+
56
+ operator_mtrx = variance_operator.operator.to_dense()
57
+ operator_squared_mtrx = variance_operator.operator_squared.to_dense()
58
+
59
+ return expect_and_grad_inner_fs(
60
+ vstate._apply_fun,
61
+ vstate.parameters,
62
+ vstate.model_state,
63
+ vstate._all_states,
64
+ operator_mtrx,
65
+ operator_squared_mtrx,
66
+ return_grad=True,
67
+ )
68
+
69
+
70
+ @partial(jax.jit, static_argnames=("afun", "return_grad"))
71
+ def expect_and_grad_inner_fs(
72
+ afun, params, model_state, sigma, operator_mtrx, operator_squared_mtrx, return_grad
73
+ ):
74
+ def expect_kernel_var(params):
75
+ W = {"params": params, **model_state}
76
+
77
+ state = jnp.exp(afun(W, sigma))
78
+ state = state / jnp.linalg.norm(state)
79
+
80
+ O_mean = state.conj() @ (operator_mtrx @ state)
81
+ O2_mean = state.conj() @ (operator_squared_mtrx @ state)
82
+
83
+ return O2_mean - O_mean**2
84
+
85
+ if not return_grad:
86
+ var = expect_kernel_var(params)
87
+ return Stats(mean=var, error_of_mean=0.0, variance=0.0)
88
+
89
+ var, var_vjp_fun = nkjax.vjp(expect_kernel_var, params, conjugate=True)
90
+
91
+ var_grad = var_vjp_fun(jnp.ones_like(var))[0]
92
+ var_grad = jax.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], var_grad)
93
+
94
+ return Stats(mean=var, error_of_mean=0.0, variance=0.0), var_grad
@@ -0,0 +1,141 @@
1
+ # Copyright 2022 The NetKet Authors - All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import jax.numpy as jnp
16
+ import jax
17
+ from functools import partial
18
+
19
+ from netket.vqs import (
20
+ MCState,
21
+ expect,
22
+ expect_and_grad,
23
+ get_local_kernel,
24
+ get_local_kernel_arguments,
25
+ )
26
+ import netket.jax as nkjax
27
+ from netket.utils import mpi
28
+
29
+ from .variance_operator import VarianceObservable
30
+
31
+
32
+ @expect.dispatch
33
+ def expect(vstate: MCState, variance_operator: VarianceObservable, chunk_size: None):
34
+ if variance_operator.hilbert != vstate.hilbert:
35
+ raise TypeError("Hilbert spaces should match")
36
+
37
+ local_kernel = get_local_kernel(vstate, variance_operator.operator)
38
+ local_kernel2 = get_local_kernel(vstate, variance_operator.operator_squared)
39
+
40
+ sigma, args = get_local_kernel_arguments(vstate, variance_operator.operator)
41
+ sigma, args2 = get_local_kernel_arguments(
42
+ vstate, variance_operator.operator_squared
43
+ )
44
+
45
+ return expect_and_grad_inner_mc(
46
+ vstate._apply_fun,
47
+ vstate.parameters,
48
+ vstate.model_state,
49
+ local_kernel,
50
+ local_kernel2,
51
+ sigma,
52
+ args,
53
+ args2,
54
+ return_grad=False,
55
+ )
56
+
57
+
58
+ @expect_and_grad.dispatch
59
+ def expect_and_grad(
60
+ vstate: MCState,
61
+ variance_operator: VarianceObservable,
62
+ chunk_size: None,
63
+ *,
64
+ mutable,
65
+ ):
66
+ if variance_operator.hilbert != vstate.hilbert:
67
+ raise TypeError("Hilbert spaces should match")
68
+
69
+ local_kernel = get_local_kernel(vstate, variance_operator.operator)
70
+ local_kernel2 = get_local_kernel(vstate, variance_operator.operator_squared)
71
+
72
+ sigma, args = get_local_kernel_arguments(vstate, variance_operator.operator)
73
+ sigma, args2 = get_local_kernel_arguments(
74
+ vstate, variance_operator.operator_squared
75
+ )
76
+
77
+ return expect_and_grad_inner_mc(
78
+ vstate._apply_fun,
79
+ vstate.parameters,
80
+ vstate.model_state,
81
+ local_kernel,
82
+ local_kernel2,
83
+ sigma,
84
+ args,
85
+ args2,
86
+ return_grad=True,
87
+ )
88
+
89
+
90
+ @partial(
91
+ jax.jit, static_argnames=("afun", "local_kernel", "local_kernel2", "return_grad")
92
+ )
93
+ def expect_and_grad_inner_mc(
94
+ afun,
95
+ params,
96
+ model_state,
97
+ local_kernel,
98
+ local_kernel2,
99
+ sigma,
100
+ args,
101
+ args2,
102
+ return_grad,
103
+ ):
104
+ n_chains = sigma.shape[0]
105
+
106
+ σ = sigma.reshape(-1, sigma.shape[-1])
107
+
108
+ def expect_kernel_var(params):
109
+ log_pdf = lambda params, σ: 2 * afun({"params": params, **model_state}, σ).real
110
+
111
+ def local_kernel_var(params, σ):
112
+ W = {"params": params, **model_state}
113
+
114
+ O_mean = nkjax.expect(
115
+ log_pdf,
116
+ lambda params, σ: local_kernel(
117
+ afun, {"params": params, **model_state}, σ, args
118
+ ),
119
+ params,
120
+ σ,
121
+ n_chains=n_chains,
122
+ )[0]
123
+
124
+ O2_loc = local_kernel2(afun, W, σ, args2)
125
+
126
+ return (O2_loc - O_mean**2).real
127
+
128
+ return nkjax.expect(log_pdf, local_kernel_var, params, σ, n_chains=n_chains)
129
+
130
+ if not return_grad:
131
+ var, var_stats = expect_kernel_var(params)
132
+ return var_stats
133
+
134
+ var, var_vjp_fun, var_stats = nkjax.vjp(
135
+ expect_kernel_var, params, has_aux=True, conjugate=True
136
+ )
137
+
138
+ var_grad = var_vjp_fun(jnp.ones_like(var))[0]
139
+ var_grad = jax.tree_map(lambda x: mpi.mpi_sum_jax(x)[0], var_grad)
140
+
141
+ return var_stats, var_grad
@@ -0,0 +1,84 @@
1
+ # Copyright 2022 The NetKet Authors - All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import netket as nk
16
+ from netket.operator import AbstractOperator
17
+
18
+ from netket.operator._abstract_observable import AbstractObservable
19
+
20
+
21
+ class VarianceObservable(AbstractObservable):
22
+ r"""
23
+ Observable computing the variance of a quantum operator :math:`O`.
24
+ """
25
+
26
+ def __init__(self, operator: AbstractOperator, use_Oloc2: bool = False):
27
+ r"""
28
+ Constructs the observable computing the variance of an arbitrary quantum operator :math:`O` as:
29
+
30
+ .. math::
31
+
32
+ \text{Var} = \frac{\langle \Psi | O^2 | \Psi \rangle}{\langle \Psi | \Psi \rangle} - \bigg( \frac{\langle \Psi | O | \Psi \rangle}{\langle \Psi | \Psi \rangle}\bigg)^2
33
+
34
+ It can compute the first term using either the estimator of the squared operator :math:`O^2` (more precise but less efficient, since it requires
35
+ the connected configurations and the matrix elements of :math:`O^2`):
36
+
37
+ .. math::
38
+
39
+ \text{Var} = \mathbb{E}_{\sigma \sim |\Psi(\sigma)|^2}\bigg[\frac{\langle \sigma | O^2 | \Psi \rangle}{\langle \sigma | \Psi \rangle}\bigg] - \bigg(\mathbb{E}_{\sigma \sim |\Psi(\sigma)|^2}\bigg[\frac{\langle \sigma | O | \Psi \rangle}{\langle \sigma | \Psi \rangle}\bigg]\bigg)^2.
40
+
41
+ or using the square modulus of the estimator of :math:`O` (more noisy but more efficient):
42
+
43
+ .. math::
44
+
45
+ \text{Var} = \mathbb{E}_{\sigma \sim |\Psi(\sigma)|^2}\bigg[\bigg(\frac{\langle \sigma | O | \Psi \rangle}{\langle \sigma | \Psi \rangle} - \mathbb{E}_{\sigma \sim |\Psi(\sigma)|^2}\bigg[\frac{\langle \sigma | O | \Psi \rangle}{\langle \sigma | \Psi \rangle}\bigg]\bigg)^2\bigg]
46
+
47
+ This VariationalOperator wraps an operator such that the gradient will not be computed
48
+ with respect to the expectation value, but with respect to the variance.
49
+
50
+ Args:
51
+ operator: The operator for which the variance is to be computed.
52
+ use_Oloc2: If True, uses the local estimator of the squared operator `O^2` for variance computation.
53
+ If False, uses only the operator `O` for variance computation (defaults to False).
54
+
55
+ Returns:
56
+ Observable computing the variance of `operator`.
57
+ """
58
+ super().__init__(operator.hilbert)
59
+ self._operator = operator
60
+
61
+ if use_Oloc2:
62
+ self._operator_squared = nk.operator.Squared(operator)
63
+ else:
64
+ self._operator_squared = operator @ operator
65
+
66
+ @property
67
+ def operator(self) -> AbstractOperator:
68
+ """
69
+ The operator for which the variance is to be computed.
70
+ """
71
+ return self._operator
72
+
73
+ @property
74
+ def operator_squared(self) -> AbstractOperator:
75
+ """
76
+ The squared of the operator for which the variance is to be computed.
77
+ Depending on the flag `use_Oloc2`, this can be the operator using the local
78
+ estimator of `O^2` (True), or the one using the square modulus of the
79
+ local estimator of `O` (False).
80
+ """
81
+ return self._operator_squared
82
+
83
+ def __repr__(self):
84
+ return f"VarianceObservable(op={self.operator})"
@@ -0,0 +1,54 @@
1
+ # Copyright 2020, 2021 The NetKet Authors - All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from . import rules
16
+
17
+ from .metropolis_pmap import MetropolisSamplerPmap
18
+
19
+ from .metropolis import MetropolisParticleExchange
20
+
21
+
22
+ # Deprecated bindings from stabilisaation
23
+ from netket.sampler import (
24
+ ParallelTemperingSampler as _deprecated_MetropolisPtSampler,
25
+ ParallelTemperingLocal as _deprecated_MetropolisLocalPtSampler,
26
+ ParallelTemperingExchange as _deprecated_MetropolisExchangePtSampler,
27
+ )
28
+
29
+ _deprecations = {
30
+ # May 2024, NetKet 3.12
31
+ "MetropolisPtSampler": (
32
+ "netket.experimental.sampler.MetropolisPtSampler is deprecated: use "
33
+ "netket.sampler.ParallelTemperingSampler (netket >= 3.12)",
34
+ _deprecated_MetropolisPtSampler,
35
+ ),
36
+ "MetropolisLocalPt": (
37
+ "netket.experimental.sampler.MetropolisLocalPt is deprecated: use "
38
+ "netket.sampler.ParallelTemperingLocal (netket >= 3.12)",
39
+ _deprecated_MetropolisLocalPtSampler,
40
+ ),
41
+ "MetropolisExchangePt": (
42
+ "netket.experimental.sampler.MetropolisExchangePt is deprecated: use "
43
+ "netket.sampler.ParallelTemperingExchange (netket >= 3.12)",
44
+ _deprecated_MetropolisExchangePtSampler,
45
+ ),
46
+ }
47
+
48
+ from netket.utils.deprecation import deprecation_getattr as _deprecation_getattr
49
+ from netket.utils import _hide_submodules
50
+
51
+ __getattr__ = _deprecation_getattr(__name__, _deprecations)
52
+ _hide_submodules(__name__)
53
+
54
+ del _deprecation_getattr
@@ -1,7 +1,3 @@
1
- from functools import partial
2
-
3
- import jax
4
- import jax.numpy as jnp
5
1
  from typing import Optional
6
2
  import numpy as np
7
3
 
@@ -9,7 +5,6 @@ from netket.sampler.rules import ExchangeRule
9
5
  from netket.graph import AbstractGraph
10
6
  from netket.graph import disjoint_union
11
7
  from netket.experimental.hilbert import SpinOrbitalFermions
12
- from netket.jax.sharding import sharding_decorator
13
8
 
14
9
 
15
10
  class ParticleExchangeRule(ExchangeRule):
@@ -72,52 +67,5 @@ class ParticleExchangeRule(ExchangeRule):
72
67
  )
73
68
  super().__init__(clusters=clusters, graph=graph, d_max=d_max)
74
69
 
75
- def transition(rule, sampler, machine, parameters, state, key, σ):
76
- n_chains = σ.shape[0]
77
-
78
- # compute a mask for the clusters that can be hopped
79
- hoppable_clusters = _compute_hoppable_clusters_mask(rule.clusters, σ)
80
-
81
- keys = jnp.asarray(jax.random.split(key, n_chains))
82
-
83
- # we use shard_map to avoid the all-gather coming from the batched jnp.take / indexing
84
- @partial(sharding_decorator, sharded_args_tree=(True, True, True))
85
- @jax.vmap
86
- def _update_samples(key, σ, hoppable_clusters):
87
- # pick a random cluster, taking into account the mask
88
- n_conn = hoppable_clusters.sum(axis=-1)
89
- cluster = jax.random.choice(
90
- key,
91
- a=jnp.arange(rule.clusters.shape[0]),
92
- p=hoppable_clusters,
93
- replace=True,
94
- )
95
-
96
- # sites to be exchanged
97
- si = rule.clusters[cluster, 0]
98
- sj = rule.clusters[cluster, 1]
99
-
100
- σp = σ.at[si].set(σ[sj])
101
- σp = σp.at[sj].set(σ[si])
102
-
103
- # compute the number of connected sites
104
- hoppable_clusters_proposed = _compute_hoppable_clusters_mask(
105
- rule.clusters, σp
106
- )
107
- n_conn_proposed = hoppable_clusters_proposed.sum(axis=-1)
108
- log_prob_corr = jnp.log(n_conn) - jnp.log(n_conn_proposed)
109
- return σp, log_prob_corr
110
-
111
- return _update_samples(keys, σ, hoppable_clusters)
112
-
113
70
  def __repr__(self):
114
71
  return f"ParticleExchangeRule(# of clusters: {len(self.clusters)})"
115
-
116
-
117
- @jax.jit
118
- def _compute_hoppable_clusters_mask(clusters, σ):
119
- # mask the clusters to include only feasible moves (occ -> unocc, or the inverse)
120
- hoppable_clusters_mask = ~jnp.isclose(
121
- σ[..., clusters[:, 0]], σ[..., clusters[:, 1]]
122
- )
123
- return hoppable_clusters_mask
@@ -508,7 +508,7 @@ def KitaevHoneycomb(
508
508
  Example:
509
509
  Construct a Kitaev honeycomb lattice with 3 × 3 unit cells:
510
510
 
511
- >>> from netket.graph import Honeycomb
511
+ >>> from netket.graph import KitaevHoneycomb
512
512
  >>> g = KitaevHoneycomb(extent=[3, 3])
513
513
  >>> print(g.n_nodes)
514
514
  18
@@ -261,8 +261,24 @@ def DoubledGraph(graph: AbstractGraph) -> Graph:
261
261
  return Graph(n_nodes=dnodes, edges=dedges)
262
262
 
263
263
 
264
- def disjoint_union(graph_1: Graph, graph_2: Graph) -> Graph:
264
+ def disjoint_union(*graphs: tuple[Graph, ...]) -> Graph:
265
265
  """
266
- Returns the disjoint union of two graphs.
266
+ Returns the ordered disjoint union of the input graphs.
267
+
268
+ The ordering of the nodes is the same as the input order, so if
269
+ the I-th input graph has :math:`n_i` nodes, the first `[0, n_1[` nodes
270
+ will correspond to the first graph, the nodes between :math:`[n_1, n_1+n2[`
271
+ will correspond to the second graph, and so on and so forth.
272
+
273
+ Args:
274
+ *graphs: A variable number of NetKet graphs (or lattices).
275
+
276
+ Output:
277
+ A NetKet Graph object.
267
278
  """
268
- return Graph.from_igraph(igraph.disjoint_union([graph_1._igraph, graph_2._igraph]))
279
+ if len(graphs) == 0:
280
+ raise ValueError("Must provide at least one graph")
281
+ elif len(graphs) == 1:
282
+ return graphs[0]
283
+ else:
284
+ return Graph.from_igraph(igraph.disjoint_union([g._igraph for g in graphs]))
@@ -24,7 +24,7 @@ import jax.numpy as jnp
24
24
 
25
25
  from equinox import error_if
26
26
 
27
- from netket.utils.types import Array
27
+ from netket.utils.types import Array, DType
28
28
 
29
29
  from .abstract_hilbert import AbstractHilbert
30
30
  from .index import is_indexable
@@ -35,6 +35,17 @@ class DiscreteHilbert(AbstractHilbert):
35
35
 
36
36
  This class defines the common interface that can be used to
37
37
  interact with hilbert spaces on lattices.
38
+
39
+ The local degrees of freedom are discrete and numerable, therefore they can always be
40
+ converted to and from integers using the methods `states_to_local_indices` and
41
+ `local_indices_to_states`.
42
+ This can be used to simplify the implementation of operators that might act on the
43
+ hilbert space, to avoid reimplementing the logic for different values of the local
44
+ degrees of freedom.
45
+
46
+ If the Hilbert space is small enough, individual states can be converted to and from
47
+ integers labelling all the basis states. This is done using the methods `numbers_to_states`
48
+ and `states_to_numbers`.
38
49
  """
39
50
 
40
51
  def __init__(self, shape: tuple[int, ...]):
@@ -236,6 +247,30 @@ class DiscreteHilbert(AbstractHilbert):
236
247
  f"implemented for Hilbert space {self} of type {type(self)}"
237
248
  )
238
249
 
250
+ def local_indices_to_states(self, x: Array, dtype: DType = None):
251
+ r"""
252
+ Converts a tensor of integers to the corresponding local_values in
253
+ this hilbert space.
254
+
255
+ Equivalent to
256
+
257
+ .. code::py
258
+
259
+ hilbert.local_states[x]
260
+
261
+ The input last dimension must match the size of this Hilbert space.
262
+ This function can be jax-jitted.
263
+
264
+ Args:
265
+ x: a tensor with integer dtype and whose last dimension matches
266
+ the size of this Hilbert space.
267
+
268
+ Returns:
269
+ a tensor with the same shape as the input, and values corresponding
270
+ to the local_state indexed by the input tensor `x`.
271
+ """
272
+ raise NotImplementedError()
273
+
239
274
  @property
240
275
  def is_indexable(self) -> bool:
241
276
  """Whether the space can be indexed with an integer"""
@@ -15,9 +15,11 @@
15
15
  import jax.numpy as jnp
16
16
 
17
17
  from netket.utils.dispatch import parametric
18
+ from netket.utils.types import Array, DType
18
19
 
19
20
  from .abstract_hilbert import AbstractHilbert
20
21
  from .discrete_hilbert import DiscreteHilbert
22
+ from .index import is_indexable
21
23
 
22
24
 
23
25
  @parametric
@@ -63,6 +65,12 @@ class DoubledHilbert(DiscreteHilbert):
63
65
  def is_finite(self):
64
66
  return self.physical.is_finite
65
67
 
68
+ @property
69
+ def is_indexable(self) -> bool:
70
+ """Whether the space can be indexed with an integer"""
71
+ n = self.physical.n_states
72
+ return self.physical.is_indexable and is_indexable([n, n])
73
+
66
74
  @property
67
75
  def local_size(self):
68
76
  return self.physical.local_size
@@ -143,6 +151,9 @@ class DoubledHilbert(DiscreteHilbert):
143
151
  def states_to_local_indices(self, x):
144
152
  return self.physical.states_to_local_indices(x)
145
153
 
154
+ def local_indices_to_states(self, x: Array, dtype: DType = None):
155
+ return self.physical.local_indices_to_states(x, dtype=dtype)
156
+
146
157
  def __repr__(self):
147
158
  return f"DoubledHilbert({self.physical})"
148
159