NetKet 3.21.0__tar.gz → 3.22.0.dev1__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 (420) hide show
  1. {netket-3.21.0 → netket-3.22.0.dev1}/PKG-INFO +5 -5
  2. netket-3.22.0.dev1/netket/_src/callbacks/auto_chunk_size.py +220 -0
  3. netket-3.22.0.dev1/netket/_src/callbacks/auto_slurm_requeue.py +171 -0
  4. netket-3.22.0.dev1/netket/_src/callbacks/base.py +126 -0
  5. netket-3.22.0.dev1/netket/_src/callbacks/callback_list.py +52 -0
  6. netket-3.22.0.dev1/netket/_src/callbacks/legacy_wrappers.py +73 -0
  7. netket-3.22.0.dev1/netket/_src/callbacks/observables.py +48 -0
  8. netket-3.22.0.dev1/netket/_src/callbacks/progressbar.py +128 -0
  9. netket-3.22.0.dev1/netket/_src/callbacks/save_state.py +104 -0
  10. netket-3.22.0.dev1/netket/_src/callbacks/stop_at_time.py +35 -0
  11. netket-3.22.0.dev1/netket/_src/driver/abstract_dynamics_driver.py +200 -0
  12. netket-3.22.0.dev1/netket/_src/driver/abstract_optimization_driver.py +91 -0
  13. netket-3.22.0.dev1/netket/_src/driver/abstract_variational_driver.py +527 -0
  14. netket-3.21.0/netket/driver/abstract_variational_driver.py → netket-3.22.0.dev1/netket/_src/driver/abstract_variational_driver_old.py +13 -14
  15. {netket-3.21.0/netket/experimental → netket-3.22.0.dev1/netket/_src}/driver/infidelity_sr.py +15 -15
  16. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/driver/vmc_sr.py +88 -21
  17. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/ngd/srt_onthefly.py +60 -35
  18. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/nn/apply_operator/functional.py +1 -3
  19. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/nn/apply_operator/linen.py +3 -2
  20. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/nn/apply_operator/nnx.py +20 -7
  21. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/particle_number_conserving_fermionic/operators.py +46 -7
  22. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/pyscf_api.py +2 -2
  23. netket-3.22.0.dev1/netket/_src/solvers/nan_fallback.py +81 -0
  24. {netket-3.21.0/netket/driver → netket-3.22.0.dev1/netket/_src/stats/online_stats}/__init__.py +13 -7
  25. netket-3.22.0.dev1/netket/_src/stats/online_stats/accumulator.py +435 -0
  26. netket-3.22.0.dev1/netket/_src/stats/online_stats/kernels.py +190 -0
  27. netket-3.22.0.dev1/netket/_src/stats/online_stats/operations.py +195 -0
  28. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/symmetry/representation.py +0 -1
  29. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/symmetry/representation_construction.py +5 -0
  30. netket-3.22.0.dev1/netket/_src/vqs/check_mc_convergence.py +265 -0
  31. netket-3.22.0.dev1/netket/_src/vqs/expect_to_precision.py +154 -0
  32. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/vqs/fermion_mf/state.py +17 -5
  33. netket-3.22.0.dev1/netket/_src/vqs/plot_mc_convergence.py +280 -0
  34. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_version.py +2 -2
  35. {netket-3.21.0 → netket-3.22.0.dev1}/netket/callbacks/__init__.py +16 -4
  36. netket-3.22.0.dev1/netket/driver/__init__.py +55 -0
  37. {netket-3.21.0 → netket-3.22.0.dev1}/netket/driver/steady_state.py +21 -11
  38. {netket-3.21.0 → netket-3.22.0.dev1}/netket/driver/vmc.py +20 -9
  39. {netket-3.21.0 → netket-3.22.0.dev1}/netket/errors.py +209 -9
  40. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/__init__.py +0 -2
  41. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/driver/__init__.py +7 -1
  42. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/driver/tdvp_common.py +4 -4
  43. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/_rk/_tableau.py +48 -9
  44. {netket-3.21.0/netket/stats → netket-3.22.0.dev1/netket/experimental/hilbert}/__init__.py +9 -4
  45. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/logging/hdf5_log.py +4 -1
  46. netket-3.22.0.dev1/netket/experimental/models/__init__.py +16 -0
  47. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/variance/expect.py +26 -6
  48. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/operator/__init__.py +9 -18
  49. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/qsr/driver.py +60 -26
  50. {netket-3.21.0 → netket-3.22.0.dev1}/netket/graph/abstract_graph.py +5 -2
  51. {netket-3.21.0 → netket-3.22.0.dev1}/netket/graph/lattice.py +20 -0
  52. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/constraint/multiple.py +7 -0
  53. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/doubled_hilbert.py +7 -0
  54. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/homogeneous.py +6 -32
  55. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/random/base.py +3 -3
  56. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/spin_orbital_fermions.py +3 -1
  57. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/__init__.py +3 -1
  58. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_jacobian/logic.py +10 -5
  59. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_scanmap.py +7 -3
  60. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_sort.py +3 -2
  61. netket-3.22.0.dev1/netket/jax/lax.py +27 -0
  62. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/sharding/fixed_sharding_decorator.py +4 -1
  63. {netket-3.21.0 → netket-3.22.0.dev1}/netket/logging/__init__.py +9 -5
  64. {netket-3.21.0 → netket-3.22.0.dev1}/netket/logging/json_log.py +11 -3
  65. {netket-3.21.0 → netket-3.22.0.dev1}/netket/logging/runtime_log.py +42 -0
  66. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/__init__.py +4 -0
  67. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_continuous_operator.py +1 -1
  68. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_discrete_operator.py +5 -1
  69. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_discrete_operator_jax.py +2 -1
  70. netket-3.22.0.dev1/netket/operator/_embed/__init__.py +19 -0
  71. netket-3.22.0.dev1/netket/operator/_embed/base.py +210 -0
  72. netket-3.22.0.dev1/netket/operator/_embed/discrete_jax_operator.py +182 -0
  73. netket-3.22.0.dev1/netket/operator/_embed/discrete_operator.py +98 -0
  74. netket-3.22.0.dev1/netket/operator/_embed/operator.py +39 -0
  75. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_fermion2nd/jax.py +4 -0
  76. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_kinetic.py +2 -2
  77. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_pauli_strings/jax.py +12 -5
  78. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_prod/discrete_jax_operator.py +13 -0
  79. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_prod/discrete_operator.py +5 -0
  80. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_sum/base.py +5 -1
  81. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_sum/discrete_jax_operator.py +14 -4
  82. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_sum/discrete_operator.py +2 -0
  83. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/qgt_onthefly_logic.py +6 -4
  84. netket-3.22.0.dev1/netket/optimizer/solver/__init__.py +12 -0
  85. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/solver/solvers.py +76 -5
  86. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/metropolis.py +3 -3
  87. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/parallel_tempering.py +2 -2
  88. netket-3.22.0.dev1/netket/stats/__init__.py +58 -0
  89. {netket-3.21.0 → netket-3.22.0.dev1}/netket/stats/mc_stats.py +7 -10
  90. {netket-3.21.0 → netket-3.22.0.dev1}/netket/stats/mc_stats_old.py +8 -11
  91. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/_dependencies_check.py +2 -2
  92. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/_tips.py +1 -0
  93. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/api_utils.py +2 -1
  94. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/history/history.py +3 -1
  95. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/history/history_dict.py +24 -0
  96. netket-3.22.0.dev1/netket/utils/iterators.py +34 -0
  97. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/model_frameworks/nnx.py +4 -10
  98. netket-3.22.0.dev1/netket/utils/model_frameworks/nnx_wrapped.py +41 -0
  99. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/numbers.py +2 -1
  100. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/common.py +8 -1
  101. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/kernels.py +19 -16
  102. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_state/expect.py +2 -6
  103. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_state/expect_chunked.py +8 -7
  104. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_state/state.py +136 -0
  105. {netket-3.21.0 → netket-3.22.0.dev1}/pyproject.toml +5 -5
  106. netket-3.21.0/netket/experimental/hilbert/__init__.py +0 -38
  107. netket-3.21.0/netket/experimental/models/__init__.py +0 -38
  108. netket-3.21.0/netket/experimental/operator/fermion.py +0 -44
  109. netket-3.21.0/netket/experimental/sampler/__init__.py +0 -39
  110. netket-3.21.0/netket/experimental/sampler/rules/__init__.py +0 -17
  111. netket-3.21.0/netket/optimizer/solver/__init__.py +0 -5
  112. netket-3.21.0/netket/utils/iterators.py +0 -6
  113. netket-3.21.0/netket/utils/model_frameworks/nnx_wrapped.py +0 -55
  114. {netket-3.21.0 → netket-3.22.0.dev1}/.gitignore +0 -0
  115. {netket-3.21.0 → netket-3.22.0.dev1}/LICENSE +0 -0
  116. {netket-3.21.0 → netket-3.22.0.dev1}/README.md +0 -0
  117. {netket-3.21.0 → netket-3.22.0.dev1}/docs/sphinx_extensions/netket_citations.py +0 -0
  118. {netket-3.21.0 → netket-3.22.0.dev1}/netket/__init__.py +0 -0
  119. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/ngd/kwargs.py +0 -0
  120. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/ngd/sr.py +0 -0
  121. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/ngd/sr_srt_common.py +0 -0
  122. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/ngd/srt.py +0 -0
  123. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/normal_order_utils.py +0 -0
  124. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/particle_number_conserving_fermionic/conversion.py +0 -0
  125. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/particle_number_conserving_fermionic/fermihubbard.py +0 -0
  126. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/particle_number_conserving_fermionic/kernels.py +0 -0
  127. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/particle_number_conserving_fermionic/operator_data.py +0 -0
  128. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/permutation/base.py +0 -0
  129. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/permutation/construct.py +0 -0
  130. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/permutation/fermion.py +0 -0
  131. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/permutation/spin.py +0 -0
  132. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/permutation/trace_utils.py +0 -0
  133. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/operator/pyscf_utils.py +0 -0
  134. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/symmetry/canonical_representation.py +0 -0
  135. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/vqs/fermion_mf/__init__.py +0 -0
  136. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/vqs/fermion_mf/expectation.py +0 -0
  137. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/vqs/fermion_mf/qgt.py +0 -0
  138. {netket-3.21.0 → netket-3.22.0.dev1}/netket/_src/vqs/transformed_vstate.py +0 -0
  139. {netket-3.21.0 → netket-3.22.0.dev1}/netket/callbacks/convergence_stopping.py +0 -0
  140. {netket-3.21.0 → netket-3.22.0.dev1}/netket/callbacks/early_stopping.py +0 -0
  141. {netket-3.21.0 → netket-3.22.0.dev1}/netket/callbacks/invalid_loss_stopping.py +0 -0
  142. {netket-3.21.0 → netket-3.22.0.dev1}/netket/callbacks/timeout.py +0 -0
  143. {netket-3.21.0 → netket-3.22.0.dev1}/netket/exact.py +0 -0
  144. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/driver/tdvp.py +0 -0
  145. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/driver/tdvp_schmitt.py +0 -0
  146. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/__init__.py +0 -0
  147. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/_integrator.py +0 -0
  148. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/_integrator_params.py +0 -0
  149. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/_integrator_state.py +0 -0
  150. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/_rk/__init__.py +0 -0
  151. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/_rk/_solver.py +0 -0
  152. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/_solver.py +0 -0
  153. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/dynamics/_utils.py +0 -0
  154. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/geometry/__init__.py +0 -0
  155. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/geometry/cell.py +0 -0
  156. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/hilbert/continuous_hilbert.py +0 -0
  157. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/hilbert/particle.py +0 -0
  158. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/hilbert/random/__init__.py +0 -0
  159. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/hilbert/random/particle.py +0 -0
  160. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/logging/__init__.py +0 -0
  161. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/models/fast_rnn.py +0 -0
  162. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/models/rnn.py +0 -0
  163. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/nn/__init__.py +0 -0
  164. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/nn/rnn/__init__.py +0 -0
  165. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/nn/rnn/cells.py +0 -0
  166. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/nn/rnn/layers.py +0 -0
  167. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/nn/rnn/layers_fast.py +0 -0
  168. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/nn/rnn/ordering.py +0 -0
  169. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/__init__.py +0 -0
  170. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/infidelity/__init__.py +0 -0
  171. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/infidelity/exact.py +0 -0
  172. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/infidelity/expect.py +0 -0
  173. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/infidelity/infidelity_operator.py +0 -0
  174. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/renyi2/S2_operator.py +0 -0
  175. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/renyi2/__init__.py +0 -0
  176. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/renyi2/exact.py +0 -0
  177. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/renyi2/expect.py +0 -0
  178. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/variance/__init__.py +0 -0
  179. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/variance/exact.py +0 -0
  180. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/observable/variance/variance_operator.py +0 -0
  181. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/operator/pyscf.py +0 -0
  182. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/qsr/__init__.py +0 -0
  183. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/qsr/dataset.py +0 -0
  184. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/qsr/logic_helpers.py +0 -0
  185. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/vqs/__init__.py +0 -0
  186. {netket-3.21.0 → netket-3.22.0.dev1}/netket/experimental/vqs/io.py +0 -0
  187. {netket-3.21.0 → netket-3.22.0.dev1}/netket/graph/__init__.py +0 -0
  188. {netket-3.21.0 → netket-3.22.0.dev1}/netket/graph/_lattice_draw.py +0 -0
  189. {netket-3.21.0 → netket-3.22.0.dev1}/netket/graph/_lattice_edge_logic.py +0 -0
  190. {netket-3.21.0 → netket-3.22.0.dev1}/netket/graph/common_lattices.py +0 -0
  191. {netket-3.21.0 → netket-3.22.0.dev1}/netket/graph/graph.py +0 -0
  192. {netket-3.21.0 → netket-3.22.0.dev1}/netket/graph/space_group.py +0 -0
  193. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/__init__.py +0 -0
  194. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/abstract_hilbert.py +0 -0
  195. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/constraint/__init__.py +0 -0
  196. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/constraint/base.py +0 -0
  197. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/constraint/sum.py +0 -0
  198. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/constraint/sum_partition.py +0 -0
  199. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/discrete_hilbert.py +0 -0
  200. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/fock.py +0 -0
  201. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/index/__init__.py +0 -0
  202. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/index/base.py +0 -0
  203. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/index/constrained_generic.py +0 -0
  204. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/index/constrained_sum.py +0 -0
  205. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/index/constrained_sum_partitions.py +0 -0
  206. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/index/unconstrained.py +0 -0
  207. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/index/uniform_tensor.py +0 -0
  208. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/qubit.py +0 -0
  209. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/random/__init__.py +0 -0
  210. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/random/doubled.py +0 -0
  211. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/random/fock.py +0 -0
  212. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/random/homogeneous.py +0 -0
  213. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/random/qubit.py +0 -0
  214. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/random/tensor_hilbert.py +0 -0
  215. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/spin.py +0 -0
  216. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/tensor_hilbert.py +0 -0
  217. {netket-3.21.0 → netket-3.22.0.dev1}/netket/hilbert/tensor_hilbert_discrete.py +0 -0
  218. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_chunk_utils.py +0 -0
  219. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_expect.py +0 -0
  220. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_grad.py +0 -0
  221. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_jacobian/__init__.py +0 -0
  222. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_jacobian/default_mode.py +0 -0
  223. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_jacobian/jacobian_dense.py +0 -0
  224. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_jacobian/jacobian_pytree.py +0 -0
  225. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_math.py +0 -0
  226. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_ntk/__init__.py +0 -0
  227. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_ntk/logic.py +0 -0
  228. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_ntk/utils.py +0 -0
  229. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_sparse.py +0 -0
  230. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_utils_dtype.py +0 -0
  231. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_utils_random.py +0 -0
  232. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_utils_tree.py +0 -0
  233. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_vjp.py +0 -0
  234. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_vjp_chunked.py +0 -0
  235. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/_vmap_chunked.py +0 -0
  236. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/sharding/__init__.py +0 -0
  237. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/sharding/debug.py +0 -0
  238. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/sharding/fixed_sharding_utils.py +0 -0
  239. {netket-3.21.0 → netket-3.22.0.dev1}/netket/jax/sharding/flexible_sharding.py +0 -0
  240. {netket-3.21.0 → netket-3.22.0.dev1}/netket/logging/base.py +0 -0
  241. {netket-3.21.0 → netket-3.22.0.dev1}/netket/logging/state_log.py +0 -0
  242. {netket-3.21.0 → netket-3.22.0.dev1}/netket/logging/tensorboard.py +0 -0
  243. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/README.md +0 -0
  244. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/__init__.py +0 -0
  245. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/autoreg.py +0 -0
  246. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/deepset.py +0 -0
  247. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/equivariant.py +0 -0
  248. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/fast_autoreg.py +0 -0
  249. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/full_space.py +0 -0
  250. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/gaussian.py +0 -0
  251. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/jastrow.py +0 -0
  252. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/mlp.py +0 -0
  253. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/ndm.py +0 -0
  254. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/rbm.py +0 -0
  255. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/slater.py +0 -0
  256. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/tensor_networks/__init__.py +0 -0
  257. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/tensor_networks/mpdo.py +0 -0
  258. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/tensor_networks/mps.py +0 -0
  259. {netket-3.21.0 → netket-3.22.0.dev1}/netket/models/utils.py +0 -0
  260. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/__init__.py +0 -0
  261. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/activation.py +0 -0
  262. /netket-3.21.0/netket/nn/apply_operator/__init__.py → /netket-3.22.0.dev1/netket/nn/apply_operator.py +0 -0
  263. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/blocks/__init__.py +0 -0
  264. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/blocks/deepset.py +0 -0
  265. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/blocks/mlp.py +0 -0
  266. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/blocks/symmetry_sum.py +0 -0
  267. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/fast_masked_linear.py +0 -0
  268. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/masked_linear.py +0 -0
  269. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/symmetric_linear.py +0 -0
  270. {netket-3.21.0 → netket-3.22.0.dev1}/netket/nn/utils.py +0 -0
  271. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_abstract_observable.py +0 -0
  272. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_abstract_operator.py +0 -0
  273. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_abstract_super_operator.py +0 -0
  274. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_bose_hubbard/__init__.py +0 -0
  275. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_bose_hubbard/base.py +0 -0
  276. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_bose_hubbard/jax.py +0 -0
  277. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_bose_hubbard/numba.py +0 -0
  278. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_fermion2nd/__init__.py +0 -0
  279. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_fermion2nd/base.py +0 -0
  280. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_fermion2nd/numba.py +0 -0
  281. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_fermion2nd/utils.py +0 -0
  282. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_graph_operator.py +0 -0
  283. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_hamiltonian.py +0 -0
  284. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_heisenberg.py +0 -0
  285. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_ising/__init__.py +0 -0
  286. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_ising/base.py +0 -0
  287. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_ising/jax.py +0 -0
  288. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_ising/numba.py +0 -0
  289. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_lazy.py +0 -0
  290. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_local_liouvillian.py +0 -0
  291. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_local_operator/__init__.py +0 -0
  292. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_local_operator/base.py +0 -0
  293. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_local_operator/compile_helpers.py +0 -0
  294. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_local_operator/convert.py +0 -0
  295. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_local_operator/helpers.py +0 -0
  296. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_local_operator/jax.py +0 -0
  297. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_local_operator/numba.py +0 -0
  298. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_pauli_strings/__init__.py +0 -0
  299. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_pauli_strings/base.py +0 -0
  300. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_pauli_strings/numba.py +0 -0
  301. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_potential.py +0 -0
  302. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_prod/__init__.py +0 -0
  303. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_prod/base.py +0 -0
  304. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_prod/operator.py +0 -0
  305. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_sum/__init__.py +0 -0
  306. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_sum/continuous.py +0 -0
  307. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/_sum/operator.py +0 -0
  308. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/boson.py +0 -0
  309. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/fermion.py +0 -0
  310. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/permutation.py +0 -0
  311. {netket-3.21.0 → netket-3.22.0.dev1}/netket/operator/spin.py +0 -0
  312. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/__init__.py +0 -0
  313. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/linear_operator.py +0 -0
  314. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/preconditioner.py +0 -0
  315. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/__init__.py +0 -0
  316. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/common.py +0 -0
  317. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/default.py +0 -0
  318. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/qgt_jacobian.py +0 -0
  319. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/qgt_jacobian_common.py +0 -0
  320. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/qgt_jacobian_dense.py +0 -0
  321. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/qgt_jacobian_pytree.py +0 -0
  322. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/qgt/qgt_onthefly.py +0 -0
  323. {netket-3.21.0 → netket-3.22.0.dev1}/netket/optimizer/sr.py +0 -0
  324. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/__init__.py +0 -0
  325. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/autoreg.py +0 -0
  326. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/base.py +0 -0
  327. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/exact.py +0 -0
  328. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/metropolis_numpy.py +0 -0
  329. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/__init__.py +0 -0
  330. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/base.py +0 -0
  331. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/continuous_gaussian.py +0 -0
  332. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/custom_numpy.py +0 -0
  333. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/exchange.py +0 -0
  334. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/fermion_2nd.py +0 -0
  335. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/fixed.py +0 -0
  336. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/global_flip_rule.py +0 -0
  337. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/hamiltonian.py +0 -0
  338. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/hamiltonian_numpy.py +0 -0
  339. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/langevin.py +0 -0
  340. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/local.py +0 -0
  341. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/local_numpy.py +0 -0
  342. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/multiple.py +0 -0
  343. {netket-3.21.0 → netket-3.22.0.dev1}/netket/sampler/rules/tensor.py +0 -0
  344. {netket-3.21.0 → netket-3.22.0.dev1}/netket/stats/_autocorr.py +0 -0
  345. {netket-3.21.0 → netket-3.22.0.dev1}/netket/stats/mpi_stats.py +0 -0
  346. {netket-3.21.0 → netket-3.22.0.dev1}/netket/symmetry/__init__.py +0 -0
  347. {netket-3.21.0 → netket-3.22.0.dev1}/netket/symmetry/group/__init__.py +0 -0
  348. {netket-3.21.0 → netket-3.22.0.dev1}/netket/tools/__init__.py +0 -0
  349. {netket-3.21.0 → netket-3.22.0.dev1}/netket/tools/_common.py +0 -0
  350. {netket-3.21.0 → netket-3.22.0.dev1}/netket/tools/_cpu_info.py +0 -0
  351. {netket-3.21.0 → netket-3.22.0.dev1}/netket/tools/check_mpi.py +0 -0
  352. {netket-3.21.0 → netket-3.22.0.dev1}/netket/tools/djaxrun.py +0 -0
  353. {netket-3.21.0 → netket-3.22.0.dev1}/netket/tools/info.py +0 -0
  354. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/__init__.py +0 -0
  355. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/_serialization.py +0 -0
  356. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/array.py +0 -0
  357. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/citations/__init__.py +0 -0
  358. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/citations/cli.py +0 -0
  359. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/citations/core.py +0 -0
  360. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/citations/docs.py +0 -0
  361. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/citations/internal_citations.bib +0 -0
  362. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/config_flags.py +0 -0
  363. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/deprecation.py +0 -0
  364. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/dispatch.py +0 -0
  365. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/display/__init__.py +0 -0
  366. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/display/repr.py +0 -0
  367. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/float.py +0 -0
  368. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/__init__.py +0 -0
  369. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/_group.py +0 -0
  370. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/_permutation_group.py +0 -0
  371. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/_point_group.py +0 -0
  372. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/_semigroup.py +0 -0
  373. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/axial.py +0 -0
  374. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/cubic.py +0 -0
  375. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/icosa.py +0 -0
  376. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/group/planar.py +0 -0
  377. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/history/__init__.py +0 -0
  378. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/history/accum.py +0 -0
  379. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/holomorphic.py +0 -0
  380. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/jax.py +0 -0
  381. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/model_frameworks/__init__.py +0 -0
  382. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/model_frameworks/base.py +0 -0
  383. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/model_frameworks/equinox.py +0 -0
  384. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/model_frameworks/flax.py +0 -0
  385. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/model_frameworks/haiku.py +0 -0
  386. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/model_frameworks/jax.py +0 -0
  387. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/moduletools.py +0 -0
  388. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/mpi/__init__.py +0 -0
  389. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/mpi/mpi.py +0 -0
  390. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/mpi/primitives.py +0 -0
  391. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/optional_deps.py +0 -0
  392. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/partial.py +0 -0
  393. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/seed.py +0 -0
  394. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/static_number.py +0 -0
  395. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/static_range.py +0 -0
  396. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/struct/__init__.py +0 -0
  397. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/struct/dataclass.py +0 -0
  398. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/struct/fields.py +0 -0
  399. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/struct/pytree.py +0 -0
  400. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/struct/pytree_serialization_sharding.py +0 -0
  401. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/struct/utils.py +0 -0
  402. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/summation.py +0 -0
  403. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/timing.py +0 -0
  404. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/types.py +0 -0
  405. {netket-3.21.0 → netket-3.22.0.dev1}/netket/utils/version_check.py +0 -0
  406. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/__init__.py +0 -0
  407. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/base.py +0 -0
  408. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/full_summ/__init__.py +0 -0
  409. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/full_summ/expect.py +0 -0
  410. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/full_summ/state.py +0 -0
  411. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/__init__.py +0 -0
  412. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_mixed_state/__init__.py +0 -0
  413. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_mixed_state/expect.py +0 -0
  414. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_mixed_state/expect_chunked.py +0 -0
  415. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_mixed_state/state.py +0 -0
  416. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_state/__init__.py +0 -0
  417. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_state/expect_forces.py +0 -0
  418. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_state/expect_forces_chunked.py +0 -0
  419. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_state/expect_grad.py +0 -0
  420. {netket-3.21.0 → netket-3.22.0.dev1}/netket/vqs/mc/mc_state/expect_grad_chunked.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: NetKet
