Skip to main content

Einsum tree operations.

Project description

The etops package provides a Python interface for the Tiled Execution IR (TEIR). It enables users to define, configure, optimize, and execute complex tensor contractions and elementwise operations. The package is built on top of the einsum_ir C++ backend and exposes advanced features such as dimension fusion, dimension splitting, and backend-specific optimizations.

Main Features

  • Abstractions for tensor operations and configuration

  • Support for multiple data types (float32, float64)

  • Primitive operations: zero, copy, relu, gemm, brgemm, etc.

  • Dimension execution strategies: primitive, sequential, shared, space-filling curve (SFC)

  • Dimension and stride configuration for advanced memory layouts

  • Interface for built-in contraction optimizer

  • Pythonic API with dataclass-based configuration

Installation

Install the package using pip:

pip install etops

Unary Examples

Below are some examples showing how to configure and execute unary tensor operations:

import etops

# ---------------------------------------
# First example:
#   Matrix transpose using copy primitive
#   Compares the result with NumPy
# ---------------------------------------
# Define a transpose configuration
top_config = etops.TensorOperationConfig(
    backend    =   "tpp",
    data_type  =   etops.float32,
    prim_first =   etops.prim.none,
    prim_main  =   etops.prim.copy,
    prim_last  =   etops.prim.none,
    dim_types  =   (etops.dim.c,     etops.dim.c    ),
    exec_types =   (etops.exec.prim, etops.exec.prim),
    dim_sizes  =   (3,               4              ),
    strides    = (((4,               1               ),   # in
                   (1,               3               )),) # out
)

# Create the TensorOperation instance
top = etops.TensorOperation(top_config)

# Create input and output arrays
import numpy as np
A = np.random.randn(3,4).astype(np.float32)
B = np.random.randn(4,3).astype(np.float32)

top.execute(A, None, B)

B_np = np.einsum("ij->ji", A)

# Check correctness
error_abs = np.max( np.abs(B - B_np) )
print("Matrix Transpose using copy primitive:")
print(f"  Max absolute error: {error_abs:.6e}")

# -------------------------------------------------
# Second example:
#   Permutation of a 4D tensor using copy primitive
#   Compares the result with NumPy
# -------------------------------------------------
# Define a permutation configuration
perm_config = etops.TensorOperationConfig(
    backend     =   "tpp",
    data_type   =   etops.float32,
    prim_first  =   etops.prim.none,
    prim_main   =   etops.prim.copy,
    prim_last   =   etops.prim.none,
    dim_types   =   (etops.dim.c,    etops.dim.c,     etops.dim.c,     etops.dim.c    ),
    exec_types  =   (etops.exec.seq, etops.exec.seq,  etops.exec.prim, etops.exec.prim),
    dim_sizes   =   (2,              4,               3,               5              ),
    strides     = (((3*4*5,          5,               4*5,             1              ),   # in
                    (3,              2*3,             1,               4*2*3          )),) # out
)

# Create the TensorOperation instance
perm_op = etops.TensorOperation(perm_config)

# Create input and output arrays
A = np.random.randn(2,3,4,5).astype(np.float32)
B = np.random.randn(5,4,2,3).astype(np.float32)

perm_op.execute(A, None, B)

B_np = np.einsum("abcd->dcab", A)

# Check correctness
error_abs = np.max( np.abs(B - B_np) )
print("4D Tensor Permutation using copy primitive:")
print(f"  Max absolute error: {error_abs:.6e}")

# -------------------------------------------------
# Third example:
#   Permutation of a 4D tensor using copy primitive
#   Uses the built-in optimization routine
#   Compares the result with NumPy
# -------------------------------------------------
perm_config = etops.TensorOperationConfig(
    data_type   =   etops.float32,
    prim_first  =   etops.prim.none,
    prim_main   =   etops.prim.copy,
    prim_last   =   etops.prim.none,
    dim_types   =   (etops.dim.c,    etops.dim.c,     etops.dim.c,    etops.dim.c   ),
    exec_types  =   (etops.exec.seq, etops.exec.seq,  etops.exec.seq, etops.exec.seq),
    dim_sizes   =   (2,              4,               3,              5             ),
    strides     = (((3*4*5,          5,               4*5,            1             ),   # in
                    (3,              2*3,             1,              4*2*3         )),) # out
)

# Use default optimization config
optimized_config = etops.optimize(perm_config)

# Create the TensorOperation instance
perm_op = etops.TensorOperation(optimized_config)

# Create input and output arrays
A = np.random.randn(2,3,4,5).astype(np.float32)
B = np.random.randn(5,4,2,3).astype(np.float32)

# Execute the operation
perm_op.execute(A, None, B)

B_np = np.einsum("abcd->dcab", A)

# Check correctness
error_abs = np.max( np.abs(B - B_np) )
print("4D Tensor Permutation using optimized copy primitive:")
print(f"  Max absolute error: {error_abs:.6e}")

Binary Examples

Below are some examples showing how to configure and execute binary tensor operations:

import etops

# -----------------------------------------
# First example:
#   Column-major GEMM operation
#   Compares the result with NumPy's einsum
# -----------------------------------------
# Define a column-major GEMM configuration
top_config = etops.TensorOperationConfig(
    backend    =   "tpp",
    data_type  =   etops.float32,
    prim_first =   etops.prim.zero,
    prim_main  =   etops.prim.gemm,
    prim_last  =   etops.prim.none,
    dim_types  =   (etops.dim.m,     etops.dim.n,     etops.dim.k    ),
    exec_types =   (etops.exec.prim, etops.exec.prim, etops.exec.prim),
    dim_sizes  =   (64,              32,              128            ),
    strides    = (((1,               0,               64             ),   # in0
                   (0,               128,             1              ),   # in1
                   (1,               64,              0              )),) # out
)

# Create the TensorOperation instance
top = etops.TensorOperation(top_config)

# Create input and output arrays
import numpy as np
A = np.random.randn(128,64).astype(np.float32)
B = np.random.randn(32,128).astype(np.float32)
C = np.random.randn(32, 64).astype(np.float32)

# Execute the operation
top.execute(A, B, C)

C_np = np.einsum("km,nk->nm", A, B)

# Compute absolute and relative errors
error_abs = np.max( np.abs(C - C_np) )
error_rel = np.max( np.abs(C - C_np) / (np.abs(C_np) + 1e-8) )
print("Column-major GEMM operation:")
print(f"  Max absolute error: {error_abs:.6e}")
print(f"  Max relative error: {error_rel:.6e}")

# -----------------------------------------
# Second example:
#   Batched GEMM operation
#   Compares the result with torch's einsum
# -----------------------------------------
# Define a batched GEMM configuration
batched_config =    etops.TensorOperationConfig(
    backend    =    "tpp",
    data_type  =    etops.float32,
    prim_first =    etops.prim.zero,
    prim_main  =    etops.prim.gemm,
    prim_last  =    etops.prim.none,
    dim_types  =   (etops.dim.c,       etops.dim.m,     etops.dim.n,     etops.dim.k    ),
    exec_types =   (etops.exec.shared, etops.exec.prim, etops.exec.prim, etops.exec.prim),
    dim_sizes  =   (48,                64,              32,              128            ),
    strides    = (((128*64,            1,               0,               64             ),   # in0
                   (32*128,            0,               128,             1              ),   # in1
                   (32*64,             1,               64,              0              )),) # out
)
# Create the batched TensorOperation instance
top = etops.TensorOperation(batched_config)

import torch
# Create input and output arrays
A = torch.randn(48, 128, 64, dtype=torch.float32)
B = torch.randn(48, 32, 128, dtype=torch.float32)
C = torch.randn(48, 32, 64,  dtype=torch.float32)

# Execute the operation
top.execute(A, B, C)

C_torch = torch.einsum("bkm,bnk->bnm", A, B)

# Compute absolute and relative errors
error_abs = torch.max(torch.abs(C - C_torch))
error_rel = torch.max(torch.abs(C - C_torch) / (torch.abs(C_torch) + 1e-8))

print("Batched GEMM operation:")
print(f"  Max absolute error: {error_abs:.6e}")
print(f"  Max relative error: {error_rel:.6e}")

#--------------------------------------------
# Third example:
#   GEMM operation with row-major first input
#   packed to column-major
#   Compares the result with NumPy's einsum
# -------------------------------------------

# Define a row-major GEMM configuration with packing
top_config = etops.TensorOperationConfig(
    backend    =   "tpp",
    data_type  =   etops.float32,
    prim_first =   etops.prim.zero,
    prim_main  =   etops.prim.gemm,
    prim_last  =   etops.prim.none,
    dim_types  =   (etops.dim.m,     etops.dim.n,     etops.dim.k    ),
    exec_types =   (etops.exec.prim, etops.exec.prim, etops.exec.prim),
    dim_sizes  =   (64,              32,              128            ),
    strides    = (((1,               0,               64             ),   # in 0
                   (0,               128,             1              ),   # in 1
                   (1,               64,              0              )),  # out
                  ((128,             0,               1              ),   # packing in 0
                   (0,               0,               0              ),   # packing in 1
                   (0,               0,               0              )),) # packing out
)

# Create the TensorOperation instance
top = etops.TensorOperation(top_config)

# Create input and output arrays
import numpy as np
A = np.random.randn(64,128).astype(np.float32)
B = np.random.randn(32,128).astype(np.float32)
C = np.random.randn(32, 64).astype(np.float32)

# Execute the operation
top.execute(A, B, C)

A_T = np.transpose(A)
C_np = np.einsum("km,nk->nm", A_T, B)

# Compute absolute and relative errors
error_abs = np.max( np.abs(C - C_np) )
error_rel = np.max( np.abs(C - C_np) / (np.abs(C_np) + 1e-8) )
print("GEMM operation with packing:")
print(f"  Max absolute error: {error_abs:.6e}")
print(f"  Max relative error: {error_rel:.6e}")

# -----------------------------------------------
# Fourth example:
#   Batch-reduce GEMM operation with optimization
#   Compares the result with torch's einsum
# -----------------------------------------------
# Define a batch-reduce GEMM configuration
batched_config =   etops.TensorOperationConfig(
    data_type  =   etops.float32,
    prim_first =   etops.prim.zero,
    prim_main  =   etops.prim.gemm,
    prim_last  =   etops.prim.none,
    dim_types  =   (etops.dim.k,    etops.dim.m,    etops.dim.n,    etops.dim.k   ),
    exec_types =   (etops.exec.seq, etops.exec.seq, etops.exec.seq, etops.exec.seq),
    dim_sizes  =   (48,             64,             32,             128           ),
    strides    = (((128*64,         1,              0,              64            ),   # in0
                   (32*128,         0,              128,            1             ),   # in1
                   (0,              1,              64,             0             )),) # out
)

# Optimize the configuration
optimized_config = etops.optimize(
    batched_config,
    {
        "target_m":            16,
        "target_n":            12,
        "target_k":            64,
        "num_threads":         4,
        "br_gemm_support":     True,
        "packed_gemm_support": True
    }
)

# Create the optimized TensorOperation instance
top = etops.TensorOperation(optimized_config)

import torch
# Create input and output arrays
A = torch.randn(48, 128, 64, dtype=torch.float32)
B = torch.randn(48, 32, 128, dtype=torch.float32)
C = torch.randn(    32, 64,  dtype=torch.float32)

# Execute the operation
top.execute(A, B, C)

C_torch = torch.einsum("bkm,bnk->nm", A, B)

# Compute absolute and relative errors
error_abs = torch.max(torch.abs(C - C_torch))
error_rel = torch.max(torch.abs(C - C_torch) / (torch.abs(C_torch) + 1e-8))
print("Batch-reduce GEMM operation:")
print(f"  Max absolute error: {error_abs:.6e}")
print(f"  Max relative error: {error_rel:.6e}")

See the source code and inline documentation for more advanced usage.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

etops-25.11.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

etops-25.11.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

etops-25.11.0-cp314-cp314t-macosx_14_0_arm64.whl (713.2 kB view details)

Uploaded CPython 3.14tmacOS 14.0+ ARM64

etops-25.11.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

etops-25.11.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

