From ce82a33249f9a4d5b1935d88bea4b2f1307828ea Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 11 Dec 2023 17:02:44 +0400 Subject: [PATCH 01/60] feat: implemented numba clifford operations --- src/qibojit/backends/clifford.py | 139 ++++++++++++++++++++++++++++++ src/qibojit/backends/clifford.py~ | 95 ++++++++++++++++++++ src/qibojit/backends/cpu.py | 5 ++ 3 files changed, 239 insertions(+) create mode 100644 src/qibojit/backends/clifford.py create mode 100644 src/qibojit/backends/clifford.py~ diff --git a/src/qibojit/backends/clifford.py b/src/qibojit/backends/clifford.py new file mode 100644 index 00000000..2dedabd9 --- /dev/null +++ b/src/qibojit/backends/clifford.py @@ -0,0 +1,139 @@ +from numba import njit +from qibo.backends.clifford import CliffordOperations as CO + + +class CliffordOperations(CO): + def __init__(self, engine): + super().__init__(engine) + + @staticmethod + def I(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.I)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def H(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.H)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def CNOT(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CNOT)( + symplectic_matrix, control_q, target_q, nqubits + ) + + @staticmethod + def CZ(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CZ)( + symplectic_matrix, control_q, target_q, nqubits + ) + + @staticmethod + def S(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.S)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def Z(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.Z)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def X(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.X)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def Y(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.Y)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def SX(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SX)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def SDG(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SDG)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def SXDG(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SXDG)( + symplectic_matrix, q, nqubits + ) + + @staticmethod + def RX(symplectic_matrix, q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RX)( + symplectic_matrix, q, nqubits, theta + ) + + @staticmethod + def RZ(symplectic_matrix, q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RZ)( + symplectic_matrix, q, nqubits, theta + ) + + @staticmethod + def RY(symplectic_matrix, q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RY)( + symplectic_matrix, q, nqubits, theta + ) + + @staticmethod + def SWAP(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.SWAP)( + symplectic_matrix, control_q, target_q, nqubits + ) + + @staticmethod + def iSWAP(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)( + CO.iSWAP + )(symplectic_matrix, control_q, target_q, nqubits) + + @staticmethod + def FSWAP(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)( + CO.FSWAP + )(symplectic_matrix, control_q, target_q, nqubits) + + @staticmethod + def CY(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CY)( + symplectic_matrix, control_q, target_q, nqubits + ) + + @staticmethod + def CRX(symplectic_matrix, control_q, target_q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)( + CO.CRX + )(symplectic_matrix, control_q, target_q, nqubits, theta) + + @staticmethod + def CRZ(symplectic_matrix, control_q, target_q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)( + CO.CRZ + )(symplectic_matrix, control_q, target_q, nqubits, theta) + + @staticmethod + def CRY(symplectic_matrix, control_q, target_q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)( + CO.CRY + )(symplectic_matrix, control_q, target_q, nqubits, theta) + + @staticmethod + def ECR(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.ECR)( + symplectic_matrix, control_q, target_q, nqubits + ) diff --git a/src/qibojit/backends/clifford.py~ b/src/qibojit/backends/clifford.py~ new file mode 100644 index 00000000..cd3f793c --- /dev/null +++ b/src/qibojit/backends/clifford.py~ @@ -0,0 +1,95 @@ +from numba import njit +from qibo.backends.clifford import CliffordOperations as CO + +class CliffordOperations(CO): + + def __init__(self, engine): + super().__init__(engine) + + @staticmethod + def I(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.I)(symplectic_matrix, q, nqubits) + + @staticmethod + def H(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.H)(symplectic_matrix, q, nqubits) + + @staticmethod + def CNOT(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CNOT)(symplectic_matrix, control_q, target_q, nqubits) + + @staticmethod + def CZ(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CZ)(symplectic_matrix, control_q, target_q, nqubits) + + @staticmethod + def S(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.S)(symplectic_matrix, q, nqubits) + + @staticmethod + def Z(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.Z)(symplectic_matrix, q, nqubits) + + @staticmethod + def X(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.X)(symplectic_matrix, q, nqubits) + + @staticmethod + def Y(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.Y)(symplectic_matrix, q, nqubits) + + @staticmethod + def SX(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SX)(symplectic_matrix, q, nqubits) + + @staticmethod + def SDG(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SDG)(symplectic_matrix, q, nqubits) + + @staticmethod + def SXDG(symplectic_matrix, q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SXDG)(symplectic_matrix, q, nqubits) + + @staticmethod + def RX(symplectic_matrix, q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RX)(symplectic_matrix, q, nqubits, theta) + + @staticmethod + def RZ(symplectic_matrix, q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RZ)(symplectic_matrix, q, nqubits, theta) + + @staticmethod + def RY(symplectic_matrix, q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RY)(symplectic_matrix, q, nqubits, theta) + + @staticmethod + def SWAP(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.SWAP)(symplectic_matrix, control_q, target_q, nqubits) + + @staticmethod + def iSWAP(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.iSWAP)(symplectic_matrix, control_q, target_q, nqubits) + + @staticmethod + def FSWAP(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.FSWAP)(symplectic_matrix, control_q, target_q, nqubits) + + @staticmethod + def CY(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CY)(symplectic_matrix, control_q, target_q, nqubits) + + @staticmethod + def CRX(symplectic_matrix, control_q, target_q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)(CO.CRX)(symplectic_matrix, control_q, target_q, nqubits, theta) + + @staticmethod + def CRZ(symplectic_matrix, control_q, target_q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)(CO.CRZ)(symplectic_matrix, control_q, target_q, nqubits, theta) + + @staticmethod + def CRY(symplectic_matrix, control_q, target_q, nqubits, theta): + return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)(CO.CRY)(symplectic_matrix, control_q, target_q, nqubits, theta) + + @staticmethod + def ECR(symplectic_matrix, control_q, target_q, nqubits): + return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.ECR)(symplectic_matrix, control_q, target_q, nqubits) diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index 4ae8deaf..db3bf222 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -1,4 +1,5 @@ import numpy as np +from numba import njit from qibo.backends.numpy import NumpyBackend from qibo.config import log from qibo.gates.abstract import ParametrizedGate @@ -69,6 +70,10 @@ def __init__(self): else: self.set_threads(len(psutil.Process().cpu_affinity())) + from qibojit.backends.clifford import CliffordOperations + + self.clifford_operations = CliffordOperations(self.np) + def set_precision(self, precision): if precision != self.precision: super().set_precision(precision) From 53aecc63470f601152356d5e9042d2a0e04eeac4 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 13 Dec 2023 14:48:05 +0400 Subject: [PATCH 02/60] feat: rewrote the operations as numba loops --- src/qibojit/backends/clifford.py | 306 +++++++++++++++++++++---------- 1 file changed, 212 insertions(+), 94 deletions(-) diff --git a/src/qibojit/backends/clifford.py b/src/qibojit/backends/clifford.py index 2dedabd9..f8bffea7 100644 --- a/src/qibojit/backends/clifford.py +++ b/src/qibojit/backends/clifford.py @@ -1,4 +1,5 @@ -from numba import njit +import numpy as np +from numba import njit, prange from qibo.backends.clifford import CliffordOperations as CO @@ -7,133 +8,250 @@ def __init__(self, engine): super().__init__(engine) @staticmethod - def I(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.I)( - symplectic_matrix, q, nqubits - ) - - @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def H(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.H)( - symplectic_matrix, q, nqubits - ) + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + tmp = symplectic_matrix[i, q] + symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] + symplectic_matrix[:, nqubits + q] = tmp + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) def CNOT(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CNOT)( - symplectic_matrix, control_q, target_q, nqubits - ) + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( + x[i, target_q] ^ ~z[i, control_q] + ) + symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) def CZ(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CZ)( - symplectic_matrix, control_q, target_q, nqubits - ) + """Decomposition --> H-CNOT-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ ( + x[i, control_q] + & x[i, target_q] + & (z[i, target_q] ^ ~z[i, control_q]) + ) + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, control_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def S(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.S)( - symplectic_matrix, q, nqubits - ) + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def Z(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.Z)( - symplectic_matrix, q, nqubits - ) + """Decomposition --> S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ ( + (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) + ) + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def X(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.X)( - symplectic_matrix, q, nqubits - ) + """Decomposition --> H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) + ) + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def Y(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.Y)( - symplectic_matrix, q, nqubits - ) + """Decomposition --> S-S-H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) + ) + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def SX(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SX)( - symplectic_matrix, q, nqubits - ) + """Decomposition --> H-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def SDG(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SDG)( - symplectic_matrix, q, nqubits - ) + """Decomposition --> S-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def SXDG(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SXDG)( - symplectic_matrix, q, nqubits - ) - - @staticmethod - def RX(symplectic_matrix, q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RX)( - symplectic_matrix, q, nqubits, theta - ) - - @staticmethod - def RZ(symplectic_matrix, q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RZ)( - symplectic_matrix, q, nqubits, theta - ) - - @staticmethod - def RY(symplectic_matrix, q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RY)( - symplectic_matrix, q, nqubits, theta - ) + """Decomposition --> H-S-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) def SWAP(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.SWAP)( - symplectic_matrix, control_q, target_q, nqubits - ) + """Decomposition --> CNOT-CNOT-CNOT""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[:-1, -1] = ( + r[i] + ^ ( + x[i, control_q] + & z[i, target_q] + & (x[i, target_q] ^ ~z[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ z[i, control_q]) + & (z[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + x[i, target_q] + & z[i, control_q] + & ( + x[i, control_q] + ^ x[i, target_q] + ^ z[i, control_q] + ^ ~z[i, target_q] + ) + ) + ) + x_cq = symplectic_matrix[i, control_q] + x_tq = symplectic_matrix[i, target_q] + z_cq = symplectic_matrix[i, nqubits + control_q] + z_tq = symplectic_matrix[i, nqubits + target_q] + symplectic_matrix[i, control_q] = x_tq + symplectic_matrix[i, target_q] = x_cq + symplectic_matrix[i, nqubits + control_q] = z_tq + symplectic_matrix[i, nqubits + target_q] = z_cq + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) def iSWAP(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)( - CO.iSWAP - )(symplectic_matrix, control_q, target_q, nqubits) - - @staticmethod - def FSWAP(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)( - CO.FSWAP - )(symplectic_matrix, control_q, target_q, nqubits) + """Decomposition --> H-CNOT-CNOT-H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & z[i, control_q]) + ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) + ^ ( + (z[i, control_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + & (x[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) + & ( + x[i, target_q] + ^ z[i, target_q] + ^ x[i, control_q] + ^ ~z[i, control_q] + ) + ) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q]) + ) + ) + z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] + z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + tmp = symplectic_matrix[i, control_q] + symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] + symplectic_matrix[i, target_q] = tmp + return symplectic_matrix @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) def CY(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CY)( - symplectic_matrix, control_q, target_q, nqubits - ) - - @staticmethod - def CRX(symplectic_matrix, control_q, target_q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)( - CO.CRX - )(symplectic_matrix, control_q, target_q, nqubits, theta) - - @staticmethod - def CRZ(symplectic_matrix, control_q, target_q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)( - CO.CRZ - )(symplectic_matrix, control_q, target_q, nqubits, theta) - - @staticmethod - def CRY(symplectic_matrix, control_q, target_q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)( - CO.CRY - )(symplectic_matrix, control_q, target_q, nqubits, theta) - - @staticmethod - def ECR(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.ECR)( - symplectic_matrix, control_q, target_q, nqubits - ) + """Decomposition --> S-CNOT-SDG""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ z[i, target_q]) + & (z[i, control_q] ^ ~x[i, target_q]) + ) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + ) + ) + x_target_q = x[i, control_q] ^ x[i, target_q] + z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i - 1, target_q] = x_target_q + symplectic_matrix[i - 1, nqubits + control_q] = z_control_q + symplectic_matrix[i - 1, nqubits + target_q] = z_target_q + return symplectic_matrix From e112917ba83e0466223e609a79dbc81db5e1ac5f Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 13 Dec 2023 14:41:57 +0000 Subject: [PATCH 03/60] Delete src/qibojit/backends/clifford.py~ --- src/qibojit/backends/clifford.py~ | 95 ------------------------------- 1 file changed, 95 deletions(-) delete mode 100644 src/qibojit/backends/clifford.py~ diff --git a/src/qibojit/backends/clifford.py~ b/src/qibojit/backends/clifford.py~ deleted file mode 100644 index cd3f793c..00000000 --- a/src/qibojit/backends/clifford.py~ +++ /dev/null @@ -1,95 +0,0 @@ -from numba import njit -from qibo.backends.clifford import CliffordOperations as CO - -class CliffordOperations(CO): - - def __init__(self, engine): - super().__init__(engine) - - @staticmethod - def I(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.I)(symplectic_matrix, q, nqubits) - - @staticmethod - def H(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.H)(symplectic_matrix, q, nqubits) - - @staticmethod - def CNOT(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CNOT)(symplectic_matrix, control_q, target_q, nqubits) - - @staticmethod - def CZ(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CZ)(symplectic_matrix, control_q, target_q, nqubits) - - @staticmethod - def S(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.S)(symplectic_matrix, q, nqubits) - - @staticmethod - def Z(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.Z)(symplectic_matrix, q, nqubits) - - @staticmethod - def X(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.X)(symplectic_matrix, q, nqubits) - - @staticmethod - def Y(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.Y)(symplectic_matrix, q, nqubits) - - @staticmethod - def SX(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SX)(symplectic_matrix, q, nqubits) - - @staticmethod - def SDG(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SDG)(symplectic_matrix, q, nqubits) - - @staticmethod - def SXDG(symplectic_matrix, q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True)(CO.SXDG)(symplectic_matrix, q, nqubits) - - @staticmethod - def RX(symplectic_matrix, q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RX)(symplectic_matrix, q, nqubits, theta) - - @staticmethod - def RZ(symplectic_matrix, q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RZ)(symplectic_matrix, q, nqubits, theta) - - @staticmethod - def RY(symplectic_matrix, q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, f4)", parallel=True, cache=True)(CO.RY)(symplectic_matrix, q, nqubits, theta) - - @staticmethod - def SWAP(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.SWAP)(symplectic_matrix, control_q, target_q, nqubits) - - @staticmethod - def iSWAP(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.iSWAP)(symplectic_matrix, control_q, target_q, nqubits) - - @staticmethod - def FSWAP(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.FSWAP)(symplectic_matrix, control_q, target_q, nqubits) - - @staticmethod - def CY(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.CY)(symplectic_matrix, control_q, target_q, nqubits) - - @staticmethod - def CRX(symplectic_matrix, control_q, target_q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)(CO.CRX)(symplectic_matrix, control_q, target_q, nqubits, theta) - - @staticmethod - def CRZ(symplectic_matrix, control_q, target_q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)(CO.CRZ)(symplectic_matrix, control_q, target_q, nqubits, theta) - - @staticmethod - def CRY(symplectic_matrix, control_q, target_q, nqubits, theta): - return njit("b1[:,:](b1[:,:], u8, u8, u8, f4)", parallel=True, cache=True)(CO.CRY)(symplectic_matrix, control_q, target_q, nqubits, theta) - - @staticmethod - def ECR(symplectic_matrix, control_q, target_q, nqubits): - return njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True)(CO.ECR)(symplectic_matrix, control_q, target_q, nqubits) From d6f28b07708378fc1d8c5090a163ac7b921a9f03 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Thu, 14 Dec 2023 12:48:04 +0400 Subject: [PATCH 04/60] feat: implemented custom cuda kernels (to be tested) --- .../backends/{clifford.py => clifford_cpu.py} | 0 src/qibojit/backends/clifford_gpu.py | 296 ++++++++++++++++++ src/qibojit/backends/clifford_gpu.py~ | 257 +++++++++++++++ src/qibojit/backends/cpu.py | 2 +- src/qibojit/backends/gpu.py | 4 + 5 files changed, 558 insertions(+), 1 deletion(-) rename src/qibojit/backends/{clifford.py => clifford_cpu.py} (100%) create mode 100644 src/qibojit/backends/clifford_gpu.py create mode 100644 src/qibojit/backends/clifford_gpu.py~ diff --git a/src/qibojit/backends/clifford.py b/src/qibojit/backends/clifford_cpu.py similarity index 100% rename from src/qibojit/backends/clifford.py rename to src/qibojit/backends/clifford_cpu.py diff --git a/src/qibojit/backends/clifford_gpu.py b/src/qibojit/backends/clifford_gpu.py new file mode 100644 index 00000000..1601e79d --- /dev/null +++ b/src/qibojit/backends/clifford_gpu.py @@ -0,0 +1,296 @@ +import numpy as np +from cupyx import jit +from qibo.backends.clifford import CliffordOperations as CO + + +class CliffordOperations(CO): + def __init__(self, engine): + super().__init__(engine) + + @staticmethod + @jit.rawkernel() + def H(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + tmp = symplectic_matrix[i, q] + symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] + symplectic_matrix[:, nqubits + q] = tmp + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def CNOT(symplectic_matrix, control_q, target_q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( + x[i, target_q] ^ ~z[i, control_q] + ) + symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def CZ(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ ( + x[i, control_q] + & x[i, target_q] + & (z[i, target_q] ^ ~z[i, control_q]) + ) + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, control_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def S(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def Z(symplectic_matrix, q, nqubits): + """Decomposition --> S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ ( + (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) + ) + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def X(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) + ) + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def Y(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) + ) + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def SX(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def SDG(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def SXDG(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def SWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> CNOT-CNOT-CNOT""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[:-1, -1] = ( + r[i] + ^ ( + x[i, control_q] + & z[i, target_q] + & (x[i, target_q] ^ ~z[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ z[i, control_q]) + & (z[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + x[i, target_q] + & z[i, control_q] + & ( + x[i, control_q] + ^ x[i, target_q] + ^ z[i, control_q] + ^ ~z[i, target_q] + ) + ) + ) + x_cq = symplectic_matrix[i, control_q] + x_tq = symplectic_matrix[i, target_q] + z_cq = symplectic_matrix[i, nqubits + control_q] + z_tq = symplectic_matrix[i, nqubits + target_q] + symplectic_matrix[i, control_q] = x_tq + symplectic_matrix[i, target_q] = x_cq + symplectic_matrix[i, nqubits + control_q] = z_tq + symplectic_matrix[i, nqubits + target_q] = z_cq + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def iSWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-CNOT-H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & z[i, control_q]) + ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) + ^ ( + (z[i, control_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + & (x[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) + & ( + x[i, target_q] + ^ z[i, target_q] + ^ x[i, control_q] + ^ ~z[i, control_q] + ) + ) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q]) + ) + ) + z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] + z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + tmp = symplectic_matrix[i, control_q] + symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] + symplectic_matrix[i, target_q] = tmp + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def CY(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> S-CNOT-SDG""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ z[i, target_q]) + & (z[i, control_q] ^ ~x[i, target_q]) + ) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + ) + ) + x_target_q = x[i, control_q] ^ x[i, target_q] + z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i - 1, target_q] = x_target_q + symplectic_matrix[i - 1, nqubits + control_q] = z_control_q + symplectic_matrix[i - 1, nqubits + target_q] = z_target_q + return symplectic_matrix diff --git a/src/qibojit/backends/clifford_gpu.py~ b/src/qibojit/backends/clifford_gpu.py~ new file mode 100644 index 00000000..f8bffea7 --- /dev/null +++ b/src/qibojit/backends/clifford_gpu.py~ @@ -0,0 +1,257 @@ +import numpy as np +from numba import njit, prange +from qibo.backends.clifford import CliffordOperations as CO + + +class CliffordOperations(CO): + def __init__(self, engine): + super().__init__(engine) + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def H(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + tmp = symplectic_matrix[i, q] + symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] + symplectic_matrix[:, nqubits + q] = tmp + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) + def CNOT(symplectic_matrix, control_q, target_q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( + x[i, target_q] ^ ~z[i, control_q] + ) + symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) + def CZ(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ ( + x[i, control_q] + & x[i, target_q] + & (z[i, target_q] ^ ~z[i, control_q]) + ) + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, control_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def S(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def Z(symplectic_matrix, q, nqubits): + """Decomposition --> S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ ( + (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) + ) + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def X(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) + ) + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def Y(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) + ) + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def SX(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def SDG(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def SXDG(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) + def SWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> CNOT-CNOT-CNOT""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[:-1, -1] = ( + r[i] + ^ ( + x[i, control_q] + & z[i, target_q] + & (x[i, target_q] ^ ~z[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ z[i, control_q]) + & (z[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + x[i, target_q] + & z[i, control_q] + & ( + x[i, control_q] + ^ x[i, target_q] + ^ z[i, control_q] + ^ ~z[i, target_q] + ) + ) + ) + x_cq = symplectic_matrix[i, control_q] + x_tq = symplectic_matrix[i, target_q] + z_cq = symplectic_matrix[i, nqubits + control_q] + z_tq = symplectic_matrix[i, nqubits + target_q] + symplectic_matrix[i, control_q] = x_tq + symplectic_matrix[i, target_q] = x_cq + symplectic_matrix[i, nqubits + control_q] = z_tq + symplectic_matrix[i, nqubits + target_q] = z_cq + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) + def iSWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-CNOT-H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & z[i, control_q]) + ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) + ^ ( + (z[i, control_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + & (x[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) + & ( + x[i, target_q] + ^ z[i, target_q] + ^ x[i, control_q] + ^ ~z[i, control_q] + ) + ) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q]) + ) + ) + z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] + z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + tmp = symplectic_matrix[i, control_q] + symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] + symplectic_matrix[i, target_q] = tmp + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) + def CY(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> S-CNOT-SDG""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ z[i, target_q]) + & (z[i, control_q] ^ ~x[i, target_q]) + ) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + ) + ) + x_target_q = x[i, control_q] ^ x[i, target_q] + z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i - 1, target_q] = x_target_q + symplectic_matrix[i - 1, nqubits + control_q] = z_control_q + symplectic_matrix[i - 1, nqubits + target_q] = z_target_q + return symplectic_matrix diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index db3bf222..857293d3 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -70,7 +70,7 @@ def __init__(self): else: self.set_threads(len(psutil.Process().cpu_affinity())) - from qibojit.backends.clifford import CliffordOperations + from qibojit.backends.clifford_cpu import CliffordOperations self.clifford_operations = CliffordOperations(self.np) diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index c00d233c..64d1fc04 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -98,6 +98,10 @@ def kernel_loader(name, ktype): # number of available GPUs (for multigpu) self.ngpus = cp.cuda.runtime.getDeviceCount() + from qibojit.backends.clifford_gpu import CliffordOperations + + self.clifford_operations = CliffordOperations(self.np) + def set_precision(self, precision): super().set_precision(precision) if self.dtype == "complex128": From e39e89e314c099a469ca67e18b92e443dbeb50bd Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 18 Dec 2023 16:09:39 +0400 Subject: [PATCH 05/60] feat: implemented rowsum --- src/qibojit/backends/clifford_cpu.py | 68 ++++++- src/qibojit/backends/clifford_gpu.py | 73 ++++++++ src/qibojit/backends/clifford_gpu.py~ | 257 -------------------------- 3 files changed, 140 insertions(+), 258 deletions(-) delete mode 100644 src/qibojit/backends/clifford_gpu.py~ diff --git a/src/qibojit/backends/clifford_cpu.py b/src/qibojit/backends/clifford_cpu.py index f8bffea7..a01dfea0 100644 --- a/src/qibojit/backends/clifford_cpu.py +++ b/src/qibojit/backends/clifford_cpu.py @@ -1,5 +1,5 @@ import numpy as np -from numba import njit, prange +from numba import njit, prange, uint64 from qibo.backends.clifford import CliffordOperations as CO @@ -144,6 +144,34 @@ def SXDG(symplectic_matrix, q, nqubits): symplectic_matrix[i, q] = z[i, q] ^ x[i, q] return symplectic_matrix + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def RY_pi(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) + def RY_3pi_2(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + @staticmethod @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) def SWAP(symplectic_matrix, control_q, target_q, nqubits): @@ -255,3 +283,41 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): symplectic_matrix[i - 1, nqubits + control_q] = z_control_q symplectic_matrix[i - 1, nqubits + target_q] = z_target_q return symplectic_matrix + + @staticmethod + @njit("b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True) + def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): + x = symplectic_matrix[ + : -1 + (2 * nqubits + 2) * uint64(include_scratch), :nqubits + ] + z = symplectic_matrix[ + : -1 + (2 * nqubits + 2) * uint64(include_scratch), nqubits:-1 + ] + + x1, x2 = x[i, :], x[h, :] + z1, z2 = z[i, :], z[h, :] + for j in prange(len(h)): + exp = np.zeros(nqubits, dtype=uint64) + x1_eq_z1 = (x1[j] ^ z1[j]) == False + x1_neq_z1 = ~x1_eq_z1 + x1_eq_0 = x1[j] == False + x1_eq_1 = ~x1_eq_0 + ind2 = x1_eq_z1 & x1_eq_1 + ind3 = x1_eq_1 & x1_neq_z1 + ind4 = x1_eq_0 & x1_neq_z1 + exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) + exp[ind3] = z2[j, ind3].astype(uint64) * ( + 2 * x2[j, ind3].astype(uint64) - 1 + ) + exp[ind4] = x2[j, ind4].astype(uint64) * ( + 1 - 2 * z2[j, ind4].astype(uint64) + ) + + symplectic_matrix[h[j], -1] = ( + 2 * symplectic_matrix[h[j], -1] + + 2 * symplectic_matrix[i[j], -1] + + np.sum(exp) + ) % 4 == 0 + symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] + symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] + return symplectic_matrix diff --git a/src/qibojit/backends/clifford_gpu.py b/src/qibojit/backends/clifford_gpu.py index 1601e79d..a8442858 100644 --- a/src/qibojit/backends/clifford_gpu.py +++ b/src/qibojit/backends/clifford_gpu.py @@ -1,3 +1,4 @@ +import cupy as cp import numpy as np from cupyx import jit from qibo.backends.clifford import CliffordOperations as CO @@ -174,6 +175,40 @@ def SXDG(symplectic_matrix, q, nqubits): symplectic_matrix[i, q] = z[i, q] ^ x[i, q] return symplectic_matrix + @staticmethod + @jit.rawkernel() + def RY_pi(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def RY_3pi_2(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + @staticmethod @jit.rawkernel() def SWAP(symplectic_matrix, control_q, target_q, nqubits): @@ -294,3 +329,41 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): symplectic_matrix[i - 1, nqubits + control_q] = z_control_q symplectic_matrix[i - 1, nqubits + target_q] = z_target_q return symplectic_matrix + + @staticmethod + @jit.rawkernel() + def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): + x = symplectic_matrix[: -1 + (2 * nqubits + 2) * int(include_scratch), :nqubits] + z = symplectic_matrix[ + : -1 + (2 * nqubits + 2) * int(include_scratch), nqubits:-1 + ] + + x1, x2 = x[i, :], x[h, :] + z1, z2 = z[i, :], z[h, :] + tid = jit.blockIdx.h * jit.blockDim.h + jit.threadIdx.h + ntid = jit.gridDim.h * jit.blockDim.h + for i in range(tid, len(h), ntid): + exp = cp.zeros(nqubits, dtype=int64) + x1_eq_z1 = (x1[j] ^ z1[j]) == False + x1_neq_z1 = ~x1_eq_z1 + x1_eq_0 = x1[j] == False + x1_eq_1 = ~x1_eq_0 + ind2 = x1_eq_z1 & x1_eq_1 + ind3 = x1_eq_1 & x1_neq_z1 + ind4 = x1_eq_0 & x1_neq_z1 + exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) + exp[ind3] = z2[j, ind3].astype(uint64) * ( + 2 * x2[j, ind3].astype(uint64) - 1 + ) + exp[ind4] = x2[j, ind4].astype(uint64) * ( + 1 - 2 * z2[j, ind4].astype(uint64) + ) + + symplectic_matrix[h[j], -1] = ( + 2 * symplectic_matrix[h[j], -1] + + 2 * symplectic_matrix[i[j], -1] + + cp.sum(exp) + ) % 4 == 0 + symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] + symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] + return symplectic_matrix diff --git a/src/qibojit/backends/clifford_gpu.py~ b/src/qibojit/backends/clifford_gpu.py~ deleted file mode 100644 index f8bffea7..00000000 --- a/src/qibojit/backends/clifford_gpu.py~ +++ /dev/null @@ -1,257 +0,0 @@ -import numpy as np -from numba import njit, prange -from qibo.backends.clifford import CliffordOperations as CO - - -class CliffordOperations(CO): - def __init__(self, engine): - super().__init__(engine) - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def H(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - tmp = symplectic_matrix[i, q] - symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] - symplectic_matrix[:, nqubits + q] = tmp - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def CNOT(symplectic_matrix, control_q, target_q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( - x[i, target_q] ^ ~z[i, control_q] - ) - symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def CZ(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ ( - x[i, control_q] - & x[i, target_q] - & (z[i, target_q] ^ ~z[i, control_q]) - ) - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) - ) - z_control_q = x[i, target_q] ^ z[i, control_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def S(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def Z(symplectic_matrix, q, nqubits): - """Decomposition --> S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ ( - (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) - ) - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def X(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) - ) - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def Y(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) - ) - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def SX(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def SDG(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def SXDG(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def SWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> CNOT-CNOT-CNOT""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[:-1, -1] = ( - r[i] - ^ ( - x[i, control_q] - & z[i, target_q] - & (x[i, target_q] ^ ~z[i, control_q]) - ) - ^ ( - (x[i, target_q] ^ x[i, control_q]) - & (z[i, target_q] ^ z[i, control_q]) - & (z[i, target_q] ^ ~x[i, control_q]) - ) - ^ ( - x[i, target_q] - & z[i, control_q] - & ( - x[i, control_q] - ^ x[i, target_q] - ^ z[i, control_q] - ^ ~z[i, target_q] - ) - ) - ) - x_cq = symplectic_matrix[i, control_q] - x_tq = symplectic_matrix[i, target_q] - z_cq = symplectic_matrix[i, nqubits + control_q] - z_tq = symplectic_matrix[i, nqubits + target_q] - symplectic_matrix[i, control_q] = x_tq - symplectic_matrix[i, target_q] = x_cq - symplectic_matrix[i, nqubits + control_q] = z_tq - symplectic_matrix[i, nqubits + target_q] = z_cq - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def iSWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-CNOT-H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ (x[i, control_q] & z[i, control_q]) - ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) - ^ ( - (z[i, control_q] ^ x[i, control_q]) - & (z[i, target_q] ^ x[i, target_q]) - & (x[i, target_q] ^ ~x[i, control_q]) - ) - ^ ( - (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) - & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) - & ( - x[i, target_q] - ^ z[i, target_q] - ^ x[i, control_q] - ^ ~z[i, control_q] - ) - ) - ^ ( - x[i, control_q] - & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q]) - ) - ) - z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] - z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - tmp = symplectic_matrix[i, control_q] - symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] - symplectic_matrix[i, target_q] = tmp - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def CY(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> S-CNOT-SDG""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) - ^ ( - x[i, control_q] - & (x[i, target_q] ^ z[i, target_q]) - & (z[i, control_q] ^ ~x[i, target_q]) - ) - ^ ( - (x[i, target_q] ^ x[i, control_q]) - & (z[i, target_q] ^ x[i, target_q]) - ) - ) - x_target_q = x[i, control_q] ^ x[i, target_q] - z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i - 1, target_q] = x_target_q - symplectic_matrix[i - 1, nqubits + control_q] = z_control_q - symplectic_matrix[i - 1, nqubits + target_q] = z_target_q - return symplectic_matrix From 007c348556069cee20daa01bccefa259c23d265b Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Tue, 19 Dec 2023 09:59:17 +0400 Subject: [PATCH 06/60] fix: fixed H, CY and rowsum --- src/qibojit/backends/clifford_cpu.py | 10 +++++----- src/qibojit/backends/clifford_gpu.py | 10 +++++----- src/qibojit/backends/gpu.py | 3 +++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/qibojit/backends/clifford_cpu.py b/src/qibojit/backends/clifford_cpu.py index a01dfea0..3a9672ae 100644 --- a/src/qibojit/backends/clifford_cpu.py +++ b/src/qibojit/backends/clifford_cpu.py @@ -17,7 +17,7 @@ def H(symplectic_matrix, q, nqubits): symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) tmp = symplectic_matrix[i, q] symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] - symplectic_matrix[:, nqubits + q] = tmp + symplectic_matrix[i, nqubits + q] = tmp return symplectic_matrix @staticmethod @@ -279,9 +279,9 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): x_target_q = x[i, control_q] ^ x[i, target_q] z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i - 1, target_q] = x_target_q - symplectic_matrix[i - 1, nqubits + control_q] = z_control_q - symplectic_matrix[i - 1, nqubits + target_q] = z_target_q + symplectic_matrix[i, target_q] = x_target_q + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q return symplectic_matrix @staticmethod @@ -317,7 +317,7 @@ def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): 2 * symplectic_matrix[h[j], -1] + 2 * symplectic_matrix[i[j], -1] + np.sum(exp) - ) % 4 == 0 + ) % 4 != 0 symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] return symplectic_matrix diff --git a/src/qibojit/backends/clifford_gpu.py b/src/qibojit/backends/clifford_gpu.py index a8442858..b1e09659 100644 --- a/src/qibojit/backends/clifford_gpu.py +++ b/src/qibojit/backends/clifford_gpu.py @@ -21,7 +21,7 @@ def H(symplectic_matrix, q, nqubits): symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) tmp = symplectic_matrix[i, q] symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] - symplectic_matrix[:, nqubits + q] = tmp + symplectic_matrix[i, nqubits + q] = tmp return symplectic_matrix @staticmethod @@ -325,9 +325,9 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): x_target_q = x[i, control_q] ^ x[i, target_q] z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i - 1, target_q] = x_target_q - symplectic_matrix[i - 1, nqubits + control_q] = z_control_q - symplectic_matrix[i - 1, nqubits + target_q] = z_target_q + symplectic_matrix[i, target_q] = x_target_q + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q return symplectic_matrix @staticmethod @@ -363,7 +363,7 @@ def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): 2 * symplectic_matrix[h[j], -1] + 2 * symplectic_matrix[i[j], -1] + cp.sum(exp) - ) % 4 == 0 + ) % 4 != 0 symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] return symplectic_matrix diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index 64d1fc04..d708fee9 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -64,8 +64,11 @@ def __init__(self): # load core kernels self.gates = {} + from qibojit.backends.clifford_gpu import CliffordOperations from qibojit.custom_operators import raw_kernels + self.clifford_operations = CliffordOperations(self.cp) + def kernel_loader(name, ktype): code = getattr(raw_kernels, name) code = code.replace("T", f"thrust::complex<{ktype}>") From 0f7be24f64079e03dd3634506b2f83b364f2b4a2 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Fri, 22 Dec 2023 19:13:19 +0100 Subject: [PATCH 07/60] feat: made numba operations as standalone functions --- .../backends/clifford_operations_cpu.py | 307 ++++++++++++++++++ .../backends/clifford_operations_cpu.py~ | 0 src/qibojit/backends/cpu.py | 5 +- 3 files changed, 309 insertions(+), 3 deletions(-) create mode 100644 src/qibojit/backends/clifford_operations_cpu.py create mode 100644 src/qibojit/backends/clifford_operations_cpu.py~ diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py new file mode 100644 index 00000000..0040f59b --- /dev/null +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -0,0 +1,307 @@ +import numpy as np +from numba import njit, prange, uint64 +from qibo.backends.clifford_operations import M as _M +from qibo.backends.clifford_operations import * + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def H(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + tmp = symplectic_matrix[i, q] + symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = tmp + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def CNOT(symplectic_matrix, control_q, target_q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( + x[i, target_q] ^ ~z[i, control_q] + ) + symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] + return symplectic_matrix + + +@staticmethod +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def CZ(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & x[i, target_q] & (z[i, target_q] ^ ~z[i, control_q])) + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, control_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix + + +@staticmethod +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def S(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def Z(symplectic_matrix, q, nqubits): + """Decomposition --> S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ ( + (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) + ) + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def X(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) + ) + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def Y(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) + ) + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def SX(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def SDG(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def SXDG(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def RY_pi(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def RY_3pi_2(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def SWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> CNOT-CNOT-CNOT""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[:-1, -1] = ( + r[i] + ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ z[i, control_q]) + & (z[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + x[i, target_q] + & z[i, control_q] + & (x[i, control_q] ^ x[i, target_q] ^ z[i, control_q] ^ ~z[i, target_q]) + ) + ) + x_cq = symplectic_matrix[i, control_q] + x_tq = symplectic_matrix[i, target_q] + z_cq = symplectic_matrix[i, nqubits + control_q] + z_tq = symplectic_matrix[i, nqubits + target_q] + symplectic_matrix[i, control_q] = x_tq + symplectic_matrix[i, target_q] = x_cq + symplectic_matrix[i, nqubits + control_q] = z_tq + symplectic_matrix[i, nqubits + target_q] = z_cq + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def iSWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-CNOT-H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & z[i, control_q]) + ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) + ^ ( + (z[i, control_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + & (x[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] ^ ~z[i, control_q]) + ) + ^ (x[i, control_q] & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] + z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + tmp = symplectic_matrix[i, control_q] + symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] + symplectic_matrix[i, target_q] = tmp + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def CY(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> S-CNOT-SDG""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ z[i, target_q]) + & (z[i, control_q] ^ ~x[i, target_q]) + ) + ^ ((x[i, target_q] ^ x[i, control_q]) & (z[i, target_q] ^ x[i, target_q])) + ) + x_target_q = x[i, control_q] ^ x[i, target_q] + z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, target_q] = x_target_q + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True) +def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): + print("using numba rowsum") + x = symplectic_matrix[: -1 + (2 * nqubits + 2) * uint64(include_scratch), :nqubits] + z = symplectic_matrix[ + : -1 + (2 * nqubits + 2) * uint64(include_scratch), nqubits:-1 + ] + + x1, x2 = x[i, :], x[h, :] + z1, z2 = z[i, :], z[h, :] + for j in prange(len(h)): + exp = np.zeros(nqubits, dtype=uint64) + x1_eq_z1 = (x1[j] ^ z1[j]) == False + x1_neq_z1 = ~x1_eq_z1 + x1_eq_0 = x1[j] == False + x1_eq_1 = ~x1_eq_0 + ind2 = x1_eq_z1 & x1_eq_1 + ind3 = x1_eq_1 & x1_neq_z1 + ind4 = x1_eq_0 & x1_neq_z1 + exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) + exp[ind3] = z2[j, ind3].astype(uint64) * (2 * x2[j, ind3].astype(uint64) - 1) + exp[ind4] = x2[j, ind4].astype(uint64) * (1 - 2 * z2[j, ind4].astype(uint64)) + + symplectic_matrix[h[j], -1] = ( + 2 * symplectic_matrix[h[j], -1] + + 2 * symplectic_matrix[i[j], -1] + + np.sum(exp) + ) % 4 != 0 + symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] + symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] + return symplectic_matrix + + +@njit("Tuple((b1[:,:], u8))(b1[:,:], u8, u8)", parallel=False, cache=True) +def _determined_outcome(state, q, nqubits): + state[-1, :] = False + indices = state[:nqubits, q].nonzero()[0] + for i in prange(len(indices)): + state = _rowsum( + state, + np.array([2 * nqubits], dtype=uint64), + np.array([indices[i] + nqubits], dtype=uint64), + nqubits, + include_scratch=True, + ) + return state, uint64(state[-1, -1]) diff --git a/src/qibojit/backends/clifford_operations_cpu.py~ b/src/qibojit/backends/clifford_operations_cpu.py~ new file mode 100644 index 00000000..e69de29b diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index 857293d3..916ef82c 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -6,6 +6,7 @@ from qibo.gates.channels import ReadoutErrorChannel from qibo.gates.special import FusedGate +from qibojit.backends import clifford_operations_cpu from qibojit.backends.matrices import CustomMatrices GATE_OPS = { @@ -70,9 +71,7 @@ def __init__(self): else: self.set_threads(len(psutil.Process().cpu_affinity())) - from qibojit.backends.clifford_cpu import CliffordOperations - - self.clifford_operations = CliffordOperations(self.np) + self.clifford_operations = clifford_operations_cpu def set_precision(self, precision): if precision != self.precision: From d589890f1dd5bf3135ead064e9ca4dde5e3f8665 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Wed, 27 Dec 2023 10:11:31 +0100 Subject: [PATCH 08/60] fix: monkey-patching qibo operations --- .../backends/clifford_operations_cpu.py | 26 +++++++++++++++++-- .../backends/clifford_operations_cpu.py~ | 0 2 files changed, 24 insertions(+), 2 deletions(-) delete mode 100644 src/qibojit/backends/clifford_operations_cpu.py~ diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 0040f59b..05903690 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -1,6 +1,6 @@ import numpy as np +import qibo.backends.clifford_operations as co from numba import njit, prange, uint64 -from qibo.backends.clifford_operations import M as _M from qibo.backends.clifford_operations import * @@ -261,7 +261,6 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): @njit("b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True) def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): - print("using numba rowsum") x = symplectic_matrix[: -1 + (2 * nqubits + 2) * uint64(include_scratch), :nqubits] z = symplectic_matrix[ : -1 + (2 * nqubits + 2) * uint64(include_scratch), nqubits:-1 @@ -305,3 +304,26 @@ def _determined_outcome(state, q, nqubits): include_scratch=True, ) return state, uint64(state[-1, -1]) + + +# monkey-patching the original qibo clifford operations +for f in [ + "H", + "CNOT", + "CZ", + "S", + "Z", + "X", + "Y", + "SX", + "SDG", + "SXDG", + "RY_pi", + "RY_3pi_2", + "SWAP", + "iSWAP", + "CY", + "_rowsum", + "_determined_outcome", +]: + setattr(co, f, locals()[f]) diff --git a/src/qibojit/backends/clifford_operations_cpu.py~ b/src/qibojit/backends/clifford_operations_cpu.py~ deleted file mode 100644 index e69de29b..00000000 From 72e951d0dbc2669f385962d875075eeef672d206 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Wed, 27 Dec 2023 14:53:07 +0100 Subject: [PATCH 09/60] feat: updated the gpu operations as well --- .../backends/#clifford_operations_cpu.py# | 329 +++++++++++++++ .../backends/.#clifford_operations_cpu.py | 1 + .../backends/clifford_operations_cpu.py | 2 +- .../backends/clifford_operations_gpu.py | 375 ++++++++++++++++++ src/qibojit/backends/gpu.py | 4 +- 5 files changed, 708 insertions(+), 3 deletions(-) create mode 100644 src/qibojit/backends/#clifford_operations_cpu.py# create mode 120000 src/qibojit/backends/.#clifford_operations_cpu.py create mode 100644 src/qibojit/backends/clifford_operations_gpu.py diff --git a/src/qibojit/backends/#clifford_operations_cpu.py# b/src/qibojit/backends/#clifford_operations_cpu.py# new file mode 100644 index 00000000..05903690 --- /dev/null +++ b/src/qibojit/backends/#clifford_operations_cpu.py# @@ -0,0 +1,329 @@ +import numpy as np +import qibo.backends.clifford_operations as co +from numba import njit, prange, uint64 +from qibo.backends.clifford_operations import * + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def H(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + tmp = symplectic_matrix[i, q] + symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = tmp + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def CNOT(symplectic_matrix, control_q, target_q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( + x[i, target_q] ^ ~z[i, control_q] + ) + symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] + return symplectic_matrix + + +@staticmethod +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def CZ(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & x[i, target_q] & (z[i, target_q] ^ ~z[i, control_q])) + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, control_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix + + +@staticmethod +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def S(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def Z(symplectic_matrix, q, nqubits): + """Decomposition --> S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ ( + (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) + ) + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def X(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) + ) + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def Y(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) + ) + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def SX(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def SDG(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def SXDG(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def RY_pi(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) +def RY_3pi_2(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def SWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> CNOT-CNOT-CNOT""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[:-1, -1] = ( + r[i] + ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ z[i, control_q]) + & (z[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + x[i, target_q] + & z[i, control_q] + & (x[i, control_q] ^ x[i, target_q] ^ z[i, control_q] ^ ~z[i, target_q]) + ) + ) + x_cq = symplectic_matrix[i, control_q] + x_tq = symplectic_matrix[i, target_q] + z_cq = symplectic_matrix[i, nqubits + control_q] + z_tq = symplectic_matrix[i, nqubits + target_q] + symplectic_matrix[i, control_q] = x_tq + symplectic_matrix[i, target_q] = x_cq + symplectic_matrix[i, nqubits + control_q] = z_tq + symplectic_matrix[i, nqubits + target_q] = z_cq + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def iSWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-CNOT-H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & z[i, control_q]) + ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) + ^ ( + (z[i, control_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + & (x[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] ^ ~z[i, control_q]) + ) + ^ (x[i, control_q] & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] + z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + tmp = symplectic_matrix[i, control_q] + symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] + symplectic_matrix[i, target_q] = tmp + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) +def CY(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> S-CNOT-SDG""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + for i in prange(symplectic_matrix.shape[0] - 1): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ z[i, target_q]) + & (z[i, control_q] ^ ~x[i, target_q]) + ) + ^ ((x[i, target_q] ^ x[i, control_q]) & (z[i, target_q] ^ x[i, target_q])) + ) + x_target_q = x[i, control_q] ^ x[i, target_q] + z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, target_q] = x_target_q + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix + + +@njit("b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True) +def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): + x = symplectic_matrix[: -1 + (2 * nqubits + 2) * uint64(include_scratch), :nqubits] + z = symplectic_matrix[ + : -1 + (2 * nqubits + 2) * uint64(include_scratch), nqubits:-1 + ] + + x1, x2 = x[i, :], x[h, :] + z1, z2 = z[i, :], z[h, :] + for j in prange(len(h)): + exp = np.zeros(nqubits, dtype=uint64) + x1_eq_z1 = (x1[j] ^ z1[j]) == False + x1_neq_z1 = ~x1_eq_z1 + x1_eq_0 = x1[j] == False + x1_eq_1 = ~x1_eq_0 + ind2 = x1_eq_z1 & x1_eq_1 + ind3 = x1_eq_1 & x1_neq_z1 + ind4 = x1_eq_0 & x1_neq_z1 + exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) + exp[ind3] = z2[j, ind3].astype(uint64) * (2 * x2[j, ind3].astype(uint64) - 1) + exp[ind4] = x2[j, ind4].astype(uint64) * (1 - 2 * z2[j, ind4].astype(uint64)) + + symplectic_matrix[h[j], -1] = ( + 2 * symplectic_matrix[h[j], -1] + + 2 * symplectic_matrix[i[j], -1] + + np.sum(exp) + ) % 4 != 0 + symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] + symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] + return symplectic_matrix + + +@njit("Tuple((b1[:,:], u8))(b1[:,:], u8, u8)", parallel=False, cache=True) +def _determined_outcome(state, q, nqubits): + state[-1, :] = False + indices = state[:nqubits, q].nonzero()[0] + for i in prange(len(indices)): + state = _rowsum( + state, + np.array([2 * nqubits], dtype=uint64), + np.array([indices[i] + nqubits], dtype=uint64), + nqubits, + include_scratch=True, + ) + return state, uint64(state[-1, -1]) + + +# monkey-patching the original qibo clifford operations +for f in [ + "H", + "CNOT", + "CZ", + "S", + "Z", + "X", + "Y", + "SX", + "SDG", + "SXDG", + "RY_pi", + "RY_3pi_2", + "SWAP", + "iSWAP", + "CY", + "_rowsum", + "_determined_outcome", +]: + setattr(co, f, locals()[f]) diff --git a/src/qibojit/backends/.#clifford_operations_cpu.py b/src/qibojit/backends/.#clifford_operations_cpu.py new file mode 120000 index 00000000..1ad9d1d6 --- /dev/null +++ b/src/qibojit/backends/.#clifford_operations_cpu.py @@ -0,0 +1 @@ +andrea@MacBook-Pro-di-andrea.local.4120 \ No newline at end of file diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 05903690..ba2b5c7e 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -324,6 +324,6 @@ def _determined_outcome(state, q, nqubits): "iSWAP", "CY", "_rowsum", - "_determined_outcome", + # "_determined_outcome", ]: setattr(co, f, locals()[f]) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py new file mode 100644 index 00000000..e07d8b1d --- /dev/null +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -0,0 +1,375 @@ +import cupy as cp +import numpy as np +import qibo.backends.clifford_operations as co +from cupyx import jit +from qibo.backends.clifford_operations import * + + +@jit.rawkernel() +def H(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + tmp = symplectic_matrix[i, q] + symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = tmp + return symplectic_matrix + + +@jit.rawkernel() +def CNOT(symplectic_matrix, control_q, target_q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( + x[i, target_q] ^ ~z[i, control_q] + ) + symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] + return symplectic_matrix + + +@jit.rawkernel() +def CZ(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & x[i, target_q] & (z[i, target_q] ^ ~z[i, control_q])) + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, control_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix + + +@jit.rawkernel() +def S(symplectic_matrix, q, nqubits): + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@jit.rawkernel() +def Z(symplectic_matrix, q, nqubits): + """Decomposition --> S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ ( + (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) + ) + return symplectic_matrix + + +@jit.rawkernel() +def X(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) + ) + return symplectic_matrix + + +@jit.rawkernel() +def Y(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-H-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) + ) + return symplectic_matrix + + +@jit.rawkernel() +def SX(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@jit.rawkernel() +def SDG(symplectic_matrix, q, nqubits): + """Decomposition --> S-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@jit.rawkernel() +def SXDG(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S-S-H""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) + symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + return symplectic_matrix + + +@jit.rawkernel() +def RY_pi(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + + +@jit.rawkernel() +def RY_3pi_2(symplectic_matrix, q, nqubits): + """Decomposition --> H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) + zq = symplectic_matrix[i, nqubits + q] + symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + symplectic_matrix[i, q] = zq + return symplectic_matrix + + +@jit.rawkernel() +def SWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> CNOT-CNOT-CNOT""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[:-1, -1] = ( + r[i] + ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) + ^ ( + (x[i, target_q] ^ x[i, control_q]) + & (z[i, target_q] ^ z[i, control_q]) + & (z[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + x[i, target_q] + & z[i, control_q] + & (x[i, control_q] ^ x[i, target_q] ^ z[i, control_q] ^ ~z[i, target_q]) + ) + ) + x_cq = symplectic_matrix[i, control_q] + x_tq = symplectic_matrix[i, target_q] + z_cq = symplectic_matrix[i, nqubits + control_q] + z_tq = symplectic_matrix[i, nqubits + target_q] + symplectic_matrix[i, control_q] = x_tq + symplectic_matrix[i, target_q] = x_cq + symplectic_matrix[i, nqubits + control_q] = z_tq + symplectic_matrix[i, nqubits + target_q] = z_cq + return symplectic_matrix + + +@jit.rawkernel() +def iSWAP(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> H-CNOT-CNOT-H-S-S""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & z[i, target_q]) + ^ (x[i, control_q] & z[i, control_q]) + ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) + ^ ( + (z[i, control_q] ^ x[i, control_q]) + & (z[i, target_q] ^ x[i, target_q]) + & (x[i, target_q] ^ ~x[i, control_q]) + ) + ^ ( + (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) + & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] ^ ~z[i, control_q]) + ) + ^ (x[i, control_q] & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q])) + ) + z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] + z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + tmp = symplectic_matrix[i, control_q] + symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] + symplectic_matrix[i, target_q] = tmp + return symplectic_matrix + + +@jit.rawkernel() +def CY(symplectic_matrix, control_q, target_q, nqubits): + """Decomposition --> S-CNOT-SDG""" + r = symplectic_matrix[:-1, -1] + x = symplectic_matrix[:-1, :nqubits] + z = symplectic_matrix[:-1, nqubits:-1] + xq = x[:, control_q] + tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq + ntid = jit.gridDim.xq * jit.blockDim.xq + for i in range(tid, xq.shape[0], ntid): + symplectic_matrix[i, -1] = ( + r[i] + ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) + ^ ( + x[i, control_q] + & (x[i, target_q] ^ z[i, target_q]) + & (z[i, control_q] ^ ~x[i, target_q]) + ) + ^ ((x[i, target_q] ^ x[i, control_q]) & (z[i, target_q] ^ x[i, target_q])) + ) + x_target_q = x[i, control_q] ^ x[i, target_q] + z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] + z_target_q = z[i, target_q] ^ x[i, control_q] + symplectic_matrix[i, target_q] = x_target_q + symplectic_matrix[i, nqubits + control_q] = z_control_q + symplectic_matrix[i, nqubits + target_q] = z_target_q + return symplectic_matrix + + +@jit.rawkernel() +def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): + x = symplectic_matrix[: -1 + (2 * nqubits + 2) * int(include_scratch), :nqubits] + z = symplectic_matrix[: -1 + (2 * nqubits + 2) * int(include_scratch), nqubits:-1] + + x1, x2 = x[i, :], x[h, :] + z1, z2 = z[i, :], z[h, :] + tid = jit.blockIdx.h * jit.blockDim.h + jit.threadIdx.h + ntid = jit.gridDim.h * jit.blockDim.h + for j in range(tid, len(h), ntid): + exp = cp.zeros(nqubits, dtype=int64) + x1_eq_z1 = (x1[j] ^ z1[j]) == False + x1_neq_z1 = ~x1_eq_z1 + x1_eq_0 = x1[j] == False + x1_eq_1 = ~x1_eq_0 + ind2 = x1_eq_z1 & x1_eq_1 + ind3 = x1_eq_1 & x1_neq_z1 + ind4 = x1_eq_0 & x1_neq_z1 + exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) + exp[ind3] = z2[j, ind3].astype(uint64) * (2 * x2[j, ind3].astype(uint64) - 1) + exp[ind4] = x2[j, ind4].astype(uint64) * (1 - 2 * z2[j, ind4].astype(uint64)) + + symplectic_matrix[h[j], -1] = ( + 2 * symplectic_matrix[h[j], -1] + + 2 * symplectic_matrix[i[j], -1] + + cp.sum(exp) + ) % 4 != 0 + symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] + symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] + return symplectic_matrix + + +@jit.rawkernel() +def _determined_outcome(state, q, nqubits): + state[-1, :] = False + indices = state[:nqubits, q].nonzero()[0] + tid = jit.blockIdx.indices * jit.blockDim.indices + jit.threadIdx.indices + ntid = jit.gridDim.indices * jit.blockDim.indices + for i in range(tid, len(indices), ntid): + state = _rowsum( + state, + np.array([2 * nqubits], dtype=uint64), + np.array([indices[i] + nqubits], dtype=uint64), + nqubits, + include_scratch=True, + ) + return state, uint64(state[-1, -1]) + + +# monkey-patching the original qibo clifford operations +for f in [ + "H", + "CNOT", + "CZ", + "S", + "Z", + "X", + "Y", + "SX", + "SDG", + "SXDG", + "RY_pi", + "RY_3pi_2", + "SWAP", + "iSWAP", + "CY", + "_rowsum", + "_determined_outcome", +]: + setattr(co, f, locals()[f]) diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index d708fee9..945f143b 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -2,6 +2,7 @@ from qibo.backends.numpy import NumpyBackend from qibo.config import log, raise_error +from qibojit.backends import clifford_operations_gpu from qibojit.backends.cpu import NumbaBackend from qibojit.backends.matrices import CupyMatrices, CuQuantumMatrices, CustomMatrices @@ -64,10 +65,9 @@ def __init__(self): # load core kernels self.gates = {} - from qibojit.backends.clifford_gpu import CliffordOperations from qibojit.custom_operators import raw_kernels - self.clifford_operations = CliffordOperations(self.cp) + self.clifford_operations = clifford_operations_gpu def kernel_loader(name, ktype): code = getattr(raw_kernels, name) From 032c4b0f85bb4f21260bbe69196da99698cf9933 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Wed, 27 Dec 2023 14:55:30 +0100 Subject: [PATCH 10/60] fix: removed unnecessary files --- .../backends/#clifford_operations_cpu.py# | 329 ---------------- .../backends/.#clifford_operations_cpu.py | 1 - src/qibojit/backends/clifford_cpu.py | 323 --------------- src/qibojit/backends/clifford_gpu.py | 369 ------------------ 4 files changed, 1022 deletions(-) delete mode 100644 src/qibojit/backends/#clifford_operations_cpu.py# delete mode 120000 src/qibojit/backends/.#clifford_operations_cpu.py delete mode 100644 src/qibojit/backends/clifford_cpu.py delete mode 100644 src/qibojit/backends/clifford_gpu.py diff --git a/src/qibojit/backends/#clifford_operations_cpu.py# b/src/qibojit/backends/#clifford_operations_cpu.py# deleted file mode 100644 index 05903690..00000000 --- a/src/qibojit/backends/#clifford_operations_cpu.py# +++ /dev/null @@ -1,329 +0,0 @@ -import numpy as np -import qibo.backends.clifford_operations as co -from numba import njit, prange, uint64 -from qibo.backends.clifford_operations import * - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def H(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - tmp = symplectic_matrix[i, q] - symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = tmp - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) -def CNOT(symplectic_matrix, control_q, target_q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( - x[i, target_q] ^ ~z[i, control_q] - ) - symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] - return symplectic_matrix - - -@staticmethod -@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) -def CZ(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ (x[i, control_q] & x[i, target_q] & (z[i, target_q] ^ ~z[i, control_q])) - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) - ) - z_control_q = x[i, target_q] ^ z[i, control_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - return symplectic_matrix - - -@staticmethod -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def S(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def Z(symplectic_matrix, q, nqubits): - """Decomposition --> S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ ( - (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) - ) - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def X(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) - ) - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def Y(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) - ) - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def SX(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def SDG(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def SXDG(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def RY_pi(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - zq = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] - symplectic_matrix[i, q] = zq - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) -def RY_3pi_2(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - zq = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] - symplectic_matrix[i, q] = zq - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) -def SWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> CNOT-CNOT-CNOT""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[:-1, -1] = ( - r[i] - ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) - ^ ( - (x[i, target_q] ^ x[i, control_q]) - & (z[i, target_q] ^ z[i, control_q]) - & (z[i, target_q] ^ ~x[i, control_q]) - ) - ^ ( - x[i, target_q] - & z[i, control_q] - & (x[i, control_q] ^ x[i, target_q] ^ z[i, control_q] ^ ~z[i, target_q]) - ) - ) - x_cq = symplectic_matrix[i, control_q] - x_tq = symplectic_matrix[i, target_q] - z_cq = symplectic_matrix[i, nqubits + control_q] - z_tq = symplectic_matrix[i, nqubits + target_q] - symplectic_matrix[i, control_q] = x_tq - symplectic_matrix[i, target_q] = x_cq - symplectic_matrix[i, nqubits + control_q] = z_tq - symplectic_matrix[i, nqubits + target_q] = z_cq - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) -def iSWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-CNOT-H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ (x[i, control_q] & z[i, control_q]) - ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) - ^ ( - (z[i, control_q] ^ x[i, control_q]) - & (z[i, target_q] ^ x[i, target_q]) - & (x[i, target_q] ^ ~x[i, control_q]) - ) - ^ ( - (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) - & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) - & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] ^ ~z[i, control_q]) - ) - ^ (x[i, control_q] & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q])) - ) - z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] - z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - tmp = symplectic_matrix[i, control_q] - symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] - symplectic_matrix[i, target_q] = tmp - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) -def CY(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> S-CNOT-SDG""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) - ^ ( - x[i, control_q] - & (x[i, target_q] ^ z[i, target_q]) - & (z[i, control_q] ^ ~x[i, target_q]) - ) - ^ ((x[i, target_q] ^ x[i, control_q]) & (z[i, target_q] ^ x[i, target_q])) - ) - x_target_q = x[i, control_q] ^ x[i, target_q] - z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, target_q] = x_target_q - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - return symplectic_matrix - - -@njit("b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True) -def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): - x = symplectic_matrix[: -1 + (2 * nqubits + 2) * uint64(include_scratch), :nqubits] - z = symplectic_matrix[ - : -1 + (2 * nqubits + 2) * uint64(include_scratch), nqubits:-1 - ] - - x1, x2 = x[i, :], x[h, :] - z1, z2 = z[i, :], z[h, :] - for j in prange(len(h)): - exp = np.zeros(nqubits, dtype=uint64) - x1_eq_z1 = (x1[j] ^ z1[j]) == False - x1_neq_z1 = ~x1_eq_z1 - x1_eq_0 = x1[j] == False - x1_eq_1 = ~x1_eq_0 - ind2 = x1_eq_z1 & x1_eq_1 - ind3 = x1_eq_1 & x1_neq_z1 - ind4 = x1_eq_0 & x1_neq_z1 - exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) - exp[ind3] = z2[j, ind3].astype(uint64) * (2 * x2[j, ind3].astype(uint64) - 1) - exp[ind4] = x2[j, ind4].astype(uint64) * (1 - 2 * z2[j, ind4].astype(uint64)) - - symplectic_matrix[h[j], -1] = ( - 2 * symplectic_matrix[h[j], -1] - + 2 * symplectic_matrix[i[j], -1] - + np.sum(exp) - ) % 4 != 0 - symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] - symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] - return symplectic_matrix - - -@njit("Tuple((b1[:,:], u8))(b1[:,:], u8, u8)", parallel=False, cache=True) -def _determined_outcome(state, q, nqubits): - state[-1, :] = False - indices = state[:nqubits, q].nonzero()[0] - for i in prange(len(indices)): - state = _rowsum( - state, - np.array([2 * nqubits], dtype=uint64), - np.array([indices[i] + nqubits], dtype=uint64), - nqubits, - include_scratch=True, - ) - return state, uint64(state[-1, -1]) - - -# monkey-patching the original qibo clifford operations -for f in [ - "H", - "CNOT", - "CZ", - "S", - "Z", - "X", - "Y", - "SX", - "SDG", - "SXDG", - "RY_pi", - "RY_3pi_2", - "SWAP", - "iSWAP", - "CY", - "_rowsum", - "_determined_outcome", -]: - setattr(co, f, locals()[f]) diff --git a/src/qibojit/backends/.#clifford_operations_cpu.py b/src/qibojit/backends/.#clifford_operations_cpu.py deleted file mode 120000 index 1ad9d1d6..00000000 --- a/src/qibojit/backends/.#clifford_operations_cpu.py +++ /dev/null @@ -1 +0,0 @@ -andrea@MacBook-Pro-di-andrea.local.4120 \ No newline at end of file diff --git a/src/qibojit/backends/clifford_cpu.py b/src/qibojit/backends/clifford_cpu.py deleted file mode 100644 index 3a9672ae..00000000 --- a/src/qibojit/backends/clifford_cpu.py +++ /dev/null @@ -1,323 +0,0 @@ -import numpy as np -from numba import njit, prange, uint64 -from qibo.backends.clifford import CliffordOperations as CO - - -class CliffordOperations(CO): - def __init__(self, engine): - super().__init__(engine) - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def H(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - tmp = symplectic_matrix[i, q] - symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = tmp - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def CNOT(symplectic_matrix, control_q, target_q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( - x[i, target_q] ^ ~z[i, control_q] - ) - symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def CZ(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ ( - x[i, control_q] - & x[i, target_q] - & (z[i, target_q] ^ ~z[i, control_q]) - ) - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) - ) - z_control_q = x[i, target_q] ^ z[i, control_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def S(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def Z(symplectic_matrix, q, nqubits): - """Decomposition --> S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ ( - (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) - ) - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def X(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) - ) - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def Y(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) - ) - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def SX(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def SDG(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def SXDG(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def RY_pi(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - zq = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] - symplectic_matrix[i, q] = zq - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) - def RY_3pi_2(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - zq = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] - symplectic_matrix[i, q] = zq - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def SWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> CNOT-CNOT-CNOT""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[:-1, -1] = ( - r[i] - ^ ( - x[i, control_q] - & z[i, target_q] - & (x[i, target_q] ^ ~z[i, control_q]) - ) - ^ ( - (x[i, target_q] ^ x[i, control_q]) - & (z[i, target_q] ^ z[i, control_q]) - & (z[i, target_q] ^ ~x[i, control_q]) - ) - ^ ( - x[i, target_q] - & z[i, control_q] - & ( - x[i, control_q] - ^ x[i, target_q] - ^ z[i, control_q] - ^ ~z[i, target_q] - ) - ) - ) - x_cq = symplectic_matrix[i, control_q] - x_tq = symplectic_matrix[i, target_q] - z_cq = symplectic_matrix[i, nqubits + control_q] - z_tq = symplectic_matrix[i, nqubits + target_q] - symplectic_matrix[i, control_q] = x_tq - symplectic_matrix[i, target_q] = x_cq - symplectic_matrix[i, nqubits + control_q] = z_tq - symplectic_matrix[i, nqubits + target_q] = z_cq - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def iSWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-CNOT-H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ (x[i, control_q] & z[i, control_q]) - ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) - ^ ( - (z[i, control_q] ^ x[i, control_q]) - & (z[i, target_q] ^ x[i, target_q]) - & (x[i, target_q] ^ ~x[i, control_q]) - ) - ^ ( - (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) - & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) - & ( - x[i, target_q] - ^ z[i, target_q] - ^ x[i, control_q] - ^ ~z[i, control_q] - ) - ) - ^ ( - x[i, control_q] - & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q]) - ) - ) - z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] - z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - tmp = symplectic_matrix[i, control_q] - symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] - symplectic_matrix[i, target_q] = tmp - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) - def CY(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> S-CNOT-SDG""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) - ^ ( - x[i, control_q] - & (x[i, target_q] ^ z[i, target_q]) - & (z[i, control_q] ^ ~x[i, target_q]) - ) - ^ ( - (x[i, target_q] ^ x[i, control_q]) - & (z[i, target_q] ^ x[i, target_q]) - ) - ) - x_target_q = x[i, control_q] ^ x[i, target_q] - z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, target_q] = x_target_q - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - return symplectic_matrix - - @staticmethod - @njit("b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True) - def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): - x = symplectic_matrix[ - : -1 + (2 * nqubits + 2) * uint64(include_scratch), :nqubits - ] - z = symplectic_matrix[ - : -1 + (2 * nqubits + 2) * uint64(include_scratch), nqubits:-1 - ] - - x1, x2 = x[i, :], x[h, :] - z1, z2 = z[i, :], z[h, :] - for j in prange(len(h)): - exp = np.zeros(nqubits, dtype=uint64) - x1_eq_z1 = (x1[j] ^ z1[j]) == False - x1_neq_z1 = ~x1_eq_z1 - x1_eq_0 = x1[j] == False - x1_eq_1 = ~x1_eq_0 - ind2 = x1_eq_z1 & x1_eq_1 - ind3 = x1_eq_1 & x1_neq_z1 - ind4 = x1_eq_0 & x1_neq_z1 - exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) - exp[ind3] = z2[j, ind3].astype(uint64) * ( - 2 * x2[j, ind3].astype(uint64) - 1 - ) - exp[ind4] = x2[j, ind4].astype(uint64) * ( - 1 - 2 * z2[j, ind4].astype(uint64) - ) - - symplectic_matrix[h[j], -1] = ( - 2 * symplectic_matrix[h[j], -1] - + 2 * symplectic_matrix[i[j], -1] - + np.sum(exp) - ) % 4 != 0 - symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] - symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] - return symplectic_matrix diff --git a/src/qibojit/backends/clifford_gpu.py b/src/qibojit/backends/clifford_gpu.py deleted file mode 100644 index b1e09659..00000000 --- a/src/qibojit/backends/clifford_gpu.py +++ /dev/null @@ -1,369 +0,0 @@ -import cupy as cp -import numpy as np -from cupyx import jit -from qibo.backends.clifford import CliffordOperations as CO - - -class CliffordOperations(CO): - def __init__(self, engine): - super().__init__(engine) - - @staticmethod - @jit.rawkernel() - def H(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - tmp = symplectic_matrix[i, q] - symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = tmp - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def CNOT(symplectic_matrix, control_q, target_q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( - x[i, target_q] ^ ~z[i, control_q] - ) - symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def CZ(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ ( - x[i, control_q] - & x[i, target_q] - & (z[i, target_q] ^ ~z[i, control_q]) - ) - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) - ) - z_control_q = x[i, target_q] ^ z[i, control_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def S(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def Z(symplectic_matrix, q, nqubits): - """Decomposition --> S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ ( - (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) - ) - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def X(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) - ) - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def Y(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) - ) - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def SX(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def SDG(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def SXDG(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def RY_pi(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - zq = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] - symplectic_matrix[i, q] = zq - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def RY_3pi_2(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - zq = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] - symplectic_matrix[i, q] = zq - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def SWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> CNOT-CNOT-CNOT""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[:-1, -1] = ( - r[i] - ^ ( - x[i, control_q] - & z[i, target_q] - & (x[i, target_q] ^ ~z[i, control_q]) - ) - ^ ( - (x[i, target_q] ^ x[i, control_q]) - & (z[i, target_q] ^ z[i, control_q]) - & (z[i, target_q] ^ ~x[i, control_q]) - ) - ^ ( - x[i, target_q] - & z[i, control_q] - & ( - x[i, control_q] - ^ x[i, target_q] - ^ z[i, control_q] - ^ ~z[i, target_q] - ) - ) - ) - x_cq = symplectic_matrix[i, control_q] - x_tq = symplectic_matrix[i, target_q] - z_cq = symplectic_matrix[i, nqubits + control_q] - z_tq = symplectic_matrix[i, nqubits + target_q] - symplectic_matrix[i, control_q] = x_tq - symplectic_matrix[i, target_q] = x_cq - symplectic_matrix[i, nqubits + control_q] = z_tq - symplectic_matrix[i, nqubits + target_q] = z_cq - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def iSWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-CNOT-H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ (x[i, control_q] & z[i, control_q]) - ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) - ^ ( - (z[i, control_q] ^ x[i, control_q]) - & (z[i, target_q] ^ x[i, target_q]) - & (x[i, target_q] ^ ~x[i, control_q]) - ) - ^ ( - (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) - & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) - & ( - x[i, target_q] - ^ z[i, target_q] - ^ x[i, control_q] - ^ ~z[i, control_q] - ) - ) - ^ ( - x[i, control_q] - & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q]) - ) - ) - z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] - z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - tmp = symplectic_matrix[i, control_q] - symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] - symplectic_matrix[i, target_q] = tmp - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def CY(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> S-CNOT-SDG""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) - ^ ( - x[i, control_q] - & (x[i, target_q] ^ z[i, target_q]) - & (z[i, control_q] ^ ~x[i, target_q]) - ) - ^ ( - (x[i, target_q] ^ x[i, control_q]) - & (z[i, target_q] ^ x[i, target_q]) - ) - ) - x_target_q = x[i, control_q] ^ x[i, target_q] - z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, target_q] = x_target_q - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q - return symplectic_matrix - - @staticmethod - @jit.rawkernel() - def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): - x = symplectic_matrix[: -1 + (2 * nqubits + 2) * int(include_scratch), :nqubits] - z = symplectic_matrix[ - : -1 + (2 * nqubits + 2) * int(include_scratch), nqubits:-1 - ] - - x1, x2 = x[i, :], x[h, :] - z1, z2 = z[i, :], z[h, :] - tid = jit.blockIdx.h * jit.blockDim.h + jit.threadIdx.h - ntid = jit.gridDim.h * jit.blockDim.h - for i in range(tid, len(h), ntid): - exp = cp.zeros(nqubits, dtype=int64) - x1_eq_z1 = (x1[j] ^ z1[j]) == False - x1_neq_z1 = ~x1_eq_z1 - x1_eq_0 = x1[j] == False - x1_eq_1 = ~x1_eq_0 - ind2 = x1_eq_z1 & x1_eq_1 - ind3 = x1_eq_1 & x1_neq_z1 - ind4 = x1_eq_0 & x1_neq_z1 - exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) - exp[ind3] = z2[j, ind3].astype(uint64) * ( - 2 * x2[j, ind3].astype(uint64) - 1 - ) - exp[ind4] = x2[j, ind4].astype(uint64) * ( - 1 - 2 * z2[j, ind4].astype(uint64) - ) - - symplectic_matrix[h[j], -1] = ( - 2 * symplectic_matrix[h[j], -1] - + 2 * symplectic_matrix[i[j], -1] - + cp.sum(exp) - ) % 4 != 0 - symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] - symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] - return symplectic_matrix From f82dcd4dd7766228c0c4ef55e360a01e5d05f7f5 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Wed, 27 Dec 2023 15:00:47 +0100 Subject: [PATCH 11/60] fix: minor import fix --- src/qibojit/backends/gpu.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index 945f143b..b5f50474 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -67,8 +67,6 @@ def __init__(self): self.gates = {} from qibojit.custom_operators import raw_kernels - self.clifford_operations = clifford_operations_gpu - def kernel_loader(name, ktype): code = getattr(raw_kernels, name) code = code.replace("T", f"thrust::complex<{ktype}>") @@ -101,9 +99,7 @@ def kernel_loader(name, ktype): # number of available GPUs (for multigpu) self.ngpus = cp.cuda.runtime.getDeviceCount() - from qibojit.backends.clifford_gpu import CliffordOperations - - self.clifford_operations = CliffordOperations(self.np) + self.clifford_operations = clifford_operations_gpu def set_precision(self, precision): super().set_precision(precision) From 57399ab50b7d931756472da2c39fadb462729efc Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Thu, 4 Jan 2024 13:00:33 +0100 Subject: [PATCH 12/60] fix: fix cupy implementation of gates --- .../backends/clifford_operations_gpu.py | 482 +++++++++++------- 1 file changed, 299 insertions(+), 183 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index e07d8b1d..84370daf 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -4,302 +4,418 @@ from cupyx import jit from qibo.backends.clifford_operations import * +GRIDDIM, BLOCKDIM = 1024, 128 + @jit.rawkernel() -def H(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) +def apply_H(symplectic_matrix, q, nqubits): + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + symplectic_matrix[i, q] & symplectic_matrix[i, qz] + ) tmp = symplectic_matrix[i, q] - symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = tmp + symplectic_matrix[i, q] = symplectic_matrix[i, qz] + symplectic_matrix[i, qz] = tmp + + +def H(symplectic_matrix, q, nqubits): + apply_H[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def CNOT(symplectic_matrix, control_q, target_q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( - x[i, target_q] ^ ~z[i, control_q] +def apply_CNOT(symplectic_matrix, control_q, target_q, nqubits): + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + cqz = nqubits + control_q + tqz = nqubits + target_q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + symplectic_matrix[i, control_q] & symplectic_matrix[i, tqz] + ) & (symplectic_matrix[i, target_q] ^ ~symplectic_matrix[i, cqz]) + symplectic_matrix[i, target_q] = ( + symplectic_matrix[i, target_q] ^ symplectic_matrix[i, control_q] + ) + symplectic_matrix[i, nqubits + control_q] = ( + symplectic_matrix[i, cqz] ^ symplectic_matrix[i, tqz] ) - symplectic_matrix[i, target_q] = x[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z[i, control_q] ^ z[i, target_q] + + +def CNOT(symplectic_matrix, control_q, target_q, nqubits): + apply_CNOT[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) return symplectic_matrix @jit.rawkernel() -def CZ(symplectic_matrix, control_q, target_q, nqubits): +def apply_CZ(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> H-CNOT-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] + cqz = nqubits + control_q + tqz = nqubits + target_q tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ (x[i, control_q] & x[i, target_q] & (z[i, target_q] ^ ~z[i, control_q])) - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, control_q])) + symplectic_matrix[i, -1] + ^ (symplectic_matrix[i, target_q] & symplectic_matrix[i, tqz]) + ^ ( + symplectic_matrix[i, control_q] + & symplectic_matrix[i, target_q] + & (symplectic_matrix[i, tqz] ^ ~symplectic_matrix[i, cqz]) + ) + ^ ( + symplectic_matrix[i, target_q] + & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, control_q]) + ) ) - z_control_q = x[i, target_q] ^ z[i, control_q] - z_target_q = z[i, target_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q + z_control_q = symplectic_matrix[i, target_q] ^ symplectic_matrix[i, cqz] + z_target_q = symplectic_matrix[i, tqz] ^ symplectic_matrix[i, control_q] + symplectic_matrix[i, cqz] = z_control_q + symplectic_matrix[i, tqz] = z_target_q + + +def CZ(symplectic_matrix, control_q, target_q, nqubits): + apply_CZ[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) return symplectic_matrix @jit.rawkernel() +def apply_S(symplectic_matrix, q, nqubits): + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + symplectic_matrix[i, q] & symplectic_matrix[i, qz] + ) + symplectic_matrix[i, qz] = symplectic_matrix[i, qz] ^ symplectic_matrix[i, q] + + def S(symplectic_matrix, q, nqubits): - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + apply_S[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def Z(symplectic_matrix, q, nqubits): +def apply_Z(symplectic_matrix, q, nqubits): """Decomposition --> S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ ( - (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + (symplectic_matrix[i, q] & symplectic_matrix[i, qz]) + ^ symplectic_matrix[i, q] + & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) ) + + +def Z(symplectic_matrix, q, nqubits): + apply_Z[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def X(symplectic_matrix, q, nqubits): +def apply_X(symplectic_matrix, q, nqubits): """Decomposition --> H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) + symplectic_matrix[i, -1] + ^ ( + symplectic_matrix[i, qz] + & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + ) + ^ (symplectic_matrix[i, qz] & symplectic_matrix[i, q]) ) + + +def X(symplectic_matrix, q, nqubits): + apply_X[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def Y(symplectic_matrix, q, nqubits): +def apply_Y(symplectic_matrix, q, nqubits): """Decomposition --> S-S-H-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( - r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) + rsymplectic_matrix[i, -1] + ^ ( + symplectic_matrix[i, qz] + & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + ) + ^ ( + symplectic_matrix[i, q] + & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + ) ) + + +def Y(symplectic_matrix, q, nqubits): + apply_Y[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def SX(symplectic_matrix, q, nqubits): +def apply_SX(symplectic_matrix, q, nqubits): """Decomposition --> H-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + symplectic_matrix[i, qz] + & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + ) + symplectic_matrix[i, q] = symplectic_matrix[i, qz] ^ symplectic_matrix[i, q] + + +def SX(symplectic_matrix, q, nqubits): + apply_SX[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def SDG(symplectic_matrix, q, nqubits): +def apply_SDG(symplectic_matrix, q, nqubits): """Decomposition --> S-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + symplectic_matrix[i, q] + & (symplectic_matrix[i, qZ] ^ symplectic_matrix[i, q]) + ) + symplectic_matrix[i, qz] = symplectic_matrix[i, qZ] ^ symplectic_matrix[i, q] + + +def SDG(symplectic_matrix, q, nqubits): + apply_SDG[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def SXDG(symplectic_matrix, q, nqubits): +def apply_SXDG(symplectic_matrix, q, nqubits): """Decomposition --> H-S-S-S-H""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) - symplectic_matrix[i, q] = z[i, q] ^ x[i, q] + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + symplectic_matrix[i, qz] & symplectic_matrix[i, q] + ) + symplectic_matrix[i, q] = symplectic_matrix[i, qz] ^ symplectic_matrix[i, q] + + +def SXDG(symplectic_matrix, q, nqubits): + apply_SXDG[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def RY_pi(symplectic_matrix, q, nqubits): +def apply_RY_pi(symplectic_matrix, q, nqubits): """Decomposition --> H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) - zq = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + symplectic_matrix[i, q] + & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + ) + zq = symplectic_matrix[i, qz] + symplectic_matrix[i, qz] = symplectic_matrix[i, q] symplectic_matrix[i, q] = zq + + +def RY_pi(symplectic_matrix, q, nqubits): + apply_RY_pi[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def RY_3pi_2(symplectic_matrix, q, nqubits): +def apply_RY_3pi_2(symplectic_matrix, q, nqubits): """Decomposition --> H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, q] - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) - zq = symplectic_matrix[i, nqubits + q] - symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x + qz = nqubits + q + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( + symplectic_matrix[i, qz] + & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + ) + zq = symplectic_matrix[i, qz] + symplectic_matrix[i, qz] = symplectic_matrix[i, q] symplectic_matrix[i, q] = zq + + +def RY_3pi_2(symplectic_matrix, q, nqubits): + apply_RY_3pi_2[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) return symplectic_matrix @jit.rawkernel() -def SWAP(symplectic_matrix, control_q, target_q, nqubits): +def apply_SWAP(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> CNOT-CNOT-CNOT""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] + cqz = nqubits + control_q + tqz = nqubits + target_q tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): - symplectic_matrix[:-1, -1] = ( - r[i] - ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): + symplectic_matrix[i, -1] = ( + symplectic_matrix[i, -1] ^ ( - (x[i, target_q] ^ x[i, control_q]) - & (z[i, target_q] ^ z[i, control_q]) - & (z[i, target_q] ^ ~x[i, control_q]) + symplectic_matrix[i, control_q] + & symplectic_matrix[i, tqz] + & (symplectic_matrix[i, target_q] ^ ~symplectic_matrix[i, cqz]) ) ^ ( - x[i, target_q] - & z[i, control_q] - & (x[i, control_q] ^ x[i, target_q] ^ z[i, control_q] ^ ~z[i, target_q]) + (symplectic_matrix[i, target_q] ^ symplectic_matrix[i, control_q]) + & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, cqz]) + & (symplectic_matrix[i, tqz] ^ ~symplectic_matrix[i, control_q]) + ) + ^ ( + symplectic_matrix[i, target_q] + & symplectic_matrix[i, cqz] + & ( + symplectic_matrix[i, control_q] + ^ symplectic_matrix[i, target_q] + ^ symplectic_matrix[i, cqz] + ^ ~symplectic_matrix[i, tqz] + ) ) ) x_cq = symplectic_matrix[i, control_q] x_tq = symplectic_matrix[i, target_q] - z_cq = symplectic_matrix[i, nqubits + control_q] - z_tq = symplectic_matrix[i, nqubits + target_q] + z_cq = symplectic_matrix[i, cqz] + z_tq = symplectic_matrix[i, tqz] symplectic_matrix[i, control_q] = x_tq symplectic_matrix[i, target_q] = x_cq - symplectic_matrix[i, nqubits + control_q] = z_tq - symplectic_matrix[i, nqubits + target_q] = z_cq + symplectic_matrix[i, cqz] = z_tq + symplectic_matrix[i, tqz] = z_cq + + +def SWAP(symplectic_matrix, control_q, target_q, nqubits): + apply_SWAP[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) return symplectic_matrix @jit.rawkernel() -def iSWAP(symplectic_matrix, control_q, target_q, nqubits): +def apply_iSWAP(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> H-CNOT-CNOT-H-S-S""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] + cqz = nqubits + control_q + tqz = nqubits + target_q tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & z[i, target_q]) - ^ (x[i, control_q] & z[i, control_q]) - ^ (x[i, control_q] & (z[i, control_q] ^ x[i, control_q])) + symplectic_matrix[i, -1] + ^ (symplectic_matrix[i, target_q] & symplectic_matrix[i, tqz]) + ^ (symplectic_matrix[i, control_q] & symplectic_matrix[i, cqz]) + ^ ( + symplectic_matrix[i, control_q] + & (symplectic_matrix[i, cqz] ^ symplectic_matrix[i, control_q]) + ) + ^ ( + (symplectic_matrix[i, cqz] ^ symplectic_matrix[i, control_q]) + & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, target_q]) + & (symplectic_matrix[i, target_q] ^ ~symplectic_matrix[i, control_q]) + ) ^ ( - (z[i, control_q] ^ x[i, control_q]) - & (z[i, target_q] ^ x[i, target_q]) - & (x[i, target_q] ^ ~x[i, control_q]) + ( + symplectic_matrix[i, target_q] + ^ symplectic_matrix[i, cqz] + ^ symplectic_matrix[i, control_q] + ) + & ( + symplectic_matrix[i, target_q] + ^ symplectic_matrix[i, tqz] + ^ symplectic_matrix[i, control_q] + ) + & ( + symplectic_matrix[i, target_q] + ^ symplectic_matrix[i, tqz] + ^ symplectic_matrix[i, control_q] + ^ ~symplectic_matrix[i, cqz] + ) ) ^ ( - (x[i, target_q] ^ z[i, control_q] ^ x[i, control_q]) - & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q]) - & (x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] ^ ~z[i, control_q]) + symplectic_matrix[i, control_q] + & ( + symplectic_matrix[i, target_q] + ^ symplectic_matrix[i, control_q] + ^ symplectic_matrix[i, cqz] + ) ) - ^ (x[i, control_q] & (x[i, target_q] ^ x[i, control_q] ^ z[i, control_q])) ) - z_control_q = x[i, target_q] ^ z[i, target_q] ^ x[i, control_q] - z_target_q = x[i, target_q] ^ z[i, control_q] ^ x[i, control_q] - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q + z_control_q = ( + symplectic_matrix[i, target_q] + ^ symplectic_matrix[i, tqz] + ^ symplectic_matrix[i, control_q] + ) + z_target_q = ( + symplectic_matrix[i, target_q] + ^ symplectic_matrix[i, cqz] + ^ symplectic_matrix[i, control_q] + ) + symplectic_matrix[i, cqz] = z_control_q + symplectic_matrix[i, tqz] = z_target_q tmp = symplectic_matrix[i, control_q] symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] symplectic_matrix[i, target_q] = tmp + + +def iSWAP(symplectic_matrix, control_q, target_q, nqubits): + apply_iSWAP[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) return symplectic_matrix @jit.rawkernel() -def CY(symplectic_matrix, control_q, target_q, nqubits): +def apply_CY(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> S-CNOT-SDG""" - r = symplectic_matrix[:-1, -1] - x = symplectic_matrix[:-1, :nqubits] - z = symplectic_matrix[:-1, nqubits:-1] - xq = x[:, control_q] + cqz = nqubits + control_q + tqz = nqubits + target_q tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq ntid = jit.gridDim.xq * jit.blockDim.xq - for i in range(tid, xq.shape[0], ntid): + for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( - r[i] - ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) + symplectic_matrix[i, -1] + ^ ( + symplectic_matrix[i, target_q] + & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, target_q]) + ) + ^ ( + symplectic_matrix[i, control_q] + & (symplectic_matrix[i, target_q] ^ symplectic_matrix[i, tqz]) + & (symplectic_matrix[i, cqz] ^ ~symplectic_matrix[i, target_q]) + ) ^ ( - x[i, control_q] - & (x[i, target_q] ^ z[i, target_q]) - & (z[i, control_q] ^ ~x[i, target_q]) + (symplectic_matrix[i, target_q] ^ symplectic_matrix[i, control_q]) + & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, target_q]) ) - ^ ((x[i, target_q] ^ x[i, control_q]) & (z[i, target_q] ^ x[i, target_q])) ) - x_target_q = x[i, control_q] ^ x[i, target_q] - z_control_q = z[i, control_q] ^ z[i, target_q] ^ x[i, target_q] - z_target_q = z[i, target_q] ^ x[i, control_q] + x_target_q = symplectic_matrix[i, control_q] ^ symplectic_matrix[i, target_q] + z_control_q = ( + symplectic_matrix[i, cqz] + ^ symplectic_matrix[i, tqz] + ^ symplectic_matrix[i, target_q] + ) + z_target_q = symplectic_matrix[i, tqz] ^ symplectic_matrix[i, control_q] symplectic_matrix[i, target_q] = x_target_q - symplectic_matrix[i, nqubits + control_q] = z_control_q - symplectic_matrix[i, nqubits + target_q] = z_target_q + symplectic_matrix[i, cqz] = z_control_q + symplectic_matrix[i, tqz] = z_target_q + + +def CY(symplectic_matrix, control_q, target_q, nqubits): + apply_CY[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) return symplectic_matrix From 6c0e59e52f577186a459954ec5c7e9e5e8b35953 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Thu, 4 Jan 2024 13:23:19 +0100 Subject: [PATCH 13/60] fix: fixed some typos --- src/qibojit/backends/clifford_operations_gpu.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 84370daf..9c87ca92 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -54,8 +54,8 @@ def apply_CZ(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> H-CNOT-H""" cqz = nqubits + control_q tqz = nqubits + target_q - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( symplectic_matrix[i, -1] @@ -147,7 +147,7 @@ def apply_Y(symplectic_matrix, q, nqubits): qz = nqubits + q for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( - rsymplectic_matrix[i, -1] + symplectic_matrix[i, -1] ^ ( symplectic_matrix[i, qz] & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) From 0bcc49bdcdc8b4a6925910b01179479e1a262d9c Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Thu, 4 Jan 2024 16:36:54 +0100 Subject: [PATCH 14/60] fix: fixed parallelization of _rowsum in cupy --- .../backends/clifford_operations_gpu.py | 68 +++++++++++-------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 9c87ca92..a25eda6b 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -420,34 +420,48 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): @jit.rawkernel() -def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): - x = symplectic_matrix[: -1 + (2 * nqubits + 2) * int(include_scratch), :nqubits] - z = symplectic_matrix[: -1 + (2 * nqubits + 2) * int(include_scratch), nqubits:-1] - - x1, x2 = x[i, :], x[h, :] - z1, z2 = z[i, :], z[h, :] - tid = jit.blockIdx.h * jit.blockDim.h + jit.threadIdx.h - ntid = jit.gridDim.h * jit.blockDim.h - for j in range(tid, len(h), ntid): - exp = cp.zeros(nqubits, dtype=int64) - x1_eq_z1 = (x1[j] ^ z1[j]) == False - x1_neq_z1 = ~x1_eq_z1 - x1_eq_0 = x1[j] == False - x1_eq_1 = ~x1_eq_0 - ind2 = x1_eq_z1 & x1_eq_1 - ind3 = x1_eq_1 & x1_neq_z1 - ind4 = x1_eq_0 & x1_neq_z1 - exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) - exp[ind3] = z2[j, ind3].astype(uint64) * (2 * x2[j, ind3].astype(uint64) - 1) - exp[ind4] = x2[j, ind4].astype(uint64) * (1 - 2 * z2[j, ind4].astype(uint64)) - +def _apply_rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): + tid_x = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + tid_y = jit.blockIdx.y * jit.blockDim.y + jit.threadIdx.y + ntid_x = jit.gridDim.x * jit.blockDim.x + ntid_y = jit.gridDim.x * jit.blockDim.y + for j in range(tid_y, len(h), ntid_y): + exp = 0 + for k in range(tid_x, nqubits, ntid_x): + jz = nqubits + j + x1_eq_z1 = symplectic_matrix[i[k], j] == symplectic_matrix[i[k], jz] + x1_eq_0 = symplectic_matrix[i[k], j] == False + if x1_eq_z1: + if not x1_eq_0: + exp += int(symplectic_matrix[h[k], jz]) - int( + symplectic_matrix[h[k], j] + ) + else: + if x1_eq_0: + exp += int(symplectic_matrix[h[k], j]) * ( + 1 - 2 * int(symplectic_matrix[h[k], jz]) + ) + else: + exp += int(symplectic_matrix[h[k], jz]) * ( + 2 * int(symplectic_matrix[h[k], j]) - 1 + ) symplectic_matrix[h[j], -1] = ( - 2 * symplectic_matrix[h[j], -1] - + 2 * symplectic_matrix[i[j], -1] - + cp.sum(exp) + 2 * symplectic_matrix[h[j], -1] + 2 * symplectic_matrix[i[j], -1] + exp ) % 4 != 0 - symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] - symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] + for k in range(tid_x, nqubits, ntid_y): + kz = nqubits + k + symplectic_matrix[h[j], k] = ( + symplectic_matrix[i[j], k] ^ symplectic_matrix[h[j], k] + ) + symplectic_matrix[h[j], nqubits + k] = ( + symplectic_matrix[i[j], kz] ^ symplectic_matrix[h[j], kz] + ) + + +def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): + _apply_rowsum[GRIDDIM, (BLOCKDIM, BLOCKDIM)]( + symplectic_matrix, h, i, nqubits, include_scratch + ) return symplectic_matrix @@ -486,6 +500,6 @@ def _determined_outcome(state, q, nqubits): "iSWAP", "CY", "_rowsum", - "_determined_outcome", + # "_determined_outcome", ]: setattr(co, f, locals()[f]) From 757904e60ab9052fd0df605dd3e431e73ae9d0c7 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Fri, 5 Jan 2024 10:51:38 +0100 Subject: [PATCH 15/60] fix: small fix to _rowsum --- src/qibojit/backends/clifford_operations_gpu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index a25eda6b..bf97948e 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -424,7 +424,7 @@ def _apply_rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = Fals tid_x = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x tid_y = jit.blockIdx.y * jit.blockDim.y + jit.threadIdx.y ntid_x = jit.gridDim.x * jit.blockDim.x - ntid_y = jit.gridDim.x * jit.blockDim.y + ntid_y = jit.gridDim.y * jit.blockDim.y for j in range(tid_y, len(h), ntid_y): exp = 0 for k in range(tid_x, nqubits, ntid_x): @@ -459,7 +459,7 @@ def _apply_rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = Fals def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): - _apply_rowsum[GRIDDIM, (BLOCKDIM, BLOCKDIM)]( + _apply_rowsum[(GRIDDIM, GRIDDIM), (BLOCKDIM, BLOCKDIM)]( symplectic_matrix, h, i, nqubits, include_scratch ) return symplectic_matrix From aaf19ff7798f6e22c81da86edcbcefa3f38cd932 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Fri, 5 Jan 2024 13:19:10 +0100 Subject: [PATCH 16/60] feat: moved clifford operations monkey-patching to backends --- .../backends/clifford_operations_cpu.py | 27 +-------- .../backends/clifford_operations_gpu.py | 59 +++++++++++-------- src/qibojit/backends/cpu.py | 9 ++- src/qibojit/backends/gpu.py | 9 ++- 4 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index ba2b5c7e..4472ff9b 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -1,7 +1,5 @@ import numpy as np -import qibo.backends.clifford_operations as co from numba import njit, prange, uint64 -from qibo.backends.clifford_operations import * @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) @@ -291,6 +289,7 @@ def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): return symplectic_matrix +""" @njit("Tuple((b1[:,:], u8))(b1[:,:], u8, u8)", parallel=False, cache=True) def _determined_outcome(state, q, nqubits): state[-1, :] = False @@ -304,26 +303,4 @@ def _determined_outcome(state, q, nqubits): include_scratch=True, ) return state, uint64(state[-1, -1]) - - -# monkey-patching the original qibo clifford operations -for f in [ - "H", - "CNOT", - "CZ", - "S", - "Z", - "X", - "Y", - "SX", - "SDG", - "SXDG", - "RY_pi", - "RY_3pi_2", - "SWAP", - "iSWAP", - "CY", - "_rowsum", - # "_determined_outcome", -]: - setattr(co, f, locals()[f]) +""" diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index bf97948e..2196d9e7 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -1,8 +1,6 @@ import cupy as cp import numpy as np -import qibo.backends.clifford_operations as co from cupyx import jit -from qibo.backends.clifford_operations import * GRIDDIM, BLOCKDIM = 1024, 128 @@ -420,7 +418,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): @jit.rawkernel() -def _apply_rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): +def _apply_rowsum(symplectic_matrix, h, i, nqubits): tid_x = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x tid_y = jit.blockIdx.y * jit.blockDim.y + jit.threadIdx.y ntid_x = jit.gridDim.x * jit.blockDim.x @@ -459,12 +457,32 @@ def _apply_rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = Fals def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): + GRIDDIM, BLOCKDIM = 32, 32 _apply_rowsum[(GRIDDIM, GRIDDIM), (BLOCKDIM, BLOCKDIM)]( - symplectic_matrix, h, i, nqubits, include_scratch + symplectic_matrix, h, i, nqubits ) return symplectic_matrix +def _random_outcome(state, p, q, nqubits): + h = cp.array([i for i in state[:-1, q].nonzero()[0] if i != p], dtype=cp.uint) + if h.shape[0] > 0: + state = _rowsum( + state, + h, + p * cp.ones(h.shape[0], dtype=np.uint), + nqubits, + False, + ) + state[p - nqubits, :] = state[p, :] + outcome = cp.random.randint(2, size=1).item() + state[p, :] = 0 + state[p, -1] = outcome + state[p, nqubits + q] = 1 + return state, outcome + + +""" @jit.rawkernel() def _determined_outcome(state, q, nqubits): state[-1, :] = False @@ -480,26 +498,17 @@ def _determined_outcome(state, q, nqubits): include_scratch=True, ) return state, uint64(state[-1, -1]) +""" -# monkey-patching the original qibo clifford operations -for f in [ - "H", - "CNOT", - "CZ", - "S", - "Z", - "X", - "Y", - "SX", - "SDG", - "SXDG", - "RY_pi", - "RY_3pi_2", - "SWAP", - "iSWAP", - "CY", - "_rowsum", - # "_determined_outcome", -]: - setattr(co, f, locals()[f]) +def _determined_outcome(state, q, nqubits): + state[-1, :] = False + for i in state[:nqubits, q].nonzero()[0]: + state = _rowsum( + state, + cp.array([2 * nqubits], dtype=np.uint), + cp.array([i + nqubits], dtype=np.uint), + nqubits, + include_scratch=True, + ) + return state, cp.uint(state[-1, -1]) diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index 916ef82c..85736066 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -1,5 +1,6 @@ import numpy as np from numba import njit +from qibo.backends import clifford_operations from qibo.backends.numpy import NumpyBackend from qibo.config import log from qibo.gates.abstract import ParametrizedGate @@ -71,7 +72,13 @@ def __init__(self): else: self.set_threads(len(psutil.Process().cpu_affinity())) - self.clifford_operations = clifford_operations_cpu + self.clifford_operations = clifford_operations + for method in dir(clifford_operations_cpu): + setattr( + self.clifford_operations, + method, + getattr(clifford_operations_cpu, method), + ) def set_precision(self, precision): if precision != self.precision: diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index b5f50474..e25f79c0 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -1,4 +1,5 @@ import numpy as np +from qibo.backends import clifford_operations from qibo.backends.numpy import NumpyBackend from qibo.config import log, raise_error @@ -99,7 +100,13 @@ def kernel_loader(name, ktype): # number of available GPUs (for multigpu) self.ngpus = cp.cuda.runtime.getDeviceCount() - self.clifford_operations = clifford_operations_gpu + self.clifford_operations = clifford_operations + for method in dir(clifford_operations_gpu): + setattr( + self.clifford_operations, + method, + getattr(clifford_operations_gpu, method), + ) def set_precision(self, precision): super().set_precision(precision) From bb7cc10e02b2f362cb10627bf417b58421ee643a Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Tue, 9 Jan 2024 10:33:00 +0400 Subject: [PATCH 17/60] fix: fixed patching problem --- src/qibojit/backends/cpu.py | 6 +++++- src/qibojit/backends/gpu.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index 85736066..ed0276a9 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -1,3 +1,5 @@ +from importlib.util import find_spec, module_from_spec + import numpy as np from numba import njit from qibo.backends import clifford_operations @@ -72,7 +74,9 @@ def __init__(self): else: self.set_threads(len(psutil.Process().cpu_affinity())) - self.clifford_operations = clifford_operations + spec = find_spec("qibo.backends.clifford_operations") + self.clifford_operations = module_from_spec(spec) + spec.loader.exec_module(self.clifford_operations) for method in dir(clifford_operations_cpu): setattr( self.clifford_operations, diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index e25f79c0..7687d59e 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -1,3 +1,5 @@ +from importlib.util import find_spec, module_from_spec + import numpy as np from qibo.backends import clifford_operations from qibo.backends.numpy import NumpyBackend @@ -100,7 +102,9 @@ def kernel_loader(name, ktype): # number of available GPUs (for multigpu) self.ngpus = cp.cuda.runtime.getDeviceCount() - self.clifford_operations = clifford_operations + spec = find_spec("qibo.backends.clifford_operations") + self.clifford_operations = module_from_spec(spec) + spec.loader.exec_module(self.clifford_operations) for method in dir(clifford_operations_gpu): setattr( self.clifford_operations, From ad5f0b8f04951df4ce94a8c371dc8a452d31f2c8 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 10 Jan 2024 13:01:16 +0400 Subject: [PATCH 18/60] feat: removed include_scratch + updated random_outcome --- .../backends/clifford_operations_cpu.py | 30 ++++++++----------- .../backends/clifford_operations_gpu.py | 20 ++++++------- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 4472ff9b..24b0225d 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -29,7 +29,6 @@ def CNOT(symplectic_matrix, control_q, target_q, nqubits): return symplectic_matrix -@staticmethod @njit("b1[:,:](b1[:,:], u8, u8, u8)", parallel=True, cache=True) def CZ(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> H-CNOT-H""" @@ -50,7 +49,6 @@ def CZ(symplectic_matrix, control_q, target_q, nqubits): return symplectic_matrix -@staticmethod @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def S(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] @@ -257,39 +255,35 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): return symplectic_matrix -@njit("b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True) -def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): - x = symplectic_matrix[: -1 + (2 * nqubits + 2) * uint64(include_scratch), :nqubits] - z = symplectic_matrix[ - : -1 + (2 * nqubits + 2) * uint64(include_scratch), nqubits:-1 - ] - - x1, x2 = x[i, :], x[h, :] - z1, z2 = z[i, :], z[h, :] +@njit("b1[:,:](b1[:,:], u8[:], u8[:], u8)", parallel=True, cache=True) +def _rowsum(symplectic_matrix, h, i, nqubits): + xi, xh = symplectic_matrix[i, :nqubits], symplectic_matrix[h, :nqubits] + zi, zh = symplectic_matrix[i, nqubits:-1], symplectic_matrix[h, nqubits:-1] for j in prange(len(h)): exp = np.zeros(nqubits, dtype=uint64) - x1_eq_z1 = (x1[j] ^ z1[j]) == False + x1_eq_z1 = (xi[j] ^ zi[j]) == False x1_neq_z1 = ~x1_eq_z1 - x1_eq_0 = x1[j] == False + x1_eq_0 = xi[j] == False x1_eq_1 = ~x1_eq_0 ind2 = x1_eq_z1 & x1_eq_1 ind3 = x1_eq_1 & x1_neq_z1 ind4 = x1_eq_0 & x1_neq_z1 - exp[ind2] = z2[j, ind2].astype(uint64) - x2[j, ind2].astype(uint64) - exp[ind3] = z2[j, ind3].astype(uint64) * (2 * x2[j, ind3].astype(uint64) - 1) - exp[ind4] = x2[j, ind4].astype(uint64) * (1 - 2 * z2[j, ind4].astype(uint64)) + exp[ind2] = zh[j, ind2].astype(uint64) - xh[j, ind2].astype(uint64) + exp[ind3] = zh[j, ind3].astype(uint64) * (2 * xh[j, ind3].astype(uint64) - 1) + exp[ind4] = xh[j, ind4].astype(uint64) * (1 - 2 * zh[j, ind4].astype(uint64)) symplectic_matrix[h[j], -1] = ( 2 * symplectic_matrix[h[j], -1] + 2 * symplectic_matrix[i[j], -1] + np.sum(exp) ) % 4 != 0 - symplectic_matrix[h[j], :nqubits] = x[i[j], :] ^ x[h[j], :] - symplectic_matrix[h[j], nqubits:-1] = z[i[j], :] ^ z[h[j], :] + symplectic_matrix[h[j], :nqubits] = xi[j] ^ xh[j] + symplectic_matrix[h[j], nqubits:-1] = zi[j] ^ zh[j] return symplectic_matrix """ +# Not parallelizable? @njit("Tuple((b1[:,:], u8))(b1[:,:], u8, u8)", parallel=False, cache=True) def _determined_outcome(state, q, nqubits): state[-1, :] = False diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 2196d9e7..1d3a9ced 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -3,6 +3,7 @@ from cupyx import jit GRIDDIM, BLOCKDIM = 1024, 128 +BLOCKDIM_2D = (32, 32) @jit.rawkernel() @@ -424,7 +425,8 @@ def _apply_rowsum(symplectic_matrix, h, i, nqubits): ntid_x = jit.gridDim.x * jit.blockDim.x ntid_y = jit.gridDim.y * jit.blockDim.y for j in range(tid_y, len(h), ntid_y): - exp = 0 + if jit.blockIdx.x == 0: + exp = 0 for k in range(tid_x, nqubits, ntid_x): jz = nqubits + j x1_eq_z1 = symplectic_matrix[i[k], j] == symplectic_matrix[i[k], jz] @@ -456,26 +458,25 @@ def _apply_rowsum(symplectic_matrix, h, i, nqubits): ) -def _rowsum(symplectic_matrix, h, i, nqubits, include_scratch: bool = False): - GRIDDIM, BLOCKDIM = 32, 32 - _apply_rowsum[(GRIDDIM, GRIDDIM), (BLOCKDIM, BLOCKDIM)]( - symplectic_matrix, h, i, nqubits - ) +def _rowsum(symplectic_matrix, h, i, nqubits): + _apply_rowsum[(GRIDDIM, GRIDDIM), BLOCKDIM_2D](symplectic_matrix, h, i, nqubits) return symplectic_matrix def _random_outcome(state, p, q, nqubits): - h = cp.array([i for i in state[:-1, q].nonzero()[0] if i != p], dtype=cp.uint) + p = p[0] + nqubits + h = state[:-1, q].copy() + h[p] = False + h = h.nonzero()[0] if h.shape[0] > 0: state = _rowsum( state, h, p * cp.ones(h.shape[0], dtype=np.uint), nqubits, - False, ) state[p - nqubits, :] = state[p, :] - outcome = cp.random.randint(2, size=1).item() + outcome = cp.random.randint(2, size=1) state[p, :] = 0 state[p, -1] = outcome state[p, nqubits + q] = 1 @@ -509,6 +510,5 @@ def _determined_outcome(state, q, nqubits): cp.array([2 * nqubits], dtype=np.uint), cp.array([i + nqubits], dtype=np.uint), nqubits, - include_scratch=True, ) return state, cp.uint(state[-1, -1]) From d22904820c7dac9557f290522d7c98fced012483 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 10 Jan 2024 13:40:41 +0400 Subject: [PATCH 19/60] fix: fixed some typos --- src/qibojit/backends/clifford_operations_gpu.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 1d3a9ced..94a28e6c 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -191,9 +191,9 @@ def apply_SDG(symplectic_matrix, q, nqubits): for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( symplectic_matrix[i, q] - & (symplectic_matrix[i, qZ] ^ symplectic_matrix[i, q]) + & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) ) - symplectic_matrix[i, qz] = symplectic_matrix[i, qZ] ^ symplectic_matrix[i, q] + symplectic_matrix[i, qz] = symplectic_matrix[i, qz] ^ symplectic_matrix[i, q] def SDG(symplectic_matrix, q, nqubits): @@ -266,8 +266,8 @@ def apply_SWAP(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> CNOT-CNOT-CNOT""" cqz = nqubits + control_q tqz = nqubits + target_q - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( symplectic_matrix[i, -1] @@ -312,8 +312,8 @@ def apply_iSWAP(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> H-CNOT-CNOT-H-S-S""" cqz = nqubits + control_q tqz = nqubits + target_q - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( symplectic_matrix[i, -1] @@ -382,8 +382,8 @@ def apply_CY(symplectic_matrix, control_q, target_q, nqubits): """Decomposition --> S-CNOT-SDG""" cqz = nqubits + control_q tqz = nqubits + target_q - tid = jit.blockIdx.xq * jit.blockDim.xq + jit.threadIdx.xq - ntid = jit.gridDim.xq * jit.blockDim.xq + tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x + ntid = jit.gridDim.x * jit.blockDim.x for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): symplectic_matrix[i, -1] = ( symplectic_matrix[i, -1] From 9acd8861fa3f8c053c7709931efd7035137a61ad Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 12 Jan 2024 16:15:35 +0400 Subject: [PATCH 20/60] feat: implemented cupy kernels in CUDA + matrix linearization --- .../backends/clifford_operations_gpu.py | 675 +++++++++++------- src/qibojit/backends/gpu.py | 7 + 2 files changed, 415 insertions(+), 267 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 94a28e6c..57d06c93 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -5,217 +5,307 @@ GRIDDIM, BLOCKDIM = 1024, 128 BLOCKDIM_2D = (32, 32) +apply_one_qubit_kernel = """ +extern "C" +__global__ void apply_{}(bool* symplectic_matrix, const int q, const int nqubits, conts int qz, const int dim) {{ + _apply_{}(symplectic_matrix, q, nqubits, qz, dim); +}} +""" -@jit.rawkernel() -def apply_H(symplectic_matrix, q, nqubits): - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x +apply_two_qubits_kernel = """ +extern "C" +__global__ void apply_{}(bool* symplectic_matrix, const int control_q, const int target_q, const int nqubits, const int cqz, const int tqz, const int dim) {{ + _apply_{}(symplectic_matrix, control_q, target_q, nqubits, cqz, tqz, dim); +}} +""" + + +def one_qubit_kernel_launcher(kernel, args): qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - symplectic_matrix[i, q] & symplectic_matrix[i, qz] - ) - tmp = symplectic_matrix[i, q] - symplectic_matrix[i, q] = symplectic_matrix[i, qz] - symplectic_matrix[i, qz] = tmp + dim = symplectic_matrix.shape[0] + return kernel((GRIDDIM,), (BLOCKDIM,), (*args, qz, dim)) + + +def two_qubits_kernel_launcher(kernel, args): + cqz = nqubits + control_q + tqz = nqubits + target_q + dim = symplectic_matrix.shape[0] + return kernel((GRIDDIM,), (BLOCKDIM,), (*args, cqz, tqz, dim)) + + +apply_H = """ +__device__ void _apply_H(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ (symplectic_matrix[i * dim + q] & symplectic_matrix[i * dim + qz]); + const bool tmp = symplectic_matrix[i * dim + q]; + symplectic_matrix[i * dim + q] = symplectic_matrix[i * dim + qz]; + symplectic_matrix[i * dim + qz] = tmp; + }; +} +""" + apply_one_qubit_kernel.format( + "H", "H" +) + +apply_H = cp.RawKernel(apply_H, "apply_H", options=("--std=c++11",)) def H(symplectic_matrix, q, nqubits): - apply_H[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_H, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_CNOT(symplectic_matrix, control_q, target_q, nqubits): - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - cqz = nqubits + control_q - tqz = nqubits + target_q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - symplectic_matrix[i, control_q] & symplectic_matrix[i, tqz] - ) & (symplectic_matrix[i, target_q] ^ ~symplectic_matrix[i, cqz]) - symplectic_matrix[i, target_q] = ( - symplectic_matrix[i, target_q] ^ symplectic_matrix[i, control_q] - ) - symplectic_matrix[i, nqubits + control_q] = ( - symplectic_matrix[i, cqz] ^ symplectic_matrix[i, tqz] - ) +apply_CNOT = """ +__device__ void _apply_CNOT(bool* symplectic_matrix, const int& control_q, const int& target_q, const int& nqubits, const int& cqz, const int& tqz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ ( + symplectic_matrix[i * dim + control_q] & symplectic_matrix[i * dim + tqz] + ) & (symplectic_matrix[i * dim + target_q] ^ symplectic_matrix[i * dim + cqz] ^ 1); + symplectic_matrix[i * dim + target_q] = ( + symplectic_matrix[i * dim + target_q] ^ symplectic_matrix[i * dim + control_q] + ); + symplectic_matrix[i * dim + cqz] = ( + symplectic_matrix[i * dim + cqz] ^ symplectic_matrix[i * dim + tqz] + ); + }; +} +""" + apply_two_qubits_kernel.format( + "CNOT", "CNOT" +) + +apply_CNOT = cp.RawKernel(apply_CNOT, "apply_CNOT", options=("--std=c++11",)) def CNOT(symplectic_matrix, control_q, target_q, nqubits): - apply_CNOT[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) + two_qubits_kernel_launcher( + apply_CNOT, symplectic_matrix, control_q, target_q, nqubits + ) return symplectic_matrix -@jit.rawkernel() -def apply_CZ(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-H""" - cqz = nqubits + control_q - tqz = nqubits + target_q - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = ( - symplectic_matrix[i, -1] - ^ (symplectic_matrix[i, target_q] & symplectic_matrix[i, tqz]) +apply_CZ = """ +__device__ void _apply_CZ(bool* symplectic_matrix, const int& control_q, const int& target_q, const int& nqubits, const int& cqz, const int& tqz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = ( + symplectic_matrix[i * dim + last] + ^ (symplectic_matrix[i * dim + target_q] & symplectic_matrix[i * dim + tqz]) ^ ( - symplectic_matrix[i, control_q] - & symplectic_matrix[i, target_q] - & (symplectic_matrix[i, tqz] ^ ~symplectic_matrix[i, cqz]) + symplectic_matrix[i * dim + control_q] + & symplectic_matrix[i * dim + target_q] + & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + cqz]) ^ 1 ) ^ ( - symplectic_matrix[i, target_q] - & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, control_q]) + symplectic_matrix[i * dim + target_q] + & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + control_q]) ) - ) - z_control_q = symplectic_matrix[i, target_q] ^ symplectic_matrix[i, cqz] - z_target_q = symplectic_matrix[i, tqz] ^ symplectic_matrix[i, control_q] - symplectic_matrix[i, cqz] = z_control_q - symplectic_matrix[i, tqz] = z_target_q + ); + const bool z_control_q = symplectic_matrix[i * dim + target_q] ^ symplectic_matrix[i * dim + cqz]; + const bool z_target_q = symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + control_q]; + symplectic_matrix[i * dim + cqz] = z_control_q; + symplectic_matrix[i * dim + tqz] = z_target_q; + }; +} +""" + apply_two_qubits_kernel.format( + "CZ", "CZ" +) + +apply_CZ = cp.RawKernel(apply_CZ, "apply_CZ", options=("--std=c++11",)) def CZ(symplectic_matrix, control_q, target_q, nqubits): - apply_CZ[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) + two_qubits_kernel_launcher( + apply_CZ, symplectic_matrix, control_q, target_q, nqubits + ) return symplectic_matrix -@jit.rawkernel() -def apply_S(symplectic_matrix, q, nqubits): - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - symplectic_matrix[i, q] & symplectic_matrix[i, qz] - ) - symplectic_matrix[i, qz] = symplectic_matrix[i, qz] ^ symplectic_matrix[i, q] +apply_S = """ +__device__ void _apply_S(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ ( + symplectic_matrix[i * dim + q] & symplectic_matrix[i * dim + qz] + ); + symplectic_matrix[i * dim + qz] = symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]; + }; +} +""" + apply_one_qubit_kernel.format( + "S", "S" +) + +apply_S = cp.RawKernel(apply_S, "apply_S", options=("--std=c++11",)) def S(symplectic_matrix, q, nqubits): - apply_S[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_S, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_Z(symplectic_matrix, q, nqubits): - """Decomposition --> S-S""" - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - (symplectic_matrix[i, q] & symplectic_matrix[i, qz]) - ^ symplectic_matrix[i, q] - & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) - ) +apply_Z = """ +__device__ void _apply_Z(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ ( + (symplectic_matrix[i * dim + q] & symplectic_matrix[i * dim + qz]) + ^ symplectic_matrix[i * dim + q] + & (symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]) + ); + }; +} +""" + apply_one_qubit_kernel.format( + "Z", "Z" +) + +apply_Z = cp.RawKernel(apply_Z, "apply_Z", options=("--std=c++11",)) def Z(symplectic_matrix, q, nqubits): - apply_Z[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_Z, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_X(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-H""" - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = ( - symplectic_matrix[i, -1] +apply_X = """ +__device__ void _apply_X(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = ( + symplectic_matrix[i * dim + last] ^ ( - symplectic_matrix[i, qz] - & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + symplectic_matrix[i * dim + qz] + & (symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]) ) - ^ (symplectic_matrix[i, qz] & symplectic_matrix[i, q]) - ) + ^ (symplectic_matrix[i * dim + qz] & symplectic_matrix[i * dim + q]) + ); + }; +} +""" + apply_one_qubit_kernel.format( + "X", "X" +) + +apply_X = cp.RawKernel(apply_X, "apply_X", options=("--std=c++11",)) def X(symplectic_matrix, q, nqubits): - apply_X[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_X, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_Y(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-H-S-S-H""" - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = ( - symplectic_matrix[i, -1] +apply_Y = """ +__device__ void _apply_Y(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = ( + symplectic_matrix[i * dim + last] ^ ( - symplectic_matrix[i, qz] - & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + symplectic_matrix[i * dim + qz] + & (symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]) ) ^ ( - symplectic_matrix[i, q] - & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) + symplectic_matrix[i * dim + q] + & (symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]) ) - ) + ); + }; +} +""" + apply_one_qubit_kernel.format( + "Y", "Y" +) + +apply_Y = cp.RawKernel(apply_Y, "apply_Y", options=("--std=c++11",)) def Y(symplectic_matrix, q, nqubits): - apply_Y[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_Y, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_SX(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-H""" - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - symplectic_matrix[i, qz] - & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) - ) - symplectic_matrix[i, q] = symplectic_matrix[i, qz] ^ symplectic_matrix[i, q] +apply_SX = """ +__device__ void _apply_SX(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ ( + symplectic_matrix[i * dim + qz] + & (symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]) + ); + symplectic_matrix[i * dim + q] = symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]; + }; +} +""" + apply_one_qubit_kernel.format( + "SX", "SX" +) + +apply_SX = cp.RawKernel(apply_SX, "apply_SX", options=("--std=c++11",)) def SX(symplectic_matrix, q, nqubits): - apply_SX[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_SX, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_SDG(symplectic_matrix, q, nqubits): - """Decomposition --> S-S-S""" - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - symplectic_matrix[i, q] - & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) - ) - symplectic_matrix[i, qz] = symplectic_matrix[i, qz] ^ symplectic_matrix[i, q] +apply_SDG = """ +__device__ void _apply_SDG(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ ( + symplectic_matrix[i * dim + q] + & (symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]) + ); + symplectic_matrix[i * dim + qz] = symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]; + }; +} +""" + apply_one_qubit_kernel.format( + "SDG", "SDG" +) + +apply_SDG = cp.RawKernel(apply_SDG, "apply_SDG", options=("--std=c++11",)) def SDG(symplectic_matrix, q, nqubits): - apply_SDG[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_SDG, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_SXDG(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S-S-H""" - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - symplectic_matrix[i, qz] & symplectic_matrix[i, q] - ) - symplectic_matrix[i, q] = symplectic_matrix[i, qz] ^ symplectic_matrix[i, q] +apply_SXDG = """ +__device__ void _apply_SXDG(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ ( + symplectic_matrix[i * dim + qz] & symplectic_matrix[i * dim + q] + ); + symplectic_matrix[i * dim + q] = symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]; + }; +} +""" + apply_one_qubit_kernel.format( + "SXDG", "SXDG" +) + +apply_SXDG = cp.RawKernel(apply_SXDG, "apply_SXDG", options=("--std=c++11",)) def SXDG(symplectic_matrix, q, nqubits): - apply_SXDG[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_SXDG, symplectic_matrix, q, nqubits) return symplectic_matrix @@ -235,186 +325,237 @@ def apply_RY_pi(symplectic_matrix, q, nqubits): symplectic_matrix[i, q] = zq +apply_RY_pi = """ +__device__ void _apply_RY_pi(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ ( + symplectic_matrix[i * dim + q] + & (symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]) + ); + const bool zq = symplectic_matrix[i * dim + qz]; + symplectic_matrix[i * dim + qz] = symplectic_matrix[i * dim + q]; + symplectic_matrix[i * dim + q] = zq; + }; +} +""" + apply_one_qubit_kernel.format( + "RY_pi", "RY_pi" +) + +apply_RY_pi = cp.RawKernel(apply_RY_pi, "apply_RY_pi", options=("--std=c++11",)) + + def RY_pi(symplectic_matrix, q, nqubits): - apply_RY_pi[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_RY_pi, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_RY_3pi_2(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S""" - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - symplectic_matrix[i, qz] - & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) - ) - zq = symplectic_matrix[i, qz] - symplectic_matrix[i, qz] = symplectic_matrix[i, q] - symplectic_matrix[i, q] = zq +apply_RY_3pi_2 = """ +__device__ void _apply_RY_3pi_2(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = symplectic_matrix[i * dim + last] ^ ( + symplectic_matrix[i * dim + qz] + & (symplectic_matrix[i * dim + qz] ^ symplectic_matrix[i * dim + q]) + ); + const bool zq = symplectic_matrix[i * dim + qz]; + symplectic_matrix[i * dim + qz] = symplectic_matrix[i * dim + q]; + symplectic_matrix[i * dim + q] = zq; + }; +} +""" + apply_one_qubit_kernel.format( + "RY_3pi_2", "RY_3pi_2" +) + +apply_RY_3pi_2 = cp.RawKernel( + apply_RY_3pi_2, "apply_RY_3pi_2", options=("--std=c++11",) +) def RY_3pi_2(symplectic_matrix, q, nqubits): - apply_RY_3pi_2[GRIDDIM, BLOCKDIM](symplectic_matrix, q, nqubits) + one_qubit_kernel_launcher(apply_RY_3pi_2, symplectic_matrix, q, nqubits) return symplectic_matrix -@jit.rawkernel() -def apply_SWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> CNOT-CNOT-CNOT""" - cqz = nqubits + control_q - tqz = nqubits + target_q - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = ( - symplectic_matrix[i, -1] +apply_SWAP = """ +__device__ void _apply_SWAP(bool* symplectic_matrix, const int& control_q, const int& target_q, const int& nqubits, const int& cqz, const int& tqz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = ( + symplectic_matrix[i * dim + last] ^ ( - symplectic_matrix[i, control_q] - & symplectic_matrix[i, tqz] - & (symplectic_matrix[i, target_q] ^ ~symplectic_matrix[i, cqz]) + symplectic_matrix[i * dim + control_q] + & symplectic_matrix[i * dim + tqz] + & (symplectic_matrix[i * dim + target_q] ^ symplectic_matrix[i * dim + cqz] ^ 1) ) ^ ( - (symplectic_matrix[i, target_q] ^ symplectic_matrix[i, control_q]) - & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, cqz]) - & (symplectic_matrix[i, tqz] ^ ~symplectic_matrix[i, control_q]) + (symplectic_matrix[i * dim + target_q] ^ symplectic_matrix[i * dim + control_q]) + & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + cqz]) + & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + control_q] ^ 1) ) ^ ( - symplectic_matrix[i, target_q] - & symplectic_matrix[i, cqz] + symplectic_matrix[i * dim + target_q] + & symplectic_matrix[i * dim + cqz] & ( - symplectic_matrix[i, control_q] - ^ symplectic_matrix[i, target_q] - ^ symplectic_matrix[i, cqz] - ^ ~symplectic_matrix[i, tqz] + symplectic_matrix[i * dim + control_q] + ^ symplectic_matrix[i * dim + target_q] + ^ symplectic_matrix[i * dim + cqz] + ^ symplectic_matrix[i * dim + tqz] ^ 1 ) ) - ) - x_cq = symplectic_matrix[i, control_q] - x_tq = symplectic_matrix[i, target_q] - z_cq = symplectic_matrix[i, cqz] - z_tq = symplectic_matrix[i, tqz] - symplectic_matrix[i, control_q] = x_tq - symplectic_matrix[i, target_q] = x_cq - symplectic_matrix[i, cqz] = z_tq - symplectic_matrix[i, tqz] = z_cq + ); + const bool x_cq = symplectic_matrix[i * dim + control_q]; + const bool x_tq = symplectic_matrix[i * dim + target_q]; + const bool z_cq = symplectic_matrix[i * dim + cqz]; + const bool z_tq = symplectic_matrix[i * dim + tqz]; + symplectic_matrix[i * dim + control_q] = x_tq; + symplectic_matrix[i * dim + target_q] = x_cq; + symplectic_matrix[i * dim + cqz] = z_tq; + symplectic_matrix[i * dim + tqz] = z_cq; + }; +} +""" + apply_two_qubits_kernel.format( + "SWAP", "SWAP" +) + +apply_SWAP = cp.RawKernel(apply_SWAP, "apply_SWAP", options=("--std=c++11",)) def SWAP(symplectic_matrix, control_q, target_q, nqubits): - apply_SWAP[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) + two_qubits_kernel_launcher( + apply_SWAP, symplectic_matrix, control_q, target_q, nqubits + ) return symplectic_matrix -@jit.rawkernel() -def apply_iSWAP(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> H-CNOT-CNOT-H-S-S""" - cqz = nqubits + control_q - tqz = nqubits + target_q - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = ( - symplectic_matrix[i, -1] - ^ (symplectic_matrix[i, target_q] & symplectic_matrix[i, tqz]) - ^ (symplectic_matrix[i, control_q] & symplectic_matrix[i, cqz]) +apply_iSWAP = """ +__device__ void _apply_iSWAP(bool* symplectic_matrix, const int& control_q, const int& target_q, const int& nqubits, const int& cqz, const int& tqz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = ( + symplectic_matrix[i * dim + last] + ^ (symplectic_matrix[i * dim + target_q] & symplectic_matrix[i * dim + tqz]) + ^ (symplectic_matrix[i * dim + control_q] & symplectic_matrix[i * dim + cqz]) ^ ( - symplectic_matrix[i, control_q] - & (symplectic_matrix[i, cqz] ^ symplectic_matrix[i, control_q]) + symplectic_matrix[i * dim + control_q] + & (symplectic_matrix[i * dim + cqz] ^ symplectic_matrix[i * dim + control_q]) ) ^ ( - (symplectic_matrix[i, cqz] ^ symplectic_matrix[i, control_q]) - & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, target_q]) - & (symplectic_matrix[i, target_q] ^ ~symplectic_matrix[i, control_q]) + (symplectic_matrix[i * dim + cqz] ^ symplectic_matrix[i * dim + control_q]) + & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + target_q]) + & (symplectic_matrix[i * dim + target_q] ^ symplectic_matrix[i * dim + control_q] ^ 1) ) ^ ( ( - symplectic_matrix[i, target_q] - ^ symplectic_matrix[i, cqz] - ^ symplectic_matrix[i, control_q] + symplectic_matrix[i * dim + target_q] + ^ symplectic_matrix[i * dim + cqz] + ^ symplectic_matrix[i * dim + control_q] ) & ( - symplectic_matrix[i, target_q] - ^ symplectic_matrix[i, tqz] - ^ symplectic_matrix[i, control_q] + symplectic_matrix[i * dim + target_q] + ^ symplectic_matrix[i * dim + tqz] + ^ symplectic_matrix[i * dim + control_q] ) & ( - symplectic_matrix[i, target_q] - ^ symplectic_matrix[i, tqz] - ^ symplectic_matrix[i, control_q] - ^ ~symplectic_matrix[i, cqz] + symplectic_matrix[i * dim + target_q] + ^ symplectic_matrix[i * dim + tqz] + ^ symplectic_matrix[i * dim + control_q] + ^ symplectic_matrix[i * dim + cqz] ^ 1 ) ) ^ ( - symplectic_matrix[i, control_q] + symplectic_matrix[i * dim + control_q] & ( - symplectic_matrix[i, target_q] - ^ symplectic_matrix[i, control_q] - ^ symplectic_matrix[i, cqz] + symplectic_matrix[i * dim + target_q] + ^ symplectic_matrix[i * dim + control_q] + ^ symplectic_matrix[i * dim + cqz] ) ) - ) - z_control_q = ( - symplectic_matrix[i, target_q] - ^ symplectic_matrix[i, tqz] - ^ symplectic_matrix[i, control_q] - ) - z_target_q = ( - symplectic_matrix[i, target_q] - ^ symplectic_matrix[i, cqz] - ^ symplectic_matrix[i, control_q] - ) - symplectic_matrix[i, cqz] = z_control_q - symplectic_matrix[i, tqz] = z_target_q - tmp = symplectic_matrix[i, control_q] - symplectic_matrix[i, control_q] = symplectic_matrix[i, target_q] - symplectic_matrix[i, target_q] = tmp + ); + const bool z_control_q = ( + symplectic_matrix[i * dim + target_q] + ^ symplectic_matrix[i * dim + tqz] + ^ symplectic_matrix[i * dim + control_q] + ); + const bool z_target_q = ( + symplectic_matrix[i * dim + target_q] + ^ symplectic_matrix[i * dim + cqz] + ^ symplectic_matrix[i * dim + control_q] + ); + symplectic_matrix[i * dim + cqz] = z_control_q; + symplectic_matrix[i * dim + tqz] = z_target_q; + tmp = symplectic_matrix[i * dim + control_q]; + symplectic_matrix[i * dim + control_q] = symplectic_matrix[i * dim + target_q]; + symplectic_matrix[i * dim + target_q] = tmp; + }; +} +""" + apply_two_qubits_kernel.format( + "iSWAP", "iSWAP" +) + +apply_iSWAP = cp.RawKernel(apply_iSWAP, "apply_iSWAP", options=("--std=c++11",)) def iSWAP(symplectic_matrix, control_q, target_q, nqubits): - apply_iSWAP[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) + two_qubits_kernel_launcher( + apply_iSWAP, symplectic_matrix, control_q, target_q, nqubits + ) return symplectic_matrix -@jit.rawkernel() -def apply_CY(symplectic_matrix, control_q, target_q, nqubits): - """Decomposition --> S-CNOT-SDG""" - cqz = nqubits + control_q - tqz = nqubits + target_q - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = ( - symplectic_matrix[i, -1] +apply_CY = """ +__device__ void _apply_CY(bool* symplectic_matrix, const int& control_q, const int& target_q, const int& nqubits, const int& cqz, const int& tqz, const int& dim) { + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + const int ntid = gridDim.x * blockDim.x; + const int last = dim - 1; + for(int i = tid; i < last; i += ntid) { + symplectic_matrix[i * dim + last] = ( + symplectic_matrix[i * dim + last] ^ ( - symplectic_matrix[i, target_q] - & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, target_q]) + symplectic_matrix[i * dim + target_q] + & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + target_q]) ) ^ ( - symplectic_matrix[i, control_q] - & (symplectic_matrix[i, target_q] ^ symplectic_matrix[i, tqz]) - & (symplectic_matrix[i, cqz] ^ ~symplectic_matrix[i, target_q]) + symplectic_matrix[i * dim + control_q] + & (symplectic_matrix[i * dim + target_q] ^ symplectic_matrix[i * dim + tqz]) + & (symplectic_matrix[i * dim + cqz] ^ symplectic_matrix[i * dim + target_q] ^ 1) ) ^ ( - (symplectic_matrix[i, target_q] ^ symplectic_matrix[i, control_q]) - & (symplectic_matrix[i, tqz] ^ symplectic_matrix[i, target_q]) + (symplectic_matrix[i * dim + target_q] ^ symplectic_matrix[i * dim + control_q]) + & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + target_q]) ) - ) - x_target_q = symplectic_matrix[i, control_q] ^ symplectic_matrix[i, target_q] - z_control_q = ( - symplectic_matrix[i, cqz] - ^ symplectic_matrix[i, tqz] - ^ symplectic_matrix[i, target_q] - ) - z_target_q = symplectic_matrix[i, tqz] ^ symplectic_matrix[i, control_q] - symplectic_matrix[i, target_q] = x_target_q - symplectic_matrix[i, cqz] = z_control_q - symplectic_matrix[i, tqz] = z_target_q + ); + const bool x_target_q = symplectic_matrix[i * dim + control_q] ^ symplectic_matrix[i * dim + target_q]; + const bool z_control_q = ( + symplectic_matrix[i * dim + cqz] + ^ symplectic_matrix[i * dim + tqz] + ^ symplectic_matrix[i * dim + target_q] + ); + const bool z_target_q = symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + control_q]; + symplectic_matrix[i * dim + target_q] = x_target_q; + symplectic_matrix[i * dim + cqz] = z_control_q; + symplectic_matrix[i * dim + tqz] = z_target_q; + }; +} +""" + apply_two_qubits_kernel.format( + "CY", "CY" +) + +apply_CY = cp.RawKernel(apply_CY, "apply_CY", options=("--std=c++11",)) def CY(symplectic_matrix, control_q, target_q, nqubits): - apply_CY[GRIDDIM, BLOCKDIM](symplectic_matrix, control_q, target_q, nqubits) + two_qubits_kernel_launcher( + apply_CY, symplectic_matrix, control_q, target_q, nqubits + ) return symplectic_matrix diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index 7687d59e..a7122966 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -157,6 +157,13 @@ def to_numpy(self, x): def issparse(self, x): return self.sparse.issparse(x) or self.npsparse.issparse(x) + def reshape_clifford_state(self, state, nqubits): + if len(state.shape) > 1: + return state.ravel() + else: + dim = 2 * nqubits + 1 + return state.reshape(dim, dim) + def zero_state(self, nqubits): n = 1 << nqubits kernel = self.gates.get(f"initial_state_kernel_{self.kernel_type}") From c89a625d93bff07d858aaf59efd2f5b02ca26034 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 12 Jan 2024 17:09:50 +0400 Subject: [PATCH 21/60] fix: bugfix to kernel launchers --- .../backends/clifford_operations_gpu.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 57d06c93..415add3b 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -7,7 +7,7 @@ apply_one_qubit_kernel = """ extern "C" -__global__ void apply_{}(bool* symplectic_matrix, const int q, const int nqubits, conts int qz, const int dim) {{ +__global__ void apply_{}(bool* symplectic_matrix, const int q, const int nqubits, const int qz, const int dim) {{ _apply_{}(symplectic_matrix, q, nqubits, qz, dim); }} """ @@ -20,17 +20,21 @@ """ -def one_qubit_kernel_launcher(kernel, args): +def one_qubit_kernel_launcher(kernel, symplectic_matrix, q, nqubits): qz = nqubits + q - dim = symplectic_matrix.shape[0] - return kernel((GRIDDIM,), (BLOCKDIM,), (*args, qz, dim)) + dim = 2 * nqubits + 1 + return kernel((GRIDDIM,), (BLOCKDIM,), (symplectic_matrix, q, nqubits, qz, dim)) -def two_qubits_kernel_launcher(kernel, args): +def two_qubits_kernel_launcher(kernel, symplectic_matrix, control_q, target_q, nqubits): cqz = nqubits + control_q tqz = nqubits + target_q - dim = symplectic_matrix.shape[0] - return kernel((GRIDDIM,), (BLOCKDIM,), (*args, cqz, tqz, dim)) + dim = 2 * nqubits + 1 + return kernel( + (GRIDDIM,), + (BLOCKDIM,), + (symplectic_matrix, control_q, target_q, nqubits, cqz, tqz, dim), + ) apply_H = """ From 45f9c9cff66c556058acc9847a6200616444a303 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 15 Jan 2024 12:30:32 +0400 Subject: [PATCH 22/60] feat: implemented rowsum in cuda --- .../backends/clifford_operations_gpu.py | 98 +++++++++++-------- 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 415add3b..0850b638 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -3,7 +3,8 @@ from cupyx import jit GRIDDIM, BLOCKDIM = 1024, 128 -BLOCKDIM_2D = (32, 32) +BLOCKDIM_2D = (16, 64) +GRIDDIM_2D = (8, 32) apply_one_qubit_kernel = """ extern "C" @@ -496,7 +497,7 @@ def SWAP(symplectic_matrix, control_q, target_q, nqubits): ); symplectic_matrix[i * dim + cqz] = z_control_q; symplectic_matrix[i * dim + tqz] = z_target_q; - tmp = symplectic_matrix[i * dim + control_q]; + const bool tmp = symplectic_matrix[i * dim + control_q]; symplectic_matrix[i * dim + control_q] = symplectic_matrix[i * dim + target_q]; symplectic_matrix[i * dim + target_q] = tmp; }; @@ -563,48 +564,67 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): return symplectic_matrix -@jit.rawkernel() -def _apply_rowsum(symplectic_matrix, h, i, nqubits): - tid_x = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - tid_y = jit.blockIdx.y * jit.blockDim.y + jit.threadIdx.y - ntid_x = jit.gridDim.x * jit.blockDim.x - ntid_y = jit.gridDim.y * jit.blockDim.y - for j in range(tid_y, len(h), ntid_y): - if jit.blockIdx.x == 0: - exp = 0 - for k in range(tid_x, nqubits, ntid_x): - jz = nqubits + j - x1_eq_z1 = symplectic_matrix[i[k], j] == symplectic_matrix[i[k], jz] - x1_eq_0 = symplectic_matrix[i[k], j] == False - if x1_eq_z1: +# This might be optimized using shared memory and warp reduction +apply_rowsum = """ +__device__ void _apply_rowsum(bool* symplectic_matrix, const int* h, const int *i, const int& nqubits, const int& nrows, int* exp, const int& dim): + tid_x = blockIdx.x * blockDim.x + threadIdx.x; + tid_y = blockIdx.y * blockDim.y + threadIdx.y; + ntid_x = gridDim.x * blockDim.x; + ntid_y = gridDim.y * blockDim.y; + const int last = dim - 1; + for(int j = tid_y; j < nrows; j += ntid_y) { + int jz = nqubits + j; + for(int k = tid_x; k < nqubits; k += ntid_x) { + x1_eq_z1 = symplectic_matrix[i[k] * dim + j] == symplectic_matrix[i[k] * dim + jz]; + x1_eq_0 = symplectic_matrix[i[k] * dim + j] == False + if (x1_eq_z1) { if not x1_eq_0: - exp += int(symplectic_matrix[h[k], jz]) - int( - symplectic_matrix[h[k], j] - ) - else: - if x1_eq_0: - exp += int(symplectic_matrix[h[k], j]) * ( - 1 - 2 * int(symplectic_matrix[h[k], jz]) - ) - else: - exp += int(symplectic_matrix[h[k], jz]) * ( - 2 * int(symplectic_matrix[h[k], j]) - 1 - ) - symplectic_matrix[h[j], -1] = ( - 2 * symplectic_matrix[h[j], -1] + 2 * symplectic_matrix[i[j], -1] + exp - ) % 4 != 0 - for k in range(tid_x, nqubits, ntid_y): - kz = nqubits + k - symplectic_matrix[h[j], k] = ( - symplectic_matrix[i[j], k] ^ symplectic_matrix[h[j], k] - ) + exp[j] += ((int) symplectic_matrix[h[k] * dim + jz]) - + (int) symplectic_matrix[h[k] * dim + j]; + } else { + if (x1_eq_0) { + exp[j] += ((int) symplectic_matrix[h[k] * dim + j]) * ( + 1 - 2 * (int) symplectic_matrix[h[k] * dim + jz] + ); + } else { + exp[j] += ((int) symplectic_matrix[h[k] * dim + jz]) * ( + 2 * (int) symplectic_matrix[h[k] * dim + j] - 1 + ); + } + } + } + __syncthreads(); + if (threadIdx.x == 0) { + symplectic_matrix[h[j] * dim + last] = ( + 2 * symplectic_matrix[h[j] * dim + last] + 2 * symplectic_matrix[i[j] * dim + last] + exp[j] + ) % 4 != 0; + } + for(int k = tid_x; k < nqubits; k += ntid_x) { + int kz = nqubits + k; + symplectic_matrix[h[j] * dim + k] = ( + symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] + ); symplectic_matrix[h[j], nqubits + k] = ( - symplectic_matrix[i[j], kz] ^ symplectic_matrix[h[j], kz] - ) + symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] + ); + } + } +extern "C" +__global__ void apply_rowsum(bool* symplectic_matrix, const int* h, const int* i, const int nqubits, const int nrows, int* exp, const int dim) { + _apply_rowsum(symplectic_matrix, h, i, nqubits, nrows, exp, dim); +} +""" + +apply_rowsum = cp.RawKernel(apply_rowsum, "apply_rowsum", options=("--std=c++11",)) def _rowsum(symplectic_matrix, h, i, nqubits): - _apply_rowsum[(GRIDDIM, GRIDDIM), BLOCKDIM_2D](symplectic_matrix, h, i, nqubits) + dim = 2 * nqubits + 1 + nrows = len(h) + exp = cp.zeros(len(h), dtype=cp.uint) + _apply_rowsum( + GRIDDIM2D, BLOCKDIM_2D, (symplectic_matrix, h, i, nqubits, nrows, dim) + ) return symplectic_matrix From 038ca86dbd1a9726442bbd04d4cd69b2cc78c67a Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 15 Jan 2024 12:54:23 +0400 Subject: [PATCH 23/60] feat: implemented rowsum in cuda --- .../backends/clifford_operations_gpu.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 0850b638..1af71885 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -566,21 +566,22 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): # This might be optimized using shared memory and warp reduction apply_rowsum = """ -__device__ void _apply_rowsum(bool* symplectic_matrix, const int* h, const int *i, const int& nqubits, const int& nrows, int* exp, const int& dim): - tid_x = blockIdx.x * blockDim.x + threadIdx.x; - tid_y = blockIdx.y * blockDim.y + threadIdx.y; - ntid_x = gridDim.x * blockDim.x; - ntid_y = gridDim.y * blockDim.y; +__device__ void _apply_rowsum(bool* symplectic_matrix, const int* h, const int *i, const int& nqubits, const int& nrows, int* exp, const int& dim) { + unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + unsigned int tid_y = blockIdx.y * blockDim.y + threadIdx.y; + unsigned int ntid_x = gridDim.x * blockDim.x; + unsigned int ntid_y = gridDim.y * blockDim.y; const int last = dim - 1; for(int j = tid_y; j < nrows; j += ntid_y) { int jz = nqubits + j; for(int k = tid_x; k < nqubits; k += ntid_x) { - x1_eq_z1 = symplectic_matrix[i[k] * dim + j] == symplectic_matrix[i[k] * dim + jz]; - x1_eq_0 = symplectic_matrix[i[k] * dim + j] == False + bool x1_eq_z1 = symplectic_matrix[i[k] * dim + j] == symplectic_matrix[i[k] * dim + jz]; + bool x1_eq_0 = symplectic_matrix[i[k] * dim + j] == false; if (x1_eq_z1) { - if not x1_eq_0: + if (not x1_eq_0) { exp[j] += ((int) symplectic_matrix[h[k] * dim + jz]) - (int) symplectic_matrix[h[k] * dim + j]; + } } else { if (x1_eq_0) { exp[j] += ((int) symplectic_matrix[h[k] * dim + j]) * ( @@ -604,11 +605,12 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): symplectic_matrix[h[j] * dim + k] = ( symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] ); - symplectic_matrix[h[j], nqubits + k] = ( + symplectic_matrix[h[j] * dim + kz] = ( symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] ); } } +} extern "C" __global__ void apply_rowsum(bool* symplectic_matrix, const int* h, const int* i, const int nqubits, const int nrows, int* exp, const int dim) { _apply_rowsum(symplectic_matrix, h, i, nqubits, nrows, exp, dim); From 821d056c174f141ebf76bd50887448ee0d02567f Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 15 Jan 2024 15:10:52 +0400 Subject: [PATCH 24/60] fix: fixed CZ --- src/qibojit/backends/clifford_operations_gpu.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 1af71885..d430ce8f 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -1,6 +1,5 @@ import cupy as cp import numpy as np -from cupyx import jit GRIDDIM, BLOCKDIM = 1024, 128 BLOCKDIM_2D = (16, 64) @@ -105,7 +104,7 @@ def CNOT(symplectic_matrix, control_q, target_q, nqubits): ^ ( symplectic_matrix[i * dim + control_q] & symplectic_matrix[i * dim + target_q] - & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + cqz]) ^ 1 + & (symplectic_matrix[i * dim + tqz] ^ symplectic_matrix[i * dim + cqz] ^ 1) ) ^ ( symplectic_matrix[i * dim + target_q] @@ -624,8 +623,8 @@ def _rowsum(symplectic_matrix, h, i, nqubits): dim = 2 * nqubits + 1 nrows = len(h) exp = cp.zeros(len(h), dtype=cp.uint) - _apply_rowsum( - GRIDDIM2D, BLOCKDIM_2D, (symplectic_matrix, h, i, nqubits, nrows, dim) + apply_rowsum( + GRIDDIM_2D, BLOCKDIM_2D, (symplectic_matrix, h, i, nqubits, nrows, dim) ) return symplectic_matrix From b0a2a6a9db31f53810d6f1ae6a61518fb629bd88 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 15 Jan 2024 16:27:52 +0400 Subject: [PATCH 25/60] fix: passing exp to rowsum --- .../backends/clifford_operations_gpu.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index d430ce8f..7877b54d 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -2,8 +2,8 @@ import numpy as np GRIDDIM, BLOCKDIM = 1024, 128 -BLOCKDIM_2D = (16, 64) -GRIDDIM_2D = (8, 32) +BLOCKDIM_2D = (64, 16) +GRIDDIM_2D = (32, 8) apply_one_qubit_kernel = """ extern "C" @@ -572,23 +572,23 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): unsigned int ntid_y = gridDim.y * blockDim.y; const int last = dim - 1; for(int j = tid_y; j < nrows; j += ntid_y) { - int jz = nqubits + j; for(int k = tid_x; k < nqubits; k += ntid_x) { - bool x1_eq_z1 = symplectic_matrix[i[k] * dim + j] == symplectic_matrix[i[k] * dim + jz]; - bool x1_eq_0 = symplectic_matrix[i[k] * dim + j] == false; + unsigned int kz = nqubits + k; + bool x1_eq_z1 = symplectic_matrix[i[j] * dim + k] == symplectic_matrix[i[j] * dim + kz]; + bool x1_eq_0 = symplectic_matrix[i[j] * dim + k] == false; if (x1_eq_z1) { if (not x1_eq_0) { - exp[j] += ((int) symplectic_matrix[h[k] * dim + jz]) - - (int) symplectic_matrix[h[k] * dim + j]; + exp[j] += ((int) symplectic_matrix[h[j] * dim + kz]) - + (int) symplectic_matrix[h[j] * dim + k]; } } else { if (x1_eq_0) { - exp[j] += ((int) symplectic_matrix[h[k] * dim + j]) * ( - 1 - 2 * (int) symplectic_matrix[h[k] * dim + jz] + exp[j] += ((int) symplectic_matrix[h[j] * dim + k]) * ( + 1 - 2 * (int) symplectic_matrix[h[j] * dim + kz] ); } else { - exp[j] += ((int) symplectic_matrix[h[k] * dim + jz]) * ( - 2 * (int) symplectic_matrix[h[k] * dim + j] - 1 + exp[j] += ((int) symplectic_matrix[h[j] * dim + kz]) * ( + 2 * (int) symplectic_matrix[h[j] * dim + k] - 1 ); } } @@ -600,7 +600,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): ) % 4 != 0; } for(int k = tid_x; k < nqubits; k += ntid_x) { - int kz = nqubits + k; + unsigned int kz = nqubits + k; symplectic_matrix[h[j] * dim + k] = ( symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] ); @@ -624,7 +624,7 @@ def _rowsum(symplectic_matrix, h, i, nqubits): nrows = len(h) exp = cp.zeros(len(h), dtype=cp.uint) apply_rowsum( - GRIDDIM_2D, BLOCKDIM_2D, (symplectic_matrix, h, i, nqubits, nrows, dim) + GRIDDIM_2D, BLOCKDIM_2D, (symplectic_matrix, h, i, nqubits, nrows, exp, dim) ) return symplectic_matrix From 5d0ee57c47082766f67461c6bc13a7abaf505af7 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 17 Jan 2024 11:41:01 +0400 Subject: [PATCH 26/60] fix: fixed cupy rowsum --- src/qibojit/backends/clifford_operations_gpu.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 7877b54d..1efb1c22 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -594,7 +594,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): } } __syncthreads(); - if (threadIdx.x == 0) { + if (threadIdx.x == 0 && blockIdx.x == 0) { symplectic_matrix[h[j] * dim + last] = ( 2 * symplectic_matrix[h[j] * dim + last] + 2 * symplectic_matrix[i[j] * dim + last] + exp[j] ) % 4 != 0; @@ -622,7 +622,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): def _rowsum(symplectic_matrix, h, i, nqubits): dim = 2 * nqubits + 1 nrows = len(h) - exp = cp.zeros(len(h), dtype=cp.uint) + exp = cp.zeros(len(h), dtype=int) apply_rowsum( GRIDDIM_2D, BLOCKDIM_2D, (symplectic_matrix, h, i, nqubits, nrows, exp, dim) ) @@ -638,13 +638,13 @@ def _random_outcome(state, p, q, nqubits): state = _rowsum( state, h, - p * cp.ones(h.shape[0], dtype=np.uint), + p.astype(cp.uint) * cp.ones(h.shape[0], dtype=np.uint), nqubits, ) state[p - nqubits, :] = state[p, :] - outcome = cp.random.randint(2, size=1) + outcome = cp.random.randint(2, size=None, dtype=cp.uint) state[p, :] = 0 - state[p, -1] = outcome + state[p, -1] = outcome.astype(bool) state[p, nqubits + q] = 1 return state, outcome From 4d0c96c3aa549a2a4e6aaae011170e560bc2f490 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 17 Jan 2024 17:46:32 +0400 Subject: [PATCH 27/60] fix: fixing random outcome --- .../backends/clifford_operations_gpu.py | 81 ++++++++++++------- 1 file changed, 53 insertions(+), 28 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 1efb1c22..5c8041e4 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -1,3 +1,5 @@ +from functools import cache + import cupy as cp import numpy as np @@ -564,7 +566,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): # This might be optimized using shared memory and warp reduction -apply_rowsum = """ +_apply_rowsum = """ __device__ void _apply_rowsum(bool* symplectic_matrix, const int* h, const int *i, const int& nqubits, const int& nrows, int* exp, const int& dim) { unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; unsigned int tid_y = blockIdx.y * blockDim.y + threadIdx.y; @@ -610,17 +612,26 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): } } } +""" + +apply_rowsum = f""" +{_apply_rowsum} extern "C" -__global__ void apply_rowsum(bool* symplectic_matrix, const int* h, const int* i, const int nqubits, const int nrows, int* exp, const int dim) { +__global__ void apply_rowsum(bool* symplectic_matrix, const int* h, const int* i, const int nqubits, const int nrows, int* exp, const int dim) {{ _apply_rowsum(symplectic_matrix, h, i, nqubits, nrows, exp, dim); -} +}} """ apply_rowsum = cp.RawKernel(apply_rowsum, "apply_rowsum", options=("--std=c++11",)) +@cache +def _get_dim(nqubits): + return 2 * nqubits + 1 + + def _rowsum(symplectic_matrix, h, i, nqubits): - dim = 2 * nqubits + 1 + dim = _get_dim(nqubits) nrows = len(h) exp = cp.zeros(len(h), dtype=int) apply_rowsum( @@ -629,11 +640,18 @@ def _rowsum(symplectic_matrix, h, i, nqubits): return symplectic_matrix +def _get_p(state, nqubtis, q): + dim = _get_dim(nqubits) + return state.reshape(dim, dim)[nqubits:-1, q].nonzero()[0] + + def _random_outcome(state, p, q, nqubits): + dim = _get_dim(nqubits) p = p[0] + nqubits - h = state[:-1, q].copy() - h[p] = False - h = h.nonzero()[0] + tmp = state[p * dim + q].copy() + state[p * dim + q] = False + h = state.reshape(dim, dim)[:-1, q].nonzero()[0] + state[p * dim + q] = tmp if h.shape[0] > 0: state = _rowsum( state, @@ -641,30 +659,37 @@ def _random_outcome(state, p, q, nqubits): p.astype(cp.uint) * cp.ones(h.shape[0], dtype=np.uint), nqubits, ) + state = state.reshape(dim, dim) state[p - nqubits, :] = state[p, :] outcome = cp.random.randint(2, size=None, dtype=cp.uint) - state[p, :] = 0 + state[p, :] = False state[p, -1] = outcome.astype(bool) - state[p, nqubits + q] = 1 - return state, outcome - - -""" -@jit.rawkernel() -def _determined_outcome(state, q, nqubits): - state[-1, :] = False - indices = state[:nqubits, q].nonzero()[0] - tid = jit.blockIdx.indices * jit.blockDim.indices + jit.threadIdx.indices - ntid = jit.gridDim.indices * jit.blockDim.indices - for i in range(tid, len(indices), ntid): - state = _rowsum( - state, - np.array([2 * nqubits], dtype=uint64), - np.array([indices[i] + nqubits], dtype=uint64), - nqubits, - include_scratch=True, - ) - return state, uint64(state[-1, -1]) + state[p, nqubits + q] = True + return state.ravel(), outcome + + +__random_outcome = f""" +#include +{_apply_rowsum} +__device__ void random_outcome(bool* state, int& p, int& q, int& nqubits, int& dim, int& outcome) {{ + unsigned int tid_y = blockIdx.y; + unsigned int ntid_y = gridDim.y; + for(int j = tid_y; j < dim - 1; j += ntid_y) {{ + if (state[j * dim + q] && j != p) {{ + _apply_rowsum(state, j, p, nqubits, dim) + }} + }} + unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + for(int j = tid_x * (1 + tid_y); j < dim; j += ntid_y) {{ + state[(p - nqubits) * dim + j] = state[p * dim + j]; + state[p * dim + j] = false; + }} + if (threadIdx.x == 0 && blockIdx.x == 0 && blockIdx.y == 0) {{ + outcome = rand() % 2; + state[p * dim + dim] = (bool) outcome; + state[p * dim + nqubits + q] = true; + }} +}} """ From e58737b2c4d3b4f0101e7d0121115b4e8d4b55b0 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Thu, 18 Jan 2024 15:23:17 +0400 Subject: [PATCH 28/60] fix: minor fixes to measurements --- .../backends/clifford_operations_gpu.py | 32 ++++++------------- src/qibojit/backends/gpu.py | 12 +++---- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 5c8041e4..e491cdc4 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -315,22 +315,6 @@ def SXDG(symplectic_matrix, q, nqubits): return symplectic_matrix -@jit.rawkernel() -def apply_RY_pi(symplectic_matrix, q, nqubits): - """Decomposition --> H-S-S""" - tid = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x - ntid = jit.gridDim.x * jit.blockDim.x - qz = nqubits + q - for i in range(tid, symplectic_matrix.shape[0] - 1, ntid): - symplectic_matrix[i, -1] = symplectic_matrix[i, -1] ^ ( - symplectic_matrix[i, q] - & (symplectic_matrix[i, qz] ^ symplectic_matrix[i, q]) - ) - zq = symplectic_matrix[i, qz] - symplectic_matrix[i, qz] = symplectic_matrix[i, q] - symplectic_matrix[i, q] = zq - - apply_RY_pi = """ __device__ void _apply_RY_pi(bool* symplectic_matrix, const int& q, const int& nqubits, const int& qz, const int& dim) { const int tid = blockIdx.x * blockDim.x + threadIdx.x; @@ -640,7 +624,7 @@ def _rowsum(symplectic_matrix, h, i, nqubits): return symplectic_matrix -def _get_p(state, nqubtis, q): +def _get_p(state, q, nqubits): dim = _get_dim(nqubits) return state.reshape(dim, dim)[nqubits:-1, q].nonzero()[0] @@ -648,10 +632,11 @@ def _get_p(state, nqubtis, q): def _random_outcome(state, p, q, nqubits): dim = _get_dim(nqubits) p = p[0] + nqubits - tmp = state[p * dim + q].copy() - state[p * dim + q] = False + idx_pq = p * dim + q + tmp = state[idx_pq].copy() + state[idx_pq] = False h = state.reshape(dim, dim)[:-1, q].nonzero()[0] - state[p * dim + q] = tmp + state[idx_pq] = tmp if h.shape[0] > 0: state = _rowsum( state, @@ -694,12 +679,13 @@ def _random_outcome(state, p, q, nqubits): def _determined_outcome(state, q, nqubits): - state[-1, :] = False - for i in state[:nqubits, q].nonzero()[0]: + dim = _get_dim(nqubits) + state.reshape(dim, dim)[-1, :] = False + for i in state.reshape(dim, dim)[:nqubits, q].nonzero()[0]: state = _rowsum( state, cp.array([2 * nqubits], dtype=np.uint), cp.array([i + nqubits], dtype=np.uint), nqubits, ) - return state, cp.uint(state[-1, -1]) + return state, state[-1, -1].astype(cp.uint) diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index a7122966..802b0931 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -157,12 +157,12 @@ def to_numpy(self, x): def issparse(self, x): return self.sparse.issparse(x) or self.npsparse.issparse(x) - def reshape_clifford_state(self, state, nqubits): - if len(state.shape) > 1: - return state.ravel() - else: - dim = 2 * nqubits + 1 - return state.reshape(dim, dim) + def clifford_pre_execution_reshape(self, state): + return state.ravel() + + def clifford_post_execution_reshape(self, state, nqubits): + dim = 2 * nqubits + 1 + return state.reshape(dim, dim) def zero_state(self, nqubits): n = 1 << nqubits From d7f3a36f74e205e8b3a1c9118fb6881224618cc1 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi <45011234+BrunoLiegiBastonLiegi@users.noreply.github.com> Date: Thu, 18 Jan 2024 15:29:35 +0400 Subject: [PATCH 29/60] Update pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7c0fb5c4..8e9719b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ classifiers=[ [tool.poetry.dependencies] python=">=3.9.0,<3.12" numba=">=0.51.0" -qibo=">=0.2.3" +qibo={ git = "git@github.com:qiboteam/qibo.git", branch = "clifford_simulator_numba" } scipy = "^1.10.1" psutil = "^5.9.5" From da329e77bf230b3cec517998dc51df704c8ed147 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Thu, 18 Jan 2024 15:32:20 +0400 Subject: [PATCH 30/60] feat: updated poetry lock --- poetry.lock | 465 ++-------------------------------------------------- 1 file changed, 17 insertions(+), 448 deletions(-) diff --git a/poetry.lock b/poetry.lock index e4e39047..0996b61e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "astroid" @@ -59,69 +59,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "contourpy" -version = "1.2.0" -description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false -python-versions = ">=3.9" -files = [ - {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, - {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, - {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, - {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, - {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, - {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, - {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, - {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, - {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, - {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, - {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, -] - -[package.dependencies] -numpy = ">=1.20,<2.0" - -[package.extras] -bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] -test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] - [[package]] name = "coverage" version = "7.3.2" @@ -189,21 +126,6 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] -[[package]] -name = "cycler" -version = "0.12.1" -description = "Composable style cycles" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, - {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, -] - -[package.extras] -docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] -tests = ["pytest", "pytest-cov", "pytest-xdist"] - [[package]] name = "dill" version = "0.3.7" @@ -232,71 +154,6 @@ files = [ [package.extras] test = ["pytest (>=6)"] -[[package]] -name = "fonttools" -version = "4.45.1" -description = "Tools to manipulate font files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa321c458ea29224067700954ec44493ae869b47e7c5485a350a149a19fb53"}, - {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0dc7617d96b1e668eea9250e1c1fe62d0c78c3f69573ce7e3332cc40e6d84356"}, - {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ed3bda541e86725f6b4e1b94213f13ed1ae51a5a1f167028534cedea38c010"}, - {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f4a5870e3b56788fb196da8cf30d0dfd51a76dc3b907861d018165f76ae4c2"}, - {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3c11d9687479f01eddef729aa737abcdea0a44fdaffb62a930a18892f186c9b"}, - {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:316cec50581e844c3ab69d7c82455b54c7cf18236b2f09e722faf665fbfcac58"}, - {file = "fonttools-4.45.1-cp310-cp310-win32.whl", hash = "sha256:e2277cba9f0b525e30de2a9ad3cb4219aa4bc697230c1645666b0deee9f914f0"}, - {file = "fonttools-4.45.1-cp310-cp310-win_amd64.whl", hash = "sha256:1b9e9ad2bcded9a1431afaa57c8d3c39143ac1f050862d66bddd863c515464a2"}, - {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff6a698bdd435d24c379f6e8a54908cd9bb7dda23719084d56bf8c87709bf3bd"}, - {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c980d60cd6ec1376206fe55013d166e5627ad0b149b5c81e74eaa913ab6134f"}, - {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a12dee6523c02ca78aeedd0a5e12bfa9b7b29896350edd5241542897b072ae23"}, - {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37cd1ced6efb3dd6fe82e9f9bf92fd74ac58a5aefc284045f59ecd517a5fb9ab"}, - {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3d24248221bd7151dfff0d88b1b5da02dccd7134bd576ce8888199827bbaa19"}, - {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba6c23591427844dfb0a13658f1718489de75de6a46b64234584c0d17573162d"}, - {file = "fonttools-4.45.1-cp311-cp311-win32.whl", hash = "sha256:cebcddbe9351b67166292b4f71ffdbfcce01ba4b07d4267824eb46b277aeb19a"}, - {file = "fonttools-4.45.1-cp311-cp311-win_amd64.whl", hash = "sha256:f22eb69996a0bd49f76bdefb30be54ce8dbb89a0d1246874d610f05c2aa2e69e"}, - {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:794de93e83297db7b4943f2431e206d8b1ea69cb3ae14638a49cc50332bf0db8"}, - {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ba17822a6681d06849078daaf6e03eccc9f467efe7c4c60280e28a78e8e5df9"}, - {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e50f794d09df0675da8d9dbd7c66bfcab2f74a708343aabcad41936d26556891"}, - {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b07b857d4f9de3199a8c3d1b1bf2078c0f37447891ca1a8d9234106b9a27aff"}, - {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:777ba42b94a27bb7fb2b4082522fccfd345667c32a56011e1c3e105979af5b79"}, - {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:21e96b99878348c74aa58059b8578d7586f9519cbcdadacf56486737038aa043"}, - {file = "fonttools-4.45.1-cp312-cp312-win32.whl", hash = "sha256:5cbf02cda8465b69769d07385f5d11e7bba19954e7787792f46fe679ec755ebb"}, - {file = "fonttools-4.45.1-cp312-cp312-win_amd64.whl", hash = "sha256:800e354e0c3afaeb8d9552769773d02f228e98c37b8cb03041157c3d0687cffc"}, - {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6eb2c54f7a07c92108daabcf02caf31df97825738db02a28270633946bcda4d0"}, - {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43a3d267334109ff849c37cf3629476b5feb392ef1d2e464a167b83de8cd599c"}, - {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e1aefc2bf3c43e0f33f995f828a7bbeff4adc9393a7760b11456dbcf14388f6"}, - {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f53a19dcdd5737440839b8394eeebb35da9ec8109f7926cb6456639b5b58e47"}, - {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a17706b9cc24b27721613fe5773d93331ab7f0ecaca9955aead89c6b843d3a7"}, - {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb36e5f40191274a95938b40c0a1fa7f895e36935aea8709e1d6deff0b2d0d4f"}, - {file = "fonttools-4.45.1-cp38-cp38-win32.whl", hash = "sha256:46eabddec12066829b8a1efe45ae552ba2f1796981ecf538d5f68284c354c589"}, - {file = "fonttools-4.45.1-cp38-cp38-win_amd64.whl", hash = "sha256:b6de2f0fcd3302fb82f94801002cb473959e998c14c24ec28234adb674aed345"}, - {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:392d0e3cc23daee910193625f7cf1b387aff9dd5b6f1a5f4a925680acb6dcbc2"}, - {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b9544b1346d99848ac0e9b05b5d45ee703d7562fc4c9c48cf4b781de9632e57"}, - {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8717db3e4895e4820ade64ea379187738827ee60748223cb0438ef044ee208c6"}, - {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29d5f298d616a93a4c5963682dc6cc8cc09f6d89cad2c29019fc5fb3b4d9472"}, - {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cb472905da3049960e80fc1cf808231880d79727a8410e156bf3e5063a1c574f"}, - {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ba299f1fbaa2a1e33210aaaf6fa816d4059e4d3cfe2ae9871368d4ab548c1c6a"}, - {file = "fonttools-4.45.1-cp39-cp39-win32.whl", hash = "sha256:105099968b58a5b4cef6f3eb409db8ea8578b302a9d05e23fecba1b8b0177b5f"}, - {file = "fonttools-4.45.1-cp39-cp39-win_amd64.whl", hash = "sha256:847f3f49dd3423e5a678c098e2ba92c7f4955d4aab3044f6a507b0bb0ecb07e0"}, - {file = "fonttools-4.45.1-py3-none-any.whl", hash = "sha256:3bdd7dfca8f6c9f4779384064027e8477ad6a037d6a327b09381f43e0247c6f3"}, - {file = "fonttools-4.45.1.tar.gz", hash = "sha256:6e441286d55fe7ec7c4fb36812bf914924813776ff514b744b510680fc2733f2"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] -graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] -pathops = ["skia-pathops (>=0.5.0)"] -plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] -symfont = ["sympy"] -type1 = ["xattr"] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] - [[package]] name = "future" version = "0.18.3" @@ -334,24 +191,6 @@ dev = ["black", "nose", "pre-commit", "pytest"] mongotrials = ["pymongo"] sparktrials = ["pyspark"] -[[package]] -name = "importlib-resources" -version = "6.1.1" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] - [[package]] name = "iniconfig" version = "2.0.0" @@ -391,119 +230,6 @@ files = [ {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] -[[package]] -name = "kiwisolver" -version = "1.4.5" -description = "A fast implementation of the Cassowary constraint solver" -optional = false -python-versions = ">=3.7" -files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, -] - [[package]] name = "lazy-object-proxy" version = "1.9.0" @@ -582,55 +308,6 @@ files = [ {file = "llvmlite-0.41.1.tar.gz", hash = "sha256:f19f767a018e6ec89608e1f6b13348fa2fcde657151137cb64e56d48598a92db"}, ] -[[package]] -name = "matplotlib" -version = "3.8.2" -description = "Python plotting package" -optional = false -python-versions = ">=3.9" -files = [ - {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, - {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, - {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, - {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, - {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, - {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, - {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, - {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, - {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, - {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, - {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, -] - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.3.1" -numpy = ">=1.21,<2" -packaging = ">=20.0" -pillow = ">=8" -pyparsing = ">=2.3.1" -python-dateutil = ">=2.7" - [[package]] name = "mccabe" version = "0.7.0" @@ -767,73 +444,6 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] -[[package]] -name = "pillow" -version = "10.1.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, - {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, - {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, - {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, - {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, - {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, - {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, - {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - [[package]] name = "platformdirs" version = "4.0.0" @@ -932,20 +542,6 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] -[[package]] -name = "pyparsing" -version = "3.1.1" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - [[package]] name = "pytest" version = "7.4.3" @@ -1003,40 +599,28 @@ pytest = ">=7.3.1" [package.extras] test = ["coverage (>=7.2.7)", "pytest-mock (>=3.10)"] -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - [[package]] name = "qibo" -version = "0.2.3" +version = "0.2.5" description = "A framework for quantum computing with hardware acceleration." optional = false python-versions = ">=3.9,<3.12" -files = [ - {file = "qibo-0.2.3-py3-none-any.whl", hash = "sha256:53e649c57bf17c75ccafff804633d99aab595a4cbf42b3c42d625764c3dbb5b6"}, - {file = "qibo-0.2.3.tar.gz", hash = "sha256:ad375d47499781c9a0c942fcbd3747c84346e4c671e40fca34797929a2f509b3"}, -] +files = [] +develop = false [package.dependencies] -cma = ">=3.3.0,<4.0.0" -hyperopt = ">=0.2.7,<0.3.0" -joblib = ">=1.2.0,<2.0.0" -matplotlib = ">=3.7.0,<4.0.0" -psutil = ">=5.9.4,<6.0.0" -scipy = ">=1.10.1,<2.0.0" -sympy = ">=1.11.1,<2.0.0" -tabulate = ">=0.9.0,<0.10.0" +cma = "^3.3.0" +hyperopt = "^0.2.7" +joblib = "^1.2.0" +scipy = "^1.10.1" +sympy = "^1.11.1" +tabulate = "^0.9.0" + +[package.source] +type = "git" +url = "git@github.com:qiboteam/qibo.git" +reference = "clifford_simulator_numba" +resolved_reference = "df0550589f522e783175acad4a0fba05f99479f7" [[package]] name = "scipy" @@ -1251,22 +835,7 @@ files = [ {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] -[[package]] -name = "zipp" -version = "3.17.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] - [metadata] lock-version = "2.0" python-versions = ">=3.9.0,<3.12" -content-hash = "c0f5c5341a5f291d321362dfc1e1a37f1f2306bfd1593548afd5c41f4410abe2" +content-hash = "1d8249dbfff5fd42b9a664818f6fa4de7b1d3c8e0535783aa93cd71737417c0c" From 1e1c62397794ffd59641f36eb1972256925189f2 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 19 Jan 2024 09:18:24 +0400 Subject: [PATCH 31/60] fix: changed int to long in rowsum --- src/qibojit/backends/clifford_operations_gpu.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index e491cdc4..42f164da 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -551,7 +551,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): # This might be optimized using shared memory and warp reduction _apply_rowsum = """ -__device__ void _apply_rowsum(bool* symplectic_matrix, const int* h, const int *i, const int& nqubits, const int& nrows, int* exp, const int& dim) { +__device__ void _apply_rowsum(bool* symplectic_matrix, const long* h, const long* i, const int& nqubits, const int& nrows, long* exp, const int& dim) { unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; unsigned int tid_y = blockIdx.y * blockDim.y + threadIdx.y; unsigned int ntid_x = gridDim.x * blockDim.x; @@ -601,7 +601,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): apply_rowsum = f""" {_apply_rowsum} extern "C" -__global__ void apply_rowsum(bool* symplectic_matrix, const int* h, const int* i, const int nqubits, const int nrows, int* exp, const int dim) {{ +__global__ void apply_rowsum(bool* symplectic_matrix, const long* h, const long* i, const int nqubits, const int nrows, long* exp, const int dim) {{ _apply_rowsum(symplectic_matrix, h, i, nqubits, nrows, exp, dim); }} """ @@ -688,4 +688,4 @@ def _determined_outcome(state, q, nqubits): cp.array([i + nqubits], dtype=np.uint), nqubits, ) - return state, state[-1, -1].astype(cp.uint) + return state, state[dim * dim - 1].astype(cp.uint) From a3ecc360985c05732351126e0aaf93b00b5ae9b3 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 19 Jan 2024 09:26:16 +0400 Subject: [PATCH 32/60] fix: regenerated lock file --- poetry.lock | 322 ++++++++++++++++++++++++++-------------------------- 1 file changed, 160 insertions(+), 162 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0996b61e..83ffe137 100644 --- a/poetry.lock +++ b/poetry.lock @@ -61,63 +61,63 @@ files = [ [[package]] name = "coverage" -version = "7.3.2" +version = "7.4.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, + {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, + {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, + {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, + {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, + {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, + {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, + {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, + {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, + {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, + {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, + {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, + {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, + {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, ] [package.dependencies] @@ -204,20 +204,17 @@ files = [ [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "joblib" @@ -232,47 +229,48 @@ files = [ [[package]] name = "lazy-object-proxy" -version = "1.9.0" +version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, + {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, + {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] [[package]] @@ -390,47 +388,47 @@ numpy = ">=1.22,<1.27" [[package]] name = "numpy" -version = "1.26.2" +version = "1.26.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, - {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, - {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, - {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, - {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, - {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, - {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, - {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, - {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, - {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, - {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, ] [[package]] @@ -446,13 +444,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.0.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] @@ -476,27 +474,27 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "psutil" -version = "5.9.6" +version = "5.9.7" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, + {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, + {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, + {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, + {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, + {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, + {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, + {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, + {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, + {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, + {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, ] [package.extras] @@ -544,13 +542,13 @@ testutils = ["gitpython (>3)"] [[package]] name = "pytest" -version = "7.4.3" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, - {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -747,13 +745,13 @@ telegram = ["requests"] [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] From 09460f4be0e096212c69650c7722f9a6d9248cc1 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 19 Jan 2024 09:36:58 +0400 Subject: [PATCH 33/60] build: updated lock --- poetry.lock | 4 ++-- pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 83ffe137..0d925845 100644 --- a/poetry.lock +++ b/poetry.lock @@ -616,7 +616,7 @@ tabulate = "^0.9.0" [package.source] type = "git" -url = "git@github.com:qiboteam/qibo.git" +url = "https://github.com/qiboteam/qibo.git" reference = "clifford_simulator_numba" resolved_reference = "df0550589f522e783175acad4a0fba05f99479f7" @@ -836,4 +836,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.9.0,<3.12" -content-hash = "1d8249dbfff5fd42b9a664818f6fa4de7b1d3c8e0535783aa93cd71737417c0c" +content-hash = "372112a05578a3d828cf79825e364d099074f147d11dacf9e1c278c052120c5c" diff --git a/pyproject.toml b/pyproject.toml index 8e9719b8..dc8edaa1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ classifiers=[ [tool.poetry.dependencies] python=">=3.9.0,<3.12" numba=">=0.51.0" -qibo={ git = "git@github.com:qiboteam/qibo.git", branch = "clifford_simulator_numba" } +qibo={ git = "https://github.com/qiboteam/qibo.git", branch = "clifford_simulator_numba" } scipy = "^1.10.1" psutil = "^5.9.5" From 4fe78b114dcdcd83e22146be7adf188ae6594b46 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 19 Jan 2024 13:23:57 +0400 Subject: [PATCH 34/60] fix: moved import of gpu_operations --- src/qibojit/backends/gpu.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index 802b0931..5d274a2e 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -5,7 +5,6 @@ from qibo.backends.numpy import NumpyBackend from qibo.config import log, raise_error -from qibojit.backends import clifford_operations_gpu from qibojit.backends.cpu import NumbaBackend from qibojit.backends.matrices import CupyMatrices, CuQuantumMatrices, CustomMatrices @@ -102,6 +101,8 @@ def kernel_loader(name, ktype): # number of available GPUs (for multigpu) self.ngpus = cp.cuda.runtime.getDeviceCount() + from qibojit.backends import clifford_operations_gpu + spec = find_spec("qibo.backends.clifford_operations") self.clifford_operations = module_from_spec(spec) spec.loader.exec_module(self.clifford_operations) From 8b5fe364eeec402a6ec9cf020604960790ee8e13 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 22 Jan 2024 17:12:47 +0400 Subject: [PATCH 35/60] fix: removed some pylint checks --- .../backends/clifford_operations_cpu.py | 32 +++---- .../backends/clifford_operations_gpu.py | 83 ++++++++++++++++++- 2 files changed, 97 insertions(+), 18 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 24b0225d..195f00eb 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -7,7 +7,7 @@ def H(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) tmp = symplectic_matrix[i, q] symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] @@ -20,7 +20,7 @@ def CNOT(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( x[i, target_q] ^ ~z[i, control_q] ) @@ -35,7 +35,7 @@ def CZ(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & z[i, target_q]) @@ -54,7 +54,7 @@ def S(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -66,7 +66,7 @@ def Z(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ ( (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) ) @@ -79,7 +79,7 @@ def X(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = ( r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) ) @@ -92,7 +92,7 @@ def Y(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = ( r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) ) @@ -105,7 +105,7 @@ def SX(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) symplectic_matrix[i, q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -117,7 +117,7 @@ def SDG(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -129,7 +129,7 @@ def SXDG(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) symplectic_matrix[i, q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -141,7 +141,7 @@ def RY_pi(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) zq = symplectic_matrix[i, nqubits + q] symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] @@ -155,7 +155,7 @@ def RY_3pi_2(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) zq = symplectic_matrix[i, nqubits + q] symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] @@ -169,7 +169,7 @@ def SWAP(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[:-1, -1] = ( r[i] ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) @@ -201,7 +201,7 @@ def iSWAP(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & z[i, target_q]) @@ -235,7 +235,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) @@ -259,7 +259,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): def _rowsum(symplectic_matrix, h, i, nqubits): xi, xh = symplectic_matrix[i, :nqubits], symplectic_matrix[h, :nqubits] zi, zh = symplectic_matrix[i, nqubits:-1], symplectic_matrix[h, nqubits:-1] - for j in prange(len(h)): + for j in prange(len(h)): # pylint: disable=E0401 exp = np.zeros(nqubits, dtype=uint64) x1_eq_z1 = (xi[j] ^ zi[j]) == False x1_neq_z1 = ~x1_eq_z1 diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 42f164da..1d0bf4ce 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -1,6 +1,6 @@ from functools import cache -import cupy as cp +import cupy as cp # pylint: disable=E0401 import numpy as np GRIDDIM, BLOCKDIM = 1024, 128 @@ -653,12 +653,91 @@ def _random_outcome(state, p, q, nqubits): return state.ravel(), outcome +__apply_rowsum = """ +__device__ void _apply_rowsum(bool* symplectic_matrix, const int& h, const int& i, const int& nqubits, const int& dim, unsigned int* global_exp) { + unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + unsigned int ntid_x = gridDim.x * blockDim.x; + const int last = dim - 1; + __shared__ unsigned int exp = 0; + for(int k = tid_x; k < nqubits; k += ntid_x) { + unsigned int kz = nqubits + k; + bool x1_eq_z1 = symplectic_matrix[i * dim + k] == symplectic_matrix[i * dim + kz]; + bool x1_eq_0 = symplectic_matrix[i * dim + k] == false; + if (x1_eq_z1) { + if (not x1_eq_0) { + exp += ((int) symplectic_matrix[h * dim + kz]) - + (int) symplectic_matrix[h * dim + k]; + } + } else { + if (x1_eq_0) { + exp += ((int) symplectic_matrix[h * dim + k]) * ( + 1 - 2 * (int) symplectic_matrix[h * dim + kz] + ); + } else { + exp += ((int) symplectic_matrix[h * dim + kz]) * ( + 2 * (int) symplectic_matrix[h * dim + k] - 1 + ); + } + } + } + __syncthreads(); + unsigned int iteration = (int) (dim - 1) / gridDim.y + 1; + for (int k = blockIdx.x; k < (int) (nqubits / (gridDim.x * blockDim.x)); k += gridDim.x) { + if (threadIdx.x == 0) { + global_exp[iteration * blockIdx.y * gridDim.x + k] = exp; + } + } + for (int k = 0; k < gridDim.x; k++) { + if (threadIdx.x == 0 && blobkIdx.x == 0) { + global_exp[blockIdx.y * iteration] += global_exp[iteration * blockIdx.y + k]; + } + } + + symplectic_matrix[h[j] * dim + last] = ( + 2 * symplectic_matrix[h * dim + last] + 2 * symplectic_matrix[i * dim + last] + exp[j] + ) % 4 != 0; + } + for(int k = tid_x; k < nqubits; k += ntid_x) { + unsigned int kz = nqubits + k; + symplectic_matrix[h[j] * dim + k] = ( + symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] + ); + symplectic_matrix[h[j] * dim + kz] = ( + symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] + ); + } + } +} +""" + +_get_h = """ +__device__ void _get_h(bool* state, int& p, int& q, int& dim, int* g_h, int* g_nrows) { + const unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + const unsigned int ntid = gridDim.x * blockDim.x; + __shared__ unsigned int nrows; + __shared__ unsigned int h[]; + unsigned int n_iterations = 1; + for(int j = tid_x; j < dim - 1; j += ntid_x) { + if (state[j * dim + q] && j != p) { + h[n_iterations * blockIdx.x + nrows + j] = j; + nrows += 1; + } + n_iterations += 1; + } + for(int j = tid_x; j < dim - 1; j += ntid_x) { + if (threadIdx.x == 0) { + g_nrows[j] + } + } +""" + __random_outcome = f""" #include -{_apply_rowsum} +{__apply_rowsum} __device__ void random_outcome(bool* state, int& p, int& q, int& nqubits, int& dim, int& outcome) {{ unsigned int tid_y = blockIdx.y; unsigned int ntid_y = gridDim.y; + __global__ unsigned int global_exp[1024]; for(int j = tid_y; j < dim - 1; j += ntid_y) {{ if (state[j * dim + q] && j != p) {{ _apply_rowsum(state, j, p, nqubits, dim) From 7d08f2f42dad88c4d7fcb32c8062b26f6eae6592 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 22 Jan 2024 17:21:41 +0400 Subject: [PATCH 36/60] fix: pylint disable --- .../backends/clifford_operations_cpu.py | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 195f00eb..d268af79 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -7,7 +7,7 @@ def H(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) tmp = symplectic_matrix[i, q] symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] @@ -20,7 +20,7 @@ def CNOT(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( x[i, target_q] ^ ~z[i, control_q] ) @@ -35,7 +35,7 @@ def CZ(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & z[i, target_q]) @@ -54,7 +54,7 @@ def S(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -66,7 +66,7 @@ def Z(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ ( (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) ) @@ -79,7 +79,7 @@ def X(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) ) @@ -92,7 +92,7 @@ def Y(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) ) @@ -105,7 +105,7 @@ def SX(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) symplectic_matrix[i, q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -117,7 +117,7 @@ def SDG(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -129,7 +129,7 @@ def SXDG(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) symplectic_matrix[i, q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -141,7 +141,7 @@ def RY_pi(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) zq = symplectic_matrix[i, nqubits + q] symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] @@ -155,7 +155,7 @@ def RY_3pi_2(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) zq = symplectic_matrix[i, nqubits + q] symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] @@ -169,7 +169,7 @@ def SWAP(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[:-1, -1] = ( r[i] ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) @@ -201,7 +201,7 @@ def iSWAP(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & z[i, target_q]) @@ -235,7 +235,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=E0401 + for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) @@ -259,7 +259,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): def _rowsum(symplectic_matrix, h, i, nqubits): xi, xh = symplectic_matrix[i, :nqubits], symplectic_matrix[h, :nqubits] zi, zh = symplectic_matrix[i, nqubits:-1], symplectic_matrix[h, nqubits:-1] - for j in prange(len(h)): # pylint: disable=E0401 + for j in prange(len(h)): # pylint: disable=not-an-iterable exp = np.zeros(nqubits, dtype=uint64) x1_eq_z1 = (xi[j] ^ zi[j]) == False x1_neq_z1 = ~x1_eq_z1 From 6834afd7bfddb535d01048f26a4e9b5c3f31c90c Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 29 Jan 2024 12:12:44 +0400 Subject: [PATCH 37/60] feat: adapted numba rowsum --- .../backends/clifford_operations_cpu.py | 47 ++++++++++--------- .../backends/clifford_operations_gpu.py | 33 +++++++++---- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index d268af79..647800be 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -255,10 +255,16 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): return symplectic_matrix -@njit("b1[:,:](b1[:,:], u8[:], u8[:], u8)", parallel=True, cache=True) -def _rowsum(symplectic_matrix, h, i, nqubits): +@njit( + "b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True, fastmath=True +) +def _rowsum(symplectic_matrix, h, i, nqubits, determined=False): xi, xh = symplectic_matrix[i, :nqubits], symplectic_matrix[h, :nqubits] zi, zh = symplectic_matrix[i, nqubits:-1], symplectic_matrix[h, nqubits:-1] + if determined: + g_r = np.array([False for _ in range(h.shape[0])]) + g_xi_xh = xi.copy() + g_zi_zh = xi.copy() for j in prange(len(h)): # pylint: disable=not-an-iterable exp = np.zeros(nqubits, dtype=uint64) x1_eq_z1 = (xi[j] ^ zi[j]) == False @@ -272,29 +278,24 @@ def _rowsum(symplectic_matrix, h, i, nqubits): exp[ind3] = zh[j, ind3].astype(uint64) * (2 * xh[j, ind3].astype(uint64) - 1) exp[ind4] = xh[j, ind4].astype(uint64) * (1 - 2 * zh[j, ind4].astype(uint64)) - symplectic_matrix[h[j], -1] = ( + r = ( 2 * symplectic_matrix[h[j], -1] + 2 * symplectic_matrix[i[j], -1] + np.sum(exp) ) % 4 != 0 - symplectic_matrix[h[j], :nqubits] = xi[j] ^ xh[j] - symplectic_matrix[h[j], nqubits:-1] = zi[j] ^ zh[j] + xi_xh = xi[j] ^ xh[j] + zi_zh = zi[j] ^ zh[j] + if determined: # for some reason xor reduction fails here + g_r[j] = r # thus, I cannot do g_r += r here + g_xi_xh[j] = xi_xh + g_zi_zh[j] = zi_zh + else: + symplectic_matrix[h[j], -1] = r + symplectic_matrix[h[j], :nqubits] = xi_xh + symplectic_matrix[h[j], nqubits:-1] = zi_zh + if determined: + for j in prange(len(g_r)): + symplectic_matrix[h[0], -1] ^= g_r[j] + symplectic_matrix[h[0], :nqubits] ^= g_xi_xh[j] + symplectic_matrix[h[0], nqubits:-1] ^= g_zi_zh[j] return symplectic_matrix - - -""" -# Not parallelizable? -@njit("Tuple((b1[:,:], u8))(b1[:,:], u8, u8)", parallel=False, cache=True) -def _determined_outcome(state, q, nqubits): - state[-1, :] = False - indices = state[:nqubits, q].nonzero()[0] - for i in prange(len(indices)): - state = _rowsum( - state, - np.array([2 * nqubits], dtype=uint64), - np.array([indices[i] + nqubits], dtype=uint64), - nqubits, - include_scratch=True, - ) - return state, uint64(state[-1, -1]) -""" diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 1d0bf4ce..6d025180 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -711,26 +711,41 @@ def _random_outcome(state, p, q, nqubits): """ _get_h = """ -__device__ void _get_h(bool* state, int& p, int& q, int& dim, int* g_h, int* g_nrows) { +__device__ void _get_h(bool* state, int& p, int& q, int& dim, int* g_h, int& g_nrows) { const unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; const unsigned int ntid = gridDim.x * blockDim.x; - __shared__ unsigned int nrows; - __shared__ unsigned int h[]; - unsigned int n_iterations = 1; + __shared__ unsigned int nrows = 0; + __shared__ unsigned int h[128]; // 128 fixed block dimension + unsigned int n_iterations = 0; for(int j = tid_x; j < dim - 1; j += ntid_x) { if (state[j * dim + q] && j != p) { - h[n_iterations * blockIdx.x + nrows + j] = j; nrows += 1; + h[nrows - 1] = j; } - n_iterations += 1; - } - for(int j = tid_x; j < dim - 1; j += ntid_x) { + int idx = atomicAdd(&g_nrows, 1); + g_h[idx] = h[] if (threadIdx.x == 0) { - g_nrows[j] + for(int k = 0; k < nrows; k ++) { + g_h[(n_iterations * gridDim.x) + blockIdx.x * blockDim.x + k] = h[k]; + } + g_nrows[(n_iterations * gridDim.x) + blockIdx.x] = nrows; } + n_iterations += 1; } +__global__ void get_h(bool* state, int& p, int& q, int& dim, int* g_h, int* g_nrows) { + _get_h(state, p, q, dim, g_h, g_nrows); + if threadIdx.x +} """ +_get_h = cp.RawKernel(_get_h, "_get_h", options=("--std=c++11",)) + + +def get_h(symplectic_matrix, p, q, nqubits): + g_h = cp.zeros(_get_dim(nqubits)) + g_nrows = cp.zeros(math.ceil(_get_dim(nqubits) / 128)) + + __random_outcome = f""" #include {__apply_rowsum} From e0cff64b8ae25250bbb36dd22a05b2ae969af891 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 29 Jan 2024 14:49:41 +0400 Subject: [PATCH 38/60] feat: updated rowsum for cupy (to be tested) --- .../backends/clifford_operations_gpu.py | 115 ++++++------------ 1 file changed, 36 insertions(+), 79 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 6d025180..cb864957 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -4,8 +4,7 @@ import numpy as np GRIDDIM, BLOCKDIM = 1024, 128 -BLOCKDIM_2D = (64, 16) -GRIDDIM_2D = (32, 8) +GRIDDIM_2D = (1024, 1024) apply_one_qubit_kernel = """ extern "C" @@ -549,50 +548,65 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): return symplectic_matrix -# This might be optimized using shared memory and warp reduction _apply_rowsum = """ -__device__ void _apply_rowsum(bool* symplectic_matrix, const long* h, const long* i, const int& nqubits, const int& nrows, long* exp, const int& dim) { +__device__ void _apply_rowsum(bool* symplectic_matrix, const long* h, const long* i, const int& nqubits, const bool& determined, const int& nrows, long* g_exp, const int& dim) { unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; - unsigned int tid_y = blockIdx.y * blockDim.y + threadIdx.y; + unsigned int bid_y = blockIdx.y; unsigned int ntid_x = gridDim.x * blockDim.x; - unsigned int ntid_y = gridDim.y * blockDim.y; + unsigned int nbid_y = gridDim.y; const int last = dim - 1; - for(int j = tid_y; j < nrows; j += ntid_y) { + __shared__ int exp = 0; + for(int j = bid_y; j < nrows; j += nbid_y) { for(int k = tid_x; k < nqubits; k += ntid_x) { unsigned int kz = nqubits + k; bool x1_eq_z1 = symplectic_matrix[i[j] * dim + k] == symplectic_matrix[i[j] * dim + kz]; bool x1_eq_0 = symplectic_matrix[i[j] * dim + k] == false; if (x1_eq_z1) { if (not x1_eq_0) { - exp[j] += ((int) symplectic_matrix[h[j] * dim + kz]) - + exp += ((int) symplectic_matrix[h[j] * dim + kz]) - (int) symplectic_matrix[h[j] * dim + k]; } } else { if (x1_eq_0) { - exp[j] += ((int) symplectic_matrix[h[j] * dim + k]) * ( + exp += ((int) symplectic_matrix[h[j] * dim + k]) * ( 1 - 2 * (int) symplectic_matrix[h[j] * dim + kz] ); } else { - exp[j] += ((int) symplectic_matrix[h[j] * dim + kz]) * ( + exp += ((int) symplectic_matrix[h[j] * dim + kz]) * ( 2 * (int) symplectic_matrix[h[j] * dim + k] - 1 ); } } } + if (threadIdx.x == 0 && tid_x < nqubits) { + g_exp[blockIdx.y] += exp; + } __syncthreads(); if (threadIdx.x == 0 && blockIdx.x == 0) { symplectic_matrix[h[j] * dim + last] = ( - 2 * symplectic_matrix[h[j] * dim + last] + 2 * symplectic_matrix[i[j] * dim + last] + exp[j] + 2 * symplectic_matrix[h[j] * dim + last] + 2 * symplectic_matrix[i[j] * dim + last] + g_exp[j] ) % 4 != 0; } - for(int k = tid_x; k < nqubits; k += ntid_x) { - unsigned int kz = nqubits + k; - symplectic_matrix[h[j] * dim + k] = ( - symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] - ); - symplectic_matrix[h[j] * dim + kz] = ( - symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] - ); + if (determined) { + for(int k = tid_x; k < nqubits; k += ntid_x) { + unsigned int kz = nqubits + k; + symplectic_matrix[h[j] * dim + k] ^= ( + symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] + ); + symplectic_matrix[h[j] * dim + kz] ^= ( + symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] + ); + } + } else { + for(int k = tid_x; k < nqubits; k += ntid_x) { + unsigned int kz = nqubits + k; + symplectic_matrix[h[j] * dim + k] = ( + symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] + ); + symplectic_matrix[h[j] * dim + kz] = ( + symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] + ); + } } } } @@ -601,8 +615,8 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): apply_rowsum = f""" {_apply_rowsum} extern "C" -__global__ void apply_rowsum(bool* symplectic_matrix, const long* h, const long* i, const int nqubits, const int nrows, long* exp, const int dim) {{ - _apply_rowsum(symplectic_matrix, h, i, nqubits, nrows, exp, dim); +__global__ void apply_rowsum(bool* symplectic_matrix, const long* h, const long* i, const int nqubits, const bool& determined, const int nrows, long* g_exp, const int dim) {{ + _apply_rowsum(symplectic_matrix, h, i, nqubits, determined, nrows, g_exp, dim); }} """ @@ -619,7 +633,7 @@ def _rowsum(symplectic_matrix, h, i, nqubits): nrows = len(h) exp = cp.zeros(len(h), dtype=int) apply_rowsum( - GRIDDIM_2D, BLOCKDIM_2D, (symplectic_matrix, h, i, nqubits, nrows, exp, dim) + GRIDDIM_2D, BLOCKDIM, (symplectic_matrix, h, i, nqubits, nrows, exp, dim) ) return symplectic_matrix @@ -653,63 +667,6 @@ def _random_outcome(state, p, q, nqubits): return state.ravel(), outcome -__apply_rowsum = """ -__device__ void _apply_rowsum(bool* symplectic_matrix, const int& h, const int& i, const int& nqubits, const int& dim, unsigned int* global_exp) { - unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; - unsigned int ntid_x = gridDim.x * blockDim.x; - const int last = dim - 1; - __shared__ unsigned int exp = 0; - for(int k = tid_x; k < nqubits; k += ntid_x) { - unsigned int kz = nqubits + k; - bool x1_eq_z1 = symplectic_matrix[i * dim + k] == symplectic_matrix[i * dim + kz]; - bool x1_eq_0 = symplectic_matrix[i * dim + k] == false; - if (x1_eq_z1) { - if (not x1_eq_0) { - exp += ((int) symplectic_matrix[h * dim + kz]) - - (int) symplectic_matrix[h * dim + k]; - } - } else { - if (x1_eq_0) { - exp += ((int) symplectic_matrix[h * dim + k]) * ( - 1 - 2 * (int) symplectic_matrix[h * dim + kz] - ); - } else { - exp += ((int) symplectic_matrix[h * dim + kz]) * ( - 2 * (int) symplectic_matrix[h * dim + k] - 1 - ); - } - } - } - __syncthreads(); - unsigned int iteration = (int) (dim - 1) / gridDim.y + 1; - for (int k = blockIdx.x; k < (int) (nqubits / (gridDim.x * blockDim.x)); k += gridDim.x) { - if (threadIdx.x == 0) { - global_exp[iteration * blockIdx.y * gridDim.x + k] = exp; - } - } - for (int k = 0; k < gridDim.x; k++) { - if (threadIdx.x == 0 && blobkIdx.x == 0) { - global_exp[blockIdx.y * iteration] += global_exp[iteration * blockIdx.y + k]; - } - } - - symplectic_matrix[h[j] * dim + last] = ( - 2 * symplectic_matrix[h * dim + last] + 2 * symplectic_matrix[i * dim + last] + exp[j] - ) % 4 != 0; - } - for(int k = tid_x; k < nqubits; k += ntid_x) { - unsigned int kz = nqubits + k; - symplectic_matrix[h[j] * dim + k] = ( - symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] - ); - symplectic_matrix[h[j] * dim + kz] = ( - symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] - ); - } - } -} -""" - _get_h = """ __device__ void _get_h(bool* state, int& p, int& q, int& dim, int* g_h, int& g_nrows) { const unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; From 5b34d15d15db6c5074bf4c5221969322b726acb6 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 29 Jan 2024 16:12:32 +0400 Subject: [PATCH 39/60] fix: fix cupy rowsum --- .../backends/clifford_operations_gpu.py | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index cb864957..ff5e950e 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -555,7 +555,10 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): unsigned int ntid_x = gridDim.x * blockDim.x; unsigned int nbid_y = gridDim.y; const int last = dim - 1; - __shared__ int exp = 0; + __shared__ int exp; + if (threadIdx.x == 0) { + exp = 0; + } for(int j = bid_y; j < nrows; j += nbid_y) { for(int k = tid_x; k < nqubits; k += ntid_x) { unsigned int kz = nqubits + k; @@ -579,7 +582,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): } } if (threadIdx.x == 0 && tid_x < nqubits) { - g_exp[blockIdx.y] += exp; + g_exp[j] += exp; } __syncthreads(); if (threadIdx.x == 0 && blockIdx.x == 0) { @@ -615,7 +618,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): apply_rowsum = f""" {_apply_rowsum} extern "C" -__global__ void apply_rowsum(bool* symplectic_matrix, const long* h, const long* i, const int nqubits, const bool& determined, const int nrows, long* g_exp, const int dim) {{ +__global__ void apply_rowsum(bool* symplectic_matrix, const long* h, const long* i, const int nqubits, const bool determined, const int nrows, long* g_exp, const int dim) {{ _apply_rowsum(symplectic_matrix, h, i, nqubits, determined, nrows, g_exp, dim); }} """ @@ -628,12 +631,14 @@ def _get_dim(nqubits): return 2 * nqubits + 1 -def _rowsum(symplectic_matrix, h, i, nqubits): +def _rowsum(symplectic_matrix, h, i, nqubits, determined=False): dim = _get_dim(nqubits) nrows = len(h) exp = cp.zeros(len(h), dtype=int) apply_rowsum( - GRIDDIM_2D, BLOCKDIM, (symplectic_matrix, h, i, nqubits, nrows, exp, dim) + GRIDDIM_2D, + (BLOCKDIM,), + (symplectic_matrix, h, i, nqubits, determined, nrows, exp, dim), ) return symplectic_matrix @@ -657,6 +662,7 @@ def _random_outcome(state, p, q, nqubits): h, p.astype(cp.uint) * cp.ones(h.shape[0], dtype=np.uint), nqubits, + False, ) state = state.reshape(dim, dim) state[p - nqubits, :] = state[p, :] @@ -705,7 +711,7 @@ def get_h(symplectic_matrix, p, q, nqubits): __random_outcome = f""" #include -{__apply_rowsum} +{_apply_rowsum} __device__ void random_outcome(bool* state, int& p, int& q, int& nqubits, int& dim, int& outcome) {{ unsigned int tid_y = blockIdx.y; unsigned int ntid_y = gridDim.y; @@ -731,12 +737,14 @@ def get_h(symplectic_matrix, p, q, nqubits): def _determined_outcome(state, q, nqubits): dim = _get_dim(nqubits) - state.reshape(dim, dim)[-1, :] = False - for i in state.reshape(dim, dim)[:nqubits, q].nonzero()[0]: - state = _rowsum( - state, - cp.array([2 * nqubits], dtype=np.uint), - cp.array([i + nqubits], dtype=np.uint), - nqubits, - ) + state = state.reshape(dim, dim) + state[-1, :] = False + idx = state[:nqubits, q].nonzero()[0] + state = _rowsum( + state.ravel(), + (2 * nqubits * cp.ones(idx.shape, dtype=np.uint)).astype(np.uint), + idx.astype(np.uint), + nqubits, + True, + ) return state, state[dim * dim - 1].astype(cp.uint) From 249c0f9eae9dcce43dcd53c17c05c98765dd860f Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Tue, 30 Jan 2024 11:48:13 +0400 Subject: [PATCH 40/60] refactor: refactor cupy rowsum --- .../backends/clifford_operations_gpu.py | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index ff5e950e..c4cf8712 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -590,25 +590,22 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): 2 * symplectic_matrix[h[j] * dim + last] + 2 * symplectic_matrix[i[j] * dim + last] + g_exp[j] ) % 4 != 0; } - if (determined) { - for(int k = tid_x; k < nqubits; k += ntid_x) { - unsigned int kz = nqubits + k; - symplectic_matrix[h[j] * dim + k] ^= ( - symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] - ); - symplectic_matrix[h[j] * dim + kz] ^= ( - symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] - ); - } - } else { - for(int k = tid_x; k < nqubits; k += ntid_x) { - unsigned int kz = nqubits + k; - symplectic_matrix[h[j] * dim + k] = ( - symplectic_matrix[i[j] * dim + k] ^ symplectic_matrix[h[j] * dim + k] - ); - symplectic_matrix[h[j] * dim + kz] = ( - symplectic_matrix[i[j] * dim + kz] ^ symplectic_matrix[h[j] * dim + kz] - ); + for(int k = tid_x; k < nqubits; k += ntid_x) { + unsigned int kz = nqubits + k; + unsigned int row_i = i[j] * dim; + unsigned int row_h = h[j] * dim; + bool xi_xh = ( + symplectic_matrix[row_i + k] ^ symplectic_matrix[row_h + k] + ); + bool zi_zh = ( + symplectic_matrix[row_i + kz] ^ symplectic_matrix[row_h + kz] + ); + if (determined) { + symplectic_matrix[row_h + k] ^= xi_xh; + symplectic_matrix[row_h + kz] ^= zi_zh; + } else { + symplectic_matrix[row_h + k] = xi_xh; + symplectic_matrix[row_h + kz] = zi_zh; } } } From 6971051a6d27527c71459b489743bab348d2f3bf Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 31 Jan 2024 14:15:59 +0400 Subject: [PATCH 41/60] fix: bugfix to numba SWAP --- src/qibojit/backends/clifford_operations_cpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 647800be..fbfee32c 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -170,7 +170,7 @@ def SWAP(symplectic_matrix, control_q, target_q, nqubits): x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable - symplectic_matrix[:-1, -1] = ( + symplectic_matrix[i, -1] = ( r[i] ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) ^ ( From 4e6e48135c3fb20004c2ffa67b777ea530745bcb Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Tue, 6 Feb 2024 11:46:45 +0400 Subject: [PATCH 42/60] fix: fix cupy determined outcome --- src/qibojit/backends/clifford_operations_gpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index c4cf8712..69cea033 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -736,7 +736,7 @@ def _determined_outcome(state, q, nqubits): dim = _get_dim(nqubits) state = state.reshape(dim, dim) state[-1, :] = False - idx = state[:nqubits, q].nonzero()[0] + idx = state[:nqubits, q].nonzero()[0] + nqubits state = _rowsum( state.ravel(), (2 * nqubits * cp.ones(idx.shape, dtype=np.uint)).astype(np.uint), From 1c49fc4ac49f9216e0a5762d6105543db7b659d2 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 7 Feb 2024 12:23:14 +0400 Subject: [PATCH 43/60] fix: review updates --- src/qibojit/backends/cpu.py | 4 ++-- src/qibojit/backends/gpu.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index ed0276a9..315c44f5 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -2,7 +2,7 @@ import numpy as np from numba import njit -from qibo.backends import clifford_operations +from qibo.backends import _clifford_operations from qibo.backends.numpy import NumpyBackend from qibo.config import log from qibo.gates.abstract import ParametrizedGate @@ -74,7 +74,7 @@ def __init__(self): else: self.set_threads(len(psutil.Process().cpu_affinity())) - spec = find_spec("qibo.backends.clifford_operations") + spec = find_spec("qibo.backends._clifford_operations") self.clifford_operations = module_from_spec(spec) spec.loader.exec_module(self.clifford_operations) for method in dir(clifford_operations_cpu): diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index 5d274a2e..f4f041fb 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -1,7 +1,7 @@ from importlib.util import find_spec, module_from_spec import numpy as np -from qibo.backends import clifford_operations +from qibo.backends import _clifford_operations from qibo.backends.numpy import NumpyBackend from qibo.config import log, raise_error @@ -103,7 +103,7 @@ def kernel_loader(name, ktype): from qibojit.backends import clifford_operations_gpu - spec = find_spec("qibo.backends.clifford_operations") + spec = find_spec("qibo.backends._clifford_operations") self.clifford_operations = module_from_spec(spec) spec.loader.exec_module(self.clifford_operations) for method in dir(clifford_operations_gpu): @@ -158,10 +158,10 @@ def to_numpy(self, x): def issparse(self, x): return self.sparse.issparse(x) or self.npsparse.issparse(x) - def clifford_pre_execution_reshape(self, state): + def _clifford_pre_execution_reshape(self, state): return state.ravel() - def clifford_post_execution_reshape(self, state, nqubits): + def _clifford_post_execution_reshape(self, state, nqubits): dim = 2 * nqubits + 1 return state.reshape(dim, dim) From 28972869fbf3377052b8e42176eb18c2ef8dc66d Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 7 Feb 2024 12:28:46 +0400 Subject: [PATCH 44/60] fix: pylint fix --- .../backends/clifford_operations_cpu.py | 2 +- .../backends/clifford_operations_gpu.py | 62 ------------------- 2 files changed, 1 insertion(+), 63 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index fbfee32c..e02ae9be 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -294,7 +294,7 @@ def _rowsum(symplectic_matrix, h, i, nqubits, determined=False): symplectic_matrix[h[j], :nqubits] = xi_xh symplectic_matrix[h[j], nqubits:-1] = zi_zh if determined: - for j in prange(len(g_r)): + for j in prange(len(g_r)): # pylint: disable=not-an-iterable symplectic_matrix[h[0], -1] ^= g_r[j] symplectic_matrix[h[0], :nqubits] ^= g_xi_xh[j] symplectic_matrix[h[0], nqubits:-1] ^= g_zi_zh[j] diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 69cea033..2ff37f97 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -670,68 +670,6 @@ def _random_outcome(state, p, q, nqubits): return state.ravel(), outcome -_get_h = """ -__device__ void _get_h(bool* state, int& p, int& q, int& dim, int* g_h, int& g_nrows) { - const unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; - const unsigned int ntid = gridDim.x * blockDim.x; - __shared__ unsigned int nrows = 0; - __shared__ unsigned int h[128]; // 128 fixed block dimension - unsigned int n_iterations = 0; - for(int j = tid_x; j < dim - 1; j += ntid_x) { - if (state[j * dim + q] && j != p) { - nrows += 1; - h[nrows - 1] = j; - } - int idx = atomicAdd(&g_nrows, 1); - g_h[idx] = h[] - if (threadIdx.x == 0) { - for(int k = 0; k < nrows; k ++) { - g_h[(n_iterations * gridDim.x) + blockIdx.x * blockDim.x + k] = h[k]; - } - g_nrows[(n_iterations * gridDim.x) + blockIdx.x] = nrows; - } - n_iterations += 1; - } -__global__ void get_h(bool* state, int& p, int& q, int& dim, int* g_h, int* g_nrows) { - _get_h(state, p, q, dim, g_h, g_nrows); - if threadIdx.x -} -""" - -_get_h = cp.RawKernel(_get_h, "_get_h", options=("--std=c++11",)) - - -def get_h(symplectic_matrix, p, q, nqubits): - g_h = cp.zeros(_get_dim(nqubits)) - g_nrows = cp.zeros(math.ceil(_get_dim(nqubits) / 128)) - - -__random_outcome = f""" -#include -{_apply_rowsum} -__device__ void random_outcome(bool* state, int& p, int& q, int& nqubits, int& dim, int& outcome) {{ - unsigned int tid_y = blockIdx.y; - unsigned int ntid_y = gridDim.y; - __global__ unsigned int global_exp[1024]; - for(int j = tid_y; j < dim - 1; j += ntid_y) {{ - if (state[j * dim + q] && j != p) {{ - _apply_rowsum(state, j, p, nqubits, dim) - }} - }} - unsigned int tid_x = blockIdx.x * blockDim.x + threadIdx.x; - for(int j = tid_x * (1 + tid_y); j < dim; j += ntid_y) {{ - state[(p - nqubits) * dim + j] = state[p * dim + j]; - state[p * dim + j] = false; - }} - if (threadIdx.x == 0 && blockIdx.x == 0 && blockIdx.y == 0) {{ - outcome = rand() % 2; - state[p * dim + dim] = (bool) outcome; - state[p * dim + nqubits + q] = true; - }} -}} -""" - - def _determined_outcome(state, q, nqubits): dim = _get_dim(nqubits) state = state.reshape(dim, dim) From f9ea2ed9347e3131845e7eb7b9f9eda740e16ace Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Thu, 8 Feb 2024 15:15:56 +0400 Subject: [PATCH 45/60] refactor: passing state[:-1] --- .../backends/clifford_operations_cpu.py | 32 ++++++++++--------- .../backends/clifford_operations_gpu.py | 15 +++++---- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index e02ae9be..674ed899 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -7,7 +7,7 @@ def H(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) tmp = symplectic_matrix[i, q] symplectic_matrix[i, q] = symplectic_matrix[i, nqubits + q] @@ -20,7 +20,8 @@ def CNOT(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, control_q] & z[i, target_q]) & ( x[i, target_q] ^ ~z[i, control_q] ) @@ -35,7 +36,8 @@ def CZ(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & z[i, target_q]) @@ -54,7 +56,7 @@ def S(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & z[i, q]) symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -66,7 +68,7 @@ def Z(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ ( (x[i, q] & z[i, q]) ^ x[i, q] & (z[i, q] ^ x[i, q]) ) @@ -79,7 +81,7 @@ def X(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (z[i, q] & x[i, q]) ) @@ -92,7 +94,7 @@ def Y(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) ^ (x[i, q] & (z[i, q] ^ x[i, q])) ) @@ -105,7 +107,7 @@ def SX(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) symplectic_matrix[i, q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -117,7 +119,7 @@ def SDG(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) symplectic_matrix[i, nqubits + q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -129,7 +131,7 @@ def SXDG(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & x[i, q]) symplectic_matrix[i, q] = z[i, q] ^ x[i, q] return symplectic_matrix @@ -141,7 +143,7 @@ def RY_pi(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (x[i, q] & (z[i, q] ^ x[i, q])) zq = symplectic_matrix[i, nqubits + q] symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] @@ -155,7 +157,7 @@ def RY_3pi_2(symplectic_matrix, q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = r[i] ^ (z[i, q] & (z[i, q] ^ x[i, q])) zq = symplectic_matrix[i, nqubits + q] symplectic_matrix[i, nqubits + q] = symplectic_matrix[i, q] @@ -169,7 +171,7 @@ def SWAP(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (x[i, control_q] & z[i, target_q] & (x[i, target_q] ^ ~z[i, control_q])) @@ -201,7 +203,7 @@ def iSWAP(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & z[i, target_q]) @@ -235,7 +237,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): r = symplectic_matrix[:-1, -1] x = symplectic_matrix[:-1, :nqubits] z = symplectic_matrix[:-1, nqubits:-1] - for i in prange(symplectic_matrix.shape[0] - 1): # pylint: disable=not-an-iterable + for i in prange(symplectic_matrix.shape[0]): # pylint: disable=not-an-iterable symplectic_matrix[i, -1] = ( r[i] ^ (x[i, target_q] & (z[i, target_q] ^ x[i, target_q])) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 2ff37f97..d720ced8 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -6,6 +6,12 @@ GRIDDIM, BLOCKDIM = 1024, 128 GRIDDIM_2D = (1024, 1024) + +@cache +def _get_dim(nqubits): + return 2 * nqubits + 1 + + apply_one_qubit_kernel = """ extern "C" __global__ void apply_{}(bool* symplectic_matrix, const int q, const int nqubits, const int qz, const int dim) {{ @@ -23,14 +29,14 @@ def one_qubit_kernel_launcher(kernel, symplectic_matrix, q, nqubits): qz = nqubits + q - dim = 2 * nqubits + 1 + dim = _get_dim(nqubits) return kernel((GRIDDIM,), (BLOCKDIM,), (symplectic_matrix, q, nqubits, qz, dim)) def two_qubits_kernel_launcher(kernel, symplectic_matrix, control_q, target_q, nqubits): cqz = nqubits + control_q tqz = nqubits + target_q - dim = 2 * nqubits + 1 + dim = _get_dim(nqubits) return kernel( (GRIDDIM,), (BLOCKDIM,), @@ -623,11 +629,6 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): apply_rowsum = cp.RawKernel(apply_rowsum, "apply_rowsum", options=("--std=c++11",)) -@cache -def _get_dim(nqubits): - return 2 * nqubits + 1 - - def _rowsum(symplectic_matrix, h, i, nqubits, determined=False): dim = _get_dim(nqubits) nrows = len(h) From 3b28b4a3149bcb404090df5674de8407fe10068f Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Thu, 8 Feb 2024 15:53:30 +0400 Subject: [PATCH 46/60] refactor: changing operations overloading method --- src/qibojit/backends/cpu.py | 18 +++++++----------- src/qibojit/backends/gpu.py | 18 +++++++----------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index 315c44f5..681881cf 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -1,5 +1,3 @@ -from importlib.util import find_spec, module_from_spec - import numpy as np from numba import njit from qibo.backends import _clifford_operations @@ -74,15 +72,13 @@ def __init__(self): else: self.set_threads(len(psutil.Process().cpu_affinity())) - spec = find_spec("qibo.backends._clifford_operations") - self.clifford_operations = module_from_spec(spec) - spec.loader.exec_module(self.clifford_operations) - for method in dir(clifford_operations_cpu): - setattr( - self.clifford_operations, - method, - getattr(clifford_operations_cpu, method), - ) + class CliffordOperations: + pass + + self.clifford_operations = CliffordOperations() + for operations in (_clifford_operations, clifford_operations_cpu): + for method in dir(operations): + setattr(self.clifford_operations, method, getattr(operations, method)) def set_precision(self, precision): if precision != self.precision: diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index f4f041fb..2e8115ab 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -1,5 +1,3 @@ -from importlib.util import find_spec, module_from_spec - import numpy as np from qibo.backends import _clifford_operations from qibo.backends.numpy import NumpyBackend @@ -103,15 +101,13 @@ def kernel_loader(name, ktype): from qibojit.backends import clifford_operations_gpu - spec = find_spec("qibo.backends._clifford_operations") - self.clifford_operations = module_from_spec(spec) - spec.loader.exec_module(self.clifford_operations) - for method in dir(clifford_operations_gpu): - setattr( - self.clifford_operations, - method, - getattr(clifford_operations_gpu, method), - ) + class CliffordOperations: + pass + + self.clifford_operations = CliffordOperations() + for operations in (_clifford_operations, clifford_operations_gpu): + for method in dir(operations): + setattr(self.clifford_operations, method, getattr(operations, method)) def set_precision(self, precision): super().set_precision(precision) From ba7e09ce6308c1bd875aba4351e81e619edeea53 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 9 Feb 2024 11:14:46 +0400 Subject: [PATCH 47/60] build: update poetry lock --- poetry.lock | 394 ++++++++++++++++++++++++++-------------------------- 1 file changed, 196 insertions(+), 198 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0d925845..8db772bc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -61,63 +61,63 @@ files = [ [[package]] name = "coverage" -version = "7.4.0" +version = "7.4.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, - {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, - {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, - {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, - {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, - {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, - {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, - {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, - {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, - {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, - {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, - {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, - {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, - {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, + {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, + {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, + {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, + {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, + {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, + {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, + {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, + {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, + {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, + {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, + {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, + {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, ] [package.dependencies] @@ -128,17 +128,18 @@ toml = ["tomli"] [[package]] name = "dill" -version = "0.3.7" +version = "0.3.8" description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "exceptiongroup" @@ -275,35 +276,32 @@ files = [ [[package]] name = "llvmlite" -version = "0.41.1" +version = "0.42.0" description = "lightweight wrapper around basic LLVM functionality" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "llvmlite-0.41.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1e1029d47ee66d3a0c4d6088641882f75b93db82bd0e6178f7bd744ebce42b9"}, - {file = "llvmlite-0.41.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:150d0bc275a8ac664a705135e639178883293cf08c1a38de3bbaa2f693a0a867"}, - {file = "llvmlite-0.41.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eee5cf17ec2b4198b509272cf300ee6577229d237c98cc6e63861b08463ddc6"}, - {file = "llvmlite-0.41.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd0338da625346538f1173a17cabf21d1e315cf387ca21b294ff209d176e244"}, - {file = "llvmlite-0.41.1-cp310-cp310-win32.whl", hash = "sha256:fa1469901a2e100c17eb8fe2678e34bd4255a3576d1a543421356e9c14d6e2ae"}, - {file = "llvmlite-0.41.1-cp310-cp310-win_amd64.whl", hash = "sha256:2b76acee82ea0e9304be6be9d4b3840208d050ea0dcad75b1635fa06e949a0ae"}, - {file = "llvmlite-0.41.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:210e458723436b2469d61b54b453474e09e12a94453c97ea3fbb0742ba5a83d8"}, - {file = "llvmlite-0.41.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:855f280e781d49e0640aef4c4af586831ade8f1a6c4df483fb901cbe1a48d127"}, - {file = "llvmlite-0.41.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67340c62c93a11fae482910dc29163a50dff3dfa88bc874872d28ee604a83be"}, - {file = "llvmlite-0.41.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2181bb63ef3c607e6403813421b46982c3ac6bfc1f11fa16a13eaafb46f578e6"}, - {file = "llvmlite-0.41.1-cp311-cp311-win_amd64.whl", hash = "sha256:9564c19b31a0434f01d2025b06b44c7ed422f51e719ab5d24ff03b7560066c9a"}, - {file = "llvmlite-0.41.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5940bc901fb0325970415dbede82c0b7f3e35c2d5fd1d5e0047134c2c46b3281"}, - {file = "llvmlite-0.41.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8b0a9a47c28f67a269bb62f6256e63cef28d3c5f13cbae4fab587c3ad506778b"}, - {file = "llvmlite-0.41.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8afdfa6da33f0b4226af8e64cfc2b28986e005528fbf944d0a24a72acfc9432"}, - {file = "llvmlite-0.41.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8454c1133ef701e8c050a59edd85d238ee18bb9a0eb95faf2fca8b909ee3c89a"}, - {file = "llvmlite-0.41.1-cp38-cp38-win32.whl", hash = "sha256:2d92c51e6e9394d503033ffe3292f5bef1566ab73029ec853861f60ad5c925d0"}, - {file = "llvmlite-0.41.1-cp38-cp38-win_amd64.whl", hash = "sha256:df75594e5a4702b032684d5481db3af990b69c249ccb1d32687b8501f0689432"}, - {file = "llvmlite-0.41.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04725975e5b2af416d685ea0769f4ecc33f97be541e301054c9f741003085802"}, - {file = "llvmlite-0.41.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf14aa0eb22b58c231243dccf7e7f42f7beec48970f2549b3a6acc737d1a4ba4"}, - {file = "llvmlite-0.41.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c32356f669e036eb01016e883b22add883c60739bc1ebee3a1cc0249a50828"}, - {file = "llvmlite-0.41.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24091a6b31242bcdd56ae2dbea40007f462260bc9bdf947953acc39dffd54f8f"}, - {file = "llvmlite-0.41.1-cp39-cp39-win32.whl", hash = "sha256:880cb57ca49e862e1cd077104375b9d1dfdc0622596dfa22105f470d7bacb309"}, - {file = "llvmlite-0.41.1-cp39-cp39-win_amd64.whl", hash = "sha256:92f093986ab92e71c9ffe334c002f96defc7986efda18397d0f08534f3ebdc4d"}, - {file = "llvmlite-0.41.1.tar.gz", hash = "sha256:f19f767a018e6ec89608e1f6b13348fa2fcde657151137cb64e56d48598a92db"}, + {file = "llvmlite-0.42.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3366938e1bf63d26c34fbfb4c8e8d2ded57d11e0567d5bb243d89aab1eb56098"}, + {file = "llvmlite-0.42.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c35da49666a21185d21b551fc3caf46a935d54d66969d32d72af109b5e7d2b6f"}, + {file = "llvmlite-0.42.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70f44ccc3c6220bd23e0ba698a63ec2a7d3205da0d848804807f37fc243e3f77"}, + {file = "llvmlite-0.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f8d8717a9073b9e0246998de89929071d15b47f254c10eef2310b9aac033d"}, + {file = "llvmlite-0.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:8d90edf400b4ceb3a0e776b6c6e4656d05c7187c439587e06f86afceb66d2be5"}, + {file = "llvmlite-0.42.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ae511caed28beaf1252dbaf5f40e663f533b79ceb408c874c01754cafabb9cbf"}, + {file = "llvmlite-0.42.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81e674c2fe85576e6c4474e8c7e7aba7901ac0196e864fe7985492b737dbab65"}, + {file = "llvmlite-0.42.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb3975787f13eb97629052edb5017f6c170eebc1c14a0433e8089e5db43bcce6"}, + {file = "llvmlite-0.42.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5bece0cdf77f22379f19b1959ccd7aee518afa4afbd3656c6365865f84903f9"}, + {file = "llvmlite-0.42.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e0c4c11c8c2aa9b0701f91b799cb9134a6a6de51444eff5a9087fc7c1384275"}, + {file = "llvmlite-0.42.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:08fa9ab02b0d0179c688a4216b8939138266519aaa0aa94f1195a8542faedb56"}, + {file = "llvmlite-0.42.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b2fce7d355068494d1e42202c7aff25d50c462584233013eb4470c33b995e3ee"}, + {file = "llvmlite-0.42.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebe66a86dc44634b59a3bc860c7b20d26d9aaffcd30364ebe8ba79161a9121f4"}, + {file = "llvmlite-0.42.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d47494552559e00d81bfb836cf1c4d5a5062e54102cc5767d5aa1e77ccd2505c"}, + {file = "llvmlite-0.42.0-cp312-cp312-win_amd64.whl", hash = "sha256:05cb7e9b6ce69165ce4d1b994fbdedca0c62492e537b0cc86141b6e2c78d5888"}, + {file = "llvmlite-0.42.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdd3888544538a94d7ec99e7c62a0cdd8833609c85f0c23fcb6c5c591aec60ad"}, + {file = "llvmlite-0.42.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0936c2067a67fb8816c908d5457d63eba3e2b17e515c5fe00e5ee2bace06040"}, + {file = "llvmlite-0.42.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a78ab89f1924fc11482209f6799a7a3fc74ddc80425a7a3e0e8174af0e9e2301"}, + {file = "llvmlite-0.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7599b65c7af7abbc978dbf345712c60fd596aa5670496561cc10e8a71cebfb2"}, + {file = "llvmlite-0.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:43d65cc4e206c2e902c1004dd5418417c4efa6c1d04df05c6c5675a27e8ca90e"}, + {file = "llvmlite-0.42.0.tar.gz", hash = "sha256:f92b09243c0cc3f457da8b983f67bd8e1295d0f5b3746c7a1861d7a99403854a"}, ] [[package]] @@ -354,81 +352,81 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numba" -version = "0.58.1" +version = "0.59.0" description = "compiling Python code using LLVM" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "numba-0.58.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07f2fa7e7144aa6f275f27260e73ce0d808d3c62b30cff8906ad1dec12d87bbe"}, - {file = "numba-0.58.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7bf1ddd4f7b9c2306de0384bf3854cac3edd7b4d8dffae2ec1b925e4c436233f"}, - {file = "numba-0.58.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bc2d904d0319d7a5857bd65062340bed627f5bfe9ae4a495aef342f072880d50"}, - {file = "numba-0.58.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e79b6cc0d2bf064a955934a2e02bf676bc7995ab2db929dbbc62e4c16551be6"}, - {file = "numba-0.58.1-cp310-cp310-win_amd64.whl", hash = "sha256:81fe5b51532478149b5081311b0fd4206959174e660c372b94ed5364cfb37c82"}, - {file = "numba-0.58.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bcecd3fb9df36554b342140a4d77d938a549be635d64caf8bd9ef6c47a47f8aa"}, - {file = "numba-0.58.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1eaa744f518bbd60e1f7ccddfb8002b3d06bd865b94a5d7eac25028efe0e0ff"}, - {file = "numba-0.58.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bf68df9c307fb0aa81cacd33faccd6e419496fdc621e83f1efce35cdc5e79cac"}, - {file = "numba-0.58.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:55a01e1881120e86d54efdff1be08381886fe9f04fc3006af309c602a72bc44d"}, - {file = "numba-0.58.1-cp311-cp311-win_amd64.whl", hash = "sha256:811305d5dc40ae43c3ace5b192c670c358a89a4d2ae4f86d1665003798ea7a1a"}, - {file = "numba-0.58.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea5bfcf7d641d351c6a80e8e1826eb4a145d619870016eeaf20bbd71ef5caa22"}, - {file = "numba-0.58.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e63d6aacaae1ba4ef3695f1c2122b30fa3d8ba039c8f517784668075856d79e2"}, - {file = "numba-0.58.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6fe7a9d8e3bd996fbe5eac0683227ccef26cba98dae6e5cee2c1894d4b9f16c1"}, - {file = "numba-0.58.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:898af055b03f09d33a587e9425500e5be84fc90cd2f80b3fb71c6a4a17a7e354"}, - {file = "numba-0.58.1-cp38-cp38-win_amd64.whl", hash = "sha256:d3e2fe81fe9a59fcd99cc572002101119059d64d31eb6324995ee8b0f144a306"}, - {file = "numba-0.58.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c765aef472a9406a97ea9782116335ad4f9ef5c9f93fc05fd44aab0db486954"}, - {file = "numba-0.58.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9356e943617f5e35a74bf56ff6e7cc83e6b1865d5e13cee535d79bf2cae954"}, - {file = "numba-0.58.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:240e7a1ae80eb6b14061dc91263b99dc8d6af9ea45d310751b780888097c1aaa"}, - {file = "numba-0.58.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:45698b995914003f890ad839cfc909eeb9c74921849c712a05405d1a79c50f68"}, - {file = "numba-0.58.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd3dda77955be03ff366eebbfdb39919ce7c2620d86c906203bed92124989032"}, - {file = "numba-0.58.1.tar.gz", hash = "sha256:487ded0633efccd9ca3a46364b40006dbdaca0f95e99b8b83e778d1195ebcbaa"}, + {file = "numba-0.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d061d800473fb8fef76a455221f4ad649a53f5e0f96e3f6c8b8553ee6fa98fa"}, + {file = "numba-0.59.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c086a434e7d3891ce5dfd3d1e7ee8102ac1e733962098578b507864120559ceb"}, + {file = "numba-0.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9e20736bf62e61f8353fb71b0d3a1efba636c7a303d511600fc57648b55823ed"}, + {file = "numba-0.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e86e6786aec31d2002122199486e10bbc0dc40f78d76364cded375912b13614c"}, + {file = "numba-0.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:0307ee91b24500bb7e64d8a109848baf3a3905df48ce142b8ac60aaa406a0400"}, + {file = "numba-0.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d540f69a8245fb714419c2209e9af6104e568eb97623adc8943642e61f5d6d8e"}, + {file = "numba-0.59.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1192d6b2906bf3ff72b1d97458724d98860ab86a91abdd4cfd9328432b661e31"}, + {file = "numba-0.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90efb436d3413809fcd15298c6d395cb7d98184350472588356ccf19db9e37c8"}, + {file = "numba-0.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd3dac45e25d927dcb65d44fb3a973994f5add2b15add13337844afe669dd1ba"}, + {file = "numba-0.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:753dc601a159861808cc3207bad5c17724d3b69552fd22768fddbf302a817a4c"}, + {file = "numba-0.59.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ce62bc0e6dd5264e7ff7f34f41786889fa81a6b860662f824aa7532537a7bee0"}, + {file = "numba-0.59.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8cbef55b73741b5eea2dbaf1b0590b14977ca95a13a07d200b794f8f6833a01c"}, + {file = "numba-0.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:70d26ba589f764be45ea8c272caa467dbe882b9676f6749fe6f42678091f5f21"}, + {file = "numba-0.59.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e125f7d69968118c28ec0eed9fbedd75440e64214b8d2eac033c22c04db48492"}, + {file = "numba-0.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:4981659220b61a03c1e557654027d271f56f3087448967a55c79a0e5f926de62"}, + {file = "numba-0.59.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe4d7562d1eed754a7511ed7ba962067f198f86909741c5c6e18c4f1819b1f47"}, + {file = "numba-0.59.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6feb1504bb432280f900deaf4b1dadcee68812209500ed3f81c375cbceab24dc"}, + {file = "numba-0.59.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:944faad25ee23ea9dda582bfb0189fb9f4fc232359a80ab2a028b94c14ce2b1d"}, + {file = "numba-0.59.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5516a469514bfae52a9d7989db4940653a5cbfac106f44cb9c50133b7ad6224b"}, + {file = "numba-0.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:32bd0a41525ec0b1b853da244808f4e5333867df3c43c30c33f89cf20b9c2b63"}, + {file = "numba-0.59.0.tar.gz", hash = "sha256:12b9b064a3e4ad00e2371fc5212ef0396c80f41caec9b5ec391c8b04b6eaf2a8"}, ] [package.dependencies] -llvmlite = "==0.41.*" +llvmlite = "==0.42.*" numpy = ">=1.22,<1.27" [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -444,28 +442,28 @@ files = [ [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -474,27 +472,27 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "psutil" -version = "5.9.7" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, - {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, - {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, - {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, - {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, - {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, - {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, - {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, - {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, - {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -618,49 +616,49 @@ tabulate = "^0.9.0" type = "git" url = "https://github.com/qiboteam/qibo.git" reference = "clifford_simulator_numba" -resolved_reference = "df0550589f522e783175acad4a0fba05f99479f7" +resolved_reference = "9d15645e6fe3a3629bedd0ab3d95541f71d75e9a" [[package]] name = "scipy" -version = "1.11.4" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, - {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, - {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, - {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, - {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, - {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, - {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, - {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, - {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, - {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, - {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" From 037227d82101dde322b61ae5ec88696b567dac82 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 16 Feb 2024 17:02:31 +0400 Subject: [PATCH 48/60] refatcor: moved clifford operations out of the standard backends --- .../backends/clifford_operations_cpu.py | 4 ++ .../backends/clifford_operations_gpu.py | 40 +++++++++++++++++++ src/qibojit/backends/cpu.py | 8 ---- src/qibojit/backends/gpu.py | 17 -------- 4 files changed, 44 insertions(+), 25 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 674ed899..7f9a904f 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -1,6 +1,10 @@ import numpy as np from numba import njit, prange, uint64 +name = "numba" + +np = np + @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def H(symplectic_matrix, q, nqubits): diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index d720ced8..67c2215a 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -2,6 +2,11 @@ import cupy as cp # pylint: disable=E0401 import numpy as np +from scipy import sparse + +name = "cupy" + +np = cp GRIDDIM, BLOCKDIM = 1024, 128 GRIDDIM_2D = (1024, 1024) @@ -684,3 +689,38 @@ def _determined_outcome(state, q, nqubits): True, ) return state, state[dim * dim - 1].astype(cp.uint) + + +def cast(self, x, dtype=None, copy=False): + if dtype is None: + dtype = "complex128" + if cp.sparse.issparse(x): + if dtype != x.dtype: + return x.astype(dtype) + else: + return x + elif sparse.issparse(x): + cls = getattr(cp.sparse, x.__class__.__name__) + return cls(x, dtype=dtype) + elif isinstance(x, cp.ndarray) and copy: + return cp.copy(cp.asarray(x, dtype=dtype)) + else: + return cp.asarray(x, dtype=dtype) + + +def _clifford_pre_execution_reshape(state): + return state.ravel() + + +def _clifford_post_execution_reshape(state, nqubits): + dim = _get_dim(nqubits) + return state.reshape(dim, dim) + + +def identity_density_matrix(nqubits, normalize: bool = True): + n = 1 << nqubits + state = cp.eye(n, dtype="complex128") + cp.cuda.stream.get_current_stream().synchronize() + if normalize: + state /= 2**nqubits + return state.reshape((n, n)) diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index 681881cf..7f065ffb 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -72,14 +72,6 @@ def __init__(self): else: self.set_threads(len(psutil.Process().cpu_affinity())) - class CliffordOperations: - pass - - self.clifford_operations = CliffordOperations() - for operations in (_clifford_operations, clifford_operations_cpu): - for method in dir(operations): - setattr(self.clifford_operations, method, getattr(operations, method)) - def set_precision(self, precision): if precision != self.precision: super().set_precision(precision) diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index 2e8115ab..048f07f6 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -99,16 +99,6 @@ def kernel_loader(name, ktype): # number of available GPUs (for multigpu) self.ngpus = cp.cuda.runtime.getDeviceCount() - from qibojit.backends import clifford_operations_gpu - - class CliffordOperations: - pass - - self.clifford_operations = CliffordOperations() - for operations in (_clifford_operations, clifford_operations_gpu): - for method in dir(operations): - setattr(self.clifford_operations, method, getattr(operations, method)) - def set_precision(self, precision): super().set_precision(precision) if self.dtype == "complex128": @@ -154,13 +144,6 @@ def to_numpy(self, x): def issparse(self, x): return self.sparse.issparse(x) or self.npsparse.issparse(x) - def _clifford_pre_execution_reshape(self, state): - return state.ravel() - - def _clifford_post_execution_reshape(self, state, nqubits): - dim = 2 * nqubits + 1 - return state.reshape(dim, dim) - def zero_state(self, nqubits): n = 1 << nqubits kernel = self.gates.get(f"initial_state_kernel_{self.kernel_type}") From c145667f16b91fca96f327d6ca7276b0d2315fed Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Mon, 19 Feb 2024 11:28:24 +0400 Subject: [PATCH 49/60] fix: removed unused imports --- src/qibojit/backends/cpu.py | 2 -- src/qibojit/backends/gpu.py | 1 - 2 files changed, 3 deletions(-) diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index 7f065ffb..d90371a2 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -1,13 +1,11 @@ import numpy as np from numba import njit -from qibo.backends import _clifford_operations from qibo.backends.numpy import NumpyBackend from qibo.config import log from qibo.gates.abstract import ParametrizedGate from qibo.gates.channels import ReadoutErrorChannel from qibo.gates.special import FusedGate -from qibojit.backends import clifford_operations_cpu from qibojit.backends.matrices import CustomMatrices GATE_OPS = { diff --git a/src/qibojit/backends/gpu.py b/src/qibojit/backends/gpu.py index 048f07f6..c00d233c 100644 --- a/src/qibojit/backends/gpu.py +++ b/src/qibojit/backends/gpu.py @@ -1,5 +1,4 @@ import numpy as np -from qibo.backends import _clifford_operations from qibo.backends.numpy import NumpyBackend from qibo.config import log, raise_error From dc23b690bb831f27cae1661bb6a872a1e02aed6f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Feb 2024 08:39:04 +0100 Subject: [PATCH 50/60] chore: Remove unused Numba import --- src/qibojit/backends/cpu.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibojit/backends/cpu.py b/src/qibojit/backends/cpu.py index d90371a2..4ae8deaf 100644 --- a/src/qibojit/backends/cpu.py +++ b/src/qibojit/backends/cpu.py @@ -1,5 +1,4 @@ import numpy as np -from numba import njit from qibo.backends.numpy import NumpyBackend from qibo.config import log from qibo.gates.abstract import ParametrizedGate From 7b13ea386f5efd641a230b26abd7d35bf12fec45 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 21 Feb 2024 10:09:17 +0400 Subject: [PATCH 51/60] build: changed qibo dependency --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index dc8edaa1..485605a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ classifiers=[ [tool.poetry.dependencies] python=">=3.9.0,<3.12" numba=">=0.51.0" -qibo={ git = "https://github.com/qiboteam/qibo.git", branch = "clifford_simulator_numba" } +qibo=">=0.2.4" scipy = "^1.10.1" psutil = "^5.9.5" From 6cc064b786f8df578e382f78e5798a5909e94a54 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 21 Feb 2024 10:12:45 +0400 Subject: [PATCH 52/60] build: updated lock --- poetry.lock | 140 +++++++++++++++++++++++++--------------------------- 1 file changed, 68 insertions(+), 72 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8db772bc..bf8c5d23 100644 --- a/poetry.lock +++ b/poetry.lock @@ -61,63 +61,63 @@ files = [ [[package]] name = "coverage" -version = "7.4.1" +version = "7.4.2" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, - {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, - {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, - {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, - {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, - {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, - {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, - {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, - {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, - {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, - {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, - {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, - {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, - {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, + {file = "coverage-7.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf54c3e089179d9d23900e3efc86d46e4431188d9a657f345410eecdd0151f50"}, + {file = "coverage-7.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe6e43c8b510719b48af7db9631b5fbac910ade4bd90e6378c85ac5ac706382c"}, + {file = "coverage-7.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b98c89db1b150d851a7840142d60d01d07677a18f0f46836e691c38134ed18b"}, + {file = "coverage-7.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f9683be6a5b19cd776ee4e2f2ffb411424819c69afab6b2db3a0a364ec6642"}, + {file = "coverage-7.4.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cdcbf7b9cb83fe047ee09298e25b1cd1636824067166dc97ad0543b079d22f"}, + {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2599972b21911111114100d362aea9e70a88b258400672626efa2b9e2179609c"}, + {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ef00d31b7569ed3cb2036f26565f1984b9fc08541731ce01012b02a4c238bf03"}, + {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:20a875bfd8c282985c4720c32aa05056f77a68e6d8bbc5fe8632c5860ee0b49b"}, + {file = "coverage-7.4.2-cp310-cp310-win32.whl", hash = "sha256:b3f2b1eb229f23c82898eedfc3296137cf1f16bb145ceab3edfd17cbde273fb7"}, + {file = "coverage-7.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7df95fdd1432a5d2675ce630fef5f239939e2b3610fe2f2b5bf21fa505256fa3"}, + {file = "coverage-7.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8ddbd158e069dded57738ea69b9744525181e99974c899b39f75b2b29a624e2"}, + {file = "coverage-7.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81a5fb41b0d24447a47543b749adc34d45a2cf77b48ca74e5bf3de60a7bd9edc"}, + {file = "coverage-7.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2412e98e70f16243be41d20836abd5f3f32edef07cbf8f407f1b6e1ceae783ac"}, + {file = "coverage-7.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb79414c15c6f03f56cc68fa06994f047cf20207c31b5dad3f6bab54a0f66ef"}, + {file = "coverage-7.4.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf89ab85027427d351f1de918aff4b43f4eb5f33aff6835ed30322a86ac29c9e"}, + {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a178b7b1ac0f1530bb28d2e51f88c0bab3e5949835851a60dda80bff6052510c"}, + {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:06fe398145a2e91edaf1ab4eee66149c6776c6b25b136f4a86fcbbb09512fd10"}, + {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:18cac867950943fe93d6cd56a67eb7dcd2d4a781a40f4c1e25d6f1ed98721a55"}, + {file = "coverage-7.4.2-cp311-cp311-win32.whl", hash = "sha256:f72cdd2586f9a769570d4b5714a3837b3a59a53b096bb954f1811f6a0afad305"}, + {file = "coverage-7.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:d779a48fac416387dd5673fc5b2d6bd903ed903faaa3247dc1865c65eaa5a93e"}, + {file = "coverage-7.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adbdfcda2469d188d79771d5696dc54fab98a16d2ef7e0875013b5f56a251047"}, + {file = "coverage-7.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ac4bab32f396b03ebecfcf2971668da9275b3bb5f81b3b6ba96622f4ef3f6e17"}, + {file = "coverage-7.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:006d220ba2e1a45f1de083d5022d4955abb0aedd78904cd5a779b955b019ec73"}, + {file = "coverage-7.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3733545eb294e5ad274abe131d1e7e7de4ba17a144505c12feca48803fea5f64"}, + {file = "coverage-7.4.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42a9e754aa250fe61f0f99986399cec086d7e7a01dd82fd863a20af34cbce962"}, + {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2ed37e16cf35c8d6e0b430254574b8edd242a367a1b1531bd1adc99c6a5e00fe"}, + {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b953275d4edfab6cc0ed7139fa773dfb89e81fee1569a932f6020ce7c6da0e8f"}, + {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32b4ab7e6c924f945cbae5392832e93e4ceb81483fd6dc4aa8fb1a97b9d3e0e1"}, + {file = "coverage-7.4.2-cp312-cp312-win32.whl", hash = "sha256:f5df76c58977bc35a49515b2fbba84a1d952ff0ec784a4070334dfbec28a2def"}, + {file = "coverage-7.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:34423abbaad70fea9d0164add189eabaea679068ebdf693baa5c02d03e7db244"}, + {file = "coverage-7.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b11f9c6587668e495cc7365f85c93bed34c3a81f9f08b0920b87a89acc13469"}, + {file = "coverage-7.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:51593a1f05c39332f623d64d910445fdec3d2ac2d96b37ce7f331882d5678ddf"}, + {file = "coverage-7.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69f1665165ba2fe7614e2f0c1aed71e14d83510bf67e2ee13df467d1c08bf1e8"}, + {file = "coverage-7.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3c8bbb95a699c80a167478478efe5e09ad31680931ec280bf2087905e3b95ec"}, + {file = "coverage-7.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:175f56572f25e1e1201d2b3e07b71ca4d201bf0b9cb8fad3f1dfae6a4188de86"}, + {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8562ca91e8c40864942615b1d0b12289d3e745e6b2da901d133f52f2d510a1e3"}, + {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9a1ef0f173e1a19738f154fb3644f90d0ada56fe6c9b422f992b04266c55d5a"}, + {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f40ac873045db4fd98a6f40387d242bde2708a3f8167bd967ccd43ad46394ba2"}, + {file = "coverage-7.4.2-cp38-cp38-win32.whl", hash = "sha256:d1b750a8409bec61caa7824bfd64a8074b6d2d420433f64c161a8335796c7c6b"}, + {file = "coverage-7.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b4ae777bebaed89e3a7e80c4a03fac434a98a8abb5251b2a957d38fe3fd30088"}, + {file = "coverage-7.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ff7f92ae5a456101ca8f48387fd3c56eb96353588e686286f50633a611afc95"}, + {file = "coverage-7.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:861d75402269ffda0b33af94694b8e0703563116b04c681b1832903fac8fd647"}, + {file = "coverage-7.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3507427d83fa961cbd73f11140f4a5ce84208d31756f7238d6257b2d3d868405"}, + {file = "coverage-7.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf711d517e21fb5bc429f5c4308fbc430a8585ff2a43e88540264ae87871e36a"}, + {file = "coverage-7.4.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c00e54f0bd258ab25e7f731ca1d5144b0bf7bec0051abccd2bdcff65fa3262c9"}, + {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f8e845d894e39fb53834da826078f6dc1a933b32b1478cf437007367efaf6f6a"}, + {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:840456cb1067dc350af9080298c7c2cfdddcedc1cb1e0b30dceecdaf7be1a2d3"}, + {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c11ca2df2206a4e3e4c4567f52594637392ed05d7c7fb73b4ea1c658ba560265"}, + {file = "coverage-7.4.2-cp39-cp39-win32.whl", hash = "sha256:3ff5bdb08d8938d336ce4088ca1a1e4b6c8cd3bef8bb3a4c0eb2f37406e49643"}, + {file = "coverage-7.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:ac9e95cefcf044c98d4e2c829cd0669918585755dd9a92e28a1a7012322d0a95"}, + {file = "coverage-7.4.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:f593a4a90118d99014517c2679e04a4ef5aee2d81aa05c26c734d271065efcb6"}, + {file = "coverage-7.4.2.tar.gz", hash = "sha256:1a5ee18e3a8d766075ce9314ed1cb695414bae67df6a4b0805f5137d93d6f1cb"}, ] [package.dependencies] @@ -597,26 +597,22 @@ test = ["coverage (>=7.2.7)", "pytest-mock (>=3.10)"] [[package]] name = "qibo" -version = "0.2.5" +version = "0.2.4" description = "A framework for quantum computing with hardware acceleration." optional = false python-versions = ">=3.9,<3.12" -files = [] -develop = false +files = [ + {file = "qibo-0.2.4-py3-none-any.whl", hash = "sha256:5aaf7693004d8106eff3cc614e20ff03e7016742ab129e7ece76c84b3deb7366"}, + {file = "qibo-0.2.4.tar.gz", hash = "sha256:8ab8519b107fdfa57a7aa19d9243403437ceb4a776454816ce3071a00bdc15ff"}, +] [package.dependencies] -cma = "^3.3.0" -hyperopt = "^0.2.7" -joblib = "^1.2.0" -scipy = "^1.10.1" -sympy = "^1.11.1" -tabulate = "^0.9.0" - -[package.source] -type = "git" -url = "https://github.com/qiboteam/qibo.git" -reference = "clifford_simulator_numba" -resolved_reference = "9d15645e6fe3a3629bedd0ab3d95541f71d75e9a" +cma = ">=3.3.0,<4.0.0" +hyperopt = ">=0.2.7,<0.3.0" +joblib = ">=1.2.0,<2.0.0" +scipy = ">=1.10.1,<2.0.0" +sympy = ">=1.11.1,<2.0.0" +tabulate = ">=0.9.0,<0.10.0" [[package]] name = "scipy" @@ -723,13 +719,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.1" +version = "4.66.2" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, ] [package.dependencies] @@ -834,4 +830,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.9.0,<3.12" -content-hash = "372112a05578a3d828cf79825e364d099074f147d11dacf9e1c278c052120c5c" +content-hash = "4e399a6215b886743d8caec2542b9d615a164f8ba45fea13f639a721bb6e832c" From 2e292d4df7c57597986ef821061e5fdce5d49097 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 21 Feb 2024 11:12:20 +0400 Subject: [PATCH 53/60] fix: added alternative signature to rowsum for windows --- src/qibojit/backends/clifford_operations_cpu.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 7f9a904f..422f4cb4 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -262,7 +262,13 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): @njit( - "b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", parallel=True, cache=True, fastmath=True + [ + "b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", + "b1[:,:](b1[:,:], u8[:], u8[:], i8, b1)", + ], + parallel=True, + cache=True, + fastmath=True, ) def _rowsum(symplectic_matrix, h, i, nqubits, determined=False): xi, xh = symplectic_matrix[i, :nqubits], symplectic_matrix[h, :nqubits] From 3e0505d52b0890a484ca57cae3b5ff8deb7e9949 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 21 Feb 2024 11:47:20 +0400 Subject: [PATCH 54/60] fix: changed rowsum signature --- src/qibojit/backends/clifford_operations_cpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 422f4cb4..0712eed4 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -264,7 +264,7 @@ def CY(symplectic_matrix, control_q, target_q, nqubits): @njit( [ "b1[:,:](b1[:,:], u8[:], u8[:], u8, b1)", - "b1[:,:](b1[:,:], u8[:], u8[:], i8, b1)", + "b1[:,:](b1[:,:], u4[:], u4[:], u4, b1)", ], parallel=True, cache=True, From a6b0e26514c58c2315161e54604182f9d114749d Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Thu, 22 Feb 2024 11:02:32 +0400 Subject: [PATCH 55/60] fix: removed self from cast for cupy --- src/qibojit/backends/clifford_operations_gpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 67c2215a..49bfbd25 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -691,7 +691,7 @@ def _determined_outcome(state, q, nqubits): return state, state[dim * dim - 1].astype(cp.uint) -def cast(self, x, dtype=None, copy=False): +def cast(x, dtype=None, copy=False): if dtype is None: dtype = "complex128" if cp.sparse.issparse(x): From 4539ab719358efce75e215b42759d49891a160c3 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Fri, 23 Feb 2024 09:04:54 +0400 Subject: [PATCH 56/60] `pylint` suggestions --- src/qibojit/backends/clifford_operations_cpu.py | 10 ++++------ src/qibojit/backends/clifford_operations_gpu.py | 2 ++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 0712eed4..603dbc9f 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -1,10 +1,8 @@ +"""Set of custom Numba operations for the Clifford backend.""" + import numpy as np from numba import njit, prange, uint64 -name = "numba" - -np = np - @njit("b1[:,:](b1[:,:], u8, u8)", parallel=True, cache=True) def H(symplectic_matrix, q, nqubits): @@ -279,9 +277,9 @@ def _rowsum(symplectic_matrix, h, i, nqubits, determined=False): g_zi_zh = xi.copy() for j in prange(len(h)): # pylint: disable=not-an-iterable exp = np.zeros(nqubits, dtype=uint64) - x1_eq_z1 = (xi[j] ^ zi[j]) == False + x1_eq_z1 = (xi[j] ^ zi[j]) is False x1_neq_z1 = ~x1_eq_z1 - x1_eq_0 = xi[j] == False + x1_eq_0 = xi[j] is False x1_eq_1 = ~x1_eq_0 ind2 = x1_eq_z1 & x1_eq_1 ind3 = x1_eq_1 & x1_neq_z1 diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 49bfbd25..ac16debf 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -1,3 +1,5 @@ +"""Set of custom CuPy operations for the Clifford backend.""" + from functools import cache import cupy as cp # pylint: disable=E0401 From 7c4f22b796b59470ba4c4d175b5ba42f19786105 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi <45011234+BrunoLiegiBastonLiegi@users.noreply.github.com> Date: Fri, 23 Feb 2024 09:24:23 +0400 Subject: [PATCH 57/60] Update src/qibojit/backends/clifford_operations_gpu.py Co-authored-by: Renato Mello --- src/qibojit/backends/clifford_operations_gpu.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index ac16debf..07a3479d 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -696,18 +696,20 @@ def _determined_outcome(state, q, nqubits): def cast(x, dtype=None, copy=False): if dtype is None: dtype = "complex128" + if cp.sparse.issparse(x): if dtype != x.dtype: return x.astype(dtype) - else: - return x - elif sparse.issparse(x): + return x + + if sparse.issparse(x): cls = getattr(cp.sparse, x.__class__.__name__) return cls(x, dtype=dtype) - elif isinstance(x, cp.ndarray) and copy: + + if isinstance(x, cp.ndarray) and copy: return cp.copy(cp.asarray(x, dtype=dtype)) - else: - return cp.asarray(x, dtype=dtype) + + return cp.asarray(x, dtype=dtype) def _clifford_pre_execution_reshape(state): From a1405fe6f1b1b250a4c5ee6af8dc896028efd16a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 05:24:29 +0000 Subject: [PATCH 58/60] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibojit/backends/clifford_operations_gpu.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 07a3479d..438ea794 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -701,14 +701,14 @@ def cast(x, dtype=None, copy=False): if dtype != x.dtype: return x.astype(dtype) return x - + if sparse.issparse(x): cls = getattr(cp.sparse, x.__class__.__name__) return cls(x, dtype=dtype) - + if isinstance(x, cp.ndarray) and copy: return cp.copy(cp.asarray(x, dtype=dtype)) - + return cp.asarray(x, dtype=dtype) From 0ff0e505e9422217ff2a4d8327d845fa47d18928 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Fri, 23 Feb 2024 10:05:47 +0400 Subject: [PATCH 59/60] fix: revert some pylint suggestions --- src/qibojit/backends/clifford_operations_cpu.py | 4 ++-- src/qibojit/backends/clifford_operations_gpu.py | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/qibojit/backends/clifford_operations_cpu.py b/src/qibojit/backends/clifford_operations_cpu.py index 603dbc9f..9d595165 100644 --- a/src/qibojit/backends/clifford_operations_cpu.py +++ b/src/qibojit/backends/clifford_operations_cpu.py @@ -277,9 +277,9 @@ def _rowsum(symplectic_matrix, h, i, nqubits, determined=False): g_zi_zh = xi.copy() for j in prange(len(h)): # pylint: disable=not-an-iterable exp = np.zeros(nqubits, dtype=uint64) - x1_eq_z1 = (xi[j] ^ zi[j]) is False + x1_eq_z1 = (xi[j] ^ zi[j]) == False x1_neq_z1 = ~x1_eq_z1 - x1_eq_0 = xi[j] is False + x1_eq_0 = xi[j] == False x1_eq_1 = ~x1_eq_0 ind2 = x1_eq_z1 & x1_eq_1 ind3 = x1_eq_1 & x1_neq_z1 diff --git a/src/qibojit/backends/clifford_operations_gpu.py b/src/qibojit/backends/clifford_operations_gpu.py index 438ea794..1039c2bc 100644 --- a/src/qibojit/backends/clifford_operations_gpu.py +++ b/src/qibojit/backends/clifford_operations_gpu.py @@ -3,11 +3,8 @@ from functools import cache import cupy as cp # pylint: disable=E0401 -import numpy as np from scipy import sparse -name = "cupy" - np = cp GRIDDIM, BLOCKDIM = 1024, 128 From 95353c32b057e0f1419df1cfdc2f5b21657f3726 Mon Sep 17 00:00:00 2001 From: BrunoLiegiBastonLiegi Date: Mon, 26 Feb 2024 20:20:17 +0400 Subject: [PATCH 60/60] cov: omitting clifford_operations from coverage --- poetry.lock | 184 ++++++++++++++++++++++++++++++++----------------- pyproject.toml | 5 ++ 2 files changed, 124 insertions(+), 65 deletions(-) diff --git a/poetry.lock b/poetry.lock index c295cf9a..8bd8dfb1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "appnope" version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -15,6 +16,7 @@ files = [ name = "astroid" version = "2.15.8" description = "An abstract syntax tree for Python with inference support." +category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -34,6 +36,7 @@ wrapt = [ name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" +category = "dev" optional = false python-versions = "*" files = [ @@ -45,6 +48,7 @@ files = [ name = "cloudpickle" version = "3.0.0" description = "Pickler class to extend the standard pickle.Pickler functionality" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -56,6 +60,7 @@ files = [ name = "cma" version = "3.3.0" description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python" +category = "main" optional = false python-versions = "*" files = [ @@ -74,6 +79,7 @@ plotting = ["matplotlib"] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -83,63 +89,64 @@ files = [ [[package]] name = "coverage" -version = "7.4.2" +version = "7.4.3" description = "Code coverage measurement for Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf54c3e089179d9d23900e3efc86d46e4431188d9a657f345410eecdd0151f50"}, - {file = "coverage-7.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe6e43c8b510719b48af7db9631b5fbac910ade4bd90e6378c85ac5ac706382c"}, - {file = "coverage-7.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b98c89db1b150d851a7840142d60d01d07677a18f0f46836e691c38134ed18b"}, - {file = "coverage-7.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f9683be6a5b19cd776ee4e2f2ffb411424819c69afab6b2db3a0a364ec6642"}, - {file = "coverage-7.4.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cdcbf7b9cb83fe047ee09298e25b1cd1636824067166dc97ad0543b079d22f"}, - {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2599972b21911111114100d362aea9e70a88b258400672626efa2b9e2179609c"}, - {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ef00d31b7569ed3cb2036f26565f1984b9fc08541731ce01012b02a4c238bf03"}, - {file = "coverage-7.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:20a875bfd8c282985c4720c32aa05056f77a68e6d8bbc5fe8632c5860ee0b49b"}, - {file = "coverage-7.4.2-cp310-cp310-win32.whl", hash = "sha256:b3f2b1eb229f23c82898eedfc3296137cf1f16bb145ceab3edfd17cbde273fb7"}, - {file = "coverage-7.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7df95fdd1432a5d2675ce630fef5f239939e2b3610fe2f2b5bf21fa505256fa3"}, - {file = "coverage-7.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8ddbd158e069dded57738ea69b9744525181e99974c899b39f75b2b29a624e2"}, - {file = "coverage-7.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81a5fb41b0d24447a47543b749adc34d45a2cf77b48ca74e5bf3de60a7bd9edc"}, - {file = "coverage-7.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2412e98e70f16243be41d20836abd5f3f32edef07cbf8f407f1b6e1ceae783ac"}, - {file = "coverage-7.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb79414c15c6f03f56cc68fa06994f047cf20207c31b5dad3f6bab54a0f66ef"}, - {file = "coverage-7.4.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf89ab85027427d351f1de918aff4b43f4eb5f33aff6835ed30322a86ac29c9e"}, - {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a178b7b1ac0f1530bb28d2e51f88c0bab3e5949835851a60dda80bff6052510c"}, - {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:06fe398145a2e91edaf1ab4eee66149c6776c6b25b136f4a86fcbbb09512fd10"}, - {file = "coverage-7.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:18cac867950943fe93d6cd56a67eb7dcd2d4a781a40f4c1e25d6f1ed98721a55"}, - {file = "coverage-7.4.2-cp311-cp311-win32.whl", hash = "sha256:f72cdd2586f9a769570d4b5714a3837b3a59a53b096bb954f1811f6a0afad305"}, - {file = "coverage-7.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:d779a48fac416387dd5673fc5b2d6bd903ed903faaa3247dc1865c65eaa5a93e"}, - {file = "coverage-7.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adbdfcda2469d188d79771d5696dc54fab98a16d2ef7e0875013b5f56a251047"}, - {file = "coverage-7.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ac4bab32f396b03ebecfcf2971668da9275b3bb5f81b3b6ba96622f4ef3f6e17"}, - {file = "coverage-7.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:006d220ba2e1a45f1de083d5022d4955abb0aedd78904cd5a779b955b019ec73"}, - {file = "coverage-7.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3733545eb294e5ad274abe131d1e7e7de4ba17a144505c12feca48803fea5f64"}, - {file = "coverage-7.4.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42a9e754aa250fe61f0f99986399cec086d7e7a01dd82fd863a20af34cbce962"}, - {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2ed37e16cf35c8d6e0b430254574b8edd242a367a1b1531bd1adc99c6a5e00fe"}, - {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b953275d4edfab6cc0ed7139fa773dfb89e81fee1569a932f6020ce7c6da0e8f"}, - {file = "coverage-7.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32b4ab7e6c924f945cbae5392832e93e4ceb81483fd6dc4aa8fb1a97b9d3e0e1"}, - {file = "coverage-7.4.2-cp312-cp312-win32.whl", hash = "sha256:f5df76c58977bc35a49515b2fbba84a1d952ff0ec784a4070334dfbec28a2def"}, - {file = "coverage-7.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:34423abbaad70fea9d0164add189eabaea679068ebdf693baa5c02d03e7db244"}, - {file = "coverage-7.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b11f9c6587668e495cc7365f85c93bed34c3a81f9f08b0920b87a89acc13469"}, - {file = "coverage-7.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:51593a1f05c39332f623d64d910445fdec3d2ac2d96b37ce7f331882d5678ddf"}, - {file = "coverage-7.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69f1665165ba2fe7614e2f0c1aed71e14d83510bf67e2ee13df467d1c08bf1e8"}, - {file = "coverage-7.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3c8bbb95a699c80a167478478efe5e09ad31680931ec280bf2087905e3b95ec"}, - {file = "coverage-7.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:175f56572f25e1e1201d2b3e07b71ca4d201bf0b9cb8fad3f1dfae6a4188de86"}, - {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8562ca91e8c40864942615b1d0b12289d3e745e6b2da901d133f52f2d510a1e3"}, - {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9a1ef0f173e1a19738f154fb3644f90d0ada56fe6c9b422f992b04266c55d5a"}, - {file = "coverage-7.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f40ac873045db4fd98a6f40387d242bde2708a3f8167bd967ccd43ad46394ba2"}, - {file = "coverage-7.4.2-cp38-cp38-win32.whl", hash = "sha256:d1b750a8409bec61caa7824bfd64a8074b6d2d420433f64c161a8335796c7c6b"}, - {file = "coverage-7.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b4ae777bebaed89e3a7e80c4a03fac434a98a8abb5251b2a957d38fe3fd30088"}, - {file = "coverage-7.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ff7f92ae5a456101ca8f48387fd3c56eb96353588e686286f50633a611afc95"}, - {file = "coverage-7.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:861d75402269ffda0b33af94694b8e0703563116b04c681b1832903fac8fd647"}, - {file = "coverage-7.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3507427d83fa961cbd73f11140f4a5ce84208d31756f7238d6257b2d3d868405"}, - {file = "coverage-7.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf711d517e21fb5bc429f5c4308fbc430a8585ff2a43e88540264ae87871e36a"}, - {file = "coverage-7.4.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c00e54f0bd258ab25e7f731ca1d5144b0bf7bec0051abccd2bdcff65fa3262c9"}, - {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f8e845d894e39fb53834da826078f6dc1a933b32b1478cf437007367efaf6f6a"}, - {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:840456cb1067dc350af9080298c7c2cfdddcedc1cb1e0b30dceecdaf7be1a2d3"}, - {file = "coverage-7.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c11ca2df2206a4e3e4c4567f52594637392ed05d7c7fb73b4ea1c658ba560265"}, - {file = "coverage-7.4.2-cp39-cp39-win32.whl", hash = "sha256:3ff5bdb08d8938d336ce4088ca1a1e4b6c8cd3bef8bb3a4c0eb2f37406e49643"}, - {file = "coverage-7.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:ac9e95cefcf044c98d4e2c829cd0669918585755dd9a92e28a1a7012322d0a95"}, - {file = "coverage-7.4.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:f593a4a90118d99014517c2679e04a4ef5aee2d81aa05c26c734d271065efcb6"}, - {file = "coverage-7.4.2.tar.gz", hash = "sha256:1a5ee18e3a8d766075ce9314ed1cb695414bae67df6a4b0805f5137d93d6f1cb"}, + {file = "coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6"}, + {file = "coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2"}, + {file = "coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94"}, + {file = "coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0"}, + {file = "coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47"}, + {file = "coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840"}, + {file = "coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3"}, + {file = "coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e"}, + {file = "coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10"}, + {file = "coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a"}, + {file = "coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352"}, + {file = "coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914"}, + {file = "coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454"}, + {file = "coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1"}, + {file = "coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f"}, + {file = "coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9"}, + {file = "coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f"}, + {file = "coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45"}, + {file = "coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9"}, + {file = "coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa"}, + {file = "coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51"}, + {file = "coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52"}, ] [package.dependencies] @@ -152,6 +159,7 @@ toml = ["tomli"] name = "decorator" version = "5.1.1" description = "Decorators for Humans" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -163,6 +171,7 @@ files = [ name = "dill" version = "0.3.8" description = "serialize all of Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -178,6 +187,7 @@ profile = ["gprof2dot (>=2022.7.29)"] name = "exceptiongroup" version = "1.2.0" description = "Backport of PEP 654 (exception groups)" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -190,18 +200,21 @@ test = ["pytest (>=6)"] [[package]] name = "future" -version = "0.18.3" +version = "1.0.0" description = "Clean single-source support for Python 3 and 2" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, + {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, + {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, ] [[package]] name = "hyperopt" version = "0.2.7" description = "Distributed Asynchronous Hyperparameter Optimization" +category = "main" optional = false python-versions = "*" files = [ @@ -229,6 +242,7 @@ sparktrials = ["pyspark"] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -240,6 +254,7 @@ files = [ name = "ipython" version = "7.34.0" description = "IPython: Productive Interactive Computing" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -276,6 +291,7 @@ test = ["ipykernel", "nbformat", "nose (>=0.10.1)", "numpy (>=1.17)", "pygments" name = "isort" version = "5.13.2" description = "A Python utility / library to sort Python imports." +category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -290,6 +306,7 @@ colors = ["colorama (>=0.4.6)"] name = "jedi" version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -309,6 +326,7 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "joblib" version = "1.3.2" description = "Lightweight pipelining with Python functions" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -320,6 +338,7 @@ files = [ name = "lazy-object-proxy" version = "1.10.0" description = "A fast and thorough lazy object proxy." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -366,6 +385,7 @@ files = [ name = "llvmlite" version = "0.42.0" description = "lightweight wrapper around basic LLVM functionality" +category = "main" optional = false python-versions = ">=3.9" files = [ @@ -396,6 +416,7 @@ files = [ name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -410,6 +431,7 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -421,6 +443,7 @@ files = [ name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" +category = "main" optional = false python-versions = "*" files = [ @@ -438,6 +461,7 @@ tests = ["pytest (>=4.6)"] name = "networkx" version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" +category = "main" optional = false python-versions = ">=3.9" files = [ @@ -456,6 +480,7 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] name = "numba" version = "0.59.0" description = "compiling Python code using LLVM" +category = "main" optional = false python-versions = ">=3.9" files = [ @@ -483,13 +508,14 @@ files = [ ] [package.dependencies] -llvmlite = "==0.42.*" +llvmlite = ">=0.42.0dev0,<0.43" numpy = ">=1.22,<1.27" [[package]] name = "numpy" version = "1.26.4" description = "Fundamental package for array computing in Python" +category = "main" optional = false python-versions = ">=3.9" files = [ @@ -535,6 +561,7 @@ files = [ name = "packaging" version = "23.2" description = "Core utilities for Python packages" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -546,6 +573,7 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -561,6 +589,7 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "pexpect" version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." +category = "dev" optional = false python-versions = "*" files = [ @@ -575,6 +604,7 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" optional = false python-versions = "*" files = [ @@ -586,6 +616,7 @@ files = [ name = "platformdirs" version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -601,6 +632,7 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest- name = "pluggy" version = "1.4.0" description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -616,6 +648,7 @@ testing = ["pytest", "pytest-benchmark"] name = "prompt-toolkit" version = "3.0.43" description = "Library for building powerful interactive command lines in Python" +category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -630,6 +663,7 @@ wcwidth = "*" name = "psutil" version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -658,6 +692,7 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" +category = "dev" optional = false python-versions = "*" files = [ @@ -669,6 +704,7 @@ files = [ name = "py4j" version = "0.10.9.7" description = "Enables Python programs to dynamically access arbitrary Java objects" +category = "main" optional = false python-versions = "*" files = [ @@ -680,6 +716,7 @@ files = [ name = "pygments" version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -695,6 +732,7 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pylint" version = "2.17.7" description = "python code static checker" +category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -724,6 +762,7 @@ testutils = ["gitpython (>3)"] name = "pytest" version = "7.4.4" description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -746,6 +785,7 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -764,6 +804,7 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-env" version = "0.8.2" description = "py.test plugin that allows you to add environment variables." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -781,6 +822,7 @@ test = ["coverage (>=7.2.7)", "pytest-mock (>=3.10)"] name = "qibo" version = "0.2.4" description = "A framework for quantum computing with hardware acceleration." +category = "main" optional = false python-versions = ">=3.9,<3.12" files = [ @@ -800,6 +842,7 @@ tabulate = ">=0.9.0,<0.10.0" name = "scipy" version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" +category = "main" optional = false python-versions = ">=3.9" files = [ @@ -840,24 +883,26 @@ test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", [[package]] name = "setuptools" -version = "69.1.0" +version = "69.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, - {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, + {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, + {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -869,6 +914,7 @@ files = [ name = "sympy" version = "1.12" description = "Computer algebra system (CAS) in Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -883,6 +929,7 @@ mpmath = ">=0.19" name = "tabulate" version = "0.9.0" description = "Pretty-print tabular data" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -897,6 +944,7 @@ widechars = ["wcwidth"] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -908,6 +956,7 @@ files = [ name = "tomlkit" version = "0.12.3" description = "Style preserving TOML library" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -919,6 +968,7 @@ files = [ name = "tqdm" version = "4.66.2" description = "Fast, Extensible Progress Meter" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -939,6 +989,7 @@ telegram = ["requests"] name = "traitlets" version = "5.14.1" description = "Traitlets Python configuration system" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -952,19 +1003,21 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] name = "wcwidth" version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" optional = false python-versions = "*" files = [ @@ -976,6 +1029,7 @@ files = [ name = "wrapt" version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." +category = "dev" optional = false python-versions = ">=3.6" files = [ diff --git a/pyproject.toml b/pyproject.toml index 7c34f40d..ee61ec9f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,11 @@ output-format = "colorized" [tool.pylint.reports] output-format = "colorized" +[tool.coverage.run] +omit = [ + "src/qibojit/backends/clifford_operations*", +] + [tool.pytest.ini_options] testpaths = ['src/qibojit/tests/'] addopts = ['--cov=qibojit', '--cov-report=xml']