NetKet 3.22.4__tar.gz → 3.23.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. {netket-3.22.4 → netket-3.23.0}/.gitignore +2 -0
  2. {netket-3.22.4 → netket-3.23.0}/PKG-INFO +2 -2
  3. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/base.py +10 -0
  4. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/convergence_stopping.py +23 -8
  5. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/early_stopping.py +14 -4
  6. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/invalid_loss_stopping.py +12 -2
  7. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/progressbar.py +31 -16
  8. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/save_state.py +1 -1
  9. {netket-3.22.4 → netket-3.23.0}/netket/_src/driver/abstract_dynamics_driver.py +1 -2
  10. {netket-3.22.4 → netket-3.23.0}/netket/_src/driver/abstract_optimization_driver.py +4 -3
  11. {netket-3.22.4 → netket-3.23.0}/netket/_src/driver/abstract_variational_driver.py +28 -12
  12. {netket-3.22.4 → netket-3.23.0}/netket/_src/driver/infidelity_sr.py +7 -2
  13. {netket-3.22.4 → netket-3.23.0}/netket/_src/driver/vmc_sr.py +49 -4
  14. {netket-3.22.4 → netket-3.23.0}/netket/_src/logging/hdf5_log.py +17 -12
  15. {netket-3.22.4 → netket-3.23.0}/netket/_src/logging/mlflow_log.py +11 -8
  16. {netket-3.22.4 → netket-3.23.0}/netket/_src/logging/tensorboard.py +2 -2
  17. netket-3.23.0/netket/_src/logging/wandb_log.py +376 -0
  18. {netket-3.22.4 → netket-3.23.0}/netket/_src/ngd/srt_onthefly.py +53 -8
  19. {netket-3.22.4 → netket-3.23.0}/netket/_src/nn/freeze/common.py +25 -5
  20. netket-3.23.0/netket/_src/solvers/jaxmg_interface.py +226 -0
  21. {netket-3.22.4 → netket-3.23.0}/netket/_src/solvers/nan_fallback.py +8 -0
  22. {netket-3.22.4 → netket-3.23.0}/netket/_src/stats/online_stats/operations.py +1 -1
  23. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/expect_to_precision.py +4 -1
  24. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/freeze_vstate.py +16 -50
  25. {netket-3.22.4 → netket-3.23.0}/netket/_version.py +2 -2
  26. {netket-3.22.4 → netket-3.23.0}/netket/callbacks.py +1 -0
  27. {netket-3.22.4 → netket-3.23.0}/netket/driver/steady_state.py +4 -6
  28. {netket-3.22.4 → netket-3.23.0}/netket/driver/vmc.py +4 -6
  29. {netket-3.22.4 → netket-3.23.0}/netket/experimental/driver/tdvp.py +13 -0
  30. netket-3.23.0/netket/experimental/driver/tdvp_common.py +518 -0
  31. {netket-3.22.4 → netket-3.23.0}/netket/experimental/driver/tdvp_schmitt.py +17 -1
  32. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/_integrator_state.py +5 -2
  33. {netket-3.22.4 → netket-3.23.0}/netket/graph/graph.py +1 -1
  34. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/tensor_hilbert_discrete.py +1 -1
  35. {netket-3.22.4 → netket-3.23.0}/netket/jax/__init__.py +1 -0
  36. netket-3.23.0/netket/jax/_apply_packed.py +461 -0
  37. {netket-3.22.4 → netket-3.23.0}/netket/jax/_ntk/logic.py +18 -3
  38. {netket-3.22.4 → netket-3.23.0}/netket/jax/_utils_tree.py +16 -0
  39. {netket-3.22.4 → netket-3.23.0}/netket/logging.py +1 -0
  40. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/solver/solvers.py +116 -80
  41. {netket-3.22.4 → netket-3.23.0}/netket/utils/_tips.py +1 -1
  42. {netket-3.22.4 → netket-3.23.0}/netket/utils/array.py +1 -1
  43. {netket-3.22.4 → netket-3.23.0}/netket/utils/config_flags.py +19 -0
  44. {netket-3.22.4 → netket-3.23.0}/netket/utils/optional_deps.py +6 -2
  45. {netket-3.22.4 → netket-3.23.0}/netket/utils/struct/fields.py +5 -2
  46. {netket-3.22.4 → netket-3.23.0}/netket/utils/struct/pytree.py +24 -0
  47. {netket-3.22.4 → netket-3.23.0}/netket/vqs/base.py +26 -4
  48. {netket-3.22.4 → netket-3.23.0}/netket/vqs/full_summ/state.py +11 -0
  49. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/common.py +13 -4
  50. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/kernels.py +1 -1
  51. netket-3.23.0/netket/vqs/mc/kernels_packed.py +212 -0
  52. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/expect.py +4 -1
  53. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/expect_chunked.py +4 -0
  54. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/state.py +20 -2
  55. {netket-3.22.4 → netket-3.23.0}/pyproject.toml +2 -2
  56. netket-3.22.4/netket/_src/driver/abstract_variational_driver_old.py +0 -443
  57. netket-3.22.4/netket/experimental/driver/tdvp_common.py +0 -457
  58. {netket-3.22.4 → netket-3.23.0}/LICENSE +0 -0
  59. {netket-3.22.4 → netket-3.23.0}/README.md +0 -0
  60. {netket-3.22.4 → netket-3.23.0}/docs/sphinx_extensions/netket_citations.py +0 -0
  61. {netket-3.22.4 → netket-3.23.0}/netket/__init__.py +0 -0
  62. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/auto_chunk_size.py +0 -0
  63. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/auto_slurm_requeue.py +0 -0
  64. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/callback_list.py +0 -0
  65. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/legacy_wrappers.py +0 -0
  66. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/observables.py +0 -0
  67. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/stop_at_time.py +0 -0
  68. {netket-3.22.4 → netket-3.23.0}/netket/_src/callbacks/timeout.py +0 -0
  69. {netket-3.22.4 → netket-3.23.0}/netket/_src/logging/base.py +0 -0
  70. {netket-3.22.4 → netket-3.23.0}/netket/_src/logging/json_log.py +0 -0
  71. {netket-3.22.4 → netket-3.23.0}/netket/_src/logging/runtime_log.py +0 -0
  72. {netket-3.22.4 → netket-3.23.0}/netket/_src/logging/state_log.py +0 -0
  73. {netket-3.22.4 → netket-3.23.0}/netket/_src/ngd/kwargs.py +0 -0
  74. {netket-3.22.4 → netket-3.23.0}/netket/_src/ngd/sr.py +0 -0
  75. {netket-3.22.4 → netket-3.23.0}/netket/_src/ngd/sr_srt_common.py +0 -0
  76. {netket-3.22.4 → netket-3.23.0}/netket/_src/ngd/srt.py +0 -0
  77. {netket-3.22.4 → netket-3.23.0}/netket/_src/nn/apply_operator/functional.py +0 -0
  78. {netket-3.22.4 → netket-3.23.0}/netket/_src/nn/apply_operator/linen.py +0 -0
  79. {netket-3.22.4 → netket-3.23.0}/netket/_src/nn/apply_operator/nnx.py +0 -0
  80. {netket-3.22.4 → netket-3.23.0}/netket/_src/nn/freeze/api.py +0 -0
  81. {netket-3.22.4 → netket-3.23.0}/netket/_src/nn/freeze/functional.py +0 -0
  82. {netket-3.22.4 → netket-3.23.0}/netket/_src/nn/freeze/linen.py +0 -0
  83. {netket-3.22.4 → netket-3.23.0}/netket/_src/nn/freeze/nnx.py +0 -0
  84. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/correlator/__init__.py +0 -0
  85. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/correlator/correlator.py +0 -0
  86. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/correlator/expect.py +0 -0
  87. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/infidelity/__init__.py +0 -0
  88. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/infidelity/exact.py +0 -0
  89. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/infidelity/expect.py +0 -0
  90. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/infidelity/infidelity_operator.py +0 -0
  91. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/renyi2/S2_operator.py +0 -0
  92. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/renyi2/__init__.py +0 -0
  93. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/renyi2/exact.py +0 -0
  94. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/renyi2/expect.py +0 -0
  95. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/variance/__init__.py +0 -0
  96. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/variance/exact.py +0 -0
  97. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/variance/expect.py +0 -0
  98. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/variance/variance_operator.py +0 -0
  99. {netket-3.22.4 → netket-3.23.0}/netket/_src/observable/vscore.py +0 -0
  100. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/normal_order_utils.py +0 -0
  101. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/particle_number_conserving_fermionic/conversion.py +0 -0
  102. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/particle_number_conserving_fermionic/fermihubbard.py +0 -0
  103. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/particle_number_conserving_fermionic/kernels.py +0 -0
  104. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/particle_number_conserving_fermionic/operator_data.py +0 -0
  105. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/particle_number_conserving_fermionic/operators.py +0 -0
  106. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/permutation/base.py +0 -0
  107. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/permutation/construct.py +0 -0
  108. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/permutation/fermion.py +0 -0
  109. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/permutation/spin.py +0 -0
  110. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/permutation/trace_utils.py +0 -0
  111. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/pyscf_api.py +0 -0
  112. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/pyscf_utils.py +0 -0
  113. {netket-3.22.4 → netket-3.23.0}/netket/_src/operator/spin_flip.py +0 -0
  114. {netket-3.22.4 → netket-3.23.0}/netket/_src/stats/local_estimators.py +0 -0
  115. {netket-3.22.4 → netket-3.23.0}/netket/_src/stats/online_stats/__init__.py +0 -0
  116. {netket-3.22.4 → netket-3.23.0}/netket/_src/stats/online_stats/accumulator.py +0 -0
  117. {netket-3.22.4 → netket-3.23.0}/netket/_src/stats/online_stats/accumulator_batch.py +0 -0
  118. {netket-3.22.4 → netket-3.23.0}/netket/_src/stats/online_stats/kernels.py +0 -0
  119. {netket-3.22.4 → netket-3.23.0}/netket/_src/symmetry/canonical_representation.py +0 -0
  120. {netket-3.22.4 → netket-3.23.0}/netket/_src/symmetry/labeled_representation.py +0 -0
  121. {netket-3.22.4 → netket-3.23.0}/netket/_src/symmetry/labeled_representation_coset_filter.py +0 -0
  122. {netket-3.22.4 → netket-3.23.0}/netket/_src/symmetry/representation.py +0 -0
  123. {netket-3.22.4 → netket-3.23.0}/netket/_src/symmetry/representation_construction.py +0 -0
  124. {netket-3.22.4 → netket-3.23.0}/netket/_src/symmetry/spin_flip_representation.py +0 -0
  125. {netket-3.22.4 → netket-3.23.0}/netket/_src/symmetry/translation_coset_filter.py +0 -0
  126. {netket-3.22.4 → netket-3.23.0}/netket/_src/symmetry/translation_representation.py +0 -0
  127. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/check_mc_convergence.py +0 -0
  128. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/fermion_mf/__init__.py +0 -0
  129. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/fermion_mf/expectation.py +0 -0
  130. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/fermion_mf/qgt.py +0 -0
  131. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/fermion_mf/state.py +0 -0
  132. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/plot_mc_convergence.py +0 -0
  133. {netket-3.22.4 → netket-3.23.0}/netket/_src/vqs/transformed_vstate.py +0 -0
  134. {netket-3.22.4 → netket-3.23.0}/netket/driver/__init__.py +0 -0
  135. {netket-3.22.4 → netket-3.23.0}/netket/errors.py +0 -0
  136. {netket-3.22.4 → netket-3.23.0}/netket/exact.py +0 -0
  137. {netket-3.22.4 → netket-3.23.0}/netket/experimental/__init__.py +0 -0
  138. {netket-3.22.4 → netket-3.23.0}/netket/experimental/driver/__init__.py +0 -0
  139. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/__init__.py +0 -0
  140. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/_integrator.py +0 -0
  141. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/_integrator_params.py +0 -0
  142. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/_rk/__init__.py +0 -0
  143. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/_rk/_solver.py +0 -0
  144. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/_rk/_tableau.py +0 -0
  145. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/_solver.py +0 -0
  146. {netket-3.22.4 → netket-3.23.0}/netket/experimental/dynamics/_utils.py +0 -0
  147. {netket-3.22.4 → netket-3.23.0}/netket/experimental/geometry/__init__.py +0 -0
  148. {netket-3.22.4 → netket-3.23.0}/netket/experimental/geometry/cell.py +0 -0
  149. {netket-3.22.4 → netket-3.23.0}/netket/experimental/hilbert/__init__.py +0 -0
  150. {netket-3.22.4 → netket-3.23.0}/netket/experimental/hilbert/continuous_hilbert.py +0 -0
  151. {netket-3.22.4 → netket-3.23.0}/netket/experimental/hilbert/particle.py +0 -0
  152. {netket-3.22.4 → netket-3.23.0}/netket/experimental/hilbert/random/__init__.py +0 -0
  153. {netket-3.22.4 → netket-3.23.0}/netket/experimental/hilbert/random/particle.py +0 -0
  154. {netket-3.22.4 → netket-3.23.0}/netket/experimental/logging/__init__.py +0 -0
  155. {netket-3.22.4 → netket-3.23.0}/netket/experimental/models/__init__.py +0 -0
  156. {netket-3.22.4 → netket-3.23.0}/netket/experimental/models/fast_rnn.py +0 -0
  157. {netket-3.22.4 → netket-3.23.0}/netket/experimental/models/rnn.py +0 -0
  158. {netket-3.22.4 → netket-3.23.0}/netket/experimental/nn/__init__.py +0 -0
  159. {netket-3.22.4 → netket-3.23.0}/netket/experimental/nn/rnn/__init__.py +0 -0
  160. {netket-3.22.4 → netket-3.23.0}/netket/experimental/nn/rnn/cells.py +0 -0
  161. {netket-3.22.4 → netket-3.23.0}/netket/experimental/nn/rnn/layers.py +0 -0
  162. {netket-3.22.4 → netket-3.23.0}/netket/experimental/nn/rnn/layers_fast.py +0 -0
  163. {netket-3.22.4 → netket-3.23.0}/netket/experimental/nn/rnn/ordering.py +0 -0
  164. {netket-3.22.4 → netket-3.23.0}/netket/experimental/observable/__init__.py +0 -0
  165. {netket-3.22.4 → netket-3.23.0}/netket/experimental/operator/__init__.py +0 -0
  166. {netket-3.22.4 → netket-3.23.0}/netket/experimental/operator/pyscf.py +0 -0
  167. {netket-3.22.4 → netket-3.23.0}/netket/experimental/qsr/__init__.py +0 -0
  168. {netket-3.22.4 → netket-3.23.0}/netket/experimental/qsr/dataset.py +0 -0
  169. {netket-3.22.4 → netket-3.23.0}/netket/experimental/qsr/driver.py +0 -0
  170. {netket-3.22.4 → netket-3.23.0}/netket/experimental/qsr/logic_helpers.py +0 -0
  171. {netket-3.22.4 → netket-3.23.0}/netket/experimental/vqs/__init__.py +0 -0
  172. {netket-3.22.4 → netket-3.23.0}/netket/experimental/vqs/io.py +0 -0
  173. {netket-3.22.4 → netket-3.23.0}/netket/graph/__init__.py +0 -0
  174. {netket-3.22.4 → netket-3.23.0}/netket/graph/_lattice_draw.py +0 -0
  175. {netket-3.22.4 → netket-3.23.0}/netket/graph/_lattice_edge_logic.py +0 -0
  176. {netket-3.22.4 → netket-3.23.0}/netket/graph/abstract_graph.py +0 -0
  177. {netket-3.22.4 → netket-3.23.0}/netket/graph/common_lattices.py +0 -0
  178. {netket-3.22.4 → netket-3.23.0}/netket/graph/lattice.py +0 -0
  179. {netket-3.22.4 → netket-3.23.0}/netket/graph/space_group.py +0 -0
  180. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/__init__.py +0 -0
  181. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/abstract_hilbert.py +0 -0
  182. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/constraint/__init__.py +0 -0
  183. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/constraint/base.py +0 -0
  184. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/constraint/multiple.py +0 -0
  185. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/constraint/sum.py +0 -0
  186. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/constraint/sum_partition.py +0 -0
  187. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/discrete_hilbert.py +0 -0
  188. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/doubled_hilbert.py +0 -0
  189. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/fock.py +0 -0
  190. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/homogeneous.py +0 -0
  191. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/index/__init__.py +0 -0
  192. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/index/base.py +0 -0
  193. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/index/constrained_generic.py +0 -0
  194. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/index/constrained_sum.py +0 -0
  195. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/index/constrained_sum_partitions.py +0 -0
  196. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/index/unconstrained.py +0 -0
  197. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/index/uniform_tensor.py +0 -0
  198. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/qubit.py +0 -0
  199. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/random/__init__.py +0 -0
  200. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/random/base.py +0 -0
  201. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/random/doubled.py +0 -0
  202. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/random/fock.py +0 -0
  203. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/random/homogeneous.py +0 -0
  204. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/random/qubit.py +0 -0
  205. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/random/tensor_hilbert.py +0 -0
  206. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/spin.py +0 -0
  207. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/spin_orbital_fermions.py +0 -0
  208. {netket-3.22.4 → netket-3.23.0}/netket/hilbert/tensor_hilbert.py +0 -0
  209. {netket-3.22.4 → netket-3.23.0}/netket/jax/_chunk_utils.py +0 -0
  210. {netket-3.22.4 → netket-3.23.0}/netket/jax/_compat.py +0 -0
  211. {netket-3.22.4 → netket-3.23.0}/netket/jax/_expect.py +0 -0
  212. {netket-3.22.4 → netket-3.23.0}/netket/jax/_grad.py +0 -0
  213. {netket-3.22.4 → netket-3.23.0}/netket/jax/_jacobian/__init__.py +0 -0
  214. {netket-3.22.4 → netket-3.23.0}/netket/jax/_jacobian/default_mode.py +0 -0
  215. {netket-3.22.4 → netket-3.23.0}/netket/jax/_jacobian/jacobian_dense.py +0 -0
  216. {netket-3.22.4 → netket-3.23.0}/netket/jax/_jacobian/jacobian_pytree.py +0 -0
  217. {netket-3.22.4 → netket-3.23.0}/netket/jax/_jacobian/logic.py +0 -0
  218. {netket-3.22.4 → netket-3.23.0}/netket/jax/_math.py +0 -0
  219. {netket-3.22.4 → netket-3.23.0}/netket/jax/_ntk/__init__.py +0 -0
  220. {netket-3.22.4 → netket-3.23.0}/netket/jax/_ntk/utils.py +0 -0
  221. {netket-3.22.4 → netket-3.23.0}/netket/jax/_scanmap.py +0 -0
  222. {netket-3.22.4 → netket-3.23.0}/netket/jax/_sort.py +0 -0
  223. {netket-3.22.4 → netket-3.23.0}/netket/jax/_sparse.py +0 -0
  224. {netket-3.22.4 → netket-3.23.0}/netket/jax/_utils_dtype.py +0 -0
  225. {netket-3.22.4 → netket-3.23.0}/netket/jax/_utils_random.py +0 -0
  226. {netket-3.22.4 → netket-3.23.0}/netket/jax/_vjp.py +0 -0
  227. {netket-3.22.4 → netket-3.23.0}/netket/jax/_vjp_chunked.py +0 -0
  228. {netket-3.22.4 → netket-3.23.0}/netket/jax/_vmap_chunked.py +0 -0
  229. {netket-3.22.4 → netket-3.23.0}/netket/jax/lax.py +0 -0
  230. {netket-3.22.4 → netket-3.23.0}/netket/jax/sharding/__init__.py +0 -0
  231. {netket-3.22.4 → netket-3.23.0}/netket/jax/sharding/debug.py +0 -0
  232. {netket-3.22.4 → netket-3.23.0}/netket/jax/sharding/fixed_sharding_decorator.py +0 -0
  233. {netket-3.22.4 → netket-3.23.0}/netket/jax/sharding/fixed_sharding_utils.py +0 -0
  234. {netket-3.22.4 → netket-3.23.0}/netket/jax/sharding/flexible_sharding.py +0 -0
  235. {netket-3.22.4 → netket-3.23.0}/netket/models/README.md +0 -0
  236. {netket-3.22.4 → netket-3.23.0}/netket/models/__init__.py +0 -0
  237. {netket-3.22.4 → netket-3.23.0}/netket/models/autoreg.py +0 -0
  238. {netket-3.22.4 → netket-3.23.0}/netket/models/deepset.py +0 -0
  239. {netket-3.22.4 → netket-3.23.0}/netket/models/equivariant.py +0 -0
  240. {netket-3.22.4 → netket-3.23.0}/netket/models/fast_autoreg.py +0 -0
  241. {netket-3.22.4 → netket-3.23.0}/netket/models/full_space.py +0 -0
  242. {netket-3.22.4 → netket-3.23.0}/netket/models/gaussian.py +0 -0
  243. {netket-3.22.4 → netket-3.23.0}/netket/models/jastrow.py +0 -0
  244. {netket-3.22.4 → netket-3.23.0}/netket/models/mlp.py +0 -0
  245. {netket-3.22.4 → netket-3.23.0}/netket/models/ndm.py +0 -0
  246. {netket-3.22.4 → netket-3.23.0}/netket/models/rbm.py +0 -0
  247. {netket-3.22.4 → netket-3.23.0}/netket/models/slater.py +0 -0
  248. {netket-3.22.4 → netket-3.23.0}/netket/models/tensor_networks/__init__.py +0 -0
  249. {netket-3.22.4 → netket-3.23.0}/netket/models/tensor_networks/mpdo.py +0 -0
  250. {netket-3.22.4 → netket-3.23.0}/netket/models/tensor_networks/mps.py +0 -0
  251. {netket-3.22.4 → netket-3.23.0}/netket/models/utils.py +0 -0
  252. {netket-3.22.4 → netket-3.23.0}/netket/nn/__init__.py +0 -0
  253. {netket-3.22.4 → netket-3.23.0}/netket/nn/activation.py +0 -0
  254. {netket-3.22.4 → netket-3.23.0}/netket/nn/apply_operator.py +0 -0
  255. {netket-3.22.4 → netket-3.23.0}/netket/nn/blocks/__init__.py +0 -0
  256. {netket-3.22.4 → netket-3.23.0}/netket/nn/blocks/deepset.py +0 -0
  257. {netket-3.22.4 → netket-3.23.0}/netket/nn/blocks/mlp.py +0 -0
  258. {netket-3.22.4 → netket-3.23.0}/netket/nn/blocks/symmetry_sum.py +0 -0
  259. {netket-3.22.4 → netket-3.23.0}/netket/nn/fast_masked_linear.py +0 -0
  260. {netket-3.22.4 → netket-3.23.0}/netket/nn/masked_linear.py +0 -0
  261. {netket-3.22.4 → netket-3.23.0}/netket/nn/symmetric_linear.py +0 -0
  262. {netket-3.22.4 → netket-3.23.0}/netket/nn/utils.py +0 -0
  263. {netket-3.22.4 → netket-3.23.0}/netket/observable.py +0 -0
  264. {netket-3.22.4 → netket-3.23.0}/netket/operator/__init__.py +0 -0
  265. {netket-3.22.4 → netket-3.23.0}/netket/operator/_abstract_observable.py +0 -0
  266. {netket-3.22.4 → netket-3.23.0}/netket/operator/_abstract_operator.py +0 -0
  267. {netket-3.22.4 → netket-3.23.0}/netket/operator/_abstract_super_operator.py +0 -0
  268. {netket-3.22.4 → netket-3.23.0}/netket/operator/_bose_hubbard/__init__.py +0 -0
  269. {netket-3.22.4 → netket-3.23.0}/netket/operator/_bose_hubbard/base.py +0 -0
  270. {netket-3.22.4 → netket-3.23.0}/netket/operator/_bose_hubbard/jax.py +0 -0
  271. {netket-3.22.4 → netket-3.23.0}/netket/operator/_bose_hubbard/numba.py +0 -0
  272. {netket-3.22.4 → netket-3.23.0}/netket/operator/_continuous_operator.py +0 -0
  273. {netket-3.22.4 → netket-3.23.0}/netket/operator/_discrete_operator.py +0 -0
  274. {netket-3.22.4 → netket-3.23.0}/netket/operator/_discrete_operator_jax.py +0 -0
  275. {netket-3.22.4 → netket-3.23.0}/netket/operator/_embed/__init__.py +0 -0
  276. {netket-3.22.4 → netket-3.23.0}/netket/operator/_embed/base.py +0 -0
  277. {netket-3.22.4 → netket-3.23.0}/netket/operator/_embed/discrete_jax_operator.py +0 -0
  278. {netket-3.22.4 → netket-3.23.0}/netket/operator/_embed/discrete_operator.py +0 -0
  279. {netket-3.22.4 → netket-3.23.0}/netket/operator/_embed/operator.py +0 -0
  280. {netket-3.22.4 → netket-3.23.0}/netket/operator/_fermion2nd/__init__.py +0 -0
  281. {netket-3.22.4 → netket-3.23.0}/netket/operator/_fermion2nd/base.py +0 -0
  282. {netket-3.22.4 → netket-3.23.0}/netket/operator/_fermion2nd/jax.py +0 -0
  283. {netket-3.22.4 → netket-3.23.0}/netket/operator/_fermion2nd/numba.py +0 -0
  284. {netket-3.22.4 → netket-3.23.0}/netket/operator/_fermion2nd/utils.py +0 -0
  285. {netket-3.22.4 → netket-3.23.0}/netket/operator/_graph_operator.py +0 -0
  286. {netket-3.22.4 → netket-3.23.0}/netket/operator/_hamiltonian.py +0 -0
  287. {netket-3.22.4 → netket-3.23.0}/netket/operator/_heisenberg.py +0 -0
  288. {netket-3.22.4 → netket-3.23.0}/netket/operator/_ising/__init__.py +0 -0
  289. {netket-3.22.4 → netket-3.23.0}/netket/operator/_ising/base.py +0 -0
  290. {netket-3.22.4 → netket-3.23.0}/netket/operator/_ising/jax.py +0 -0
  291. {netket-3.22.4 → netket-3.23.0}/netket/operator/_ising/numba.py +0 -0
  292. {netket-3.22.4 → netket-3.23.0}/netket/operator/_kinetic.py +0 -0
  293. {netket-3.22.4 → netket-3.23.0}/netket/operator/_lazy.py +0 -0
  294. {netket-3.22.4 → netket-3.23.0}/netket/operator/_local_liouvillian.py +0 -0
  295. {netket-3.22.4 → netket-3.23.0}/netket/operator/_local_operator/__init__.py +0 -0
  296. {netket-3.22.4 → netket-3.23.0}/netket/operator/_local_operator/base.py +0 -0
  297. {netket-3.22.4 → netket-3.23.0}/netket/operator/_local_operator/compile_helpers.py +0 -0
  298. {netket-3.22.4 → netket-3.23.0}/netket/operator/_local_operator/convert.py +0 -0
  299. {netket-3.22.4 → netket-3.23.0}/netket/operator/_local_operator/helpers.py +0 -0
  300. {netket-3.22.4 → netket-3.23.0}/netket/operator/_local_operator/jax.py +0 -0
  301. {netket-3.22.4 → netket-3.23.0}/netket/operator/_local_operator/numba.py +0 -0
  302. {netket-3.22.4 → netket-3.23.0}/netket/operator/_pauli_strings/__init__.py +0 -0
  303. {netket-3.22.4 → netket-3.23.0}/netket/operator/_pauli_strings/base.py +0 -0
  304. {netket-3.22.4 → netket-3.23.0}/netket/operator/_pauli_strings/jax.py +0 -0
  305. {netket-3.22.4 → netket-3.23.0}/netket/operator/_pauli_strings/numba.py +0 -0
  306. {netket-3.22.4 → netket-3.23.0}/netket/operator/_potential.py +0 -0
  307. {netket-3.22.4 → netket-3.23.0}/netket/operator/_prod/__init__.py +0 -0
  308. {netket-3.22.4 → netket-3.23.0}/netket/operator/_prod/base.py +0 -0
  309. {netket-3.22.4 → netket-3.23.0}/netket/operator/_prod/discrete_jax_operator.py +0 -0
  310. {netket-3.22.4 → netket-3.23.0}/netket/operator/_prod/discrete_operator.py +0 -0
  311. {netket-3.22.4 → netket-3.23.0}/netket/operator/_prod/operator.py +0 -0
  312. {netket-3.22.4 → netket-3.23.0}/netket/operator/_sum/__init__.py +0 -0
  313. {netket-3.22.4 → netket-3.23.0}/netket/operator/_sum/base.py +0 -0
  314. {netket-3.22.4 → netket-3.23.0}/netket/operator/_sum/continuous.py +0 -0
  315. {netket-3.22.4 → netket-3.23.0}/netket/operator/_sum/discrete_jax_operator.py +0 -0
  316. {netket-3.22.4 → netket-3.23.0}/netket/operator/_sum/discrete_operator.py +0 -0
  317. {netket-3.22.4 → netket-3.23.0}/netket/operator/_sum/operator.py +0 -0
  318. {netket-3.22.4 → netket-3.23.0}/netket/operator/boson.py +0 -0
  319. {netket-3.22.4 → netket-3.23.0}/netket/operator/fermion.py +0 -0
  320. {netket-3.22.4 → netket-3.23.0}/netket/operator/permutation.py +0 -0
  321. {netket-3.22.4 → netket-3.23.0}/netket/operator/spin.py +0 -0
  322. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/__init__.py +0 -0
  323. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/linear_operator.py +0 -0
  324. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/preconditioner.py +0 -0
  325. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/__init__.py +0 -0
  326. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/common.py +0 -0
  327. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/default.py +0 -0
  328. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/qgt_jacobian.py +0 -0
  329. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/qgt_jacobian_common.py +0 -0
  330. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/qgt_jacobian_dense.py +0 -0
  331. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/qgt_jacobian_pytree.py +0 -0
  332. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/qgt_onthefly.py +0 -0
  333. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/qgt/qgt_onthefly_logic.py +0 -0
  334. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/solver/__init__.py +0 -0
  335. {netket-3.22.4 → netket-3.23.0}/netket/optimizer/sr.py +0 -0
  336. {netket-3.22.4 → netket-3.23.0}/netket/sampler/__init__.py +0 -0
  337. {netket-3.22.4 → netket-3.23.0}/netket/sampler/autoreg.py +0 -0
  338. {netket-3.22.4 → netket-3.23.0}/netket/sampler/base.py +0 -0
  339. {netket-3.22.4 → netket-3.23.0}/netket/sampler/exact.py +0 -0
  340. {netket-3.22.4 → netket-3.23.0}/netket/sampler/metropolis.py +0 -0
  341. {netket-3.22.4 → netket-3.23.0}/netket/sampler/metropolis_numpy.py +0 -0
  342. {netket-3.22.4 → netket-3.23.0}/netket/sampler/parallel_tempering.py +0 -0
  343. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/__init__.py +0 -0
  344. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/base.py +0 -0
  345. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/continuous_gaussian.py +0 -0
  346. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/custom_numpy.py +0 -0
  347. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/exchange.py +0 -0
  348. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/fermion_2nd.py +0 -0
  349. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/fixed.py +0 -0
  350. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/global_flip_rule.py +0 -0
  351. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/hamiltonian.py +0 -0
  352. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/hamiltonian_numpy.py +0 -0
  353. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/langevin.py +0 -0
  354. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/local.py +0 -0
  355. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/local_numpy.py +0 -0
  356. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/multiple.py +0 -0
  357. {netket-3.22.4 → netket-3.23.0}/netket/sampler/rules/tensor.py +0 -0
  358. {netket-3.22.4 → netket-3.23.0}/netket/stats/__init__.py +0 -0
  359. {netket-3.22.4 → netket-3.23.0}/netket/stats/_autocorr.py +0 -0
  360. {netket-3.22.4 → netket-3.23.0}/netket/stats/mc_stats.py +0 -0
  361. {netket-3.22.4 → netket-3.23.0}/netket/stats/mc_stats_old.py +0 -0
  362. {netket-3.22.4 → netket-3.23.0}/netket/stats/mpi_stats.py +0 -0
  363. {netket-3.22.4 → netket-3.23.0}/netket/symmetry/__init__.py +0 -0
  364. {netket-3.22.4 → netket-3.23.0}/netket/symmetry/group/__init__.py +0 -0
  365. {netket-3.22.4 → netket-3.23.0}/netket/tools/__init__.py +0 -0
  366. {netket-3.22.4 → netket-3.23.0}/netket/tools/_common.py +0 -0
  367. {netket-3.22.4 → netket-3.23.0}/netket/tools/_cpu_info.py +0 -0
  368. {netket-3.22.4 → netket-3.23.0}/netket/tools/check_mpi.py +0 -0
  369. {netket-3.22.4 → netket-3.23.0}/netket/tools/djaxrun.py +0 -0
  370. {netket-3.22.4 → netket-3.23.0}/netket/tools/info.py +0 -0
  371. {netket-3.22.4 → netket-3.23.0}/netket/utils/__init__.py +0 -0
  372. {netket-3.22.4 → netket-3.23.0}/netket/utils/_dependencies_check.py +0 -0
  373. {netket-3.22.4 → netket-3.23.0}/netket/utils/_serialization.py +0 -0
  374. {netket-3.22.4 → netket-3.23.0}/netket/utils/api_utils.py +0 -0
  375. {netket-3.22.4 → netket-3.23.0}/netket/utils/citations/__init__.py +0 -0
  376. {netket-3.22.4 → netket-3.23.0}/netket/utils/citations/cli.py +0 -0
  377. {netket-3.22.4 → netket-3.23.0}/netket/utils/citations/core.py +0 -0
  378. {netket-3.22.4 → netket-3.23.0}/netket/utils/citations/docs.py +0 -0
  379. {netket-3.22.4 → netket-3.23.0}/netket/utils/citations/internal_citations.bib +0 -0
  380. {netket-3.22.4 → netket-3.23.0}/netket/utils/deprecation.py +0 -0
  381. {netket-3.22.4 → netket-3.23.0}/netket/utils/dispatch.py +0 -0
  382. {netket-3.22.4 → netket-3.23.0}/netket/utils/display/__init__.py +0 -0
  383. {netket-3.22.4 → netket-3.23.0}/netket/utils/display/repr.py +0 -0
  384. {netket-3.22.4 → netket-3.23.0}/netket/utils/float.py +0 -0
  385. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/__init__.py +0 -0
  386. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/_group.py +0 -0
  387. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/_permutation_group.py +0 -0
  388. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/_point_group.py +0 -0
  389. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/_semigroup.py +0 -0
  390. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/axial.py +0 -0
  391. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/cubic.py +0 -0
  392. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/icosa.py +0 -0
  393. {netket-3.22.4 → netket-3.23.0}/netket/utils/group/planar.py +0 -0
  394. {netket-3.22.4 → netket-3.23.0}/netket/utils/history/__init__.py +0 -0
  395. {netket-3.22.4 → netket-3.23.0}/netket/utils/history/accum.py +0 -0
  396. {netket-3.22.4 → netket-3.23.0}/netket/utils/history/history.py +0 -0
  397. {netket-3.22.4 → netket-3.23.0}/netket/utils/history/history_dict.py +0 -0
  398. {netket-3.22.4 → netket-3.23.0}/netket/utils/holomorphic.py +0 -0
  399. {netket-3.22.4 → netket-3.23.0}/netket/utils/iterators.py +0 -0
  400. {netket-3.22.4 → netket-3.23.0}/netket/utils/jax.py +0 -0
  401. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/__init__.py +0 -0
  402. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/base.py +0 -0
  403. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/equinox.py +0 -0
  404. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/flax.py +0 -0
  405. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/flax_bound.py +0 -0
  406. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/haiku.py +0 -0
  407. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/jax.py +0 -0
  408. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/nnx.py +0 -0
  409. {netket-3.22.4 → netket-3.23.0}/netket/utils/model_frameworks/nnx_wrapped.py +0 -0
  410. {netket-3.22.4 → netket-3.23.0}/netket/utils/moduletools.py +0 -0
  411. {netket-3.22.4 → netket-3.23.0}/netket/utils/mpi/__init__.py +0 -0
  412. {netket-3.22.4 → netket-3.23.0}/netket/utils/mpi/mpi.py +0 -0
  413. {netket-3.22.4 → netket-3.23.0}/netket/utils/mpi/primitives.py +0 -0
  414. {netket-3.22.4 → netket-3.23.0}/netket/utils/numbers.py +0 -0
  415. {netket-3.22.4 → netket-3.23.0}/netket/utils/partial.py +0 -0
  416. {netket-3.22.4 → netket-3.23.0}/netket/utils/seed.py +0 -0
  417. {netket-3.22.4 → netket-3.23.0}/netket/utils/static_number.py +0 -0
  418. {netket-3.22.4 → netket-3.23.0}/netket/utils/static_range.py +0 -0
  419. {netket-3.22.4 → netket-3.23.0}/netket/utils/struct/__init__.py +0 -0
  420. {netket-3.22.4 → netket-3.23.0}/netket/utils/struct/dataclass.py +0 -0
  421. {netket-3.22.4 → netket-3.23.0}/netket/utils/struct/pytree_serialization_sharding.py +0 -0
  422. {netket-3.22.4 → netket-3.23.0}/netket/utils/struct/utils.py +0 -0
  423. {netket-3.22.4 → netket-3.23.0}/netket/utils/summation.py +0 -0
  424. {netket-3.22.4 → netket-3.23.0}/netket/utils/timing.py +0 -0
  425. {netket-3.22.4 → netket-3.23.0}/netket/utils/tree_walk.py +0 -0
  426. {netket-3.22.4 → netket-3.23.0}/netket/utils/types.py +0 -0
  427. {netket-3.22.4 → netket-3.23.0}/netket/utils/version_check.py +0 -0
  428. {netket-3.22.4 → netket-3.23.0}/netket/vqs/__init__.py +0 -0
  429. {netket-3.22.4 → netket-3.23.0}/netket/vqs/full_summ/__init__.py +0 -0
  430. {netket-3.22.4 → netket-3.23.0}/netket/vqs/full_summ/expect.py +0 -0
  431. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/__init__.py +0 -0
  432. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_mixed_state/__init__.py +0 -0
  433. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_mixed_state/expect.py +0 -0
  434. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_mixed_state/expect_chunked.py +0 -0
  435. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_mixed_state/expect_grad.py +0 -0
  436. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_mixed_state/state.py +0 -0
  437. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/__init__.py +0 -0
  438. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/expect_forces.py +0 -0
  439. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/expect_forces_chunked.py +0 -0
  440. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/expect_grad.py +0 -0
  441. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/expect_grad_chunked.py +0 -0
  442. {netket-3.22.4 → netket-3.23.0}/netket/vqs/mc/mc_state/local_estimators.py +0 -0
