netket.hilbert.HomogeneousHilbert#
- class netket.hilbert.HomogeneousHilbert[source]#
Bases:
DiscreteHilbert
The Abstract base class for homogeneous hilbert spaces.
This class should only be subclassed and should not be instantiated directly.
Note
To override the logic to index into constrained hilbert spaces, it is possible to use an informal interface built on top of non-public indexing classes.
In particular, you can override the following properties and methods:
Do not specify the
constraint_fn
keyword argument when calling the init method of this abstract class.Override the property
constrained
, to return True or False depending on your own logic.Override the property
_hilbert_index
to return an hilbert index object (see the discussion in the source code of the foldernetket/hilbert/index/__init__.py
).
- Inheritance
- __init__(local_states, N=1, constraint_fn=None)[source]#
Constructs a new
HomogeneousHilbert
given a list of eigenvalues of the states and a number of sites, or modes, within this hilbert space.This method should only be called from the subclasses __init__ method.
- Parameters:
local_states (
Optional
[StaticRange
]) –StaticRange
object describing the numbers used to encode the local degree of freedom of this Hilbert Space.N (
int
) – Number of modes in this hilbert space (default 1).constraint_fn (
Optional
[Callable
]) – A function specifying constraints on the quantum numbers. Given a batch of quantum numbers it should return a vector of bools specifying whether those states are valid or not.
- Attributes
- constrained#
The hilbert space does not contain prod(hilbert.shape) basis states.
Typical constraints are population constraints (such as fixed number of bosons, fixed magnetization…) which ensure that only a subset of the total unconstrained space is populated.
Typically, objects defined in the constrained space cannot be converted to QuTiP or other formats.
- is_finite#
Whether the local hilbert space is finite.
- is_indexable#
Whether the space can be indexed with an integer
- local_size#
Size of the local degrees of freedom that make the total hilbert space.
- local_states#
A list of discrete local quantum numbers. If the local states are infinitely many, None is returned.
- n_states#
The total dimension of the many-body Hilbert space. Throws an exception iff the space is not indexable.
- shape#
The size of the hilbert space on every site.
- size#
The total number number of degrees of freedom.
- Methods
- all_states()[source]#
Returns all valid states of the Hilbert space.
Throws an exception if the space is not indexable.
- Return type:
- Returns:
A (n_states x size) batch of states. this corresponds to the pre-allocated array if it was passed.
- numbers_to_states(numbers)#
Returns the quantum numbers corresponding to the n-th basis state for input n.
n is an array of integer indices such that
numbers[k]=Index(states[k])
. Throws an exception iff the space is not indexable.- Parameters:
numbers (
numpy.array
) – Batch of input numbers to be converted into arrays of quantum numbers.- Return type:
- ptrace(sites)#
Returns the hilbert space without the selected sites.
Not all hilbert spaces support this operation.
- random_state(key=None, size=None, dtype=<class 'numpy.float32'>)#
Generates either a single or a batch of uniformly distributed random states. Runs as
random_state(self, key, size=None, dtype=np.float32)
by default.- Parameters:
key – rng state from a jax-style functional generator.
size (
Optional
[int
]) – If provided, returns a batch of configurations of the form(size, N)
if size is an integer or(*size, N)
if it is a tuple and where \(N\) is the Hilbert space size. By default, a single random configuration with shape(#,)
is returned.dtype – DType of the resulting vector.
- Return type:
- Returns:
A state or batch of states sampled from the uniform distribution on the hilbert space.
Example
>>> import netket, jax >>> hi = netket.hilbert.Qubit(N=2) >>> k1, k2 = jax.random.split(jax.random.PRNGKey(1)) >>> print(hi.random_state(key=k1)) [1. 0.] >>> print(hi.random_state(key=k2, size=2)) [[0. 0.] [0. 1.]]
- states()#
Returns an iterator over all valid configurations of the Hilbert space. Throws an exception iff the space is not indexable. Iterating over all states with this method is typically inefficient, and
`all_states`
should be preferred.
- states_at_index(i)[source]#
A list of discrete local quantum numbers at the site i.
If the local states are infinitely many, None is returned.
- Parameters:
i (
int
) – The index of the desired site.- Returns:
A list of values or None if there are infinitely many.
- states_to_local_indices(x)[source]#
Returns a tensor with the same shape of x, where all local values are converted to indices in the range 0…self.shape[i]. This function is guaranteed to be jax-jittable.
For the Fock space this returns x, but for other hilbert spaces such as Spin this returns an array of indices.
Warning
This function is experimental. Use at your own risk.
- states_to_numbers(states)#
Returns the basis state number corresponding to given quantum states.
The states are given in a batch, such that states[k] has shape (hilbert.size). Throws an exception iff the space is not indexable.
- Parameters:
states (
ndarray
) – Batch of states to be converted into the corresponding integers.- Returns:
Array of integers corresponding to states.
- Return type:
numpy.darray