NetKet 3.19.2__tar.gz → 3.20.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. {netket-3.19.2 → netket-3.20.1}/.gitignore +7 -0
  2. {netket-3.19.2 → netket-3.20.1}/PKG-INFO +3 -3
  3. netket-3.20.1/docs/sphinx_extensions/netket_citations.py +256 -0
  4. {netket-3.19.2 → netket-3.20.1}/netket/__init__.py +27 -8
  5. {netket-3.19.2/netket/experimental → netket-3.20.1/netket/_src}/driver/vmc_sr.py +104 -26
  6. {netket-3.19.2 → netket-3.20.1}/netket/_src/ngd/sr.py +16 -6
  7. {netket-3.19.2 → netket-3.20.1}/netket/_src/ngd/sr_srt_common.py +1 -1
  8. {netket-3.19.2 → netket-3.20.1}/netket/_src/ngd/srt.py +6 -6
  9. {netket-3.19.2 → netket-3.20.1}/netket/_src/ngd/srt_onthefly.py +23 -26
  10. netket-3.20.1/netket/_src/operator/hpsi_utils.py +68 -0
  11. netket-3.20.1/netket/_src/operator/permutation/permutation_operator_base.py +128 -0
  12. netket-3.20.1/netket/_src/operator/permutation/permutation_operator_construct.py +53 -0
  13. netket-3.20.1/netket/_src/operator/permutation/permutation_operator_fermion.py +260 -0
  14. netket-3.20.1/netket/_src/operator/permutation/permutation_operator_spin.py +110 -0
  15. netket-3.20.1/netket/_src/operator/permutation/trace_utils.py +118 -0
  16. netket-3.20.1/netket/_src/symmetry/representation.py +271 -0
  17. netket-3.20.1/netket/_src/symmetry/representation_construction.py +75 -0
  18. netket-3.20.1/netket/_src/vqs/transformed_vstate.py +71 -0
  19. {netket-3.19.2 → netket-3.20.1}/netket/_version.py +2 -2
  20. {netket-3.19.2 → netket-3.20.1}/netket/driver/__init__.py +5 -3
  21. {netket-3.19.2 → netket-3.20.1}/netket/driver/abstract_variational_driver.py +3 -2
  22. {netket-3.19.2 → netket-3.20.1}/netket/driver/vmc.py +19 -1
  23. {netket-3.19.2 → netket-3.20.1}/netket/errors.py +145 -95
  24. {netket-3.19.2 → netket-3.20.1}/netket/experimental/driver/__init__.py +17 -7
  25. {netket-3.19.2 → netket-3.20.1}/netket/experimental/driver/infidelity_sr.py +39 -24
  26. {netket-3.19.2 → netket-3.20.1}/netket/experimental/driver/tdvp_schmitt.py +6 -0
  27. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/infidelity/infidelity_operator.py +4 -4
  28. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/renyi2/expect.py +1 -1
  29. {netket-3.19.2 → netket-3.20.1}/netket/experimental/qsr/driver.py +2 -1
  30. {netket-3.19.2 → netket-3.20.1}/netket/graph/graph.py +4 -1
  31. {netket-3.19.2 → netket-3.20.1}/netket/graph/lattice.py +95 -7
  32. {netket-3.19.2 → netket-3.20.1}/netket/graph/space_group.py +3 -1
  33. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/discrete_hilbert.py +1 -1
  34. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/homogeneous.py +2 -2
  35. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/random/base.py +6 -5
  36. {netket-3.19.2 → netket-3.20.1}/netket/jax/__init__.py +16 -1
  37. {netket-3.19.2 → netket-3.20.1}/netket/jax/_chunk_utils.py +3 -1
  38. {netket-3.19.2 → netket-3.20.1}/netket/jax/_grad.py +0 -4
  39. {netket-3.19.2 → netket-3.20.1}/netket/jax/_jacobian/jacobian_dense.py +3 -2
  40. {netket-3.19.2 → netket-3.20.1}/netket/jax/_jacobian/jacobian_pytree.py +3 -4
  41. {netket-3.19.2 → netket-3.20.1}/netket/jax/_jacobian/logic.py +30 -45
  42. {netket-3.19.2 → netket-3.20.1}/netket/jax/_ntk/logic.py +21 -29
  43. {netket-3.19.2 → netket-3.20.1}/netket/jax/_scanmap.py +3 -4
  44. {netket-3.19.2 → netket-3.20.1}/netket/jax/_sort.py +13 -4
  45. {netket-3.19.2 → netket-3.20.1}/netket/jax/_utils_dtype.py +1 -1
  46. {netket-3.19.2 → netket-3.20.1}/netket/jax/_utils_random.py +47 -13
  47. {netket-3.19.2 → netket-3.20.1}/netket/jax/_utils_tree.py +3 -12
  48. {netket-3.19.2 → netket-3.20.1}/netket/jax/_vjp_chunked.py +8 -1
  49. {netket-3.19.2 → netket-3.20.1}/netket/jax/_vmap_chunked.py +9 -1
  50. netket-3.20.1/netket/jax/sharding/__init__.py +56 -0
  51. netket-3.20.1/netket/jax/sharding/debug.py +48 -0
  52. netket-3.19.2/netket/jax/sharding.py → netket-3.20.1/netket/jax/sharding/fixed_sharding_decorator.py +62 -255
  53. netket-3.20.1/netket/jax/sharding/fixed_sharding_utils.py +180 -0
  54. netket-3.20.1/netket/jax/sharding/flexible_sharding.py +59 -0
  55. {netket-3.19.2 → netket-3.20.1}/netket/models/mlp.py +1 -1
  56. {netket-3.19.2 → netket-3.20.1}/netket/models/ndm.py +3 -3
  57. {netket-3.19.2 → netket-3.20.1}/netket/models/rbm.py +4 -4
  58. netket-3.20.1/netket/nn/__init__.py +171 -0
  59. netket-3.20.1/netket/nn/activation.py +208 -0
  60. {netket-3.19.2 → netket-3.20.1}/netket/nn/blocks/mlp.py +1 -2
  61. {netket-3.19.2 → netket-3.20.1}/netket/nn/blocks/symmetry_sum.py +4 -7
  62. {netket-3.19.2 → netket-3.20.1}/netket/nn/utils.py +2 -1
  63. {netket-3.19.2 → netket-3.20.1}/netket/operator/__init__.py +2 -0
  64. {netket-3.19.2 → netket-3.20.1}/netket/operator/_abstract_operator.py +13 -3
  65. {netket-3.19.2 → netket-3.20.1}/netket/operator/_bose_hubbard/base.py +4 -4
  66. {netket-3.19.2 → netket-3.20.1}/netket/operator/_bose_hubbard/jax.py +2 -1
  67. {netket-3.19.2 → netket-3.20.1}/netket/operator/_continuous_operator.py +1 -1
  68. {netket-3.19.2 → netket-3.20.1}/netket/operator/_discrete_operator.py +8 -6
  69. {netket-3.19.2 → netket-3.20.1}/netket/operator/_discrete_operator_jax.py +10 -6
  70. {netket-3.19.2 → netket-3.20.1}/netket/operator/_fermion2nd/base.py +14 -5
  71. {netket-3.19.2 → netket-3.20.1}/netket/operator/_fermion2nd/jax.py +4 -12
  72. {netket-3.19.2 → netket-3.20.1}/netket/operator/_ising/base.py +6 -3
  73. {netket-3.19.2 → netket-3.20.1}/netket/operator/_ising/jax.py +7 -2
  74. {netket-3.19.2 → netket-3.20.1}/netket/operator/_kinetic.py +2 -0
  75. {netket-3.19.2 → netket-3.20.1}/netket/operator/_local_liouvillian.py +1 -1
  76. {netket-3.19.2 → netket-3.20.1}/netket/operator/_local_operator/base.py +26 -4
  77. {netket-3.19.2 → netket-3.20.1}/netket/operator/_local_operator/jax.py +25 -5
  78. {netket-3.19.2 → netket-3.20.1}/netket/operator/_local_operator/numba.py +23 -3
  79. {netket-3.19.2 → netket-3.20.1}/netket/operator/_pauli_strings/base.py +54 -3
  80. netket-3.20.1/netket/operator/_prod/__init__.py +18 -0
  81. netket-3.20.1/netket/operator/_prod/base.py +233 -0
  82. netket-3.20.1/netket/operator/_prod/discrete_jax_operator.py +90 -0
  83. netket-3.20.1/netket/operator/_prod/discrete_operator.py +59 -0
  84. netket-3.20.1/netket/operator/_prod/operator.py +36 -0
  85. {netket-3.19.2 → netket-3.20.1}/netket/operator/_sum/__init__.py +5 -5
  86. {netket-3.19.2 → netket-3.20.1}/netket/operator/_sum/base.py +64 -4
  87. {netket-3.19.2 → netket-3.20.1}/netket/operator/_sum/discrete_operator.py +7 -2
  88. netket-3.20.1/netket/operator/permutation.py +15 -0
  89. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/qgt_jacobian_dense.py +2 -1
  90. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/qgt_jacobian_pytree.py +5 -4
  91. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/qgt_onthefly.py +3 -2
  92. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/solver/solvers.py +7 -8
  93. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/sr.py +3 -2
  94. {netket-3.19.2 → netket-3.20.1}/netket/sampler/autoreg.py +30 -14
  95. {netket-3.19.2 → netket-3.20.1}/netket/sampler/exact.py +3 -2
  96. {netket-3.19.2 → netket-3.20.1}/netket/sampler/metropolis_numpy.py +2 -1
  97. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/__init__.py +1 -0
  98. netket-3.20.1/netket/sampler/rules/global_flip_rule.py +13 -0
  99. {netket-3.19.2 → netket-3.20.1}/netket/stats/mc_stats.py +0 -3
  100. netket-3.20.1/netket/symmetry/__init__.py +7 -0
  101. {netket-3.19.2 → netket-3.20.1}/netket/utils/__init__.py +2 -0
  102. {netket-3.19.2 → netket-3.20.1}/netket/utils/_dependencies_check.py +2 -3
  103. netket-3.20.1/netket/utils/_tips.py +103 -0
  104. netket-3.20.1/netket/utils/citations/__init__.py +38 -0
  105. netket-3.20.1/netket/utils/citations/cli.py +53 -0
  106. netket-3.20.1/netket/utils/citations/core.py +409 -0
  107. netket-3.20.1/netket/utils/citations/docs.py +232 -0
  108. netket-3.20.1/netket/utils/citations/internal_citations.bib +110 -0
  109. {netket-3.19.2 → netket-3.20.1}/netket/utils/config_flags.py +47 -28
  110. {netket-3.19.2 → netket-3.20.1}/netket/utils/deprecation.py +7 -17
  111. netket-3.20.1/netket/utils/group/__init__.py +20 -0
  112. {netket-3.19.2 → netket-3.20.1}/netket/utils/group/_permutation_group.py +63 -4
  113. {netket-3.19.2 → netket-3.20.1}/netket/utils/group/axial.py +9 -0
  114. {netket-3.19.2 → netket-3.20.1}/netket/utils/group/cubic.py +9 -0
  115. {netket-3.19.2 → netket-3.20.1}/netket/utils/group/icosa.py +9 -0
  116. {netket-3.19.2 → netket-3.20.1}/netket/utils/group/planar.py +9 -0
  117. netket-3.20.1/netket/utils/iterators.py +6 -0
  118. {netket-3.19.2 → netket-3.20.1}/netket/utils/jax.py +7 -3
  119. {netket-3.19.2 → netket-3.20.1}/netket/utils/model_frameworks/equinox.py +16 -1
  120. {netket-3.19.2 → netket-3.20.1}/netket/utils/model_frameworks/nnx.py +5 -1
  121. {netket-3.19.2 → netket-3.20.1}/netket/utils/numbers.py +18 -7
  122. {netket-3.19.2 → netket-3.20.1}/netket/utils/struct/pytree.py +1 -1
  123. {netket-3.19.2 → netket-3.20.1}/netket/utils/types.py +1 -0
  124. {netket-3.19.2 → netket-3.20.1}/netket/vqs/__init__.py +2 -0
  125. {netket-3.19.2 → netket-3.20.1}/netket/vqs/full_summ/state.py +25 -15
  126. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_mixed_state/state.py +15 -0
  127. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_state/expect.py +0 -1
  128. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_state/state.py +39 -42
  129. {netket-3.19.2 → netket-3.20.1}/pyproject.toml +13 -9
  130. netket-3.19.2/netket/_src/operator/hpsi_utils.py +0 -48
  131. netket-3.19.2/netket/nn/__init__.py +0 -59
  132. netket-3.19.2/netket/nn/activation.py +0 -104
  133. {netket-3.19.2 → netket-3.20.1}/LICENSE +0 -0
  134. {netket-3.19.2 → netket-3.20.1}/README.md +0 -0
  135. {netket-3.19.2 → netket-3.20.1}/netket/_src/ngd/kwargs.py +0 -0
  136. {netket-3.19.2 → netket-3.20.1}/netket/callbacks/__init__.py +0 -0
  137. {netket-3.19.2 → netket-3.20.1}/netket/callbacks/convergence_stopping.py +0 -0
  138. {netket-3.19.2 → netket-3.20.1}/netket/callbacks/early_stopping.py +0 -0
  139. {netket-3.19.2 → netket-3.20.1}/netket/callbacks/invalid_loss_stopping.py +0 -0
  140. {netket-3.19.2 → netket-3.20.1}/netket/callbacks/timeout.py +0 -0
  141. {netket-3.19.2 → netket-3.20.1}/netket/driver/steady_state.py +0 -0
  142. {netket-3.19.2 → netket-3.20.1}/netket/exact.py +0 -0
  143. {netket-3.19.2 → netket-3.20.1}/netket/experimental/__init__.py +0 -0
  144. {netket-3.19.2 → netket-3.20.1}/netket/experimental/driver/tdvp.py +0 -0
  145. {netket-3.19.2 → netket-3.20.1}/netket/experimental/driver/tdvp_common.py +0 -0
  146. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/__init__.py +0 -0
  147. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/_integrator.py +0 -0
  148. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/_integrator_params.py +0 -0
  149. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/_integrator_state.py +0 -0
  150. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/_rk/__init__.py +0 -0
  151. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/_rk/_solver.py +0 -0
  152. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/_rk/_tableau.py +0 -0
  153. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/_solver.py +0 -0
  154. {netket-3.19.2 → netket-3.20.1}/netket/experimental/dynamics/_utils.py +0 -0
  155. {netket-3.19.2 → netket-3.20.1}/netket/experimental/geometry/__init__.py +0 -0
  156. {netket-3.19.2 → netket-3.20.1}/netket/experimental/geometry/cell.py +0 -0
  157. {netket-3.19.2 → netket-3.20.1}/netket/experimental/hilbert/__init__.py +0 -0
  158. {netket-3.19.2 → netket-3.20.1}/netket/experimental/hilbert/continuous_hilbert.py +0 -0
  159. {netket-3.19.2 → netket-3.20.1}/netket/experimental/hilbert/particle.py +0 -0
  160. {netket-3.19.2 → netket-3.20.1}/netket/experimental/hilbert/random/__init__.py +0 -0
  161. {netket-3.19.2 → netket-3.20.1}/netket/experimental/hilbert/random/particle.py +0 -0
  162. {netket-3.19.2 → netket-3.20.1}/netket/experimental/logging/__init__.py +0 -0
  163. {netket-3.19.2 → netket-3.20.1}/netket/experimental/logging/hdf5_log.py +0 -0
  164. {netket-3.19.2 → netket-3.20.1}/netket/experimental/models/__init__.py +0 -0
  165. {netket-3.19.2 → netket-3.20.1}/netket/experimental/models/fast_rnn.py +0 -0
  166. {netket-3.19.2 → netket-3.20.1}/netket/experimental/models/rnn.py +0 -0
  167. {netket-3.19.2 → netket-3.20.1}/netket/experimental/nn/__init__.py +0 -0
  168. {netket-3.19.2 → netket-3.20.1}/netket/experimental/nn/rnn/__init__.py +0 -0
  169. {netket-3.19.2 → netket-3.20.1}/netket/experimental/nn/rnn/cells.py +0 -0
  170. {netket-3.19.2 → netket-3.20.1}/netket/experimental/nn/rnn/layers.py +0 -0
  171. {netket-3.19.2 → netket-3.20.1}/netket/experimental/nn/rnn/layers_fast.py +0 -0
  172. {netket-3.19.2 → netket-3.20.1}/netket/experimental/nn/rnn/ordering.py +0 -0
  173. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/__init__.py +0 -0
  174. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/infidelity/__init__.py +0 -0
  175. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/infidelity/exact.py +0 -0
  176. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/infidelity/expect.py +0 -0
  177. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/renyi2/S2_operator.py +0 -0
  178. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/renyi2/__init__.py +0 -0
  179. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/renyi2/exact.py +0 -0
  180. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/variance/__init__.py +0 -0
  181. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/variance/exact.py +0 -0
  182. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/variance/expect.py +0 -0
  183. {netket-3.19.2 → netket-3.20.1}/netket/experimental/observable/variance/variance_operator.py +0 -0
  184. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/__init__.py +0 -0
  185. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/_normal_order_utils.py +0 -0
  186. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/_particle_number_conserving_fermionic/__init__.py +0 -0
  187. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/_particle_number_conserving_fermionic/_conversion.py +0 -0
  188. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/_particle_number_conserving_fermionic/_fermihubbard.py +0 -0
  189. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/_particle_number_conserving_fermionic/_kernels.py +0 -0
  190. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/_particle_number_conserving_fermionic/_operator_data.py +0 -0
  191. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/_particle_number_conserving_fermionic/_operators.py +0 -0
  192. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/_pyscf_utils.py +0 -0
  193. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/fermion.py +0 -0
  194. {netket-3.19.2 → netket-3.20.1}/netket/experimental/operator/pyscf.py +0 -0
  195. {netket-3.19.2 → netket-3.20.1}/netket/experimental/qsr/__init__.py +0 -0
  196. {netket-3.19.2 → netket-3.20.1}/netket/experimental/qsr/dataset.py +0 -0
  197. {netket-3.19.2 → netket-3.20.1}/netket/experimental/qsr/logic_helpers.py +0 -0
  198. {netket-3.19.2 → netket-3.20.1}/netket/experimental/sampler/__init__.py +0 -0
  199. {netket-3.19.2 → netket-3.20.1}/netket/experimental/sampler/rules/__init__.py +0 -0
  200. {netket-3.19.2 → netket-3.20.1}/netket/experimental/vqs/__init__.py +0 -0
  201. {netket-3.19.2 → netket-3.20.1}/netket/experimental/vqs/io.py +0 -0
  202. {netket-3.19.2 → netket-3.20.1}/netket/graph/__init__.py +0 -0
  203. {netket-3.19.2 → netket-3.20.1}/netket/graph/_lattice_draw.py +0 -0
  204. {netket-3.19.2 → netket-3.20.1}/netket/graph/_lattice_edge_logic.py +0 -0
  205. {netket-3.19.2 → netket-3.20.1}/netket/graph/abstract_graph.py +0 -0
  206. {netket-3.19.2 → netket-3.20.1}/netket/graph/common_lattices.py +0 -0
  207. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/__init__.py +0 -0
  208. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/abstract_hilbert.py +0 -0
  209. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/constraint/__init__.py +0 -0
  210. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/constraint/base.py +0 -0
  211. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/constraint/multiple.py +0 -0
  212. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/constraint/sum.py +0 -0
  213. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/constraint/sum_partition.py +0 -0
  214. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/doubled_hilbert.py +0 -0
  215. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/fock.py +0 -0
  216. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/index/__init__.py +0 -0
  217. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/index/base.py +0 -0
  218. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/index/constrained_generic.py +0 -0
  219. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/index/constrained_sum.py +0 -0
  220. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/index/constrained_sum_partitions.py +0 -0
  221. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/index/unconstrained.py +0 -0
  222. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/index/uniform_tensor.py +0 -0
  223. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/qubit.py +0 -0
  224. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/random/__init__.py +0 -0
  225. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/random/doubled.py +0 -0
  226. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/random/fock.py +0 -0
  227. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/random/homogeneous.py +0 -0
  228. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/random/qubit.py +0 -0
  229. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/random/tensor_hilbert.py +0 -0
  230. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/spin.py +0 -0
  231. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/spin_orbital_fermions.py +0 -0
  232. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/tensor_hilbert.py +0 -0
  233. {netket-3.19.2 → netket-3.20.1}/netket/hilbert/tensor_hilbert_discrete.py +0 -0
  234. {netket-3.19.2 → netket-3.20.1}/netket/jax/_expect.py +0 -0
  235. {netket-3.19.2 → netket-3.20.1}/netket/jax/_jacobian/__init__.py +0 -0
  236. {netket-3.19.2 → netket-3.20.1}/netket/jax/_jacobian/default_mode.py +0 -0
  237. {netket-3.19.2 → netket-3.20.1}/netket/jax/_math.py +0 -0
  238. {netket-3.19.2 → netket-3.20.1}/netket/jax/_ntk/__init__.py +0 -0
  239. {netket-3.19.2 → netket-3.20.1}/netket/jax/_ntk/utils.py +0 -0
  240. {netket-3.19.2 → netket-3.20.1}/netket/jax/_sparse.py +0 -0
  241. {netket-3.19.2 → netket-3.20.1}/netket/jax/_vjp.py +0 -0
  242. {netket-3.19.2 → netket-3.20.1}/netket/logging/__init__.py +0 -0
  243. {netket-3.19.2 → netket-3.20.1}/netket/logging/base.py +0 -0
  244. {netket-3.19.2 → netket-3.20.1}/netket/logging/json_log.py +0 -0
  245. {netket-3.19.2 → netket-3.20.1}/netket/logging/runtime_log.py +0 -0
  246. {netket-3.19.2 → netket-3.20.1}/netket/logging/state_log.py +0 -0
  247. {netket-3.19.2 → netket-3.20.1}/netket/logging/tensorboard.py +0 -0
  248. {netket-3.19.2 → netket-3.20.1}/netket/models/README.md +0 -0
  249. {netket-3.19.2 → netket-3.20.1}/netket/models/__init__.py +0 -0
  250. {netket-3.19.2 → netket-3.20.1}/netket/models/autoreg.py +0 -0
  251. {netket-3.19.2 → netket-3.20.1}/netket/models/deepset.py +0 -0
  252. {netket-3.19.2 → netket-3.20.1}/netket/models/equivariant.py +0 -0
  253. {netket-3.19.2 → netket-3.20.1}/netket/models/fast_autoreg.py +0 -0
  254. {netket-3.19.2 → netket-3.20.1}/netket/models/full_space.py +0 -0
  255. {netket-3.19.2 → netket-3.20.1}/netket/models/gaussian.py +0 -0
  256. {netket-3.19.2 → netket-3.20.1}/netket/models/jastrow.py +0 -0
  257. {netket-3.19.2 → netket-3.20.1}/netket/models/slater.py +0 -0
  258. {netket-3.19.2 → netket-3.20.1}/netket/models/tensor_networks/__init__.py +0 -0
  259. {netket-3.19.2 → netket-3.20.1}/netket/models/tensor_networks/mpdo.py +0 -0
  260. {netket-3.19.2 → netket-3.20.1}/netket/models/tensor_networks/mps.py +0 -0
  261. {netket-3.19.2 → netket-3.20.1}/netket/models/utils.py +0 -0
  262. {netket-3.19.2 → netket-3.20.1}/netket/nn/blocks/__init__.py +0 -0
  263. {netket-3.19.2 → netket-3.20.1}/netket/nn/blocks/deepset.py +0 -0
  264. {netket-3.19.2 → netket-3.20.1}/netket/nn/fast_masked_linear.py +0 -0
  265. {netket-3.19.2 → netket-3.20.1}/netket/nn/masked_linear.py +0 -0
  266. {netket-3.19.2 → netket-3.20.1}/netket/nn/symmetric_linear.py +0 -0
  267. {netket-3.19.2 → netket-3.20.1}/netket/operator/_abstract_observable.py +0 -0
  268. {netket-3.19.2 → netket-3.20.1}/netket/operator/_abstract_super_operator.py +0 -0
  269. {netket-3.19.2 → netket-3.20.1}/netket/operator/_bose_hubbard/__init__.py +0 -0
  270. {netket-3.19.2 → netket-3.20.1}/netket/operator/_bose_hubbard/numba.py +0 -0
  271. {netket-3.19.2 → netket-3.20.1}/netket/operator/_fermion2nd/__init__.py +0 -0
  272. {netket-3.19.2 → netket-3.20.1}/netket/operator/_fermion2nd/numba.py +0 -0
  273. {netket-3.19.2 → netket-3.20.1}/netket/operator/_fermion2nd/utils.py +0 -0
  274. {netket-3.19.2 → netket-3.20.1}/netket/operator/_graph_operator.py +0 -0
  275. {netket-3.19.2 → netket-3.20.1}/netket/operator/_hamiltonian.py +0 -0
  276. {netket-3.19.2 → netket-3.20.1}/netket/operator/_heisenberg.py +0 -0
  277. {netket-3.19.2 → netket-3.20.1}/netket/operator/_ising/__init__.py +0 -0
  278. {netket-3.19.2 → netket-3.20.1}/netket/operator/_ising/numba.py +0 -0
  279. {netket-3.19.2 → netket-3.20.1}/netket/operator/_lazy.py +0 -0
  280. {netket-3.19.2 → netket-3.20.1}/netket/operator/_local_operator/__init__.py +0 -0
  281. {netket-3.19.2 → netket-3.20.1}/netket/operator/_local_operator/compile_helpers.py +0 -0
  282. {netket-3.19.2 → netket-3.20.1}/netket/operator/_local_operator/convert.py +0 -0
  283. {netket-3.19.2 → netket-3.20.1}/netket/operator/_local_operator/helpers.py +0 -0
  284. {netket-3.19.2 → netket-3.20.1}/netket/operator/_pauli_strings/__init__.py +0 -0
  285. {netket-3.19.2 → netket-3.20.1}/netket/operator/_pauli_strings/jax.py +0 -0
  286. {netket-3.19.2 → netket-3.20.1}/netket/operator/_pauli_strings/numba.py +0 -0
  287. {netket-3.19.2 → netket-3.20.1}/netket/operator/_potential.py +0 -0
  288. {netket-3.19.2 → netket-3.20.1}/netket/operator/_sum/continuous.py +0 -0
  289. {netket-3.19.2 → netket-3.20.1}/netket/operator/_sum/discrete_jax_operator.py +0 -0
  290. {netket-3.19.2 → netket-3.20.1}/netket/operator/_sum/operator.py +0 -0
  291. {netket-3.19.2 → netket-3.20.1}/netket/operator/boson.py +0 -0
  292. {netket-3.19.2 → netket-3.20.1}/netket/operator/fermion.py +0 -0
  293. {netket-3.19.2 → netket-3.20.1}/netket/operator/spin.py +0 -0
  294. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/__init__.py +0 -0
  295. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/linear_operator.py +0 -0
  296. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/preconditioner.py +0 -0
  297. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/__init__.py +0 -0
  298. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/common.py +0 -0
  299. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/default.py +0 -0
  300. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/qgt_jacobian.py +0 -0
  301. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/qgt_jacobian_common.py +0 -0
  302. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/qgt/qgt_onthefly_logic.py +0 -0
  303. {netket-3.19.2 → netket-3.20.1}/netket/optimizer/solver/__init__.py +0 -0
  304. {netket-3.19.2 → netket-3.20.1}/netket/sampler/__init__.py +0 -0
  305. {netket-3.19.2 → netket-3.20.1}/netket/sampler/base.py +0 -0
  306. {netket-3.19.2 → netket-3.20.1}/netket/sampler/metropolis.py +0 -0
  307. {netket-3.19.2 → netket-3.20.1}/netket/sampler/parallel_tempering.py +0 -0
  308. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/base.py +0 -0
  309. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/continuous_gaussian.py +0 -0
  310. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/custom_numpy.py +0 -0
  311. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/exchange.py +0 -0
  312. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/fermion_2nd.py +0 -0
  313. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/fixed.py +0 -0
  314. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/hamiltonian.py +0 -0
  315. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/hamiltonian_numpy.py +0 -0
  316. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/langevin.py +0 -0
  317. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/local.py +0 -0
  318. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/local_numpy.py +0 -0
  319. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/multiple.py +0 -0
  320. {netket-3.19.2 → netket-3.20.1}/netket/sampler/rules/tensor.py +0 -0
  321. {netket-3.19.2 → netket-3.20.1}/netket/stats/__init__.py +0 -0
  322. {netket-3.19.2 → netket-3.20.1}/netket/stats/_autocorr.py +0 -0
  323. {netket-3.19.2 → netket-3.20.1}/netket/stats/mc_stats_old.py +0 -0
  324. {netket-3.19.2 → netket-3.20.1}/netket/stats/mpi_stats.py +0 -0
  325. {netket-3.19.2/netket/utils → netket-3.20.1/netket/symmetry}/group/__init__.py +0 -0
  326. {netket-3.19.2 → netket-3.20.1}/netket/tools/__init__.py +0 -0
  327. {netket-3.19.2 → netket-3.20.1}/netket/tools/_common.py +0 -0
  328. {netket-3.19.2 → netket-3.20.1}/netket/tools/_cpu_info.py +0 -0
  329. {netket-3.19.2 → netket-3.20.1}/netket/tools/check_mpi.py +0 -0
  330. {netket-3.19.2 → netket-3.20.1}/netket/tools/djaxrun.py +0 -0
  331. {netket-3.19.2 → netket-3.20.1}/netket/tools/info.py +0 -0
  332. {netket-3.19.2 → netket-3.20.1}/netket/utils/_serialization.py +0 -0
  333. {netket-3.19.2 → netket-3.20.1}/netket/utils/api_utils.py +0 -0
  334. {netket-3.19.2 → netket-3.20.1}/netket/utils/array.py +0 -0
  335. {netket-3.19.2 → netket-3.20.1}/netket/utils/dispatch.py +0 -0
  336. {netket-3.19.2 → netket-3.20.1}/netket/utils/display/__init__.py +0 -0
  337. {netket-3.19.2 → netket-3.20.1}/netket/utils/display/repr.py +0 -0
  338. {netket-3.19.2 → netket-3.20.1}/netket/utils/float.py +0 -0
  339. {netket-3.19.2 → netket-3.20.1}/netket/utils/group/_group.py +0 -0
  340. {netket-3.19.2 → netket-3.20.1}/netket/utils/group/_point_group.py +0 -0
  341. {netket-3.19.2 → netket-3.20.1}/netket/utils/group/_semigroup.py +0 -0
  342. {netket-3.19.2 → netket-3.20.1}/netket/utils/history/__init__.py +0 -0
  343. {netket-3.19.2 → netket-3.20.1}/netket/utils/history/accum.py +0 -0
  344. {netket-3.19.2 → netket-3.20.1}/netket/utils/history/history.py +0 -0
  345. {netket-3.19.2 → netket-3.20.1}/netket/utils/history/history_dict.py +0 -0
  346. {netket-3.19.2 → netket-3.20.1}/netket/utils/holomorphic.py +0 -0
  347. {netket-3.19.2 → netket-3.20.1}/netket/utils/model_frameworks/__init__.py +0 -0
  348. {netket-3.19.2 → netket-3.20.1}/netket/utils/model_frameworks/base.py +0 -0
  349. {netket-3.19.2 → netket-3.20.1}/netket/utils/model_frameworks/flax.py +0 -0
  350. {netket-3.19.2 → netket-3.20.1}/netket/utils/model_frameworks/haiku.py +0 -0
  351. {netket-3.19.2 → netket-3.20.1}/netket/utils/model_frameworks/jax.py +0 -0
  352. {netket-3.19.2 → netket-3.20.1}/netket/utils/model_frameworks/nnx_wrapped.py +0 -0
  353. {netket-3.19.2 → netket-3.20.1}/netket/utils/moduletools.py +0 -0
  354. {netket-3.19.2 → netket-3.20.1}/netket/utils/mpi/__init__.py +0 -0
  355. {netket-3.19.2 → netket-3.20.1}/netket/utils/mpi/mpi.py +0 -0
  356. {netket-3.19.2 → netket-3.20.1}/netket/utils/mpi/primitives.py +0 -0
  357. {netket-3.19.2 → netket-3.20.1}/netket/utils/optional_deps.py +0 -0
  358. {netket-3.19.2 → netket-3.20.1}/netket/utils/partial.py +0 -0
  359. {netket-3.19.2 → netket-3.20.1}/netket/utils/seed.py +0 -0
  360. {netket-3.19.2 → netket-3.20.1}/netket/utils/static_number.py +0 -0
  361. {netket-3.19.2 → netket-3.20.1}/netket/utils/static_range.py +0 -0
  362. {netket-3.19.2 → netket-3.20.1}/netket/utils/struct/__init__.py +0 -0
  363. {netket-3.19.2 → netket-3.20.1}/netket/utils/struct/dataclass.py +0 -0
  364. {netket-3.19.2 → netket-3.20.1}/netket/utils/struct/fields.py +0 -0
  365. {netket-3.19.2 → netket-3.20.1}/netket/utils/struct/pytree_serialization_sharding.py +0 -0
  366. {netket-3.19.2 → netket-3.20.1}/netket/utils/struct/utils.py +0 -0
  367. {netket-3.19.2 → netket-3.20.1}/netket/utils/summation.py +0 -0
  368. {netket-3.19.2 → netket-3.20.1}/netket/utils/timing.py +0 -0
  369. {netket-3.19.2 → netket-3.20.1}/netket/utils/version_check.py +0 -0
  370. {netket-3.19.2 → netket-3.20.1}/netket/vqs/base.py +0 -0
  371. {netket-3.19.2 → netket-3.20.1}/netket/vqs/full_summ/__init__.py +0 -0
  372. {netket-3.19.2 → netket-3.20.1}/netket/vqs/full_summ/expect.py +0 -0
  373. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/__init__.py +0 -0
  374. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/common.py +0 -0
  375. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/kernels.py +0 -0
  376. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_mixed_state/__init__.py +0 -0
  377. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_mixed_state/expect.py +0 -0
  378. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_mixed_state/expect_chunked.py +0 -0
  379. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_state/__init__.py +0 -0
  380. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_state/expect_chunked.py +0 -0
  381. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_state/expect_forces.py +0 -0
  382. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_state/expect_forces_chunked.py +0 -0
  383. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_state/expect_grad.py +0 -0
  384. {netket-3.19.2 → netket-3.20.1}/netket/vqs/mc/mc_state/expect_grad_chunked.py +0 -0