@@ -44,6 +44,8 @@ uv.lock
44
44
  # Logs and databases #
45
45
  ######################
46
46
  *.log
47
+ # per-rank output of djaxrun
48
+ djaxrunlog-p*
47
49
  *.sql
48
50
  *.sqlite
49
51
  *.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: NetKet
3
- Version: 3.22.4
3
+ Version: 3.23.0
4
4
  Summary: Netket : Machine Learning toolbox for many-body quantum systems.
5
5
  Project-URL: homepage, https://www.netket.org
6
6
  Project-URL: documentation, https://netket.readthedocs.io/en/latest/#
@@ -62,11 +62,11 @@ 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
64
64
  Requires-Dist: h5py>=3.7.0; extra == 'extra'
65
- Requires-Dist: jaxmg<1.0.0,>=0.0.9; (sys_platform == 'linux') and extra == 'extra'
66
65
  Requires-Dist: mlflow>=2.0.0; extra == 'extra'
67
66
  Requires-Dist: openfermion>=1.0.0; extra == 'extra'
68
67
  Requires-Dist: qutip>=4; extra == 'extra'
69
68
  Requires-Dist: tensorboardx>=2.0.0; extra == 'extra'
69
+ Requires-Dist: wandb>=0.19.0; extra == 'extra'
70
70
  Provides-Extra: pyscf
