Source code for netket.operator._continuous_operator

# Copyright 2021 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.
import abc
from typing import Optional, Callable

from netket.utils.types import DType, PyTree, Array

from netket.hilbert import AbstractHilbert
from netket.operator import AbstractOperator


class ContinuousOperator(AbstractOperator):
    r"""This class is the abstract base class for operators defined on a
    continuous Hilbert space. Users interested in implementing new
    quantum Operators for continuous Hilbert spaces should subclass
    `ContinuousOperator` and implement its interface.
    """

[docs] def __init__(self, hilbert: AbstractHilbert, dtype: DType = float): r""" Constructs the continuous operator acting on the given hilbert space and with a certain data type. Args: hilbert: The underlying Hilbert space on which the operator is defined dtype: Data type of the matrix elements. Defaults to `np.float64` """ self._dtype = dtype super().__init__(hilbert)
@property def dtype(self) -> DType: return self._dtype @abc.abstractmethod def _expect_kernel( self, logpsi: Callable, params: PyTree, x: Array, data: Optional[PyTree] ): r"""This method defines the action of the local operator on a given quantum state `logpsi` for a given congfiguration `x`. :math:`O_{loc}(x) = \frac{\bra{x}O{\ket{\psi}}{\bra{x}\ket{\psi}}` This method is executed inside of a `jax.jit` block. Any static data from the operator itself should be captured in the method. Any additional data is provided by the `_pack_arguments`-method and will be passed as the `data` argument in this method (Example: masses in kinetic energy). Args: logpsi: variational state params: parameters for the variational state x: a sample of particle positions data: additional data """ @abc.abstractmethod def _pack_arguments(self) -> Optional[PyTree]: r"""This methods should return a PyTree that will be passed as the `data` argument to the `_expect_kernel`. The PyTree should be composed of jax arrays or hashable objects. For example for the kinetic energy this method would return the masses of the individual particles.""" def __add__(self, other): if isinstance(self, ContinuousOperator) and isinstance( other, ContinuousOperator ): from netket.operator import SumOperator return SumOperator(self, other) else: return NotImplemented # pragma: no cover def __rmul__(self, other): if isinstance(self, ContinuousOperator) and isinstance(other, float): return self * other else: return NotImplemented # pragma: no cover def __mul__(self, other): if isinstance(self, ContinuousOperator) and isinstance(other, float): from netket.operator import SumOperator return SumOperator(self, coefficients=other) else: return NotImplemented # pragma: no cover