NetKet 3.12.0__tar.gz → 3.12.2__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 (321) hide show
  1. {netket-3.12.0 → netket-3.12.2}/PKG-INFO +3 -3
  2. {netket-3.12.0 → netket-3.12.2}/netket/_version.py +2 -2
  3. {netket-3.12.0 → netket-3.12.2}/netket/experimental/driver/vmc_srt.py +5 -0
  4. {netket-3.12.0 → netket-3.12.2}/netket/jax/_utils_random.py +20 -7
  5. {netket-3.12.0 → netket-3.12.2}/netket/jax/sharding.py +6 -2
  6. {netket-3.12.0 → netket-3.12.2}/netket/logging/json_log.py +1 -1
  7. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/preconditioner.py +16 -9
  8. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/sr.py +6 -8
  9. {netket-3.12.0 → netket-3.12.2}/netket/sampler/metropolis_numpy.py +4 -3
  10. {netket-3.12.0 → netket-3.12.2}/netket/utils/mpi/gpu_autorank_util.py +2 -2
  11. {netket-3.12.0 → netket-3.12.2}/netket/utils/mpi/primitives.py +9 -3
  12. {netket-3.12.0 → netket-3.12.2}/netket/utils/seed.py +1 -1
  13. {netket-3.12.0 → netket-3.12.2}/netket/utils/struct/fields.py +4 -2
  14. {netket-3.12.0 → netket-3.12.2}/netket/utils/struct/pytree.py +81 -11
  15. {netket-3.12.0 → netket-3.12.2}/pyproject.toml +2 -2
  16. {netket-3.12.0 → netket-3.12.2}/.gitignore +0 -0
  17. {netket-3.12.0 → netket-3.12.2}/LICENSE +0 -0
  18. {netket-3.12.0 → netket-3.12.2}/README.md +0 -0
  19. {netket-3.12.0 → netket-3.12.2}/netket/__init__.py +0 -0
  20. {netket-3.12.0 → netket-3.12.2}/netket/callbacks/__init__.py +0 -0
  21. {netket-3.12.0 → netket-3.12.2}/netket/callbacks/convergence_stopping.py +0 -0
  22. {netket-3.12.0 → netket-3.12.2}/netket/callbacks/earlystopping.py +0 -0
  23. {netket-3.12.0 → netket-3.12.2}/netket/callbacks/invalidlossstopping.py +0 -0
  24. {netket-3.12.0 → netket-3.12.2}/netket/callbacks/timeout.py +0 -0
  25. {netket-3.12.0 → netket-3.12.2}/netket/driver/__init__.py +0 -0
  26. {netket-3.12.0 → netket-3.12.2}/netket/driver/abstract_variational_driver.py +0 -0
  27. {netket-3.12.0 → netket-3.12.2}/netket/driver/steady_state.py +0 -0
  28. {netket-3.12.0 → netket-3.12.2}/netket/driver/vmc.py +0 -0
  29. {netket-3.12.0 → netket-3.12.2}/netket/driver/vmc_common.py +0 -0
  30. {netket-3.12.0 → netket-3.12.2}/netket/errors.py +0 -0
  31. {netket-3.12.0 → netket-3.12.2}/netket/exact.py +0 -0
  32. {netket-3.12.0 → netket-3.12.2}/netket/experimental/__init__.py +0 -0
  33. {netket-3.12.0 → netket-3.12.2}/netket/experimental/driver/__init__.py +0 -0
  34. {netket-3.12.0 → netket-3.12.2}/netket/experimental/driver/tdvp.py +0 -0
  35. {netket-3.12.0 → netket-3.12.2}/netket/experimental/driver/tdvp_common.py +0 -0
  36. {netket-3.12.0 → netket-3.12.2}/netket/experimental/driver/tdvp_schmitt.py +0 -0
  37. {netket-3.12.0 → netket-3.12.2}/netket/experimental/dynamics/__init__.py +0 -0
  38. {netket-3.12.0 → netket-3.12.2}/netket/experimental/dynamics/_rk_solver.py +0 -0
  39. {netket-3.12.0 → netket-3.12.2}/netket/experimental/dynamics/_rk_solver_structures.py +0 -0
  40. {netket-3.12.0 → netket-3.12.2}/netket/experimental/dynamics/_rk_tableau.py +0 -0
  41. {netket-3.12.0 → netket-3.12.2}/netket/experimental/hilbert/__init__.py +0 -0
  42. {netket-3.12.0 → netket-3.12.2}/netket/experimental/hilbert/spin_orbital_fermions.py +0 -0
  43. {netket-3.12.0 → netket-3.12.2}/netket/experimental/logging/__init__.py +0 -0
  44. {netket-3.12.0 → netket-3.12.2}/netket/experimental/logging/hdf5_log.py +0 -0
  45. {netket-3.12.0 → netket-3.12.2}/netket/experimental/models/__init__.py +0 -0
  46. {netket-3.12.0 → netket-3.12.2}/netket/experimental/models/fast_rnn.py +0 -0
  47. {netket-3.12.0 → netket-3.12.2}/netket/experimental/models/rnn.py +0 -0
  48. {netket-3.12.0 → netket-3.12.2}/netket/experimental/nn/__init__.py +0 -0
  49. {netket-3.12.0 → netket-3.12.2}/netket/experimental/nn/rnn/__init__.py +0 -0
  50. {netket-3.12.0 → netket-3.12.2}/netket/experimental/nn/rnn/cells.py +0 -0
  51. {netket-3.12.0 → netket-3.12.2}/netket/experimental/nn/rnn/layers.py +0 -0
  52. {netket-3.12.0 → netket-3.12.2}/netket/experimental/nn/rnn/layers_fast.py +0 -0
  53. {netket-3.12.0 → netket-3.12.2}/netket/experimental/nn/rnn/ordering.py +0 -0
  54. {netket-3.12.0 → netket-3.12.2}/netket/experimental/observable/__init__.py +0 -0
  55. {netket-3.12.0 → netket-3.12.2}/netket/experimental/observable/renyi2/S2_operator.py +0 -0
  56. {netket-3.12.0 → netket-3.12.2}/netket/experimental/observable/renyi2/__init__.py +0 -0
  57. {netket-3.12.0 → netket-3.12.2}/netket/experimental/observable/renyi2/exact.py +0 -0
  58. {netket-3.12.0 → netket-3.12.2}/netket/experimental/observable/renyi2/expect.py +0 -0
  59. {netket-3.12.0 → netket-3.12.2}/netket/experimental/operator/__init__.py +0 -0
  60. {netket-3.12.0 → netket-3.12.2}/netket/experimental/operator/_fermion_operator_2nd_base.py +0 -0
  61. {netket-3.12.0 → netket-3.12.2}/netket/experimental/operator/_fermion_operator_2nd_jax.py +0 -0
  62. {netket-3.12.0 → netket-3.12.2}/netket/experimental/operator/_fermion_operator_2nd_numba.py +0 -0
  63. {netket-3.12.0 → netket-3.12.2}/netket/experimental/operator/_fermion_operator_2nd_utils.py +0 -0
  64. {netket-3.12.0 → netket-3.12.2}/netket/experimental/operator/fermion.py +0 -0
  65. {netket-3.12.0 → netket-3.12.2}/netket/experimental/operator/pyscf.py +0 -0
  66. {netket-3.12.0 → netket-3.12.2}/netket/experimental/qsr/__init__.py +0 -0
  67. {netket-3.12.0 → netket-3.12.2}/netket/experimental/qsr/dataset.py +0 -0
  68. {netket-3.12.0 → netket-3.12.2}/netket/experimental/qsr/driver.py +0 -0
  69. {netket-3.12.0 → netket-3.12.2}/netket/experimental/qsr/logic_helpers.py +0 -0
  70. {netket-3.12.0 → netket-3.12.2}/netket/experimental/sampler/__init__.py +0 -0
  71. {netket-3.12.0 → netket-3.12.2}/netket/experimental/sampler/metropolis.py +0 -0
  72. {netket-3.12.0 → netket-3.12.2}/netket/experimental/sampler/metropolis_pmap.py +0 -0
  73. {netket-3.12.0 → netket-3.12.2}/netket/experimental/sampler/metropolis_pt.py +0 -0
  74. {netket-3.12.0 → netket-3.12.2}/netket/experimental/sampler/rules/__init__.py +0 -0
  75. {netket-3.12.0 → netket-3.12.2}/netket/experimental/sampler/rules/fermion_2nd.py +0 -0
  76. {netket-3.12.0 → netket-3.12.2}/netket/experimental/vqs/__init__.py +0 -0
  77. {netket-3.12.0 → netket-3.12.2}/netket/experimental/vqs/io.py +0 -0
  78. {netket-3.12.0 → netket-3.12.2}/netket/graph/__init__.py +0 -0
  79. {netket-3.12.0 → netket-3.12.2}/netket/graph/_lattice_edge_logic.py +0 -0
  80. {netket-3.12.0 → netket-3.12.2}/netket/graph/abstract_graph.py +0 -0
  81. {netket-3.12.0 → netket-3.12.2}/netket/graph/common_lattices.py +0 -0
  82. {netket-3.12.0 → netket-3.12.2}/netket/graph/graph.py +0 -0
  83. {netket-3.12.0 → netket-3.12.2}/netket/graph/lattice.py +0 -0
  84. {netket-3.12.0 → netket-3.12.2}/netket/graph/space_group.py +0 -0
  85. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/__init__.py +0 -0
  86. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/abstract_hilbert.py +0 -0
  87. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/continuous_hilbert.py +0 -0
  88. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/custom_hilbert.py +0 -0
  89. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/discrete_hilbert.py +0 -0
  90. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/doubled_hilbert.py +0 -0
  91. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/fock.py +0 -0
  92. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/homogeneous.py +0 -0
  93. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/index/__init__.py +0 -0
  94. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/index/base.py +0 -0
  95. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/index/constraints/__init__.py +0 -0
  96. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/index/constraints/base.py +0 -0
  97. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/index/constraints/sum.py +0 -0
  98. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/index/unconstrained.py +0 -0
  99. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/index/uniform_tensor.py +0 -0
  100. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/particle.py +0 -0
  101. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/qubit.py +0 -0
  102. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/__init__.py +0 -0
  103. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/base.py +0 -0
  104. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/custom.py +0 -0
  105. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/doubled.py +0 -0
  106. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/fock.py +0 -0
  107. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/particle.py +0 -0
  108. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/qubit.py +0 -0
  109. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/spin.py +0 -0
  110. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/random/tensor_hilbert.py +0 -0
  111. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/spin.py +0 -0
  112. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/tensor_hilbert.py +0 -0
  113. {netket-3.12.0 → netket-3.12.2}/netket/hilbert/tensor_hilbert_discrete.py +0 -0
  114. {netket-3.12.0 → netket-3.12.2}/netket/jax/__init__.py +0 -0
  115. {netket-3.12.0 → netket-3.12.2}/netket/jax/_chunk_utils.py +0 -0
  116. {netket-3.12.0 → netket-3.12.2}/netket/jax/_expect.py +0 -0
  117. {netket-3.12.0 → netket-3.12.2}/netket/jax/_grad.py +0 -0
  118. {netket-3.12.0 → netket-3.12.2}/netket/jax/_jacobian/__init__.py +0 -0
  119. {netket-3.12.0 → netket-3.12.2}/netket/jax/_jacobian/default_mode.py +0 -0
  120. {netket-3.12.0 → netket-3.12.2}/netket/jax/_jacobian/jacobian_dense.py +0 -0
  121. {netket-3.12.0 → netket-3.12.2}/netket/jax/_jacobian/jacobian_pytree.py +0 -0
  122. {netket-3.12.0 → netket-3.12.2}/netket/jax/_jacobian/logic.py +0 -0
  123. {netket-3.12.0 → netket-3.12.2}/netket/jax/_math.py +0 -0
  124. {netket-3.12.0 → netket-3.12.2}/netket/jax/_scanmap.py +0 -0
  125. {netket-3.12.0 → netket-3.12.2}/netket/jax/_sort.py +0 -0
  126. {netket-3.12.0 → netket-3.12.2}/netket/jax/_utils_dtype.py +0 -0
  127. {netket-3.12.0 → netket-3.12.2}/netket/jax/_utils_tree.py +0 -0
  128. {netket-3.12.0 → netket-3.12.2}/netket/jax/_vjp.py +0 -0
  129. {netket-3.12.0 → netket-3.12.2}/netket/jax/_vjp_chunked.py +0 -0
  130. {netket-3.12.0 → netket-3.12.2}/netket/jax/_vmap_chunked.py +0 -0
  131. {netket-3.12.0 → netket-3.12.2}/netket/logging/__init__.py +0 -0
  132. {netket-3.12.0 → netket-3.12.2}/netket/logging/base.py +0 -0
  133. {netket-3.12.0 → netket-3.12.2}/netket/logging/runtime_log.py +0 -0
  134. {netket-3.12.0 → netket-3.12.2}/netket/logging/state_log.py +0 -0
  135. {netket-3.12.0 → netket-3.12.2}/netket/logging/tensorboard.py +0 -0
  136. {netket-3.12.0 → netket-3.12.2}/netket/models/README.md +0 -0
  137. {netket-3.12.0 → netket-3.12.2}/netket/models/__init__.py +0 -0
  138. {netket-3.12.0 → netket-3.12.2}/netket/models/autoreg.py +0 -0
  139. {netket-3.12.0 → netket-3.12.2}/netket/models/deepset.py +0 -0
  140. {netket-3.12.0 → netket-3.12.2}/netket/models/equivariant.py +0 -0
  141. {netket-3.12.0 → netket-3.12.2}/netket/models/fast_autoreg.py +0 -0
  142. {netket-3.12.0 → netket-3.12.2}/netket/models/full_space.py +0 -0
  143. {netket-3.12.0 → netket-3.12.2}/netket/models/gaussian.py +0 -0
  144. {netket-3.12.0 → netket-3.12.2}/netket/models/jastrow.py +0 -0
  145. {netket-3.12.0 → netket-3.12.2}/netket/models/mlp.py +0 -0
  146. {netket-3.12.0 → netket-3.12.2}/netket/models/ndm.py +0 -0
  147. {netket-3.12.0 → netket-3.12.2}/netket/models/rbm.py +0 -0
  148. {netket-3.12.0 → netket-3.12.2}/netket/models/slater.py +0 -0
  149. {netket-3.12.0 → netket-3.12.2}/netket/models/tensor_networks/__init__.py +0 -0
  150. {netket-3.12.0 → netket-3.12.2}/netket/models/tensor_networks/mpdo.py +0 -0
  151. {netket-3.12.0 → netket-3.12.2}/netket/models/tensor_networks/mps.py +0 -0
  152. {netket-3.12.0 → netket-3.12.2}/netket/models/utils.py +0 -0
  153. {netket-3.12.0 → netket-3.12.2}/netket/nn/__init__.py +0 -0
  154. {netket-3.12.0 → netket-3.12.2}/netket/nn/activation.py +0 -0
  155. {netket-3.12.0 → netket-3.12.2}/netket/nn/blocks/__init__.py +0 -0
  156. {netket-3.12.0 → netket-3.12.2}/netket/nn/blocks/deepset.py +0 -0
  157. {netket-3.12.0 → netket-3.12.2}/netket/nn/blocks/mlp.py +0 -0
  158. {netket-3.12.0 → netket-3.12.2}/netket/nn/blocks/symmetry_sum.py +0 -0
  159. {netket-3.12.0 → netket-3.12.2}/netket/nn/deprecation.py +0 -0
  160. {netket-3.12.0 → netket-3.12.2}/netket/nn/fast_masked_linear.py +0 -0
  161. {netket-3.12.0 → netket-3.12.2}/netket/nn/initializers.py +0 -0
  162. {netket-3.12.0 → netket-3.12.2}/netket/nn/masked_linear.py +0 -0
  163. {netket-3.12.0 → netket-3.12.2}/netket/nn/symmetric_linear.py +0 -0
  164. {netket-3.12.0 → netket-3.12.2}/netket/nn/utils.py +0 -0
  165. {netket-3.12.0 → netket-3.12.2}/netket/operator/__init__.py +0 -0
  166. {netket-3.12.0 → netket-3.12.2}/netket/operator/_abstract_observable.py +0 -0
  167. {netket-3.12.0 → netket-3.12.2}/netket/operator/_abstract_operator.py +0 -0
  168. {netket-3.12.0 → netket-3.12.2}/netket/operator/_abstract_super_operator.py +0 -0
  169. {netket-3.12.0 → netket-3.12.2}/netket/operator/_bose_hubbard/__init__.py +0 -0
  170. {netket-3.12.0 → netket-3.12.2}/netket/operator/_bose_hubbard/base.py +0 -0
  171. {netket-3.12.0 → netket-3.12.2}/netket/operator/_bose_hubbard/jax.py +0 -0
  172. {netket-3.12.0 → netket-3.12.2}/netket/operator/_bose_hubbard/numba.py +0 -0
  173. {netket-3.12.0 → netket-3.12.2}/netket/operator/_continuous_operator.py +0 -0
  174. {netket-3.12.0 → netket-3.12.2}/netket/operator/_discrete_operator.py +0 -0
  175. {netket-3.12.0 → netket-3.12.2}/netket/operator/_discrete_operator_jax.py +0 -0
  176. {netket-3.12.0 → netket-3.12.2}/netket/operator/_graph_operator.py +0 -0
  177. {netket-3.12.0 → netket-3.12.2}/netket/operator/_hamiltonian.py +0 -0
  178. {netket-3.12.0 → netket-3.12.2}/netket/operator/_heisenberg.py +0 -0
  179. {netket-3.12.0 → netket-3.12.2}/netket/operator/_ising/__init__.py +0 -0
  180. {netket-3.12.0 → netket-3.12.2}/netket/operator/_ising/base.py +0 -0
  181. {netket-3.12.0 → netket-3.12.2}/netket/operator/_ising/jax.py +0 -0
  182. {netket-3.12.0 → netket-3.12.2}/netket/operator/_ising/numba.py +0 -0
  183. {netket-3.12.0 → netket-3.12.2}/netket/operator/_kinetic.py +0 -0
  184. {netket-3.12.0 → netket-3.12.2}/netket/operator/_lazy.py +0 -0
  185. {netket-3.12.0 → netket-3.12.2}/netket/operator/_local_liouvillian.py +0 -0
  186. {netket-3.12.0 → netket-3.12.2}/netket/operator/_local_operator/__init__.py +0 -0
  187. {netket-3.12.0 → netket-3.12.2}/netket/operator/_local_operator/base.py +0 -0
  188. {netket-3.12.0 → netket-3.12.2}/netket/operator/_local_operator/compile_helpers.py +0 -0
  189. {netket-3.12.0 → netket-3.12.2}/netket/operator/_local_operator/convert.py +0 -0
  190. {netket-3.12.0 → netket-3.12.2}/netket/operator/_local_operator/helpers.py +0 -0
  191. {netket-3.12.0 → netket-3.12.2}/netket/operator/_local_operator/jax.py +0 -0
  192. {netket-3.12.0 → netket-3.12.2}/netket/operator/_local_operator/numba.py +0 -0
  193. {netket-3.12.0 → netket-3.12.2}/netket/operator/_pauli_strings/__init__.py +0 -0
  194. {netket-3.12.0 → netket-3.12.2}/netket/operator/_pauli_strings/base.py +0 -0
  195. {netket-3.12.0 → netket-3.12.2}/netket/operator/_pauli_strings/jax.py +0 -0
  196. {netket-3.12.0 → netket-3.12.2}/netket/operator/_pauli_strings/numba.py +0 -0
  197. {netket-3.12.0 → netket-3.12.2}/netket/operator/_potential.py +0 -0
  198. {netket-3.12.0 → netket-3.12.2}/netket/operator/_sumoperators.py +0 -0
  199. {netket-3.12.0 → netket-3.12.2}/netket/operator/boson.py +0 -0
  200. {netket-3.12.0 → netket-3.12.2}/netket/operator/spin.py +0 -0
  201. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/__init__.py +0 -0
  202. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/linear_operator.py +0 -0
  203. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/__init__.py +0 -0
  204. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/common.py +0 -0
  205. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/default.py +0 -0
  206. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/qgt_jacobian_common.py +0 -0
  207. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/qgt_jacobian_dense.py +0 -0
  208. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/qgt_jacobian_pytree.py +0 -0
  209. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/qgt_jacobian_pytree_logic.py +0 -0
  210. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/qgt_onthefly.py +0 -0
  211. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/qgt/qgt_onthefly_logic.py +0 -0
  212. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/solver/__init__.py +0 -0
  213. {netket-3.12.0 → netket-3.12.2}/netket/optimizer/solver/solvers.py +0 -0
  214. {netket-3.12.0 → netket-3.12.2}/netket/sampler/__init__.py +0 -0
  215. {netket-3.12.0 → netket-3.12.2}/netket/sampler/autoreg.py +0 -0
  216. {netket-3.12.0 → netket-3.12.2}/netket/sampler/base.py +0 -0
  217. {netket-3.12.0 → netket-3.12.2}/netket/sampler/exact.py +0 -0
  218. {netket-3.12.0 → netket-3.12.2}/netket/sampler/metropolis.py +0 -0
  219. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/__init__.py +0 -0
  220. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/base.py +0 -0
  221. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/continuous_gaussian.py +0 -0
  222. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/custom_numpy.py +0 -0
  223. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/exchange.py +0 -0
  224. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/fixed.py +0 -0
  225. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/hamiltonian.py +0 -0
  226. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/hamiltonian_numpy.py +0 -0
  227. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/langevin.py +0 -0
  228. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/local.py +0 -0
  229. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/local_numpy.py +0 -0
  230. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/multiple.py +0 -0
  231. {netket-3.12.0 → netket-3.12.2}/netket/sampler/rules/tensor.py +0 -0
  232. {netket-3.12.0 → netket-3.12.2}/netket/stats/__init__.py +0 -0
  233. {netket-3.12.0 → netket-3.12.2}/netket/stats/_autocorr.py +0 -0
  234. {netket-3.12.0 → netket-3.12.2}/netket/stats/mc_stats.py +0 -0
  235. {netket-3.12.0 → netket-3.12.2}/netket/stats/mc_stats_old.py +0 -0
  236. {netket-3.12.0 → netket-3.12.2}/netket/stats/mpi_stats.py +0 -0
  237. {netket-3.12.0 → netket-3.12.2}/netket/tools/__init__.py +0 -0
  238. {netket-3.12.0 → netket-3.12.2}/netket/tools/_common.py +0 -0
  239. {netket-3.12.0 → netket-3.12.2}/netket/tools/_cpu_info.py +0 -0
  240. {netket-3.12.0 → netket-3.12.2}/netket/tools/_mpi_info.py +0 -0
  241. {netket-3.12.0 → netket-3.12.2}/netket/tools/check_mpi.py +0 -0
  242. {netket-3.12.0 → netket-3.12.2}/netket/tools/info.py +0 -0
  243. {netket-3.12.0 → netket-3.12.2}/netket/utils/__init__.py +0 -0
  244. {netket-3.12.0 → netket-3.12.2}/netket/utils/_dependencies_check.py +0 -0
  245. {netket-3.12.0 → netket-3.12.2}/netket/utils/array.py +0 -0
  246. {netket-3.12.0 → netket-3.12.2}/netket/utils/config_flags.py +0 -0
  247. {netket-3.12.0 → netket-3.12.2}/netket/utils/deprecation.py +0 -0
  248. {netket-3.12.0 → netket-3.12.2}/netket/utils/dispatch.py +0 -0
  249. {netket-3.12.0 → netket-3.12.2}/netket/utils/display/__init__.py +0 -0
  250. {netket-3.12.0 → netket-3.12.2}/netket/utils/display/repr.py +0 -0
  251. {netket-3.12.0 → netket-3.12.2}/netket/utils/float.py +0 -0
  252. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/__init__.py +0 -0
  253. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/_group.py +0 -0
  254. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/_permutation_group.py +0 -0
  255. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/_point_group.py +0 -0
  256. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/_semigroup.py +0 -0
  257. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/axial.py +0 -0
  258. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/cubic.py +0 -0
  259. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/icosa.py +0 -0
  260. {netket-3.12.0 → netket-3.12.2}/netket/utils/group/planar.py +0 -0
  261. {netket-3.12.0 → netket-3.12.2}/netket/utils/history.py +0 -0
  262. {netket-3.12.0 → netket-3.12.2}/netket/utils/holomorphic.py +0 -0
  263. {netket-3.12.0 → netket-3.12.2}/netket/utils/jax.py +0 -0
  264. {netket-3.12.0 → netket-3.12.2}/netket/utils/model_frameworks/__init__.py +0 -0
  265. {netket-3.12.0 → netket-3.12.2}/netket/utils/model_frameworks/base.py +0 -0
  266. {netket-3.12.0 → netket-3.12.2}/netket/utils/model_frameworks/flax.py +0 -0
  267. {netket-3.12.0 → netket-3.12.2}/netket/utils/model_frameworks/haiku.py +0 -0
  268. {netket-3.12.0 → netket-3.12.2}/netket/utils/model_frameworks/jax.py +0 -0
  269. {netket-3.12.0 → netket-3.12.2}/netket/utils/moduletools.py +0 -0
  270. {netket-3.12.0 → netket-3.12.2}/netket/utils/mpi/__init__.py +0 -0
  271. {netket-3.12.0 → netket-3.12.2}/netket/utils/mpi/mpi.py +0 -0
  272. {netket-3.12.0 → netket-3.12.2}/netket/utils/numbers.py +0 -0
  273. {netket-3.12.0 → netket-3.12.2}/netket/utils/optional_deps.py +0 -0
  274. {netket-3.12.0 → netket-3.12.2}/netket/utils/partial.py +0 -0
  275. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/__init__.py +0 -0
  276. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/_version.py +0 -0
  277. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/alias.py +0 -0
  278. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/autoreload.py +0 -0
  279. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/dispatcher.py +0 -0
  280. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/function.py +0 -0
  281. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/method.py +0 -0
  282. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/overload.py +0 -0
  283. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/parametric.py +0 -0
  284. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/promotion.py +0 -0
  285. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/py.typed +0 -0
  286. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/repr.py +0 -0
  287. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/resolver.py +0 -0
  288. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/signature.py +0 -0
  289. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/type.py +0 -0
  290. {netket-3.12.0 → netket-3.12.2}/netket/utils/plum/util.py +0 -0
  291. {netket-3.12.0 → netket-3.12.2}/netket/utils/static_number.py +0 -0
  292. {netket-3.12.0 → netket-3.12.2}/netket/utils/static_range.py +0 -0
  293. {netket-3.12.0 → netket-3.12.2}/netket/utils/struct/__init__.py +0 -0
  294. {netket-3.12.0 → netket-3.12.2}/netket/utils/struct/dataclass.py +0 -0
  295. {netket-3.12.0 → netket-3.12.2}/netket/utils/struct/utils.py +0 -0
  296. {netket-3.12.0 → netket-3.12.2}/netket/utils/summation.py +0 -0
  297. {netket-3.12.0 → netket-3.12.2}/netket/utils/timing.py +0 -0
  298. {netket-3.12.0 → netket-3.12.2}/netket/utils/types.py +0 -0
  299. {netket-3.12.0 → netket-3.12.2}/netket/utils/version_check.py +0 -0
  300. {netket-3.12.0 → netket-3.12.2}/netket/vqs/__init__.py +0 -0
  301. {netket-3.12.0 → netket-3.12.2}/netket/vqs/base.py +0 -0
  302. {netket-3.12.0 → netket-3.12.2}/netket/vqs/deprecated.py +0 -0
  303. {netket-3.12.0 → netket-3.12.2}/netket/vqs/experimental.py +0 -0
  304. {netket-3.12.0 → netket-3.12.2}/netket/vqs/full_summ/__init__.py +0 -0
  305. {netket-3.12.0 → netket-3.12.2}/netket/vqs/full_summ/expect.py +0 -0
  306. {netket-3.12.0 → netket-3.12.2}/netket/vqs/full_summ/state.py +0 -0
  307. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/__init__.py +0 -0
  308. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/common.py +0 -0
  309. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/kernels.py +0 -0
  310. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_mixed_state/__init__.py +0 -0
  311. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_mixed_state/expect.py +0 -0
  312. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_mixed_state/expect_chunked.py +0 -0
  313. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_mixed_state/state.py +0 -0
  314. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_state/__init__.py +0 -0
  315. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_state/expect.py +0 -0
  316. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_state/expect_chunked.py +0 -0
  317. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_state/expect_forces.py +0 -0
  318. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_state/expect_forces_chunked.py +0 -0
  319. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_state/expect_grad.py +0 -0
  320. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_state/expect_grad_chunked.py +0 -0
  321. {netket-3.12.0 → netket-3.12.2}/netket/vqs/mc/mc_state/state.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: NetKet
