NetKet 3.22.0.dev3__tar.gz → 3.22.0.dev4__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 (421) hide show
  1. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/PKG-INFO +1 -1
  2. netket-3.22.0.dev4/netket/_src/operator/spin_flip.py +121 -0
  3. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/symmetry/canonical_representation.py +42 -12
  4. netket-3.22.0.dev4/netket/_src/symmetry/labeled_representation.py +249 -0
  5. netket-3.22.0.dev4/netket/_src/symmetry/labeled_representation_coset_filter.py +197 -0
  6. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/symmetry/representation.py +7 -2
  7. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/symmetry/representation_construction.py +12 -20
  8. netket-3.22.0.dev4/netket/_src/symmetry/spin_flip_representation.py +63 -0
  9. netket-3.22.0.dev4/netket/_src/symmetry/translation_coset_filter.py +255 -0
  10. netket-3.22.0.dev4/netket/_src/symmetry/translation_representation.py +286 -0
  11. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/vqs/transformed_vstate.py +15 -11
  12. netket-3.22.0.dev4/netket/_version.py +24 -0
  13. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/errors.py +102 -0
  14. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/driver/tdvp_common.py +4 -3
  15. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/graph/common_lattices.py +24 -6
  16. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/graph/lattice.py +67 -17
  17. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/graph/space_group.py +125 -18
  18. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_sparse.py +6 -1
  19. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_vmap_chunked.py +33 -5
  20. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_discrete_operator_jax.py +1 -1
  21. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_fermion2nd/jax.py +51 -1
  22. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_fermion2nd/utils.py +26 -0
  23. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/solver/__init__.py +5 -3
  24. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/solver/solvers.py +238 -0
  25. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/base.py +37 -1
  26. netket-3.22.0.dev4/netket/symmetry/__init__.py +15 -0
  27. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/symmetry/group/__init__.py +5 -1
  28. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/_tips.py +2 -0
  29. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/citations/internal_citations.bib +10 -0
  30. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/__init__.py +5 -1
  31. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/_group.py +24 -0
  32. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/_permutation_group.py +28 -0
  33. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/history/history_dict.py +11 -2
  34. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/struct/dataclass.py +15 -1
  35. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/struct/pytree.py +5 -3
  36. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/struct/utils.py +21 -0
  37. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/kernels.py +4 -3
  38. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_mixed_state/__init__.py +1 -0
  39. netket-3.22.0.dev4/netket/vqs/mc/mc_mixed_state/expect_grad.py +63 -0
  40. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_state/state.py +1 -1
  41. netket-3.22.0.dev3/netket/_version.py +0 -34
  42. netket-3.22.0.dev3/netket/symmetry/__init__.py +0 -10
  43. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/.gitignore +0 -0
  44. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/LICENSE +0 -0
  45. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/README.md +0 -0
  46. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/docs/sphinx_extensions/netket_citations.py +0 -0
  47. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/__init__.py +0 -0
  48. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/auto_chunk_size.py +0 -0
  49. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/auto_slurm_requeue.py +0 -0
  50. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/base.py +0 -0
  51. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/callback_list.py +0 -0
  52. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/legacy_wrappers.py +0 -0
  53. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/observables.py +0 -0
  54. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/progressbar.py +0 -0
  55. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/save_state.py +0 -0
  56. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/callbacks/stop_at_time.py +0 -0
  57. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/driver/abstract_dynamics_driver.py +0 -0
  58. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/driver/abstract_optimization_driver.py +0 -0
  59. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/driver/abstract_variational_driver.py +0 -0
  60. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/driver/abstract_variational_driver_old.py +0 -0
  61. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/driver/infidelity_sr.py +0 -0
  62. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/driver/vmc_sr.py +0 -0
  63. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/ngd/kwargs.py +0 -0
  64. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/ngd/sr.py +0 -0
  65. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/ngd/sr_srt_common.py +0 -0
  66. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/ngd/srt.py +0 -0
  67. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/ngd/srt_onthefly.py +0 -0
  68. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/nn/apply_operator/functional.py +0 -0
  69. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/nn/apply_operator/linen.py +0 -0
  70. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/nn/apply_operator/nnx.py +0 -0
  71. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/normal_order_utils.py +0 -0
  72. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/particle_number_conserving_fermionic/conversion.py +0 -0
  73. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/particle_number_conserving_fermionic/fermihubbard.py +0 -0
  74. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/particle_number_conserving_fermionic/kernels.py +0 -0
  75. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/particle_number_conserving_fermionic/operator_data.py +0 -0
  76. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/particle_number_conserving_fermionic/operators.py +0 -0
  77. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/permutation/base.py +0 -0
  78. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/permutation/construct.py +0 -0
  79. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/permutation/fermion.py +0 -0
  80. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/permutation/spin.py +0 -0
  81. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/permutation/trace_utils.py +0 -0
  82. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/pyscf_api.py +0 -0
  83. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/operator/pyscf_utils.py +0 -0
  84. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/solvers/nan_fallback.py +0 -0
  85. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/stats/online_stats/__init__.py +0 -0
  86. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/stats/online_stats/accumulator.py +0 -0
  87. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/stats/online_stats/kernels.py +0 -0
  88. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/stats/online_stats/operations.py +0 -0
  89. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/vqs/check_mc_convergence.py +0 -0
  90. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/vqs/expect_to_precision.py +0 -0
  91. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/vqs/fermion_mf/__init__.py +0 -0
  92. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/vqs/fermion_mf/expectation.py +0 -0
  93. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/vqs/fermion_mf/qgt.py +0 -0
  94. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/vqs/fermion_mf/state.py +0 -0
  95. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/_src/vqs/plot_mc_convergence.py +0 -0
  96. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/callbacks/__init__.py +0 -0
  97. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/callbacks/convergence_stopping.py +0 -0
  98. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/callbacks/early_stopping.py +0 -0
  99. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/callbacks/invalid_loss_stopping.py +0 -0
  100. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/callbacks/timeout.py +0 -0
  101. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/driver/__init__.py +0 -0
  102. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/driver/steady_state.py +0 -0
  103. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/driver/vmc.py +0 -0
  104. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/exact.py +0 -0
  105. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/__init__.py +0 -0
  106. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/driver/__init__.py +0 -0
  107. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/driver/tdvp.py +0 -0
  108. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/driver/tdvp_schmitt.py +0 -0
  109. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/__init__.py +0 -0
  110. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/_integrator.py +0 -0
  111. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/_integrator_params.py +0 -0
  112. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/_integrator_state.py +0 -0
  113. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/_rk/__init__.py +0 -0
  114. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/_rk/_solver.py +0 -0
  115. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/_rk/_tableau.py +0 -0
  116. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/_solver.py +0 -0
  117. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/dynamics/_utils.py +0 -0
  118. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/geometry/__init__.py +0 -0
  119. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/geometry/cell.py +0 -0
  120. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/hilbert/__init__.py +0 -0
  121. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/hilbert/continuous_hilbert.py +0 -0
  122. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/hilbert/particle.py +0 -0
  123. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/hilbert/random/__init__.py +0 -0
  124. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/hilbert/random/particle.py +0 -0
  125. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/logging/__init__.py +0 -0
  126. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/logging/hdf5_log.py +0 -0
  127. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/models/__init__.py +0 -0
  128. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/models/fast_rnn.py +0 -0
  129. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/models/rnn.py +0 -0
  130. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/nn/__init__.py +0 -0
  131. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/nn/rnn/__init__.py +0 -0
  132. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/nn/rnn/cells.py +0 -0
  133. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/nn/rnn/layers.py +0 -0
  134. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/nn/rnn/layers_fast.py +0 -0
  135. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/nn/rnn/ordering.py +0 -0
  136. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/__init__.py +0 -0
  137. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/infidelity/__init__.py +0 -0
  138. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/infidelity/exact.py +0 -0
  139. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/infidelity/expect.py +0 -0
  140. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/infidelity/infidelity_operator.py +0 -0
  141. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/renyi2/S2_operator.py +0 -0
  142. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/renyi2/__init__.py +0 -0
  143. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/renyi2/exact.py +0 -0
  144. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/renyi2/expect.py +0 -0
  145. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/variance/__init__.py +0 -0
  146. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/variance/exact.py +0 -0
  147. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/variance/expect.py +0 -0
  148. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/observable/variance/variance_operator.py +0 -0
  149. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/operator/__init__.py +0 -0
  150. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/operator/pyscf.py +0 -0
  151. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/qsr/__init__.py +0 -0
  152. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/qsr/dataset.py +0 -0
  153. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/qsr/driver.py +0 -0
  154. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/qsr/logic_helpers.py +0 -0
  155. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/vqs/__init__.py +0 -0
  156. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/experimental/vqs/io.py +0 -0
  157. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/graph/__init__.py +0 -0
  158. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/graph/_lattice_draw.py +0 -0
  159. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/graph/_lattice_edge_logic.py +0 -0
  160. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/graph/abstract_graph.py +0 -0
  161. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/graph/graph.py +0 -0
  162. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/__init__.py +0 -0
  163. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/abstract_hilbert.py +0 -0
  164. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/constraint/__init__.py +0 -0
  165. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/constraint/base.py +0 -0
  166. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/constraint/multiple.py +0 -0
  167. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/constraint/sum.py +0 -0
  168. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/constraint/sum_partition.py +0 -0
  169. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/discrete_hilbert.py +0 -0
  170. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/doubled_hilbert.py +0 -0
  171. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/fock.py +0 -0
  172. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/homogeneous.py +0 -0
  173. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/index/__init__.py +0 -0
  174. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/index/base.py +0 -0
  175. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/index/constrained_generic.py +0 -0
  176. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/index/constrained_sum.py +0 -0
  177. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/index/constrained_sum_partitions.py +0 -0
  178. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/index/unconstrained.py +0 -0
  179. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/index/uniform_tensor.py +0 -0
  180. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/qubit.py +0 -0
  181. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/random/__init__.py +0 -0
  182. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/random/base.py +0 -0
  183. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/random/doubled.py +0 -0
  184. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/random/fock.py +0 -0
  185. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/random/homogeneous.py +0 -0
  186. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/random/qubit.py +0 -0
  187. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/random/tensor_hilbert.py +0 -0
  188. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/spin.py +0 -0
  189. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/spin_orbital_fermions.py +0 -0
  190. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/tensor_hilbert.py +0 -0
  191. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/hilbert/tensor_hilbert_discrete.py +0 -0
  192. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/__init__.py +0 -0
  193. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_chunk_utils.py +0 -0
  194. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_expect.py +0 -0
  195. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_grad.py +0 -0
  196. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_jacobian/__init__.py +0 -0
  197. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_jacobian/default_mode.py +0 -0
  198. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_jacobian/jacobian_dense.py +0 -0
  199. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_jacobian/jacobian_pytree.py +0 -0
  200. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_jacobian/logic.py +0 -0
  201. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_math.py +0 -0
  202. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_ntk/__init__.py +0 -0
  203. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_ntk/logic.py +0 -0
  204. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_ntk/utils.py +0 -0
  205. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_scanmap.py +0 -0
  206. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_sort.py +0 -0
  207. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_utils_dtype.py +0 -0
  208. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_utils_random.py +0 -0
  209. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_utils_tree.py +0 -0
  210. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_vjp.py +0 -0
  211. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/_vjp_chunked.py +0 -0
  212. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/lax.py +0 -0
  213. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/sharding/__init__.py +0 -0
  214. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/sharding/debug.py +0 -0
  215. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/sharding/fixed_sharding_decorator.py +0 -0
  216. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/sharding/fixed_sharding_utils.py +0 -0
  217. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/jax/sharding/flexible_sharding.py +0 -0
  218. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/logging/__init__.py +0 -0
  219. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/logging/base.py +0 -0
  220. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/logging/json_log.py +0 -0
  221. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/logging/runtime_log.py +0 -0
  222. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/logging/state_log.py +0 -0
  223. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/logging/tensorboard.py +0 -0
  224. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/README.md +0 -0
  225. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/__init__.py +0 -0
  226. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/autoreg.py +0 -0
  227. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/deepset.py +0 -0
  228. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/equivariant.py +0 -0
  229. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/fast_autoreg.py +0 -0
  230. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/full_space.py +0 -0
  231. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/gaussian.py +0 -0
  232. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/jastrow.py +0 -0
  233. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/mlp.py +0 -0
  234. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/ndm.py +0 -0
  235. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/rbm.py +0 -0
  236. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/slater.py +0 -0
  237. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/tensor_networks/__init__.py +0 -0
  238. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/tensor_networks/mpdo.py +0 -0
  239. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/tensor_networks/mps.py +0 -0
  240. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/models/utils.py +0 -0
  241. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/__init__.py +0 -0
  242. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/activation.py +0 -0
  243. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/apply_operator.py +0 -0
  244. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/blocks/__init__.py +0 -0
  245. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/blocks/deepset.py +0 -0
  246. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/blocks/mlp.py +0 -0
  247. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/blocks/symmetry_sum.py +0 -0
  248. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/fast_masked_linear.py +0 -0
  249. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/masked_linear.py +0 -0
  250. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/symmetric_linear.py +0 -0
  251. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/nn/utils.py +0 -0
  252. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/__init__.py +0 -0
  253. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_abstract_observable.py +0 -0
  254. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_abstract_operator.py +0 -0
  255. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_abstract_super_operator.py +0 -0
  256. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_bose_hubbard/__init__.py +0 -0
  257. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_bose_hubbard/base.py +0 -0
  258. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_bose_hubbard/jax.py +0 -0
  259. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_bose_hubbard/numba.py +0 -0
  260. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_continuous_operator.py +0 -0
  261. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_discrete_operator.py +0 -0
  262. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_embed/__init__.py +0 -0
  263. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_embed/base.py +0 -0
  264. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_embed/discrete_jax_operator.py +0 -0
  265. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_embed/discrete_operator.py +0 -0
  266. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_embed/operator.py +0 -0
  267. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_fermion2nd/__init__.py +0 -0
  268. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_fermion2nd/base.py +0 -0
  269. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_fermion2nd/numba.py +0 -0
  270. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_graph_operator.py +0 -0
  271. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_hamiltonian.py +0 -0
  272. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_heisenberg.py +0 -0
  273. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_ising/__init__.py +0 -0
  274. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_ising/base.py +0 -0
  275. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_ising/jax.py +0 -0
  276. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_ising/numba.py +0 -0
  277. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_kinetic.py +0 -0
  278. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_lazy.py +0 -0
  279. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_local_liouvillian.py +0 -0
  280. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_local_operator/__init__.py +0 -0
  281. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_local_operator/base.py +0 -0
  282. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_local_operator/compile_helpers.py +0 -0
  283. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_local_operator/convert.py +0 -0
  284. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_local_operator/helpers.py +0 -0
  285. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_local_operator/jax.py +0 -0
  286. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_local_operator/numba.py +0 -0
  287. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_pauli_strings/__init__.py +0 -0
  288. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_pauli_strings/base.py +0 -0
  289. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_pauli_strings/jax.py +0 -0
  290. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_pauli_strings/numba.py +0 -0
  291. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_potential.py +0 -0
  292. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_prod/__init__.py +0 -0
  293. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_prod/base.py +0 -0
  294. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_prod/discrete_jax_operator.py +0 -0
  295. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_prod/discrete_operator.py +0 -0
  296. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_prod/operator.py +0 -0
  297. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_sum/__init__.py +0 -0
  298. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_sum/base.py +0 -0
  299. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_sum/continuous.py +0 -0
  300. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_sum/discrete_jax_operator.py +0 -0
  301. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_sum/discrete_operator.py +0 -0
  302. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/_sum/operator.py +0 -0
  303. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/boson.py +0 -0
  304. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/fermion.py +0 -0
  305. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/permutation.py +0 -0
  306. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/operator/spin.py +0 -0
  307. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/__init__.py +0 -0
  308. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/linear_operator.py +0 -0
  309. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/preconditioner.py +0 -0
  310. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/__init__.py +0 -0
  311. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/common.py +0 -0
  312. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/default.py +0 -0
  313. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/qgt_jacobian.py +0 -0
  314. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/qgt_jacobian_common.py +0 -0
  315. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/qgt_jacobian_dense.py +0 -0
  316. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/qgt_jacobian_pytree.py +0 -0
  317. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/qgt_onthefly.py +0 -0
  318. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/qgt/qgt_onthefly_logic.py +0 -0
  319. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/optimizer/sr.py +0 -0
  320. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/__init__.py +0 -0
  321. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/autoreg.py +0 -0
  322. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/exact.py +0 -0
  323. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/metropolis.py +0 -0
  324. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/metropolis_numpy.py +0 -0
  325. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/parallel_tempering.py +0 -0
  326. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/__init__.py +0 -0
  327. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/base.py +0 -0
  328. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/continuous_gaussian.py +0 -0
  329. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/custom_numpy.py +0 -0
  330. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/exchange.py +0 -0
  331. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/fermion_2nd.py +0 -0
  332. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/fixed.py +0 -0
  333. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/global_flip_rule.py +0 -0
  334. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/hamiltonian.py +0 -0
  335. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/hamiltonian_numpy.py +0 -0
  336. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/langevin.py +0 -0
  337. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/local.py +0 -0
  338. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/local_numpy.py +0 -0
  339. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/multiple.py +0 -0
  340. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/sampler/rules/tensor.py +0 -0
  341. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/stats/__init__.py +0 -0
  342. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/stats/_autocorr.py +0 -0
  343. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/stats/mc_stats.py +0 -0
  344. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/stats/mc_stats_old.py +0 -0
  345. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/stats/mpi_stats.py +0 -0
  346. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/tools/__init__.py +0 -0
  347. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/tools/_common.py +0 -0
  348. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/tools/_cpu_info.py +0 -0
  349. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/tools/check_mpi.py +0 -0
  350. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/tools/djaxrun.py +0 -0
  351. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/tools/info.py +0 -0
  352. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/__init__.py +0 -0
  353. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/_dependencies_check.py +0 -0
  354. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/_serialization.py +0 -0
  355. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/api_utils.py +0 -0
  356. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/array.py +0 -0
  357. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/citations/__init__.py +0 -0
  358. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/citations/cli.py +0 -0
  359. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/citations/core.py +0 -0
  360. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/citations/docs.py +0 -0
  361. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/config_flags.py +0 -0
  362. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/deprecation.py +0 -0
  363. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/dispatch.py +0 -0
  364. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/display/__init__.py +0 -0
  365. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/display/repr.py +0 -0
  366. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/float.py +0 -0
  367. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/_point_group.py +0 -0
  368. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/_semigroup.py +0 -0
  369. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/axial.py +0 -0
  370. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/cubic.py +0 -0
  371. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/icosa.py +0 -0
  372. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/group/planar.py +0 -0
  373. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/history/__init__.py +0 -0
  374. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/history/accum.py +0 -0
  375. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/history/history.py +0 -0
  376. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/holomorphic.py +0 -0
  377. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/iterators.py +0 -0
  378. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/jax.py +0 -0
  379. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/model_frameworks/__init__.py +0 -0
  380. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/model_frameworks/base.py +0 -0
  381. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/model_frameworks/equinox.py +0 -0
  382. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/model_frameworks/flax.py +0 -0
  383. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/model_frameworks/haiku.py +0 -0
  384. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/model_frameworks/jax.py +0 -0
  385. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/model_frameworks/nnx.py +0 -0
  386. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/model_frameworks/nnx_wrapped.py +0 -0
  387. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/moduletools.py +0 -0
  388. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/mpi/__init__.py +0 -0
  389. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/mpi/mpi.py +0 -0
  390. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/mpi/primitives.py +0 -0
  391. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/numbers.py +0 -0
  392. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/optional_deps.py +0 -0
  393. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/partial.py +0 -0
  394. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/seed.py +0 -0
  395. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/static_number.py +0 -0
  396. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/static_range.py +0 -0
  397. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/struct/__init__.py +0 -0
  398. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/struct/fields.py +0 -0
  399. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/struct/pytree_serialization_sharding.py +0 -0
  400. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/summation.py +0 -0
  401. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/timing.py +0 -0
  402. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/types.py +0 -0
  403. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/utils/version_check.py +0 -0
  404. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/__init__.py +0 -0
  405. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/base.py +0 -0
  406. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/full_summ/__init__.py +0 -0
  407. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/full_summ/expect.py +0 -0
  408. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/full_summ/state.py +0 -0
  409. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/__init__.py +0 -0
  410. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/common.py +0 -0
  411. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_mixed_state/expect.py +0 -0
  412. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_mixed_state/expect_chunked.py +0 -0
  413. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_mixed_state/state.py +0 -0
  414. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_state/__init__.py +0 -0
  415. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_state/expect.py +0 -0
  416. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_state/expect_chunked.py +0 -0
  417. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_state/expect_forces.py +0 -0
  418. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_state/expect_forces_chunked.py +0 -0
  419. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_state/expect_grad.py +0 -0
  420. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/netket/vqs/mc/mc_state/expect_grad_chunked.py +0 -0
  421. {netket-3.22.0.dev3 → netket-3.22.0.dev4}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: NetKet
