{ "info": { "author": "Ian Danforth", "author_email": "iandanforth@gmail.com", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "\n# PyMuscle\n[![Build Status](https://travis-ci.org/iandanforth/pymuscle.svg?branch=master)](https://travis-ci.org/iandanforth/pymuscle)\n\nPyMuscle provides a motor unit based model of skeletal muscle. It simulates the\nrelationship between excitatory input and motor-unit output as well as fatigue \nover time.\n\nIt is compatible with [OpenAI Gym](https://gym.openai.com) environments and is \nintended to be useful for researchers in the machine learning community.\n\nPyMuscle can be used to enhance the realism of motor control for simulated \nagents. To get you started we provide a [toy example project](https://github.com/iandanforth/pymuscle/tree/master/examples) \nwhich uses PyMuscle in a simulation of arm curl and extension.\n\nOut of the box we provide a motor neuron pool model and a muscle fiber model\nbased on \"A motor unit-based model of muscle fatigue\" \n([Potvin and Fuglevand, 2017](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005581)).\nIf you use this library as part of your research please cite that paper.\n\nWe hope to extend this model and support alternative models in the future.\n\n## More about PyMuscle\n\nMotor control in biological creatures is complex. PyMuscle allows you to capture\nsome of that complexity while remaining [performant](#performance). It provides \ngreater detail than sending torque values to simulated motors-as-joints but \nless detail (and computational cost) than a full biochemical model.\n\nPyMuscle is not tied to a particular physics library and can be used with a \nvariety of muscle body simulations. PyMuscle focuses on the relationship between \ncontrol signals (excitatory inputs to motor neurons) and per-motor-unit output.\n\nMotor unit output is dimensionless but can be interpreted as force. It can also\nbe used as a proxy for the contractile state of muscle bodies in the physics\nsim of your choice.\n\n# Background\n\n## Motor Units\n

\n\n\nA motor unit is the combination of a motor neuron and the muscle fibers to which\nthe neuron makes connections. Skeletal muscles are made up of many muscle fibers. \nFor a given motor unit a single motor neuron will have an axon that branches\nand innervates a subset of the fibers in a muscle. Muscle fibers usually\nbelong to only one motor unit.\n\nMuscles may have anywhere from a few dozen to thousands of motor units. The\nhuman arm, for example, has 30 some muscles and is innervated by [approximately 35,000 axons](https://onlinelibrary.wiley.com/doi/abs/10.1002/ana.25018)\nfrom motor neurons. \n\nThe brain controls muscles by sending signals to motor units and receiving\nsignals from mechanoreceptors embedded in muscles and the skin. In animals all\nthe motor units an animal will ever have are present from birth and learning to \nproduce smooth coordinated motion through control of those units is a significant \npart of the developmental process.\n\n## Control\n\nMotor units are recruited in an orderly fashion to produce varying levels of \nmuscle force. \n\nThe cell bodies of motor neurons for a given muscle cluster together in the \nspinal cord in what are known as motor neuron pools, columns, or nuclei. \nGenerally motor neurons in a pool can be thought of as all getting the same \nactivation inputs. This input is the combination of dozens if not hundreds of \nseparate inputs from interneurons and upper motor neurons carrying signals from\nthe brain and mechanoreceptors in the body.\n\nIn a voluntary contraction of a muscle, say in curling your arm, the input\nto the motor neuron pool for the bicep muscle will ramp up, recruiting more\nand more motor units, starting from the weakest motor units to stronger ones.\n\nOver time motor neurons and muscle fibers can't produce the same level of force \nfor the same level of activation input. This is called fatigue. The brain must\ncompensate for the fatigue if it wants to maintain a given force or perform\nthe same action again and again in the same way.\n\n# Installation\n\n## Requirements\n\nPython 3.6+\n\n## Install\n\n```\npip install pymuscle\n```\n\n# Getting Started\n\n#### Not a Machine Learning researcher? Please see [Getting Started for Physiologists](physio-readme.md)\n\n### Minimal example \n\nThe Muscle class provides the primary API for the library. A Muscle can be\nheavily customized but here we use mainly default values. A PotvinMuscle \ninstantiated with 120 motor units has the distribution of strengths, recruitment \nthresholds, and fatigue properties as used in the experiments of Potvin and \nFuglevand, 2017.\n\n```python\nfrom pymuscle import StandardMuscle as Muscle\nfrom pymuscle.vis import PotvinChart\n\nmuscle = Muscle()\n\n# Set up the simulation parameters\nsim_duration = 200 # seconds\nframes_per_second = 50\nstep_size = 1 / frames_per_second\ntotal_steps = int(sim_duration / step_size)\n\n# Use a constant level of excitation to more easily observe fatigue\nexcitation = 0.6 # Range is 0.0 to 1.0\n\ntotal_outputs = []\noutputs_by_unit = []\nprint(\"Starting simulation ...\")\nfor i in range(total_steps):\n # Calling step() updates the simulation and returns the total output\n # produced by the muscle during this step for the given excitation level.\n total_output = muscle.step(excitation, step_size)\n total_outputs.append(total_output)\n # You can also introspect the muscle to see the forces being produced\n # by each motor unit.\n output_by_unit = muscle.current_forces\n outputs_by_unit.append(output_by_unit)\n if (i % (frames_per_second * 10)) == 0:\n print(\"Sim time - {} seconds ...\".format(int(i / frames_per_second)))\n\n# Visualize the behavior of the motor units over time\nprint(\"Creating chart ...\")\nchart = PotvinChart(\n outputs_by_unit,\n step_size\n)\n# Things to note in the chart:\n# - Some motor units (purple) are never recruited at this level of excitation\n# - Some motor units become completely fatigued in this short time\n# - Some motor units stabilize and decrease their rate of fatigue\n# - Forces from the weakest motor units are almost constant the entire time\nchart.display()\n\n```\n\nThis will open a browser window with the produced chart. It should look like this:\n\n

\n\n### Familiar with OpenAI's Gym?\n\nMake sure you have the following installed\n\n```\npip install gym pygame pymunk\n```\n\nthen try out the [example project](https://github.com/iandanforth/pymuscle/tree/master/examples)\n\n# Versioning Plan\n\nPyMuscle is in an alpha state. Expect regular breaking changes.\n\nWe expect to stabilize the API for 1.0 and introduce breaking changes only\nduring major releases.\n\nThis library tries to provide empirically plausible behavior. As new research is\nreleased or uncovered we will update the underlying model. Non-bug-fix changes\nthat would alter the output of the library will be integrated in major releases.\n\nIf you know of results you believe should be integrated please let us know. See \nthe [Contributing](#contributing) section.\n\n# Contributing\n\nWe encourage you to contribute! Specifically we'd love to hear about and feature\nprojects using PyMuscle.\n\nFor all issues please search the [existing issues](https://github.com/iandanforth/pymuscle/issues) before submitting.\n\n- [Bug Reports](https://github.com/iandanforth/pymuscle/issues/new?template=bug_report.md)\n- [Enhancement requests](https://github.com/iandanforth/pymuscle/issues/new?template=feature_request.md)\n- [Suggest research](https://github.com/iandanforth/pymuscle/issues/new?template=research-submission.md) that can better inform the model\n\n_Before_ opening a pull request please:\n\n- See if there is an open ticket for this issue\n - If the ticket is tagged 'Help Needed' comment to note that you intend to work on this issue\n - If the ticket is *not* tagged, comment that you would like to work on the issue\n - We will then discuss the priority, timing and expectations around the issue.\n- If there is no open ticket, create one\n - We prefer to discuss the implications of changes before you write code! \n\n\n## Development\n\nIf you want to help develop the PyMuscle library itself the following may help.\n\nClone this repository\n\n```\ngit clone git@github.com:iandanforth/pymuscle.git\ncd pymuscle\npip install -r requirements-dev.txt\npython setup.py develop\npytest\n```\n\n# Performance\n\nPyMuscle aims to be fast. We use Numpy to get fast vector computation. If you\nfind that some part of the library is not fast enough for your use case please\n[open a ticket](https://github.com/iandanforth/pymuscle/issues) and let us know.\n\n# Limitations\n\n## Scope\n\nPyMuscle is concerned with inputs to motor unit neurons, the outputs of those\nmotor units, and the changes to that system over time. It does not model the\ndynamics of the muscle body itself or the impact of dynamic motion on this\nmotor unit input/output relationship.\n\n## Recovery\n\nPotvin and Fuglevand 2017 explicitly models fatigue but *not* recovery. We \neagerly await the updated model from Potvin which will included a model of \nrecovery.\n\nUntil then the `StandardMuscle` class, which builds on the Potvin and Fuglevand \nbase classes, implements peripheral (muscle fiber) recovery as this is a \nrelatively simple process but disables central (motor unit fatigue). \n\n## Proprioception\n\nInstances of `StandardMuscle` implement a `get_peripheral_fatigue()` method\nto allow users to track fatigue state of each muscle. Other than that this\nlibrary does not directly provide any feedback signals for control. The\nexample projects show how to integrate PyMuscle with a physics simulation to\nget simulated output forces and stretch and strain values derived from the\nstate of the simulated muscle body. (In the example this is a damped spring\nbut a Hill-type, or more complex model could also be used.)\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/iandanforth/pymuscle", "keywords": "", "license": "MIT + No Military Use", "maintainer": "", "maintainer_email": "", "name": "pymuscle", "package_url": "https://pypi.org/project/pymuscle/", "platform": "", "project_url": "https://pypi.org/project/pymuscle/", "project_urls": { "Homepage": "https://github.com/iandanforth/pymuscle" }, "release_url": "https://pypi.org/project/pymuscle/0.1.2/", "requires_dist": [ "numpy", "plotly", "colorlover" ], "requires_python": ">=3.6.0", "summary": "A motor unit based model of skeletal muscle and fatigue", "version": "0.1.2" }, "last_serial": 4809163, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "8e4e3c3af0920520fdef7e37efcd10e1", "sha256": "236529e752d3ad3865f93b8d5499170eee2b8b14f45d2238fdc28025d6275f1f" }, "downloads": -1, "filename": "pymuscle-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8e4e3c3af0920520fdef7e37efcd10e1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 5049, "upload_time": "2018-07-02T17:48:51", "url": "https://files.pythonhosted.org/packages/17/f9/71170a646695c3887b4d7780bb371dcfbce630dee4e0deebe32ade91fb99/pymuscle-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d37c9da9a3f6b8f291176428e7a3d49", "sha256": "21ec870ab7de4c0e12f940f79be4c4fcc9d1a160b62243de0c0d1c66324d3ccf" }, "downloads": -1, "filename": "pymuscle-0.0.1.tar.gz", "has_sig": false, "md5_digest": "5d37c9da9a3f6b8f291176428e7a3d49", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 7632, "upload_time": "2018-07-02T17:48:52", "url": "https://files.pythonhosted.org/packages/4f/8c/f30301be32235965b9227f91aa5d2337f696e6efc2faa017d1c56d161961/pymuscle-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "cb8e8246c5cace449d54148352a12db0", "sha256": "b7c3ac126a2b87981ca8d546fae11ba9ee3f9bc1b193a837ef0bf54666ea8c1c" }, "downloads": -1, "filename": "pymuscle-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cb8e8246c5cace449d54148352a12db0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 4958, "upload_time": "2018-07-06T03:24:23", "url": "https://files.pythonhosted.org/packages/f0/89/7de59cf5dd3be9cc7bf31e658a89f917db10ef9fe1478f092105b4e73ce2/pymuscle-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a218244657aa1cace5bb3a27feb25dcc", "sha256": "5ebfe1d8a97dc0368b7a2a37ac07044eef31465e806cd0894d2ae25ab28bda7b" }, "downloads": -1, "filename": "pymuscle-0.0.2.tar.gz", "has_sig": false, "md5_digest": "a218244657aa1cace5bb3a27feb25dcc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 7540, "upload_time": "2018-07-06T03:24:24", "url": "https://files.pythonhosted.org/packages/0b/d6/2c8863a21d5e06eebdd5d4cb61721216a4a08cb07e20fc2e66b1423a887e/pymuscle-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "1093aab41282a7ea220e9b456dd23cb7", "sha256": "4f88b1178843b68916583e887ee739188aacee9fdffdf2287b10893b5cd0004a" }, "downloads": -1, "filename": "pymuscle-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1093aab41282a7ea220e9b456dd23cb7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 13370, "upload_time": "2018-07-06T03:52:54", "url": "https://files.pythonhosted.org/packages/b4/ae/4e4461e70ad135cee0d03d0f00f66ad63e4e54aec114abb2b597d2a97b28/pymuscle-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b2dbc325315bd1593adbc45bcb9be62", "sha256": "8e561bcd4554e4d7e8cf2d16be6b11d82b5f44d451a54747e9b7d8a98184a43b" }, "downloads": -1, "filename": "pymuscle-0.0.3.tar.gz", "has_sig": false, "md5_digest": "8b2dbc325315bd1593adbc45bcb9be62", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 17682, "upload_time": "2018-07-06T03:52:55", "url": "https://files.pythonhosted.org/packages/fe/be/d95cedff99a7e7a163bf31b4499f3624a8a7550dfadfaafdf1550f79a3d3/pymuscle-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "25c4c5b7ea7eea49aff8d1c9d319e232", "sha256": "0ddc939264236254f97ff54ead3fe2d4bb621d358d80397d0257dcd642611003" }, "downloads": -1, "filename": "pymuscle-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "25c4c5b7ea7eea49aff8d1c9d319e232", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 13352, "upload_time": "2018-07-09T08:03:07", "url": "https://files.pythonhosted.org/packages/75/1f/b2119b424cd9424dbf24eff4c8dc719ed3a35a1e7a9f2da0d8379239654c/pymuscle-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d1c4a79a7b6a97ca22daaf1cdb42abb", "sha256": "a4409b69f41aa0efa8188e211e0f3c3df684177c6125c2c3438fb7bb309fcceb" }, "downloads": -1, "filename": "pymuscle-0.0.4.tar.gz", "has_sig": false, "md5_digest": "0d1c4a79a7b6a97ca22daaf1cdb42abb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 18188, "upload_time": "2018-07-09T08:03:08", "url": "https://files.pythonhosted.org/packages/ea/10/5579e23541ae1786242ff4dd5ea5a0feb45f7362bd0fb0877826d50821d6/pymuscle-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "372a4b83db5d3c09f357709934d24711", "sha256": "50c8a281bc98d282ec909e3edcaf6ec404436d4fed86aae6cb5882832c2cd82b" }, "downloads": -1, "filename": "pymuscle-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "372a4b83db5d3c09f357709934d24711", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 14944, "upload_time": "2018-07-10T04:57:19", "url": "https://files.pythonhosted.org/packages/0c/5e/6ed4c15b9b9474c0290baf8be2f9ad6c1da64b28bf55d2360fa74f7cf0df/pymuscle-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "06868a085a08c080bfaf698c2309761a", "sha256": "9712ec4725a25961d3f3248a2bb93c9a097ff23d26590a95d58d3100e4a3fc62" }, "downloads": -1, "filename": "pymuscle-0.0.5.tar.gz", "has_sig": false, "md5_digest": "06868a085a08c080bfaf698c2309761a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 19680, "upload_time": "2018-07-10T04:57:20", "url": "https://files.pythonhosted.org/packages/c7/ed/8ca2a1b8e1e4e545bfae4758984db615193b44c093845ced5e03d48fa7d4/pymuscle-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "f5501f96d8bacad136f2986fa0970419", "sha256": "d2e0e3376a2938f4d45a6cf09313b71c4ac77f61f93684b473dab997fbd3967d" }, "downloads": -1, "filename": "pymuscle-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f5501f96d8bacad136f2986fa0970419", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 23575, "upload_time": "2018-07-26T03:24:59", "url": "https://files.pythonhosted.org/packages/0b/5f/c8ba11e9439c532097d6ed2e8f3487012bf7af55d9b0d14a33b3e39ef6e8/pymuscle-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5e0fae834e556a261287e75dca4e0df4", "sha256": "ef56ab534c88a56f0c401a11b0d698c41db3ae17a4304e4d358ce96128b76aee" }, "downloads": -1, "filename": "pymuscle-0.0.6.tar.gz", "has_sig": false, "md5_digest": "5e0fae834e556a261287e75dca4e0df4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 21005, "upload_time": "2018-07-26T03:25:01", "url": "https://files.pythonhosted.org/packages/26/c3/2b53899e56faa8c2c1d03d06214a8a1ce80b8c9c5413ddd775062f20a716/pymuscle-0.0.6.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "bfd1580f6af11448c7c968f43e0b595b", "sha256": "7651bac0806d688fc4611e3de7780f6fc43c879c11877bc1abb06b002287c5b1" }, "downloads": -1, "filename": "pymuscle-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bfd1580f6af11448c7c968f43e0b595b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 20501, "upload_time": "2019-01-11T18:41:05", "url": "https://files.pythonhosted.org/packages/68/2c/d7c99dfb041dfaa52055da97b20d243c52c27bb7087aab4335d622aa5fe0/pymuscle-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4a6aa1f09418cf66f7befe9d852cc0c5", "sha256": "9d470f22c2bf296f07cffeeb15d85bd0757f3782bc231726e0c7032a0fabe120" }, "downloads": -1, "filename": "pymuscle-0.1.0.tar.gz", "has_sig": false, "md5_digest": "4a6aa1f09418cf66f7befe9d852cc0c5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 23564, "upload_time": "2019-01-11T18:41:07", "url": "https://files.pythonhosted.org/packages/1e/98/94e0f07d05d88784ad978a9d5a825e71f1a692c187104373804f2e1dce17/pymuscle-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "6bc2d94ab0ab3646848f05f24b77f710", "sha256": "5cb5548501ff34033c46b345830895d7629466550d012e0f0c895a8f7faa2f46" }, "downloads": -1, "filename": "pymuscle-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6bc2d94ab0ab3646848f05f24b77f710", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 20360, "upload_time": "2019-01-11T20:26:17", "url": "https://files.pythonhosted.org/packages/1c/da/bbdff669824a5620fcc2e3506144a9cf1bbd97a674993a6e797c5e2bfa9a/pymuscle-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a6c1168fa68edcb00f57806c1d8ddbe2", "sha256": "ad45104329911961f372bb3ac3fa141991aa1828449b08cc27d8bff0855e5347" }, "downloads": -1, "filename": "pymuscle-0.1.1.tar.gz", "has_sig": false, "md5_digest": "a6c1168fa68edcb00f57806c1d8ddbe2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 23294, "upload_time": "2019-01-11T20:26:19", "url": "https://files.pythonhosted.org/packages/d4/ba/ac3110093b7dd91b2c1c2d40dafde7b32e98314a62b4f9ef99abac97c999/pymuscle-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "5418a948eb1e8648d2a7f072f2231cbb", "sha256": "2981e5f30993cfc8ccb3bd7e8278f9d51c1a7cc4a104dd09ed3a581c1e49f0e3" }, "downloads": -1, "filename": "pymuscle-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5418a948eb1e8648d2a7f072f2231cbb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 20410, "upload_time": "2019-02-12T05:09:39", "url": "https://files.pythonhosted.org/packages/a6/06/7a14ca61714e980813c28f8f46f425dcce13fdce8d8d2ae9e15cefa331ab/pymuscle-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8540793fea5fa1de2fd651fbc5e89cbb", "sha256": "4db33a74fbae6e16f17a4450954f421a7f8eabcc6e1b85c27bb6eddcaaba1482" }, "downloads": -1, "filename": "pymuscle-0.1.2.tar.gz", "has_sig": false, "md5_digest": "8540793fea5fa1de2fd651fbc5e89cbb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 23352, "upload_time": "2019-02-12T05:09:40", "url": "https://files.pythonhosted.org/packages/e4/d6/ecf7f2ffd96284b449fc683aea39a792412b2534fe7444d03e177725b870/pymuscle-0.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5418a948eb1e8648d2a7f072f2231cbb", "sha256": "2981e5f30993cfc8ccb3bd7e8278f9d51c1a7cc4a104dd09ed3a581c1e49f0e3" }, "downloads": -1, "filename": "pymuscle-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5418a948eb1e8648d2a7f072f2231cbb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 20410, "upload_time": "2019-02-12T05:09:39", "url": "https://files.pythonhosted.org/packages/a6/06/7a14ca61714e980813c28f8f46f425dcce13fdce8d8d2ae9e15cefa331ab/pymuscle-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8540793fea5fa1de2fd651fbc5e89cbb", "sha256": "4db33a74fbae6e16f17a4450954f421a7f8eabcc6e1b85c27bb6eddcaaba1482" }, "downloads": -1, "filename": "pymuscle-0.1.2.tar.gz", "has_sig": false, "md5_digest": "8540793fea5fa1de2fd651fbc5e89cbb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 23352, "upload_time": "2019-02-12T05:09:40", "url": "https://files.pythonhosted.org/packages/e4/d6/ecf7f2ffd96284b449fc683aea39a792412b2534fe7444d03e177725b870/pymuscle-0.1.2.tar.gz" } ] }