3
- Version: 3.12.0
3
+ Version: 3.12.2
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/#
@@ -25,7 +25,7 @@ Requires-Dist: igraph<0.12.0,>=0.10.0
25
25
  Requires-Dist: jax<0.5,>=0.4.16
26
26
  Requires-Dist: jaxlib<0.5,>=0.4.16
27
27
  Requires-Dist: numba4jax<0.1,>=0.0.10.post1
28
- Requires-Dist: numba<0.60,>=0.52
28
+ Requires-Dist: numba<0.61,>=0.52
29
29
  Requires-Dist: numpy~=1.20
30
30
  Requires-Dist: optax<0.3,>=0.1.3
31
31
  Requires-Dist: orjson<4,>=3.4
@@ -63,7 +63,7 @@ Requires-Dist: openfermion>=1.0.0; extra == 'extra'
63
63
  Requires-Dist: qutip>=4; extra == 'extra'
64
64
  Requires-Dist: tensorboardx>=2.0.0; extra == 'extra'
65
65
  Provides-Extra: mpi
66
- Requires-Dist: mpi4jax<0.5,>=0.3.9; extra == 'mpi'
66
+ Requires-Dist: mpi4jax<0.6,>=0.3.9; extra == 'mpi'
67
67
  Requires-Dist: mpi4py<4,>=3.0.1; extra == 'mpi'
