NetKet 3.11.2__tar.gz → 3.11.4__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.11.2 → netket-3.11.4}/PKG-INFO +4 -3
- {netket-3.11.2 → netket-3.11.4}/netket/_version.py +2 -2
- {netket-3.11.2 → netket-3.11.4}/netket/driver/abstract_variational_driver.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/errors.py +4 -4
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/tdvp.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/tdvp_common.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/tdvp_schmitt.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/vmc_srt.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/dynamics/_rk_solver_structures.py +2 -2
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/dynamics/_rk_tableau.py +7 -7
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/renyi2/exact.py +6 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/_fermion_operator_2nd_base.py +38 -18
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/_fermion_operator_2nd_utils.py +21 -5
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/qsr/driver.py +2 -2
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/qsr/logic_helpers.py +3 -3
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_chunk_utils.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_grad.py +3 -1
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/jacobian_pytree.py +2 -2
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/logic.py +14 -10
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_scanmap.py +5 -3
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_utils_random.py +4 -2
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_utils_tree.py +18 -10
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_vmap_chunked.py +9 -3
- {netket-3.11.2 → netket-3.11.4}/netket/jax/sharding.py +4 -2
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_discrete_operator_jax.py +25 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/common.py +6 -4
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_jacobian_common.py +3 -3
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_jacobian_dense.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_jacobian_pytree.py +6 -6
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_jacobian_pytree_logic.py +3 -3
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_onthefly.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/qgt_onthefly_logic.py +2 -2
- {netket-3.11.2 → netket-3.11.4}/netket/utils/holomorphic.py +6 -6
- {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/pytree.py +14 -9
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/base.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/common.py +1 -1
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_forces.py +5 -1
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_grad.py +2 -2
- {netket-3.11.2 → netket-3.11.4}/pyproject.toml +2 -1
- {netket-3.11.2 → netket-3.11.4}/.gitignore +0 -0
- {netket-3.11.2 → netket-3.11.4}/LICENSE +0 -0
- {netket-3.11.2 → netket-3.11.4}/README.md +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/callbacks/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/callbacks/convergence_stopping.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/callbacks/earlystopping.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/callbacks/invalidlossstopping.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/callbacks/timeout.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/driver/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/driver/steady_state.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/driver/vmc.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/driver/vmc_common.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/exact.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/driver/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/dynamics/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/dynamics/_rk_solver.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/hilbert/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/hilbert/spin_orbital_fermions.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/logging/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/logging/hdf5_log.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/models/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/models/fast_rnn.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/models/rnn.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/cells.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/layers.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/layers_fast.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/nn/rnn/ordering.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/renyi2/S2_operator.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/renyi2/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/observable/renyi2/expect.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/_fermion_operator_2nd_jax.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/_fermion_operator_2nd_numba.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/fermion.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/operator/pyscf.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/qsr/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/qsr/dataset.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/metropolis.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/metropolis_pmap.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/metropolis_pt.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/rules/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/sampler/rules/fermion_2nd.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/vqs/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/experimental/vqs/io.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/graph/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/graph/_lattice_edge_logic.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/graph/abstract_graph.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/graph/common_lattices.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/graph/graph.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/graph/lattice.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/graph/space_group.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/abstract_hilbert.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/continuous_hilbert.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/custom_hilbert.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/discrete_hilbert.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/doubled_hilbert.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/fock.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/homogeneous.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/index/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/index/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/index/constrained.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/index/unconstrained.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/particle.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/qubit.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/custom.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/doubled.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/fock.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/particle.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/qubit.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/spin.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/random/tensor_hilbert.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/spin.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/tensor_hilbert.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/hilbert/tensor_hilbert_discrete.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_expect.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/default_mode.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_jacobian/jacobian_dense.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_math.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_utils_dtype.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_vjp.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/jax/_vjp_chunked.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/logging/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/logging/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/logging/json_log.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/logging/runtime_log.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/logging/state_log.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/logging/tensorboard.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/README.md +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/autoreg.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/deepset.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/equivariant.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/fast_autoreg.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/full_space.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/gaussian.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/jastrow.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/mlp.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/mps.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/ndm.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/rbm.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/slater.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/models/utils.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/activation.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/blocks/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/blocks/deepset.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/blocks/mlp.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/blocks/symmetry_sum.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/deprecation.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/fast_masked_linear.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/initializers.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/masked_linear.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/symmetric_linear.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/nn/utils.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_abstract_observable.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_abstract_operator.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_abstract_super_operator.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_bose_hubbard.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_continuous_operator.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_discrete_operator.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_graph_operator.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_hamiltonian.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_heisenberg.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_ising/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_ising/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_ising/jax.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_ising/numba.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_kinetic.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_lazy.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_liouvillian.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/compile_helpers.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/convert.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/helpers.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/jax.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_local_operator/numba.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_pauli_strings/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_pauli_strings/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_pauli_strings/jax.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_pauli_strings/numba.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_potential.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/_sumoperators.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/boson.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/operator/spin.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/linear_operator.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/preconditioner.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/qgt/default.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/solver/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/solver/solvers.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/optimizer/sr.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/autoreg.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/exact.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/metropolis.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/metropolis_numpy.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/continuous_gaussian.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/custom_numpy.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/exchange.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/fixed.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/hamiltonian.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/hamiltonian_numpy.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/langevin.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/local.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/local_numpy.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/multiple.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/sampler/rules/tensor.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/stats/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/stats/_autocorr.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/stats/mc_stats.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/stats/mc_stats_old.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/stats/mpi_stats.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/tools/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/tools/_common.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/tools/_cpu_info.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/tools/_mpi_info.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/tools/check_mpi.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/tools/info.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/_dependencies_check.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/array.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/config_flags.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/deprecation.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/dispatch.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/float.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/_group.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/_permutation_group.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/_point_group.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/_semigroup.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/axial.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/cubic.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/icosa.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/group/planar.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/history.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/jax.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/base.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/flax.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/haiku.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/model_frameworks/jax.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/moduletools.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/mpi/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/mpi/mpi.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/mpi/primitives.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/numbers.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/optional_deps.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/partial.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/_version.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/alias.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/autoreload.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/dispatcher.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/function.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/method.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/overload.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/parametric.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/promotion.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/py.typed +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/repr.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/resolver.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/signature.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/type.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/plum/util.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/seed.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/static_number.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/dataclass.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/fields.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/struct/utils.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/summation.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/types.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/utils/version_check.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/deprecated.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/experimental.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/full_summ/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/full_summ/expect.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/full_summ/state.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/kernels.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_mixed_state/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_mixed_state/expect.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_mixed_state/expect_chunked.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_mixed_state/state.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/__init__.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_chunked.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_forces_chunked.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/expect_grad_chunked.py +0 -0
- {netket-3.11.2 → netket-3.11.4}/netket/vqs/mc/mc_state/state.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: NetKet
|
|
3
|
-
Version: 3.11.
|
|
3
|
+
Version: 3.11.4
|
|
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/#
|
|
@@ -26,7 +26,7 @@ Requires-Dist: jaxlib<0.5,>=0.4.3
|
|
|
26
26
|
Requires-Dist: numba4jax<0.1,>=0.0.10.post1
|
|
27
27
|
Requires-Dist: numba<0.60,>=0.52
|
|
28
28
|
Requires-Dist: numpy~=1.20
|
|
29
|
-
Requires-Dist: optax<0.
|
|
29
|
+
Requires-Dist: optax<0.3,>=0.1.3
|
|
30
30
|
Requires-Dist: orjson<4,>=3.4
|
|
31
31
|
Requires-Dist: rich>=10.0
|
|
32
32
|
Requires-Dist: scipy<2,>=1.5.3
|
|
@@ -44,6 +44,7 @@ Requires-Dist: pytest-cov>=2.10.1; extra == 'dev'
|
|
|
44
44
|
Requires-Dist: pytest-json-report>=1.3; extra == 'dev'
|
|
45
45
|
Requires-Dist: pytest-xdist[psutil]>=2; extra == 'dev'
|
|
46
46
|
Requires-Dist: pytest>=6; extra == 'dev'
|
|
47
|
+
Requires-Dist: qutip>=5; extra == 'dev'
|
|
47
48
|
Requires-Dist: ruff==0.1.0; extra == 'dev'
|
|
48
49
|
Requires-Dist: wheel; extra == 'dev'
|
|
49
50
|
Provides-Extra: docs
|
|
@@ -376,7 +376,7 @@ class AbstractVariationalDriver(abc.ABC):
|
|
|
376
376
|
|
|
377
377
|
# Do not unpack operators, even if they are pytrees!
|
|
378
378
|
# this is necessary to support jax operators.
|
|
379
|
-
return jax.tree_map(
|
|
379
|
+
return jax.tree_util.tree_map(
|
|
380
380
|
self._estimate_stats,
|
|
381
381
|
observables,
|
|
382
382
|
is_leaf=lambda x: isinstance(x, AbstractObservable),
|
|
@@ -587,7 +587,7 @@ class RealQGTComplexDomainError(NetketError):
|
|
|
587
587
|
>>> _, vec = vstate.expect_and_grad(nk.operator.spin.sigmax(vstate.hilbert, 1))
|
|
588
588
|
>>> G = nk.optimizer.qgt.QGTOnTheFly(vstate, holomorphic=False)
|
|
589
589
|
>>>
|
|
590
|
-
>>> vec_real = jax.
|
|
590
|
+
>>> vec_real = jax.tree.map(lambda x: x.real, vec)
|
|
591
591
|
>>> sol = G@vec_real
|
|
592
592
|
|
|
593
593
|
Or, if you used the QGT in a linear solver, try using:
|
|
@@ -601,7 +601,7 @@ class RealQGTComplexDomainError(NetketError):
|
|
|
601
601
|
>>> _, vec = vstate.expect_and_grad(nk.operator.spin.sigmax(vstate.hilbert, 1))
|
|
602
602
|
>>>
|
|
603
603
|
>>> G = nk.optimizer.qgt.QGTOnTheFly(vstate, holomorphic=False)
|
|
604
|
-
>>> vec_real = jax.
|
|
604
|
+
>>> vec_real = jax.tree.map(lambda x: x.real, vec)
|
|
605
605
|
>>>
|
|
606
606
|
>>> linear_solver = jax.scipy.sparse.linalg.cg
|
|
607
607
|
>>> solution, info = G.solve(linear_solver, vec_real)
|
|
@@ -624,14 +624,14 @@ class RealQGTComplexDomainError(NetketError):
|
|
|
624
624
|
|
|
625
625
|
.. code:: python
|
|
626
626
|
|
|
627
|
-
>>> vec_real = jax.tree_map(lambda x: x.real, vec)
|
|
627
|
+
>>> vec_real = jax.tree_util.tree_map(lambda x: x.real, vec)
|
|
628
628
|
>>> G@vec_real
|
|
629
629
|
|
|
630
630
|
If you used the QGT in a linear solver, try using:
|
|
631
631
|
|
|
632
632
|
.. code:: python
|
|
633
633
|
|
|
634
|
-
>>> vec_real = jax.tree_map(lambda x: x.real, vec)
|
|
634
|
+
>>> vec_real = jax.tree_util.tree_map(lambda x: x.real, vec)
|
|
635
635
|
>>> G.solve(linear_solver, vec_real)
|
|
636
636
|
|
|
637
637
|
to fix this error.
|
|
@@ -162,7 +162,7 @@ def odefun_tdvp( # noqa: F811
|
|
|
162
162
|
|
|
163
163
|
@partial(jax.jit, static_argnums=(3, 4))
|
|
164
164
|
def _map_parameters(forces, parameters, loss_grad_factor, propagation_type, state_T):
|
|
165
|
-
forces = jax.tree_map(
|
|
165
|
+
forces = jax.tree_util.tree_map(
|
|
166
166
|
lambda x, target: loss_grad_factor * x,
|
|
167
167
|
forces,
|
|
168
168
|
parameters,
|
|
@@ -478,7 +478,7 @@ def odefun_host_callback(state, driver, *args, **kwargs):
|
|
|
478
478
|
if config.netket_experimental_disable_ode_jit:
|
|
479
479
|
return odefun(state, driver, *args, **kwargs)
|
|
480
480
|
|
|
481
|
-
result_shape = jax.tree_map(
|
|
481
|
+
result_shape = jax.tree_util.tree_map(
|
|
482
482
|
lambda x: jax.ShapeDtypeStruct(x.shape, x.dtype),
|
|
483
483
|
state.parameters,
|
|
484
484
|
)
|
|
@@ -280,7 +280,7 @@ def odefun_schmitt(state: MCState, self: TDVPSchmitt, t, w, *, stage=0): # noqa
|
|
|
280
280
|
|
|
281
281
|
@partial(jax.jit, static_argnums=(3, 4))
|
|
282
282
|
def _map_parameters(forces, parameters, loss_grad_factor, propagation_type, state_T):
|
|
283
|
-
forces = jax.tree_map(
|
|
283
|
+
forces = jax.tree_util.tree_map(
|
|
284
284
|
lambda x, target: loss_grad_factor * x,
|
|
285
285
|
forces,
|
|
286
286
|
parameters,
|
|
@@ -210,7 +210,7 @@ class VMC_SRt(AbstractVariationalDriver):
|
|
|
210
210
|
self.jacobian_mode = jacobian_mode
|
|
211
211
|
self._linear_solver_fn = linear_solver_fn
|
|
212
212
|
|
|
213
|
-
self._params_structure = jax.tree_map(
|
|
213
|
+
self._params_structure = jax.tree_util.tree_map(
|
|
214
214
|
lambda x: jax.ShapeDtypeStruct(x.shape, x.dtype), self.state.parameters
|
|
215
215
|
)
|
|
216
216
|
if not nkjax.tree_ishomogeneous(self._params_structure):
|
|
@@ -104,7 +104,7 @@ def euclidean_norm(x: Union[PyTree, Array]):
|
|
|
104
104
|
return jnp.sqrt(
|
|
105
105
|
jax.tree_util.tree_reduce(
|
|
106
106
|
lambda x, y: x + y,
|
|
107
|
-
jax.tree_map(lambda x: jnp.sum(jnp.abs(x) ** 2), x),
|
|
107
|
+
jax.tree_util.tree_map(lambda x: jnp.sum(jnp.abs(x) ** 2), x),
|
|
108
108
|
)
|
|
109
109
|
)
|
|
110
110
|
|
|
@@ -119,7 +119,7 @@ def maximum_norm(x: Union[PyTree, Array]):
|
|
|
119
119
|
return jnp.sqrt(
|
|
120
120
|
jax.tree_util.tree_reduce(
|
|
121
121
|
jnp.maximum,
|
|
122
|
-
jax.tree_map(lambda x: jnp.max(jnp.abs(x)), x),
|
|
122
|
+
jax.tree_util.tree_map(lambda x: jnp.max(jnp.abs(x)), x),
|
|
123
123
|
)
|
|
124
124
|
)
|
|
125
125
|
|
|
@@ -32,7 +32,7 @@ def expand_dim(tree: PyTree, sz: int):
|
|
|
32
32
|
def _expand(x):
|
|
33
33
|
return jnp.zeros((sz, *x.shape), dtype=x.dtype)
|
|
34
34
|
|
|
35
|
-
return jax.tree_map(_expand, tree)
|
|
35
|
+
return jax.tree_util.tree_map(_expand, tree)
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
@dataclass
|
|
@@ -114,19 +114,19 @@ class TableauRKExplicit:
|
|
|
114
114
|
|
|
115
115
|
k = expand_dim(y_t, self.stages)
|
|
116
116
|
for l in range(self.stages):
|
|
117
|
-
dy_l = jax.tree_map(
|
|
117
|
+
dy_l = jax.tree_util.tree_map(
|
|
118
118
|
lambda k: jnp.tensordot(
|
|
119
119
|
jnp.asarray(self.a[l], dtype=k.dtype), k, axes=1
|
|
120
120
|
),
|
|
121
121
|
k,
|
|
122
122
|
)
|
|
123
|
-
y_l = jax.tree_map(
|
|
123
|
+
y_l = jax.tree_util.tree_map(
|
|
124
124
|
lambda y_t, dy_l: jnp.asarray(y_t + dt * dy_l, dtype=dy_l.dtype),
|
|
125
125
|
y_t,
|
|
126
126
|
dy_l,
|
|
127
127
|
)
|
|
128
128
|
k_l = f(times[l], y_l, stage=l)
|
|
129
|
-
k = jax.tree_map(lambda k, k_l: k.at[l].set(k_l), k, k_l)
|
|
129
|
+
k = jax.tree_util.tree_map(lambda k, k_l: k.at[l].set(k_l), k, k_l)
|
|
130
130
|
|
|
131
131
|
return k
|
|
132
132
|
|
|
@@ -141,7 +141,7 @@ class TableauRKExplicit:
|
|
|
141
141
|
k = self._compute_slopes(f, t, dt, y_t)
|
|
142
142
|
|
|
143
143
|
b = self.b[0] if self.b.ndim == 2 else self.b
|
|
144
|
-
y_tp1 = jax.tree_map(
|
|
144
|
+
y_tp1 = jax.tree_util.tree_map(
|
|
145
145
|
lambda y_t, k: y_t
|
|
146
146
|
+ jnp.asarray(dt, dtype=y_t.dtype)
|
|
147
147
|
* jnp.tensordot(jnp.asarray(b, dtype=k.dtype), k, axes=1),
|
|
@@ -167,7 +167,7 @@ class TableauRKExplicit:
|
|
|
167
167
|
|
|
168
168
|
k = self._compute_slopes(f, t, dt, y_t)
|
|
169
169
|
|
|
170
|
-
y_tp1 = jax.tree_map(
|
|
170
|
+
y_tp1 = jax.tree_util.tree_map(
|
|
171
171
|
lambda y_t, k: y_t
|
|
172
172
|
+ jnp.asarray(dt, dtype=y_t.dtype)
|
|
173
173
|
* jnp.tensordot(jnp.asarray(self.b[0], dtype=k.dtype), k, axes=1),
|
|
@@ -175,7 +175,7 @@ class TableauRKExplicit:
|
|
|
175
175
|
k,
|
|
176
176
|
)
|
|
177
177
|
db = self.b[0] - self.b[1]
|
|
178
|
-
y_err = jax.tree_map(
|
|
178
|
+
y_err = jax.tree_util.tree_map(
|
|
179
179
|
lambda k: jnp.asarray(dt, dtype=k.dtype)
|
|
180
180
|
* jnp.tensordot(jnp.asarray(db, dtype=k.dtype), k, axes=1),
|
|
181
181
|
k,
|
|
@@ -16,6 +16,7 @@ import numpy as np
|
|
|
16
16
|
|
|
17
17
|
from netket.vqs import FullSumState, expect
|
|
18
18
|
from netket.stats import Stats
|
|
19
|
+
from netket.utils import module_version
|
|
19
20
|
|
|
20
21
|
from .S2_operator import Renyi2EntanglementEntropy
|
|
21
22
|
|
|
@@ -37,6 +38,11 @@ def Renyi2(vstate: FullSumState, op: Renyi2EntanglementEntropy):
|
|
|
37
38
|
|
|
38
39
|
rdm = state_qutip.ptrace(np.arange(N)[mask])
|
|
39
40
|
|
|
41
|
+
# TODO: when we drop support for qutip older versions, always keep this
|
|
42
|
+
# qutip 5 was released in march 2024
|
|
43
|
+
if module_version("qutip") >= (5, 0, 0):
|
|
44
|
+
rdm = rdm.data.to_array()
|
|
45
|
+
|
|
40
46
|
n = 2
|
|
41
47
|
out = np.log2(np.trace(np.linalg.matrix_power(rdm, n))) / (1 - n)
|
|
42
48
|
out = np.absolute(out.real)
|
|
@@ -19,9 +19,9 @@ import numpy as np
|
|
|
19
19
|
from numbers import Number
|
|
20
20
|
|
|
21
21
|
from netket.utils.types import DType
|
|
22
|
-
from netket.operator
|
|
22
|
+
from netket.operator import DiscreteOperator, Transpose
|
|
23
23
|
from netket.operator._pauli_strings.base import _count_of_locations
|
|
24
|
-
from netket.hilbert
|
|
24
|
+
from netket.hilbert import AbstractHilbert
|
|
25
25
|
from netket.utils.numbers import is_scalar, dtype as _dtype
|
|
26
26
|
from netket.utils.optional_deps import import_optional_dependency
|
|
27
27
|
|
|
@@ -31,7 +31,7 @@ from ._fermion_operator_2nd_utils import (
|
|
|
31
31
|
_convert_terms_to_spin_blocks,
|
|
32
32
|
_canonicalize_input,
|
|
33
33
|
_check_hermitian,
|
|
34
|
-
|
|
34
|
+
transpose_term,
|
|
35
35
|
_remove_dict_zeros,
|
|
36
36
|
_verify_input,
|
|
37
37
|
OperatorDict,
|
|
@@ -267,10 +267,18 @@ class FermionOperator2ndBase(DiscreteOperator):
|
|
|
267
267
|
def operators(self) -> OperatorDict:
|
|
268
268
|
"""Returns a dictionary with (term, weight) key-value pairs, with terms in tuple notation.
|
|
269
269
|
|
|
270
|
-
The constant diagonal shift of the operator is associated with a term represented as an
|
|
270
|
+
The constant diagonal shift of the operator is associated with a term represented as an
|
|
271
|
+
empty tuple.
|
|
271
272
|
"""
|
|
272
273
|
return self._operators
|
|
273
274
|
|
|
275
|
+
@property
|
|
276
|
+
def cutoff(self) -> float:
|
|
277
|
+
"""Threshold for the weights, if the absolute value of a weight is below the
|
|
278
|
+
cutoff, it's discarded.
|
|
279
|
+
"""
|
|
280
|
+
return self._cutoff
|
|
281
|
+
|
|
274
282
|
def copy(self, *, dtype: Optional[DType] = None, cutoff=None):
|
|
275
283
|
"""
|
|
276
284
|
Creates a deep copy of this operator, potentially changing the dtype of the
|
|
@@ -458,23 +466,35 @@ class FermionOperator2ndBase(DiscreteOperator):
|
|
|
458
466
|
op = self.copy(dtype=dtype)
|
|
459
467
|
return op.__imul__(scalar)
|
|
460
468
|
|
|
469
|
+
def transpose(self, *, concrete=False):
|
|
470
|
+
r"""Returns the transpose of this operator.
|
|
471
|
+
|
|
472
|
+
For real operators, this is equivalent to complex conjugation.
|
|
473
|
+
This implementation always returns the concrete version of the operator.
|
|
474
|
+
"""
|
|
475
|
+
if concrete:
|
|
476
|
+
new = type(self)(self.hilbert, dtype=self.dtype, cutoff=self._cutoff)
|
|
477
|
+
# operators (c,c†) are real already. Only conjugate coefficients if needed.
|
|
478
|
+
new._operators = {transpose_term(k): v for k, v in self._operators.items()}
|
|
479
|
+
return new
|
|
480
|
+
else:
|
|
481
|
+
return Transpose(self)
|
|
482
|
+
|
|
461
483
|
def conjugate(self, *, concrete=False):
|
|
462
|
-
r"""Returns the complex conjugate of this operator.
|
|
484
|
+
r"""Returns the complex conjugate of this operator.
|
|
463
485
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
486
|
+
This implementation always returns the concrete version of the operator.
|
|
487
|
+
"""
|
|
488
|
+
del concrete
|
|
467
489
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
self.
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
new._cutoff = self._cutoff
|
|
477
|
-
return new
|
|
490
|
+
# if operator is real dtype, then just return a copy
|
|
491
|
+
if not np.issubdtype(self.dtype, np.complex_):
|
|
492
|
+
return self.copy()
|
|
493
|
+
else:
|
|
494
|
+
new = type(self)(self.hilbert, dtype=self.dtype, cutoff=self._cutoff)
|
|
495
|
+
# operators (c,c†) are real already. Only conjugate coefficients if needed.
|
|
496
|
+
new._operators = {k: np.conjugate(v) for k, v in self._operators.items()}
|
|
497
|
+
return new
|
|
478
498
|
|
|
479
499
|
def to_normal_order(self):
|
|
480
500
|
"""Reoder the operators to normal order.
|
|
@@ -224,13 +224,29 @@ def _herm_conj(
|
|
|
224
224
|
terms: OperatorTermsList, weights: OperatorWeightsList = 1
|
|
225
225
|
) -> tuple[OperatorTermsList, OperatorWeightsList]:
|
|
226
226
|
"""Returns the hermitian conjugate of the terms and weights."""
|
|
227
|
+
conj_term = transpose_terms(terms)
|
|
228
|
+
conj_weight = [np.conjugate(weight) for weight in weights]
|
|
229
|
+
return conj_term, conj_weight
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def transpose_terms(terms: OperatorTermsList) -> OperatorTermsList:
|
|
233
|
+
"""Returns the transpose of the terms (creation/destruction operators).
|
|
234
|
+
The transpose is equivalent to the hermitian transpose because they are
|
|
235
|
+
real.
|
|
236
|
+
"""
|
|
227
237
|
conj_term = []
|
|
228
|
-
|
|
229
|
-
# loop over all terms and weights and get the hermitian conjugate
|
|
230
|
-
for term, weight in zip(terms, weights):
|
|
238
|
+
for term in terms:
|
|
231
239
|
conj_term.append([(op, 1 - int(dag)) for (op, dag) in reversed(term)])
|
|
232
|
-
|
|
233
|
-
|
|
240
|
+
return conj_term
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def transpose_term(term: OperatorTerm) -> OperatorTerm:
|
|
244
|
+
"""Returns the transpose of a single term (creation/destruction operators).
|
|
245
|
+
The transpose is equivalent to the hermitian transpose because they are
|
|
246
|
+
real.
|
|
247
|
+
"""
|
|
248
|
+
# equivalent to transpose_terms
|
|
249
|
+
return tuple((op, 1 - int(dag)) for (op, dag) in reversed(term))
|
|
234
250
|
|
|
235
251
|
|
|
236
252
|
def _convert_terms_to_spin_blocks(
|
|
@@ -268,7 +268,7 @@ class QSR(AbstractVariationalDriver):
|
|
|
268
268
|
|
|
269
269
|
# gather gradient
|
|
270
270
|
# grad <- grad - grad_cv + E[grad_cv]
|
|
271
|
-
self._grad_pos = jax.tree_map(
|
|
271
|
+
self._grad_pos = jax.tree_util.tree_map(
|
|
272
272
|
lambda x, y, Ey: x - y + Ey,
|
|
273
273
|
self._grad_pos,
|
|
274
274
|
self._grad_pos_cv,
|
|
@@ -281,7 +281,7 @@ class QSR(AbstractVariationalDriver):
|
|
|
281
281
|
|
|
282
282
|
# restore the square in prob = |psi|^2
|
|
283
283
|
if not self.mixed_states:
|
|
284
|
-
self._loss_grad = jax.tree_map(lambda x: x * 2.0, self._loss_grad)
|
|
284
|
+
self._loss_grad = jax.tree_util.tree_map(lambda x: x * 2.0, self._loss_grad)
|
|
285
285
|
|
|
286
286
|
# If parameters are real, then take only real part of the gradient (if it's complex)
|
|
287
287
|
self._loss_grad = tree_cast(self._loss_grad, self.state.parameters)
|
|
@@ -49,7 +49,7 @@ def _avg_O(afun, pars, model_state, sigma):
|
|
|
49
49
|
sigma = sigma.reshape((-1, sigma.shape[-1]))
|
|
50
50
|
_, vjp = nkjax.vjp(lambda W: afun({"params": W, **model_state}, sigma), pars)
|
|
51
51
|
(O_avg,) = vjp(jnp.ones(sigma.shape[0]) / sigma.shape[0])
|
|
52
|
-
return jax.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
|
|
52
|
+
return jax.tree_util.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
@dispatch
|
|
@@ -84,7 +84,7 @@ def _avg_O_exact(hilbert: AbstractHilbert, afun, pars, model_state):
|
|
|
84
84
|
psi_2 = jnp.abs(jnp.exp(afun({"params": pars, **model_state}, sigma))) ** 2
|
|
85
85
|
psi_2 /= jnp.sum(psi_2)
|
|
86
86
|
(O_avg,) = vjp(psi_2)
|
|
87
|
-
return jax.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
|
|
87
|
+
return jax.tree_util.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
|
|
88
88
|
|
|
89
89
|
|
|
90
90
|
@dispatch
|
|
@@ -181,7 +181,7 @@ def _grad_local_value_rotated(log_psi, pars, model_state, sigma_p, mel, secs):
|
|
|
181
181
|
|
|
182
182
|
(O_avg,) = vjp(jnp.ones_like(log_val_rotated) / log_val_rotated.size)
|
|
183
183
|
|
|
184
|
-
O_avg = jax.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
|
|
184
|
+
O_avg = jax.tree_util.tree_map(lambda x: mpi.mpi_mean_jax(x)[0], O_avg)
|
|
185
185
|
|
|
186
186
|
return log_val_rotated, O_avg
|
|
187
187
|
|
|
@@ -188,7 +188,9 @@ def value_and_grad(
|
|
|
188
188
|
)(*args, **kwargs)
|
|
189
189
|
|
|
190
190
|
out = out_r + 1j * out_j
|
|
191
|
-
grad = jax.tree_map(
|
|
191
|
+
grad = jax.tree_util.tree_map(
|
|
192
|
+
lambda re, im: re + 1j * im, grad_r, grad_j
|
|
193
|
+
)
|
|
192
194
|
|
|
193
195
|
if has_aux:
|
|
194
196
|
return out, grad, aux
|
|
@@ -50,7 +50,7 @@ def _jacobian_cplx(
|
|
|
50
50
|
params: PyTree,
|
|
51
51
|
samples: Array,
|
|
52
52
|
*,
|
|
53
|
-
_build_fn: Callable = partial(jax.tree_map, jax.lax.complex),
|
|
53
|
+
_build_fn: Callable = partial(jax.tree_util.tree_map, jax.lax.complex),
|
|
54
54
|
) -> PyTree:
|
|
55
55
|
"""Calculates Jacobian entries by vmapping grad.
|
|
56
56
|
Assumes the function is R→C, backpropagates 1 and -1j
|
|
@@ -85,7 +85,7 @@ def stack_jacobian_tuple(ok_re_im):
|
|
|
85
85
|
centered_oks_re_im : a tuple (ΔOᵣ, ΔOᵢ) of two PyTrees representing the real and imag part of ΔOⱼₖ
|
|
86
86
|
"""
|
|
87
87
|
re, im = ok_re_im
|
|
88
|
-
return jax.tree_map(lambda re, im: jnp.stack([re, im], axis=0), re, im)
|
|
88
|
+
return jax.tree_util.tree_map(lambda re, im: jnp.stack([re, im], axis=0), re, im)
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
jacobian_real_holo_fun = jacobian_real_holo
|
|
@@ -158,7 +158,7 @@ def jacobian(
|
|
|
158
158
|
.. code:: python
|
|
159
159
|
|
|
160
160
|
samples = samples.reshape(-1, samples.shape[-1])
|
|
161
|
-
parameters = jax.tree_map(lambda x: x.real, parameters)
|
|
161
|
+
parameters = jax.tree_util.tree_map(lambda x: x.real, parameters)
|
|
162
162
|
O_k = jax.jacrev(lambda pars: logpsi(pars, samples).real, parameters)
|
|
163
163
|
|
|
164
164
|
The jacobian that is returned is a PyTree with the same shape
|
|
@@ -201,7 +201,7 @@ def jacobian(
|
|
|
201
201
|
samples = samples.reshape(-1, samples.shape[-1])
|
|
202
202
|
Or_k = jax.jacrev(lambda pars: logpsi(pars, samples).real, parameters)
|
|
203
203
|
Oi_k = jax.jacrev(lambda pars: logpsi(pars, samples).imag, parameters)
|
|
204
|
-
O_k = jax.tree_map(lambda jr, ji: jnp.concatenate([jr, ji]], axis=1),
|
|
204
|
+
O_k = jax.tree_util.tree_map(lambda jr, ji: jnp.concatenate([jr, ji]], axis=1),
|
|
205
205
|
Or_k, Oi_k)
|
|
206
206
|
|
|
207
207
|
As both :code:`Or_k` and :code:`Oi_k` are real, instead of concatenating we
|
|
@@ -220,7 +220,7 @@ def jacobian(
|
|
|
220
220
|
|
|
221
221
|
.. code:: python
|
|
222
222
|
|
|
223
|
-
O_k_cmplx = jax.tree_map(lambda jri: jri[:, 0, :] + 1j* jri[:, 1, :], O_k)
|
|
223
|
+
O_k_cmplx = jax.tree_util.tree_map(lambda jri: jri[:, 0, :] + 1j* jri[:, 1, :], O_k)
|
|
224
224
|
|
|
225
225
|
|
|
226
226
|
**If some parameters** :math:`\theta_k` **are complex**, this mode splits the
|
|
@@ -249,13 +249,13 @@ def jacobian(
|
|
|
249
249
|
|
|
250
250
|
samples = samples.reshape(-1, samples.shape[-1])
|
|
251
251
|
# tree_to_real splits the parameters in a tuple like
|
|
252
|
-
# {'real': jax.
|
|
252
|
+
# {'real': jax.tree.map(jnp.real, pars), 'imag': jax.tree.map(jnp.imag, pars)}
|
|
253
253
|
pars_real, reconstruct = nk.jax.tree_to_real(parameters)
|
|
254
254
|
Or_k = jax.jacrev(lambda pars_re: logpsi(reconstruct(pars_re), samples).real,
|
|
255
255
|
pars_real)
|
|
256
256
|
Oi_k = jax.jacrev(lambda pars_re: logpsi(reconstruct(pars_re), samples).imag,
|
|
257
257
|
pars_real)
|
|
258
|
-
O_k = jax.tree_map(lambda jr, ji: jnp.concatenate([jr, ji]], axis=1),
|
|
258
|
+
O_k = jax.tree_util.tree_map(lambda jr, ji: jnp.concatenate([jr, ji]], axis=1),
|
|
259
259
|
Or_k, Oi_k)
|
|
260
260
|
|
|
261
261
|
This code is also valid if all parameters are real, in which case :code:`O_k.real`
|
|
@@ -352,20 +352,24 @@ def jacobian(
|
|
|
352
352
|
|
|
353
353
|
if pdf is None:
|
|
354
354
|
if center:
|
|
355
|
-
jacobians = jax.tree_map(
|
|
355
|
+
jacobians = jax.tree_util.tree_map(
|
|
356
|
+
lambda x: subtract_mean(x, axis=0), jacobians
|
|
357
|
+
)
|
|
356
358
|
|
|
357
359
|
if _sqrt_rescale:
|
|
358
360
|
sqrt_n_samp = math.sqrt(
|
|
359
361
|
samples.shape[0] * mpi.n_nodes
|
|
360
362
|
) # maintain weak type
|
|
361
|
-
jacobians = jax.tree_map(lambda x: x / sqrt_n_samp, jacobians)
|
|
363
|
+
jacobians = jax.tree_util.tree_map(lambda x: x / sqrt_n_samp, jacobians)
|
|
362
364
|
|
|
363
365
|
else:
|
|
364
366
|
if center:
|
|
365
|
-
jacobians_avg = jax.tree_map(
|
|
367
|
+
jacobians_avg = jax.tree_util.tree_map(
|
|
366
368
|
partial(sum_mpi, axis=0), _multiply_by_pdf(jacobians, pdf)
|
|
367
369
|
)
|
|
368
|
-
jacobians = jax.tree_map(
|
|
370
|
+
jacobians = jax.tree_util.tree_map(
|
|
371
|
+
lambda x, y: x - y, jacobians, jacobians_avg
|
|
372
|
+
)
|
|
369
373
|
|
|
370
374
|
if _sqrt_rescale:
|
|
371
375
|
jacobians = _multiply_by_pdf(jacobians, jnp.sqrt(pdf))
|
|
@@ -379,7 +383,7 @@ def _multiply_by_pdf(oks, pdf):
|
|
|
379
383
|
Used to multiply the log-derivatives by the probability density.
|
|
380
384
|
"""
|
|
381
385
|
|
|
382
|
-
return jax.tree_map(
|
|
386
|
+
return jax.tree_util.tree_map(
|
|
383
387
|
lambda x: jax.lax.broadcast_in_dim(pdf, x.shape, (0,)) * x,
|
|
384
388
|
oks,
|
|
385
389
|
)
|
|
@@ -10,8 +10,10 @@ if jax.__version_info__ >= (0, 4, 16):
|
|
|
10
10
|
else:
|
|
11
11
|
from jax import linear_util as lu
|
|
12
12
|
|
|
13
|
-
_tree_add = partial(jax.tree_map, jax.lax.add)
|
|
14
|
-
_tree_zeros_like = partial(
|
|
13
|
+
_tree_add = partial(jax.tree_util.tree_map, jax.lax.add)
|
|
14
|
+
_tree_zeros_like = partial(
|
|
15
|
+
jax.tree_util.tree_map, lambda x: jnp.zeros(x.shape, dtype=x.dtype)
|
|
16
|
+
)
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
# TODO put it somewhere
|
|
@@ -62,7 +64,7 @@ def scan_append_reduce(f, x, append_cond, op=_tree_add, zero_fun=_tree_zeros_lik
|
|
|
62
64
|
"""
|
|
63
65
|
# TODO: different op for each result
|
|
64
66
|
|
|
65
|
-
x0 = jax.tree_map(lambda x: x[0], x)
|
|
67
|
+
x0 = jax.tree_util.tree_map(lambda x: x[0], x)
|
|
66
68
|
|
|
67
69
|
# special code path if there is only one element
|
|
68
70
|
# to avoid having to rely on xla/llvm to optimize the overhead away
|
|
@@ -36,7 +36,9 @@ def PRNGKey(
|
|
|
36
36
|
else:
|
|
37
37
|
key = seed
|
|
38
38
|
|
|
39
|
-
key = jax.tree_map(
|
|
39
|
+
key = jax.tree_util.tree_map(
|
|
40
|
+
lambda k: mpi.mpi_bcast_jax(k, root=root, comm=comm)[0], key
|
|
41
|
+
)
|
|
40
42
|
|
|
41
43
|
return key
|
|
42
44
|
|
|
@@ -90,7 +92,7 @@ def mpi_split(key, *, root=0, comm=MPI_jax_comm) -> PRNGKeyT:
|
|
|
90
92
|
# on all MPI nodes?
|
|
91
93
|
keys = jax.random.split(key, mpi.n_nodes)
|
|
92
94
|
|
|
93
|
-
keys = jax.tree_map(lambda k: mpi.mpi_bcast_jax(k, root=root)[0], keys)
|
|
95
|
+
keys = jax.tree_util.tree_map(lambda k: mpi.mpi_bcast_jax(k, root=root)[0], keys)
|
|
94
96
|
|
|
95
97
|
return keys[mpi.rank]
|
|
96
98
|
|
|
@@ -76,14 +76,16 @@ def tree_leaf_iscomplex(pars: PyTree) -> bool:
|
|
|
76
76
|
"""
|
|
77
77
|
Returns true if at least one leaf in the tree has complex dtype.
|
|
78
78
|
"""
|
|
79
|
-
return any(
|
|
79
|
+
return any(
|
|
80
|
+
jax.tree_util.tree_leaves(jax.tree_util.tree_map(jnp.iscomplexobj, pars))
|
|
81
|
+
)
|
|
80
82
|
|
|
81
83
|
|
|
82
84
|
def tree_leaf_isreal(pars: PyTree) -> bool:
|
|
83
85
|
"""
|
|
84
86
|
Returns true if at least one leaf in the tree has real dtype.
|
|
85
87
|
"""
|
|
86
|
-
return any(jax.tree_util.tree_leaves(jax.tree_map(jnp.isrealobj, pars)))
|
|
88
|
+
return any(jax.tree_util.tree_leaves(jax.tree_util.tree_map(jnp.isrealobj, pars)))
|
|
87
89
|
|
|
88
90
|
|
|
89
91
|
def tree_ishomogeneous(pars: PyTree) -> bool:
|
|
@@ -100,7 +102,9 @@ def tree_conj(t: PyTree) -> PyTree:
|
|
|
100
102
|
Args:
|
|
101
103
|
t: pytree
|
|
102
104
|
"""
|
|
103
|
-
return jax.tree_map(
|
|
105
|
+
return jax.tree_util.tree_map(
|
|
106
|
+
lambda x: jax.lax.conj(x) if jnp.iscomplexobj(x) else x, t
|
|
107
|
+
)
|
|
104
108
|
|
|
105
109
|
|
|
106
110
|
@jax.jit
|
|
@@ -116,7 +120,9 @@ def tree_dot(a: PyTree, b: PyTree) -> Scalar:
|
|
|
116
120
|
"""
|
|
117
121
|
return jax.tree_util.tree_reduce(
|
|
118
122
|
jax.numpy.add,
|
|
119
|
-
jax.
|
|
123
|
+
jax.tree_util.tree_map(
|
|
124
|
+
jax.numpy.sum, jax.tree_util.tree_map(jax.numpy.multiply, a, b)
|
|
125
|
+
),
|
|
120
126
|
)
|
|
121
127
|
|
|
122
128
|
|
|
@@ -135,7 +141,7 @@ def tree_cast(x: PyTree, target: PyTree) -> PyTree:
|
|
|
135
141
|
"""
|
|
136
142
|
# astype alone would also work, however that raises ComplexWarning when casting complex to real
|
|
137
143
|
# therefore the real is taken first where needed
|
|
138
|
-
return jax.tree_map(
|
|
144
|
+
return jax.tree_util.tree_map(
|
|
139
145
|
lambda x, target: (x if jnp.iscomplexobj(target) else x.real).astype(
|
|
140
146
|
target.dtype
|
|
141
147
|
),
|
|
@@ -157,9 +163,9 @@ def tree_axpy(a: Scalar, x: PyTree, y: PyTree) -> PyTree:
|
|
|
157
163
|
where the leaves of x are first scaled with a.
|
|
158
164
|
"""
|
|
159
165
|
if is_scalar(a):
|
|
160
|
-
return jax.tree_map(lambda x_, y_: a * x_ + y_, x, y)
|
|
166
|
+
return jax.tree_util.tree_map(lambda x_, y_: a * x_ + y_, x, y)
|
|
161
167
|
else:
|
|
162
|
-
return jax.tree_map(lambda a_, x_, y_: a_ * x_ + y_, a, x, y)
|
|
168
|
+
return jax.tree_util.tree_map(lambda a_, x_, y_: a_ * x_ + y_, a, x, y)
|
|
163
169
|
|
|
164
170
|
|
|
165
171
|
class RealImagTuple(tuple):
|
|
@@ -188,8 +194,8 @@ def _tree_to_real(x):
|
|
|
188
194
|
if tree_leaf_iscomplex(x):
|
|
189
195
|
# TODO find a way to make it a nop?
|
|
190
196
|
# return jax.vmap(lambda y: jnp.array((y.real, y.imag)))(x)
|
|
191
|
-
r = jax.tree_map(lambda x: x.real if jnp.iscomplexobj(x) else x, x)
|
|
192
|
-
i = jax.tree_map(lambda x: x.imag if jnp.iscomplexobj(x) else None, x)
|
|
197
|
+
r = jax.tree_util.tree_map(lambda x: x.real if jnp.iscomplexobj(x) else x, x)
|
|
198
|
+
i = jax.tree_util.tree_map(lambda x: x.imag if jnp.iscomplexobj(x) else None, x)
|
|
193
199
|
return RealImagTuple((r, i))
|
|
194
200
|
else:
|
|
195
201
|
return x
|
|
@@ -198,7 +204,9 @@ def _tree_to_real(x):
|
|
|
198
204
|
def _tree_to_real_inverse(x):
|
|
199
205
|
if isinstance(x, RealImagTuple):
|
|
200
206
|
# not using jax.lax.complex because it would convert scalars to arrays
|
|
201
|
-
return jax.tree_map(
|
|
207
|
+
return jax.tree_util.tree_map(
|
|
208
|
+
lambda re, im: re + 1j * im if im is not None else re, *x
|
|
209
|
+
)
|
|
202
210
|
else:
|
|
203
211
|
return x
|
|
204
212
|
|