71
71
  Requires-Dist: pyscf>=2.0; extra == 'pyscf'
72
72
  Description-Content-Type: text/markdown
@@ -25,6 +25,16 @@ class StopRun(Exception):
25
25
  pass
26
26
 
27
27
 
28
+ class RunFinished(StopRun):
29
+ """
30
+ Exception to be raised by callbacks to end a run that has reached its end,
31
+ for example the final time of a time evolution.
32
+
33
+ It works like :class:`~netket.callbacks.StopRun`, but the driver does not
34
+ print that the run is stopping early.
35
+ """
36
+
37
+
28
38
  #: ``callback_order`` for callbacks that may raise :class:`StopRun`. They run
29
39
  #: *last* (after observables at 0 and loggers at 10) so that, on the step a
30
40
  #: callback stops the run, no later callback in the hook is skipped — a skipped
@@ -12,9 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from collections import deque
16
-
17
15
  import numpy as np
16
+ from flax import serialization
18
17
 
19
18
  from netket.utils import struct
20
19
 
@@ -41,8 +40,11 @@ class ConvergenceStopping(AbstractCallback, mutable=True):
41
40
  """The loss must be consistently below this value for this number of
42
41
  iterations in order to stop the optimisation."""
43
42
 
44
- _loss_window: deque = struct.field(pytree_node=False, serialize=False)
45
- _patience_counter: int = struct.field(pytree_node=False, serialize=False, default=0)
43
+ # Saved, so that a run resumed from a checkpoint keeps its history. The window
44
+ # has a fixed length: only its last `_n_losses` entries are filled.
45
+ _loss_window: tuple[float, ...] = struct.field(pytree_node=False, serialize=True)
46
+ _n_losses: int = struct.field(pytree_node=False, serialize=True, default=0)
47
+ _patience_counter: int = struct.field(pytree_node=False, serialize=True, default=0)
46
48
 
