Source code for qiskit_nature.second_q.hamiltonians.lattices.hexagonal_lattice
# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2021, 2024.
#
# 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 hexagonal lattice"""
from __future__ import annotations
from rustworkx import generators
from .lattice import Lattice
[docs]class HexagonalLattice(Lattice):
    """Hexagonal lattice."""
    def __init__(
        self,
        rows: int,
        cols: int,
        edge_parameter: complex = 1.0,
        onsite_parameter: complex = 0.0,
    ) -> None:
        """
        Args:
            rows: Number of hexagons in the x direction.
            cols: Number of hexagons in the y direction.
            edge_parameter: Weight on all the edges, specified as a single value.
                Defaults to 1.0.
            onsite_parameter: Weight on the self-loops, which are edges connecting a node to itself.
                Defaults to 0.0.
        """
        self._rows = rows
        self._cols = cols
        self._edge_parameter = edge_parameter
        self._onsite_parameter = onsite_parameter
        graph = generators.hexagonal_lattice_graph(rows, cols, multigraph=False)
        # Add edge weights
        for idx in range(graph.num_edges()):
            graph.update_edge_by_index(idx, self._edge_parameter)
        # Add self loops
        for node in range(graph.num_nodes()):
            graph.add_edges_from([(node, node, self._onsite_parameter)])
        super().__init__(graph)
        self.pos = self._default_position()
    @property
    def edge_parameter(self) -> complex:
        """Weights on all edges.
        Returns:
            the parameter for the edges.
        """
        return self._edge_parameter
    @property
    def onsite_parameter(self) -> complex:
        """Weight on the self-loops (edges connecting a node to itself).
        Returns:
            the parameter for the self-loops.
        """
        return self._onsite_parameter
    def _default_position(self) -> dict[int, tuple[int, int]]:
        """Return a dictionary of default positions for visualization of
            a one- or two-dimensional lattice.
        Returns:
            A dictionary where the keys are the labels of lattice points, and the values are
            two-dimensional coordinates.
        """
        pos = {}
        rowlen = 2 * self._rows + 2
        collen = self._cols + 1
        x_adjust = 0
        for i in range(collen):
            x_adjust += 1
            for j in range(rowlen):
                idx = i * rowlen + j - 1
                x = i
                # plot the y coords to form heavy hex shape
                if i == 0:
                    y = j - 1
                elif (self._cols % 2 == 0) and (i == self._cols):
                    y = j + 1
                else:
                    y = j
                # even numbered nodes in the first, last and odd numbered columns need to be
                # shifted to the right
                if i == 0 or (i == self._cols) or (i % 2 != 0):
                    if idx % 2 == 0:
                        x = i + x_adjust
                    else:
                        x = i + i
                # odd numbered nodes that aren't in the first, last or odd numbered columns
                # need to be shifted to the right
                else:
                    if idx % 2 == 0:
                        x = i + i
                    else:
                        x = i + x_adjust
                pos[idx] = (x, y)
        return pos