3
- Version: 3.22.0.dev3
3
+ Version: 3.22.0.dev4
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/#
@@ -0,0 +1,121 @@
1
+ from math import comb
2
+
3
+ import numpy as np
4
+
5
+ import jax.numpy as jnp
6
+ from jax.tree_util import register_pytree_node_class
7
+
8
+ from netket.hilbert import Spin, SpinOrbitalFermions
9
+ from netket.hilbert.constraint import SumConstraint
10
+ from netket.jax import canonicalize_dtypes
11
+ from netket.operator import DiscreteJaxOperator
12
+
13
+
14
+ def _spin_hilbert_supports_spin_flip(hilbert: Spin) -> bool:
15
+ return (not hilbert.constrained) or (
16
+ isinstance(hilbert.constraint, SumConstraint)
17
+ and hilbert.constraint.sum_value == 0
18
+ )
19
+
20
+
21
+ @register_pytree_node_class
22
+ class SpinFlipOperator(DiscreteJaxOperator):
23
+ def __init__(self, hilbert: Spin | SpinOrbitalFermions, *, dtype=float):
24
+ if isinstance(hilbert, Spin):
25
+ if not _spin_hilbert_supports_spin_flip(hilbert):
26
+ raise ValueError(
27
+ "Spin flip is only supported on unconstrained `Spin` Hilbert spaces "
28
+ "or on `Spin` Hilbert spaces constrained to zero total magnetization."
29
+ )
30
+ elif isinstance(hilbert, SpinOrbitalFermions):
31
+ if hilbert.n_spin_subsectors == 1:
32
+ raise ValueError(
33
+ "Spin flip is only defined for spinful `SpinOrbitalFermions` "
34
+ "Hilbert spaces."
35
+ )
36
+ if hilbert.n_spin_subsectors != 2:
37
+ raise ValueError(
38
+ "Spin flip requires exactly 2 spin subsectors, "
39
+ f"but got {hilbert.n_spin_subsectors}."
40
+ )
41
+ n_fps = hilbert.n_fermions_per_spin
42
+ if n_fps[0] is None or n_fps[1] is None:
43
+ raise ValueError(
44
+ "Spin flip requires fixed fermion numbers per spin sector "
45
+ "(specify `n_fermions_per_spin`)."
46
+ )
47
+ if n_fps[0] != n_fps[1]:
48
+ raise ValueError(
49
+ "Spin flip does not preserve the spin-subsector constraints: "
50
+ f"n_fermions_per_spin={n_fps} requires equal up and down counts."
51
+ )
52
+ else:
53
+ raise TypeError(
54
+ "Spin flip is only defined on `netket.hilbert.Spin` and "
55
+ "`netket.hilbert.SpinOrbitalFermions`."
56
+ )
57
+
58
+ super().__init__(hilbert)
59
+ self._dtype = canonicalize_dtypes(dtype=dtype)
60
+
61
+ def tree_flatten(self):
62
+ return (), {"hilbert": self.hilbert, "dtype": self.dtype}
63
+
64
+ @classmethod
65
+ def tree_unflatten(cls, struct_data, array_data):
66
+ return cls(**struct_data)
67
+
68
+ def __repr__(self):
69
+ return f"SpinFlipOperator({self.hilbert}, dtype={self.dtype})"
70
+
71
+ def __hash__(self):
72
+ return hash((type(self), self.hilbert, self.dtype))
73
+
74
+ def __eq__(self, other):
75
+ if type(self) is type(other):
76
+ return self.hilbert == other.hilbert and self.dtype == other.dtype
77
+ return False
78
+
79
+ @property
80
+ def max_conn_size(self) -> int:
81
+ return 1
82
+
83
+ @property
84
+ def dtype(self):
85
+ return self._dtype
86
+
87
+ def get_conn_padded(self, x):
88
+ x = jnp.asarray(x)
89
+
90
+ if isinstance(self.hilbert, SpinOrbitalFermions):
91
+ L = self.hilbert.n_orbitals
92
+ perm = np.concatenate([np.arange(L, 2 * L), np.arange(L)])
93
+ x_conn = x.at[..., None, perm].get(
94
+ unique_indices=True, mode="promise_in_bounds"
95
+ )
96
+ # Fermionic sign: (-1)^(N_up * N_down) = (-1)^N with N_up = N_down = N.
97
+ N = self.hilbert.n_fermions_per_spin[0]
98
+ mel = int((-1) ** N)
99
+ mels = (
100
+ x.at[..., :1].get(unique_indices=True, mode="promise_in_bounds") * 0
101
+ + mel
102
+ ).astype(self.dtype)
103
+ else:
104
+ x_conn = -x[..., None, :]
105
+ # Construct the constant matrix element without materialising new sharded arrays.
106
+ mels = x.at[..., :1].get(unique_indices=True, mode="promise_in_bounds")
107
+ mels = 1 + (mels * 0).astype(self.dtype)
108
+
109
+ return x_conn, mels
110
+
111
+ def trace(self) -> int:
112
+ if isinstance(self.hilbert, SpinOrbitalFermions):
113
+ # Fixed points: states where each orbital has equal up and down occupation,
114
+ # i.e., x[i] == x[i + L] for all i in 0..L-1. With n_fermions_per_spin=(N,N)
115
+ # these are the C(L, N) states where N orbitals are doubly occupied.
116
+ # Each contributes mel = (-1)^N to the trace.
117
+ L = self.hilbert.n_orbitals
118
+ N = self.hilbert.n_fermions_per_spin[0]
119
+ return int((-1) ** N) * comb(L, N)
120
+
121
+ return int(np.any(np.asarray(self.hilbert.local_states) == 0))
@@ -13,23 +13,38 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import warnings
16
+ from typing import overload
16
17
 
