From 591a736e20aa7844f31bc1dbc18341aad03682ea Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Tue, 24 Sep 2024 10:54:08 +0200 Subject: [PATCH] feat: using int indices in place of letters --- src/qibo/quantum_info/basis.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/qibo/quantum_info/basis.py b/src/qibo/quantum_info/basis.py index 5bbe47480..162e641a7 100644 --- a/src/qibo/quantum_info/basis.py +++ b/src/qibo/quantum_info/basis.py @@ -1,5 +1,4 @@ from itertools import product -from string import ascii_letters from typing import Optional import numpy as np @@ -93,15 +92,18 @@ def pauli_basis( pauli_labels = {"I": matrices.I, "X": matrices.X, "Y": matrices.Y, "Z": matrices.Z} basis_single = backend.cast([pauli_labels[label] for label in pauli_order]) + if backend.name == "tensorflow": + einsum = np.einsum + else: + einsum = backend.np.einsum if nqubits > 1: dim = 2**nqubits - letters = [ascii_letters[3 * i : 3 * (i + 1)] for i in range(nqubits)] - lhs = ",".join(letters) - rhs = "".join([letter for group in zip(*letters) for letter in group]) - basis_full = backend.np.einsum( - f"{lhs}->{rhs}", *[basis_single for _ in range(nqubits)] - ).reshape(4**nqubits, dim, dim) + input_indices = [range(3 * i, 3 * (i + 1)) for i in range(nqubits)] + output_indices = (i for indices in zip(*input_indices) for i in indices) + operands = [basis_single for _ in range(nqubits)] + inputs = [item for pair in zip(operands, input_indices) for item in pair] + basis_full = einsum(*inputs, output_indices).reshape(4**nqubits, dim, dim) else: basis_full = basis_single