{ "info": { "author": "Gary Marigliano", "author_email": "", "bugtrack_url": null, "classifiers": [], "description": "# Trefle \u2014 A scikit-learn compatible classifier using interpretable fuzzy systems\n\nTrefle is a **scikit-learn compatible** estimator implementing the [FuzzyCoCo algorithm](#fuzzycoco-algorithm) that uses a cooperative coevolution algorithm to find and build interpretable fuzzy systems.\n\nHere is a basic example using Wisconsin Breast Cancer Dataset, a binary classification problem, from scikit-learn:\n```python\nimport random\nimport numpy as np\n\nfrom sklearn.datasets import load_breast_cancer\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import train_test_split\n\nfrom trefle.fitness_functions.output_thresholder import round_to_cls\nfrom trefle.trefle_classifier import TrefleClassifier\n\nnp.random.seed(0)\nrandom.seed(0)\n\n# Load dataset\ndata = load_breast_cancer()\n\n# Organize our data\nX = data[\"data\"]\ny = data[\"target\"]\ny = np.reshape(y, (-1, 1)) # output needs to be at least 1 column wide\n\n# Split our data\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)\n\n# Declare the fitness function we want to use. Fitness value: higher is better.\ndef fit(y_true, y_pred):\n # y_pred are floats in [0, n_classes-1]. To use accuracy metric we need\n # to binarize the output using round_to_cls()\n y_pred_bin = round_to_cls(y_pred, n_classes=2)\n return accuracy_score(y_true, y_pred_bin)\n\n# Initialize our classifier\nclf = TrefleClassifier(\n n_rules=4,\n n_classes_per_cons=[2], # a list where each element indicates the number of classes a consequent has. Specify 0 if one consequent is a continuous (regression) value.\n n_labels_per_mf=3,\n default_cons=[0], # the default rule will use the class 0\n n_max_vars_per_rule=3,\n n_generations=20,\n fitness_function=fit,\n verbose=False,\n)\n\n# Train our classifier\nclf.fit(X_train, y_train)\n\n# Make predictions\ny_pred = clf.predict_classes(X_test)\n\nclf.print_best_fuzzy_system()\n\n# Evaluate accuracy\nscore = accuracy_score(y_test, y_pred)\nprint(\"Score on test set: {:.3f}\".format(score))\n```\n\nThis will output the fuzzy system:\n\n```\nIF v0 is low AND v5 is medium AND v16 is low THEN [0]\nIF v25 is high AND v9 is high AND v14 is medium THEN [0]\nIF v6 is high THEN [0]\nIF v21 is low AND v23 is low THEN [1]\nELSE [0]\nVariables definition\nv0: -0.366, -0.347, -0.343,\nv5: 0.155, 2.03, 2.03,\nv6: 0.0756, 0.151, 1.36,\nv9: 5.06, 11.2, 16.6,\nv14: 5.89, 34.2, 37.2,\nv16: 0.0815, 0.652, 1.06,\nv21: -0.299, -0.294, -0.294,\nv23: -0.0555, -0.0553, -0.0553,\nv25: 0.193, 0.568, 0.631,\n\nScore on test set: 0.910\n```\n\n\nIf you have never heard of fuzzy systems before you can basically think of them as a set of rules giving a prediction after they have been evaluated. For example \"IF temperature is HIGH and sunshine is MEDIUM THEN tourists is MEDIUM\".\n\n## Installation\n\nStart using Trefle today with pip :-)\n\n```\npip install trefle\n```\n\n## Examples of use\n\nSee other examples in the **examples** folder.\n\n* [Binary problem](examples/01_binary_problem.py)\n* [Multiclass problem](examples/02_multiclass_problem.py)\n* [Multiclass one-hot problem](examples/03_multiclass_one_hot_problem.py)\n* [Regression problem](examples/04_regression_problem.py)\n\n\n## Cool features\n\n* Support classification (binary and multiclass), regression and mixed (i.e. both classification and regression) problems\n* Fully compatible scikit-learn estimator\n * Use it like a regular estimator\n * Support [GridSearch](docs/COOL_FEATURES.md#grid-search)\n* [Fuzzy systems parameters](docs/COOL_FEATURES.md#trefleclassifier-parameters) are customizable e.g. the number of rules, the number of linguistic labels per rule,...\n* [Evolutionary parameters](docs/COOL_FEATURES.md#trefleclassifier-parameters) are customizable e.g. number of generations, population size, hall of fame size,...\n* [Custom fitness function](docs/COOL_FEATURES.md#custom-fitness-function)\n* [Import and Export](docs/COOL_FEATURES.md#import-and-export) the best fuzzy system for future use in an interoperable format\n* Fine tune your best fuzzy system using the companion library [LFA Toolbox](https://github.com/krypty/lfa_toolbox). Add or remove a fuzzy rule to increase either the performance or interpretability of the fuzzy system. Or tweak the membership functions.\n* The fuzzy engine is implemented in C++14 allowing Trefle to be quite fast and use all the CPU cores\n* Last but not least, Trefle is a recursive acronym like GNU which is cool. It stands for **T**refle is a **R**evised and **E**volutionary-based **F**uzzy **L**ogic **E**ngine. And trefle also means clover in French.\n\n## What are fuzzy logic and FuzzyCoco algorithm?\n\n### FuzzyCoCo algorithm\n\nThe following sentences are drawn from the PhD thesis \"Coevolutionary Fuzzy Modeling\" by Carlos Andr\u00e9s PE\u00d1A REYES that you can find [here](https://infoscience.epfl.ch/record/33110?ln=en).\n\n>Fuzzy CoCo is a novel approach that combines two methodologies - fuzzy systems and coevolutionary algorithms - so as to automatically produce accurate and interpretable systems. The approach is based on two elements: (1) a system model capable of providing both accuracy and human understandability, and (2) an algorithm that allows to build such a model from available information.\n\nIn short, as a user this algorithm will give you a model that is interpretable and accurate (i.e. you can see how the model works) given a classification or a regression problem. From this model you can read the features that it extracted.\n\n### How it works?\n\n1. Load dataset\n2. Configure experiment i.e. the number of rules, the number of generations and other fuzzy systems or evolutionary parameters\n3. Create two initial populations (also called \"species\"; one for the fuzzy rules and the other for the\nvariables definition). Both represent individuals as a list of bits.\n4. Run evolutionary algorithm. It will perform the following steps.\n 1. Select\n 2. Crossover\n 3. Mutate\n 4. Evaluate by combining individuals from a population with representatives\n of the other population to form a fuzzy system\n 5. Save the best couple (i.e. the combination of an individual from pop1 and one from pop2)\n 6. Repeat these steps until max generations is reached\n5. Retrieve best individual couple i.e. the best fuzzy system\n6. Optionally use the [LFA Toolbox](https://github.com/krypty/lfa_toolbox) to visualize or fine tune it\n\n# Deployment and Tests\n\nBoth are available in the `docs` folder.\n\n# Build from sources\n\nSee [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md).\n\n# Where is the doc?!\n\nThere is no documentation like a Sphinx one. Start by looking in the [docs](docs) folder or directly in the source code of `TrefleClassifier`.\n\n# Credits\n\n* [Gary Marigliano](https://github.com/krypty)\n* Carlos Andr\u00e9s PE\u00d1A REYES\n* [CI4CB Team](http://iict-space.heig-vd.ch/cpn/)\n\n![ci4cb_logo](assets/img/ci4cb_logo.png)\n![heigvd_logo](assets/img/heigvd_logo.png)\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": "http://iict-space.heig-vd.ch/cpn/", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "trefle", "package_url": "https://pypi.org/project/trefle/", "platform": "", "project_url": "https://pypi.org/project/trefle/", "project_urls": { "Homepage": "http://iict-space.heig-vd.ch/cpn/" }, "release_url": "https://pypi.org/project/trefle/0.2/", "requires_dist": [ "deap (>=1.2.2)", "pandas (>=0.22.0)", "scikit-learn (>=0.19.1)", "scipy (>=1.0.0)", "numpy (>=1.14.0)", "bitarray (==0.8.3)", "matplotlib (>=2.1.1); extra == 'evo_plot'" ], "requires_python": ">=3.5", "summary": "Trefle stands for Trefle is a Revised and Evolutionary-based Fuzzy Logic Engine. It is an implementation of the FuzzyCoCo algorithm i.e. a scikit-learn compatible estimator that use a cooperative coevolution algorithm to find and build interpretable fuzzy systems. Designed for both students and researchers", "version": "0.2" }, "last_serial": 4688824, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "b1fbeddf376d800b10b5dcb0be51872e", "sha256": "bfbc4d4c6737106281153c54d11bcc541b4eaf722076b3e06d2bad2b752793c7" }, "downloads": -1, "filename": "trefle-0.1.1-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "b1fbeddf376d800b10b5dcb0be51872e", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 718401, "upload_time": "2019-01-12T14:35:49", "url": "https://files.pythonhosted.org/packages/d0/9f/cfcb3117cce68abace0838ee11c8be7c55f48aec0c487d957221e2fbef04/trefle-0.1.1-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "0dd522b12a15ecbe6031e3646e4369fd", "sha256": "ab4283c9c04dec358c37f25f9c96c8fac72314dbc149837eb14e09c9c4bf33ff" }, "downloads": -1, "filename": "trefle-0.1.1-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "0dd522b12a15ecbe6031e3646e4369fd", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 718404, "upload_time": "2019-01-12T14:36:55", "url": "https://files.pythonhosted.org/packages/72/b4/a2eed5039cf1d4e8b3407765142b077e230ea8f2d5dd117a21d2a5079011/trefle-0.1.1-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "e3babbcccb99da20dcd0ff9e6a772453", "sha256": "531f6b6cddf0ef6281f9743e014588a60b93fcaea9a71ac1bceb8f0d21bb1a93" }, "downloads": -1, "filename": "trefle-0.1.1-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "e3babbcccb99da20dcd0ff9e6a772453", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 718404, "upload_time": "2019-01-12T14:38:13", "url": "https://files.pythonhosted.org/packages/e3/69/66c2fd8afd40f2632b5f43bdf8f34a4d0903c22fede618aaf46bbdda8fd0/trefle-0.1.1-cp37-cp37m-manylinux1_x86_64.whl" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "d4275bc7a5b0fb77352711109791afcc", "sha256": "f01b039d562cfa5092a2d767afc6e6c9eef13630152f8fedb1208e6f66bcd21f" }, "downloads": -1, "filename": "trefle-0.2-cp35-cp35m-macosx_10_12_x86_64.whl", "has_sig": false, "md5_digest": "d4275bc7a5b0fb77352711109791afcc", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 268927, "upload_time": "2019-01-12T15:02:35", "url": "https://files.pythonhosted.org/packages/67/90/b23a3857a17d1fe75e0635985e880a5863bb11c623a4de87000d607979d9/trefle-0.2-cp35-cp35m-macosx_10_12_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "4eac1f2210550afb739f4a92cee7b6c3", "sha256": "6c52042e1ff8113ebaecfedbb8ee5313f4e414987afe386386517396df280ca3" }, "downloads": -1, "filename": "trefle-0.2-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "4eac1f2210550afb739f4a92cee7b6c3", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 718383, "upload_time": "2019-01-12T14:49:33", "url": "https://files.pythonhosted.org/packages/3b/94/67b30c11a1a50b5d6ecda015aa99aac2158b7d46402831d1fdef9a76cb0a/trefle-0.2-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "928ea27f7d2d27ed9fb0429b4a932209", "sha256": "3efa6d759276afdc00b8f24a80eb88bf368c514476573b0818ccfc8b8d5b90e9" }, "downloads": -1, "filename": "trefle-0.2-cp35-cp35m-win32.whl", "has_sig": false, "md5_digest": "928ea27f7d2d27ed9fb0429b4a932209", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 189064, "upload_time": "2019-01-12T16:32:38", "url": "https://files.pythonhosted.org/packages/36/4d/c78416fe89d37c71c92f99137591fd6bf11d0a292f2a957d196666e06184/trefle-0.2-cp35-cp35m-win32.whl" }, { "comment_text": "", "digests": { "md5": "dd53885c712563740307271b9ba14e24", "sha256": "2febdc588a27c097bc4257401c7e222040779dd5dc2650e867a2299eea5dfbbb" }, "downloads": -1, "filename": "trefle-0.2-cp36-cp36m-macosx_10_12_x86_64.whl", "has_sig": false, "md5_digest": "dd53885c712563740307271b9ba14e24", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 268944, "upload_time": "2019-01-12T15:06:47", "url": "https://files.pythonhosted.org/packages/1d/cd/b787745f06f3b0f29cd7264ff70792a4c5c27d7c43e7f04c9899018bb218/trefle-0.2-cp36-cp36m-macosx_10_12_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "4ba3be73c680761c52c71df29cbc6f72", "sha256": "ec35f45e0d9960f3d60c85fee60a17ce5a638bf919ff0bc882cdc286f828f343" }, "downloads": -1, "filename": "trefle-0.2-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "4ba3be73c680761c52c71df29cbc6f72", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 718386, "upload_time": "2019-01-12T14:50:37", "url": "https://files.pythonhosted.org/packages/d1/4a/3043c0f0c99f3dc6fda6c2e52d0bc522b26c06cd0191f91695b3cd5c678f/trefle-0.2-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "5b144199fbccdbe4cd96cf128a37336f", "sha256": "598eaeae72f9d1a26ff0edddc717f425f1308a7bd26d5201b06ae5eb6cf16363" }, "downloads": -1, "filename": "trefle-0.2-cp36-cp36m-win32.whl", "has_sig": false, "md5_digest": "5b144199fbccdbe4cd96cf128a37336f", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 189053, "upload_time": "2019-01-12T16:41:37", "url": "https://files.pythonhosted.org/packages/81/52/c133be8fd407cbb58675cd0698e90d69ef107240f06f1a27f07eaf3b702d/trefle-0.2-cp36-cp36m-win32.whl" }, { "comment_text": "", "digests": { "md5": "95653422d9c7487babbfe2da13062078", "sha256": "0b9b69370df2f370552846a1839f9d2c837dbec9d9b7a1a797b47731c8daec2a" }, "downloads": -1, "filename": "trefle-0.2-cp37-cp37m-macosx_10_12_x86_64.whl", "has_sig": false, "md5_digest": "95653422d9c7487babbfe2da13062078", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 268945, "upload_time": "2019-01-12T15:09:52", "url": "https://files.pythonhosted.org/packages/a6/53/b5e8f1ade966327cea46af75d17a6823a37da44c4e43bac46bf5bce1d88a/trefle-0.2-cp37-cp37m-macosx_10_12_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "802afa0754e45ca90fbf5e2bdb0c43b9", "sha256": "9a4787951a2060bce0af3f5741defac1354937ebd88a5034b20201d1ded539fb" }, "downloads": -1, "filename": "trefle-0.2-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "802afa0754e45ca90fbf5e2bdb0c43b9", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 718387, "upload_time": "2019-01-12T14:51:41", "url": "https://files.pythonhosted.org/packages/49/7f/8ccc3c492bca33a0b977265a4084781b5c2ad73cd81f6b6fa1b6030c7b12/trefle-0.2-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "6051b44365b362307f54570ebf4cec40", "sha256": "0c89d373d09ff3e4396498f15ac1b7ac9faf651f8a2917563e1520f0992c39b2" }, "downloads": -1, "filename": "trefle-0.2-cp37-cp37m-win32.whl", "has_sig": false, "md5_digest": "6051b44365b362307f54570ebf4cec40", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 189055, "upload_time": "2019-01-12T16:47:14", "url": "https://files.pythonhosted.org/packages/9b/8d/d0edfa7a3beb775ed2e095075e7a2b42af383a3bd5237c42fc4ad9a6e9e4/trefle-0.2-cp37-cp37m-win32.whl" }, { "comment_text": "", "digests": { "md5": "c0cc953dbff1671d5388a9468de19ac7", "sha256": "76678aa9c50b14db263073766411cce0189e5ad4ff0667e06f1d148daf770154" }, "downloads": -1, "filename": "trefle-0.2.tar.gz", "has_sig": false, "md5_digest": "c0cc953dbff1671d5388a9468de19ac7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 30505, "upload_time": "2019-01-12T16:32:40", "url": "https://files.pythonhosted.org/packages/de/2d/6b1a169e20af1f727bef335edd4bf2ec0f5d6ed2e3b683c462d4a1a37f3a/trefle-0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d4275bc7a5b0fb77352711109791afcc", "sha256": "f01b039d562cfa5092a2d767afc6e6c9eef13630152f8fedb1208e6f66bcd21f" }, "downloads": -1, "filename": "trefle-0.2-cp35-cp35m-macosx_10_12_x86_64.whl", "has_sig": false, "md5_digest": "d4275bc7a5b0fb77352711109791afcc", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 268927, "upload_time": "2019-01-12T15:02:35", "url": "https://files.pythonhosted.org/packages/67/90/b23a3857a17d1fe75e0635985e880a5863bb11c623a4de87000d607979d9/trefle-0.2-cp35-cp35m-macosx_10_12_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "4eac1f2210550afb739f4a92cee7b6c3", "sha256": "6c52042e1ff8113ebaecfedbb8ee5313f4e414987afe386386517396df280ca3" }, "downloads": -1, "filename": "trefle-0.2-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "4eac1f2210550afb739f4a92cee7b6c3", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 718383, "upload_time": "2019-01-12T14:49:33", "url": "https://files.pythonhosted.org/packages/3b/94/67b30c11a1a50b5d6ecda015aa99aac2158b7d46402831d1fdef9a76cb0a/trefle-0.2-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "928ea27f7d2d27ed9fb0429b4a932209", "sha256": "3efa6d759276afdc00b8f24a80eb88bf368c514476573b0818ccfc8b8d5b90e9" }, "downloads": -1, "filename": "trefle-0.2-cp35-cp35m-win32.whl", "has_sig": false, "md5_digest": "928ea27f7d2d27ed9fb0429b4a932209", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 189064, "upload_time": "2019-01-12T16:32:38", "url": "https://files.pythonhosted.org/packages/36/4d/c78416fe89d37c71c92f99137591fd6bf11d0a292f2a957d196666e06184/trefle-0.2-cp35-cp35m-win32.whl" }, { "comment_text": "", "digests": { "md5": "dd53885c712563740307271b9ba14e24", "sha256": "2febdc588a27c097bc4257401c7e222040779dd5dc2650e867a2299eea5dfbbb" }, "downloads": -1, "filename": "trefle-0.2-cp36-cp36m-macosx_10_12_x86_64.whl", "has_sig": false, "md5_digest": "dd53885c712563740307271b9ba14e24", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 268944, "upload_time": "2019-01-12T15:06:47", "url": "https://files.pythonhosted.org/packages/1d/cd/b787745f06f3b0f29cd7264ff70792a4c5c27d7c43e7f04c9899018bb218/trefle-0.2-cp36-cp36m-macosx_10_12_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "4ba3be73c680761c52c71df29cbc6f72", "sha256": "ec35f45e0d9960f3d60c85fee60a17ce5a638bf919ff0bc882cdc286f828f343" }, "downloads": -1, "filename": "trefle-0.2-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "4ba3be73c680761c52c71df29cbc6f72", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 718386, "upload_time": "2019-01-12T14:50:37", "url": "https://files.pythonhosted.org/packages/d1/4a/3043c0f0c99f3dc6fda6c2e52d0bc522b26c06cd0191f91695b3cd5c678f/trefle-0.2-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "5b144199fbccdbe4cd96cf128a37336f", "sha256": "598eaeae72f9d1a26ff0edddc717f425f1308a7bd26d5201b06ae5eb6cf16363" }, "downloads": -1, "filename": "trefle-0.2-cp36-cp36m-win32.whl", "has_sig": false, "md5_digest": "5b144199fbccdbe4cd96cf128a37336f", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 189053, "upload_time": "2019-01-12T16:41:37", "url": "https://files.pythonhosted.org/packages/81/52/c133be8fd407cbb58675cd0698e90d69ef107240f06f1a27f07eaf3b702d/trefle-0.2-cp36-cp36m-win32.whl" }, { "comment_text": "", "digests": { "md5": "95653422d9c7487babbfe2da13062078", "sha256": "0b9b69370df2f370552846a1839f9d2c837dbec9d9b7a1a797b47731c8daec2a" }, "downloads": -1, "filename": "trefle-0.2-cp37-cp37m-macosx_10_12_x86_64.whl", "has_sig": false, "md5_digest": "95653422d9c7487babbfe2da13062078", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 268945, "upload_time": "2019-01-12T15:09:52", "url": "https://files.pythonhosted.org/packages/a6/53/b5e8f1ade966327cea46af75d17a6823a37da44c4e43bac46bf5bce1d88a/trefle-0.2-cp37-cp37m-macosx_10_12_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "802afa0754e45ca90fbf5e2bdb0c43b9", "sha256": "9a4787951a2060bce0af3f5741defac1354937ebd88a5034b20201d1ded539fb" }, "downloads": -1, "filename": "trefle-0.2-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "802afa0754e45ca90fbf5e2bdb0c43b9", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 718387, "upload_time": "2019-01-12T14:51:41", "url": "https://files.pythonhosted.org/packages/49/7f/8ccc3c492bca33a0b977265a4084781b5c2ad73cd81f6b6fa1b6030c7b12/trefle-0.2-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "6051b44365b362307f54570ebf4cec40", "sha256": "0c89d373d09ff3e4396498f15ac1b7ac9faf651f8a2917563e1520f0992c39b2" }, "downloads": -1, "filename": "trefle-0.2-cp37-cp37m-win32.whl", "has_sig": false, "md5_digest": "6051b44365b362307f54570ebf4cec40", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 189055, "upload_time": "2019-01-12T16:47:14", "url": "https://files.pythonhosted.org/packages/9b/8d/d0edfa7a3beb775ed2e095075e7a2b42af383a3bd5237c42fc4ad9a6e9e4/trefle-0.2-cp37-cp37m-win32.whl" }, { "comment_text": "", "digests": { "md5": "c0cc953dbff1671d5388a9468de19ac7", "sha256": "76678aa9c50b14db263073766411cce0189e5ad4ff0667e06f1d148daf770154" }, "downloads": -1, "filename": "trefle-0.2.tar.gz", "has_sig": false, "md5_digest": "c0cc953dbff1671d5388a9468de19ac7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 30505, "upload_time": "2019-01-12T16:32:40", "url": "https://files.pythonhosted.org/packages/de/2d/6b1a169e20af1f727bef335edd4bf2ec0f5d6ed2e3b683c462d4a1a37f3a/trefle-0.2.tar.gz" } ] }