{
"info": {
"author": "Somshubra Majumdar",
"author_email": "titu1994@gmail.com",
"bugtrack_url": null,
"classifiers": [
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Topic :: Software Development :: Libraries",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "# PySHAC : A Python Library for `Sequential Halving and Classification` Algorithm\n\n[](https://travis-ci.org/titu1994/pyshac)\n[](https://codecov.io/gh/titu1994/pyshac)\n[](https://github.com/titu1994/pyshac/blob/master/LICENSE)\n[](https://pypi.org/project/pyshac/)\n[](https://pypi.org/project/pyshac/)\n[](https://pypi.org/project/pyshac/)\n[](https://pypi.org/project/pyshac/)\n----\n\nPySHAC is a python library to use the Sequential Halving and Classification algorithm from the paper\n[Parallel Architecture and Hyperparameter Search via Successive Halving and Classification](https://arxiv.org/abs/1805.10255) with ease.\n\nNote : This library is not affiliated with Google.\n\n## Documentation\n\nStable build documentation can be found at [PySHAC Documentation](http://titu1994.github.io/pyshac/).\n\nIt contains a User Guide, as well as explanation of the different engines that can be used with PySHAC.\n\n\n| Topic | Link |\n|:-------------|:--------:|\n| Installation | http://titu1994.github.io/pyshac/install/ |\n| User Guide | http://titu1994.github.io/pyshac/guide/ |\n| Managed Engines | http://titu1994.github.io/pyshac/managed/ |\n| Custom Hyper Parameters | http://titu1994.github.io/pyshac/custom-hyper-parameters/ |\n| Serial Evaluation | http://titu1994.github.io/pyshac/serial-execution/ |\n| External Dataset Training | http://titu1994.github.io/pyshac/external-dataset-training/ |\n| Callbacks | http://titu1994.github.io/pyshac/callbacks/ |\n\n\n## Installation\n\nThis library is available for Python 2.7 and 3.4+ via pip for Windows, MacOSX and Linux.\n\n```python\npip install pyshac\n```\n\nTo install the master branch of this library :\n\n```\ngit clone https://github.com/titu1994/pyshac.git\ncd pyshac\npip install .\n\nor pip install .[tests] # to also include dependencies necessary for testing\n```\n\nTo install the requirements before installing the library :\n\n```\npip install -r \"requirements.txt\"\n```\n\nTo build the docs, additional packages must be installed :\n```\npip install -r \"doc_requirements.txt\"\n```\n\n## Getting started with PySHAC\n\n### First, build the set of hyper parameters. The three main HyperParameter classes are :\n\n- DiscreteHyperParameter\n- UniformContinuousHyperParameter\n- NormalContinuousHyperParameter\n\nThere are also 3 additional hyper parameters, which are useful when a parameter needs to be sampled multiple times\nfor each evaluation :\n\n- MultiDiscreteHyperParameter\n- MultiUniformContinuousHyperParameter\n- MultiNormalContinuousHyperParameter\n\nThese multi parameters have an additional argument `sample_count` which can be used to sample multiple times\nper step.\n\n**Note**: The values will be concatenated linearly, so each multi parameter will have a list of values\nreturned in the resultant OrderedDict. If you wish to flatten the entire search space, you can\nuse `pyshac.flatten_parameters` on this OrderedDict.\n\n```python\nimport pyshac\n\n# Discrete parameters\ndice_rolls = pyshac.DiscreteHyperParameter('dice', values=[1, 2, 3, 4, 5, 6])\ncoin_flip = pyshac.DiscreteHyperParameter('coin', values=[0, 1])\n\n# Continuous Parameters\nclassifier_threshold = pyshac.UniformContinuousHyperParameter('threshold', min_value=0.0, max_value=1.0)\nnoise = pyshac.NormalContinuousHyperParameter('noise', mean=0.0, std=1.0)\n\n```\n\n### Setup the engine\n\nWhen setting up the SHAC engine, we need to define a few important parameters which will be used by the engine :\n\n- **Hyper Parameter list**: A list of parameters that have been declared. This will constitute the search space.\n- **Total budget**: The number of evaluations that will occur.\n- **Number of batches**: The number of samples per batch of evaluation.\n- **Objective**: String value which can be either `max` or `min`. Defines whether the objective should be maximised or minimised.\n- **Maximum number of classifiers**: As it suggests, decides the upper limit of how many classifiers can be trained. This is optional, and usually not required to specify.\n\n```python\n\nimport numpy as np\nimport pyshac\n\n# define the parameters\nparam_x = pyshac.UniformContinuousHyperParameter('x', -5.0, 5.0)\nparam_y = pyshac.UniformContinuousHyperParameter('y', -2.0, 2.0)\n\nparameters = [param_x, param_y]\n\n# define the total budget as 100 evaluations\ntotal_budget = 100 # 100 evaluations at maximum\n\n# define the number of batches\nnum_batches = 10 # 10 samples per batch\n\n# define the objective\nobjective = 'min' # minimize the squared loss\n\nshac = pyshac.SHAC(parameters, total_budget, num_batches, objective)\n```\n\n\n### Training the classifiers\n\nTo train a classifier, the user must define an Evaluation function. This is a user defined function,\nthat accepts 2 or more inputs as defined by the engine, and returns a python floating point value.\n\nThe **Evaluation Function** receives at least 2 inputs :\n\n- **Worker ID**: Integer id that can be left alone when executing only on CPU or used to determine the iteration number in the current epoch of evaluation.\n- **Parameter OrderedDict**: An OrderedDict which contains the (name, value) pairs of the Parameters passed to the engine.\n - Since it is an ordered dict, if only the values are required, `list(parameters.values())` can be used to get the list of values in the same order as when the Parameters were declared to the engine.\n - These are the values of the sampled hyper parameters which have passed through the current cascade of models.\n\nAn example of a defined evaluation function :\n\n```python\n# define the evaluation function\ndef squared_error_loss(id, parameters):\n x = parameters['x']\n y = parameters['y']\n y_sample = 2 * x - y\n\n # assume best values of x and y and 2 and 0 respectively\n y_true = 4.\n\n return np.square(y_sample - y_true)\n```\n\nA single call to `shac.fit()` will begin training the classifiers.\n\nThere are a few cases to consider:\n\n- There can be cases where the search space is not large enough to train the maximum number of classifier (usually 18).\n- There may be instances where we want to allow some relaxations of the constraint that the next batch must pass through all\nof the previous classifiers. This allows classifiers to train on the same search space repeatedly rather than divide the search space.\n\nIn these cases, we can utilize a few additional parameters to allow the training behaviour to better adapt to these circumstances.\nThese parameters are :\n\n- **skip_cv_checks**: As it suggests, if the number of samples per batch is too small, it is preferable to skip the cross validation check, as most classifiers will not pass them.\n- **early_stop**: Determines whether training should halt as soon as an epoch of failed learning occurs. This is useful when evaluations are very costly.\n- **relax_checks**: This will instead relax the constrain of having the sample pass through all classifiers to having the classifier past through most of the classifiers. In doing so, more samples can be obtained for the same search space.\n\n```python\n\n# `early stopping` default is False, and it is preferred not to use it when using `relax checks`\nshac.fit(squared_error_loss, skip_cv_checks=True, early_stop=False, relax_checks=True)\n```\n\n## Sampling the best hyper parameters\n\nOnce the models have been trained by the engine, it is as simple as calling `predict()` to sample multiple samples or batches of parameters.\n\nSamples can be obtained in a per instance or per batch (or even a combination) using the two parameters - `num_samples` and `num_batches`.\n\n```python\n\n# sample a single instance of hyper parameters\nparameter_samples = shac.predict() # Gets 1 sample.\n\n# sample multiple instances of hyper parameters\nparameter_samples = shac.predict(10) # Gets 10 samples.\n\n# sample a batch of hyper parameters\nparameter_samples = shac.predict(num_batches=5) # samples 5 batches, each containing 10 samples.\n\n# sample multiple batches and a few additional instances of hyper parameters\nparameter_samples = shac.predict(5, 5) # samples 5 batches (each containing 10 samples) and an additional 5 samples.\n```\n\n## Examples\n\nExamples based on the `Branin` and `Hartmann6` problems can be found in the [Examples folder](https://github.com/titu1994/pyshac/tree/master/examples).\n\nAn example of how to use the `TensorflowSHAC` engine is provided [in the example foldes as well](https://github.com/titu1994/pyshac/tree/master/examples/tensorflow).\n\nComparison scripts of basic optimization, `Branin` and `Hartmann6` using Tensorflow Eager 1.8 are provided in the respective folders.\n\n### Evaluation of Branin\n\nBrannin to close to the true optima as described in the paper.\n\n
\n\n### Evaluation of Hardmann 6\n\nHartmann 6 was a much harder dataset, and results are worse than Random Search 2x and the one from the paper. Perhaps it was due to a bad run, and may be fixed with larger budget for training.\n\n
\n\n### Evaluation of Simple Optimization Objective\n\nThe task is to sample two parameters `x` and `y`, such that `z = 2 * x - y` and we want `z` to approach the value of 4. We utilize MSE \nas the metric between z and the optimal value.\n\n
\n\n### Evaluation of Hyper Parameter Optimization\n\nThe task is to sample hyper parameters which provide high accuracy values using TensorflowSHAC engine.\n\n
\n\n----\n\n\n",
"description_content_type": "text/markdown",
"docs_url": null,
"download_url": "https://github.com/titu1994/pyshac",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/titu1994/pyshac",
"keywords": "",
"license": "MIT",
"maintainer": "",
"maintainer_email": "",
"name": "pyshac",
"package_url": "https://pypi.org/project/pyshac/",
"platform": "",
"project_url": "https://pypi.org/project/pyshac/",
"project_urls": {
"Download": "https://github.com/titu1994/pyshac",
"Homepage": "https://github.com/titu1994/pyshac"
},
"release_url": "https://pypi.org/project/pyshac/0.3.5.1/",
"requires_dist": [
"numpy (>=1.16.2)",
"scikit-learn (>=0.20.3)",
"pandas (>=0.23.4)",
"joblib (>=0.13.2)",
"loky (>=2.4.2)",
"cloudpickle (>=1.1.1)",
"six (>=1.11.0)",
"xgboost (==0.80); python_version < \"3.0\"",
"xgboost (>=0.90); python_version > \"3.0\"",
"matplotlib (>=3.0.0); python_version > \"3.0\"",
"pytest; extra == 'tests'",
"coverage; extra == 'tests'",
"pytest-cov; extra == 'tests'",
"codecov; extra == 'tests'",
"matplotlib; extra == 'tests'"
],
"requires_python": "",
"summary": "Python library which implements Successive Halving and Classification algorithm",
"version": "0.3.5.1"
},
"last_serial": 5348323,
"releases": {
"0.1.0": [
{
"comment_text": "",
"digests": {
"md5": "b04969e50b888bd351adeb33e61f84dd",
"sha256": "033964a873f7e2e925947d66f46464fd9be85c9c1b3f18eb6d284a8f8030b5ec"
},
"downloads": -1,
"filename": "pyshac-0.1.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "b04969e50b888bd351adeb33e61f84dd",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 30791,
"upload_time": "2018-06-29T03:04:14",
"url": "https://files.pythonhosted.org/packages/b7/96/3b7a47010cec556614ecbdfcf2e7af1dc489ea4ad592be1067eb0c43be18/pyshac-0.1.0-py2.py3-none-any.whl"
}
],
"0.2.0": [
{
"comment_text": "",
"digests": {
"md5": "1585b538a62c4717a4cb2114b30a4ebb",
"sha256": "e4f28a78f4bad05f0ed5787ef98b2be9ded3e3e65e0a3a2d109b2ac3228efb26"
},
"downloads": -1,
"filename": "pyshac-0.2.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "1585b538a62c4717a4cb2114b30a4ebb",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 28355,
"upload_time": "2018-06-30T09:46:42",
"url": "https://files.pythonhosted.org/packages/43/f7/607bb134f2ed95b696388e54098c27a4545a988db19bb4d8f0684f21ed5c/pyshac-0.2.0-py2.py3-none-any.whl"
}
],
"0.2.1": [
{
"comment_text": "",
"digests": {
"md5": "39747dc175e29e1eed1789027138750f",
"sha256": "487942d0a7b07fd51a36b09aab7147f7d8898f18a39a9672d5d55861d5de191d"
},
"downloads": -1,
"filename": "pyshac-0.2.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "39747dc175e29e1eed1789027138750f",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 28547,
"upload_time": "2018-08-22T17:36:38",
"url": "https://files.pythonhosted.org/packages/28/37/9d3c15f7f4e975c58f4d64750ab7d14edd8419db88dcc8655256aedb6983/pyshac-0.2.1-py2.py3-none-any.whl"
}
],
"0.2.1.1": [
{
"comment_text": "",
"digests": {
"md5": "01c1e726925b47a131dffca56ecc0505",
"sha256": "f5a055bafb959edc7d8438daa17d9d81a2321090d4b86ccdca0c5d1b41bee7b2"
},
"downloads": -1,
"filename": "pyshac-0.2.1.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "01c1e726925b47a131dffca56ecc0505",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 28564,
"upload_time": "2018-08-23T05:24:55",
"url": "https://files.pythonhosted.org/packages/2e/98/85aa696d8022a8d625c56bca42c63cc00e7ba5db0426bfffb8270a4851fc/pyshac-0.2.1.1-py2.py3-none-any.whl"
}
],
"0.3.0": [
{
"comment_text": "",
"digests": {
"md5": "2016c3df8ef514bc6c34f175bf537b5a",
"sha256": "d0244858e08c96ec9fbe0a0678f00974617bb47f8fb4ada3a29129c430ef1907"
},
"downloads": -1,
"filename": "pyshac-0.3.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "2016c3df8ef514bc6c34f175bf537b5a",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 32213,
"upload_time": "2018-10-12T06:34:38",
"url": "https://files.pythonhosted.org/packages/21/ae/d85c9ae9e9ef92c081503384396ad153b3f618e0fbfcba1ada479fed7e42/pyshac-0.3.0-py2.py3-none-any.whl"
}
],
"0.3.0.1": [
{
"comment_text": "",
"digests": {
"md5": "5b9bf3f5e9f2c532c5df1ab0073f1fdb",
"sha256": "c3e5dc3bd8fae1bbef8c2270f0ddd1e119b04f02d768455eab4ba27349479bc4"
},
"downloads": -1,
"filename": "pyshac-0.3.0.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "5b9bf3f5e9f2c532c5df1ab0073f1fdb",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 34814,
"upload_time": "2018-10-12T06:42:14",
"url": "https://files.pythonhosted.org/packages/c5/8f/e62a74af8bd899a556703db05bf5d62dab77e586cf28f42894da48f76299/pyshac-0.3.0.1-py2.py3-none-any.whl"
}
],
"0.3.0.2": [
{
"comment_text": "",
"digests": {
"md5": "58f8ad13fd106b5a9a27323cafc137c5",
"sha256": "29e158e1722529dd4a81c49b6f6a35a06e511971b8c613ba8df0bf97fa91b633"
},
"downloads": -1,
"filename": "pyshac-0.3.0.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "58f8ad13fd106b5a9a27323cafc137c5",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 32050,
"upload_time": "2018-10-12T07:14:21",
"url": "https://files.pythonhosted.org/packages/56/3d/83fc345d6f96a0a4e6a6bda316c28bec16cf97149175e7f3f589b7524c1c/pyshac-0.3.0.2-py2.py3-none-any.whl"
}
],
"0.3.0.3": [
{
"comment_text": "",
"digests": {
"md5": "7ee0c794c7b9df374380d09b597087b2",
"sha256": "0d4105d0fa6875556821fab5381ab0f35cab3807948b3b52b1284963c8a17129"
},
"downloads": -1,
"filename": "pyshac-0.3.0.3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "7ee0c794c7b9df374380d09b597087b2",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 32049,
"upload_time": "2018-10-12T07:22:42",
"url": "https://files.pythonhosted.org/packages/84/a2/222f14777941d18f36c9dd7aaeee6ba3d9146296d08c7dcde57c89ed4a5f/pyshac-0.3.0.3-py2.py3-none-any.whl"
}
],
"0.3.0.4": [
{
"comment_text": "",
"digests": {
"md5": "411699d12c7ef36328c4e7988c775701",
"sha256": "7f9068daec71f795ff8082072770b000cd14963c17b0762d6f5e0a049f55df32"
},
"downloads": -1,
"filename": "pyshac-0.3.0.4-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "411699d12c7ef36328c4e7988c775701",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 35671,
"upload_time": "2018-10-12T07:44:02",
"url": "https://files.pythonhosted.org/packages/97/14/946851113797008aff70261aa66202a9ce08f161378a27dc7844e003dca1/pyshac-0.3.0.4-py2.py3-none-any.whl"
}
],
"0.3.0.5": [
{
"comment_text": "",
"digests": {
"md5": "75c42c615dfe6912b988e0b92cdd5234",
"sha256": "036f0f954a512c3a61c065e5ba6ef03188fef27099f5320366b5c8b62d51f3f9"
},
"downloads": -1,
"filename": "pyshac-0.3.0.5-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "75c42c615dfe6912b988e0b92cdd5234",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 35678,
"upload_time": "2018-10-12T07:53:22",
"url": "https://files.pythonhosted.org/packages/08/68/65d0a7e8e000b9f0d28839ced9c83d2b45b556e5846b76c8c77a1d0a2ef6/pyshac-0.3.0.5-py2.py3-none-any.whl"
}
],
"0.3.1": [
{
"comment_text": "",
"digests": {
"md5": "3a50e805ff016724f5a1ca9d12b027af",
"sha256": "9240eef6088a8f476f83289e785ca74f6f9073e932cae0a34dfae52a49c67881"
},
"downloads": -1,
"filename": "pyshac-0.3.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "3a50e805ff016724f5a1ca9d12b027af",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 39446,
"upload_time": "2018-10-23T23:35:06",
"url": "https://files.pythonhosted.org/packages/04/b8/454096a8a1e75c93310a3e3069d418c79e2e0e4f6b79ae10a4acd11bc1db/pyshac-0.3.1-py2.py3-none-any.whl"
}
],
"0.3.2": [
{
"comment_text": "",
"digests": {
"md5": "84771904469a9801218d085ddf66adb1",
"sha256": "b036e8f2156f17abf3a80d2d39770bd21d6d39cbd37df830ede452604f00ab21"
},
"downloads": -1,
"filename": "pyshac-0.3.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "84771904469a9801218d085ddf66adb1",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 39863,
"upload_time": "2018-10-26T06:03:23",
"url": "https://files.pythonhosted.org/packages/01/11/97a9d8011b79e4cc815c37173549719fc6910743c536a093610e1deff3f4/pyshac-0.3.2-py2.py3-none-any.whl"
}
],
"0.3.2.1": [
{
"comment_text": "",
"digests": {
"md5": "f8c7bde66fa9be5a9369f5369e87c7b8",
"sha256": "ecc523623c56e9548137992e2283238acf02f8ad1f652c6639958a76bfd0b5a3"
},
"downloads": -1,
"filename": "pyshac-0.3.2.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "f8c7bde66fa9be5a9369f5369e87c7b8",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 40072,
"upload_time": "2018-10-26T22:15:28",
"url": "https://files.pythonhosted.org/packages/ee/34/a5b2a40ff03c0bd926ca57bad88c0302e7ac39484cfd47fe8b89e9a14c13/pyshac-0.3.2.1-py2.py3-none-any.whl"
}
],
"0.3.3": [
{
"comment_text": "",
"digests": {
"md5": "2ea39cfebc42eb314b47a2922919e824",
"sha256": "501510b7cae3b342da6518b50754ffa81c0b6fb55318b664874b9780fb4e862c"
},
"downloads": -1,
"filename": "pyshac-0.3.3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "2ea39cfebc42eb314b47a2922919e824",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 41487,
"upload_time": "2018-10-27T04:30:51",
"url": "https://files.pythonhosted.org/packages/f3/dc/8929f2981563a283f25b75b4b147a06fe21974181fa0024ddb5fb499423f/pyshac-0.3.3-py2.py3-none-any.whl"
}
],
"0.3.4": [
{
"comment_text": "",
"digests": {
"md5": "6f77bf0441946d8646f74d92be89935a",
"sha256": "93208d0a5ef19f70b5a858d1c6c4edda307e3122d49181ce61ee73366221b953"
},
"downloads": -1,
"filename": "pyshac-0.3.4-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "6f77bf0441946d8646f74d92be89935a",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 41926,
"upload_time": "2018-10-27T18:26:54",
"url": "https://files.pythonhosted.org/packages/67/61/e6a6874a2bd98052c39a1a21f71532c9eed7455f7621bfffd162dd73bc60/pyshac-0.3.4-py2.py3-none-any.whl"
}
],
"0.3.4.1": [
{
"comment_text": "",
"digests": {
"md5": "4d4db4ea87c8b4c5c1225b67318c0225",
"sha256": "8c85af38b9fef978cf24eec150cd44e44c21284f428483c8f12ce38ddf37dce0"
},
"downloads": -1,
"filename": "pyshac-0.3.4.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "4d4db4ea87c8b4c5c1225b67318c0225",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 42276,
"upload_time": "2018-10-29T04:06:15",
"url": "https://files.pythonhosted.org/packages/92/48/7075f13e1d20b33f837733138e227a9ea08b99e1f72269c34d2cbed7f910/pyshac-0.3.4.1-py2.py3-none-any.whl"
}
],
"0.3.5.0": [
{
"comment_text": "",
"digests": {
"md5": "68c9f17cd46040a17a377684a746d413",
"sha256": "14daa316b25d808e523e0be7195881fe07d1125c65648782c8e8fb5aaea08a16"
},
"downloads": -1,
"filename": "pyshac-0.3.5.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "68c9f17cd46040a17a377684a746d413",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 42952,
"upload_time": "2019-03-21T06:29:32",
"url": "https://files.pythonhosted.org/packages/4e/e4/ec1aaace173f5c81bf190273fda657e5b0328c96ee9572841768d0e8a1e0/pyshac-0.3.5.0-py2.py3-none-any.whl"
}
],
"0.3.5.1": [
{
"comment_text": "",
"digests": {
"md5": "27cc07aa3a1ce86a497bafd52ad71ab5",
"sha256": "f47243e997292cd92f874b51270776d160d8ade296b2ebf34a8cbfde312afdf2"
},
"downloads": -1,
"filename": "pyshac-0.3.5.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "27cc07aa3a1ce86a497bafd52ad71ab5",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 43230,
"upload_time": "2019-06-02T09:21:35",
"url": "https://files.pythonhosted.org/packages/e1/7b/57e371d89d07cecd1961febcaf83396ac369156ebf8f674bab7f1d2fcbf5/pyshac-0.3.5.1-py2.py3-none-any.whl"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "27cc07aa3a1ce86a497bafd52ad71ab5",
"sha256": "f47243e997292cd92f874b51270776d160d8ade296b2ebf34a8cbfde312afdf2"
},
"downloads": -1,
"filename": "pyshac-0.3.5.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "27cc07aa3a1ce86a497bafd52ad71ab5",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 43230,
"upload_time": "2019-06-02T09:21:35",
"url": "https://files.pythonhosted.org/packages/e1/7b/57e371d89d07cecd1961febcaf83396ac369156ebf8f674bab7f1d2fcbf5/pyshac-0.3.5.1-py2.py3-none-any.whl"
}
]
}