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 http://www.apache.org/licenses/LICENSE-2.0.
#
# 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)