17
18
  from netket.hilbert import DiscreteHilbert, Qubit, Spin, Fock, SpinOrbitalFermions
18
19
  from netket.symmetry.group import PermutationGroup, PointGroup
19
20
  from netket.graph.space_group import TranslationGroup, SpaceGroup
20
21
 
21
- from netket._src.symmetry.representation import Representation
22
+ from netket._src.symmetry.labeled_representation import LabeledRepresentation
23
+ from netket._src.symmetry.translation_representation import TranslationRepresentation
22
24
  from netket._src.symmetry.representation_construction import (
23
25
  physical_to_logical_permutation_group,
26
+ _to_logical_perm,
24
27
  )
25
28
  from netket._src.operator.permutation.construct import (
26
29
  construct_permutation_operator,
27
30
  )
28
31
 
29
32
 
33
+ @overload
34
+ def canonical_representation(
35
+ hilbert: DiscreteHilbert, group: TranslationGroup, warn: bool = True
36
+ ) -> TranslationRepresentation: ...
37
+
38
+
39
+ @overload
40
+ def canonical_representation(
41
+ hilbert: DiscreteHilbert, group: PermutationGroup, warn: bool = True
42
+ ) -> LabeledRepresentation: ...
43
+
44
+
30
45
  def canonical_representation(
31
46
  hilbert: DiscreteHilbert, group: PermutationGroup, warn: bool = True
32
- ) -> Representation:
47
+ ) -> LabeledRepresentation:
33
48
  r"""
34
49
  Construct the representation of a permutation group on a many-body
35
50
  Hilbert space where each permutation is mapped to the permutation operator
@@ -81,9 +96,11 @@ def canonical_representation(
81
96
  :class:`~netket.graph.space_group.TranslationGroup`.
82
97
 
83
98
  Returns:
84
- A :class:`~netket.symmetry.Representation` object encoding the action of the
85
- permutation group on the Hilbert space. The representation includes a dictionary
86
- mapping each group element to the corresponding operator that acts on quantum states.
99
+ A :class:`~netket.symmetry.TranslationRepresentation` if ``group`` is a
100
+ :class:`~netket.graph.space_group.TranslationGroup` (with Bloch-momentum
101
+ indexing via :meth:`~netket.symmetry.TranslationRepresentation.projector`),
102
+ or a :class:`~netket.symmetry.LabeledRepresentation` for all other groups
103
+ (with automatic irrep labels derived from the character table).
87
104
 
88
105
  Examples:
89
106
  Get the representation of the translation group on a spin system:
@@ -129,7 +146,9 @@ def canonical_representation(
129
146
  ... )
130
147
 
131
148
  See Also:
132
- - :class:`~netket.symmetry.Representation`: The representation class that is returned.
149
+ - :class:`~netket.symmetry.Representation`: Base representation class.
150
+ - :class:`~netket.symmetry.LabeledRepresentation`: Returned for point/space groups.
151
+ - :class:`~netket.symmetry.TranslationRepresentation`: Returned for translation groups.
133
152
  - :class:`~netket.utils.group.PermutationGroup`: Permutation group class.
134
153
  - :meth:`~netket.graph.Lattice.translation_group`: Get the translation group of a lattice.
135
154
  - :meth:`~netket.graph.Lattice.space_group`: Get the space group of a lattice.
@@ -169,12 +188,23 @@ def canonical_representation(
169
188
  "Make sure that this is the intended representation. "
170
189
  "To disable this warning, pass a group of the class "
171
190
  "SpaceGroup, PointGroup, or TranslationGroup, "
172
- "or pass no_warning=True.\n\n"
191
+ "or pass warn=False.\n\n"
173
192
  )
174
193
 
175
- # If fermionic hilbert space, increase the size of the permutation so it
176
- # matches the number of single-particle states.
194
+ if isinstance(group, TranslationGroup):
195
+ # Keep the TranslationGroup as-is so geometry (lattice, group_shape) is
196
+ # preserved. For fermionic hilbert spaces, remap only the operators.
197
+ representation_dict = {
198
+ perm: construct_permutation_operator(
199
+ hilbert, _to_logical_perm(hilbert, perm)
200
+ )
201
+ for perm in group
202
+ }
203
+ return TranslationRepresentation(group, representation_dict)
204
+
205
+ # For all other groups, remap the group itself for fermionic hilbert spaces.
177
206
  group = physical_to_logical_permutation_group(group, hilbert)
178
- return Representation(
179
- group, {perm: construct_permutation_operator(hilbert, perm) for perm in group}
180
- )
207
+ representation_dict = {
208
+ perm: construct_permutation_operator(hilbert, perm) for perm in group
209
+ }
210
+ return LabeledRepresentation(group, representation_dict)
@@ -0,0 +1,249 @@
1
+ # Copyright 2025 The NetKet Authors - All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ from functools import cached_property
18
+ from typing import TYPE_CHECKING
19
+
20
+ import numpy as np
21
+
22
+
23
+ from netket._src.symmetry.representation import Representation
24
+
25
+ if TYPE_CHECKING:
26
+ from netket.operator import DiscreteJaxOperator
27
+ from netket._src.symmetry.labeled_representation_coset_filter import (
28
+ LabeledRepresentationCosetFilter,
29
+ )
30
+
31
+
32
+ # ---------------------------------------------------------------------------
33
+ # Private helpers
34
+ # ---------------------------------------------------------------------------
35
+
36
+
37
+ def _fmt_char(c: complex) -> str:
38
+ """Format a root-of-unity character value as a compact string.
39
+
40
+ Examples: +1, -1, +i, -i, exp(+0.6667πi).
41
+ """
42
+ c = complex(c)
43
+ r, im = round(c.real, 6), round(c.imag, 6)
44
+ if abs(im) < 1e-6: # real
45
+ if abs(r - 1) < 1e-6:
46
+ return "+1"
47
+ if abs(r + 1) < 1e-6:
48
+ return "-1"
49
+ return f"{r:+.4g}"
50
+ if abs(r) < 1e-6: # pure imaginary
51
+ if abs(im - 1) < 1e-6:
52
+ return "+i"
53
+ if abs(im + 1) < 1e-6:
54
+ return "-i"
55
+ return f"{im:+.4g}i"
56
+ # general: express as exp(θπi)
57
+ theta_over_pi = round(np.angle(c) / np.pi, 6)
58
+ return f"exp({theta_over_pi:+.4g}πi)"
59
+
60
+
61
+ def _find_separating_elements(char_table: np.ndarray) -> np.ndarray:
62
+ """Find a minimal set of group-element indices whose character values
63
+ together uniquely identify every irrep row.
64
+
65
+ The identity (column 0, all-ones) is skipped. Elements are added greedily
66
+ until all n_irreps rows are distinct.
67
+
68
+ Returns integer array of column indices.
69
+ """
70
+ n_irreps, n_elems = char_table.shape
71
+ selected: list[int] = []
72
+ current_distinct = 1 # nothing selected → all rows look the same
73
+
74
+ def _rows_as_tuples(cols):
75
+ if not cols:
76
+ return [() for _ in range(n_irreps)]
77
+ sub = np.round(char_table[:, cols], 8)
78
+ return [
79
+ tuple(zip(sub[m].real.tolist(), sub[m].imag.tolist()))
80
+ for m in range(n_irreps)
81
+ ]
82
+
83
+ for j in range(1, n_elems): # j=0 is identity, skip
84
+ candidate = selected + [j]
85
+ nd = len(set(_rows_as_tuples(candidate)))
86
+ if nd > current_distinct:
87
+ selected.append(j)
88
+ current_distinct = nd
89
+ if current_distinct == n_irreps:
90
+ break
91
+
92
+ return np.array(selected, dtype=int)
93
+
94
+
95
+ def _fmt_labels(labels: list[str], n: int = 6) -> str:
96
+ """Format a label list, showing first 3 + last 3 if longer than n."""
97
+ if len(labels) <= n:
98
+ return ", ".join(labels)
99
+ return ", ".join(labels[:3]) + ", ..., " + ", ".join(labels[-3:])
100
+
101
+
102
+ def _label_to_character_index(labels: list[str], label: str) -> int:
103
+ try:
104
+ return labels.index(label)
105
+ except ValueError:
106
+ raise ValueError(
107
+ f"Unknown label {label!r}.\n" f"Available labels: {labels}."
108
+ ) from None
109
+
110
+
111
+ # ---------------------------------------------------------------------------
112
+ # LabeledRepresentation
113
+ # ---------------------------------------------------------------------------
114
+
115
+
116
+ class LabeledRepresentation(Representation):
117
+ """A :class:`~netket.symmetry.Representation` with automatic irrep labeling.
118
+
119
+ Extends the base :class:`~netket.symmetry.Representation` with:
120
+
121
+ * :attr:`irrep_labels` — a human-readable string for each irrep, derived
122
+ from character values on a minimal set of "separating" group elements.
123
+ For example: ``"+1"``, ``"-1"``, ``"+i"``, ``"exp(+0.3333πi)"``, or
124
+ tuples thereof for multi-generator groups.
125
+ * :meth:`projector` accepting a ``label=`` keyword in addition to the
126
+ integer ``character_index``.
127
+
128
+ The constructor signature is identical to
129
+ :class:`~netket.symmetry.Representation`, so existing code that passes a
130
+ ``(group, representation_dict)`` pair works unchanged.
131
+
132
+ Subclasses can override :attr:`irrep_labels` to provide physics-specific
133
+ names (e.g. ``"even"``/``"odd"`` for Z₂).
134
+
135
+ Examples
136
+ --------
137
+ Project a state onto the antisymmetric sector of a Z₂ group::
138
+
139
+ rep = nk.symmetry.spin_flip_representation(hilbert)
140
+ print(rep.irrep_labels) # ['+1', '-1']
141
+ proj = rep.projector(label='-1')
142
+
143
+ """
144
+
145
+ @cached_property
146
+ def irrep_labels(self) -> list[str]:
147
+ """Human-readable label for each irrep (one per ``character_index``).
148
+
149
+ Derived from character values on the minimal set of separating group
150
+ elements:
151
+
152
+ * Single separator: ``"+1"``, ``"-1"``, ``"+i"``, etc.
153
+ * Multiple separators: ``"(+1, -1)"``, ``"(-1, +i)"``, etc.
154
+
155
+ Subclasses override this with domain-specific labels.
156
+ """
157
+ ct = self.group.character_table() # (n_irreps, |G|)
158
+ sep = _find_separating_elements(ct)
159
+ chars = ct[:, sep] # (n_irreps, n_sep)
160
+
161
+ if chars.shape[1] == 1:
162
+ return [_fmt_char(chars[m, 0]) for m in range(len(chars))]
163
+ return [
164
+ "(" + ", ".join(_fmt_char(chars[m, j]) for j in range(chars.shape[1])) + ")"
165
+ for m in range(len(chars))
166
+ ]
167
+
168
+ def projector(
169
+ self, character_index=None, *, label=None, atol=1e-15
170
+ ) -> DiscreteJaxOperator:
171
+ """Build the projection operator for an irrep.
172
+
173
+ Accepts either:
174
+
175
+ * ``character_index`` (int): index into the character table, as in the
176
+ base :class:`~netket.symmetry.Representation`.
177
+ * ``label`` (str): human-readable label from :attr:`irrep_labels`.
178
+
179
+ Args:
180
+ character_index: Irrep index (0-based).
181
+ label: Irrep label string, e.g. ``"+1"`` or ``"-1"``.
182
+ atol: Tolerance for dropping near-zero projector terms.
183
+
184
+ Returns:
185
+ A :class:`~netket.operator.SumOperator` projection operator.
186
+
187
+ Raises:
188
+ ValueError: if ``label`` is not in :attr:`irrep_labels`.
189
+ TypeError: if neither or both arguments are supplied.
190
+ """
191
+ if character_index is not None and label is not None:
192
+ raise TypeError("Pass either character_index or label=, not both.")
193
+ if label is not None:
194
+ character_index = _label_to_character_index(self.irrep_labels, label)
195
+ if character_index is None:
196
+ raise TypeError(
197
+ "projector() requires either a positional character_index "
198
+ "or the keyword argument label=."
199
+ )
200
+ return super().projector(character_index, atol=atol)
201
+
202
+ def __str__(self) -> str:
203
+ try:
204
+ n = len(self.irrep_labels)
205
+ n_part = f", {n} irreps"
206
+ except Exception:
207
+ n_part = ""
208
+ n_elems = len(self.group.elems)
209
+ group_str = f"{type(self.group).__name__}({n_elems} elements)"
210
+ return f"{type(self).__name__}(hilbert={self.hilbert!r}, group={group_str}{n_part})"
211
+
212
+ def coset_filter(
213
+ self,
214
+ subgroup: LabeledRepresentation,
215
+ ) -> LabeledRepresentationCosetFilter:
216
+ """
217
+ Build the coset Fourier filter for this group G modulo subgroup H.
218
+
219
+ Args:
220
+ subgroup: :class:`LabeledRepresentation` for a subgroup H ≤ G.
221
+
222
+ Returns:
223
+ :class:`~netket.symmetry.LabeledRepresentationCosetFilter` for G/H.
224
+
225
+ Example::
226
+
227
+ rep_d4 = nk.symmetry.canonical_representation(hi, lattice.point_group())
228
+ rep_c4 = nk.symmetry.canonical_representation(hi, c4_subgroup)
229
+ C = rep_d4.coset_filter(rep_c4)
230
+ """
231
+ from netket._src.symmetry.labeled_representation_coset_filter import (
232
+ LabeledRepresentationCosetFilter,
233
+ )
234
+
235
+ return LabeledRepresentationCosetFilter(self, subgroup)
236
+
237
+ def __repr__(self) -> str:
238
+ try:
239
+ labels = self.irrep_labels
240
+ lbl_part = f"\n irreps=[{_fmt_labels(labels)}] ({len(labels)} total)"
241
+ except Exception:
242
+ lbl_part = ""
243
+ n_elems = len(self.group.elems)
244
+ return (
245
+ f"{type(self).__name__}(\n"
246
+ f" hilbert={self.hilbert!r},\n"
247
+ f" group={type(self.group).__name__}({n_elems} elements)"
248
+ f"{lbl_part}\n)"
249
+ )
@@ -0,0 +1,197 @@
1
+ # Copyright 2025 The NetKet Authors - All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import numpy as np
18
+
19
+ from netket.operator import SumOperator, DiscreteJaxOperator
20
+
21
+
22
+ class LabeledRepresentationCosetFilter:
23
+ """
24
+ Coset refinement operator for G/H where G and H are finite groups.
25
+
26
+ Used to extend the symmetry of a variational state one step at a time:
27
+ if a state is already projected onto the H-symmetric sector (irrep ρ|_H),
28
+ applying F_C(ρ) promotes it to the full G-symmetric sector (irrep ρ) using
29
+ only ``len(G)/len(H)`` operator terms instead of the ``len(G)`` terms of the full projector.
30
+
31
+ The refinement operator F_C(ρ) for irrep ρ of G satisfies::
32
+
33
+ P_G(ρ) = F_C(ρ) @ P_H(ρ|_H)
34
+
35
+ where C is a set of left-coset representatives of G/H.
36
+
37
+ Obtained via::
38
+
39
+ C = full_rep.coset_filter(sub_rep)
40
+ F = C.projector_refinement(label="A1") # |C| terms
41
+
42
+ Chaining::
43
+
44
+ C_d4_c2 = rep_d4.coset_filter(rep_c4).coset_filter(rep_c2)
45
+ """
46
+
47
+ def __init__(self, full_rep, sub_rep, *, _validate: bool = True) -> None:
48
+ if _validate:
49
+ # Check proper subgroup: types, same Hilbert space, and H < G.
50
+ from netket._src.symmetry.labeled_representation import (
51
+ LabeledRepresentation,
52
+ )
53
+
54
+ if not isinstance(full_rep, LabeledRepresentation):
55
+ raise TypeError(
56
+ f"full_rep must be a LabeledRepresentation, got {type(full_rep)}"
57
+ )
58
+ if not isinstance(sub_rep, LabeledRepresentation):
59
+ raise TypeError(
60
+ f"sub_rep must be a LabeledRepresentation, got {type(sub_rep)}"
61
+ )
62
+ if full_rep.hilbert != sub_rep.hilbert:
63
+ raise ValueError(
64
+ "full_rep and sub_rep must share the same Hilbert space; "
65
+ f"got {full_rep.hilbert!r} and {sub_rep.hilbert!r}."
66
+ )
67
+ n_full = len(full_rep.group.elems)
68
+ n_sub = len(sub_rep.group.elems)
69
+ if not full_rep.group.is_subgroup(sub_rep.group, proper=True):
70
+ raise ValueError(
71
+ "sub_rep must be a proper subgroup of full_rep: either the "
72
+ "groups are equal, |full| is not divisible by |sub|, or at "
73
+ "least one element of sub_rep is not in full_rep "
74
+ f"(|full|={n_full}, |sub|={n_sub})."
75
+ )
76
+
77
+ self._full_rep = full_rep
78
+ self._sub_rep = sub_rep
79
+
80
+ @property
81
+ def full_rep(self):
82
+ """The full-group representation G."""
83
+ return self._full_rep
84
+
85
+ @property
86
+ def sub_rep(self):
87
+ """The subgroup representation H."""
88
+ return self._sub_rep
89
+
90
+ @property
91
+ def n_coset_reps(self) -> int:
92
+ """``len(G) / len(H)`` — number of coset representatives."""
93
+ return len(self._full_rep.group.elems) // len(self._sub_rep.group.elems)
94
+
95
+ @property
96
+ def _coset_mask(self) -> np.ndarray:
97
+ """Bool mask of shape (|G|,) selecting one representative per left-coset.
98
+
99
+ np.asarray(group) returns inverse-permutation arrays (shape (|G|, N));
100
+ coset composition: (g*h)^{-1} = h^{-1}[g^{-1}] via numpy fancy indexing.
101
+ """
102
+ G_arr = np.asarray(self._full_rep.group)
103
+ H_arr = np.asarray(self._sub_rep.group)
104
+ covered: set[tuple] = set()
105
+ mask = np.zeros(len(G_arr), dtype=bool)
106
+ for i, g_inv in enumerate(G_arr):
107
+ key = tuple(g_inv)
108
+ if key in covered:
109
+ continue
110
+ mask[i] = True
111
+ for h_inv in H_arr:
112
+ covered.add(tuple(h_inv[g_inv]))
113
+ return mask
114
+
115
+ @property
116
+ def _coset_operators(self) -> tuple:
117
+ return tuple(
118
+ op for op, keep in zip(self._full_rep.operators, self._coset_mask) if keep
119
+ )
120
+
121
+ def chars(self, label: str) -> np.ndarray:
122
+ """
123
+ Character values χ_ρ(c) for each coset representative c.
124
+
125
+ Args:
126
+ label: Irrep label from ``full_rep.irrep_labels``.
127
+
128
+ Returns:
129
+ Complex array of shape (P,).
130
+ """
131
+ idx = self._full_rep.irrep_labels.index(label)
132
+ ct = self._full_rep.group.character_table()
133
+ return ct[idx, self._coset_mask]
134
+
135
+ def projector_refinement(
136
+ self,
137
+ *,
138
+ label: str,
139
+ atol: float = 1e-15,
140
+ ) -> DiscreteJaxOperator:
141
+ """
142
+ Build the coset refinement operator F_C(ρ).
143
+
144
+ This returns F_C alone (``len(G)/len(H)`` terms). To obtain the full
145
+ projector compose with the sub-group projector::
146
+
147
+ F_C @ sub_rep.projector(label=sub_label) == full_rep.projector(label)
148
+
149
+ Args:
150
+ label: Irrep label from ``full_rep.irrep_labels``.
151
+ atol: Drop operator terms with ``abs(coefficient)`` < atol.
152
+
153
+ Raises:
154
+ ValueError: if label is unknown.
155
+ """
156
+ try:
157
+ idx = self._full_rep.irrep_labels.index(label)
158
+ except ValueError as e:
159
+ raise ValueError(
160
+ f"Unknown label {label!r}. Valid: {self._full_rep.irrep_labels}."
161
+ ) from e
162
+
163
+ ct = self._full_rep.group.character_table()
164
+ d_rho = round(ct[idx, 0].real)
165
+ chars = ct[idx, self._coset_mask]
166
+
167
+ coefficients = d_rho * np.conj(chars) / self.n_coset_reps
168
+ keep = ~np.isclose(coefficients, 0.0, atol=atol)
169
+ kept_ops = [op for op, k in zip(self._coset_operators, keep) if k]
170
+ return SumOperator(*kept_ops, coefficients=coefficients[keep])
171
+
172
+ def coset_filter(self, subgroup) -> LabeledRepresentationCosetFilter:
173
+ """
174
+ Build the next coset filter in a refinement chain.
175
+
176
+ Delegates to :meth:`sub_rep.coset_filter(subgroup)
177
+ <netket._src.symmetry.labeled_representation.LabeledRepresentation.coset_filter>`,
178
+ so the result has ``full_rep = self.sub_rep`` and ``sub_rep = subgroup``::
179
+
180
+ C = rep_d4.coset_filter(rep_c4).coset_filter(rep_c2)
181
+ # equivalent to: rep_c4.coset_filter(rep_c2)
182
+
183
+ See :meth:`LabeledRepresentation.coset_filter
184
+ <netket._src.symmetry.labeled_representation.LabeledRepresentation.coset_filter>`
185
+ for the full documentation.
186
+ """
187
+ return self._sub_rep.coset_filter(subgroup)
188
+
189
+ def __repr__(self) -> str:
190
+ n_full = len(self._full_rep.group.elems)
191
+ n_sub = len(self._sub_rep.group.elems)
192
+ return (
193
+ f"{type(self).__name__}("
194
+ f"size={self.n_coset_reps} ({n_full}/{n_sub}), "
195
+ f"full_group={n_full} elements, "
196
+ f"sub_group={n_sub} elements)"
197
+ )
@@ -149,13 +149,18 @@ class Representation:
149
149
  projector = SumOperator(*operators, coefficients=coefficients)
150
150
  return projector
151
151
 
152
- def project(self, state, character_index: int, *, atol: float = 1e-15) -> MCState:
152
+ def project(
153
+ self, state, character_index=None, *, atol: float = 1e-15, **kwargs
154
+ ) -> MCState:
153
155
  """Return the state projected onto the subspace associated to the
154
156
  irreducible representation specified by character_index.
157
+
158
+ Additional keyword arguments are forwarded to :meth:`projector`, so
159
+ subclasses that accept ``label=``, ``k=``, etc. can be used here too.
155
160
  """
156
161
  from netket._src.vqs.transformed_vstate import apply_operator
157
162
 
158
- projector = self.projector(character_index, atol=atol)
163
+ projector = self.projector(character_index, atol=atol, **kwargs)
159
164
  projected_state = apply_operator(projector, state)
160
165
  return projected_state
161
166