Source code for qiskit_nature.second_q.hamiltonians.ising_model

# This code is part of a Qiskit project.
# (C) Copyright IBM 2021, 2023.
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

"""The Ising model"""

from fractions import Fraction
import numpy as np
from qiskit_nature.second_q.operators import SpinOp

from .lattice_model import LatticeModel

[docs]class IsingModel(LatticeModel): r"""The transverse-field Ising model. This class implements the following Hamiltonian: .. math:: H = -\sum_{\langle i, j \rangle} J_{ij} Z_{i} Z_{j} - \sum_{i} g_{i} X_{i}, where :math:`i,j` refer to lattice nodes. The :math:`\sum_{\langle i, j \rangle}` is performed over adjacent lattice nodes. This model assumes spin-:math:`\frac{1}{2}` particles. Thus, :math:`X_i` and :math:`Z_i` represent the respective Pauli matrices. :math:`J_{ij}` are constants with dimensions of energy and :math:`g_{i}` are coupling parameters that determine the relative strength between the external transverse field and the nearest neighbor interactions. This model is instantiated using a :class:`~qiskit_nature.second_q.hamiltonians.lattices.Lattice`. For example, using a :class:`~qiskit_nature.second_q.hamiltonians.lattices.LineLattice`: .. code-block:: python line_lattice = LineLattice(num_nodes=10, boundary_condition=BoundaryCondition.OPEN) ising_model = IsingModel( line_lattice.uniform_parameters( uniform_interaction=-1.0, uniform_onsite_potential=0.0, ), ) """
[docs] def coupling_matrix(self) -> np.ndarray: """Return the coupling matrix.""" return self.interaction_matrix()
@property def register_length(self) -> int: return self._lattice.num_nodes
[docs] def second_q_op(self) -> SpinOp: """Return the Hamiltonian of the Ising model in terms of ``SpinOp``. Returns: SpinOp: The Hamiltonian of the Ising model. """ ham = {} weighted_edge_list = self._lattice.weighted_edge_list # kinetic terms for node_a, node_b, weight in weighted_edge_list: if node_a == node_b: index = node_a ham[f"X_{index}"] = weight else: index_left = node_a index_right = node_b coupling_parameter = weight ham[f"Z_{index_left} Z_{index_right}"] = coupling_parameter return SpinOp(ham, spin=Fraction(1, 2), num_spins=self._lattice.num_nodes)