47
49
  def __init__(
48
50
  self,
@@ -73,19 +75,32 @@ class ConvergenceStopping(AbstractCallback, mutable=True):
73
75
  self.smoothing_window = smoothing_window
74
76
  self.patience = patience
75
77
 
76
- self._loss_window = deque([], maxlen=smoothing_window)
78
+ self._loss_window = (0.0,) * smoothing_window
79
+ self._n_losses = 0
77
80
  self._patience_counter = 0
78
81
 
82
+ def __process_deserialization_state__(self, state):
83
+ # If the file has no window (older versions) or one of a different size,
84
+ # start the window over.
85
+ if len(state.get("_loss_window", ())) != self.smoothing_window:
86
+ state = {
87
+ k: v for k, v in state.items() if k not in ("_loss_window", "_n_losses")
88
+ }
89
+ names = ("_loss_window", "_n_losses", "_patience_counter")
90
+ defaults = {n: serialization.to_state_dict(getattr(self, n)) for n in names}
91
+ return {**defaults, **state}
92
+
79
93
  @property
80
94
  def callback_order(self) -> int:
81
95
  # Run last, so raising StopRun never skips a later callback's collective.
82
96
  return STOPPING_CALLBACK_ORDER
83
97
 
84
98
  def on_step_end(self, step, log_data, driver):
85
- loss = np.asarray(np.real(getattr(log_data[driver._loss_name], self.monitor)))
99
+ loss = np.real(getattr(log_data[driver._loss_name], self.monitor))
86
100
 
87
- self._loss_window.append(loss)
88
- loss_smooth = np.mean(self._loss_window)
101
+ self._loss_window = (*self._loss_window[1:], float(np.mean(loss)))
102
+ self._n_losses = min(self._n_losses + 1, self.smoothing_window)
103
+ loss_smooth = np.mean(self._loss_window[-self._n_losses :])
89
104
 
90
105
  if loss_smooth <= self.target:
91
106
  self._patience_counter += 1
@@ -45,12 +45,14 @@ class EarlyStopping(AbstractCallback, mutable=True):
45
45
  start_from_step: int = struct.field(pytree_node=False)
46
46
  """Number of steps to wait before the callback has any effect."""
47
47
 
48
- _best_val: float = struct.field(pytree_node=False, serialize=False, default=np.inf)
48
+ # Saved, so that a run resumed from a checkpoint keeps counting its patience
49
+ # instead of starting over.
50
+ _best_val: float = struct.field(pytree_node=False, serialize=True, default=np.inf)
49
51
  """Best value of the loss observed up to this iteration."""
50
- _best_iter: int = struct.field(pytree_node=False, serialize=False, default=0)
52
+ _best_iter: int = struct.field(pytree_node=False, serialize=True, default=0)
51
53
  """Iteration at which the `_best_val` was observed."""
52
54
  _best_patience_counter: int = struct.field(
53
- pytree_node=False, serialize=False, default=0
55
+ pytree_node=False, serialize=True, default=0
54
56
  )
55
57
  """Stores how many steps have elapsed without an improvement."""
56
58
 
@@ -91,6 +93,14 @@ class EarlyStopping(AbstractCallback, mutable=True):
91
93
  self._best_iter = 0
92
94
  self._best_patience_counter = 0
93
95
 
96
+ # TODO: backward compatibility for checkpoints saved before September 2026.
97
+ # Remove in 2027.
98
+ def __process_deserialization_state__(self, state):
99
+ # Files saved by older versions do not contain the best-so-far state.
100
+ names = ("_best_val", "_best_iter", "_best_patience_counter")
101
+ defaults = {name: self._pytree__fields[name].default for name in names}
102
+ return {**defaults, **state}
103
+
94
104
  @property
95
105
  def callback_order(self) -> int:
96
106
  # Run last, so raising StopRun never skips a later callback's collective.
@@ -104,7 +114,7 @@ class EarlyStopping(AbstractCallback, mutable=True):
104
114
 
105
115
  self._best_patience_counter += 1
106
116
  if self._is_improvement(loss, self._best_val):
107
- self._best_val = loss
117
+ self._best_val = float(loss)
108
118
  self._best_iter = step
109
119
 
110
120
  if self.baseline is None:
@@ -33,7 +33,9 @@ class InvalidLossStopping(AbstractCallback, mutable=True):
33
33
  patience: int | float = struct.field(pytree_node=False)
34
34
  """Number of epochs with invalid loss after which training will be stopped."""
35
35
 
36
- _last_valid_iter: int = struct.field(pytree_node=False, serialize=False, default=0)
36
+ # Saved, so that a run resumed from a checkpoint does not stop at the first
37
+ # invalid step, as if the loss had been invalid since step 0.
38
+ _last_valid_iter: int = struct.field(pytree_node=False, serialize=True, default=0)
37
39
  """Last valid iteration, to check against patience."""
38
40
 
39
41
  def __init__(self, monitor: str = "mean", patience: int | float = 0):
@@ -54,6 +56,12 @@ class InvalidLossStopping(AbstractCallback, mutable=True):
54
56
  self.patience = patience
55
57
  self._last_valid_iter = 0
56
58
 
59
+ # TODO: backward compatibility for checkpoints saved before September 2026.
60
+ # Remove in 2027.
61
+ def __process_deserialization_state__(self, state):
62
+ # Files saved by older versions do not contain it.
63
+ return {"_last_valid_iter": self._last_valid_iter, **state}
64
+
57
65
  @property
58
66
  def callback_order(self) -> int:
59
67
  # Run last, so raising StopRun never skips a later callback's collective.
@@ -67,7 +75,9 @@ class InvalidLossStopping(AbstractCallback, mutable=True):
67
75
  if driver._loss_stats is not None:
68
76
  loss = np.real(getattr(driver._loss_stats, self.monitor))
69
77
 
70
- if not np.isfinite(loss):
78
+ # `loss` may be vector-valued (e.g. a foundation ReplicaStats has one
79
+ # mean per anchor); stop if ANY component is non-finite.
80
+ if not np.all(np.isfinite(loss)):
71
81
  if driver.step_count - self._last_valid_iter >= self.patience:
72
82
  raise StopRun(
73
83
  f"InvalidLossStopping: loss is not finite ({loss}) "
@@ -10,28 +10,39 @@ from netket.utils import struct
10
10
  from netket._src.callbacks.base import AbstractCallback
11
11
 
12
12
 
13
+ def _elapsed_time(driver, t_start: float, T_final: float) -> float:
14
+ """Time elapsed since `t_start`, at most `T_final`."""
15
+ return min(float(driver.t) - t_start, T_final)
16
+
17
+
13
18
  class TimeProgressBarCallback(AbstractCallback, mutable=True):
14
19
  """
15
20
  Progress bar displaying physical time for dynamics drivers.
16
21
 
17
- Tracks ``driver.t ∈ [0, T_final]`` instead of step count.
22
+ Tracks the time elapsed since the start of the run, ``driver.t - t_start ∈
23
+ [0, T_final]``, instead of step count. ``t_start`` is ``driver._t_start`` if
24
+ the driver sets it (as the TDVP drivers do), and 0 otherwise.
18
25
  Used automatically by :class:`~netket.driver.AbstractDynamicsDriver`
19
26
  when :meth:`run` is called with a float time argument.
20
27
  """
21
28
 
22
29
  _T_final: float = struct.field(pytree_node=False, serialize=False)
23
- _last_t: float = struct.field(pytree_node=False, serialize=False)
30
+ _t_start: float = struct.field(pytree_node=False, serialize=False)
24
31
  _pbar: Any = struct.field(pytree_node=False, serialize=False)
25
32
  _leave: bool = struct.field(pytree_node=False, serialize=False)
26
33
 
27
34
  def __init__(self, T_final: float, leave: bool = True):
28
35
  self._T_final = T_final
29
- self._last_t = 0.0
36
+ self._t_start = 0.0
30
37
  self._pbar = None
31
38
  self._leave = leave
32
39
 
33
40
  def on_run_start(self, step, driver):
34
- self._last_t = float(driver.t)
41
+ # Count from the time the run started at, even if another callback
42
+ # changes the time (e.g. when resuming from a checkpoint).
43
+ t_start = getattr(driver, "_t_start", None)
44
+ self._t_start = 0.0 if t_start is None else float(t_start)
45
+
35
46
  dt = float(driver.dt)
36
47
  n_dec = max(4, math.ceil(-math.log10(dt))) if dt > 0 else 4
37
48
  bar_format = (
@@ -46,7 +57,7 @@ class TimeProgressBarCallback(AbstractCallback, mutable=True):
46
57
  leave=self._leave,
47
58
  bar_format=bar_format,
48
59
  )
49
- self._pbar.update(float(driver.t))
60
+ self._pbar.update(_elapsed_time(driver, self._t_start, self._T_final))
50
61
  self._pbar.unpause()
51
62
  self._pbar.refresh()
52
63
 
@@ -57,16 +68,16 @@ class TimeProgressBarCallback(AbstractCallback, mutable=True):
57
68
  )
58
69
 
59
70
  def on_step_end(self, step, log_data, driver):
60
- t = float(driver.t)
61
- self._pbar.update(t - self._last_t)
62
- self._last_t = t
71
+ self._pbar.update(
72
+ _elapsed_time(driver, self._t_start, self._T_final) - self._pbar.n
73
+ )
63
74
  self._pbar.refresh()
64
75
 
65
76
  def on_run_end(self, step, driver):
66
77
  if self._pbar is not None:
67
- t = float(driver.t)
68
- self._pbar.update(t - self._last_t)
69
- self._last_t = t
78
+ self._pbar.update(
79
+ _elapsed_time(driver, self._t_start, self._T_final) - self._pbar.n
80
+ )
70
81
  self._pbar.close()
71
82
  self._pbar = None
72
83
 
@@ -80,7 +91,7 @@ class ProgressBarCallback(AbstractCallback, mutable=True):
80
91
  _leave: bool = struct.field(pytree_node=False, serialize=False)
81
92
 
82
93
  _n_steps: int = struct.field(pytree_node=False, serialize=False)
83
- _last_step: int = struct.field(pytree_node=False, serialize=False)
94
+ _start_step: int = struct.field(pytree_node=False, serialize=False)
84
95
 
85
96
  _pbar: Any = struct.field(pytree_node=False, serialize=False)
86
97
 
@@ -90,7 +101,11 @@ class ProgressBarCallback(AbstractCallback, mutable=True):
90
101
  self._leave = leave
91
102
 
92
103
  def on_run_start(self, step, driver):
93
- self._last_step = driver.step_count
104
+ # Count from the step the run started at, even if another callback
105
+ # changes the step count (e.g. when resuming from a checkpoint).
106
+ self._start_step = getattr(driver, "_start_step", None)
107
+ if self._start_step is None:
108
+ self._start_step = driver.step_count
94
109
 
95
110
  self._pbar = tqdm(
96
111
  total=self._n_steps,
@@ -98,7 +113,7 @@ class ProgressBarCallback(AbstractCallback, mutable=True):
98
113
  dynamic_ncols=True,
99
114
  leave=self._leave,
100
115
  )
101
- self._pbar.update(driver.step_count - self._last_step)
116
+ self._pbar.update(driver.step_count - self._start_step)
102
117
  self._pbar.unpause()
103
118
  self._pbar.refresh()
104
119
 
@@ -110,12 +125,12 @@ class ProgressBarCallback(AbstractCallback, mutable=True):
110
125
  )
