# Source code for netket.operator

from ._C_netket.operator import *
import numpy as _np

[docs]def Ising(hilbert, h, J=1.0):
"""
Constructs a new Ising given a hilbert space, a transverse field,
and (if specified) a coupling constant.

Args:
hilbert: Hilbert space the operator acts on.
h: The strength of the transverse field.
J: The strength of the coupling. Default is 1.0.

Examples:
Constructs an Ising operator for a 1D system.

>>> import netket as nk
>>> g = nk.graph.Hypercube(length=20, n_dim=1, pbc=True)
>>> hi = nk.hilbert.Spin(s=0.5, graph=g)
>>> op = nk.operator.Ising(h=1.321, hilbert=hi, J=0.5)
>>> print(op.hilbert.size)
20
"""
sigma_x = _np.array([[0, 1], [1, 0]])
sz_sz = _np.array([[1, 0, 0, 0], [0, -1, 0, 0],
[0, 0, -1, 0], [0, 0, 0, 1]])
return GraphOperator(hilbert, siteops=[-h * sigma_x], bondops=[J * sz_sz])

[docs]def Heisenberg(hilbert, J=1, sign_rule=None):
"""
Constructs a new Heisenberg given a hilbert space.

Args:
hilbert: Hilbert space the operator acts on.
J: The strength of the coupling. Default is 1.
sign_rule: If enabled, Marshal's sign rule will be used. On a bipartite
lattice, this corresponds to a basis change flipping the Sz direction
at every odd site of the lattice. For non-bipartite lattices, the
sign rule cannot be applied. Defaults to True if the lattice is
bipartite, False otherwise.

Examples:
Constructs a Heisenberg operator for a 1D system.

>>> import netket as nk
>>> g = nk.graph.Hypercube(length=20, n_dim=1, pbc=True)
>>> hi = nk.hilbert.Spin(s=0.5, total_sz=0, graph=g)
>>> op = nk.operator.Heisenberg(hilbert=hi)
>>> print(op.hilbert.size)
20
"""
if sign_rule is None:
sign_rule = hilbert.graph.is_bipartite

sz_sz = _np.array([[1, 0, 0, 0], [0, -1, 0, 0],
[0, 0, -1, 0], [0, 0, 0, 1]])
exchange = _np.array(
[[0, 0, 0, 0], [0, 0, 2, 0], [0, 2, 0, 0], [0, 0, 0, 0]])
if sign_rule:
if not hilbert.graph.is_bipartite:
raise ValueError(
"sign_rule=True specified for a non-bipartite lattice")
heis_term = sz_sz - exchange
else:
heis_term = sz_sz + exchange
return GraphOperator(hilbert, bondops=[J * heis_term])