mwpf


Namemwpf JSON
Version 0.0.4 PyPI version JSON
download
home_pagehttps://hyper-mwpf.com
SummaryHypergraph Minimum-Weight Parity Factor (MWPF) Solver for Quantum LDPC Codes
upload_time2024-03-05 05:00:36
maintainer
docs_urlNone
authorYue Wu <wuyue16pku@gmail.com>
requires_python>=3.8
licenseMIT
keywords qec quantum-computing error-correction visualization
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # MWPF
### Hypergraph <span style="color: red; font-size: 120%;">M</span>inimum-<span style="color: red; font-size: 120%;">W</span>eight <span style="color: red; font-size: 120%;">P</span>arity <span style="color: red; font-size: 120%;">F</span>actor Decoder for QEC

*Preview claim: We publish the Python package that may subject to breaking changes. The source code and the full version will be made publicly available with our coming paper.*

Hypergraph MWPF is proven to be **NP-hard** [1]. Our design is taking advantage of clustering technique to lower
the **average** time complexity and reach **almost-linear** average time complexity at small physical error rate.
Please wait for our paper for more discussion of the speed v.s. accuracy.

[<img src="https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/video_maker/small_color_code_example.gif" width="50%" alt="Color Code Example (click for YouTube video)" align="center" loop=infinite>](https://youtu.be/26jgRb669UE)

## Installation

```sh
pip install MWPF
```

## Background

The Most-Likely Error (MLE) decoding problem can be formulated as a MWPF problem.

![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/MLE_decoding.png)

![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/MWPF_definition.png)

#### Naming

We named it Minimum-Weight Parity Factor because of a concept called "parity $(g,f)$-factor" in Lovász's 1972 paper [2]. In the context of QEC, the functions $g(v)$ and $f(v)$ associates with the measured syndrome as shown above. Without ambiguity, we just call it "parity factor".

#### Relationship with MWPM decoder

Minimum-Weight Perfect Matching decoder is the traditional decoder for QEC. When the decoding graph is a simple graph, the MLE decoding problem can be reduced to an MWPM problem on a generated complete graph with $O(|V|^2)$ edges. Two recent works [2] and [3] improves the average time complexity to almost theoretical upper bound of $O(|V|)$ by not explicitly generating the complete graph. This motivates our idea to design an algorithm directly on the model graph, hoping to reach the same $O(|V|)$ average time complexity even if the model graph is hypergraph.

#### Key Idea

We try to extend the blossom algorithm that solves the MWPM problem on simple graphs. An interesting attribute of the blossom algorithm is that it deals with an **exponential** number of linear constraints in order to relax the integer constraints. The added linear constraints, which we refer to as "blossom constraints", are based on a very simple idea: filtering out invalid solutions. The blossom constraints simply say "any odd cluster cannot be perfectly matched internally", which is obviously true. However, this "filtering" requires an exponential number of linear constraints [5], which is impossible to generate efficiently. Thus, the algorithm must **implicitly** consider those exponential number of constraints without ever listing them. In fact, the blossom algorithm only keeps track of $O(|V|)$ such constraints from the exponentially many. Surprisingly, this works! Inspired by this miracle, we now have the courage to use an exponential number of linear constraints to solve MWPF.

#### Rigorous Math

![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/MWPF_to_ILP.png)

The ILP problem above is very similar to that of the blossom algorithm, except for the more complex "blossom"definition: it's now a subgraph $S=(V_S, E_S), V_S \subseteq V, E_S \subseteq E$ instead of just a subset of vertices $S\subseteq V$ in the blossom algorithm. We have **mathematically** proved the equivalence between hypergraph MWPF and this ILP. In the next step, we simply relax the integer constraints.

![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/ILP_to_LP.png)

Clearly, as a relaxation, the minimum objective value is no larger than that of the ILP. Unfortunately, we haven't been able to rigorously prove that they have the same optimal objective value, nor can we find a counter example. We leave this conjecture as is for now, and do not assume its correctness.

##### Conjecture: $\min\text{ILP}=\min\text{LP}$. 

![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/LP_to_DLP.png)

The dual problem is a transpose of the primal LP problem. According to the duality theorem, they have the same optimal value. The key is that each primal constraint becomes a dual variable, and each primal variable becomes a dual constraint. Clearly, for the dual problem, $y_S = 0, \forall S \in \mathcal{O}$ is a solution (despite usually not the optimal solution). In this way, we can keep track of only **non-zero** dual variables to implicitly considering all the exponentially many primal constraints. Since the dual LP problem becomes a maximization problem, we have the whole inequality chain as below.

![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/inequality_chain.png)

If we can find a pair of feasible primal and dual solutions with the same weight, then this inequality chain **collapses** to an equality chain and the primal solution is **proven to be optimal**. Even if they are not equal, we still get a proximity bound.

In fact, MWPM decoder using the blossom algorithm fits in this framework, where the alternating tree operation guarantees that in the end the primal must be equal to the dual. Union-Find decoder and hypergraph UF decoder can also be explained by this framework, but the proximity bound is usually not singleton.

## Usage

The decoding process is two steps (shown in [Background](#background))

1. offline: construct the model graph given the QEC code and the noise model
2. online: compute the most-likely error $\mathcal{E}\subseteq E$ given the syndrome (represented by the defect vertices $D \subseteq V$) and some dynamic weights

```python
from mwpf import HyperEdge, SolverInitializer, SolverSerialJointSingleHair, SyndromePattern

# Offline
vertex_num = 4
weighted_edges = [
    HyperEdge([0, 1], 100),  # [vertices], weight
    HyperEdge([1, 2], 100),
    HyperEdge([2, 3], 100),
    HyperEdge([0], 100),  # boundary vertex
    HyperEdge([0, 1, 2], 60),  # hyperedge
]
initializer = SolverInitializer(vertex_num, weighted_edges)
hyperion = SolverSerialJointSingleHair(initializer)

# Online
syndrome = [0, 1, 3]
hyperion.solve(SyndromePattern(syndrome))
hyperion_subgraph = hyperion.subgraph()
print(hyperion_subgraph)  # out: [3, 5], weighted 160
_, bound = hyperion.subgraph_range()
print((bound.lower, bound.upper))  # out: (Fraction(160, 1), Fraction(160, 1))
```

The example hyergraph is below: grey edges are weighted 100 and the purple hyperedge is weighted 60.

![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/example_hypergraph.png)

In constrast, if we were to solve MWPF with MWPM decoder, then we have to ignore the hyperedge $e_4$ and thus leads to suboptimal result, as shown by the following Python script using the [Fusion Blossom](https://pypi.org/project/fusion-blossom/) library.

```python
from fusion_blossom import SolverInitializer, SolverSerial, SyndromePattern

# Offline
vertex_num = 5
weighted_edges = [(0, 4, 100), (0, 1, 100), (1, 2, 100), (2, 3, 100)]
virtual_vertices = [4]
initializer = SolverInitializer(vertex_num, weighted_edges, virtual_vertices)
fusion = SolverSerial(initializer)

# Online
syndrome = [0, 1, 3]
fusion.solve(SyndromePattern(syndrome))
fusion_subgraph = fusion.subgraph()
print(fusion_subgraph)  # out: [0, 2, 3], which is weighted 300 instead of 160
```

## Advanced Usage

When trading off accuracy and decoding time, we provide a timeout parameter for the decoder. Also, one can specify whether you want the clusters to all grow together or grow one by one. More parameters are coming as we develop the library.

```python
config = {
    "primal": {
        "timeout": 3.0,  # 3 second timeout for each cluster
    },
    "growing_strategy": "SingleCluster",  # growing from each defect one by one
    # "growing_strategy": "MultipleClusters",  # every defect starts to grow at the same time
}
hyperion = SolverSerialJointSingleHair(initializer, config)
```

An embedded visualization tool is coming soon.

## Examples

For surface code with depolarizing noise mode $p_x =p_y=p_z = p/3$, here shows physical error rates 1%, 2% and 4% (left to right).

[<img src="https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/video_maker/surface_code_example.gif" alt="Surface Code Example (click for YouTube video)" align="center" loop=infinite>](https://youtu.be/SjZ8rMdYZ54)

For triangle color code with X errors, here shows physical error rates 1%, 2% and 4% (left to right).

[<img src="https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/video_maker/triangle_color_code_example.gif" alt="Triangle Color Code Example (click for YouTube video)" align="center" loop=infinite>](https://youtu.be/1KN62fmR7OM)

For circuit-level surface code, here shows physical error rate 0.03%, 0.1% and 0.3% (left to right).

[<img src="https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/video_maker/circuit_level_example.gif" alt="Circuit-level Surface Code Example (click for YouTube video)" align="center" loop=infinite>](https://youtu.be/ki9fHiA4Gyo)

## Reference

[1] Berlekamp, Elwyn, Robert McEliece, and Henk Van Tilborg. "On the inherent intractability of certain coding problems (corresp.)." IEEE Transactions on Information Theory 24.3 (1978): 384-386.

[2] Lovász, László. "The factorization of graphs. II." Acta Mathematica Academiae Scientiarum Hungarica 23 (1972): 223-246.

[3] Higgott, Oscar, and Craig Gidney. "Sparse Blossom: correcting a million errors per core second with minimum-weight matching." arXiv preprint arXiv:2303.15933 (2023).

[4] Wu, Yue, and Lin Zhong. "Fusion Blossom: Fast MWPM Decoders for QEC." arXiv preprint arXiv:2305.08307 (2023).

[5] Rothvoß, Thomas. "The matching polytope has exponential extension complexity." *Journal of the ACM (JACM)* 64.6 (2017): 1-19.



            

Raw data

            {
    "_id": null,
    "home_page": "https://hyper-mwpf.com",
    "name": "mwpf",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "QEC,quantum-computing,error-correction,visualization",
    "author": "Yue Wu <wuyue16pku@gmail.com>",
    "author_email": "Yue Wu <wuyue16pku@gmail.com>",
    "download_url": "",
    "platform": null,
    "description": "# MWPF\n### Hypergraph <span style=\"color: red; font-size: 120%;\">M</span>inimum-<span style=\"color: red; font-size: 120%;\">W</span>eight <span style=\"color: red; font-size: 120%;\">P</span>arity <span style=\"color: red; font-size: 120%;\">F</span>actor Decoder for QEC\n\n*Preview claim: We publish the Python package that may subject to breaking changes. The source code and the full version will be made publicly available with our coming paper.*\n\nHypergraph MWPF is proven to be **NP-hard** [1]. Our design is taking advantage of clustering technique to lower\nthe **average** time complexity and reach **almost-linear** average time complexity at small physical error rate.\nPlease wait for our paper for more discussion of the speed v.s. accuracy.\n\n[<img src=\"https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/video_maker/small_color_code_example.gif\" width=\"50%\" alt=\"Color Code Example (click for YouTube video)\" align=\"center\" loop=infinite>](https://youtu.be/26jgRb669UE)\n\n## Installation\n\n```sh\npip install MWPF\n```\n\n## Background\n\nThe Most-Likely Error (MLE) decoding problem can be formulated as a MWPF problem.\n\n![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/MLE_decoding.png)\n\n![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/MWPF_definition.png)\n\n#### Naming\n\nWe named it Minimum-Weight Parity Factor because of a concept called \"parity $(g,f)$-factor\" in Lov\u00e1sz's 1972 paper [2]. In the context of QEC, the functions $g(v)$ and $f(v)$ associates with the measured syndrome as shown above. Without ambiguity, we just call it \"parity factor\".\n\n#### Relationship with MWPM decoder\n\nMinimum-Weight Perfect Matching decoder is the traditional decoder for QEC. When the decoding graph is a simple graph, the MLE decoding problem can be reduced to an MWPM problem on a generated complete graph with $O(|V|^2)$ edges. Two recent works [2] and [3] improves the average time complexity to almost theoretical upper bound of $O(|V|)$ by not explicitly generating the complete graph. This motivates our idea to design an algorithm directly on the model graph, hoping to reach the same $O(|V|)$ average time complexity even if the model graph is hypergraph.\n\n#### Key Idea\n\nWe try to extend the blossom algorithm that solves the MWPM problem on simple graphs. An interesting attribute of the blossom algorithm is that it deals with an **exponential** number of linear constraints in order to relax the integer constraints. The added linear constraints, which we refer to as \"blossom constraints\", are based on a very simple idea: filtering out invalid solutions. The blossom constraints simply say \"any odd cluster cannot be perfectly matched internally\", which is obviously true. However, this \"filtering\" requires an exponential number of linear constraints [5], which is impossible to generate efficiently. Thus, the algorithm must **implicitly** consider those exponential number of constraints without ever listing them. In fact, the blossom algorithm only keeps track of $O(|V|)$ such constraints from the exponentially many. Surprisingly, this works! Inspired by this miracle, we now have the courage to use an exponential number of linear constraints to solve MWPF.\n\n#### Rigorous Math\n\n![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/MWPF_to_ILP.png)\n\nThe ILP problem above is very similar to that of the blossom algorithm, except for the more complex \"blossom\"definition: it's now a subgraph $S=(V_S, E_S), V_S \\subseteq V, E_S \\subseteq E$ instead of just a subset of vertices $S\\subseteq V$ in the blossom algorithm. We have **mathematically** proved the equivalence between hypergraph MWPF and this ILP. In the next step, we simply relax the integer constraints.\n\n![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/ILP_to_LP.png)\n\nClearly, as a relaxation, the minimum objective value is no larger than that of the ILP. Unfortunately, we haven't been able to rigorously prove that they have the same optimal objective value, nor can we find a counter example. We leave this conjecture as is for now, and do not assume its correctness.\n\n##### Conjecture: $\\min\\text{ILP}=\\min\\text{LP}$. \n\n![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/LP_to_DLP.png)\n\nThe dual problem is a transpose of the primal LP problem. According to the duality theorem, they have the same optimal value. The key is that each primal constraint becomes a dual variable, and each primal variable becomes a dual constraint. Clearly, for the dual problem, $y_S = 0, \\forall S \\in \\mathcal{O}$ is a solution (despite usually not the optimal solution). In this way, we can keep track of only **non-zero** dual variables to implicitly considering all the exponentially many primal constraints. Since the dual LP problem becomes a maximization problem, we have the whole inequality chain as below.\n\n![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/inequality_chain.png)\n\nIf we can find a pair of feasible primal and dual solutions with the same weight, then this inequality chain **collapses** to an equality chain and the primal solution is **proven to be optimal**. Even if they are not equal, we still get a proximity bound.\n\nIn fact, MWPM decoder using the blossom algorithm fits in this framework, where the alternating tree operation guarantees that in the end the primal must be equal to the dual. Union-Find decoder and hypergraph UF decoder can also be explained by this framework, but the proximity bound is usually not singleton.\n\n## Usage\n\nThe decoding process is two steps (shown in [Background](#background))\n\n1. offline: construct the model graph given the QEC code and the noise model\n2. online: compute the most-likely error $\\mathcal{E}\\subseteq E$ given the syndrome (represented by the defect vertices $D \\subseteq V$) and some dynamic weights\n\n```python\nfrom mwpf import HyperEdge, SolverInitializer, SolverSerialJointSingleHair, SyndromePattern\n\n# Offline\nvertex_num = 4\nweighted_edges = [\n    HyperEdge([0, 1], 100),  # [vertices], weight\n    HyperEdge([1, 2], 100),\n    HyperEdge([2, 3], 100),\n    HyperEdge([0], 100),  # boundary vertex\n    HyperEdge([0, 1, 2], 60),  # hyperedge\n]\ninitializer = SolverInitializer(vertex_num, weighted_edges)\nhyperion = SolverSerialJointSingleHair(initializer)\n\n# Online\nsyndrome = [0, 1, 3]\nhyperion.solve(SyndromePattern(syndrome))\nhyperion_subgraph = hyperion.subgraph()\nprint(hyperion_subgraph)  # out: [3, 5], weighted 160\n_, bound = hyperion.subgraph_range()\nprint((bound.lower, bound.upper))  # out: (Fraction(160, 1), Fraction(160, 1))\n```\n\nThe example hyergraph is below: grey edges are weighted 100 and the purple hyperedge is weighted 60.\n\n![](https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/images/example_hypergraph.png)\n\nIn constrast, if we were to solve MWPF with MWPM decoder, then we have to ignore the hyperedge $e_4$ and thus leads to suboptimal result, as shown by the following Python script using the [Fusion Blossom](https://pypi.org/project/fusion-blossom/) library.\n\n```python\nfrom fusion_blossom import SolverInitializer, SolverSerial, SyndromePattern\n\n# Offline\nvertex_num = 5\nweighted_edges = [(0, 4, 100), (0, 1, 100), (1, 2, 100), (2, 3, 100)]\nvirtual_vertices = [4]\ninitializer = SolverInitializer(vertex_num, weighted_edges, virtual_vertices)\nfusion = SolverSerial(initializer)\n\n# Online\nsyndrome = [0, 1, 3]\nfusion.solve(SyndromePattern(syndrome))\nfusion_subgraph = fusion.subgraph()\nprint(fusion_subgraph)  # out: [0, 2, 3], which is weighted 300 instead of 160\n```\n\n## Advanced Usage\n\nWhen trading off accuracy and decoding time, we provide a timeout parameter for the decoder. Also, one can specify whether you want the clusters to all grow together or grow one by one. More parameters are coming as we develop the library.\n\n```python\nconfig = {\n    \"primal\": {\n        \"timeout\": 3.0,  # 3 second timeout for each cluster\n    },\n    \"growing_strategy\": \"SingleCluster\",  # growing from each defect one by one\n    # \"growing_strategy\": \"MultipleClusters\",  # every defect starts to grow at the same time\n}\nhyperion = SolverSerialJointSingleHair(initializer, config)\n```\n\nAn embedded visualization tool is coming soon.\n\n## Examples\n\nFor surface code with depolarizing noise mode $p_x =p_y=p_z = p/3$, here shows physical error rates 1%, 2% and 4% (left to right).\n\n[<img src=\"https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/video_maker/surface_code_example.gif\" alt=\"Surface Code Example (click for YouTube video)\" align=\"center\" loop=infinite>](https://youtu.be/SjZ8rMdYZ54)\n\nFor triangle color code with X errors, here shows physical error rates 1%, 2% and 4% (left to right).\n\n[<img src=\"https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/video_maker/triangle_color_code_example.gif\" alt=\"Triangle Color Code Example (click for YouTube video)\" align=\"center\" loop=infinite>](https://youtu.be/1KN62fmR7OM)\n\nFor circuit-level surface code, here shows physical error rate 0.03%, 0.1% and 0.3% (left to right).\n\n[<img src=\"https://raw.githubusercontent.com/yuewuo/conference-talk-2024-APS-march-meeting/main/video_maker/circuit_level_example.gif\" alt=\"Circuit-level Surface Code Example (click for YouTube video)\" align=\"center\" loop=infinite>](https://youtu.be/ki9fHiA4Gyo)\n\n## Reference\n\n[1] Berlekamp, Elwyn, Robert McEliece, and Henk Van Tilborg. \"On the inherent intractability of certain coding problems (corresp.).\" IEEE Transactions on Information Theory 24.3 (1978): 384-386.\n\n[2] Lov\u00e1sz, L\u00e1szl\u00f3. \"The factorization of graphs. II.\" Acta Mathematica Academiae Scientiarum Hungarica 23 (1972): 223-246.\n\n[3] Higgott, Oscar, and Craig Gidney. \"Sparse Blossom: correcting a million errors per core second with minimum-weight matching.\" arXiv preprint arXiv:2303.15933 (2023).\n\n[4] Wu, Yue, and Lin Zhong. \"Fusion Blossom: Fast MWPM Decoders for QEC.\" arXiv preprint arXiv:2305.08307 (2023).\n\n[5] Rothvo\u00df, Thomas. \"The matching polytope has exponential extension complexity.\" *Journal of the ACM (JACM)* 64.6 (2017): 1-19.\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Hypergraph Minimum-Weight Parity Factor (MWPF) Solver for Quantum LDPC Codes",
    "version": "0.0.4",
    "project_urls": {
        "Homepage": "https://hyper-mwpf.com",
        "Source Code": "https://github.com/yuewuo/mwpf"
    },
    "split_keywords": [
        "qec",
        "quantum-computing",
        "error-correction",
        "visualization"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fa11bce2fc0f0d28c43fd0cfd7157721e6e3e8ea098f41ff45189fbebe1acf52",
                "md5": "e8ac84af28d96d9ef4add07d4487adae",
                "sha256": "af44fdf76835379e8d84e999b91e9926a640c61d146364c08111c41294b010cc"
            },
            "downloads": -1,
            "filename": "mwpf-0.0.4-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "e8ac84af28d96d9ef4add07d4487adae",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 1895092,
            "upload_time": "2024-03-05T05:00:36",
            "upload_time_iso_8601": "2024-03-05T05:00:36.886169Z",
            "url": "https://files.pythonhosted.org/packages/fa/11/bce2fc0f0d28c43fd0cfd7157721e6e3e8ea098f41ff45189fbebe1acf52/mwpf-0.0.4-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f60a22fbd515d3774c5971f30e9e7e8a7ca57290e197e62fd920f4c011515c6a",
                "md5": "bf629af0e6993e89f55acc8fd0edb567",
                "sha256": "f74404a27c1af84f07581cf90da4202dc6d6d24f0a9b7d31ddbfe3ed2ef13000"
            },
            "downloads": -1,
            "filename": "mwpf-0.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bf629af0e6993e89f55acc8fd0edb567",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 13126768,
            "upload_time": "2024-03-05T05:00:44",
            "upload_time_iso_8601": "2024-03-05T05:00:44.338321Z",
            "url": "https://files.pythonhosted.org/packages/f6/0a/22fbd515d3774c5971f30e9e7e8a7ca57290e197e62fd920f4c011515c6a/mwpf-0.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bd87c5bdce33799baf41b3fecb9ba7c4bdc09c2100669e68c69b9ca949990b01",
                "md5": "0a9bfca1b55bad548efe539c4a52dc0d",
                "sha256": "bf5a015bc5eb8ee1c6e0e764d23ec56a75693ec926825899d8f6f81106d63761"
            },
            "downloads": -1,
            "filename": "mwpf-0.0.4-cp37-abi3-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0a9bfca1b55bad548efe539c4a52dc0d",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 13155317,
            "upload_time": "2024-03-05T05:00:51",
            "upload_time_iso_8601": "2024-03-05T05:00:51.157300Z",
            "url": "https://files.pythonhosted.org/packages/bd/87/c5bdce33799baf41b3fecb9ba7c4bdc09c2100669e68c69b9ca949990b01/mwpf-0.0.4-cp37-abi3-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "162deb0d855b9c198dd5f6d612a8f63f32a6203470fe009a9ceea6727de1a6e8",
                "md5": "9806e5bb89d6d251f614778ec341fb82",
                "sha256": "bcf73925089bafaece7afd9489640f67c1bccd0b68cb4f7b414db7bb08db8af3"
            },
            "downloads": -1,
            "filename": "mwpf-0.0.4-cp37-abi3-win32.whl",
            "has_sig": false,
            "md5_digest": "9806e5bb89d6d251f614778ec341fb82",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 650707,
            "upload_time": "2024-03-05T05:00:54",
            "upload_time_iso_8601": "2024-03-05T05:00:54.368407Z",
            "url": "https://files.pythonhosted.org/packages/16/2d/eb0d855b9c198dd5f6d612a8f63f32a6203470fe009a9ceea6727de1a6e8/mwpf-0.0.4-cp37-abi3-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e1b8a21971dec53e6585f9c28a1db2e8d397f1c39edcc3d1376535c60d155c8c",
                "md5": "84a9fe6de416fd08fd1d9c52976e3e4e",
                "sha256": "c9d0c07569bbd7270816b9cb6e215507d25c01f4981347c355eea8c805408a90"
            },
            "downloads": -1,
            "filename": "mwpf-0.0.4-cp37-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "84a9fe6de416fd08fd1d9c52976e3e4e",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 694952,
            "upload_time": "2024-03-05T05:00:56",
            "upload_time_iso_8601": "2024-03-05T05:00:56.178343Z",
            "url": "https://files.pythonhosted.org/packages/e1/b8/a21971dec53e6585f9c28a1db2e8d397f1c39edcc3d1376535c60d155c8c/mwpf-0.0.4-cp37-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-05 05:00:36",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yuewuo",
    "github_project": "mwpf",
    "github_not_found": true,
    "lcname": "mwpf"
}
        
Elapsed time: 0.20655s