111
126
 
112
127
  def on_step_end(self, step, log_data, driver):
113
- step_value = driver.step_count - self._last_step
128
+ step_value = driver.step_count - self._start_step
114
129
  self._pbar.update(step_value - self._pbar.n)
115
130
  self._pbar.refresh()
116
131
 
117
132
  def on_run_end(self, step, driver):
118
- step_value = driver.step_count - self._last_step
133
+ step_value = driver.step_count - self._start_step
119
134
  if self._pbar is not None:
120
135
  self._pbar.update(step_value - self._pbar.n)
121
136
  self._pbar.refresh()
@@ -40,7 +40,7 @@ class SaveVariationalState(AbstractCallback, mutable=True):
40
40
  >>> driver.run( # doctest: +SKIP
41
41
  ... n_iter=50,
42
42
  ... out="test",
43
- ... callback=nk.callbacks.SaveVariationalStateCallback(path="optimization", interval=10),
43
+ ... callback=nk.logging.SaveVariationalState(path="optimization", interval=10),
44
44
  ... )
45
45
  >>> nqxpack.load("optimization/state_00010.nk") # doctest: +SKIP
46
46
 
@@ -166,8 +166,7 @@ class AbstractDynamicsDriver(AbstractDriver):
166
166
  callbacks fire normally.