68
68
  Provides-Extra: pyscf
69
69
  Requires-Dist: pyscf>=2.0; extra == 'pyscf'
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '3.12.0'
16
- __version_tuple__ = version_tuple = (3, 12, 0)
15
+ __version__ = version = '3.12.2'
16
+ __version_tuple__ = version_tuple = (3, 12, 2)
@@ -90,6 +90,11 @@ def SRt(
90
90
  matrix_side
91
91
  ) # * shift diagonal regularization
92
92
  aus_vector = solver_fn(matrix, dv)
93
+ # some solvers return a tuple, some others do not.
94
+ # We check and try to support both
95
+ if isinstance(aus_vector, tuple):
96
+ aus_vector, _ = aus_vector
97
+
93
98
  aus_vector = aus_vector.reshape(mpi.n_nodes, -1)
94
99
  aus_vector, token = mpi.mpi_scatter_jax(aus_vector, token=token)
95
100
  else:
@@ -17,7 +17,7 @@ from typing import Optional
17
17
 
18
18
  import jax
19
19
 
20
- from netket.utils import random_seed, mpi
20
+ from netket.utils import random_seed, mpi, config
21
21
  from netket.utils.mpi import MPI_jax_comm
22
22
  from netket.utils.types import PRNGKeyT, SeedT
