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