etops-nightly


Nameetops-nightly JSON
Version 25.7.0 PyPI version JSON
download
home_pageNone
SummaryEinsum tree operations.
upload_time2025-07-25 02:54:55
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords einsum trees tensor operations
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            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"
}
        
Elapsed time: 0.75615s