@@ -84,5 +84,12 @@ build/
84
84
  # Website #
85
85
  ###########
86
86
  docs/_build
87
+ docs/.jupyter_cache
87
88
  _generated
88
89
  dist
90
+
91
+ # Auto-generated BibTeX files #
92
+ ###############################
93
+ references.bib
94
+ /references.bib
95
+ docs/references.bib
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: NetKet
3
- Version: 3.19.2
3
+ Version: 3.20.1
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/#
@@ -22,7 +22,7 @@ Requires-Dist: einops>=0.8.1
22
22
  Requires-Dist: equinox>=0.11.3
23
23
  Requires-Dist: flax>=0.10.2
24
24
  Requires-Dist: igraph>=0.10.0
25
- Requires-Dist: jax<0.6,>=0.4.35
25
+ Requires-Dist: jax>=0.7.0
26
26
  Requires-Dist: numba>=0.59
27
27
  Requires-Dist: numpy<3.0,>=1.20
28
28
  Requires-Dist: optax<0.3,>=0.2.2
@@ -46,7 +46,7 @@ Requires-Dist: pytest-json-report>=1.3; extra == 'dev'
46
46
  Requires-Dist: pytest-xdist[psutil]>=2; extra == 'dev'
47
47
  Requires-Dist: pytest>=6; extra == 'dev'