167
167
  out: Logger or iterable of loggers for output.
168
168
  obs: Observables to compute at each logging step.
169
- max_steps: Safety cap on iterations when ``T_or_n`` is a float,
170
- to prevent infinite loops if ``dt`` is zero.
169
+ n_iter: Number of iterations to perform. Mutually exclusive with ``T``.
171
170
  show_progress: Show a progress bar (default True).
172
171
  callback: User callbacks.
173
172
  timeit: If True, print timing information after the run.
@@ -31,9 +31,10 @@ class AbstractOptimizationDriver(AbstractDriver):
31
31
  Adds an `optax <https://optax.readthedocs.io/en/latest/>`_ optimizer and
32
32
  implements :meth:`update_parameters` via :func:`apply_gradient`.
33
33
 
34
- Subclass this when implementing a new optimization driver. The public
35
- name :class:`AbstractVariationalDriver` is currently kept as a compatibility
36
- alias for this class.
34
+ Subclass this when implementing a new optimization driver, following the
35
+ guidelines in :class:`~netket.driver.AbstractDriver` (including how to support
36
+ checkpointing). The public name :class:`AbstractVariationalDriver` is
37
+ currently kept as a compatibility alias for this class.
37
38
  """
38
39
 
39
40
  _optimizer: Optimizer = struct.field(pytree_node=False, serialize=False)
@@ -29,7 +29,7 @@ from netket.utils.iterators import to_iterable
29
29
  from netket.utils.types import PyTree
30
30
  from netket.vqs import VariationalState, FullSumState
31
31
 
32
- from netket._src.callbacks.base import AbstractCallback, StopRun
32
+ from netket._src.callbacks.base import AbstractCallback, StopRun, RunFinished
33
33
  from netket._src.callbacks.observables import ObservableCallback
34
34
  from netket._src.callbacks.legacy_wrappers import (
35
35
  LegacyCallbackT,
@@ -85,13 +85,19 @@ class AbstractDriver(struct.Pytree, mutable=True):
85
85
  - :meth:`~netket.driver.AbstractDriver.reset_step` (optional):
86
86
  reset the sampler at the start of each step.
87
87
 
88
+ To support checkpointing, set every saved field in ``__init__``, with the
89
+ same structure, shapes and dtypes it will have after running, instead of
90
+ creating it at the first step. A checkpoint can then be restored into a
91
+ newly created driver. Values recomputed at every step should not be saved
92
+ (``serialize=False``, see :func:`netket.utils.struct.field`).
93
+
88
94
  """