3
- Version: 3.21.0
3
+ Version: 3.22.0.dev1
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/#
@@ -20,7 +20,7 @@ Classifier: Topic :: Scientific/Engineering :: Physics
20
20
  Requires-Python: >=3.11
21
21
  Requires-Dist: einops>=0.8.1
22
22
  Requires-Dist: equinox>=0.11.3
23
- Requires-Dist: flax>=0.10.2
23
+ Requires-Dist: flax>=0.10.6
24
24
  Requires-Dist: igraph>=0.10.0
25
25
  Requires-Dist: jax>=0.7.0
26
26
  Requires-Dist: numba>=0.59
@@ -50,14 +50,14 @@ 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'
53
- Requires-Dist: myst-nb<1.4,>=1.0; extra == 'docs'
54
- Requires-Dist: myst-parser<4.1.0,>=2.0.0; extra == 'docs'
53
+ Requires-Dist: myst-nb<1.5,>=1.0; extra == 'docs'
54
+ Requires-Dist: myst-parser<5.1.0,>=2.0.0; extra == 'docs'
55
55
  Requires-Dist: nbconvert>=7.16.6; extra == 'docs'
56
56
  Requires-Dist: sphinx-autodoc-typehints<4.0,>=1.22; extra == 'docs'
57
57
  Requires-Dist: sphinx-book-theme~=1.1.0; extra == 'docs'
