<div align="center">
    <p><b>TSP Art</b></p>
    <p>TSP Art Module for Python</p>
    <br>
    <a href="https://pypi.org/project/tspart/"><img src="https://img.shields.io/pypi/pyversions/tspart?logo=python&logoColor=white" alt="Python Version" /></a>
    <a href="https://pypi.org/project/tspart/"><img src="https://img.shields.io/pypi/v/tspart?logo=PyPI&logoColor=white" alt="PyPI Version" /></a>
    <br>
    <a href="https://github.com/nimaid/python-tspart/actions/workflows/publish-pypi-release.yml"><img src="https://img.shields.io/github/actions/workflow/status/nimaid/python-tspart/publish-pypi-release.yml?logo=GitHub" alt="GitHub Build" /></a>
    <a href="https://codecov.io/gh/nimaid/tspart"><img src="https://img.shields.io/codecov/c/github/nimaid/tspart?logo=codecov&logoColor=white" alt="Codecov Coverage" /></a>
    <a href="https://app.codacy.com/gh/nimaid/python-tspart/dashboard"><img src="https://app.codacy.com/project/badge/Grade/3b5186afcd5940fcab787150d374e1c8" alt="Codacy Badge" /></a>
    <br>
    <a href="https://github.com/nimaid/python-tspart/raw/main/LICENSE"><img src="https://img.shields.io/pypi/l/tspart?logo=opensourceinitiative&logoColor=white" alt="License" /></a>
    <a href="https://pypi.org/project/tspart/"><img src="https://img.shields.io/pypi/dm/tspart.svg?label=pypi%20downloads&logo=PyPI&logoColor=white" alt="PyPI Downloads" /></a>
    <a href="https://paypal.me/EllaJameson"><img src="https://img.shields.io/badge/PayPal-donate?logo=paypal&logoColor=white&label=donate&color=purple" alt="Donate" /></a>
</div>

<p align="center"><img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/bliss_25000_CMYK.png" width="800px" alt="Example image"/></p>

# Usage
See [The Jupyter notebook](https://github.com/nimaid/python-tspart/blob/main/tspart.ipynb) to learn how to use the library.

To test it out in your browser, head over to [Google Colab](https://colab.research.google.com/github/nimaid/python-tspart/blob/main/tspart.ipynb)!

# Full Documentation
<p align="center"><a href="https://tspart.readthedocs.io/en/latest/index.html"><img src="https://brand-guidelines.readthedocs.org/_images/logo-wordmark-vertical-dark.png" width="300px" alt="tspart on Read the Docs"></a></p>

# Gallery
<p align="center">
    <b>'Baboon' Standard Test Image</b>
    <br>
    500 Points
</p>

<table align="center" border="0" cellspacing="0" cellpadding="0" style="border-collapse:collapse !important;">
    <tr style="border: none !important;">
        <td align="center" style="border: none !important;">
            Original
        </td>
        <td align="center" style="border: none !important;">
            CMYK
        </td>
    </tr>
    <tr style="border: none !important;">
        <td align="center" style="border: none !important;">
            <img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/baboon.png" width="300px" alt="'Baboon' Standard Test Image (Original)"/>
        </td>
        <td align="center" style="border: none !important;">
            <img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/baboon_500_CMYK.png" width="300px" alt="'Baboon' Standard Test Image (CMYK)"/>
        </td>
    </tr>
    <tr style="border: none !important;">
        <td align="center" style="border: none !important;">
            RGB
        </td>
        <td align="center" style="border: none !important;">
            Grayscale
        </td>
    </tr>
    <tr style="border: none !important;">
        <td align="center" style="border: none !important;">
            <img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/baboon_500_RGB.png" width="300px" alt="'Baboon' Standard Test Image (RGB)"/>
        </td>
        <td align="center" style="border: none !important;">
            <img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/baboon_500_L.png" width="300px" alt="'Baboon' Standard Test Image (Grayscale)"/>
        </td>
    </tr>
</table>


<p align="center">
    <b>Bliss</b>
    <br>
    CMYK
    <br>
    25000 Points
    <br>
    <img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/bliss_25000_CMYK.png" width="800px" alt="Bliss"/>
</p>

<p align="center">
    <b>Bowser The Fearless</b>
    <br>
    CMYK
    <br>
    25000 Points
    <br>
    <img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/bowser_25000_CMYK.png" width="800px" alt="Bowser The Fearless"/>
</p>

<p align="center">
    <b>Self Portrait</b>
    <br>
    CMYK
    <br>
    35000 Points
    <br>
    <img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/ella_35000_CMYK.png" width="800px" alt="Self Portrait"/>
</p>

<p align="center">
    <b><a href="https://www.eso.org/public/images/eso1208a/">ESO 1208A</a></b>
    <br>
    CMYK
    <br>
    100000 Points
    <br>
    <img src="https://raw.githubusercontent.com/nimaid/python-tspart/main/tests/eso1208a_100000_CMYK.png" width="800px" alt="ESO 1208A"/>
</p>

# References
- [Original Stippling Code](https://github.com/ReScience-Archives/Rougier-2017) by [Nicolas Rougier](https://github.com/rougier)
- [Google OR-Tools TSP Guide](https://developers.google.com/optimization/routing/tsp)
- [Neos Server API Reference](https://neos-server.org/neos/xml-rpc.html)
- [Neos Server Job Queue](https://neos-server.org/neos/cgi-bin/nph-neos-solver.cgi?admin=queue)