89
95
 
90
96
  # Configuration fields, not very important
91
97
  _loss_name: str = struct.field(pytree_node=False, serialize=False)
92
98
 
93
99
  # Stuff to iterate the driver
94
- _loss_stats: Any = struct.field(serialize=True)
100
+ _loss_stats: Any = struct.field(serialize=False, default=None)
95
101
  _step_count: int = struct.field(serialize=True)
96
102
 
97
103
  # state of the driver
@@ -104,10 +110,13 @@ class AbstractDriver(struct.Pytree, mutable=True):
104
110
  # Internal caches (those could be removed in the future?)
105
111
  _dp: PyTree = struct.field(pytree_node=True, serialize=False)
106
112
 
107
- # Iterator caches
108
- # _step_start: int = struct.field(pytree_node=False, serialize=False, default=None)
109
- # _step_size: int = struct.field(pytree_node=False, serialize=False, default=1)
110
- # _step_end: int = struct.field(pytree_node=False, serialize=False, default=None)
113
+ # The steps at which the current (or last) call to `run` started and stops.
114
+ _start_step: int | None = struct.field(
115
+ pytree_node=False, serialize=False, default=None
116
+ )
117
+ _target_step: int | None = struct.field(
118
+ pytree_node=False, serialize=False, default=None
119
+ )
111
120
  _step_attempt: int = struct.field(pytree_node=False, serialize=False, default=0)
112
121
  _timer: timing.Timer = struct.field(pytree_node=False, serialize=False)
113
122
 
@@ -395,7 +404,8 @@ class AbstractDriver(struct.Pytree, mutable=True):
395
404
  without reading the json output.
396
405
 
397
406
  Args:
398
- n_iter: the total number of iterations to be performed during this run.
407
+ n_iter: the number of steps to run, counted from the step count when
408
+ `run` is called.
399
409
  out: A logger object, or an iterable of loggers, to be used to store simulation log and data.
400
410
  If this argument is a string, it will be used as output prefix for the standard JSON logger.
401
411
  obs: An iterable containing all observables that should be computed
@@ -434,14 +444,16 @@ class AbstractDriver(struct.Pytree, mutable=True):
434
444
  show_progress=show_progress,
435
445
  )
436
446
 
437
- # self._step_size = step_size
438
- # self._step_start = self.step_count
439
- # self._step_end = self.step_count + n_iter
447
+ # Fixed before `on_run_start`, so that a callback restoring `step_count`
448
+ # there (e.g. when resuming from a checkpoint) does not move the end of
449
+ # the run.
450
+ self._start_step = self.step_count
451
+ self._target_step = self.step_count + n_iter
440
452
 
441
453
  with timing.timed_scope(force=timeit) as timer:
442
454
  try:
443
455
  callbacks.on_run_start(self.step_count, self)
444
- for step in range(self.step_count, self.step_count + n_iter):
456
+ for step in range(self.step_count, self._target_step):
445
457
  self._step_attempt = 0
446
458
  step_log_data = {}
447
459
 
@@ -481,7 +493,11 @@ class AbstractDriver(struct.Pytree, mutable=True):
481
493
  callbacks.on_run_end(self.step_count, self)
482
494
  # If all processes did not raise StopRun, some will deadlock here.
483
495
  # This means you have a bug somewhere in YOUR code.
