{ "info": { "author": "Esteban Escamilla Navarro", "author_email": "escamilla.een@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "HeurisPy\n======\n\n``HeurisPy`` is an object oriented framework developed in Python. Its objective is to help the user to obtain experience in the use of local search heuristics (l.s.h.) in \ndiscrete optimization problems (d.o.p.).\n\n``HeurisPy`` has been desinged with the next principles in mind:\n\n--It needs to be general enough to allow the definition of various discrete optimization problems.\n\n--It needs to be accesible to users with low experiencie in the use of local search heuristics and programming.\n\n--It needs to contain various local search heuristics available to use, and a general class to add new heuristics.\n\n--It needs parallel processing to speed up the procces and tools to ease the statistical analysis.\n\nIt's expected that the user only needs to program its discrete optimization problem and choose the heuristics to run. ``HeurisPy`` will handle the heuristic searchs and get the\ninfo needed for the user to make an informed decision.\n\n``HeurisPy`` is programmed in Python 3.7, that can be downloaded [here](https://www.python.org/downloads/) and uses these external libraries:\n\n--**numpy**: Cientific computing library. [Homepage](https://www.numpy.org/)\n\n--**pathos**: Parallel processing library. [Homepage](https://pypi.org/project/pathos/)\n\n--**pandas**: Data analysis library. [Homepage](https://pandas.pydata.org/)\n\n--**pyFPDF**: PDF files library. [Homepage](https://pyfpdf.readthedocs.io/en/latest/)\n\n--**PyPDF2**: A PDF toolkit. [Homepage](https://pypi.org/project/PyPDF2/)\n\n--**matplotlib**: Plotting library. [Homepage](https://matplotlib.org/)\n\n--**tqdm**: Progress bar library. [Homepage](https://tqdm.github.io/)\n\nInstallation\n======\n\n``HeurisPy`` is available as a library in PyPI and can be installed using the command:\n\n\tpip install heurispy\n\nTo verify the installation, run one of the examples scripts, like \"coloracion_grafo_recsim.py\" in the route /heurispy/ejemplos/. \n\nLicense\n======\n\n Copyright 2019, LANIA, A.C.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\nHow does it work\n======\n\n``HeurisPy`` has three main classes that need the user to work properly:\n\n--**Problema**: Handles the d.o.p. programmed by the user.\n\n--**Heuristica**: Recieves attributes to do the heuristic exploration with user-defined parameters.\n\n--**Framework**: Directs all the internal processes, like the parallel processing, the data recollection and the method calls for the file generator.\n\nDefining the d.o.p.\n======\n\nFirst we need to define the d.o.p. on ``HeurisPy``. To do this, we have to create:\n\n--A method for the creation of new solutions.\n\n--A method that changes an existing solution.\n\n--The objective function to minimize.\n\nFor example, in the coloring graph problem, we assign colors to the nodes, trying to minimize the number of colors used without having repeated adjacent colors. The graph is\nrepresented in ``HeurisPy`` by a dictionary. A dictionary is a set of values that have labels named \"keys\". So:\n\n\tadyacencies_in_graph = {\"0\": [1, 4, 6],\n\t\t\t\t\t\t\t\"1\": [0, 2, 7],\n\t\t\t\t\t\t\t\"2\": [1, 3, 8],\n\t\t\t\t\t\t\t\"3\": [2, 4, 9],\n\t\t\t\t\t\t\t\"4\": [0, 3, 5],\n\t\t\t\t\t\t\t\"5\": [4, 7, 8],\n\t\t\t\t\t\t\t\"6\": [0, 8, 9],\n\t\t\t\t\t\t\t\"7\": [1, 5, 9],\n\t\t\t\t\t\t\t\"8\": [2, 5, 6],\n\t\t\t\t\t\t\t\"9\": [3, 6, 7]}\n\n\tnodes_amount = len(adyacencies_in_graph)\n\nThe elements between the \" \" are the nodes, and the lists are their adjacent nodes. Furthermore, the length of the dictionary determines the number of nodes.\n\nTo create a solution, we assing to each node a random color (represented by an integer). This can be defined as follows:\n\n\timport random\n\n\tdef create_solution():\n\t\tnew_solution = []\n\t\tfor index in range(nodes_amount):\n\t\t\tnew_solution.append(random.randint(0, nodes_amount - 1))\n\t\treturn new_solution\n\nThe new solution is a list in which the indexes represent the node, and the index value is the color assigned. To change a solution, we chose a random edge in the solution, verify\nthe color of the adjacent nodes, and chose a different color to all of them. The adjacent colors are obtained by using:\n\n\tdef get_adyacent_colors(solution, node):\n\t\tnodes = adyacencies_in_graph[str(node)]\n\t\tadyacent_colors = []\n\t\tfor current_node in nodes:\n\t\t\tadyacent_colors.append(solution[current_node])\n\t\treturn adyacent_colors\n\nAnd we change the solution by using:\n\n\tdef change_solution(solution):\n\t\tnew_solution = solution.copy()\n\t\tlength_solution = len(new_solution)\n\t\tnode_to_change = random.randint(0, length_solution - 1)\n\t\tcolors = list(range(nodes_amount))\n\t\tadyacent_colors = get_adyacent_colors(new_solution, node_to_change)\n\t\tavailable_colors = [color for color in colors if color not in adyacent_colors]\n\t\tnew_solution[node_to_change] = random.choice(available_colors)\n\t\treturn new_solution\n\nThe objective function checks the number of different colors in a solution, and how many nodes have repeated adjacent colors. This is made as follows:\n\n\tdef cost_different_colors(solution):\n\t\tdifferent_colors = set(solution)\n\t\treturn len(different_colors)\n\n\tdef cost_adyacent_colors(solution):\n\t\tfinal_value = 0\n\t\tlength_solution = len(solution)\n\t\tfor index in range(length_solution)\n\t\t\tcolor = solution[index]\n\t\t\tadyacent_colors = get_adyacent_colors(solution, index)\n\t\t\trepeated = adyacent_colors.count(color)\n\t\t\tfinal_value = final_value + repeated\n\t\treturn final_value\n\nWe add weights to each cost to allow the tuning of the objective function, and we define it:\n\n\tc_1 = 1\n\tc_2 = 1\n\n\tdef objective_function(solution):\n\t\tcolor_cost = cost_different_colors(solution)\n\t\tadyacent_cost = cost_adyacent_colors(solution)\n\t\treturn c_1*color_cost + c_2*adyacent_cost\n\nNow, we need to create an instance of the Problema class, made as:\n\n\tfrom heurispy.problema import Problema\n\n\tcoloration_problem = Problema(dominio=create_solution, funcion_objetivo=objective_function, varia_soluciones=change_solution)\n\nThis example is implemented in spanish in the scripy problema_coloracion_grafo.py in the /heurispy/ejemplos/ route.\n\nPreparing a heuristic for its use\n======\n\nEvery heuristic implemented in ``HeurisPy`` is a child class of Heuristica. To use them, we only need to import the correspondent class, assing it a Problema instance, and define\nsome general parameters. For example, to use tabu search, we do as follows:\n\n\tfrom heurispy.heuristicas.busqueda_tabu import BusquedaTabu\n\n\ttabu_search = BusquedaTabu(coloration_problem, max_iteraciones=100000)\n\nHowerer, we still need to define specific heuristic parameters for ``HeurisPy`` to work.\n\nDefining heuristic parameters\n======\n\nTo define the specific heuristic parameters, we need to create a dictionary. For tabu search:\n\n\ttabu_search_parameters = dict(espacio_memoria=[50, 100, 150], max_busquedas_sin_mejoras=[100])\n\nThis dictionary is the base that ``HeurisPy`` needs to perform the exploration. In this case, we have three block parameters:\n\n-Memory Space = 50, Max Search Without Improvement = 100 (MS=50, MSWI=100)\n\n-Memory Space = 100, Max Search Without Improvement = 100 (MS=100, MSWI=100)\n\n-Memory Space = 150, Max Search Without Improvement = 100 (MS=150, MSWI=100)\n\nEvery value in the dictionary has to be a list of all the expected values of each parameter. The next step is to define the repetitions of every parameter block.\n\nDeterming repetitions\n======\n\nTo determine the repetitions, we use the next method:\n\n\tfrom heurispy.framework import genera_bloque_parametros\n\n\texecutions_list = genera_bloque_parametros(tabu_search_parameters, repeticiones=10)\n\nWith this, 30 runs are carried out: 10 for the MS=50, MSWI=100, 10 for MS=10, MSWI=100, and 10 for MS=150, MSWI=100.\n\nHaving the heuristic and the total of runs, we can start the last ``HeurisPy`` process.\n\nStarting the heuristic exploration\n======\n\nThe inicia_exploracion_heuristica method starts the exploration:\n\n\tfrom heurispy.framework import inicia_exploracion_heuristica\n\n\tinicia_exploracion_heuristica(tabu_search, executions_list)\n\nWe can define the number of cores used in the search with the nucleos_cpu parameter. By default, it uses all the cpu cores.\n\nWith the search initiated, ``HeurisPy`` shows a progress bar that counts the finalized executions, throws information about the progress and the files created as results.\n\nChecking the files\n======\n\nWith the exploration finisted, two folders are created: \"Resultados\", that stores the statistics and plots generated by the heuristic exploration, and \"Informacion\", that contains the\ndata and advanced information. In \"Resultados\", a folder is created with the name of the heuristic used, and inside of it there's a folder with the explorations done. Its name is the\ndate and hour in which the exploration was done. For example, if the test was executed on July 4th, 2019 at 12:31 pm, then it is stored in the folder \"2019-07-04---12-31\".\nInside this folder is a pdf file, which name contains the used heuristic, the corresponding parameter block, and the date and hour in which the file was created. The information\nshown in this PDF file shows particular information of the heuristic used, so the information inside can vary.\n\nBecause the performance of the heuristic is very dependant of the used parameters and the discrete optimization problem, there's no rule that determines the ideal combination\nbetween heuristic and parameters used, so it is advised to test the d.o.p. with different heuristics and varios sets of parameters, trying to diversify the executions and getting\nthe mayor amount of available information, to try and search for consistency in the results.\n\n\n\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://gitlab.com/escamilla.een/heurispy", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "heurispy", "package_url": "https://pypi.org/project/heurispy/", "platform": "", "project_url": "https://pypi.org/project/heurispy/", "project_urls": { "Homepage": "https://gitlab.com/escamilla.een/heurispy" }, "release_url": "https://pypi.org/project/heurispy/1.0.2/", "requires_dist": [ "pathos", "tqdm", "numpy", "pandas", "fpdf", "matplotlib", "pypdf2", "xlrd" ], "requires_python": "", "summary": "Framework for heuristic exploration of local search heuristics in discrete optimization problems.", "version": "1.0.2" }, "last_serial": 6004997, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "be7806bc9979252cf3311a2508338a39", "sha256": "48d7f9cdea53dc801656a7855021a7ac1a37c30130ebc37e45d45ebd6858dfc2" }, "downloads": -1, "filename": "heurispy-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "be7806bc9979252cf3311a2508338a39", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9409, "upload_time": "2019-07-01T16:39:02", "url": "https://files.pythonhosted.org/packages/04/df/c39946ac192e9679a87e5af2cc95c18ba8e3621bbb90642e1c4befdeacbf/heurispy-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f6de1a71be2cd03c42b25199c2534330", "sha256": "07af3121b92e0edb79822a41815e1bd8abe1d6ebb93745280197b0506d047d59" }, "downloads": -1, "filename": "heurispy-0.1.tar.gz", "has_sig": false, "md5_digest": "f6de1a71be2cd03c42b25199c2534330", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7644, "upload_time": "2019-07-01T16:39:05", "url": "https://files.pythonhosted.org/packages/68/24/14aca52573b4850a844e7a2c3082d0e13987842c57e14dc055453ea77fc0/heurispy-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "77f5c7b99fcb6a63d26af9746f7ae222", "sha256": "9530c16efe8074193c25b9d24fbf631bc45a2614187942840574e1fc62ff7de8" }, "downloads": -1, "filename": "heurispy-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "77f5c7b99fcb6a63d26af9746f7ae222", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23832, "upload_time": "2019-07-01T21:23:32", "url": "https://files.pythonhosted.org/packages/16/37/64c4d3d70f2dc1bc95adfa2fdcedf2f096293431a12a4954fdf28c9ced2f/heurispy-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a8df8c49a999d5c28553c2e60b749e11", "sha256": "9feb3266c4733a91deeb66abe794e9bf38824d2c615e1329f9f75cdffa758a9e" }, "downloads": -1, "filename": "heurispy-0.1.1.tar.gz", "has_sig": false, "md5_digest": "a8df8c49a999d5c28553c2e60b749e11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14160, "upload_time": "2019-07-01T21:23:33", "url": "https://files.pythonhosted.org/packages/1a/c1/f55282715bb2a992ec34f93c058ca1d9d2b6501dd6ede5dcc79079fd1f7f/heurispy-0.1.1.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "50cfd95a93146f55a916e07fbd3e43d3", "sha256": "4f2973b1ffa21f535a2456e995119776344d1d96eb457a407cb7c2c66472c72f" }, "downloads": -1, "filename": "heurispy-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "50cfd95a93146f55a916e07fbd3e43d3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23799, "upload_time": "2019-07-01T22:34:15", "url": "https://files.pythonhosted.org/packages/df/8c/7d38ee2bc107d78624030268f9291acd7da338c513296ff036b1d8ebced7/heurispy-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d4e3820de93ff73756a6d97c43dc79f", "sha256": "2126f58100dcb0e8fca74e3005dca67e10ff7db6c103dbec0731fde9b2e12120" }, "downloads": -1, "filename": "heurispy-0.1.11.tar.gz", "has_sig": false, "md5_digest": "2d4e3820de93ff73756a6d97c43dc79f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15028, "upload_time": "2019-07-01T22:34:17", "url": "https://files.pythonhosted.org/packages/52/86/866ff08b8b9bf660fd9123aecce958f5b8674dd57ac95b136136a22bb037/heurispy-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "b7890075c6aa9c5e1deb058164f02b3d", "sha256": "ab94883bff30f196d7ad2774bb275ba7d34676e76e00278bd7fe42b1217cc8ee" }, "downloads": -1, "filename": "heurispy-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "b7890075c6aa9c5e1deb058164f02b3d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23807, "upload_time": "2019-07-01T22:38:46", "url": "https://files.pythonhosted.org/packages/87/b9/2b87e4ac165d218300a8f03007cf4482677939ffe7b6a7ba89f87218c00e/heurispy-0.1.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a60eb8b7015a543f21c2492531cf29c", "sha256": "c3dd3e11f3f1ad71885b5d31a217f10f30904b94b6bc18e11c0efffb90b130da" }, "downloads": -1, "filename": "heurispy-0.1.12.tar.gz", "has_sig": false, "md5_digest": "9a60eb8b7015a543f21c2492531cf29c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15047, "upload_time": "2019-07-01T22:38:48", "url": "https://files.pythonhosted.org/packages/3b/3d/5056f8cb5a33db275f9140782661143e9037176e9dbf3bc4e34d995979da/heurispy-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "a50ecbb6c0ed1d472beb76aec5b3c636", "sha256": "c050f98110693c6133aa3eb893c51e4397a6e9cc2de1d446e1bb3acf2c42afe6" }, "downloads": -1, "filename": "heurispy-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "a50ecbb6c0ed1d472beb76aec5b3c636", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23814, "upload_time": "2019-07-01T22:47:36", "url": "https://files.pythonhosted.org/packages/e3/77/a22550231333b2b5933f8f955567074aa09e2c753ee450360752d29959a8/heurispy-0.1.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8472407d6d45e614f73a64c1852b511e", "sha256": "b3cdd9debee83a43d8c528a21fb6c0a1894c92c6837e1aa7a6469ac045020d33" }, "downloads": -1, "filename": "heurispy-0.1.13.tar.gz", "has_sig": false, "md5_digest": "8472407d6d45e614f73a64c1852b511e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15051, "upload_time": "2019-07-01T22:47:37", "url": "https://files.pythonhosted.org/packages/3b/30/42ba84918bc748b24d846a847d851298d0d7d8862983d20f15e2fe49525f/heurispy-0.1.13.tar.gz" } ], "0.1.14": [ { "comment_text": "", "digests": { "md5": "1318f639a28c9fbad21c8c333932a085", "sha256": "d26131b308dca917a01ce66b3ec42828aaec47c06bbe4895406f7fa168aeb4f8" }, "downloads": -1, "filename": "heurispy-0.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "1318f639a28c9fbad21c8c333932a085", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 20194, "upload_time": "2019-07-14T01:48:56", "url": "https://files.pythonhosted.org/packages/9b/a3/16986ec8923440338bb6a7827b7dddfa660eb8d6558a6ecb490108e5843e/heurispy-0.1.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "275492df829cf480b80a8319e961f05e", "sha256": "1ca83ebaa8d2f1d0355084ea7d68c05644614dc31e9469a9c7dff6225cf2707a" }, "downloads": -1, "filename": "heurispy-0.1.14.tar.gz", "has_sig": false, "md5_digest": "275492df829cf480b80a8319e961f05e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14619, "upload_time": "2019-07-14T01:48:57", "url": "https://files.pythonhosted.org/packages/dc/4e/572c9225351bcf417b93b7077ed116ac18d5ff42bbb85672e2e645ef7e0c/heurispy-0.1.14.tar.gz" } ], "0.1.15": [ { "comment_text": "", "digests": { "md5": "3008b74c6d37196f6eefaa2ee91a9f85", "sha256": "4a0cfd1d13fe629410b0f59f3ef5bb88ecf629eb5ae7ccb2be5115fd183636f3" }, "downloads": -1, "filename": "heurispy-0.1.15-py3-none-any.whl", "has_sig": false, "md5_digest": "3008b74c6d37196f6eefaa2ee91a9f85", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22572, "upload_time": "2019-07-14T02:07:08", "url": "https://files.pythonhosted.org/packages/db/68/1a7552cfac42aed5657f5d4b095e959c8d8d3dc5552f1b7fca03b76c0117/heurispy-0.1.15-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7358eaf889be1e5b3e42bd60a152b377", "sha256": "d754a5f98398b1c9318acfd40c80a72b5873642139079f282bcbee2f50589a33" }, "downloads": -1, "filename": "heurispy-0.1.15.tar.gz", "has_sig": false, "md5_digest": "7358eaf889be1e5b3e42bd60a152b377", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19957, "upload_time": "2019-07-14T02:07:11", "url": "https://files.pythonhosted.org/packages/dc/a9/faaa6008cb019e49fe8783c3a3584a96e863785daa8faa85cd81471e2f39/heurispy-0.1.15.tar.gz" } ], "0.1.17": [ { "comment_text": "", "digests": { "md5": "d4bf01b50132335d4f4a8acdf7e558ff", "sha256": "cd40ecaaee597f01077b451f0adf82e2b7bbec14720976fceb815939b477f853" }, "downloads": -1, "filename": "heurispy-0.1.17-py3-none-any.whl", "has_sig": false, "md5_digest": "d4bf01b50132335d4f4a8acdf7e558ff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23108, "upload_time": "2019-07-17T15:29:10", "url": "https://files.pythonhosted.org/packages/6a/af/de9ddd06452c2d4e483808afab45c59d2b7b8a30fdead4e26770b4dec3e3/heurispy-0.1.17-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c9744101e37c7ab10fb17df438b0f307", "sha256": "adf6463f2e102dbdcd4614d31d2841e08d8a001ba9888b966b0d3c7632a68f74" }, "downloads": -1, "filename": "heurispy-0.1.17.tar.gz", "has_sig": false, "md5_digest": "c9744101e37c7ab10fb17df438b0f307", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21191, "upload_time": "2019-07-17T15:29:11", "url": "https://files.pythonhosted.org/packages/a2/0b/c145b0cfa8fedb4094b0de3e0a540b8593f8549be5b87c414bc221df53e8/heurispy-0.1.17.tar.gz" } ], "0.1.18": [ { "comment_text": "", "digests": { "md5": "3ecfbbc63baaf6632052342d141ea85c", "sha256": "9981e1fe6b7c34e16d004f4778a4ef25c373da973dc21d81f308898752bcff68" }, "downloads": -1, "filename": "heurispy-0.1.18-py3-none-any.whl", "has_sig": false, "md5_digest": "3ecfbbc63baaf6632052342d141ea85c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22617, "upload_time": "2019-07-17T16:51:44", "url": "https://files.pythonhosted.org/packages/36/82/2ed5e855a6cb9eac1e36f646eaa4ed412de614e40710be00b106e340ae7e/heurispy-0.1.18-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a3426fb63583bf8cd730a6320c8b597", "sha256": "f0fa37fa8e58153e4945b69b64309f00861dba031dcf452e41da5bca868a68bb" }, "downloads": -1, "filename": "heurispy-0.1.18.tar.gz", "has_sig": false, "md5_digest": "9a3426fb63583bf8cd730a6320c8b597", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19901, "upload_time": "2019-07-17T16:51:45", "url": "https://files.pythonhosted.org/packages/ad/53/1e09c3a853c9b482957ced3dedff819d338369d8a677366bbaf6c72f6b35/heurispy-0.1.18.tar.gz" } ], "0.1.20": [ { "comment_text": "", "digests": { "md5": "068f17fdfea21c0cf5da21d81d2e4229", "sha256": "1540e0ea15d21b231d4ed3ca3ed388df31fd36676195467b64cc2df44598084a" }, "downloads": -1, "filename": "heurispy-0.1.20-py3-none-any.whl", "has_sig": false, "md5_digest": "068f17fdfea21c0cf5da21d81d2e4229", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 533713, "upload_time": "2019-07-19T15:13:43", "url": "https://files.pythonhosted.org/packages/10/0c/d264e93f417545d1b6f75ac450731aff46e0b48aeb6ddcc2738e06d0c12f/heurispy-0.1.20-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a696fad30dc3585a9e72bf4bccb9cea5", "sha256": "74b0bf6eca010fe4095b91ac9e66e32b6424aa6a51f9ce38e76e2ad74248a699" }, "downloads": -1, "filename": "heurispy-0.1.20.tar.gz", "has_sig": false, "md5_digest": "a696fad30dc3585a9e72bf4bccb9cea5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 529022, "upload_time": "2019-07-19T15:13:45", "url": "https://files.pythonhosted.org/packages/8d/1b/255dd12601170ff35cfd02692e91921dad6464d6c3ee5b572f84855608f0/heurispy-0.1.20.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "5c3d389b7c4dcc3456430b75b643b84f", "sha256": "23a7c59c10dc6ac837293be67f652fba10da839cfb2ca42894fb3dc4f28d47f1" }, "downloads": -1, "filename": "heurispy-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5c3d389b7c4dcc3456430b75b643b84f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 573327, "upload_time": "2019-08-14T00:32:46", "url": "https://files.pythonhosted.org/packages/fa/73/7b9d6f0702db330b9e60fd367f76229f9169f5ca8ecaa2f57f580891015b/heurispy-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d24fded4fcfcccfb688fa4487f1133ad", "sha256": "6c5a1218fc20e475e0aba35471fbd2a2f2d06ff867af99cfca1431e8b02377be" }, "downloads": -1, "filename": "heurispy-1.0.tar.gz", "has_sig": false, "md5_digest": "d24fded4fcfcccfb688fa4487f1133ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 553920, "upload_time": "2019-08-14T00:32:49", "url": "https://files.pythonhosted.org/packages/9f/ac/2fc0ed2fa15df3715b01bc934471f751e236ac3647484ed74f84fea73c9b/heurispy-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "3f8ebf83473dc9129dd423928c631c5c", "sha256": "f33b778dacdd7d3fce62654518c331123a2054ab943dc890b9a1ecf54f241d01" }, "downloads": -1, "filename": "heurispy-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3f8ebf83473dc9129dd423928c631c5c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 624790, "upload_time": "2019-10-20T20:18:37", "url": "https://files.pythonhosted.org/packages/8a/38/b6c2e335ece30f2a2c90f724672962686a91d5a16cf3336bc9e6bbfbcfe1/heurispy-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d9eae71238be055a5d3018962673cb48", "sha256": "fceb71dbde79bc633a84ad4b54295d455e00010b16ce4e4ae10aea4736e0b2bc" }, "downloads": -1, "filename": "heurispy-1.0.1.tar.gz", "has_sig": false, "md5_digest": "d9eae71238be055a5d3018962673cb48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 591735, "upload_time": "2019-10-20T20:18:41", "url": "https://files.pythonhosted.org/packages/5e/9f/e8c4907394479677e197b2237859cfe4b1dedd951836308bd3d1c7885ff8/heurispy-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "ede9dcf9718eade754d88c936a5d72bc", "sha256": "90391d584f6dfa78e3c9ec6bc80e2bfc240a2c08735551819269acb0e8308d3b" }, "downloads": -1, "filename": "heurispy-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ede9dcf9718eade754d88c936a5d72bc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3731549, "upload_time": "2019-10-20T23:56:24", "url": "https://files.pythonhosted.org/packages/c0/52/63440952ea42737b8bcbec9e35764bc514a4fb17d0bede350c0acbc6508c/heurispy-1.0.2-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ede9dcf9718eade754d88c936a5d72bc", "sha256": "90391d584f6dfa78e3c9ec6bc80e2bfc240a2c08735551819269acb0e8308d3b" }, "downloads": -1, "filename": "heurispy-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ede9dcf9718eade754d88c936a5d72bc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3731549, "upload_time": "2019-10-20T23:56:24", "url": "https://files.pythonhosted.org/packages/c0/52/63440952ea42737b8bcbec9e35764bc514a4fb17d0bede350c0acbc6508c/heurispy-1.0.2-py3-none-any.whl" } ] }