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