48
48
  Requires-Dist: qutip>=5; extra == 'dev'
49
- Requires-Dist: ruff==0.12.2; extra == 'dev'
49
+ Requires-Dist: ruff==0.14.1; extra == 'dev'
50
50
  Requires-Dist: wheel>=0.38.1; extra == 'dev'
51
51
  Provides-Extra: docs
52
52
  Requires-Dist: ipywidgets>=8.1.7; extra == 'docs'
@@ -0,0 +1,256 @@
1
+ """
2
+ Sphinx extension for NetKet citation system.
3
+
4
+ This extension provides directives to display citation information from NetKet's
5
+ citation system.
6
+ """
7
+
8
+ from docutils import nodes
9
+ from docutils.parsers.rst import Directive
10
+ from sphinx.application import Sphinx
11
+ from sphinx.util.docutils import SphinxDirective
12
+ from sphinx.util import logging
13
+ import importlib.util
14
+ import sys
15
+ from pathlib import Path
16
+
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ def _extract_doi_from_bibtex(bibtex_entry):
22
+ """Extract DOI from bibtex entry."""
23
+ import re
24
+
25
+ # Pattern to match doi field
26
+ doi_patterns = [
27
+ r'doi\s*=\s*{([^}]+)}',
28
+ r'doi\s*=\s*"([^"]+)"',
29
+ r'doi\s*=\s*([^,\s}]+)',
30
+ ]
31
+
32
+ for pattern in doi_patterns:
33
+ match = re.search(pattern, bibtex_entry, re.IGNORECASE)
34
+ if match:
35
+ return match.group(1).strip()
36
+
37
+ return None
38
+
39
+
40
+ def _extract_url_from_bibtex(bibtex_entry):
41
+ """Extract URL from bibtex entry."""
42
+ import re
43
+
44
+ # Pattern to match url field
45
+ url_patterns = [
46
+ r'url\s*=\s*{([^}]+)}',
47
+ r'url\s*=\s*"([^"]+)"',
48
+ r'url\s*=\s*([^,\s}]+)',
49
+ ]
50
+
51
+ for pattern in url_patterns:
52
+ match = re.search(pattern, bibtex_entry, re.IGNORECASE)
53
+ if match:
54
+ return match.group(1).strip()
55
+
56
+ return None
57
+
58
+
59
+ def _extract_title_from_bibtex(bibtex_entry):
60
+ """Extract and clean title from bibtex entry."""
61
+ import re
62
+
63
+ # Pattern to match title field
64
+ title_patterns = [
65
+ r'title\s*=\s*{([^}]+)}',
66
+ r'title\s*=\s*"([^"]+)"',
67
+ ]
68
+
69
+ for pattern in title_patterns:
70
+ match = re.search(pattern, bibtex_entry, re.IGNORECASE)
71
+ if match:
72
+ title = match.group(1).strip()
73
+ # Remove LaTeX formatting
74
+ title = re.sub(r'\\[a-zA-Z]+{([^}]*)}', r'\1', title)
75
+ title = re.sub(r'[{}]', '', title)
76
+ return title
77
+
78
+ return None
79
+
80
+
81
+ def _generate_bootstrap_citations():
82
+ """Generate bootstrap card-based citation HTML."""
83
+ from netket.utils.citations import get_all_citations
84
+ from netket.utils.citations.core import register_citation
85
+ from netket import __version__ as netket_version
86
+ import uuid
87
+
88
+ # Get all citations
89
+ citation_registry = get_all_citations()
90
+
91
+ if not citation_registry:
92
+ return '<div class="alert alert-info">No citations have been registered.</div>'
93
+
94
+ # Filter out NetKet papers
95
+ netket_papers = ["netket3:2022", "netket2:2019", "netket3:2021"]
96
+ filtered_registry = {k: v for k, v in citation_registry.items() if k not in netket_papers}
97
+
98
+ if not filtered_registry:
99
+ return '<div class="alert alert-info">No algorithm-specific citations have been registered.</div>'
100
+
101
+ # Group citations by group_id
102
+ groups = {}
103
+ for key, entry in filtered_registry.items():
104
+ group_id = entry.get('group_id')
105
+ if group_id not in groups:
106
+ groups[group_id] = []
107
+ groups[group_id].append((key, entry))
108
+
109
+ html_parts = ['<div class="row">']
110
+
111
+ for group_id, group_entries in groups.items():
112
+ # Get the first entry to extract group-level info
113
+ first_key, first_entry = group_entries[0]
114
+ condition = first_entry.get('condition', '').strip()
115
+ message = first_entry.get('message', 'This work used the methods described in Ref.~').strip()
116
+
117
+ # Create bootstrap card
118
+ html_parts.append('<div class="col-12 mb-2">')
119
+ html_parts.append('<div class="card">')
120
+ html_parts.append('<div class="card-body p-2">')
121
+
122
+ # Combine condition, message and references in one paragraph
123
+ refs_html = []
124
+ for ref_key, entry in group_entries:
125
+ bibtex = entry.get('bibtex', '')
126
+ if bibtex:
127
+ title = _extract_title_from_bibtex(bibtex)
128
+ doi = _extract_doi_from_bibtex(bibtex)
129
+ url = _extract_url_from_bibtex(bibtex)
130
+
131
+ # Create link
132
+ if doi:
133
+ link_url = f"https://doi.org/{doi}"
134
+ elif url:
135
+ link_url = url
136
+ else:
137
+ link_url = None
138
+
139
+ if link_url and title:
140
+ refs_html.append(f'(<code>{ref_key}</code>)<a href="{link_url}" target="_blank">"{title}"</a>')
141
+ elif title:
142
+ refs_html.append(f'(<code>{ref_key}</code>)"{title}"')
143
+ else:
144
+ refs_html.append(f'<code>{ref_key}</code>')
145
+ else:
146
+ refs_html.append(f'<code>{ref_key}</code>')
147
+
148
+ # Create single paragraph with condition (if exists), message, and references
149
+ html_parts.append('<p class="card-text mb-1">')
150
+ if condition:
151
+ html_parts.append(f'<strong>{condition}:</strong> ')
152
+ html_parts.append(f'<em>{message}</em>')
153
+ if refs_html:
154
+ html_parts.append(' <small class="text-muted">')
155
+ html_parts.append(' '.join(refs_html))
156
+ html_parts.append('</small>')
157
+ html_parts.append('</p>')
158
+
159
+ # Add collapsible BibTeX entries
160
+ bibtex_entries = [entry.get('bibtex', '') for _, entry in group_entries if entry.get('bibtex')]
161
+ if bibtex_entries:
162
+ html_parts.append('<details>')
163
+ html_parts.append('<summary><small>BibTeX entries</small></summary>')
164
+ html_parts.append('<pre class="mb-0"><code class="language-bibtex">')
165
+ html_parts.append('\n\n'.join(bibtex_entries))
166
+ html_parts.append('</code></pre>')
167
+ html_parts.append('</details>')
168
+
169
+ html_parts.append('</div>') # card-body
170
+ html_parts.append('</div>') # card
171
+ html_parts.append('</div>') # col
172
+
173
+ html_parts.append('</div>') # row
174
+
175
+ return ''.join(html_parts)
176
+
177
+
178
+ class CitationsListNode(nodes.Element):
179
+ """Custom node for citations list."""
180
+ pass
181
+
182
+
183
+ class CitationsListDirective(SphinxDirective):
184
+ """
185
+ Directive to display all citations from NetKet's citation system.
186
+
187
+ Example:
188
+ .. netket-citations::
189
+ :format: detailed
190
+ """
191
+
192
+ has_content = False
193
+ optional_arguments = 0
194
+ option_spec = {
195
+ 'format': str, # 'detailed' or 'simple'
196
+ }
197
+
198
+ def run(self):
199
+ node = CitationsListNode()
200
+ node['format'] = self.options.get('format', 'detailed')
201
+ return [node]
202
+
203
+
204
+ def visit_citations_list_node(self, node):
205
+ """Visit function for CitationsListNode."""
206
+ format_type = node['format']
207
+
208
+ try:
209
+ # Import NetKet to load citation registrations
210
+ import netket as nk
211
+ from netket.utils.citations import get_all_citations
212
+ import re
213
+ import uuid
214
+
215
+ if format_type == 'detailed':
216
+ citations_html = _generate_bootstrap_citations()
217
+ else:
218
+ from netket.utils.citations.docs import get_citations_for_docs
219
+ citations_html = get_citations_for_docs(format_type)
220
+
221
+ self.body.append(citations_html)
222
+
223
+ except ImportError as e:
224
+ logger.warning(f"Could not import NetKet for citations: {e}")
225
+ self.body.append('<div class="admonition warning"><p class="admonition-title">Warning</p>')
226
+ self.body.append('<p>Citations could not be loaded. NetKet import failed.</p></div>')
227
+ except Exception as e:
228
+ logger.warning(f"Error generating citations: {e}")
229
+ self.body.append('<div class="admonition error"><p class="admonition-title">Error</p>')
230
+ self.body.append(f'<p>Error generating citations: {e}</p></div>')
231
+
232
+
233
+ def depart_citations_list_node(self, node):
234
+ """Depart function for CitationsListNode."""
235
+ pass
236
+
237
+
238
+ def setup(app: Sphinx):
239
+ """Setup function for the Sphinx extension."""
240
+
241
+ # Add the custom directive
242
+ app.add_directive('netket-citations', CitationsListDirective)
243
+
244
+ # Add the custom node and its handlers
245
+ app.add_node(
246
+ CitationsListNode,
247
+ html=(visit_citations_list_node, depart_citations_list_node),
248
+ latex=(visit_citations_list_node, depart_citations_list_node),
249
+ text=(visit_citations_list_node, depart_citations_list_node),
250
+ )
251
+
252
+ return {
253
+ 'version': '1.0',
254
+ 'parallel_read_safe': True,
255
+ 'parallel_write_safe': True,
256
+ }
@@ -12,18 +12,16 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from ._version import version as __version__ # noqa: F401
16
-
17
- from .utils import config
18
-
19
- from . import utils
20
- from . import errors
21
-
22
15
  __all__ = [
16
+ "callbacks",
17
+ "errors",
23
18
  "exact",
19
+ "experimental",
24
20
  "graph",
25
- "callbacks",
26
21
  "hilbert",
22
+ "logging",
23
+ "models",
24
+ "nn",
27
25
  "operator",
28
26
  "optimizer",
29
27
  "sampler",
@@ -31,8 +29,17 @@ __all__ = [
31
29
  "utils",
32
30
  "vqs",
33
31
  "nn",
32
+ "symmetry",
33
+ "cite",
34
+ "config",
34
35
  ]
35
36
 
37
+ from ._version import version as __version__ # noqa: F401
38
+
39
+ from .utils import config
40
+
41
+ from . import utils
42
+ from . import errors
36
43
 
37
44
  from . import jax
38
45
  from . import stats
@@ -51,9 +58,21 @@ from . import (
51
58
  sampler,
52
59
  vqs,
53
60
  optimizer,
61
+ symmetry,
54
62
  )
55
63
 
64
+ from . import experimental
65
+
56
66
 
57
67
  # Main applications
58
68
  from .driver import VMC
59
69
  from .driver import SteadyState
70
+
71
+ # Citation system
72
+ from netket.utils.citations import cite
73
+
74
+ # Show tips if in interactive mode
75
+ from netket.utils._tips import show_random_tip
76
+
77
+ show_random_tip()
78
+ del show_random_tip
@@ -1,13 +1,17 @@
1
1
  from typing import Any
2
2
  from collections.abc import Callable
3
+ from warnings import warn
3
4
 
4
5
  import jax
5
6
  from jax.flatten_util import ravel_pytree
6
7
 
7
8
  from netket import jax as nkjax
9
+ from netket.hilbert import SpinOrbitalFermions
8
10
  from netket.optimizer.solver import cholesky
9
11
  from netket.vqs import MCState, FullSumState
10
12
  from netket.utils import timing, struct
13
+ from netket.utils.citations import reference
14
+ from netket.utils.deprecation import DeprecatedArg
11
15
  from netket.utils.types import ScalarOrSchedule, Optimizer, Array, PyTree
12
16
  from netket.jax._jacobian.default_mode import JacobianMode
13
17
  from netket.operator import AbstractOperator
@@ -37,22 +41,33 @@ def VMC_SRt(
37
41
  optimizer: Optimizer,
38
42
  *,
39
43
  diag_shift: ScalarOrSchedule,
40
- linear_solver_fn: Callable[[jax.Array, jax.Array], jax.Array] = cholesky,
44
+ linear_solver: Callable[[jax.Array, jax.Array], jax.Array] = cholesky,
41
45
  mode: str | None = None,
42
- jacobian_mode: str | None = None,
43
- variational_state: MCState = None,
46
+ jacobian_mode: str | None | DeprecatedArg = DeprecatedArg(),
47
+ variational_state: MCState,
48
+ linear_solver_fn: (
49
+ Callable[[jax.Array, jax.Array], jax.Array] | DeprecatedArg
50
+ ) = DeprecatedArg(),
44
51
  ):
45
- if mode is None:
46
- mode = jacobian_mode
47
- elif mode is not None and jacobian_mode is not None:
48
- raise ValueError(
49
- "`jacobian_mode` is deprecated and renamed to `mode`. Just declare `mode`."
52
+ if not isinstance(jacobian_mode, DeprecatedArg):
53
+ if mode is not None:
54
+ raise ValueError(
55
+ "`jacobian_mode` is deprecated and renamed to `mode`. Just declare `mode`."
56
+ )
57
+ warn(
58
+ """
59
+ The keyword argument `linear_solver_fn` is deprecated in favour of `linear_solver`.
60
+ """,
61
+ category=FutureWarning,
62
+ stacklevel=2,
50
63
  )
64
+ mode = jacobian_mode
51
65
 
52
66
  return VMC_SR(
53
67
  hamiltonian,
54
68
  optimizer,
55
69
  diag_shift=diag_shift,
70
+ linear_solver=linear_solver,
56
71
  linear_solver_fn=linear_solver_fn,
57
72
  mode=mode,
58
73
  variational_state=variational_state,
@@ -61,6 +76,16 @@ def VMC_SRt(
61
76
  )
62
77
 
63
78
 
79
+ @reference(
80
+ "Goldshlager2023Spring",
81
+ condition="If using VMC_SR with momentum != 0",
82
+ message="This work used the SPRING optimization algorithm described in Ref.",
83
+ )
84
+ @reference(
85
+ ["Chen2024minsr", "Rende2024minsr"],
86
+ condition="If using minSR, VMC_SR(use_ntk=True) ",
87
+ message="This work used the efficient kernel trick for SR described in Refs.",
88
+ )
64
89
  class VMC_SR(AbstractVariationalDriver):
65
90
  r"""
66
91
  Energy minimization using Variational Monte Carlo (VMC) and **Stochastic Reconfiguration/Natural Gradient Descent**.
@@ -94,7 +119,7 @@ class VMC_SR(AbstractVariationalDriver):
94
119
 
95
120
  .. code-block:: python
96
121
 
97
- linear_solver_fn(A: Matrix, b: vector) -> tuple[jax.Array[vector], dict]
122
+ linear_solver(A: Matrix, b: vector) -> tuple[jax.Array[vector], dict]
98
123
 
99
124
  Where the vector is the solution and the dictionary may contain additional information about the solver or be None.
100
125
  The standard solver is based on the Cholesky decomposition :func:`~netket.optimizer.solver.cholesky`, but any other
@@ -208,7 +233,7 @@ class VMC_SR(AbstractVariationalDriver):
208
233
  _chunk_size_bwd: int | None = struct.field(serialize=False)
209
234
  _use_ntk: bool = struct.field(serialize=False)
210
235
  _on_the_fly: bool = struct.field(serialize=False)
211
- _linear_solver_fn: Any = struct.field(serialize=False)
236
+ _linear_solver: Any = struct.field(serialize=False)
212
237
 
213
238
  # Internal things cached
214
239
  _unravel_params_fn: Any = struct.field(serialize=False)
@@ -229,8 +254,11 @@ class VMC_SR(AbstractVariationalDriver):
229
254
  diag_shift: ScalarOrSchedule,
230
255
  proj_reg: ScalarOrSchedule | None = None,
231
256
  momentum: ScalarOrSchedule | None = None,
232
- linear_solver_fn: Callable[[Array, Array], Array] = cholesky,
233
- variational_state: MCState = None,
257
+ linear_solver: Callable[[Array, Array], Array] = cholesky,
258
+ linear_solver_fn: (
259
+ Callable[[Array, Array], Array] | DeprecatedArg
260
+ ) = DeprecatedArg(),
261
+ variational_state: MCState,
234
262
  chunk_size_bwd: int | None = None,
235
263
  mode: JacobianMode | None = None,
236
264
  use_ntk: bool | None = None,
@@ -247,7 +275,7 @@ class VMC_SR(AbstractVariationalDriver):
247
275
  Args:
248
276
  hamiltonian: The Hamiltonian of which the ground-state is to be found.
249
277
  optimizer: The optimizer to use for the parameter updates. To perform proper
250
- SR/NGD optimization this should be an instance of `optax.sgd`, but can be
278
+ SR/NGD optimization this should be an instance of :func:`optax.sgd`, but can be
251
279
  any other optimizer if you are brave.
252
280
  variational_state: The variational state to optimize.
253
281
  diag_shift: The diagonal regularization parameter :math:`\lambda` for the QGT/NTK.
@@ -261,11 +289,32 @@ class VMC_SR(AbstractVariationalDriver):
261
289
  Thus the amplification is at most a factor of :math:`A(0.9)=2.3` or
262
290
  :math:`A(0.99)=7.1`. Values around ``momentum = 0.8`` empirically work well.
263
291
  (Defaults to None)
264
- linear_solver_fn: The linear solver function to use for the NGD solver.
292
+ linear_solver: The linear solver function to use for the NGD solver. Defaults to
293
+ :func:`netket.optimizer.solver.cholesky`, but can use other solvers from there. In general:
294
+
295
+ - :func:`~netket.optimizer.solver.cholesky` is faster because it relies on LU decomposition
296
+ instead of a full diagonalization, but it is more prone to numerical instabilities,
297
+ especially with explicitly simmetrized networks or very singular QGT/NTKs. Often the issue
298
+ is that your matrix is numerically not hermitian/positive semidefinite because of numerical
299
+ errors, and this breaks the method. **If you see NaNs in your weights
300
+ during your optimization, this is likely the cause.**
301
+ - :func:`~netket.optimizer.solver.pinv_smooth` (a smoothed variant of
302
+ :func:`~netket.optimizer.solver.pinv`) is considerably more stable and usually does
303
+ not cause NaNs, but it is also considerably more expensive.
304
+ - :func:`~jax.scipy.sparse.linalg.cg` and other iterative solvers can sometimes be faster, but
305
+ the quality of the solution is bad and they can lead to unpredictable step times because
306
+ the number of CG iterations might vary with the condition number. While we used those a
307
+ lot in the past, there is considerable evidence that they should be avoided (see Chen &
308
+ Heyl Nature Physics).
309
+ In general, if you are not bottlenecked by the linear solver, it is a good idea to use the
310
+ more reliable :func:`~netket.optimizer.solver.pinv_smooth`.
265
311
  mode: The mode used to compute the jacobian of the variational state.
266
- Can be `'real'` or `'complex'`. Real can be used for real-valued wavefunctions
267
- with a sign, to truncate the arbitrary phase of the wavefunction. This leads
268
- to lower computational cost.
312
+ Can be ``'real'`` or ``'complex'``. Real can be used for real-valued wavefunctions
313
+ with a sign, to truncate the arbitrary phase of the wavefunction. In complex mode, the QGT/NTK
314
+ is concretized as a real-valued :math:`2N \times 2N` where :math:`N` is either the number of
315
+ parameters or number of samples.
316
+ If your wavefunctino is real (as is usually the case for fermionic hamiltonians) you should
317
+ really set this to `real`.
269
318
  on_the_fly: Whether to compute the QGT or NTK using lazy evaluation methods.
270
319
  This usually requires less memory. (Defaults to None, which will
271
320
  automatically chose the potentially best method).
@@ -276,6 +325,17 @@ class VMC_SR(AbstractVariationalDriver):
276
325
  SR and minSR. (Defaults to None, which will automatically choose the best
277
326
  method)
278
327
  """
328
+ # TODO: Deprecated in September 2025, netket 3.20
329
+ if not isinstance(linear_solver_fn, DeprecatedArg):
330
+ warn(
331
+ """
332
+ The keyword argument `linear_solver_fn` is deprecated in favour of `linear_solver`.
333
+ """,
334
+ category=FutureWarning,
335
+ stacklevel=2,
336
+ )
337
+ linear_solver = linear_solver_fn
338
+
279
339
  if isinstance(variational_state, FullSumState):
280
340
  raise TypeError(
281
341
  "NGD drivers do not support FullSumState. Please use 'standard' drivers with SR."
@@ -294,13 +354,30 @@ class VMC_SR(AbstractVariationalDriver):
294
354
  elif on_the_fly and not use_ntk:
295
355
  raise ValueError(
296
356
  """
297
- `onthefly` is only supported when `use_ntk=True`.
357
+ `on_the_fly=True` is only supported when `use_ntk=True`.
298
358
 
299
359
  We plan to support this mode for the standard NGD in the future.
300
- In the meantime, use a standard VMC+SR QGTOnTheFly.
360
+ In the meantime, use a standard VMC+SR with QGTOnTheFly if you
361
+ really want to use `on_the_fly=True`
301
362
  """
302
363
  )
303
364
 
365
+ # for most fermionic calculations you want to use real mode, but the auto
366
+ # detect will pick complex
367
+ if mode is None and isinstance(variational_state.hilbert, SpinOrbitalFermions):
368
+ warn(
369
+ "`mode` not selected when working with Fermionic systems. Automatically falling back "
370
+ "to `mode='complex'` but for most fermionic calculations where the wave-function is real "
371
+ "valued with a sign (not a complex phase) `mode='real'` will truncate the imaginary part "
372
+ "of the QGT and lead to the same optimization but at a considerably lower cost (~8 times less)."
373
+ "\n\nIT'S LIKELY YOU WANT TO SPECIFY `mode='real'`.\n\n"
374
+ )
375
+
376
+ # Default chunk_size_bwd to the variational's state chunk size. In any case,
377
+ # it usually should be smaller than the chunk size of variational state.
378
+ if chunk_size_bwd is None:
379
+ chunk_size_bwd = variational_state.chunk_size
380
+
304
381
  self._ham = hamiltonian
305
382
 
306
383
  self.diag_shift = diag_shift
@@ -312,7 +389,7 @@ class VMC_SR(AbstractVariationalDriver):
312
389
  self.mode = mode
313
390
  self._on_the_fly = on_the_fly
314
391
 
315
- self._linear_solver_fn = linear_solver_fn
392
+ self._linear_solver = linear_solver
316
393
 
317
394
  _, unravel_params_fn = ravel_pytree(self.state.parameters)
318
395
  self._unravel_params_fn = jax.jit(unravel_params_fn)
@@ -370,7 +447,7 @@ class VMC_SR(AbstractVariationalDriver):
370
447
  self.state.model_state,
371
448
  samples,
372
449
  diag_shift=diag_shift,
373
- solver_fn=self._linear_solver_fn,
450
+ solver_fn=self._linear_solver,
374
451
  mode=self.mode,
375
452
  proj_reg=proj_reg,
376
453
  momentum=momentum,
@@ -417,9 +494,6 @@ class VMC_SR(AbstractVariationalDriver):
417
494
 
418
495
  @mode.setter
419
496
  def mode(self, mode: str | JacobianMode | None):
420
- # TODO: Add support for 'onthefly' mode
421
- # At the moment, onthefly is only supported for use_ntk=True.
422
- # We raise a warning if the user tries to use it with use_ntk=False.
423
497
  if mode is None:
424
498
  mode = nkjax.jacobian_default_mode(
425
499
  self.state._apply_fun,
@@ -444,7 +518,9 @@ class VMC_SR(AbstractVariationalDriver):
444
518
  @property
445
519
  def on_the_fly(self) -> bool:
446
520
  """
447
- Whether
521
+ Whether to use a lazy implementation of th NTK or QGT which does not concretize the jacobian.
522
+
523
+ This usually requires less memory.
448
524
  """
449
525
  return self._on_the_fly
450
526
 
@@ -469,5 +545,7 @@ class VMC_SR(AbstractVariationalDriver):
469
545
  @chunk_size_bwd.setter
470
546
  def chunk_size_bwd(self, value: int | None):
471
547
  if not isinstance(value, int | None):
472
- raise TypeError("chunk_size must be an integer or None")
548
+ raise TypeError("chunk_size must be an integer or None.")
549
+ elif isinstance(value, int) and value <= 0:
550
+ raise ValueError("chunk_size_bwd must be a positive integer.")
473
551
  self._chunk_size_bwd = value
@@ -3,11 +3,13 @@ from functools import partial
3
3
 
4
4
  import jax
5
5
  import jax.numpy as jnp
6
- from jax.sharding import PositionalSharding
6
+ from jax.sharding import NamedSharding, PartitionSpec as P
7
7
 
8
8
  from netket import jax as nkjax
9
9
  from netket.utils.types import Array
10
10
 
11
+ from netket import config
12
+
11
13
  from netket._src.ngd.kwargs import ensure_accepts_kwargs
12
14
 
13
15
 
@@ -34,12 +36,16 @@ def _compute_sr_update(
34
36
  # Typically solvers only accept the matrix and the right-hand side.
35
37
  solver_fn = ensure_accepts_kwargs(solver_fn, "dv")
36
38
 
37
- if (momentum is not None) or (old_updates is not None) or (proj_reg is not None):
38
- raise ValueError("Not implemented")
39
+ if proj_reg is not None:
40
+ raise ValueError("proj_reg not implemented for SR")
39
41
 
40
42
  # (np, #ns) x (#ns) -> (np) - where the sum over #ns is done automatically
41
43
  F = O_L.T @ dv
42
44
 
45
+ # Add momentum term to F: F + λ μ dθ_{i-1}
46
+ if momentum is not None:
47
+ F = F + diag_shift * momentum * old_updates
48
+
43
49
  # This does the contraction (np, #ns) x (#ns, np) -> (np, np).
44
50
  matrix = O_L.T @ O_L
45
51
  matrix_side = matrix.shape[-1] # * it can be ns or 2*ns, depending on mode
@@ -57,14 +63,18 @@ def _compute_sr_update(
57
63
  else:
58
64
  info = {}
59
65
 
66
+ if momentum is not None:
67
+ old_updates = updates
68
+
60
69
  # If complex mode and we have complex parameters, we need
61
70
  # To repack the real coefficients in order to get complex updates
62
71
  if mode == "complex" and nkjax.tree_leaf_iscomplex(params_structure):
63
72
  num_p = updates.shape[-1] // 2
64
73
  updates = updates[:num_p] + 1j * updates[num_p:]
65
74
 
66
- updates = jax.lax.with_sharding_constraint(
67
- updates, PositionalSharding(jax.devices()).replicate()
68
- )
75
+ if config.netket_experimental_sharding:
76
+ updates = jax.lax.with_sharding_constraint(
77
+ updates, NamedSharding(jax.sharding.get_abstract_mesh(), P())
78
+ )
69
79
 
70
80
  return updates, old_updates, info
@@ -101,7 +101,7 @@ def _sr_srt_common(
101
101
  diag_shift: The diagonal shift of the stochastic reconfiguration matrix. Typical values are 1e-4 ÷ 1e-3. Can also be an optax schedule.
102
102
  proj_reg: Weight before the matrix `1/N_samples \\bm{1} \\bm{1}^T` used to regularize the linear solver in SPRING.
103
103
  momentum: Momentum used to accumulate updates in SPRING.
104
- linear_solver_fn: Callable to solve the linear problem associated to the updates of the parameters.
104
+ linear_solver: Callable to solve the linear problem associated to the updates of the parameters.
105
105
  mode: The mode used to compute the jacobian of the variational state. Can be `'real'` or `'complex'` (defaults to the dtype of the output of the model).
106
106
 
107
107
  Returns: