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