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