484
- if jax.process_count() > 1:
496
+ if isinstance(error, RunFinished):
497
+ # The run reached its end (e.g. the final time of a time
498
+ # evolution), it did not stop early.
499
+ pass
500
+ elif jax.process_count() > 1:
485
501
  print(
486
502
  f"[process {jax.process_index()}/{jax.process_count()}] "
487
503
  f"Stopping early because of : {error}"
@@ -22,6 +22,7 @@ from netket._src.driver.abstract_optimization_driver import (
22
22
  )
23
23
  from netket._src.ngd.sr_srt_common import sr, srt, get_samples_and_pdf
24
24
  from netket._src.ngd.srt_onthefly import srt_onthefly
25
+ from netket._src.driver.vmc_sr import _init_momentum_buffer
25
26
  from netket._src.nn.apply_operator.functional import make_logpsi_op_afun
26
27
  from netket._src.callbacks.auto_chunk_size import get_forward_operator
27
28
  from netket._src.observable.infidelity.expect import get_local_estimator
@@ -109,7 +110,7 @@ class Infidelity_SR(AbstractOptimizationDriver):
109
110
 
110
111
  # Serialized state
111
112
  _old_updates: PyTree = None
112
- info: Any | None = None
113
+ info: Any | None = struct.field(serialize=False, default=None)
113
114
  """
114
115
  PyTree to pass on information from the solver,e.g, the quadratic model.
115
116
  """
@@ -257,7 +258,11 @@ class Infidelity_SR(AbstractOptimizationDriver):
257
258
  _, unravel_params_fn = ravel_pytree(self.state.parameters)
258
259
  self._unravel_params_fn = jax.jit(unravel_params_fn)
259
260
 
260
- self._old_updates: PyTree = None
261
+ # Built here rather than at the first step, so that a freshly built
262
+ # driver can load it back from a checkpoint.
263
+ self._old_updates = _init_momentum_buffer(
264
+ self.state.parameters, self.momentum, self._on_the_fly
265
+ )
261
266
 
262
267
  # PyTree to pass on information from the solver, e.g, the quadratic model
263
268
  self.info = None
@@ -73,6 +73,37 @@ def VMC_SRt(
73
73
  )
74
74
 
75
75
 
76
+ # Number of lags used for the MCMC diagnostics accumulated across iterations.
77
+ _MCMC_DIAGNOSTICS_MAX_LAG = 32
78
+
79
+
80
+ def _init_momentum_buffer(parameters, momentum, on_the_fly):
81
+ """The zeros that the SPRING solvers would otherwise create at the first step."""
82
+ if momentum is None:
83
+ return None
84
+ params_real, _ = nkjax.tree_to_real(parameters)
85
+ buffer = jax.tree_util.tree_map(jnp.zeros_like, params_real)
86
+ if not on_the_fly:
87
+ buffer, _ = ravel_pytree(buffer)
88
+ return buffer
89
+
90
+
91
+ def _init_mcmc_diagnostics(state, hamiltonian, decay):
92
+ """The empty accumulator that online_statistics would create at the first step."""
93
+ # It must have the same dtype as the local energies.
94
+ log_psi = jax.eval_shape(
95
+ state._apply_fun,
96
+ state.variables,
97
+ state.hilbert.random_state(jax.random.key(0), 1),
98
+ )
99
+ return OnlineStats(
100
+ state.sampler.n_chains,
101
+ dtype=jnp.result_type(hamiltonian.dtype, log_psi.dtype),
102
+ decay=decay,
103
+ max_lag=_MCMC_DIAGNOSTICS_MAX_LAG,
104
+ )
105
+
106
+
76
107
  @reference(
77
108
  "Goldshlager2023Spring",
78
109
  condition="If using VMC_SR with momentum != 0",
@@ -247,7 +278,7 @@ class VMC_SR(AbstractOptimizationDriver):
247
278
 
248
279
  # Serialized state
249
280
  _old_updates: PyTree = None
250
- info: Any | None = None
281
+ info: Any | None = struct.field(serialize=False, default=None)
251
282
  """
252
283
  PyTree to pass on information from the solver,e.g, the quadratic model.
253
284
  """
@@ -410,7 +441,11 @@ class VMC_SR(AbstractOptimizationDriver):
410
441
  _, unravel_params_fn = ravel_pytree(self.state.parameters)
411
442
  self._unravel_params_fn = jax.jit(unravel_params_fn)
412
443
 
413
- self._old_updates: PyTree = None
444
+ # Built here rather than at the first step, so that a freshly built
445
+ # driver can load it back from a checkpoint.
446
+ self._old_updates = _init_momentum_buffer(
447
+ self.state.parameters, self.momentum, self._on_the_fly
448
+ )
414
449
 
415
450
  # PyTree to pass on information from the solver, e.g, the quadratic model
416
451
  self.info = None
@@ -429,6 +464,11 @@ class VMC_SR(AbstractOptimizationDriver):
429
464
  self._loss_stats_online = None
430
465
 
431
466
  decay = self._mcmc_convergence_diagnostics_ema_decay
467
+ if decay is not None:
468
+ # Built here so that a fresh driver can load it from a checkpoint.
469
+ self._loss_stats_online = _init_mcmc_diagnostics(
470
+ self.state, self._ham, decay
471
+ )
432
472
  if jax.process_index() == 0 and decay is not None:
433
473
  print(
434
474
  f"online_statistics: "
@@ -462,11 +502,16 @@ class VMC_SR(AbstractOptimizationDriver):
462
502
  # across different MCMC iterations with an exponential moving average.
463
503
  decay = self._mcmc_convergence_diagnostics_ema_decay
464
504
  if decay is not None:
505
+ old_estimator = self._loss_stats_online
506
+ # If it is still empty, rebuild it in case the number of samples
507
+ # or chains changed since the driver was built.
508
+ if old_estimator is not None and old_estimator.n_samples == 0:
509
+ old_estimator = None
465
510
  self._loss_stats_online = nkstats.online_statistics(
466
511
  local_energies,
467
- old_estimator=self._loss_stats_online,
512
+ old_estimator=old_estimator,
468
513
  decay=decay,
469
- max_lag=32,
514
+ max_lag=_MCMC_DIAGNOSTICS_MAX_LAG,
470
515
  )
471
516
 
472
517
  # Extract the hyperparameters which might be iteration dependent
@@ -41,7 +41,13 @@ def _compute_chunk_shape(value: np.ndarray, chunk_size: int | None) -> tuple[int
41
41
 
42
42
 
43
43
  def _append_dataset(root, value, data, *, chunk_size: int | None = None):
44
+ # ``np.asarray`` materialises ``value`` to host -- a collective when it is a
45
+ # sharded array, so every rank must reach it. ``data`` is ``None`` on
46
+ # non-master ranks (they hold no writer): they still materialise (to join
47
+ # the collective) but do not write. See HDF5Log.__call__.
44
48
  value = np.asarray(value)
49
+ if data is None:
50
+ return
45
51
  if root in data:
46
52
  f_value = data[root]
47
53
  f_value.resize(f_value.shape[0] + 1, axis=0)
@@ -100,7 +106,7 @@ def tree_log(tree, root, data, *, iter=None, chunk_size: int | None = None):
100
106
 
101
107
  class HDF5Log(AbstractCallback):
102
108
  r"""
103
- HDF5 Logger, that can be passed with keyword argument `logger` to Monte
109
+ HDF5 Logger, that can be passed with keyword argument `out` to Monte
104
110
  Carlo drivers in order to serialize the output data of the simulation.
105
111
 
106
112
  The logger has support for scalar numbers, NumPy/JAX arrays, and netket.stats.Stats objects.
@@ -117,7 +123,7 @@ class HDF5Log(AbstractCallback):
117
123
  inspecting the datasets as a dictionary, i.e. :code:`f['data/energy/Mean']`
118
124
 
119
125
  This class is a full :class:`~netket.callbacks.AbstractCallback` and can be passed
120
- either as ``out=logger`` *or* inside the ``callbacks=[..., logger]`` list.
126
+ either as ``out=logger`` *or* as ``callback=logger``.
121
127
 
122
128
  .. tip::
123
129
  Use the ``metadata`` argument to attach a flat dict of hyper-parameters
@@ -153,7 +159,7 @@ class HDF5Log(AbstractCallback):
153
159
  >>>
154
160
  >>> import netket as nk
155
161
  >>> logger = nk.logging.HDF5Log("output")
156
- >>> gs.run(n_iter=300, callbacks=[logger])
162
+ >>> gs.run(n_iter=300, callback=logger)
157
163
 
158
164
  .. note::
159
165
  The API of this logger is covered by our Semantic Versioning API guarantees. However, the structure of the
@@ -263,20 +269,19 @@ class HDF5Log(AbstractCallback):
263
269
  if self._writer is None:
264
270
  self._init_output_file()
265
271
 
266
- if self._is_master_process:
267
- tree_log(
268
- log_data,
269
- "data",
270
- self._writer,
271
- iter=step,
272
- chunk_size=self._chunk_size,
273
- )
272
+ tree_log(
273
+ log_data,
274
+ "data",
275
+ self._writer,
276
+ iter=step,
277
+ chunk_size=self._chunk_size,
278
+ )
274
279
 
275
280
  self._steps_notflushed_write += 1
276
281
  if self._steps_notflushed_write >= self._write_every:
277
282
  self.flush()
278
283
 
279
- def flush(self):
284
+ def flush(self, variational_state=None):
280
285
  """Writes buffered data to disk."""
281
286
  if self._writer is not None:
282
287
  self._writer.flush()