{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Samila Demo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "try:\n",
    "  import google.colab\n",
    "  !{sys.executable} -m pip -q -q install samila\n",
    "except:\n",
    "  pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import random\n",
    "import math\n",
    "from samila import GenerativeImage, Projection, Marker"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basic Generation\n",
    "If we call `generate` with no input parameters, we get a plot from two random equations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g1 = GenerativeImage()\n",
    "g1.generate()\n",
    "g1.plot()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Assigning Functions\n",
    "By defining `f1` and `f2`, we can control the general shape of the plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f1(x, y):\n",
    "    result = random.uniform(-1,1) * x**2  - math.sin(y**2) + abs(y-x)\n",
    "    return result\n",
    "\n",
    "def f2(x, y):\n",
    "    result = random.uniform(-1,1) * y**3 - math.cos(x**2) + 2*x\n",
    "    return result\n",
    "\n",
    "g2 = GenerativeImage(f1, f2)\n",
    "g2.generate()\n",
    "g2.plot()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Projection\n",
    "We can use the `projection` attribute to define the coordinate system to transform our functions\n",
    "\n",
    "The avaliable projections are `RECTILINEAR`, `POLAR`, `AITOFF`, `HAMMER`, `LAMBERT`, `MOLLWEIDE` and `RANDOM`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2 = GenerativeImage(f1, f2)\n",
    "g2.generate()\n",
    "\n",
    "for p in list(Projection):\n",
    "    print(p)\n",
    "    g2.plot(projection=p)\n",
    "    plt.show()\n",
    "    plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Marker\n",
    "We can use the `marker` attribute to change the plotting marker.\n",
    "\n",
    "The available markers are `POINT`, `PIXEL`, `CIRCLE`, `TRIANGLE_DOWN`, `TRIANGLE_UP`, `TRIANGLE_LEFT`, `TRIANGLE_RIGHT`, `TRI_DOWN`, `TRI_UP`, `TRI_LEFT`, `TRI_RIGHT`, `OCTAGON`, `SQUARE`, `PENTAGON`, `PLUS`, `PLUS_FILLED`, `STAR`, `HEXAGON_VERTICAL`, `HEXAGON_HORIZONTAL`, `X`, `X_FILLED`, `DIAMOND`, `DIAMON_THIN`, `VLINE`, `HLINE` and `RANDOM`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2 = GenerativeImage(f1, f2)\n",
    "g2.generate()\n",
    "\n",
    "for m in list(Marker):\n",
    "    print(m)\n",
    "    g2.plot(marker=m, spot_size=100)\n",
    "    plt.show()\n",
    "    plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Rotation\n",
    "You can even rotate your art by using `rotation` parameter. Enter your desired rotation for the image in degrees and you will have it.\n",
    "\n",
    "* Default rotation is 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g = GenerativeImage(f1, f2)\n",
    "g.generate()\n",
    "g.plot(rotation=45)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Range\n",
    "\n",
    "Control the range over which the input values span"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2 = GenerativeImage(f1, f2)\n",
    "g2.generate(start=-1.5*math.pi, step=0.007, stop=0)\n",
    "g2.plot(projection=Projection.POLAR)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Color\n",
    "\n",
    "We can assign colors for both the background as well as the line\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2 = GenerativeImage(f1, f2)\n",
    "g2.generate()\n",
    "g2.plot(color=\"maroon\", bgcolor=\"antiquewhite\", projection=Projection.POLAR)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Supported colors are available in `VALID_COLORS` list\n",
    "* `color` and `bgcolor` parameters supported formats:\n",
    "\n",
    "    1. Color name (example: `color=\"yellow\"`)\n",
    "    2. RGB/RGBA (example: `color=(0.1,0.1,0.1)`, `color=(0.1,0.1,0.1,0.1)`)\n",
    "    3. Hex (example: `color=\"#eeefff\"`)\n",
    "    4. Random (example: `color=\"random\"`)\n",
    "    5. Complement (example: `color=\"complement\", bgcolor=\"blue\"`)\n",
    "    6. Transparent (example: `bgcolor=\"transparent\"`)\n",
    "    7. List (example: `color=[\"black\", \"#fffeef\",...]`)\n",
    "\n",
    "⚠️ **Transparent** mode is only available for background\n",
    "\n",
    "⚠️ **List** mode is only available for color\n",
    "\n",
    "⚠️ In **List** mode, the length of this list must be equal to the lengths of data1 and data2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Point Color\n",
    "\n",
    "You can make your custom color map and use it in Samila"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "colorarray = [\n",
    "    [0.7, 0.2, 0.2, 1],\n",
    "    [0.6, 0.3, 0.2, 1],\n",
    "    \"black\",\n",
    "    [0.4, 0.4, 0.3, 1],\n",
    "    [0.3, 0.4, 0.4, 1],\n",
    "    \"#ff2561\"]\n",
    "g2.generate()\n",
    "g2.plot(cmap=colorarray, color=g2.data2, projection=Projection.POLAR)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spot Size\n",
    "\n",
    "We can also change the size of the plot marker"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2 = GenerativeImage(f1, f2)\n",
    "g2.generate()\n",
    "g2.plot(color=\"yellow\", bgcolor=\"darkslategray\", spot_size=0.25)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Random Seeds\n",
    "If we do not pass in a seed when calling `generate`, a random seed will be created for us\n",
    "\n",
    "Passing this seed into `generate` will guarantee plot reproducibility"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "seed = g2.seed\n",
    "print(seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2 = GenerativeImage(f1, f2)\n",
    "g2.generate(seed)\n",
    "g2.plot(color=\"yellow\", bgcolor=\"darkslategray\", spot_size=0.05)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Saving Images\n",
    "\n",
    "Save generated images\n",
    "\n",
    "Use the `depth` attribute to increase the resolution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2.save_image(file_adr=\"test.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2.save_image(file_adr=\"test_high_res.png\", depth=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Saving Data\n",
    "\n",
    "Save generated image data\n",
    "\n",
    "It can then be loaded into a `GenerativeImage` instance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2.save_data(file_adr=\"data.json\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g2 = GenerativeImage(data=open('data.json', 'r'))\n",
    "g2.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Saving Config\n",
    "\n",
    "Save generated image config. It contains string formats of functions which is also human readable\n",
    "\n",
    "It can then be loaded into a `GenerativeImage` instance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g1.save_config(file_adr=\"config.json\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g1 = GenerativeImage(config=open('config.json', 'r'))\n",
    "g1.generate()\n",
    "g1.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## NFT.storage"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Upload generated image directly to [NFT.storage](https://nft.storage)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g1.nft_storage(api_key=\"YOUR_API_KEY\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g1.nft_storage(api_key=\"YOUR_API_KEY\", timeout=5000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can also upload your config/data to nft storage as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g1.nft_storage(api_key=\"YOUR_API_KEY\", upload_config=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g1.nft_storage(api_key=\"YOUR_API_KEY\", upload_data=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Default timeout is **3000** seconds"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Samila Demo",
   "title_sidebar": "Samila Demo",
   "toc_cell": false,
   "toc_position": {
    "height": "382px",
    "left": "10px",
    "top": "10px",
    "width": "256px"
   },
   "toc_section_display": false,
   "toc_window_display": true
  },
  "vscode": {
   "interpreter": {
    "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
