etops
=====
The `etops` package provides a Python interface for einsum tree operations. 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:
.. code-block:: bash
pip install etops
Quick Example
-------------
Below is a minimal example showing how to configure and execute tensor operations:
.. code-block:: python
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(
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_in0= (1, 0, 64 ),
strides_in1= (0, 128, 1 ),
strides_out= (1, 64, 0 )
)
# 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(
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_in0= (128*64, 1, 0, 64 ),
strides_in1= (32*128, 0, 128, 1 ),
strides_out= (32*64, 1, 64, 0 )
)
# 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:
# 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_in0= (128*64, 1, 0, 64 ),
strides_in1= (32*128, 0, 128, 1 ),
strides_out= (0, 1, 64, 0 )
)
# Optimize the configuration
optimized_config = etops.optimize( batched_config,
target_m=16,
target_n=12,
target_k=64,
num_threads=1,
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.
Raw data
{
"_id": null,
"home_page": null,
"name": "etops-nightly",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "einsum trees, tensor operations",
"author": null,
"author_email": null,
"download_url": null,
"platform": null,
"description": "etops\n=====\n\nThe `etops` package provides a Python interface for einsum tree operations. 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.\n\nMain Features\n-------------\n- Abstractions for tensor operations and configuration\n- Support for multiple data types (float32, float64)\n- Primitive operations: zero, copy, relu, gemm, brgemm, etc.\n- Dimension execution strategies: primitive, sequential, shared, space-filling curve (SFC)\n- Dimension and stride configuration for advanced memory layouts\n- Interface for built-in contraction optimizer\n- Pythonic API with dataclass-based configuration\n\nInstallation\n------------\nInstall the package using pip:\n\n.. code-block:: bash\n\n pip install etops\n\nQuick Example\n-------------\nBelow is a minimal example showing how to configure and execute tensor operations:\n\n.. code-block:: python\n\n import etops\n\n # -----------------------------------------\n # First example:\n # Column-major GEMM operation\n # Compares the result with NumPy's einsum\n # -----------------------------------------\n # Define a column-major GEMM configuration\n top_config = etops.TensorOperationConfig(\n data_type = etops.float32,\n prim_first = etops.prim.zero,\n prim_main = etops.prim.gemm,\n prim_last = etops.prim.none,\n dim_types = (etops.dim.m, etops.dim.n, etops.dim.k ),\n exec_types = (etops.exec.prim, etops.exec.prim, etops.exec.prim),\n dim_sizes = (64, 32, 128 ),\n strides_in0= (1, 0, 64 ),\n strides_in1= (0, 128, 1 ),\n strides_out= (1, 64, 0 )\n )\n\n # Create the TensorOperation instance\n top = etops.TensorOperation(top_config)\n\n # Create input and output arrays\n import numpy as np\n A = np.random.randn(128,64).astype(np.float32)\n B = np.random.randn(32,128).astype(np.float32)\n C = np.random.randn(32, 64).astype(np.float32)\n\n # Execute the operation\n top.execute(A, B, C)\n\n C_np = np.einsum(\"km,nk->nm\", A, B)\n\n # Compute absolute and relative errors\n error_abs = np.max( np.abs(C - C_np) )\n error_rel = np.max( np.abs(C - C_np) / (np.abs(C_np) + 1e-8) )\n print(\"Column-major GEMM operation:\")\n print(f\" Max absolute error: {error_abs:.6e}\")\n print(f\" Max relative error: {error_rel:.6e}\")\n\n # -----------------------------------------\n # Second example:\n # Batched GEMM operation\n # Compares the result with torch's einsum\n # -----------------------------------------\n # Define a batched GEMM configuration\n batched_config = etops.TensorOperationConfig(\n data_type = etops.float32,\n prim_first = etops.prim.zero,\n prim_main = etops.prim.gemm,\n prim_last = etops.prim.none,\n dim_types = (etops.dim.c, etops.dim.m, etops.dim.n, etops.dim.k ),\n exec_types = (etops.exec.shared, etops.exec.prim, etops.exec.prim, etops.exec.prim),\n dim_sizes = (48, 64, 32, 128 ),\n strides_in0= (128*64, 1, 0, 64 ),\n strides_in1= (32*128, 0, 128, 1 ),\n strides_out= (32*64, 1, 64, 0 )\n )\n # Create the batched TensorOperation instance\n top = etops.TensorOperation(batched_config)\n\n import torch\n # Create input and output arrays\n A = torch.randn(48, 128, 64, dtype=torch.float32)\n B = torch.randn(48, 32, 128, dtype=torch.float32)\n C = torch.randn(48, 32, 64, dtype=torch.float32)\n\n # Execute the operation\n top.execute(A, B, C)\n\n C_torch = torch.einsum(\"bkm,bnk->bnm\", A, B)\n\n # Compute absolute and relative errors\n error_abs = torch.max(torch.abs(C - C_torch))\n error_rel = torch.max(torch.abs(C - C_torch) / (torch.abs(C_torch) + 1e-8))\n\n print(\"Batched GEMM operation:\")\n print(f\" Max absolute error: {error_abs:.6e}\")\n print(f\" Max relative error: {error_rel:.6e}\")\n\n # -----------------------------------------------\n # Third example:\n # Batch-reduce GEMM operation with optimization\n # Compares the result with torch's einsum\n # -----------------------------------------------\n # Define a batch-reduce GEMM configuration\n batched_config = etops.TensorOperationConfig(\n data_type = etops.float32,\n prim_first = etops.prim.zero,\n prim_main = etops.prim.gemm,\n prim_last = etops.prim.none,\n dim_types = (etops.dim.k, etops.dim.m, etops.dim.n, etops.dim.k ),\n exec_types = (etops.exec.seq, etops.exec.seq, etops.exec.seq, etops.exec.seq),\n dim_sizes = (48, 64, 32, 128 ),\n strides_in0= (128*64, 1, 0, 64 ),\n strides_in1= (32*128, 0, 128, 1 ),\n strides_out= (0, 1, 64, 0 )\n )\n\n # Optimize the configuration\n optimized_config = etops.optimize( batched_config,\n target_m=16,\n target_n=12,\n target_k=64,\n num_threads=1,\n br_gemm_support=True,\n packed_gemm_support=True )\n\n # Create the optimized TensorOperation instance\n top = etops.TensorOperation(optimized_config)\n\n import torch\n # Create input and output arrays\n A = torch.randn(48, 128, 64, dtype=torch.float32)\n B = torch.randn(48, 32, 128, dtype=torch.float32)\n C = torch.randn( 32, 64, dtype=torch.float32)\n\n # Execute the operation\n top.execute(A, B, C)\n\n C_torch = torch.einsum(\"bkm,bnk->nm\", A, B)\n\n # Compute absolute and relative errors\n error_abs = torch.max(torch.abs(C - C_torch))\n error_rel = torch.max(torch.abs(C - C_torch) / (torch.abs(C_torch) + 1e-8))\n print(\"Batch-reduce GEMM operation:\")\n print(f\" Max absolute error: {error_abs:.6e}\")\n print(f\" Max relative error: {error_rel:.6e}\")\n\nSee the source code and inline documentation for more advanced usage.\n",
"bugtrack_url": null,
"license": null,
"summary": "Einsum tree operations.",
"version": "25.7.0",
"project_urls": {
"Homepage": "https://github.com/scalable-analyses/einsum_ir",
"Issues": "https://github.com/scalable-analyses/einsum_ir/issues",
"Source": "https://github.com/scalable-analyses/einsum_ir"
},
"split_keywords": [
"einsum trees",
" tensor operations"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "1826b307215576f23cd819ed9becb2703b86e7c79a1deced9c76d428cebffbd6",
"md5": "019390dd7a5c396fa979051d23b78fce",
"sha256": "d506c7ea779b7e11120d45be217ba150644d9b3a78786cec49ae46383a3122a8"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp310-cp310-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "019390dd7a5c396fa979051d23b78fce",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 702541,
"upload_time": "2025-07-25T02:54:55",
"upload_time_iso_8601": "2025-07-25T02:54:55.665611Z",
"url": "https://files.pythonhosted.org/packages/18/26/b307215576f23cd819ed9becb2703b86e7c79a1deced9c76d428cebffbd6/etops_nightly-25.7.0-cp310-cp310-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4cd52ceb7e95dd7fa52d9210585064ee6147348d482d8a34dffdfd5334dd51bc",
"md5": "5bc393658965634e178ef83fd90c805f",
"sha256": "1ca8f10aac2ca0296a1be1eae9d5cd48d8db8d2a896a483270e3238912ec110b"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "5bc393658965634e178ef83fd90c805f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1223385,
"upload_time": "2025-07-25T02:54:57",
"upload_time_iso_8601": "2025-07-25T02:54:57.810410Z",
"url": "https://files.pythonhosted.org/packages/4c/d5/2ceb7e95dd7fa52d9210585064ee6147348d482d8a34dffdfd5334dd51bc/etops_nightly-25.7.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c2f1767b46642ad4fdd5060a5d639ee102703abf8356c23f4cc3ca0478201a1d",
"md5": "16ddd112685d7d47f9d74671782ea992",
"sha256": "6aa5122e084c954b18e98e5cfbe9e56f620909e6ed7ea295a8b1db340f4adc1e"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "16ddd112685d7d47f9d74671782ea992",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1264769,
"upload_time": "2025-07-25T02:54:59",
"upload_time_iso_8601": "2025-07-25T02:54:59.795843Z",
"url": "https://files.pythonhosted.org/packages/c2/f1/767b46642ad4fdd5060a5d639ee102703abf8356c23f4cc3ca0478201a1d/etops_nightly-25.7.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4a229b4d9a3f76734d50f6d74d21325bf65b15020df849e6c4b9512cab7f8f07",
"md5": "36a6e491cea2b8f0fdf5dc9607d44ce2",
"sha256": "db8faa6e7c25cecef24f126d022fcae209a4c2114990baed90f620b6e059a160"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp311-cp311-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "36a6e491cea2b8f0fdf5dc9607d44ce2",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 703719,
"upload_time": "2025-07-25T02:55:01",
"upload_time_iso_8601": "2025-07-25T02:55:01.467198Z",
"url": "https://files.pythonhosted.org/packages/4a/22/9b4d9a3f76734d50f6d74d21325bf65b15020df849e6c4b9512cab7f8f07/etops_nightly-25.7.0-cp311-cp311-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d569ab985846980c68c0f5ade7267850cae6decb5099743a24d751968e065373",
"md5": "8107eec68f24550395b97094cfc7633a",
"sha256": "6330930cf43aaa70562c3155e6fd532fc7c580369ff58543bf44747a0907f62e"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "8107eec68f24550395b97094cfc7633a",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1224330,
"upload_time": "2025-07-25T02:55:03",
"upload_time_iso_8601": "2025-07-25T02:55:03.422625Z",
"url": "https://files.pythonhosted.org/packages/d5/69/ab985846980c68c0f5ade7267850cae6decb5099743a24d751968e065373/etops_nightly-25.7.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a2f3ea25d9aaf653ae7bea0bfa557a3fba05d121a4ca57315bbd0b1ffb795b6e",
"md5": "2c2a6f2f89a8b699afcf4c55644a93cd",
"sha256": "1a6a2b3e94bd504be2d57a9a3c52adae1040b00a40a56894e76227f9160a7498"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "2c2a6f2f89a8b699afcf4c55644a93cd",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1266087,
"upload_time": "2025-07-25T02:55:05",
"upload_time_iso_8601": "2025-07-25T02:55:05.108526Z",
"url": "https://files.pythonhosted.org/packages/a2/f3/ea25d9aaf653ae7bea0bfa557a3fba05d121a4ca57315bbd0b1ffb795b6e/etops_nightly-25.7.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1f279d0c75c5de68c94bebfce45af15611ff8a8353b14ccc5a19526067562bb5",
"md5": "397a5f72cb32e6c4e9cc7e469006a47d",
"sha256": "64ea6cca6f2ddb5320adedf4d8049efa9ffd881c620d9f703f7c91c91add2b9c"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp312-cp312-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "397a5f72cb32e6c4e9cc7e469006a47d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 705220,
"upload_time": "2025-07-25T02:55:07",
"upload_time_iso_8601": "2025-07-25T02:55:07.541583Z",
"url": "https://files.pythonhosted.org/packages/1f/27/9d0c75c5de68c94bebfce45af15611ff8a8353b14ccc5a19526067562bb5/etops_nightly-25.7.0-cp312-cp312-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "db2ce6b1104d7b8eaf03c9be090552f850ab37f9d1163421aee9f92223236328",
"md5": "7fc05dca03a881349b97c94d69cde1ad",
"sha256": "1abf7376e05b89824cc6979c9dd32f0d07f51abe79734c922dd8c19b60926ab5"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "7fc05dca03a881349b97c94d69cde1ad",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1224721,
"upload_time": "2025-07-25T02:55:09",
"upload_time_iso_8601": "2025-07-25T02:55:09.408082Z",
"url": "https://files.pythonhosted.org/packages/db/2c/e6b1104d7b8eaf03c9be090552f850ab37f9d1163421aee9f92223236328/etops_nightly-25.7.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7eb1172053600c15f0de3bd1ceed617a56c0cf47cb5d7ebb61bd2303478aa888",
"md5": "aae905073f2eb2d6d331c8d2b9ebd6c7",
"sha256": "8ad3b9c5b9f197bd5e68385534d88f7c3eb624c56ed4b79a4f72a43e35d2987f"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "aae905073f2eb2d6d331c8d2b9ebd6c7",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1267996,
"upload_time": "2025-07-25T02:55:10",
"upload_time_iso_8601": "2025-07-25T02:55:10.954213Z",
"url": "https://files.pythonhosted.org/packages/7e/b1/172053600c15f0de3bd1ceed617a56c0cf47cb5d7ebb61bd2303478aa888/etops_nightly-25.7.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "79f4ae60630870a87ebb421ff091488ffa2d44ae233519edd8ebaef3b5fb80de",
"md5": "cd6f936a30349760c6ab826602c9c3dd",
"sha256": "76aff741c6798f1c808d0baad22efa0eb4fd94caa00dcde8c9a2d4e324f690c2"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp313-cp313-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "cd6f936a30349760c6ab826602c9c3dd",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 705271,
"upload_time": "2025-07-25T02:55:12",
"upload_time_iso_8601": "2025-07-25T02:55:12.516100Z",
"url": "https://files.pythonhosted.org/packages/79/f4/ae60630870a87ebb421ff091488ffa2d44ae233519edd8ebaef3b5fb80de/etops_nightly-25.7.0-cp313-cp313-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fcc42431e4a18eb2f060f227130f2f08a12e6eed4341c2adf5cad62a919eaa84",
"md5": "f05e54fb4bf41f5b3172615a663a66f4",
"sha256": "db6954a6fa9aad011fec666cf6d209dbace0e88405a21e2b42dc5650ff185903"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "f05e54fb4bf41f5b3172615a663a66f4",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1224742,
"upload_time": "2025-07-25T02:55:13",
"upload_time_iso_8601": "2025-07-25T02:55:13.995270Z",
"url": "https://files.pythonhosted.org/packages/fc/c4/2431e4a18eb2f060f227130f2f08a12e6eed4341c2adf5cad62a919eaa84/etops_nightly-25.7.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "43daeaf32eb5ccf95ab07b73f8933487caae034c1ce17949825b5b9d10503d72",
"md5": "2152879c54979e06f8715d7f29e5b251",
"sha256": "26058c959be27a46a58c7a8f0782c82025afb6098a1c157bb8a7018e3a2a4f04"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "2152879c54979e06f8715d7f29e5b251",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1268133,
"upload_time": "2025-07-25T02:55:16",
"upload_time_iso_8601": "2025-07-25T02:55:16.004091Z",
"url": "https://files.pythonhosted.org/packages/43/da/eaf32eb5ccf95ab07b73f8933487caae034c1ce17949825b5b9d10503d72/etops_nightly-25.7.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9af04ffc929c2a99c457c27e85134ac3751983a71321a353406865d9a110d725",
"md5": "4017c340d10b28a91612be4e85cdc053",
"sha256": "7c04774ef260079446d1d163aaf46415b13bbbbb597e0b4929a72b69cc4a6f81"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp314-cp314-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "4017c340d10b28a91612be4e85cdc053",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 705770,
"upload_time": "2025-07-25T02:55:17",
"upload_time_iso_8601": "2025-07-25T02:55:17.892294Z",
"url": "https://files.pythonhosted.org/packages/9a/f0/4ffc929c2a99c457c27e85134ac3751983a71321a353406865d9a110d725/etops_nightly-25.7.0-cp314-cp314-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a5daf005ee8f5202010b242caf61c61a69ff0727d9bebbdf65ca4b2442c63ef1",
"md5": "d32ad4410fb77f280e076bba573a825a",
"sha256": "b11f0c9be1bb6b64e0de8dc9b6aeaa9685d03d7a8d061b76577cf6f6e8a79868"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "d32ad4410fb77f280e076bba573a825a",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 1225667,
"upload_time": "2025-07-25T02:55:19",
"upload_time_iso_8601": "2025-07-25T02:55:19.541704Z",
"url": "https://files.pythonhosted.org/packages/a5/da/f005ee8f5202010b242caf61c61a69ff0727d9bebbdf65ca4b2442c63ef1/etops_nightly-25.7.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "53c860ca0c4130e6973b48f698982bc5f16750b00fb107be8248fa75c0900f55",
"md5": "374e052dd48cfc0b821eb2832071449e",
"sha256": "7fceb5c6d0dfe45f791fc1dd63f604bd046292673dc0369f53e464999bc86dfa"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "374e052dd48cfc0b821eb2832071449e",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 1268397,
"upload_time": "2025-07-25T02:55:21",
"upload_time_iso_8601": "2025-07-25T02:55:21.072089Z",
"url": "https://files.pythonhosted.org/packages/53/c8/60ca0c4130e6973b48f698982bc5f16750b00fb107be8248fa75c0900f55/etops_nightly-25.7.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fd1972592d9abac9d7ad3552d044e024c8b77f3b213e529c37f07c444d32212e",
"md5": "c4329aea01a8c3cad89b3f9a011801bd",
"sha256": "fb806367f384744b88c5a18242b174e41cfde54b3d50d0eb0f1d23182de6b832"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp314-cp314t-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "c4329aea01a8c3cad89b3f9a011801bd",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 713930,
"upload_time": "2025-07-25T02:55:22",
"upload_time_iso_8601": "2025-07-25T02:55:22.970558Z",
"url": "https://files.pythonhosted.org/packages/fd/19/72592d9abac9d7ad3552d044e024c8b77f3b213e529c37f07c444d32212e/etops_nightly-25.7.0-cp314-cp314t-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b77587a01a17afda1ca43e9e1451ac8208c0eda562233251db3fe583d5929688",
"md5": "d9ee32f94b04303f349a384c2d390204",
"sha256": "ebb3fcc08eb8b89f7a9ae808a1ffcec11311b0db7052609f8022a8ae9b5ef12d"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "d9ee32f94b04303f349a384c2d390204",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 1229827,
"upload_time": "2025-07-25T02:55:24",
"upload_time_iso_8601": "2025-07-25T02:55:24.843550Z",
"url": "https://files.pythonhosted.org/packages/b7/75/87a01a17afda1ca43e9e1451ac8208c0eda562233251db3fe583d5929688/etops_nightly-25.7.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "72c9ea5cc7ae00782ab1041d99d0a83972fd6e9ae9b08ab41ab7c04d7f2064b6",
"md5": "6923fb70870e0c91d24110b4d7976fb8",
"sha256": "5b336412bda96706758d86601296918023186a0f3c2dc53d04fea6acce5e30ae"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "6923fb70870e0c91d24110b4d7976fb8",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 1273621,
"upload_time": "2025-07-25T02:55:26",
"upload_time_iso_8601": "2025-07-25T02:55:26.572591Z",
"url": "https://files.pythonhosted.org/packages/72/c9/ea5cc7ae00782ab1041d99d0a83972fd6e9ae9b08ab41ab7c04d7f2064b6/etops_nightly-25.7.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f2c3d27107177f752e43dca37ac48579920e120f5db7cb035aa91c0dca6d48d4",
"md5": "4e4f02acb3490107673338af98aef233",
"sha256": "3e3f3254aa9c0ba50da978b9243dfa1fc353c994c91c1f84f76335d495dd2ac2"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "4e4f02acb3490107673338af98aef233",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.9",
"size": 1223250,
"upload_time": "2025-07-25T02:55:28",
"upload_time_iso_8601": "2025-07-25T02:55:28.150889Z",
"url": "https://files.pythonhosted.org/packages/f2/c3/d27107177f752e43dca37ac48579920e120f5db7cb035aa91c0dca6d48d4/etops_nightly-25.7.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d9a84c2cbd4d2fdea556504aa2856a4034c2cf042bbfa7e126037e4828aaa8d6",
"md5": "e86e955919616d4d7b8112b302332d0e",
"sha256": "ef1c9280cccf8aaf9e284b8850a87fe06ff3001314f045e3d5a13d84707951b0"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "e86e955919616d4d7b8112b302332d0e",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.9",
"size": 1264475,
"upload_time": "2025-07-25T02:55:29",
"upload_time_iso_8601": "2025-07-25T02:55:29.663502Z",
"url": "https://files.pythonhosted.org/packages/d9/a8/4c2cbd4d2fdea556504aa2856a4034c2cf042bbfa7e126037e4828aaa8d6/etops_nightly-25.7.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8f1ba04205140e45a0b10c93988d3f5e58e097cd27f4d77de7f9f5cc1e625d15",
"md5": "0ab08fe8851f5b14e6209cf27ea7074e",
"sha256": "26ed910c84b123af8907a8ff195a600218c69fb3853d793b259384391da05b06"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp39-cp39-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "0ab08fe8851f5b14e6209cf27ea7074e",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 702641,
"upload_time": "2025-07-25T02:55:31",
"upload_time_iso_8601": "2025-07-25T02:55:31.402964Z",
"url": "https://files.pythonhosted.org/packages/8f/1b/a04205140e45a0b10c93988d3f5e58e097cd27f4d77de7f9f5cc1e625d15/etops_nightly-25.7.0-cp39-cp39-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "556a3cae1c879c69e560ac33bb6b8dce791fe4c6552c698d93b922d42eefb88f",
"md5": "40c8faa0ffb6419ea01ea8e4129a9371",
"sha256": "2aa83e3754264bcbd61ca6af34e1b92578542af215f21816e585fc29a5b6a888"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "40c8faa0ffb6419ea01ea8e4129a9371",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1223505,
"upload_time": "2025-07-25T02:55:33",
"upload_time_iso_8601": "2025-07-25T02:55:33.001221Z",
"url": "https://files.pythonhosted.org/packages/55/6a/3cae1c879c69e560ac33bb6b8dce791fe4c6552c698d93b922d42eefb88f/etops_nightly-25.7.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e8abe14ed8164f7864876749cfa58609cf336cac53a802989e73f24f328ba0b2",
"md5": "ae5733fe2a672208fcc79cea7038feb1",
"sha256": "dd60ab98e25f70bb8faf9432f45c6ada70a4f7d9c645ce29c0a28cd830d514e5"
},
"downloads": -1,
"filename": "etops_nightly-25.7.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "ae5733fe2a672208fcc79cea7038feb1",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1264598,
"upload_time": "2025-07-25T02:55:34",
"upload_time_iso_8601": "2025-07-25T02:55:34.661720Z",
"url": "https://files.pythonhosted.org/packages/e8/ab/e14ed8164f7864876749cfa58609cf336cac53a802989e73f24f328ba0b2/etops_nightly-25.7.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-25 02:54:55",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "scalable-analyses",
"github_project": "einsum_ir",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "etops-nightly"
}