Source code for qiskit_qec.geometry.tiles.diagonalhourglasstile

# This code is part of Qiskit.
#
# (C) Copyright IBM 2017, 2022
#
# 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.

"""DiagonalHourGlassTile class."""

import numpy as np
from qiskit.exceptions import QiskitError
from qiskit_qec.geometry.model.shell import Shell
from qiskit_qec.geometry.tiles.tile import Tile
from qiskit_qec.geometry.tiles.tilefactory import TileFactory
from qiskit_qec.operators.pauli_list import PauliList


# pylint: disable=anomalous-backslash-in-string)
[docs] class DiagonalHourGlassTile(Tile): r"""Diagonal Hour Glass Tile The diagram is as follows:: q0 q1 q1 q2 v0 v0 v0 v1 o- - - - - -o o- - - - - -o |\ q3 /| | | | \ v1 / | | | | 0 o o 1 | | 2 | | / v2\ | | | |/ q3 \| | | o- - - - - -o o- - - - - -o v2 v1 v3 v2 q4 q5 q5 q6 q4 q5 q5 q6 v0 v1 v0 v0 o- - - - - -o o- - - - - -o | | |\ q7 /| | | | \ v1 / | | 3 | | 4 o o 5 | | | | / v2\ | | | |/ q7 \| o- - - - - -o o- - - - - -o v3 v2 v2 v1 v8 v9 q9 q10 """ wf_operator_dict = { "pXXZZXX": [ PauliList(["XXX"]), PauliList(["XXX"]), PauliList(["ZZZZ"]), PauliList(["ZZZZ"]), PauliList(["XXX"]), PauliList(["XXX"]), ], "pZZXXZZ": [ PauliList(["ZZZ"]), PauliList(["ZZZ"]), PauliList(["XXXX"]), PauliList(["XXXX"]), PauliList(["ZZZ"]), PauliList(["ZZZ"]), ], } # Descriptions of wireframes # qubit indices for each wireframe wf_q_indices = [[0, 3, 4], [1, 5, 3], [1, 2, 6, 5], [4, 5, 9, 8], [5, 7, 9], [6, 10, 7]] # coordinates for each wireframe vertex in path list form to enable the # creation of the associate edges wf_coordinates = [ [[-2, 2], [-1, 1], [-2, 0]], [[0, 2], [0, 0], [-1, 1]], [[0, 2], [2, 2], [2, 0], [0, 0]], [[-2, 0], [0, 0], [0, -2], [-2, -2]], [[0, 0], [1, -1], [0, -2]], [[2, 0], [2, -2], [1, -1]], ] # If the wf's are closed loops or not wf_loop_indicator = [True, True, True, True, True, True] # How wireframes components combine into faces/operators faces_wf_components = [[0], [1], [2], [3], [4], [5]] # Face colors (wf's inherit colors from faces) face_colors = ["yellowgreen", "yellowgreen", "tomato", "tomato", "yellowgreen", "yellowgreen"] num_faces = 6 size = np.array([4, 4]) num_qubits = 11 u_vec = np.array([4, 0]) v_vec = np.array([0, 4]) def __new__( cls, origin: np.array, qubit_count=None, qubit_data=None, operators=None, optype="pXXZZXX", ) -> Shell: r"""Diagonal Hour Glass Tile The diagram is as follows:: o- - - - - -o- - - - - -o |\ /| | | \ / | | | 0 o o 1 | 2 | | / \ | | |/ \| | o- - - - - -o- - - - - -o | |\ /| | | \ / | | 3 | 4 o o 5 | | | / \ | | |/ \| o- - - - - -o- - - - - -o q0 q1 q1 q2 v0 v0 v0 v1 o- - - - - -o o- - - - - -o |\ q3 /| | | | \ v1 / | | | | 0 o o 1 | | 2 | | / v2\ | | | |/ q3 \| | | o- - - - - -o o- - - - - -o v2 v1 v3 v2 q4 q5 q5 q6 q4 q5 q5 q6 v0 v1 v0 v0 o- - - - - -o o- - - - - -o | | |\ q7 /| | | | \ v1 / | | 3 | | 4 o o 5 | | | | / v2\ | | | |/ q7 \| o- - - - - -o o- - - - - -o v3 v2 v2 v1 v8 v9 q9 q10 Face colors for faces [0,1,2,3,4,5] are ["yellowgreen", "yellowgreen", "tomato", "tomato", "yellowgreen","yellowgreen"] Preformatted operators are stored in DiagonalHourGlassTile.op_dict. Keys for op_dict are of the form [p|c]PPPP... where p = pattern and c = copy and P is a Pauli opertor X, Z, Y:: "pXXZZXX" -> #0 face is Pauli('XXX') operator, #1 face is Pauli('XXX'), #3 face is Pauli('ZZZZ') etc. Available precomputed operator layouts are:: "pXXZZXX", "pZZXXZZ" The operator variable may be used to define the operators specifically. The operator must be a list of PauliList objects where each PauliList describes the opertors to be built for the faces as indexed above 0,1,2,3, ... If the PauliList contains k Paulis then k operators will be created for the given face. Args: origin (np.array): Coordinates of origin of tile (shell) qubit_count: Qubit counter. Defaults to None. qubit_data: Qubit data. Defaults to None. operators: Operators for tile faces. Defaults to None. optype (optional): Which of the listed opertor mapppings to used. Defaults to "pXXZZXX". Raises: QiskitError: Unsupported operator type Returns: Shell: Returns a Diagonal Hour Glass tile (shell) with provided origin """ if operators is None: try: operators = DiagonalHourGlassTile.wf_operator_dict[optype] except KeyError as key_error: raise QiskitError(f"Unsupported operator type: {optype}") from key_error return TileFactory( origin=origin, wf_coordinates=DiagonalHourGlassTile.wf_coordinates, wf_q_indices=DiagonalHourGlassTile.wf_q_indices, wf_loop_indicator=DiagonalHourGlassTile.wf_loop_indicator, faces_wf_components=DiagonalHourGlassTile.faces_wf_components, num_qubits=DiagonalHourGlassTile.num_qubits, face_colors=DiagonalHourGlassTile.face_colors, qubit_count=qubit_count, qubit_data=qubit_data, operators=operators, )