58
58
  Requires-Dist: sphinx-copybutton>=0.5.2; extra == 'docs'
59
59
  Requires-Dist: sphinx-design>=0.4.0; extra == 'docs'
60
- Requires-Dist: sphinx<9.1.0,>=8.2.3; extra == 'docs'
60
+ Requires-Dist: sphinx<9.2.0,>=8.2.3; extra == 'docs'
61
61
  Requires-Dist: sphinxcontrib-fulltoc~=1.2.0; extra == 'docs'
62
62
  Requires-Dist: sphinxcontrib-jsmath~=1.0.1; extra == 'docs'
63
63
  Provides-Extra: extra
@@ -0,0 +1,220 @@
1
+ import jax
2
+ from jax.errors import JaxRuntimeError
3
+
4
+ from netket.utils import struct, timing, dispatch
5
+
6
+ from netket._src.callbacks.base import AbstractCallback
7
+
8
+
9
+ @dispatch.dispatch
10
+ def get_forward_operator(driver):
11
+ """
12
+ Returns an operator whose expectation value computes the forward
13
+ pass for the driver.
14
+
15
+ This is a dispatch function: register new overloads with
16
+ ``@get_forward_operator.dispatch`` for custom driver types.
17
+
18
+ Example:
19
+ class VMC(AbstractVariationalDriver):
20
+ ...
21
+
22
+ @get_forward_operator.dispatch
23
+ def _get_forward_operator_vmc(driver: VMC):
24
+ return driver.hamiltonian
25
+ """
26
+ raise NotImplementedError(
27
+ f"get_forward_operator not implemented for {type(driver)}"
28
+ )
29
+
30
+
31
+ class AutoChunkSize(AbstractCallback):
32
+ """
33
+ Automatically tunes the chunk size for the (i) sampler, (ii) forward pass and
34
+ (iii) backward pass of a driver and a variational state in order to avoid OOM errors.
35
+
36
+ This callback is useful when the optimal chunk size is not known in advance,
37
+ and the user wants to avoid manually tuning it.
38
+
39
+ The callback will try to run the sampler, forward pass and backward pass with
40
+ decreasing chunk sizes until it finds one that fits in memory. The chunk size
41
+ is halved on each failure, down to ``minimum_chunk_size``.
42
+
43
+ After the largest chunk size that works is found, the callback will print those
44
+ values and store them in the callback object. If you reuse the same callback object
45
+ in a subsequent run, it will reuse the same chunk sizes.
46
+
47
+ .. rubric:: Supporting custom drivers
48
+
49
+ To tune the forward pass, the callback needs to know which operator to use to
50
+ estimate the loss. This is determined by the :func:`get_forward_operator`
51
+ dispatch function, which is already registered for the built-in drivers
52
+ (:class:`~netket.driver.VMC`, :class:`~netket.driver.VMC_SR`,
53
+ :class:`~netket.driver.Infidelity_SR`).
54
+
55
+ If you implement a custom driver, you must register a new overload so that
56
+ ``AutoChunkSize`` knows how to probe the forward pass:
57
+
58
+ .. code-block:: python
59
+
60
+ from netket._src.callbacks.auto_chunk_size import get_forward_operator
61
+
62
+ class MyDriver(AbstractVariationalDriver):
63
+ def __init__(self, hamiltonian, ...):
64
+ self._ham = hamiltonian
65
+ ...
66
+
67
+ @get_forward_operator.dispatch
68
+ def _(driver: MyDriver):
69
+ return driver._ham
70
+
71
+ The overload should return an operator whose expectation value exercises the
72
+ same forward-pass code path as the actual optimisation step. The registration
73
+ is best placed at the bottom of the file that defines the driver class, so
74
+ it takes effect as soon as the driver is imported.
75
+ """
76
+
77
+ minimum_chunk_size: int = struct.field(pytree_node=False, serialize=False)
78
+ sampler_chunk_size: int | None = struct.field(pytree_node=False, serialize=False)
79
+ chunk_size: int | None = struct.field(pytree_node=False, serialize=False)
80
+ chunk_size_bwd: int | None = struct.field(pytree_node=False, serialize=False)
81
+
82
+ def __init__(
83
+ self,
84
+ sampler_chunk_size: int | None = None,
85
+ chunk_size: int | None = None,
86
+ chunk_size_bwd: int | None = None,
87
+ minimum_chunk_size: int = 1,
88
+ ):
89
+ """
90
+ Initialize the callback.
91
+
92
+ Args:
93
+ sampler_chunk_size: The initial chunk size to use for the sampler (default: None).
94
+ If None, the callback will try to find a chunk size that works starting from
95
+ the number of chains per rank.
96
+ chunk_size: The initial chunk size to use for the forward pass (default: None).
97
+ If None, the callback will try to find a chunk size that works starting from
98
+ the number of samples.
99
+ chunk_size_bwd: The initial chunk size to use for the backward pass (default: None).
100
+ If None, the callback will try to find a chunk size that works starting from
101
+ the number of samples.
102
+ minimum_chunk_size: The minimum chunk size to use (default: 1). If the chunk size
103
+ is decreased to this value and it still fails, the callback will raise an error.
104
+ """
105
+ self.sampler_chunk_size = sampler_chunk_size
106
+ self.chunk_size = chunk_size
107
+ self.chunk_size_bwd = chunk_size_bwd
108
+
109
+ self.minimum_chunk_size = minimum_chunk_size
110
+
111
+ def on_run_start(self, step, driver):
112
+ if jax.process_index() == 0:
113
+ print("Automatically tuning chunk size....")
114
+
115
+ # Try to check if sampling works
116
+ set_sampler_chunk_size = False
117
+ sampler_chunk_size = None
118
+
119
+ if hasattr(driver.state, "sampler"):
120
+ if hasattr(driver.state.sampler, "chunk_size"):
121
+ if self.sampler_chunk_size is not None:
122
+ sampler_chunk_size = self.sampler_chunk_size
123
+ driver.state.sampler = driver.state.sampler.replace(
124
+ chunk_size=self.sampler_chunk_size
125
+ )
126
+ while True:
127
+ try:
128
+ with timing.timed_scope(force=True) as timer:
129
+ timer.block_until_ready(driver.state.samples)
130
+ except JaxRuntimeError:
131
+ set_sampler_chunk_size = True
132
+ sampler_chunk_size = driver.state.sampler.chunk_size
133
+ if sampler_chunk_size is None:
134
+ sampler_chunk_size = driver.state.sampler.n_chains_per_rank
135
+
136
+ print(
137
+ f"- Sampling failed with {sampler_chunk_size = }, trying with {sampler_chunk_size // 2 }"
138
+ )
139
+ sampler_chunk_size = sampler_chunk_size // 2
140
+ if sampler_chunk_size < self.minimum_chunk_size:
141
+ raise ValueError("Sampling failed with minimum chunk size")
142
+ driver.state.sampler = driver.state.sampler.replace(
143
+ chunk_size=sampler_chunk_size
144
+ )
145
+ else:
146
+ print(f"- Sampling succeeded with {sampler_chunk_size = }")
147
+ break
148
+ self.sampler_chunk_size = sampler_chunk_size
149
+ # Try to check if forward pass works
150
+ set_vstate_chunk_size = False
151
+ vstate_chunk_size = None
152
+ if hasattr(driver.state, "chunk_size"):
153
+ operator = get_forward_operator(driver)
154
+ if self.chunk_size is not None:
155
+ vstate_chunk_size = self.chunk_size
156
+ driver.state.chunk_size = self.chunk_size
157
+ while True:
158
+ try:
159
+ with timing.timed_scope(force=True) as timer:
160
+ timer.block_until_ready(driver.estimate(operator))
161
+
162
+ except JaxRuntimeError:
163
+ set_vstate_chunk_size = True
164
+ vstate_chunk_size = driver.state.chunk_size
165
+ if vstate_chunk_size is None:
166
+ vstate_chunk_size = driver.state.n_samples
167
+
168
+ print(
169
+ f"- Forward pass failed with {vstate_chunk_size = }, trying with {vstate_chunk_size // 2 }"
170
+ )
171
+ vstate_chunk_size = vstate_chunk_size // 2
172
+ if vstate_chunk_size < self.minimum_chunk_size:
173
+ raise ValueError("Forward pass failed with minimum chunk size")
174
+
175
+ driver.state.chunk_size = vstate_chunk_size
176
+ else:
177
+ print(f"- Forward pass succeeded with {vstate_chunk_size = }")
178
+ break
179
+ self.chunk_size = vstate_chunk_size
180
+ # backward
181
+ set_bwd_chunk_size = False
182
+ chunk_size_bwd = None
183
+ if hasattr(driver, "chunk_size_bwd"):
184
+ driver.reset_step()
185
+ if self.chunk_size_bwd is not None:
186
+ chunk_size_bwd = self.chunk_size_bwd
187
+ driver.chunk_size_bwd = self.chunk_size_bwd
188
+
189
+ while True:
190
+ try:
191
+ with timing.timed_scope(force=True) as timer:
192
+ timer.block_until_ready(driver.compute_loss_and_update())
193
+
194
+ except JaxRuntimeError:
195
+ set_bwd_chunk_size = True
196
+ chunk_size_bwd = driver.chunk_size_bwd
197
+ if chunk_size_bwd is None:
198
+ chunk_size_bwd = driver.state.n_samples
199
+
200
+ print(
201
+ f"- Optimisation step failed with {chunk_size_bwd = }, trying with {chunk_size_bwd // 2 }"
202
+ )
203
+ chunk_size_bwd = chunk_size_bwd // 2
204
+ if chunk_size_bwd < self.minimum_chunk_size:
205
+ raise ValueError(
206
+ "Optimisation pass failed with minimum chunk size"
207
+ )
208
+ driver.chunk_size_bwd = chunk_size_bwd
209
+ else:
210
+ print(f"- Optimisation step succeeded with {chunk_size_bwd = }")
211
+ break
212
+ self.chunk_size_bwd = chunk_size_bwd
213
+
214
+ print("Chunk size tuning complete:")
215
+ if set_sampler_chunk_size:
216
+ print(f" {sampler_chunk_size = }")
217
+ if set_vstate_chunk_size:
218
+ print(f" {vstate_chunk_size = }")
219
+ if set_bwd_chunk_size:
220
+ print(f" {chunk_size_bwd = }")
@@ -0,0 +1,171 @@
1
+ import subprocess
2
+ import os
3
+ from datetime import timedelta, datetime
4
+
5
+ import jax
6
+
7
+ from netket.utils import struct
8
+
9
+ from netket._src.callbacks.base import AbstractCallback
10
+
11
+
12
+ def get_time_left(job_id):
13
+ """Queries the remaining time for the current Slurm job using the SLURM_JOB_ID environment variable."""
14
+ # Retrieve the job ID from the environment variable
15
+ try:
16
+ # Run the squeue command to fetch the remaining time
17
+ result = subprocess.run(
18
+ ["squeue", "-h", "-j", str(job_id), "-O", "TimeLeft"],
19
+ capture_output=True,
20
+ text=True,
21
+ check=True,
22
+ )
23
+ # Extract the time left from the command's output
24
+ time_left_str = result.stdout.strip()
25
+ if not time_left_str or time_left_str == "UNLIMITED":
26
+ # print(f"Job {job_id} has unlimited or no time limit.")
27
+ return None
28
+
29
+ # Parse the time left dynamically
30
+ if "-" in time_left_str:
31
+ days, time_str = time_left_str.split("-")
32
+ days = int(days)
33
+ else:
34
+ days = 0
35
+ time_str = time_left_str
36
+
37
+ # Split the time string and pad missing fields with zeros
38
+ time_parts = list(map(int, time_str.split(":")))
39
+ while len(time_parts) < 3: # Ensure [hours, minutes, seconds]
40
+ time_parts.insert(0, 0)
41
+
42
+ hours, minutes, seconds = time_parts
43
+
44
+ # Calculate total seconds and convert to timedelta
45
+ total_seconds = days * 86400 + hours * 3600 + minutes * 60 + seconds
46
+ return timedelta(seconds=total_seconds)
47
+
48
+ except subprocess.TimeoutExpired:
49
+ print("squeue command timed out.")
50
+ except subprocess.CalledProcessError as e:
51
+ print(f"Error querying squeue: {e}")
52
+ except ValueError as e:
53
+ print(f"Error parsing time left: {e}")
54
+
55
+ return None
56
+
57
+
58
+ def is_requeueable(jobid):
59
+ """
60
+ Check if a Slurm job is requeueable.
61
+
62
+ Args:
63
+ jobid (str): The job ID to check.
64
+
65
+ Returns:
66
+ bool: True if the job is requeueable, False otherwise.
67
+ """
68
+ try:
69
+ # Run scontrol to get job details
70
+ result = subprocess.run(
71
+ ["scontrol", "show", "job", jobid],
72
+ capture_output=True,
73
+ text=True,
74
+ check=True,
75
+ )
76
+
77
+ # Parse the output for the Requeue field
78
+ for line in result.stdout.splitlines():
79
+ if "Requeue=" in line:
80
+ requeue_value = line.split("Requeue=")[1].split()[0]
81
+ return requeue_value == "1"
82
+
83
+ # If the Requeue field is not found
84
+ raise RuntimeError(f"Could not determine Requeue status for job {jobid}.")
85
+
86
+ except subprocess.CalledProcessError as e:
87
+ raise RuntimeError(f"Error while running scontrol: {e.stderr.strip()}")
88
+
89
+
90
+ class AutoSlurmRequeue(AbstractCallback):
91
+ """
92
+ A callback that automatically requeues a Slurm job if it is about to run out
93
+ of time.
94
+
95
+ This callback should be used together with a form of checkpointing to ensure
96
+ that the job can be requeued without losing progress.
97
+ """
98
+
99
+ before: timedelta = struct.field(pytree_node=False, serialize=False)
100
+ max_requeue_count: int = struct.field(pytree_node=False, serialize=False)
101
+ _time_to_requeue: timedelta | None = struct.field(
102
+ pytree_node=False, serialize=False, default=None
103
+ )
104
+ _enabled: bool = struct.field(pytree_node=False, serialize=False, default=True)
105
+
106
+ def __init__(
107
+ self, before: timedelta = timedelta(minutes=5), max_requeue_count: int = 3
108
+ ):
109
+ """
110
+ Initialize the auto-requeue callback.
111
+
112
+ Args:
113
+ before: The time before the job ends to check for requeueing (default: 5 minute).
114
+ This should be a timedelta object or a number of seconds, and it should be at least
115
+ as long as the time it takes an iteration to run.
116
+ max_requeue_count: Maximum number of times the job should be requeued.
117
+ """
118
+ if isinstance(before, (int)):
119
+ before = timedelta(seconds=before)
120
+ if not isinstance(before, timedelta):
121
+ raise TypeError(
122
+ f"Expected before to be a timedelta or an int (seconds), but got {type(before)}"
123
+ )
124
+ if not isinstance(max_requeue_count, int) or max_requeue_count < 0:
125
+ raise ValueError("max_requeue_count must be a non-negative integer.")
126
+
127
+ self.before = before
128
+ self.max_requeue_count = max_requeue_count
129
+
130
+ def on_run_start(self, step, driver):
131
+ jobid = os.getenv("SLURM_JOB_ID")
132
+ requeue_count = int(os.getenv("SLURM_RESTART_COUNT", "0"))
133
+
134
+ if jobid is None:
135
+ print("SLURM_JOB_ID not found. Skipping auto-requeue check.")
136
+ self._enabled = False
137
+ return
138
+
139
+ if requeue_count >= self.max_requeue_count:
140
+ print(
141
+ f"Job has been requeued {requeue_count} times, exceeding the limit of {self.max_requeue_count}. Disabling auto-requeue."
142
+ )
143
+ self._enabled = False
144
+ return
145
+
146
+ if not is_requeueable(jobid):
147
+ raise RuntimeError(
148
+ "Job is not requeable. Use `--requeue` option when scheduling the job \n"
149
+ "for example use `sbatch --requeue file` or add #SLURM --requeue at the top"
150
+ "of the file."
151
+ )
152
+
153
+ time_left = get_time_left(jobid)
154
+
155
+ if time_left is None:
156
+ print("No time limit found. Skipping auto-requeue check.")
157
+ self._enabled = False
158
+ return
159
+
160
+ self._time_to_requeue = datetime.now() + time_left - self.before
161
+ self._enabled = True
162
+
163
+ def on_step_end(self, step, log_data, driver):
164
+ if not self._enabled:
165
+ return
166
+
167
+ if datetime.now() > self._time_to_requeue:
168
+ print("Reached requeue time. Requeueing job...")
169
+ if jax.process_index() == 0:
170
+ subprocess.run(["scontrol", "requeue", os.getenv("SLURM_JOB_ID")])
171
+ self._enabled = False
@@ -0,0 +1,126 @@
1
+ from netket.utils import struct
2
+
3
+
4
+ class StopRun(Exception):
5
+ """
6
+ Exception to be raised by callbacks to gracefully stop the optimisation loop.
7
+
8
+ Raise this exception (or a subclass of it) from any callback hook to stop
9
+ the :meth:`~netket.driver.AbstractVariationalDriver.run` loop early.
10
+ The driver will catch it, call
11
+ :meth:`~netket.callbacks.AbstractCallback.on_run_end` on all callbacks, and
12
+ then return normally — no traceback is printed and no exception propagates to
13
+ the caller.
14
+
15
+ The message passed to the exception will be printed to stdout.
16
+
17
+ Example::
18
+
19
+ class StopAfterConvergence(nk.callbacks.AbstractCallback):
20
+ def on_step_end(self, step, log_data, driver):
21
+ if log_data["Energy"].error_of_mean < 1e-4:
22
+ raise nk.callbacks.StopRun("Energy converged.")
23
+ """
24
+
25
+ pass
26
+
27
+
28
+ class AbstractCallback(struct.Pytree, mutable=True):
29
+ """
30
+ Abstract base class for callbacks in advanced variational drivers.
31
+
32
+ This class is a Pytree, so it can be used with JAX transformations and
33
+ automatically handles serialisation, but fields must be declared
34
+ with `struct.field(pytree_node=False)` as class attributes.
35
+
36
+ Subclass this class and override any of the hook methods to inject custom
37
+ logic at specific points of the optimisation loop. All hook methods have
38
+ no-op default implementations, so you only need to override the ones you
39
+ need.
40
+
41
+ To stop the optimisation early from inside any hook, raise
42
+ :class:`~netket.callbacks.StopRun` (or a subclass of it). The driver will
43
+ catch it, call :meth:`on_run_end` on all callbacks, and return normally.
44
+
45
+ For a full description of the run loop structure and every available hook,
46
+ including pseudocode showing exactly when each hook is called, see
47
+ :ref:`advanced_custom_callbacks`.
48
+ """
49
+
50
+ def __init_subclass__(cls, **kwargs):
51
+ from netket.errors import CallbackLegacyHookError
52
+
53
+ super().__init_subclass__(**kwargs)
54
+
55
+ old_methods = [
56
+ m for m in ("on_legacy_run", "on_parameter_update") if m in cls.__dict__
57
+ ]
58
+ if old_methods:
59
+ raise CallbackLegacyHookError(cls.__name__, old_methods)
60
+
61
+ def __init__(
62
+ self,
63
+ ):
64
+ pass
65
+
66
+ @property
67
+ def callback_order(self) -> int:
68
+ """
69
+ An integer representing the order in which this callback should be called.
70
+
71
+ Lower numbers are called first, and higher numbers are called later.
72
+
73
+ This can be redefined in subclasses to change the order in which callbacks are called.
74
+ (Default: 0, for all callbacks, 10 for loggers).
75
+ """
76
+ return 0
77
+
78
+ def on_run_start(self, step, driver):
79
+ pass
80
+
81
+ def on_step_start(self, step, log_data, driver):
82
+ pass
83
+
84
+ def on_compute_update_start(self, step, log_data, driver):
85
+ pass
86
+
87
+ def on_compute_update_end(self, step, log_data, driver) -> bool:
88
+ """
89
+ Callback called at the end of the compute update phase, after computing the loss and its gradient.
90
+
91
+ This is called before the parameters are updated, so it can be used to implement custom
92
+ logic for rejecting a step based on the computed loss or gradient.
93
+
94
+ Returns:
95
+ A boolean indicating whether to reject the step (i.e. repeat it with the same parameters).
96
+ If it returns None, it is treated as False.
97
+ """
98
+ return False
99
+
100
+ def before_parameter_update(self, step, log_data, driver):
101
+ """
102
+ Called after all update logic has been computed and the step has been accepted,
103
+ but before the driver applies the parameter update.
104
+
105
+ At this point:
106
+
107
+ - The loss and its gradient have been computed by :meth:`~netket.driver.AbstractVariationalDriver.compute_loss_and_update`.
108
+ - The step has been accepted (not rejected by :meth:`on_compute_update_end`).
109
+ - ``driver.step_count`` still refers to the *current* step — it has not yet been incremented.
110
+ - The variational state parameters have **not** yet changed.
111
+
112
+ This is the right place to estimate additional observables, add data to
113
+ ``log_data``, or take a snapshot of the state for logging. Callbacks with a
114
+ lower :attr:`callback_order` run first, so observables callbacks (order 0) are
115
+ guaranteed to populate ``log_data`` before logger callbacks (order 10) read it.
116
+ """
117
+ pass
118
+
119
+ def on_step_end(self, step, log_data, driver):
120
+ pass
121
+
122
+ def on_run_end(self, step, driver):
123
+ pass
124
+
125
+ def on_run_error(self, step, error, driver):
126
+ pass
@@ -0,0 +1,52 @@
1
+ from typing import Any
2
+
3
+
4
+ from netket._src.callbacks.base import AbstractCallback
5
+
6
+
7
+ class CallbackList(AbstractCallback):
8
+ callbacks: tuple[Any]
9
+
10
+ def __init__(
11
+ self,
12
+ callbacks=None,
13
+ ):
14
+ if isinstance(callbacks, AbstractCallback):
15
+ callbacks = (callbacks,)
16
+ self.callbacks = tuple(sorted(callbacks, key=lambda x: x.callback_order))
17
+
18
+ def on_run_start(self, step, driver):
19
+ for callback in self.callbacks:
20
+ callback.on_run_start(step, driver)
21
+
22
+ def on_step_start(self, step, log_data, driver):
23
+ for callback in self.callbacks:
24
+ callback.on_step_start(step, log_data, driver)
25
+
26
+ def on_compute_update_start(self, step, log_data, driver):
27
+ for callback in self.callbacks:
28
+ callback.on_compute_update_start(step, log_data, driver)
29
+
30
+ def on_compute_update_end(self, step, log_data, driver) -> bool:
31
+ reject_step = False
32
+ for callback in self.callbacks:
33
+ _reject = callback.on_compute_update_end(step, log_data, driver)
34
+ if _reject is True:
35
+ reject_step = True
36
+ return reject_step
37
+
38
+ def before_parameter_update(self, step, log_data, driver):
39
+ for callback in self.callbacks:
40
+ callback.before_parameter_update(step, log_data, driver)
41
+
42
+ def on_step_end(self, step, log_data, driver):
43
+ for callback in self.callbacks:
44
+ callback.on_step_end(step, log_data, driver)
45
+
46
+ def on_run_end(self, step, driver):
47
+ for callback in self.callbacks:
48
+ callback.on_run_end(step, driver)
49
+
50
+ def on_run_error(self, step, error, driver):
51
+ for callback in self.callbacks:
52
+ callback.on_run_error(step, error, driver)
@@ -0,0 +1,73 @@
1
+ from typing import TYPE_CHECKING, Any, Callable
2
+ from functools import wraps
3
+ import copy
4
+
5
+ from netket.vqs import VariationalState
6
+ from netket.utils import struct
7
+
8
+ from netket._src.callbacks.base import AbstractCallback, StopRun
9
+
10
+ if TYPE_CHECKING:
11
+ from netket._src.driver.abstract_variational_driver import AbstractDriver
12
+
13
+ LegacyCallbackT = Callable[[int, dict, "AbstractDriver"], bool]
14
+
15
+
16
+ class LegacyCallbackWrapper(AbstractCallback):
17
+ """
18
+ Wraps a legacy callback function (i.e. a function that takes the step, log_data and driver as arguments)
19
+ into a callback that can be used with the new callback system.
20
+
21
+ The legacy callback should return a boolean indicating whether to continue the run (True) or stop it (False).
22
+ """
23
+
24
+ callback: LegacyCallbackT
25
+
26
+ def __init__(self, callback: LegacyCallbackT):
27
+ self.callback = callback
28
+
29
+ def before_parameter_update(self, step, log_data, driver):
30
+ do_continue = self.callback(step, log_data, driver)
31
+ if not do_continue:
32
+ raise StopRun(f"Legacy callback {self.callback} requested to stop the run.")
33
+
34
+
35
+ class LegacyLoggerWrapper(AbstractCallback):
36
+ """
37
+ Wraps a legacy logger function (i.e. a function that takes the step, log_data and variational state as arguments)
38
+ into a callback that can be used with the new callback system.
39
+ """
40
+
41
+ logger: Any
42
+
43
+ _vstate: VariationalState | None = struct.field(serialize=False)
44
+ """
45
+ Used to store the variational state between when parameters are updated and
46
+ when we actually log it.
47
+ """
48
+
49
+ def __init__(self, logger: Any):
50
+ self.logger = logger
51
+ self._vstate = None
52
+
53
+ @property
54
+ @wraps(AbstractCallback.callback_order)
55
+ def callback_order(self) -> int:
56
+ return 10
57
+
58
+ def before_parameter_update(self, step, log_data, driver):
59
+ # Store the vstate internally so that if we modify the parameters
60
+ # we can still log the previous one.
61
+ self._vstate = copy.copy(driver.state)
62
+
63
+ def on_step_end(self, step, log_data, driver):
64
+ self.logger(step, log_data, self._vstate)
65
+ self._vstate = None
66
+
67
+ def on_run_end(self, step, driver):
68
+ self.logger.flush(driver.state)
69
+ self._vstate = None
70
+
71
+ def on_run_error(self, step, error, driver):
72
+ self.logger.flush(driver.state)
73
+ self._vstate = None