23
23
 
@@ -30,16 +30,29 @@ def PRNGKey(
30
30
  The same seed will be distributed to all processes.
31
31
  """
32
32
  if seed is None:
33
- key = jax.random.PRNGKey(random_seed())
34
- elif isinstance(seed, int):
33
+ seed = random_seed()
34
+
35
+ if isinstance(seed, int):
36
+ # We can't sync the PRNGKey, so we can only sinc integer seeds
37
+ # see https://github.com/google/jax/pull/16511
38
+ if config.netket_experimental_sharding and jax.process_count() > 1:
39
+ # TODO: use stable jax function
40
+ from jax.experimental import multihost_utils
41
+
42
+ seed = int(
43
+ multihost_utils.broadcast_one_to_all(
44
+ seed, is_source=jax.process_index() == root
45
+ ).item()
46
+ )
47
+
35
48
  key = jax.random.PRNGKey(seed)
36
49
  else:
37
50
  key = seed
38
51
 
39
- key = jax.tree_util.tree_map(
40
- lambda k: mpi.mpi_bcast_jax(k, root=root, comm=comm)[0], key
41
- )
42
-
52
+ if not config.netket_experimental_sharding:
53
+ key = jax.tree_util.tree_map(
54
+ lambda k: mpi.mpi_bcast_jax(k, root=root, comm=comm)[0], key
55
+ )
43
56
  return key
44
57
 
45
58
 
@@ -283,13 +283,17 @@ def gather(x):
283
283
  elif isinstance(x.sharding, jax.sharding.GSPMDSharding):
284
284
  # x.sharding.device_set has arbitrary order
285
285
  # Hardcode all devices until I figure out a way to deduce the order from x
286
- out_shardings = PositionalSharding(jax.devices()).replicate()
286
+ out_shardings = (
287
+ PositionalSharding(jax.devices()).replicate().reshape((1,) * x.ndim)
288
+ )
289
+ # TODO support gspmdsharding in numba wrapper and use this
287
290
  # out_shardings = x.sharding.get_replicated(jax.devices())
288
291
  elif isinstance(x.sharding, PositionalSharding):
289
292
  out_shardings = x.sharding.replicate()
290
293
  else:
291
294
  raise NotImplementedError(
292
- f"Gather is only compatible with PositionalSharding, but array has {x.sharding} Please open a feature request."
295
+ "Gather is only compatible with PositionalSharding and GSPMDSharding,"
296
+ f" but array has {x.sharding}. Please open a feature request."
293
297
  )
294
298
  return jax.jit(_identity, out_shardings=out_shardings)(x)
295
299
  # TODO support gspmdsharding in numba wrapper and use this
@@ -208,7 +208,7 @@ class JsonLog(RuntimeLog):
208
208
  if self._steps_notflushed_write > 0:
209
209
  self.flush()
210
210
  if hasattr(self, "_steps_notflushed_pars"):
211
- if self._steps_notflushed_pars > 0:
211
+ if self._steps_notflushed_pars > 0 and self._save_params:
212
212
  self.flush()
213
213
 
214
214
  def __repr__(self):
@@ -15,11 +15,10 @@
15
15
  from typing import Callable, Optional, Any
16
16
 
17
17
  import abc
18
- from dataclasses import dataclass
19
18
  from textwrap import dedent
20
19
 
21
20
  from netket.utils.types import PyTree, Scalar
22
- from netket.utils import warn_deprecation, timing
21
+ from netket.utils import warn_deprecation, timing, struct
23
22
  from netket.vqs import VariationalState
24
23
 
25
24
  from .linear_operator import LinearOperator, SolverT
@@ -43,8 +42,7 @@ def identity_preconditioner(
43
42
  return gradient
44
43
 
45
44
 
46
- @dataclass
47
- class AbstractLinearPreconditioner:
45
+ class AbstractLinearPreconditioner(struct.Pytree, mutable=True):
48
46
  """Base class for a Linear Preconditioner solving a system :math:`Sx = F`.
49
47
 
50
48
  A LinearPreconditioner modifies the gradient :math:`F` in such a way that the new
@@ -66,7 +64,7 @@ class AbstractLinearPreconditioner:
66
64
 
67
65
  """
68
66
 
69
- solver: SolverT
67
+ solver: SolverT = struct.field(serialize=False)
70
68
  """Function used to solve the linear system."""
71
69
 
72
70
  solver_restart: bool = False
@@ -76,13 +74,23 @@ class AbstractLinearPreconditioner:
76
74
  x0: Optional[PyTree] = None
77
75
  """Solution of the last linear system solved."""
78
76
 
79
- info: Any = None
77
+ info: Any = struct.field(serialize=False, default=None)
80
78
  """Additional information returned by the solver when solving the last linear system."""
81
79
 
82
- _lhs: LinearOperator = None
80
+ _lhs: LinearOperator = struct.field(serialize=False, default=None)
83
81
  """LHS of the last linear system solved."""
84
82
 
85
83
  def __init__(self, solver, *, solver_restart=False):
84
+ """
85
+ Constructs the structure holding the parameters for using the
86
+ linear preconditioner.
87
+
88
+ Args:
89
+ solver: A callable that solves a linear system of equations.
90
+ solver_restart: If False uses the last solution of the linear
91
+ system as a starting point for the solution of the next
92
+ (default=False).
93
+ """
86
94
  self.solver = solver
87
95
  self.solver_restart = solver_restart
88
96
 
@@ -119,8 +127,7 @@ class AbstractLinearPreconditioner:
119
127
 
120
128
 
121
129
  # This exists for backward compatibility
122
- @dataclass
123
- class LinearPreconditioner(AbstractLinearPreconditioner):
130
+ class LinearPreconditioner(AbstractLinearPreconditioner, mutable=True):
124
131
  lhs_constructor: LHSConstructorT
125
132
  """Constructor of the LHS of the linear system starting from the variational state."""
126
133
 
@@ -16,17 +16,15 @@ from typing import Callable, Optional
16
16
 
17
17
  import jax
18
18
 
19
- from dataclasses import dataclass
20
-
21
19
  from netket.vqs import VariationalState
22
20
  from netket.utils.types import Scalar, ScalarOrSchedule
21
+ from netket.utils import struct
23
22
 
24
23
  from .qgt import QGTAuto
25
24
  from .preconditioner import AbstractLinearPreconditioner
26
25
 
27
26
 
28
- @dataclass
29
- class SR(AbstractLinearPreconditioner):
27
+ class SR(AbstractLinearPreconditioner, mutable=True):
30
28
  r"""
31
29
  Stochastic Reconfiguration or Natural Gradient preconditioner for the gradient.
32
30
 
@@ -63,18 +61,18 @@ class SR(AbstractLinearPreconditioner):
63
61
 
64
62
  """
65
63
 
66
- diag_shift: ScalarOrSchedule = 0.01
64
+ diag_shift: ScalarOrSchedule = struct.field(serialize=False, default=0.01)
67
65
  """Diagonal shift added to the S matrix. Can be a Scalar value, an
68
66
  `optax <https://optax.readthedocs.io>`_ schedule or a Callable function."""
69
67
 
70
- diag_scale: Optional[ScalarOrSchedule] = None
68
+ diag_scale: Optional[ScalarOrSchedule] = struct.field(serialize=False, default=None)
71
69
  """Diagonal shift added to the S matrix. Can be a Scalar value, an
72
70
  `optax <https://optax.readthedocs.io>`_ schedule or a Callable function."""
73
71
 
74
- qgt_constructor: Callable = None
72
+ qgt_constructor: Callable = struct.static_field(default=None)
75
73
  """The Quantum Geometric Tensor type or a constructor."""
76
74
 
77
- qgt_kwargs: dict = None
75
+ qgt_kwargs: dict = struct.field(serialize=False, default=None)
78
76
  """The keyword arguments to be passed to the Geometric Tensor constructor."""
79
77
 
80
78
  def __init__(
@@ -191,7 +191,7 @@ class MetropolisSamplerNumpy(MetropolisSampler):
191
191
  random_uniform,
192
192
  )
193
193
 
194
- state.n_steps_proc += sampler.sweep_size * sampler.n_chains
194
+ state.n_steps_proc += sampler.sweep_size * sampler.n_chains_per_rank
195
195
  state.n_accepted_proc += accepted
196
196
 
197
197
  return state, state.σ
@@ -204,14 +204,15 @@ class MetropolisSamplerNumpy(MetropolisSampler):
204
204
  chain_length: int,
205
205
  ) -> tuple[jnp.ndarray, MetropolisNumpySamplerState]:
206
206
  samples = np.empty(
207
- (chain_length, sampler.n_chains, sampler.hilbert.size), dtype=sampler.dtype
207
+ (chain_length, sampler.n_chains_per_rank, sampler.hilbert.size),
208
+ dtype=sampler.dtype,
208
209
  )
209
210
 
210
211
  for i in range(chain_length):
211
212
  state, σ = sampler.sample_next(machine, parameters, state)
212
213
  samples[i] = σ
213
214
 
214
- # make it (n_chains, n_samples_per_chain) as expected by netket.stats.statistics
215
+ # make it (n_chains_per_rank, n_samples_per_chain, hi.size) as expected by netket.stats.statistics
215
216
  samples = np.swapaxes(samples, 0, 1)
216
217
 
217
218
  return samples, state
@@ -42,9 +42,9 @@ def autoset_default_gpu(COMM: Optional["mpi4py.MPI.Intracomm"], verbose: bool =
42
42
  code does not run.
43
43
  """
44
44
  devices = jax.devices()
45
- if len(devices) > 1 and any(d.device_kind == "gpu" for d in devices):
45
+ if len(devices) > 1 and any(d.platform == "gpu" for d in devices):
46
46
  local_rank = get_local_rank(COMM)
47
- jax.config.set("jax_default_device", devices[local_rank])
47
+ jax.config.update("jax_default_device", devices[local_rank])
48
48
  logger = logging.getLogger()
49
49
  logger.info(
50
50
  f"Determined that rank {COMM.Get_rank()} will be using GPU[{local_rank}/{len(devices)}]"
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import numpy as np
16
+ import jax
16
17
  import jax.numpy as jnp
17
18
 
18
19
  from .mpi import n_nodes, MPI, MPI_py_comm, MPI_jax_comm
@@ -271,11 +272,16 @@ def mpi_bcast_jax(x, *, token=None, root, comm=MPI_jax_comm):
271
272
  return mpi4jax.bcast(x, token=token, root=root, comm=comm)
272
273
 
273
274
 
274
- def mpi_allgather(x, *, token=None, comm=MPI_py_comm):
275
+ def mpi_allgather(x, *, comm=MPI_py_comm):
275
276
  if n_nodes == 1:
276
- return x, token
277
+ return x
277
278
  else:
278
- return comm.allgather(x)
279
+ if isinstance(x, (np.ndarray, jax.Array)):
280
+ out = np.empty((n_nodes,) + x.shape, dtype=x.dtype)
281
+ comm.Allgather(np.asarray(x), out)
282
+ return out
283
+ else:
284
+ return comm.allgather(x)
279
285
 
280
286
 
281
287
  def mpi_gather_jax(x, *, token=None, root: int = 0, comm=MPI_jax_comm):
@@ -19,4 +19,4 @@ def random_seed():
19
19
  """
20
20
  generates a random seed
21
21
  """
22
- return np.random.default_rng().integers(0, 1 << 32)
22
+ return int(np.random.default_rng().integers(0, 1 << 32))
@@ -51,17 +51,19 @@ jax.tree_util.register_pytree_node(
51
51
  )
52
52
 
53
53
 
54
- def field(pytree_node=True, serialize=True, cache=False, **kwargs):
54
+ def field(pytree_node=True, serialize=None, cache=False, **kwargs):
55
55
  """Mark a field of a dataclass or PyTree to be:
56
56
 
57
57
  Args:
58
58
  pytree_node: a leaf node in the pytree representation of this dataclass.
59
59
  If False this must be hashable
60
60
  serialize: If True the node is included in the serialization.
61
- In general you should not specify this.
61
+ In general you should not specify this. (Defaults to value of pytree_node)
62
62
  cache: If True this node is a cache and will be reset every time
63
63
  fields are modified.
64
64
  """
65
+ if serialize is None:
66
+ serialize = pytree_node
65
67
  return dataclasses.field(
66
68
  metadata={"pytree_node": pytree_node, "serialize": serialize, "cache": cache},
67
69
  **kwargs,
@@ -1,6 +1,7 @@
1
1
  import dataclasses
2
2
  import inspect
3
3
  import typing as tp
4
+ from typing import Any, Callable
4
5
  from abc import ABCMeta
5
6
  from copy import copy
6
7
  from functools import partial
@@ -20,6 +21,10 @@ store the topmost non-dataclass class in a mro.
20
21
  """
21
22
 
22
23
 
24
+ def identity(x):
25
+ return x
26
+
27
+
23
28
  class PytreeMeta(ABCMeta):
24
29
  """
25
30
  Metaclass for PyTrees, takes care of initializing and turning
@@ -28,13 +33,25 @@ class PytreeMeta(ABCMeta):
28
33
 
29
34
  def __call__(cls: type[P], *args: tp.Any, **kwargs: tp.Any) -> P:
30
35
  obj: P = cls.__new__(cls, *args, **kwargs)
36
+
37
+ # set things before init
38
+ vars_dict = vars(obj)
39
+
40
+ # Set 'default' values
41
+ for field in obj._pytree__cachedprop_fields:
42
+ vars_dict[field] = Uninitialized
43
+
44
+ for field, default_fn in cls._pytree__default_setters.items():
45
+ if field not in vars_dict:
46
+ vars_dict[field] = default_fn()
47
+
31
48
  obj.__dict__["_pytree__initializing"] = True
32
49
  try:
33
50
  obj.__init__(*args, **kwargs)
34
51
  finally:
35
52
  del obj.__dict__["_pytree__initializing"]
36
53
 
37
- vars_dict = vars(obj)
54
+ # set things after init
38
55
  if obj._pytree__class_dynamic_nodes:
39
56
  vars_dict["_pytree__node_fields"] = tuple(
40
57
  sorted(
@@ -46,9 +63,6 @@ class PytreeMeta(ABCMeta):
46
63
  else:
47
64
  vars_dict["_pytree__node_fields"] = cls._pytree__data_fields
48
65
 
49
- for field in obj._pytree__cachedprop_fields:
50
- vars_dict[field] = Uninitialized
51
-
52
66
  return obj
53
67
 
54
68
 
@@ -126,12 +140,15 @@ class Pytree(metaclass=PytreeMeta):
126
140
  class_vars = vars(cls)
127
141
  setter_descriptors = set()
128
142
  static_fields = _inherited_static_fields(cls)
143
+ noserialize_fields = _inherited_noserialize_fields(cls)
129
144
 
130
- # add special static fields
145
+ # add special static fields that are in the instance, not in the class
131
146
  static_fields.add("_pytree__node_fields")
147
+ noserialize_fields.add("_pytree__node_fields")
132
148
 
133
149
  # new
134
150
  data_fields = _inherited_data_fields(cls)
151
+ default_setters = _inherited_defaults_setters(cls) # _pytree__default_setters
135
152
  cached_prop_fields = set()
136
153
 
137
154
  for field, value in class_vars.items():
@@ -146,6 +163,18 @@ class Pytree(metaclass=PytreeMeta):
146
163
  ):
147
164
  data_fields.add(field)
148
165
 
166
+ if isinstance(value, dataclasses.Field) and not value.metadata.get(
167
+ "serialize", True
168
+ ):
169
+ noserialize_fields.add(field)
170
+
171
+ # default setters
172
+ if isinstance(value, dataclasses.Field):
173
+ if value.default is not dataclasses.MISSING:
174
+ default_setters[field] = partial(identity, value.default)
175
+ elif value.default_factory is not dataclasses.MISSING:
176
+ default_setters[field] = value.default_factory
177
+
149
178
  # add setter descriptors
150
179
  if hasattr(value, "__set__"):
151
180
  setter_descriptors.add(field)
@@ -187,14 +216,18 @@ class Pytree(metaclass=PytreeMeta):
187
216
  data_fields = tuple(sorted(data_fields))
188
217
  cached_prop_fields = tuple(sorted(cached_prop_fields))
189
218
  cached_prop_fields = tuple(_cache_name(f) for f in cached_prop_fields)
219
+ default_setters = MappingProxyType(default_setters)
190
220
 
191
221
  static_fields = tuple(sorted(static_fields))
222
+ noserialize_fields = tuple(sorted(noserialize_fields))
192
223
 
193
224
  # init class variables
194
225
  cls._pytree__initializing = False
195
226
  cls._pytree__class_is_mutable = mutable
196
227
  cls._pytree__static_fields = static_fields
228
+ cls._pytree__noserialize_fields = noserialize_fields
197
229
  cls._pytree__setter_descriptors = frozenset(setter_descriptors)
230
+ cls._pytree__default_setters = default_setters
198
231
 
199
232
  # new
200
233
  cls._pytree__class_dynamic_nodes = dynamic_nodes
@@ -234,8 +267,8 @@ class Pytree(metaclass=PytreeMeta):
234
267
 
235
268
  serialization.register_serialization_state(
236
269
  cls,
237
- partial(cls._to_flax_state_dict, cls._pytree__static_fields),
238
- partial(cls._from_flax_state_dict, cls._pytree__static_fields),
270
+ partial(cls._to_flax_state_dict, cls._pytree__noserialize_fields),
271
+ partial(cls._from_flax_state_dict, cls._pytree__noserialize_fields),
239
272
  )
240
273
 
241
274
  def __pre_init__(self, *args, **kwargs):
@@ -320,21 +353,21 @@ class Pytree(metaclass=PytreeMeta):
320
353
 
321
354
  @classmethod
322
355
  def _to_flax_state_dict(
323
- cls, static_field_names: tuple[str, ...], pytree: "Pytree"
356
+ cls, noserialize_field_names: tuple[str, ...], pytree: "Pytree"
324
357
  ) -> dict[str, tp.Any]:
325
358
  from flax import serialization
326
359
 
327
360
  state_dict = {
328
361
  name: serialization.to_state_dict(getattr(pytree, name))
329
362
  for name in pytree.__dict__
330
- if name not in static_field_names
363
+ if name not in noserialize_field_names
331
364
  }
332
365
  return state_dict
333
366
 
334
367
  @classmethod
335
368
  def _from_flax_state_dict(
336
369
  cls,
337
- static_field_names: tuple[str, ...],
370
+ noserialize_field_names: tuple[str, ...],
338
371
  pytree: P,
339
372
  state: dict[str, tp.Any],
340
373
  ) -> P:
@@ -344,7 +377,7 @@ class Pytree(metaclass=PytreeMeta):
344
377
  state = state.copy() # copy the state so we can pop the restored fields.
345
378
  updates = {}
346
379
  for name in pytree.__dict__:
347
- if name in static_field_names:
380
+ if name in noserialize_field_names:
348
381
  continue
349
382
  if name not in state:
350
383
  raise ValueError(
@@ -435,6 +468,23 @@ def _inherited_static_fields(cls: type) -> set[str]:
435
468
  return static_fields
436
469
 
437
470
 
471
+ def _inherited_noserialize_fields(cls: type) -> set[str]:
472
+ """
473
+ Returns the set of noserialize fields of base classes
474
+ of the input class
475
+ """
476
+ noserialize_fields = set()
477
+ for parent_class in cls.mro():
478
+ if parent_class is not cls and parent_class is not Pytree:
479
+ if issubclass(parent_class, Pytree):
480
+ noserialize_fields.update(parent_class._pytree__noserialize_fields)
481
+ elif dataclasses.is_dataclass(parent_class):
482
+ for field in dataclasses.fields(parent_class):
483
+ if not field.metadata.get("serialize", True):
484
+ noserialize_fields.add(field.name)
485
+ return noserialize_fields
486
+
487
+
438
488
  def _inherited_data_fields(cls: type) -> set[str]:
439
489
  """
440
490
  Returns the set of data fields of base classes
@@ -470,3 +520,23 @@ def _inherited_cachedproperty_fields(cls: type) -> set[str]:
470
520
  if isinstance(field, CachedProperty):
471
521
  cachedproperty_fields.add(field.name)
472
522
  return cachedproperty_fields
523
+
524
+
525
+ def _inherited_defaults_setters(cls: type) -> set[Callable[[], Any]]:
526
+ """
527
+ Returns the set of default setters of base classes
528
+ of the input class.
529
+ """
530
+ default_setters = {}
531
+ for parent_class in cls.mro():
532
+ if parent_class is not cls and parent_class is not Pytree:
533
+ if issubclass(parent_class, Pytree):
534
+ default_setters.update(parent_class._pytree__default_setters)
535
+ elif dataclasses.is_dataclass(parent_class):
536
+ for field in dataclasses.fields(parent_class):
537
+ if field.default is not dataclasses.MISSING:
538
+ default_setters[field.name] = lambda: field.default
539
+ elif field.default_factory is not dataclasses.MISSING:
540
+ default_setters[field.name] = field.default_factory
541
+
542
+ return default_setters
@@ -35,7 +35,7 @@ dependencies = [
35
35
  "scipy>=1.5.3, <2",
36
36
  "tqdm>=4.60, <5",
37
37
  "rich>=10.0",
38
- "numba>=0.52, <0.60",
38
+ "numba>=0.52, <0.61",
39
39
  "igraph>=0.10.0, <0.12.0",
40
40
  "jax>=0.4.16, <0.5",
41
41
  "jaxlib>=0.4.16, <0.5",
@@ -56,7 +56,7 @@ dependencies = [
56
56
  [project.optional-dependencies]
57
57
  mpi = [
58
58
  "mpi4py>=3.0.1, <4",
59
- "mpi4jax>=0.3.9, <0.5"
59
+ "mpi4jax>=0.3.9, <0.6"
60
60
  ]
61
61
  pyscf = [
62
62
  "sparse>=0.12.0",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes