# Copyright 2022 The NetKet Authors - All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Optional as _Optional
from netket.utils.types import DType as _DType
from netket.hilbert.abstract_hilbert import AbstractHilbert as _AbstractHilbert
from netket.experimental.operator import FermionOperator2nd as _FermionOperator2nd
[docs]
def destroy(
hilbert: _AbstractHilbert,
site: int,
sz: _Optional[int] = None,
cutoff: float = 1e-10,
dtype: _Optional[_DType] = None,
):
"""
Builds the fermion destruction operator :math:`\\hat{a}` acting
on the `site`-th of the Hilbert space `hilbert`.
Args:
hilbert: The hilbert space.
site: the site on which this operator acts.
sz: spin projection quantum number. This is the eigenvalue of
the corresponding spin-Z Pauli operator (e.g. `sz = ±1` for
a spin-1/2, `sz ∈ [-2, -1, 1, 2]` for a spin-3/2 and
in general `sz ∈ [-2S, -2S + 2, ... 2S-2, 2S]` for
a spin-S )
dtype: The datatype to use for the matrix elements.
Returns:
The resulting FermionOperator2nd
"""
idx = _get_index(hilbert, site, sz)
return _FermionOperator2nd(hilbert, (((idx, 0),),), dtype=dtype)
[docs]
def create(
hilbert: _AbstractHilbert,
site: int,
sz: _Optional[int] = None,
cutoff: float = 1e-10,
dtype: _Optional[_DType] = None,
):
"""
Builds the fermion creation operator :math:`\\hat{a}^\\dagger` acting
on the `site`-th of the Hilbert space `hilbert`.
Args:
hilbert: The hilbert space
site: the site on which this operator acts
sz: spin projection quantum number. This is the eigenvalue of
the corresponding spin-Z Pauli operator (e.g. `sz = ±1` for
a spin-1/2, `sz ∈ [-2, -1, 1, 2]` for a spin-3/2 and
in general `sz ∈ [-2S, -2S + 2, ... 2S-2, 2S]` for
a spin-S )
dtype: The datatype to use for the matrix elements.
Returns:
The resulting FermionOperator2nd
"""
idx = _get_index(hilbert, site, sz)
return _FermionOperator2nd(hilbert, (((idx, 1),),), dtype=dtype)
[docs]
def number(
hilbert: _AbstractHilbert,
site: int,
sz: _Optional[int] = None,
cutoff: float = 1e-10,
dtype: _Optional[_DType] = None,
):
"""
Builds the number operator :math:`\\hat{a}^\\dagger\\hat{a}` acting on the
`site`-th of the Hilbert space `hilbert`.
Args:
hilbert: The hilbert space
site: the site on which this operator acts
site: the site on which this operator acts
sz: spin projection quantum number. This is the eigenvalue of
the corresponding spin-Z Pauli operator (e.g. `sz = ±1` for
a spin-1/2, `sz ∈ [-2, -1, 1, 2]` for a spin-3/2 and
in general `sz ∈ [-2S, -2S + 2, ... 2S-2, 2S]` for
a spin-S )
dtype: The datatype to use for the matrix elements.
Returns:
The resulting FermionOperator2nd
"""
idx = _get_index(hilbert, site, sz)
return _FermionOperator2nd(
hilbert,
(
(
(idx, 1),
(idx, 0),
),
),
dtype=dtype,
)
def _get_index(hilbert: _AbstractHilbert, site: int, sz: _Optional[int] = None):
"""go from (site, spin_projection) indices to index in the (tensor) hilbert space"""
if sz is None:
if hasattr(hilbert, "spin") and hilbert.spin is not None:
raise ValueError(
"hilbert spaces with spin property require to specify the sz value to get the position in hilbert space"
)
return site
elif not hasattr(hilbert, "spin"):
raise ValueError("cannot specify sz for hilbert without spin property")
elif hasattr(hilbert, "_get_index"): # keep it general
idx = hilbert._get_index(site, sz)
if idx >= hilbert.size:
raise IndexError(
"requested site and sz combination is not present in the hilbert space"
)
return idx
else:
raise NotImplementedError(
f"no method _get_index available for hilbert space {hilbert} that allows to find the position in hilbert space based on a spin projection value sz"
)
[docs]
def identity(
hilbert: _AbstractHilbert, cutoff: float = 1e-10, dtype: _Optional[_DType] = None
):
"""
Builds the :math:`\\mathbb{I}` identity operator.
Args:
hilbert: The hilbert space.
dtype: The datatype to use for the matrix elements.
Returns:
An instance of {class}`nk.operator.LocalOperator`.
"""
return _FermionOperator2nd(hilbert, constant=1, dtype=dtype, cutoff=cutoff)
def zero(
hilbert: _AbstractHilbert, cutoff: float = 1e-10, dtype: _Optional[_DType] = None
):
"""
Builds the :math:`0` operator, which has no connected components.
Why we provide this is a mistery, as you could just multiply by 0.
Args:
hilbert: The hilbert space.
dtype: The datatype to use for the matrix elements.
Returns:
An instance of {class}`nk.operator.LocalOperator`."""
return _FermionOperator2nd(hilbert, constant=0, dtype=dtype, cutoff=cutoff)