{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# pyribs Dask demo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install ribs dask distributed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ribs.archives import GridArchive\n",
    "from ribs.emitters import ImprovementEmitter\n",
    "from ribs.optimizers import Optimizer\n",
    "\n",
    "def create_optimizer():\n",
    "    \"\"\"Creates components - refer to https://pyribs.org\"\"\"\n",
    "    archive = GridArchive(\n",
    "      dims=[20, 20],\n",
    "      ranges=[(-1, 1), (-1, 1)],\n",
    "    )\n",
    "\n",
    "    emitters = [\n",
    "      ImprovementEmitter(\n",
    "        archive,\n",
    "        x0=[0.0] * 10,\n",
    "        sigma0=0.1,\n",
    "      )\n",
    "    ]\n",
    "\n",
    "    optimizer = Optimizer(archive, emitters)\n",
    "\n",
    "    return archive, emitters, optimizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "## Evaluation function. ##\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "def sphere(x):\n",
    "    \"\"\"Technically, this is the negative sphere function.\"\"\"\n",
    "    obj = -np.sum(np.square(x))\n",
    "    bcs = x[:2]\n",
    "    return [obj, bcs]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from ribs.visualize import grid_archive_heatmap"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Running in Single Process\n",
    "\n",
    "Executes CMA-ME on the negative Sphere function.\n",
    "\n",
    "Refer to https://pyribs.org for this code."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "archive, emitters, optimizer = create_optimizer()\n",
    "\n",
    "for itr in range(1000):\n",
    "    solutions = optimizer.ask()\n",
    "\n",
    "    evals = [sphere(x) for x in solutions]\n",
    "    # Turn array of (obj, bc) into tuple of (objs, bcs).\n",
    "    objectives, bcs = zip(*evals)\n",
    "\n",
    "    optimizer.tell(objectives, bcs)\n",
    "\n",
    "grid_archive_heatmap(archive, square=True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Running with Dask\n",
    "\n",
    "We set up a local cluster with 2 workers and run the same function as above on the cluster. We also add in some logging in the experiment.\n",
    "\n",
    "To access the Dask dashboard and see worker metrics, open up <http://localhost:8787> in your browser."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from dask.distributed import Client, LocalCluster\n",
    "\n",
    "cluster = LocalCluster(\n",
    "    processes=True,  # Each worker is a process.\n",
    "    n_workers=2,  # Create this many worker processes.\n",
    "    threads_per_worker=1,  # Each worker process is single-threaded.\n",
    ")\n",
    "client = Client(cluster)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 100 - Archive Size: 287\n",
      "Iteration 200 - Archive Size: 365\n",
      "Iteration 300 - Archive Size: 386\n",
      "Iteration 400 - Archive Size: 397\n",
      "Iteration 500 - Archive Size: 398\n",
      "Iteration 600 - Archive Size: 400\n",
      "Iteration 700 - Archive Size: 400\n",
      "Iteration 800 - Archive Size: 400\n",
      "Iteration 900 - Archive Size: 400\n",
      "Iteration 1000 - Archive Size: 400\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "archive, emitters, optimizer = create_optimizer()\n",
    "\n",
    "for itr in range(1000):\n",
    "    solutions = optimizer.ask()\n",
    "\n",
    "    ## Distributed Evaluations ##\n",
    "    futures = client.map(sphere, solutions)\n",
    "    evals = client.gather(futures)\n",
    "    objectives, bcs = zip(*evals)\n",
    "\n",
    "    optimizer.tell(objectives, bcs)\n",
    "    \n",
    "    if (itr + 1) % 100 == 0:\n",
    "        ## Logging ##\n",
    "        archive_size = len(archive.as_pandas(include_solutions=False))\n",
    "        print(f\"Iteration {itr + 1} - Archive Size: {archive_size}\")\n",
    "\n",
    "grid_archive_heatmap(archive, square=True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dask with Reloading\n",
    "\n",
    "Essentially, we save the optimizer to a pickle file. pickle will take care of the archive and emitters because they are members of the Optimizer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 100 - Archive Size: 269\n",
      "Iteration 200 - Archive Size: 367\n",
      "Iteration 300 - Archive Size: 377\n",
      "Iteration 400 - Archive Size: 396\n",
      "Iteration 500 - Archive Size: 396\n",
      "Iteration 600 - Archive Size: 397\n",
      "Iteration 700 - Archive Size: 400\n",
      "Iteration 800 - Archive Size: 400\n",
      "Iteration 900 - Archive Size: 400\n",
      "Iteration 1000 - Archive Size: 400\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "archive, emitters, optimizer = create_optimizer()\n",
    "\n",
    "for itr in range(1000):\n",
    "    solutions = optimizer.ask()\n",
    "\n",
    "    ## Distributed Evaluations ##\n",
    "    futures = client.map(sphere, solutions)\n",
    "    evals = client.gather(futures)\n",
    "    objectives, bcs = zip(*evals)\n",
    "\n",
    "    optimizer.tell(objectives, bcs)\n",
    "    \n",
    "    if (itr + 1) % 100 == 0:\n",
    "        ## Logging ##\n",
    "        archive_size = len(archive.as_pandas(include_solutions=False))\n",
    "        print(f\"Iteration {itr + 1} - Archive Size: {archive_size}\")\n",
    "        \n",
    "        ## Reloading ##\n",
    "        with open(\"tmp.pkl\", \"wb\") as tmp_file:\n",
    "            data = {\n",
    "                \"itr\": itr + 1,\n",
    "                \"optimizer\": optimizer,\n",
    "            }\n",
    "            pickle.dump(data, tmp_file)\n",
    "        os.rename(\"tmp.pkl\", \"reload.pkl\")\n",
    "\n",
    "grid_archive_heatmap(archive, square=True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And here, we can reload the data and see the experiment state. We access the archive through the optimizer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reloaded Itr: 1000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with open(\"reload.pkl\", \"rb\") as reload_file:\n",
    "    data = pickle.load(reload_file)\n",
    "    \n",
    "reloaded_itr = data[\"itr\"]\n",
    "reloaded_optimizer = data[\"optimizer\"]\n",
    "\n",
    "print(\"Reloaded Itr:\", reloaded_itr)\n",
    "grid_archive_heatmap(reloaded_optimizer.archive, square=True)"
   ]
  }
 ],
 "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.7.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}