netket.hilbert.CustomHilbert#

class netket.hilbert.CustomHilbert#

Bases: netket.hilbert.HomogeneousHilbert

A custom hilbert space with discrete local quantum numbers.

Inheritance
Inheritance diagram of netket.hilbert.CustomHilbert
__init__(local_states, N=1, constraint_fn=None, graph=None)[source]#

Constructs a new CustomHilbert given a list of eigenvalues of the states and a number of sites, or modes, within this hilbert space.

Parameters
  • local_states (list or None) โ€“ Eigenvalues of the states. If the allowed states are an infinite number, None should be passed as an argument.

  • 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.

  • graph (Optional[netket.graph.AbstractGraph]) โ€“

Examples

Simple custom hilbert space.

>>> import netket
>>> g = netket.graph.Hypercube(length=10,n_dim=2,pbc=True)
>>> hi = netket.hilbert.CustomHilbert(local_states=[-1232, 132, 0], N=100)
>>> print(hi.size)
100
Attributes
constrained#

Returns True if the hilbert space is constrained.

Return type

bool

is_finite#

Whether the local hilbert space is finite.

Return type

bool

is_indexable#

Whether the space can be indexed with an integer

Return type

bool

local_size#

Size of the local degrees of freedom that make the total hilbert space.

Return type

int

local_states#

A list of discrete local quantum numbers. If the local states are infinitely many, None is returned.

Return type

Optional[List[float]]

n_states#

The total dimension of the many-body Hilbert space. Throws an exception iff the space is not indexable.

Return type

int

shape#

The size of the hilbert space on every site.

Return type

Tuple[int, ...]

size#

The total number number of degrees of freedom.

Return type

int

Methods
all_states(out=None)#

Returns all valid states of the Hilbert space.

Throws an exception if the space is not indexable.

Parameters

out (Optional[ndarray]) โ€“ an optional pre-allocated output array

Return type

ndarray

Returns

A (n_states x size) batch of states. this corresponds to the pre-allocated array if it was passed.

numbers_to_states(numbers, out=None)#

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.

  • out (Optional[ndarray]) โ€“ Optional Array of quantum numbers corresponding to numbers.

Return type

ndarray

ptrace(sites)#

Returns the hilbert space without the selected sites.

Not all hilbert spaces support this operation.

Parameters

sites (Union[int, Iterable]) โ€“ a site or list of sites to trace away

Return type

AbstractHilbert

Returns

The partially-traced hilbert space. The type of the resulting hilbert space might be different from the starting one.

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

Array

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.]]
size_at_index(i)#

Size of the local degrees of freedom for the i-th variable.

Parameters

i (int) โ€“ The index of the desired site

Return type

int

Returns

The number of degrees of freedom at that site

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.

Return type

Iterator[ndarray]

states_at_index(i)#

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.

NOTE: This function is experimental. Use at your own risk.

Parameters

x โ€“ a tensor containing samples from this hilbert space

Returns

a tensor containing integer indices into the local hilbert

states_to_numbers(states, out=None)#

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.

  • out (Optional[ndarray]) โ€“ Array of integers such that out[k]=Index(states[k]). If None, memory is allocated.

Returns

Array of integers corresponding to out.

Return type

numpy.darray