etops-25.11.0-cp314-cp314-macosx_14_0_arm64.whl (703.9 kB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

etops-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

etops-25.11.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

etops-25.11.0-cp313-cp313-macosx_14_0_arm64.whl (703.4 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

etops-25.11.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

etops-25.11.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

etops-25.11.0-cp312-cp312-macosx_14_0_arm64.whl (703.4 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

etops-25.11.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

etops-25.11.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

etops-25.11.0-cp311-cp311-macosx_14_0_arm64.whl (702.2 kB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

etops-25.11.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

etops-25.11.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

etops-25.11.0-cp310-cp310-macosx_14_0_arm64.whl (700.6 kB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

etops-25.11.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

etops-25.11.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

etops-25.11.0-cp39-cp39-macosx_14_0_arm64.whl (700.7 kB view details)

Uploaded CPython 3.9macOS 14.0+ ARM64

etops-25.11.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

etops-25.11.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

File details

Details for the file etops-25.11.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0b4dd9aaa31143fcb1db8c0eb892158ee339933bfd6cca1f46a98b5523b07a2c
MD5 61fd641260e668a74c1722d79369354b
BLAKE2b-256 b70fc56aa2f2f293146d6f6b31c3986a4c01684b6a82ace3f8b44ea569440250

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f2c93271067451b578cfce61f98c3fd5f28bb57ea85926b083c8b2315b9616e6
MD5 96dd508368c05a552c4a0e599fb48673
BLAKE2b-256 6657839a49c1a8ee44d8f8f5d96ce9c648dc8fd1b77d93a51a8f3026e1225334

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp314-cp314t-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp314-cp314t-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 386c504e0c6819aff268c8a0dd4414bb24bdceff898f2527a1f0978b72aeba63
MD5 ca5a31c986980f5ee921652d24d65193
BLAKE2b-256 521a4ba0b533ccfc9b232f6a65b6789625b32934d7a1ead5ebd8fa6183456ac1

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp314-cp314t-macosx_14_0_arm64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e5a4ad1e2d197197226dca9983aa1f30d2c95fab2ccc8606218d99fc0db8f0df
MD5 758c0ec4565fdaae7235471497811339
BLAKE2b-256 ec0e795181dffecdc52e73f22f5b596a546f704698b5646c5eca6baef5be5d88

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2255d2db51c92957a9c42def75280564b1a518d3ea0110cd91ca9d0b2d4a501a
MD5 87d5b55968722fcc8d34d545ebff30c4
BLAKE2b-256 1a2f095902f6f6afc490dec9044e0e64a44a353b2c55938481e887b9fbf6a199

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 2dee81fb53106c01893585da987d1fb3808e0df8a61211f0dbd891218928b4c8
MD5 f4951821286f20afa1c54b4629b52c1d
BLAKE2b-256 6a9ca4fc14f3dc2b0a2b312bd9d08e7532140a2bb69851357a1104686b3dda18

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp314-cp314-macosx_14_0_arm64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b6f29b0d14af3f7bedd352b3ca33b2e0b256a8817dacb5f82a00620ae24ff10
MD5 d28790ee1fcab8b0d6702c933e42e4c8
BLAKE2b-256 7bf25015531464b5d98f92160c3530afa2df3f744d38ee445b6bbe013cb5de80

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 76f010ab200dfacaa43b81a79ff2ed450bec04322a0b6d084993b74c947551af
MD5 1afd42d5c1070b9ec1d77feb57a51089
BLAKE2b-256 d5990760ac22bf3b0fabb971338ec315876fb5c997f47476ea390127972087ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f5dbfa75eb304c6307b78aa71018c0aba721b07fe1fdb71168f6373fbe305ee4
MD5 49ab7a2efba51350c47f030d07efab45
BLAKE2b-256 03b8cd31d5d047aaa8747a816416212ffba6fe7e0057008673d289508daa377a

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 40aae01c88052266cd719d25c2701052df2185dc8a90130debbda4739a31a281
MD5 bbcad7842f1a79139d0cdb3c43406d5f
BLAKE2b-256 fc435443b4188a8490b242644cb091bde053bb1e3d65cab01b4c07bf01979375

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 26b3bc6f8c852b8d6401bdab8826258fec9e718fa30fa4bf3e1e16604c8dca43
MD5 879c6dbb1a58da46410026c0d2f5c5eb
BLAKE2b-256 5852538e34c50eea34e538b26e07ac26413916ceb15f1f668a5e5d1e48bed74e

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 3b13d46222590bf1dd3d928c3867b6fccf12f4deb1fe2614b56032a545ae82ff
MD5 d91f7bd117fd525f86e1e8ad782a204b
BLAKE2b-256 54a2357e48e47e8cf1dd82f4a678dc005546d184bd0274aaea25340969129beb

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8dd76f5415c65597c782903a7e9adcde9ecd300a2469b939daa4e258fb11d67a
MD5 9682cecdb3c99533553c984f9f6cfac0
BLAKE2b-256 a55e0fa90b4613f85986c789ada0dde2141f26add6e6418c20044e9300ec41d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a1a42028cfc0127a24c01a1881f36676d1170139b5103d1fb3f2cec2bcd9d3e9
MD5 763978d162bf01551fc214cc0d2b6bda
BLAKE2b-256 b7263fd5a118ac11f3e0b8fcc835ef53ae1d526142485559898123ca992d2ace

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 cb5fdcf55f342875ce5b6852ac677e30fe98ece1e2815468b2eaa089aa31d643
MD5 b8e287cd13f96243b1d0e43cb4187dc2
BLAKE2b-256 ea637ae8c49a7b7d6e1bd3de1e9d3b876d218ac5878f5546ec51554301374087

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b2baa3cb7eefa89c0f0ad0a02d1fe05c1a4bb2cd1ced6025c1dcd031c66a5bd1
MD5 05e8a764e224a841ea981514f77fb1a2
BLAKE2b-256 23d66d251e857df923f1c4dbfdd0abe97a1cf5895e8e746e6ba3973da62c179b

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cbbeedbfa15da505a839ccd1dbbb97ef88aa8c75d79b7a6906af3c0bb31f57f8
MD5 fcd2ebea51a5eecb122ec1600ced5a04
BLAKE2b-256 54e4e0380a92e174d1776eb061f3bd4e78142f71416fa600b9bb58bf5346f40c

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 611f51891d092e02b1aa07322fcf2d41298b6770d44c8e0c8d6ad9c2f80a234a
MD5 b9aea5a85021cadb63684822b8d9e4fc
BLAKE2b-256 926b4978ae1fcdeb6ad1329842fc55c8b68c47c2ca31bce02a1c174471a431b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c6da8b8442cc6768f827e6cad114e6feb6777bd83ab9f6aff699ae055bbded92
MD5 c2abadfadfa1d6fcc783ac6a04204bd4
BLAKE2b-256 7679a2ca592bab1da9532ec789f51695f2fdba170b756f555685988017ab08a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 67a135cd9e675be95240470f91e94963dce3415e4a84a170336e058d52fbe8ac
MD5 b415bea1be5fee67b736b3601d08a73f
BLAKE2b-256 c97ef5c106e1000870f1cd900fd2e4b501063e9473f8e1f8cb546f68049ebed4

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp39-cp39-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp39-cp39-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a1d7a273c171477e25e3d076768196418333f5f8b0f5d057dba510e66acd225d
MD5 d5f1c31ef93eb6df6e9062b9cd50abf7
BLAKE2b-256 246f7307fcb45da79d676cc80198c9ef5a0791e9a10bcd5f9ba11859cb7384c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp39-cp39-macosx_14_0_arm64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a110f055b3d8e877a5fb09131c1d0812c401b02caf0d3e47e9d541294a220a13
MD5 12d8ef75c1e5fddc5244d9717ffd39ab
BLAKE2b-256 c1927d548592633785a479faab0fe6b470c579454c8d6019108449e162a52007

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file etops-25.11.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for etops-25.11.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4e75c52954ef02a6ac30775cc917be1212b8fb32d9e48e56a419307f5508697f
MD5 ab8544b44f1b70857c6bd44845ec4a8e
BLAKE2b-256 37373a189dcd0f3992c39e0c0bdf68034069a45e939da3a6d3360e5bbddef7f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for etops-25.11.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: pypi.yml on scalable-analyses/einsum_ir

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page