{ "info": { "author": "TU Braunschweig, IBR, Algorithms Group (Phillip Keldenich and Dominik Krupke)", "author_email": "keldenich@ibr.cs.tu-bs.de, krupke@ibr.cs.tu-bs.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Programming Language :: C++", "Programming Language :: Python :: 3" ], "description": "# Official Python Utilities for the CG:SHOP 2020 Optimization Competition.\n\n**WARNING: There is a small bug in the verifier. It does allow leaf points. We updated the source and the linux binary but due to a compiler bug, we cannot create a portable version for OS X. However, you can use the self-compile option. A update for Windows and OS X will hopefully follow soon.**\n\nWe provide basic code to ease your participation in this year's [challenge](https://cgshop.ibr.cs.tu-bs.de/competition/cg-shop-2020/).\nDue to it popularity and simplicity, the choice has fallen on Python.\nHowever, the real code is written in C++ with CGAL to provide the needed accuracy and\nefficiency.\n\nThis python module allows you to easily read the instance and potentially convert them\ninto an easier format. The JSON format is not as simple as last year's raw format but\nit allows to add metadata. Further, it allows you to verify your instances. It uses\nthe same core as the server so if this code accepts your solution, so will our server.\n\nThe code is not perfect but we will work to improve this code during the competition.\nFeedback is welcome.\n\nThe C++-core unfortunately messes with the platform independence of Python.\nAt this point, we already spent much more time into making the module as compatible as\npossible possible than into the actual code.\nUnfortunately, there are still a lot of ugly workarounds, which we try to remove soon.\nThe module has been tested on OS X and Linux.\n__Windows is still experimentally.__\n\nWe implemented a fallback mode that in case the native core could not be loaded at least\nthe basic functionality for reading and writing solutions and instances is available.\n\nPlease report any bugs you may find.\nYou can simply write a mail to cgshop-admin@ibr.cs.tu-bs.de and one of our developers will take care of it (also if you have questions or suggestions).\n\n[https://gitlab.ibr.cs.tu-bs.de/alg/cgshop2020_pyutils](https://gitlab.ibr.cs.tu-bs.de/alg/cgshop2020_pyutils)\n\n## Features\n\n* Reading and writing instance files.\n* Reading and writing solution files.\n* Verifying solutions for feasibility.\n* Simple triangulation solver to get a trivial feasible solution.\n\nThe exact same implementation will be used on the submission server.\nThus, if this library will accept your solution, so will the submission server.\n\n## Installing\n\nYou need to have a 64bit operating system (Linux, OS X, Windows) and a 64bit Python\ninterpreter for full functionality. Unfortunately, it is very easy on Windows to \naccidentally install outdated 32bit versions. 32bit users will only be able to use\na limited functionality (or have to compile the core themselves).\n\nThe module is available through pypi, e.g.,\n```python\npip install cgshop2020-pyutils\n```\n\nor when using the generally recommended [pipenv](https://github.com/pypa/pipenv). \n\n```python\npipenv install cgshop2020-pyutils\n```\n\nNote that you have to use `_` instead of `-` when importing the module.\n\nYou can also simply copy the folder `cgshop2020_pyutils` into your code folder and use\nit like a local module.\n\nIf you want to work in C++ directly, you can also simply copy our `cpp_core`.\nIf you have some experience with CMake, this should be straightforward.\nHowever, you will be missing the JSON functionality as this is written in pure Python\n(which is much simpler than doing this in C++).\n\nTo update to the newest version, you have to use \n```python\npip install cgshop2020-pyutils --upgrade\n```\nor\n```python\npipenv update cgshop2020-pyutils\n```\n\n## Getting started\n\nWith the module installed, you can now try to create your first solution set (simple triangulations) as follows:\n```python\n# Load an instance\nfrom cgshop2020_pyutils import InstanceDatabase, BestSolutionSet, SolutionZipWriter, TrivialTriangulationSolver\n\n# load challenge instances\nidb = InstanceDatabase(\"/path/to/zip/\")\n\n# compute the triangulation for all instances\ntriangulation_solver = TrivialTriangulationSolver()\nsolutions = BestSolutionSet()\nfor instance in idb:\n solutions.add(triangulation_solver(instance))\n print(f\"Computed triangulation for {instance.name}\")\n\n# write solutions into zip\nprint(\"Creating zip. This can take some time...\")\nwith SolutionZipWriter(\"my_first_upload.zip\") as zipper:\n zipper.add_solutions(solutions)\n\nprint(\"You can now upload 'my_first_upload.zip' on\",\n \"https://cgshop.ibr.cs.tu-bs.de/competition/cg-shop-2020/\")\n```\n\nYou can find further examples in [./examples](https://gitlab.ibr.cs.tu-bs.de/alg/cgshop2020_pyutils/tree/master/examples)\n\n## Instances\n\nYou can easily access the competitions instances by downloading the \n[zip-archive of the first instances batch](https://cgshop.ibr.cs.tu-bs.de/static/competitions/cgshop_2020/instances_01.zip),\nand using the `InstanceDatabase`.\n\nThe `InstanceDatabase` does only need the zip file or the directory of the extracted zip and will\nrecursively search it for instances of a specific name, e.g.\n```python\nfrom cgshop2020_pyutils import InstanceDatabase\ninstance_database = InstanceDatabase(\"/path/to/zip\")\nmona_lisa_instance = instance_database[\"mona_lisa_1000000\"]\n```\nalternatively, you could also simply iterate over all instances:\n```python\nfrom cgshop2020_pyutils import InstanceDatabase\ninstance_database = InstanceDatabase(\"/path/to/zip\")\nfor instance in instance_database:\n print(f\"Found instance {instance.name}\")\n```\n\nThe instance class is rather simple:\n```python\nfrom cgshop2020_pyutils import InstanceDatabase\ninstance_database = InstanceDatabase(\"/path/to/extracted/zip\")\ninstance = instance_database[\"uniform-0000100-2\"]\nprint(f\"The instance is named {instance.name}.\")\nprint(f\"It has {len(instance.name)} points.\")\nprint(f\"The first point is f{instance[0]}.\")\nprint(\"I now list the other points:\")\nfor point in instance:\n print(f\"({point.get_x()}, {point.get_y()}\")\n```\n\nYou could also create your own instance by \n```python\nfrom cgshop2020_pyutils import Instance, Point\ninstance = Instance(name=\"my_instance\", points=[Point(1.0, 1.0), Point(0.0, 3.0), Point(2.0, 0.0)])\ninstance.add_point(Point(1.0, 5.0)) # add an additional point\n```\n\n### Instance Format\n\nAn instance in json can look likes this:\n```json\n{\"points\": [\n {\"i\": 0, \"x\": 2396.0, \"y\": 5284.0}, \n {\"i\": 1, \"x\": 2656.0, \"y\": 2938.0}, \n {\"i\": 2, \"x\": 4120.0, \"y\": 2278.0}, \n {\"i\": 3, \"x\": 4342.0, \"y\": 102.0}, \n {\"i\": 4, \"x\": 4384.0, \"y\": 2988.0}, \n {\"i\": 5, \"x\": 5136.0, \"y\": 2280.0}, \n {\"i\": 6, \"x\": 6634.0, \"y\": 5416.0}, \n {\"i\": 7, \"x\": 8598.0, \"y\": 2632.0}, \n {\"i\": 8, \"x\": 8898.0, \"y\": 4170.0}, \n {\"i\": 9, \"x\": 11738.0, \"y\": 1550.0}\n ], \n \"type\": \"Instance\", \n \"name\": \"euro-night-0000010\", \n \"meta\": {\n \"comment\": \"HIP even point set instance (10 points) sampled from image \", \n \"faces_in_triangulation\": 12\n }\n}\n```\n* `points`: a list of points with (i=index, x=x coordinate, y=y coordinate)\n* `type`: \"Instance\", just tells you that this json describes an instance\n* `meta` some optional metadata\n * `comment`: Some comment on the instance\n * `faces_in_triangulation`: Number of faces in the delaunay triangulation as trivially achievable objective value.\n* `name`: name of instance. \n\nLast time we used some raw text format which is easier to parse but less powerful.\nIf you don't want to read json in your software, we recommend to convert the instances\nvia our python library to a simpler format.\n```python\nfrom cgshop2020_pyutils import InstanceDatabase\ninstance_database = InstanceDatabase(\"/path/to/extracted/zip\")\nfor instance in instance_database:\n with open(f\"{instance.name}.txt\", \"w\") as simple_file:\n for index in range(len(instance)):\n point = instance[index]\n simple_file.write(f\"{index} {point.get_x()} {point.get_y()}\\n\")\n```\n\nFor loading an instance from a specific file, you can use the `InstanceReader`.\n\n\n## Solution\n\n```python\nfrom cgshop2020_pyutils import Solution, Edge\nsolution = Solution(instance=\"my_instance\")\nsolution.add_edge(Edge(0, 1)) # edge from point with index 0 to point with index 1\nsolution.add_edge(Edge(0, 2)) # edge from point with index 0 to point with index 2\n\nsolution.delete_double_edges() # remove redundant edges, as double edges are illegal.\nfor edge in solution:\n print(edge)\nfor i in range(len(solution)):\n edge = solution[i]\n print(edge)\n```\nyou can easily create a valid json file:\n```python\nfrom cgshop2020_pyutils import SolutionWriter\nwriter = SolutionWriter()\nwriter.to_json(solution=solution, path=\"my_solution.json\")\n```\nto create a zip for upload, use \n```python\nfrom cgshop2020_pyutils import BestSolutionSet, SolutionZipWriter\n\nsolutions = BestSolutionSet()\nsolutions.add(solution)\nwith SolutionZipWriter(\"my_upload.zip\") as zipper:\n zipper.add_solutions(solutions)\n```\n\nWe will probably add a functionality for automatic upload from code in the near future.\n\n## Meta data\n\n`Solution` and `Instance` both have a `meta_data` attribute which is a dictionary.\nFor example you can add a comment by\n```python\nmy_solution.meta_data[\"comment\"] = \"This is a comment\"\n```\nwhich will also be saved when converting to JSON.\nEverything that can be converted to string will be saved to json and also reloaded\nwhen reading the json.\n\n## Checker\n\nWe provide an efficient checker for verifying solutions.\nIn case of infeasibility, the checker also provides a message with an error description.\nIf the solution is feasible, the objective value is computed.\n\n```python\nfrom cgshop2020_pyutils import SolutionChecker\n\nchecker = SolutionChecker()\nstatus = checker(instance=instance, solution=solution)\nprint(status.is_feasible())\nprint(status.get_message())\nprint(status.get_objective_value())\n```\n\n## Visualization\n\nWe provide a simple visualization based on matplotlib to quickly plot instances and solutions.\n\n```python\nfrom cgshop2020_pyutils import Visualizer\nvis = Visualizer()\nvis.visualize_solution(solution=solution, instance=instance) # opens plot if possible\nvis.visualize_solution(solution=solution, instance=instance, path=\"my_fig.pdf\") # writes plot to file\n```\n\n## Trivial Triangulation Solver\n\nWe provide a simple solver that just computes the Delaunay triangulation.\n\n```python\nfrom cgshop2020_pyutils import TrivialTriangulationSolver\nsolver = TrivialTriangulationSolver()\nsolution = solver(instance)\n```\n\n## Check a zip\n```python\nfrom cgshop2020_pyutils import ZipSolutionIterator, SolutionChecker, InstanceDatabase\nchecker = SolutionChecker()\nidb = InstanceDatabase(\"./instances_zipfile\")\nzsi = ZipSolutionIterator() # Also allows to set some constraints on file size, etc.\nfor solution in zsi(\"myzip.zip\"):\n instance = idb[solution.instance_name]\n assert checker(instance=instance, solution=solution).is_feasible()\n\n```\n\n## Compiling yourself\n\nYou should not need to do this as the module comes with precompiled binaries. However, it is possible to recompile the C++-core on your machine.\n\nYou need to have the following libraries installed:\n* A C++ compiler e.g. Debian/Ubuntu `apt-get install g++`\n* CMake Debian/Ubuntu: `apt-get install cmake`, OS X:`brew install cmake`\n* CGAL Debian/Ubuntu: `apt-get install cgal`, OS X:`brew install cgal`\n* Boost Debian/Ubuntu: `apt-get install boost`, OS X:`brew install boost`\n* Python3 (of course)\n* matplotlib in Python3 (e.g., `pip3 install matplotlib`)\n\nOtherwise, you likely get an error. \n\nDo a manual recompile with:\n```python\nimport cgshop2020_pyutils\ncgshop2020_pyutils.compile_cpp_core()\n```\nThis will only work if you installed into user space (without sudo) as otherwise the\ncompiler cannot write the files into the module folder.\n\nThis command actually just executes CMake.\nYou could also do this by hand.\n\nFor Windows, CMake might use slightly different paths. In that case, you could simply copy the created `.dll` into the `binaries` folder.\n\n## Changelog\n\n* _0.1.0_ First published version with native support for OS X and Linux.\n* _0.1.1_ Experimental Windows support\n* _0.1.2_ 32bit detection and warning.\n* _0.1.3_ fixed a problem with some Windows versions (could not find the supplied dependencies in the same folder)\n* _0.1.4_ Implemented InstanceDatabase, fixed bug with reading solution (thanks to Johannes Obenaus)\n* _0.1.5_ Bugfix in InstanceDatabase\n* _0.2.0_ Zip reading utilities.\n* _0.2.1_ Missing dependency declaration in pip package (chardet).\n* _0.3.0_ Added zip writing utilities and examples.\n* _0.3.1_ Removed potential problem in InstanceDatabase, improved documentation. Fixed a bug in zip reader (which makes me wonder why it worked on the test server?)\n* _0.3.2_ The ZIP module in the Python library has some breaking changes (problems with older versions).\n* _0.3.3_ The potential bugfix of 0.3.1 introduced a real bug with some paths.\n* _0.3.4_ Same as 0.3.3 but this time it should really fix it.\n* _0.3.5_ The InstanceDatabase has a serious memory consumption. Disabled caching by default.\n* _0.3.6_ Some improvements in handling exceptions of bad files.\n* _0.3.7_ Fixed a bug that made loading the C++ core with MS Windows impossible. Thanks for noticing and fixing to Semjon Kerner.\n* _0.4.0_ InstanceDatabase can now read directly from zip.\n* _0.4.1_ Fixed bug in verifier that does allow leaf points. NO BINARY UPDATE FOR OS X AND WINDOWS RIGHT NOW! Thanks to Gil Ben-Shachar for noticing!\n* _0.4.2_ New core compiled for OS X. Version checking of core.\n* _0.4.3_ Fixed problems if meta data is not a dict.\n* _0.4.4_ More flexible regarding the instance name (allowing \".instance\" in instance access via InstanceDatabase).\n\n### Roadmap/Planned features\n\n* Proper testing with 100% coverage (currently don't have the manpower for that)\n* Upload of zips\n* Fetching the objective value for your currently best solutions from the server (and skipping upload of worse solutions)\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://cgshop.ibr.cs.tu-bs.de/competition/cg-shop-2020/", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "cgshop2020-pyutils", "package_url": "https://pypi.org/project/cgshop2020-pyutils/", "platform": "", "project_url": "https://pypi.org/project/cgshop2020-pyutils/", "project_urls": { "Homepage": "https://cgshop.ibr.cs.tu-bs.de/competition/cg-shop-2020/" }, "release_url": "https://pypi.org/project/cgshop2020-pyutils/0.4.4/", "requires_dist": [ "matplotlib", "chardet" ], "requires_python": ">=3.6", "summary": "Utilities for the CG:SHOP 2020 Optimization Competition on the Minimum Convex Partition Problem.", "version": "0.4.4", "yanked": false, "yanked_reason": null }, "last_serial": 8702370, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "5b1c06c248b5fd6bc601c4ac35af2289", "sha256": "e2a7b11188891552dedefa9639e7db332f4690750680de8015655cb4e3d4a05a" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5b1c06c248b5fd6bc601c4ac35af2289", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 6434896, "upload_time": "2019-09-27T09:52:06", "upload_time_iso_8601": "2019-09-27T09:52:06.141818Z", "url": "https://files.pythonhosted.org/packages/9c/ce/a838c324f4d6c65eb2f63c7d79c46da7e153d225b408dbd244fbfc47d6f0/cgshop2020_pyutils-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "618db5b35a130fff654aabb08b61bf5c", "sha256": "63d60f45f484b14dc6338b603000f45fc849bf1bee5f4fbd11a25307f4309447" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "618db5b35a130fff654aabb08b61bf5c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8833722, "upload_time": "2019-09-27T14:13:45", "upload_time_iso_8601": "2019-09-27T14:13:45.381681Z", "url": "https://files.pythonhosted.org/packages/1d/d9/569cdb819999d88841828501a434f6da19fb4095782e453af5d79afb300e/cgshop2020_pyutils-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "a33304094fe8b4025549aa07cf128ec0", "sha256": "cc536f39dd4c1e700904d806d017cf1da4e8765f56ea29142abd4b2e4dbb8360" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a33304094fe8b4025549aa07cf128ec0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8834082, "upload_time": "2019-09-28T07:53:16", "upload_time_iso_8601": "2019-09-28T07:53:16.816507Z", "url": "https://files.pythonhosted.org/packages/22/e6/e9ba3a054b3f0a757287d579863df163bc553311ba258f32f0f734d05575/cgshop2020_pyutils-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "69cc277c4fe5503d1a05cd69dbb6ae48", "sha256": "b9bdb9eeb69602daf46ffedb77ed7f72c15e940673025dddb62d7e78ffa8a981" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "69cc277c4fe5503d1a05cd69dbb6ae48", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8834462, "upload_time": "2019-09-30T13:48:08", "upload_time_iso_8601": "2019-09-30T13:48:08.633827Z", "url": "https://files.pythonhosted.org/packages/15/a6/84330a2c8dc749df1b6ff8a6158166d6b36c39d442d4fb69570c794a49c9/cgshop2020_pyutils-0.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "158d2f74ec1951231c489a29d74292ab", "sha256": "d955c059fa597bb5e1e3eb26e63162b774a37d88c4547206f3efede004199fe4" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "158d2f74ec1951231c489a29d74292ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8835828, "upload_time": "2019-10-14T12:39:19", "upload_time_iso_8601": "2019-10-14T12:39:19.669843Z", "url": "https://files.pythonhosted.org/packages/ba/3d/6b63450941f092aefd9832f3e61c8ee59a721b7db9b8bfa0db5059c51849/cgshop2020_pyutils-0.1.4-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "57e8b0848abcf3f7b4286c481449b71b", "sha256": "583c11c3cabafcb11912be92fe13fb2d29ded55b36c39fba92e369ce05e4d69c" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "57e8b0848abcf3f7b4286c481449b71b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8835899, "upload_time": "2019-10-14T15:47:40", "upload_time_iso_8601": "2019-10-14T15:47:40.883412Z", "url": "https://files.pythonhosted.org/packages/68/9e/88bf88e7194ff5f91d3e2819c4202cd89c4c90e1d4e4fbc7e3373287cf79/cgshop2020_pyutils-0.1.5-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "d22f28648aeef589ab5bb58a868de387", "sha256": "2a2fda5a339a8c2ccd7d72f116ab0866fa58a3562d42df0303fd4a37e8cd219f" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d22f28648aeef589ab5bb58a868de387", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8840737, "upload_time": "2019-10-15T16:07:07", "upload_time_iso_8601": "2019-10-15T16:07:07.318801Z", "url": "https://files.pythonhosted.org/packages/6c/7a/fe7083dd783764ddb901f15e98794c78164a502dbef864b9d7d858421f29/cgshop2020_pyutils-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "ac734b2a450520c6b5551a18cfb18c64", "sha256": "a2459e0dd00ae0a3342af7c68a4872269b8113aa6c2bd80ce6ddd0b6a654b1c2" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ac734b2a450520c6b5551a18cfb18c64", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8840765, "upload_time": "2019-10-15T16:20:36", "upload_time_iso_8601": "2019-10-15T16:20:36.522785Z", "url": "https://files.pythonhosted.org/packages/1c/6a/adb4ed90f75baf4b300ac55eb61e8c8f1125f6df829982e30eb01d624820/cgshop2020_pyutils-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "1b590c9a689e450b2368aec6238b84df", "sha256": "208786172c111e285a38d7d92b81aaa27c4d25d8236e49827233d90eccd66c96" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1b590c9a689e450b2368aec6238b84df", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8842894, "upload_time": "2019-10-18T14:59:59", "upload_time_iso_8601": "2019-10-18T14:59:59.427764Z", "url": "https://files.pythonhosted.org/packages/94/53/b3de1f36379efc239f6ed859ef4dd50c3668fe2501d1cdfd6bae3a84f2d8/cgshop2020_pyutils-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "dd2610cf599dcb9a055ed1a1f657786b", "sha256": "06c2a55a71f1236869ee27cb34540ec4b454574b7f11fc648600be586f1629f5" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dd2610cf599dcb9a055ed1a1f657786b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8843485, "upload_time": "2019-10-23T08:32:42", "upload_time_iso_8601": "2019-10-23T08:32:42.490201Z", "url": "https://files.pythonhosted.org/packages/17/44/34ad690a531dce8b9c41f540d0ffb959b652b51b061e8ced0fd2c4fa24b1/cgshop2020_pyutils-0.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "34877725f8cd175b0c336080883d7c0c", "sha256": "d26ff69e24a5e78a108a4157ee13aad27515eaed0835c583b12dce1dd2eb31b0" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "34877725f8cd175b0c336080883d7c0c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8843562, "upload_time": "2019-10-23T14:30:08", "upload_time_iso_8601": "2019-10-23T14:30:08.630551Z", "url": "https://files.pythonhosted.org/packages/66/aa/7eb6c35839922ff795e8d47c13cbd4f8f4ac46cfdaead7374a5085362529/cgshop2020_pyutils-0.3.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "b059f283e75b1a64aec3e0dbeb7be720", "sha256": "a5da78d099f9ea66daafd3c3b23812f400ddf539cc05e354cacab9709a9fb07b" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "b059f283e75b1a64aec3e0dbeb7be720", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8843644, "upload_time": "2019-10-23T15:22:40", "upload_time_iso_8601": "2019-10-23T15:22:40.890579Z", "url": "https://files.pythonhosted.org/packages/1c/2d/c46fccf0cd40f515a71fa972fc9ba61fd2dce09265f288fff608ea00c04e/cgshop2020_pyutils-0.3.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "be7370df20d1668355428d517e802825", "sha256": "a98f757eead91193743ffec259dfcc33fedd03b05786b0601a34e8592f5dbfdc" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.3.4-py3-none-any.whl", "has_sig": false, "md5_digest": "be7370df20d1668355428d517e802825", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8843674, "upload_time": "2019-10-23T15:36:37", "upload_time_iso_8601": "2019-10-23T15:36:37.628578Z", "url": "https://files.pythonhosted.org/packages/54/ba/952f5ed30b2e95934e749a59b627b439b2280c2bf427d0e5591fc5853117/cgshop2020_pyutils-0.3.4-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "6ae4ebed1782b228c0307fc03702df2d", "sha256": "c9d25cf15c564fa9843931ae0ba7b17a9d204c75a3b301285b3d5784c3ab833a" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.3.6-py3-none-any.whl", "has_sig": false, "md5_digest": "6ae4ebed1782b228c0307fc03702df2d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8843829, "upload_time": "2019-10-24T15:54:07", "upload_time_iso_8601": "2019-10-24T15:54:07.126986Z", "url": "https://files.pythonhosted.org/packages/31/f8/8de70681a34761ae20fac8e14c7ba90cb986652421f8e68e2a560840b6a7/cgshop2020_pyutils-0.3.6-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "efffdd80a612cc060c875560531f5a42", "sha256": "caa19af2a7e7ce909039bd3780b980cdcd3a45944cdbccfd71c515a017ba5eeb" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.3.7-py3-none-any.whl", "has_sig": false, "md5_digest": "efffdd80a612cc060c875560531f5a42", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8843883, "upload_time": "2019-11-18T19:04:47", "upload_time_iso_8601": "2019-11-18T19:04:47.225469Z", "url": "https://files.pythonhosted.org/packages/ca/18/a20f9f98ce3c46abbabaa99e3e7460ff7b83a226596c4f0df67d55b1ec8c/cgshop2020_pyutils-0.3.7-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "e9d190873a04f5cd3e631bd7b005d980", "sha256": "12c6f0fca6f64e207f94735a5484c8b34a9952fa4b088ca3afb7d5cb5e4b28d7" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e9d190873a04f5cd3e631bd7b005d980", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 8846862, "upload_time": "2019-11-26T07:47:00", "upload_time_iso_8601": "2019-11-26T07:47:00.794815Z", "url": "https://files.pythonhosted.org/packages/d5/98/47689bb1126d6c15409305e8b4e1265ed2f414553025cec07ad607fff67d/cgshop2020_pyutils-0.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "005c8edba99e7bfc19a36507048a937b", "sha256": "1425858388903f59e0b5babc25f579da52ccc8b2ee8eb0fc4f6eccf3156ca16e" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "005c8edba99e7bfc19a36507048a937b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 13302915, "upload_time": "2019-11-27T16:51:50", "upload_time_iso_8601": "2019-11-27T16:51:50.824525Z", "url": "https://files.pythonhosted.org/packages/7e/58/9dea411f1cbbc49400739ef6ec22ba38856a52cf661db8a45866109bae78/cgshop2020_pyutils-0.4.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "d1398a4631a5a81625a340bce544e6b4", "sha256": "0fe336b5c893c6db49500320e22257f866b531a3ce29e401451b6fd44f3f1108" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d1398a4631a5a81625a340bce544e6b4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 13399458, "upload_time": "2019-12-17T14:54:12", "upload_time_iso_8601": "2019-12-17T14:54:12.818779Z", "url": "https://files.pythonhosted.org/packages/df/d2/c3141f16cfefc811e12bca6fe645bf8cd7d550b5ebb05634e45b44bcd806/cgshop2020_pyutils-0.4.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "d2fd6abc5bd563bdc7962f782ad8e8d5", "sha256": "8770681d01952013a1ba8ba145d858d5a7595a4eecdbc870a35f29136ae5ee0a" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.4.3-py3-none-any.whl", "has_sig": false, "md5_digest": "d2fd6abc5bd563bdc7962f782ad8e8d5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 13399542, "upload_time": "2020-01-10T06:08:47", "upload_time_iso_8601": "2020-01-10T06:08:47.415311Z", "url": "https://files.pythonhosted.org/packages/ff/c1/df23ac51214c0a5be7d03c6dd4d3196ea9169eb58a345ba5fd4243189a2f/cgshop2020_pyutils-0.4.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "781bc0f42329dd0f3f5a42a5d65994dc", "sha256": "1f55b542aced7ffbc90c7a8d6bf50a569b4fe993497a0600f367c4ac6f273698" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.4.4-py3-none-any.whl", "has_sig": false, "md5_digest": "781bc0f42329dd0f3f5a42a5d65994dc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 13399656, "upload_time": "2020-01-10T10:24:59", "upload_time_iso_8601": "2020-01-10T10:24:59.688170Z", "url": "https://files.pythonhosted.org/packages/96/96/696744eac6ea3a7bdc780f9b5aa1b2eaeed3d7addd6c8fd9ff3f50e9ac14/cgshop2020_pyutils-0.4.4-py3-none-any.whl", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "781bc0f42329dd0f3f5a42a5d65994dc", "sha256": "1f55b542aced7ffbc90c7a8d6bf50a569b4fe993497a0600f367c4ac6f273698" }, "downloads": -1, "filename": "cgshop2020_pyutils-0.4.4-py3-none-any.whl", "has_sig": false, "md5_digest": "781bc0f42329dd0f3f5a42a5d65994dc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 13399656, "upload_time": "2020-01-10T10:24:59", "upload_time_iso_8601": "2020-01-10T10:24:59.688170Z", "url": "https://files.pythonhosted.org/packages/96/96/696744eac6ea3a7bdc780f9b5aa1b2eaeed3d7addd6c8fd9ff3f50e9ac14/cgshop2020_pyutils-0.4.4-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }