{ "info": { "author": "Daniel Probst", "author_email": "", "bugtrack_url": null, "classifiers": [], "description": "# MHFP\n\nMHFP6 (MinHash fingerprint, up to six bonds) is a molecular fingerprint which encodes detailed substructures using the extended connectivity principle of ECFP in a fundamentally different manner, increasing the performance of exact nearest neighbor searches in benchmarking studies and enabling the application of locality sensitive hashing (LSH) approximate nearest neighbor search algorithms. To describe a molecule, MHFP6 extracts the SMILES of all circular substructures around each atom up to a diameter of six bonds and applies the MinHash method to the resulting set. MHFP6 outperforms ECFP4 in benchmarking analog recovery studies. Furthermore, MHFP6 outperforms ECFP4 in approximate nearest neighbor searches by two orders of magnitude in terms of speed, while decreasing the error rate.\n\n![Visual Abstract for MHFP](http://doc.gdb.tools/mhfp_ga.jpg)\n\n**Associated Publication**: \nhttps://jcheminf.biomedcentral.com/articles/10.1186/s13321-018-0321-8\n\n## Materials\nThe performance of MHFP has been avaluated using [Open-source platform to benchmark fingerprints for ligand-based virtual screening](https://github.com/rdkit/benchmarking_platform) and [ChEMBL24](https://www.ebi.ac.uk/chembl/downloads). Python (pyspark) scripts for the ChEMBL24 benchmark can be found in this repository.\n\n## Dependencies\nMHFP requires Python 3.x and Numpy.\n\nMHFP requires the cheminformatics library RDKit.\n\n## Installation\nMHFP can be installed using the Python packet manager pip:\n```bash\npip install mhfp\n```\n\n## Usage\nUsage is straightforward:\n```Python\nfrom mhfp.encoder import MHFPEncoder\n\nmhfp_encoder = MHFPEncoder()\n\nfp_a = mhfp_encoder.encode('CCOC1=C(C=C(C=C1)S(=O)(=O)N(C)C)C2=NC(=O)C3=C(N2)C(=NN3C)C(C)(C)C')\nfp_b = mhfp_encoder.encode('CCCC1=NN(C2=C1NC(=NC2=O)C3=C(C=CC(=C3)S(=O)(=O)N4CCN(CC4)C)OCC)C')\nfp_c = mhfp_encoder.encode('O=C(OC)C(C1CCCCN1)C2=CC=CC=C2')\n\nprint(MHFPEncoder.distance(fp_a, fp_a))\nprint(MHFPEncoder.distance(fp_a, fp_b))\nprint(MHFPEncoder.distance(fp_a, fp_c))\nprint(MHFPEncoder.distance(fp_b, fp_c))\n\n#> 0.0\n#> 0.45849609375\n#> 0.97998046875\n#> 0.97216796875\n```\n\n### LSH Forest\nAs the fingerprints are created using the locality sensitive hashing scheme MinHash, they are ready to be used with LSH-based algorithms:\n```Python\nfrom mhfp.encoder import MHFPEncoder\nfrom mhfp.lsh_forest import LSHForestHelper\n\nmhfp_encoder = MHFPEncoder()\n\nfp_a = mhfp_encoder.encode('CCOC1=C(C=C(C=C1)S(=O)(=O)N(C)C)C2=NC(=O)C3=C(N2)C(=NN3C)C(C)(C)C')\nfp_b = mhfp_encoder.encode('CCCC1=NN(C2=C1NC(=NC2=O)C3=C(C=CC(=C3)S(=O)(=O)N4CCN(CC4)C)OCC)C')\nfp_c = mhfp_encoder.encode('O=C(OC)C(C1CCCCN1)C2=CC=CC=C2')\nfp_q = mhfp_encoder.encode('COC1=C(C=C(C=C1)S(=O)(O)N(C)C)C2=NC(=O)C3=C(N2)C(=NN3C)C(C)(C)C')\n\nlsh_forest_helper = LSHForestHelper()\n\nfps = [fp_a, fp_b, fp_c]\n\nfor i, fp in enumerate(fps):\n lsh_forest_helper.add(i, fp)\n\nlsh_forest_helper.index()\n\nprint(lsh_forest_helper.query(fp_q, 1, fps))\n\n#> [0]\n```\n\n### SECFP\nSECFP (SMILES Extended Connectifity Fingerprint) creation is achieved by calling the static method `MHFPEncoder.secfp_from_smiles()`:\n```Python\nfrom mhfp.encoder import MHFPEncoder\nfp = MHFPEncoder.secfp_from_smiles('CCOC1=C(C=C(C=C1)S(=O)(=O)N(C)C)C2=NC(=O)C3=C(N2)C(=NN3C)C(C)(C)C')\n```\n\n\n## Documentation\n### MHFPEncoder\nThe class for encoding SMILES and RDKit molecule instances as MHFP fingerprints.\n\n```Python\n__init__(n_permutations = 2048, seed = 42)\n```\n| Parameter | Default | Description |\n|---|---|---|\n| n_permutations | ```2048``` | Analogous to the number of bits ECFP fingerprints are folded into. Higher is better, lower is less exact. |\n| seed | ```42``` | The seed for the MinHash operation. Has to be the same for comparable fingerprints. |\n\n```Python\nMHFPEncoder.encode(in_smiles, radius = 3, rings = True, kekulize = True, sanitize = True)\n```\n| Parameter | Default | Description |\n|---|---|---|\n| in_smiles | | The input SMILES. |\n| radius | ```3``` | Analogous to the radius for the Morgan fingerprint. The default radius 3 encodes SMILES to MHFP6. |\n| rings | ```True``` | Whether rings in the molecule are included in the fingerprint. As a radii of 3 fails to encode rings and there is no way to determine ring-membership in a substructure SMILES, this considerably increases performance. |\n| kekulize | ```True``` | Whether or not to kekulize the molecule before extracting substructure SMILES. |\n| sanitize | ```True``` | Whether or not to sanitize the molecule (using RDKit) before extracting substructure SMILES. |\n\n**Returns** a `numpy.ndarray` containing the fingerprint hashes.\n\n\n```Python\nMHFPEncoder.encode_mol(in_mol, radius = 3, rings = True, kekulize = True)\n```\n| Parameter | Default | Description |\n|---|---|---|\n| in_mol | | The input RDKit molecule instance. |\n| radius | ```3``` | Analogous to the radius for the Morgan fingerprint. The default radius 3 encodes SMILES to MHFP6. |\n| rings | ```True``` | Whether rings in the molecule are included in the fingerprint. As a radii of 3 fails to encode rings and there is no way to determine ring-membership in a substructure SMILES, this considerably increases performance. |\n| kekulize | ```True``` | Whether or not to kekulize the molecule before extracting substructure SMILES. |\n\n**Returns** a `numpy.ndarray` containing the fingerprint hashes.\n\n```Python\nMHFPEncoder.distance(a, b)\n```\n| Parameter | Default | Description |\n|---|---|---|\n| a | | A `numpy.ndarray` containing fingerprint hashes. |\n| b | | A `numpy.ndarray` containing fingerprint hashes. |\n\n**Returns** a `float` representing the distance between two MHFP encoded molecules.\n\n```Python\nMHFPEncoder.secfp_from_mol(in_mol, length=2048, radius=3, rings=True, kekulize=True)\n```\n| Parameter | Default | Description |\n|---|---|---|\n| in_mol | | The input RDKit molecule instance. |\n| length | ```2048``` | The length of the folded fingerprint. |\n| radius | ```3``` | Analogous to the radius for the Morgan fingerprint. The default radius 3 encodes SMILES to MHFP6. |\n| rings | ```True``` | Whether rings in the molecule are included in the fingerprint. As a radii of 3 fails to encode rings and there is no way to determine ring-membership in a substructure SMILES, this considerably increases performance. |\n| kekulize | ```True``` | Whether or not to kekulize the molecule before extracting substructure SMILES. |\n\n**Returns** a `numpy.ndarray` containing the fingerprint values.\n\n```Python\nMHFPEncoder.secfp_from_smiles(in_smiles, length=2048, radius=3, rings=True, kekulize=True, sanitize=False)\n```\n| Parameter | Default | Description |\n|---|---|---|\n| in_smiles | | The input SMILES. |\n| length | ```2048``` | The length of the folded fingerprint. |\n| radius | ```3``` | Analogous to the radius for the Morgan fingerprint. The default radius 3 encodes SMILES to MHFP6. |\n| rings | ```True``` | Whether rings in the molecule are included in the fingerprint. As a radii of 3 fails to encode rings and there is no way to determine ring-membership in a substructure SMILES, this considerably increases performance. |\n| kekulize | ```True``` | Whether or not to kekulize the molecule before extracting substructure SMILES. |\n| sanitize | ```False``` | Whether or not to sanitize the SMILES when parsing it using RDKit. |\n\n**Returns** a `numpy.ndarray` containing the fingerprint values.\n\n### LSHForestHelper\nIf you know your way around Python, I suggest you use the ```LSHForest``` class directly. See code for details.\n\n```Python\n__init__(dims = 2048, n_prefix_trees = 64)\n```\n| Parameter | Default | Description |\n|---|---|---|\n| dims | ```2048``` | **Has to be equal to the number of permutations** `n_permutations` **set when initializing** `MHFPEncoder` |\n| n_prefix_trees | ```64``` | The number of prefix trees. Lower number results in lower memory usage but less quality |\n\n```Python\nLSHForestHelper.add(key, mhfp):\n```\n| Parameter | Default | Description |\n|---|---|---|\n| key | | The key that will be retrieved by a query. It's recommended to use integers. |\n| mhfp | | The `numpy.ndarray` containing the fingerprint hashes. |\n\n```Python\nLSHForestHelper.index():\n```\n**Has to be run after adding entities and before running queries!**\n\n```Python\nMHFPEncoder.query(query_mhfp, k, data, kc=10)\n```\n| Parameter | Default | Description |\n|---|---|---|\n| query_mhfp | | A `numpy.ndarray` containing fingerprint hashes. |\n| k | | The number of nearest neighbors to be retrieved. |\n| data | | Data mapping keys to fingerprints. See LSH Forest example for details. |\n| kc | 10 | Initially k is multiplied by kc and k · kc (ANN) results are returned. The top k are then selected from these k · kc using linear scan. |\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/reymond-group/mhfp", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "mhfp", "package_url": "https://pypi.org/project/mhfp/", "platform": "", "project_url": "https://pypi.org/project/mhfp/", "project_urls": { "Homepage": "https://github.com/reymond-group/mhfp" }, "release_url": "https://pypi.org/project/mhfp/1.9.2/", "requires_dist": [ "pytest ; extra == 'dev'" ], "requires_python": "", "summary": "Molecular MHFP fingerprints for cheminformatics applications", "version": "1.9.2" }, "last_serial": 5742476, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "49eb7e93cbbe357f63b867b151a58b6a", "sha256": "86a635ba598dd220e8d40f36a7af0f0e995a57f9d6fbfec052742cefdae1a39b" }, "downloads": -1, "filename": "mhfp-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "49eb7e93cbbe357f63b867b151a58b6a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8330, "upload_time": "2018-10-06T12:04:57", "url": "https://files.pythonhosted.org/packages/80/a5/08b8f9e692853b81a6f1f70422f9dc2688e08c84099f9209c1008e944e69/mhfp-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "89fb5ed544602b3ced8cf39c0e279fc1", "sha256": "c65bfe9ec10f472f9c05e323d3a7a24b8275c35ecd6c0c38a14c6a412f4dbe52" }, "downloads": -1, "filename": "mhfp-1.0.tar.gz", "has_sig": false, "md5_digest": "89fb5ed544602b3ced8cf39c0e279fc1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18848, "upload_time": "2018-10-06T12:04:59", "url": "https://files.pythonhosted.org/packages/0d/29/2543aef20e12da11925476d3eb13c0f00e087bc9327ad5b15e0d3cd3b3eb/mhfp-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "b690cacd5087a4ea61127b7f53647047", "sha256": "9ff212f44734b8269dcb88a66808a412f87eb2e41f5116148a049d639e49e45d" }, "downloads": -1, "filename": "mhfp-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b690cacd5087a4ea61127b7f53647047", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8665, "upload_time": "2018-11-05T09:39:20", "url": "https://files.pythonhosted.org/packages/ad/3f/c4b4ee85f5b981afb5372acb453dc8691c605c35798e82194350affba39e/mhfp-1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c0ac4d7353c74874c6abd0ebc5c3759", "sha256": "0618f4499f991236ae6cef815f19f19793b0569f035ac8424296a3a3a7f1e42c" }, "downloads": -1, "filename": "mhfp-1.1.tar.gz", "has_sig": false, "md5_digest": "2c0ac4d7353c74874c6abd0ebc5c3759", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19220, "upload_time": "2018-11-05T09:39:22", "url": "https://files.pythonhosted.org/packages/36/92/988ae7256eb59bc6665b1376e56c67c84b559e9801d3d40b6f484072a4cd/mhfp-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "4ac2a911d278936ff8eb1668e3b75816", "sha256": "31c006a8abe41557a20c01d54de37e496833c0fd4e7b9633e162f32ebfa774e1" }, "downloads": -1, "filename": "mhfp-1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4ac2a911d278936ff8eb1668e3b75816", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8721, "upload_time": "2018-11-05T13:21:13", "url": "https://files.pythonhosted.org/packages/76/06/082774b85bc0bd2c86d26a8f8da5af5ce78323df60ddbef2268cdac432aa/mhfp-1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "434d2fefda1376e555ea3e441a48ffac", "sha256": "1c8e4e62def38559b7ec1dcc6d1a3a3efd2e9edc12624cacda9afcabdb4a95aa" }, "downloads": -1, "filename": "mhfp-1.2.tar.gz", "has_sig": false, "md5_digest": "434d2fefda1376e555ea3e441a48ffac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20867, "upload_time": "2018-11-05T13:21:15", "url": "https://files.pythonhosted.org/packages/ca/b2/2f16076862be3452e59d1234a5ac4d9a1fbe98ea1aa9c4f3fecd6cc07859/mhfp-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "ad0876fcf259f9ec0622f2c7efa1669b", "sha256": "1b3347a0a444b99e3ee14ff2406c3f65f06c7a8a4cf7fbba330cc733a846c015" }, "downloads": -1, "filename": "mhfp-1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ad0876fcf259f9ec0622f2c7efa1669b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8753, "upload_time": "2018-11-08T13:42:45", "url": "https://files.pythonhosted.org/packages/cf/d7/4b9abc2e8fe3785e200b5dd41695c0d67a855126485bbeafc4fac24e3c7e/mhfp-1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "964813938011bc0dfc457362e34362b8", "sha256": "82c6e0feb8595fb0a1240425cb1a0f0462428ba6cc9728b493025e5d3d1872c4" }, "downloads": -1, "filename": "mhfp-1.3.tar.gz", "has_sig": false, "md5_digest": "964813938011bc0dfc457362e34362b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20908, "upload_time": "2018-11-08T13:42:46", "url": "https://files.pythonhosted.org/packages/06/5a/348339badffb28486ae4e113779dec7b57f6b7e76fb28919150b302b6d52/mhfp-1.3.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "f5a7b073af8abb7f7f294cbbba52b512", "sha256": "859931287cfcd34a32b7eb48d516a3bab6329bbcfc3345a1c1c200365b26a595" }, "downloads": -1, "filename": "mhfp-1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "f5a7b073af8abb7f7f294cbbba52b512", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9063, "upload_time": "2018-12-13T10:36:44", "url": "https://files.pythonhosted.org/packages/49/07/00a646cf3b4649484a5aaf8eb164eeaff579c1571d2908a17ad057930bc6/mhfp-1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1bc88f246c02fa95af717277bcfb595e", "sha256": "c31f21917ac1adbd7846f10494d251a0f0ebf4651102e0991084e8b71cb41327" }, "downloads": -1, "filename": "mhfp-1.4.tar.gz", "has_sig": false, "md5_digest": "1bc88f246c02fa95af717277bcfb595e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22075, "upload_time": "2018-12-13T10:36:46", "url": "https://files.pythonhosted.org/packages/be/b7/8b006dde87cdf5f49f91a809089336018ff0d32ce4dc21e2827d5e8baa5a/mhfp-1.4.tar.gz" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "d42816811884ce4d992351edbd8f54da", "sha256": "a87a50ace20227857ed6d4639228672f19f43ea989e51a5f7b42c88f5fdfb0f7" }, "downloads": -1, "filename": "mhfp-1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "d42816811884ce4d992351edbd8f54da", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9191, "upload_time": "2018-12-16T20:29:00", "url": "https://files.pythonhosted.org/packages/e7/d3/a62501da4dfaf5a07d4dbfefce5bf87875c7b59f78ab3584c765c688a7d0/mhfp-1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b0b04a4c910b07a7d358b094c79b0b3d", "sha256": "ba36acfba23a2ce9256103576b91acd8904445a7d7d9a226075697fc5d7c2fd3" }, "downloads": -1, "filename": "mhfp-1.5.tar.gz", "has_sig": false, "md5_digest": "b0b04a4c910b07a7d358b094c79b0b3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22328, "upload_time": "2018-12-16T20:29:02", "url": "https://files.pythonhosted.org/packages/0f/fa/17c747014a5c2543728f6307188df2a60259b39bf537aba9d2c8ecc9a5cd/mhfp-1.5.tar.gz" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "4ee364bcf149a4e728845f888898db26", "sha256": "0c364a7d31c219f3592ad09c5b8a33c6d4c8ceb74bb78d3b9ced02e62cc18678" }, "downloads": -1, "filename": "mhfp-1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "4ee364bcf149a4e728845f888898db26", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9378, "upload_time": "2019-01-18T09:34:02", "url": "https://files.pythonhosted.org/packages/dd/04/033bf736f6a48832931f2b3732d6f0668284bc9aac220c96c276ac1259e5/mhfp-1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "84eaccdda3d1f939302655f675c26b84", "sha256": "b210ed671b2d573414a0fdd219e32992b42a2c8fe630d9b9c9161f4c9e292cfa" }, "downloads": -1, "filename": "mhfp-1.6.tar.gz", "has_sig": false, "md5_digest": "84eaccdda3d1f939302655f675c26b84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22500, "upload_time": "2019-01-18T09:34:03", "url": "https://files.pythonhosted.org/packages/19/a8/a773a8c8476692af38da497abf0736b6a01c70cf547d5227aab5ccb7ccbc/mhfp-1.6.tar.gz" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "6259e71389c71a0894d346e240f3fd4b", "sha256": "efffe1d9e41d1b80f1eae3108588c225b6453a55892e65cc8bb48aab4bcac8e7" }, "downloads": -1, "filename": "mhfp-1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "6259e71389c71a0894d346e240f3fd4b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9275, "upload_time": "2019-01-18T13:42:41", "url": "https://files.pythonhosted.org/packages/4c/12/26cff9a908519acd317204d6684abe904f8ab417b38f125cb9d9c228fb89/mhfp-1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9d0b6b5d1c289d4a5898595b704dd727", "sha256": "52d117c8e0143b0dd3507961c202b88989dbbced2a4e8a1d3cfae3041ecb7952" }, "downloads": -1, "filename": "mhfp-1.7.tar.gz", "has_sig": false, "md5_digest": "9d0b6b5d1c289d4a5898595b704dd727", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22407, "upload_time": "2019-01-18T13:42:42", "url": "https://files.pythonhosted.org/packages/b2/a3/d7a0f42017bb042599ab23ec39f0f24302ac6218b593963c015a5f530642/mhfp-1.7.tar.gz" } ], "1.8": [ { "comment_text": "", "digests": { "md5": "b48e136bd7c7aa6013a2d495c9dad70f", "sha256": "416d7dd96e148fcbc6e9c78b3ceb82452177e0ac5e88eaf09e16be01d409fb49" }, "downloads": -1, "filename": "mhfp-1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "b48e136bd7c7aa6013a2d495c9dad70f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9316, "upload_time": "2019-01-21T10:16:28", "url": "https://files.pythonhosted.org/packages/eb/d7/affd43ddd0fd443ccda7fc081f85580dbc902d91026d66da63d43f7d5a4d/mhfp-1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d3b21a1c846fff35d413664fb3dc2d07", "sha256": "4fb27a76b7c655d454eafa33e1e74d0748ea6df62022f2f7879d99f466a66aee" }, "downloads": -1, "filename": "mhfp-1.8.tar.gz", "has_sig": false, "md5_digest": "d3b21a1c846fff35d413664fb3dc2d07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22430, "upload_time": "2019-01-21T10:16:30", "url": "https://files.pythonhosted.org/packages/99/be/ac5c5e6435b2434e6c6bb1cfa218bf2f5dbf08686363431cb68e512cf28c/mhfp-1.8.tar.gz" } ], "1.9": [ { "comment_text": "", "digests": { "md5": "53e260393dfef2f2bbe6dad8872c6040", "sha256": "4fbc7d1b7985167880cad5a5579d2fa8efbc6bd298417d4ecfe0633589b6c3cd" }, "downloads": -1, "filename": "mhfp-1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "53e260393dfef2f2bbe6dad8872c6040", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9528, "upload_time": "2019-08-28T11:39:11", "url": "https://files.pythonhosted.org/packages/96/49/26bd625354b5d827a69b4ad73ed74075cbcd51aeec5110582ebd0cdf67f3/mhfp-1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "47fd7dbdb39e6af269cbc6454d81a457", "sha256": "c15f0da6b308641721524a71307addd652f316fe089c2f81d33d8aa803f7420d" }, "downloads": -1, "filename": "mhfp-1.9.tar.gz", "has_sig": false, "md5_digest": "47fd7dbdb39e6af269cbc6454d81a457", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22659, "upload_time": "2019-08-28T11:39:13", "url": "https://files.pythonhosted.org/packages/ba/f2/4bbaa24542233b433db7cdd62c980fba530ed80f5bbfb2cc8cb746e43f92/mhfp-1.9.tar.gz" } ], "1.9.1": [ { "comment_text": "", "digests": { "md5": "c0aacfd16d873c9bf0949fffbd5d92a2", "sha256": "69ac3f474e7b7f5487cf0a57d4d604d28522bcc62bcbf0a75f4d25e8dea70b6e" }, "downloads": -1, "filename": "mhfp-1.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c0aacfd16d873c9bf0949fffbd5d92a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9617, "upload_time": "2019-08-28T12:06:31", "url": "https://files.pythonhosted.org/packages/af/02/5319c1342365817a59c89821e639a4705b123c442fbfa162ccd5fc925b0a/mhfp-1.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "610e5f720283622edc8f08cc1e747985", "sha256": "dbf89f885e79649e67f9fbd796ef3d7c36452eddd732d96fe86f68230333ba2f" }, "downloads": -1, "filename": "mhfp-1.9.1.tar.gz", "has_sig": false, "md5_digest": "610e5f720283622edc8f08cc1e747985", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22738, "upload_time": "2019-08-28T12:06:33", "url": "https://files.pythonhosted.org/packages/f0/fe/3aebfaeb0cf1aa0415188a8e10247d812465633f0533e493d7dea4895e2d/mhfp-1.9.1.tar.gz" } ], "1.9.2": [ { "comment_text": "", "digests": { "md5": "d52a501d1022c6bc00ccc3fb693dee94", "sha256": "3ca5325a30a315fb17978724159d53cc9d1cb3a5c34e68ec2e5babb542ad66a1" }, "downloads": -1, "filename": "mhfp-1.9.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d52a501d1022c6bc00ccc3fb693dee94", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9666, "upload_time": "2019-08-28T13:12:32", "url": "https://files.pythonhosted.org/packages/e9/24/3c853163790e1f42847d1fa96901b07a9db19614014dd34c5e3f06808a6b/mhfp-1.9.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "283d6f4dc7982f536dbc5d2820edc9f2", "sha256": "bff6d38232502896abeab09224ac747390b4326d50114671068754ff22a09827" }, "downloads": -1, "filename": "mhfp-1.9.2.tar.gz", "has_sig": false, "md5_digest": "283d6f4dc7982f536dbc5d2820edc9f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22783, "upload_time": "2019-08-28T13:12:33", "url": "https://files.pythonhosted.org/packages/eb/b6/877cbe38d04c538486739fbb1b1a93093018d4702d51d616d21274c04491/mhfp-1.9.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d52a501d1022c6bc00ccc3fb693dee94", "sha256": "3ca5325a30a315fb17978724159d53cc9d1cb3a5c34e68ec2e5babb542ad66a1" }, "downloads": -1, "filename": "mhfp-1.9.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d52a501d1022c6bc00ccc3fb693dee94", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9666, "upload_time": "2019-08-28T13:12:32", "url": "https://files.pythonhosted.org/packages/e9/24/3c853163790e1f42847d1fa96901b07a9db19614014dd34c5e3f06808a6b/mhfp-1.9.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "283d6f4dc7982f536dbc5d2820edc9f2", "sha256": "bff6d38232502896abeab09224ac747390b4326d50114671068754ff22a09827" }, "downloads": -1, "filename": "mhfp-1.9.2.tar.gz", "has_sig": false, "md5_digest": "283d6f4dc7982f536dbc5d2820edc9f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22783, "upload_time": "2019-08-28T13:12:33", "url": "https://files.pythonhosted.org/packages/eb/b6/877cbe38d04c538486739fbb1b1a93093018d4702d51d616d21274c04491/mhfp-1.9.2.tar.gz" } ] }