awarebayes/RecNN

View on GitHub
examples/2. REINFORCE TopK Off Policy Correction/3. TopK Reinforce Off Policy Correction.ipynb

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TopK Reinforce Off Policy Correction\n",
    "\n",
    "### (TopK is here!)\n",
    "\n",
    "The following code contains an implementation of the REINFORCE algorithm, **LSTM state encoder, and Noise Contrastive Estimation**. Look for these in other notebooks.\n",
    "\n",
    "Also, I am not google staff, and unlike the paper authors, I cannot have online feedback concerning the recommendations.\n",
    "\n",
    "**I use actor-critic for reward assigning.** In a real-world scenario that would be done through interactive user feedback, but here I use a neural network (critic) that aims to emulate it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "from torch.utils.tensorboard import SummaryWriter\n",
    "import torch_optimizer as optim\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from tqdm.auto import tqdm\n",
    "from time import gmtime, strftime\n",
    "\n",
    "from IPython.display import clear_output\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "\n",
    "# == recnn ==\n",
    "import sys\n",
    "sys.path.append(\"../../\")\n",
    "import recnn\n",
    "\n",
    "cuda = torch.device('cuda')\n",
    "\n",
    "# ---\n",
    "frame_size = 10\n",
    "batch_size = 10\n",
    "n_epochs   = 100\n",
    "plot_every = 30\n",
    "num_items    = 5000 # n items to recommend. Can be adjusted for your vram \n",
    "# --- \n",
    "\n",
    "tqdm.pandas()\n",
    "\n",
    "\n",
    "from jupyterthemes import jtplot\n",
    "jtplot.style(theme='grade3')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": "0%|          | 0/18946308 [00:00<?, ?it/s]action space is reduced to 26744 - 21744 = 5000\n100%|██████████| 18946308/18946308 [00:12<00:00, 1491220.28it/s]\n100%|██████████| 18946308/18946308 [00:14<00:00, 1300204.77it/s]\n100%|██████████| 138493/138493 [00:07<00:00, 19291.96it/s]\n"
    }
   ],
   "source": [
    "def embed_batch(batch, item_embeddings_tensor, *args, **kwargs):\n",
    "    return recnn.data.batch_contstate_discaction(batch, item_embeddings_tensor,\n",
    "                                                 frame_size=frame_size, num_items=num_items)\n",
    "    \n",
    "def prepare_dataset(args_mut, kwargs):\n",
    "    kwargs.set('reduce_items_to', num_items) # set kwargs for your functions here!\n",
    "    pipeline = [recnn.data.truncate_dataset, recnn.data.prepare_dataset]\n",
    "    recnn.data.build_data_pipeline(pipeline, kwargs, args_mut)\n",
    "    \n",
    "\n",
    "\n",
    "# embeddgings: https://drive.google.com/open?id=1EQ_zXBR3DKpmJR3jBgLvt-xoOvArGMsL\n",
    "dirs = recnn.data.env.DataPath(\n",
    "    base=\"../../data/\",\n",
    "    embeddings=\"embeddings/ml20_pca128.pkl\",\n",
    "    ratings=\"ml-20m/ratings.csv\",\n",
    "    # IMPORTANT! I am using a different name for cache\n",
    "    # If you change your pipeline, change the name as well!\n",
    "    # Different pipelines must have different names!\n",
    "    cache=\"cache/frame_env_truncated.pkl\", \n",
    "    use_cache=True\n",
    ")\n",
    "\n",
    "env = recnn.data.env.FrameEnv(\n",
    "    dirs, frame_size,\n",
    "    batch_size,\n",
    "    embed_batch=embed_batch,\n",
    "    prepare_dataset=prepare_dataset,\n",
    "    num_workers=4\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Beta(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Beta, self).__init__()\n",
    "        self.net = nn.Sequential(\n",
    "            nn.Linear(1290, num_items),\n",
    "            nn.Softmax()\n",
    "        )\n",
    "        self.optim = optim.RAdam(self.net.parameters(), lr=1e-5, weight_decay=1e-5)\n",
    "        self.criterion = nn.CrossEntropyLoss()\n",
    "        \n",
    "    def forward(self, state, action):\n",
    "        \n",
    "        predicted_action = self.net(state)\n",
    "        \n",
    "        loss = self.criterion(predicted_action, action.argmax(1))\n",
    "        \n",
    "        self.optim.zero_grad()\n",
    "        loss.backward()\n",
    "        self.optim.step()\n",
    "        \n",
    "        return predicted_action.detach()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "beta_net   = Beta().to(cuda)\n",
    "value_net  = recnn.nn.Critic(1290, num_items, 2048, 54e-2).to(cuda)\n",
    "policy_net = recnn.nn.DiscreteActor(1290, num_items, 2048).to(cuda)\n",
    "# as miracle24 has suggested https://github.com/awarebayes/RecNN/issues/7\n",
    "# you can enable this to be more like the paper authors meant it to\n",
    "policy_net.action_source = {'pi': 'beta', 'beta': 'beta'}\n",
    "\n",
    "reinforce = recnn.nn.Reinforce(policy_net, value_net)\n",
    "reinforce = reinforce.to(cuda)\n",
    "\n",
    "reinforce.writer = SummaryWriter(log_dir='../../runs/ReinforceTopKoffPolicy{}/'.format(strftime(\"%H_%M\", gmtime())))\n",
    "plotter = recnn.utils.Plotter(reinforce.loss_layout, [['value', 'policy']],)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from recnn.nn import ChooseREINFORCE\n",
    "\n",
    "def select_action_corr(state, action, K, writer, step, **kwargs):\n",
    "    # note here I provide beta_net forward in the arguments\n",
    "    return reinforce.nets['policy_net']._select_action_with_TopK_correction(state, beta_net.forward, action,\n",
    "                                                                            K=K, writer=writer,\n",
    "                                                                            step=step)\n",
    "\n",
    "reinforce.nets['policy_net'].select_action = select_action_corr\n",
    "reinforce.params['reinforce'] = ChooseREINFORCE(ChooseREINFORCE.reinforce_with_TopK_correction)\n",
    "reinforce.params['K'] = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "step 1110\n"
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": "<Figure size 1152x432 with 2 Axes>",
      "image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"375.296187pt\" version=\"1.1\" viewBox=\"0 0 928.8335 375.296187\" width=\"928.8335pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <metadata>\n  <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n   <cc:Work>\n    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n    <dc:date>2020-08-09T16:25:15.255855</dc:date>\n    <dc:format>image/svg+xml</dc:format>\n    <dc:creator>\n     <cc:Agent>\n      <dc:title>Matplotlib v3.3.0, https://matplotlib.org/</dc:title>\n     </cc:Agent>\n    </dc:creator>\n   </cc:Work>\n  </rdf:RDF>\n </metadata>\n <defs>\n  <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\n </defs>\n <g id=\"figure_1\">\n  <g id=\"patch_1\">\n   <path d=\"M 0 375.296187 \nL 928.8335 375.296187 \nL 928.8335 0 \nL 0 0 \nz\n\" style=\"fill:#ffffff;\"/>\n  </g>\n  <g id=\"axes_1\">\n   <g id=\"patch_2\">\n    <path d=\"M 28.8335 350.30175 \nL 434.651682 350.30175 \nL 434.651682 24.14175 \nL 28.8335 24.14175 \nz\n\" style=\"fill:#ffffff;\"/>\n   </g>\n   <g id=\"matplotlib.axis_1\">\n    <g id=\"xtick_1\">\n     <g id=\"line2d_1\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 43.895142 350.30175 \nL 43.895142 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_2\"/>\n     <g id=\"text_1\">\n      <!-- 0 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(39.886767 365.475781)scale(0.126 -0.126)\">\n       <defs>\n        <path d=\"M 31.78125 66.40625 \nQ 24.171875 66.40625 20.328125 58.90625 \nQ 16.5 51.421875 16.5 36.375 \nQ 16.5 21.390625 20.328125 13.890625 \nQ 24.171875 6.390625 31.78125 6.390625 \nQ 39.453125 6.390625 43.28125 13.890625 \nQ 47.125 21.390625 47.125 36.375 \nQ 47.125 51.421875 43.28125 58.90625 \nQ 39.453125 66.40625 31.78125 66.40625 \nz\nM 31.78125 74.21875 \nQ 44.046875 74.21875 50.515625 64.515625 \nQ 56.984375 54.828125 56.984375 36.375 \nQ 56.984375 17.96875 50.515625 8.265625 \nQ 44.046875 -1.421875 31.78125 -1.421875 \nQ 19.53125 -1.421875 13.0625 8.265625 \nQ 6.59375 17.96875 6.59375 36.375 \nQ 6.59375 54.828125 13.0625 64.515625 \nQ 19.53125 74.21875 31.78125 74.21875 \nz\n\" id=\"DejaVuSans-48\"/>\n       </defs>\n       <use xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_2\">\n     <g id=\"line2d_3\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 111.587917 350.30175 \nL 111.587917 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_4\"/>\n     <g id=\"text_2\">\n      <!-- 200 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(99.562792 365.475781)scale(0.126 -0.126)\">\n       <defs>\n        <path d=\"M 19.1875 8.296875 \nL 53.609375 8.296875 \nL 53.609375 0 \nL 7.328125 0 \nL 7.328125 8.296875 \nQ 12.9375 14.109375 22.625 23.890625 \nQ 32.328125 33.6875 34.8125 36.53125 \nQ 39.546875 41.84375 41.421875 45.53125 \nQ 43.3125 49.21875 43.3125 52.78125 \nQ 43.3125 58.59375 39.234375 62.25 \nQ 35.15625 65.921875 28.609375 65.921875 \nQ 23.96875 65.921875 18.8125 64.3125 \nQ 13.671875 62.703125 7.8125 59.421875 \nL 7.8125 69.390625 \nQ 13.765625 71.78125 18.9375 73 \nQ 24.125 74.21875 28.421875 74.21875 \nQ 39.75 74.21875 46.484375 68.546875 \nQ 53.21875 62.890625 53.21875 53.421875 \nQ 53.21875 48.921875 51.53125 44.890625 \nQ 49.859375 40.875 45.40625 35.40625 \nQ 44.1875 33.984375 37.640625 27.21875 \nQ 31.109375 20.453125 19.1875 8.296875 \nz\n\" id=\"DejaVuSans-50\"/>\n       </defs>\n       <use xlink:href=\"#DejaVuSans-50\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_3\">\n     <g id=\"line2d_5\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 179.280691 350.30175 \nL 179.280691 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_6\"/>\n     <g id=\"text_3\">\n      <!-- 400 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(167.255566 365.475781)scale(0.126 -0.126)\">\n       <defs>\n        <path d=\"M 37.796875 64.3125 \nL 12.890625 25.390625 \nL 37.796875 25.390625 \nz\nM 35.203125 72.90625 \nL 47.609375 72.90625 \nL 47.609375 25.390625 \nL 58.015625 25.390625 \nL 58.015625 17.1875 \nL 47.609375 17.1875 \nL 47.609375 0 \nL 37.796875 0 \nL 37.796875 17.1875 \nL 4.890625 17.1875 \nL 4.890625 26.703125 \nz\n\" id=\"DejaVuSans-52\"/>\n       </defs>\n       <use xlink:href=\"#DejaVuSans-52\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_4\">\n     <g id=\"line2d_7\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 246.973465 350.30175 \nL 246.973465 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_8\"/>\n     <g id=\"text_4\">\n      <!-- 600 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(234.94834 365.475781)scale(0.126 -0.126)\">\n       <defs>\n        <path d=\"M 33.015625 40.375 \nQ 26.375 40.375 22.484375 35.828125 \nQ 18.609375 31.296875 18.609375 23.390625 \nQ 18.609375 15.53125 22.484375 10.953125 \nQ 26.375 6.390625 33.015625 6.390625 \nQ 39.65625 6.390625 43.53125 10.953125 \nQ 47.40625 15.53125 47.40625 23.390625 \nQ 47.40625 31.296875 43.53125 35.828125 \nQ 39.65625 40.375 33.015625 40.375 \nz\nM 52.59375 71.296875 \nL 52.59375 62.3125 \nQ 48.875 64.0625 45.09375 64.984375 \nQ 41.3125 65.921875 37.59375 65.921875 \nQ 27.828125 65.921875 22.671875 59.328125 \nQ 17.53125 52.734375 16.796875 39.40625 \nQ 19.671875 43.65625 24.015625 45.921875 \nQ 28.375 48.1875 33.59375 48.1875 \nQ 44.578125 48.1875 50.953125 41.515625 \nQ 57.328125 34.859375 57.328125 23.390625 \nQ 57.328125 12.15625 50.6875 5.359375 \nQ 44.046875 -1.421875 33.015625 -1.421875 \nQ 20.359375 -1.421875 13.671875 8.265625 \nQ 6.984375 17.96875 6.984375 36.375 \nQ 6.984375 53.65625 15.1875 63.9375 \nQ 23.390625 74.21875 37.203125 74.21875 \nQ 40.921875 74.21875 44.703125 73.484375 \nQ 48.484375 72.75 52.59375 71.296875 \nz\n\" id=\"DejaVuSans-54\"/>\n       </defs>\n       <use xlink:href=\"#DejaVuSans-54\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_5\">\n     <g id=\"line2d_9\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 314.666239 350.30175 \nL 314.666239 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_10\"/>\n     <g id=\"text_5\">\n      <!-- 800 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(302.641114 365.475781)scale(0.126 -0.126)\">\n       <defs>\n        <path d=\"M 31.78125 34.625 \nQ 24.75 34.625 20.71875 30.859375 \nQ 16.703125 27.09375 16.703125 20.515625 \nQ 16.703125 13.921875 20.71875 10.15625 \nQ 24.75 6.390625 31.78125 6.390625 \nQ 38.8125 6.390625 42.859375 10.171875 \nQ 46.921875 13.96875 46.921875 20.515625 \nQ 46.921875 27.09375 42.890625 30.859375 \nQ 38.875 34.625 31.78125 34.625 \nz\nM 21.921875 38.8125 \nQ 15.578125 40.375 12.03125 44.71875 \nQ 8.5 49.078125 8.5 55.328125 \nQ 8.5 64.0625 14.71875 69.140625 \nQ 20.953125 74.21875 31.78125 74.21875 \nQ 42.671875 74.21875 48.875 69.140625 \nQ 55.078125 64.0625 55.078125 55.328125 \nQ 55.078125 49.078125 51.53125 44.71875 \nQ 48 40.375 41.703125 38.8125 \nQ 48.828125 37.15625 52.796875 32.3125 \nQ 56.78125 27.484375 56.78125 20.515625 \nQ 56.78125 9.90625 50.3125 4.234375 \nQ 43.84375 -1.421875 31.78125 -1.421875 \nQ 19.734375 -1.421875 13.25 4.234375 \nQ 6.78125 9.90625 6.78125 20.515625 \nQ 6.78125 27.484375 10.78125 32.3125 \nQ 14.796875 37.15625 21.921875 38.8125 \nz\nM 18.3125 54.390625 \nQ 18.3125 48.734375 21.84375 45.5625 \nQ 25.390625 42.390625 31.78125 42.390625 \nQ 38.140625 42.390625 41.71875 45.5625 \nQ 45.3125 48.734375 45.3125 54.390625 \nQ 45.3125 60.0625 41.71875 63.234375 \nQ 38.140625 66.40625 31.78125 66.40625 \nQ 25.390625 66.40625 21.84375 63.234375 \nQ 18.3125 60.0625 18.3125 54.390625 \nz\n\" id=\"DejaVuSans-56\"/>\n       </defs>\n       <use xlink:href=\"#DejaVuSans-56\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_6\">\n     <g id=\"line2d_11\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 382.359014 350.30175 \nL 382.359014 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_12\"/>\n     <g id=\"text_6\">\n      <!-- 1000 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(366.325514 365.475781)scale(0.126 -0.126)\">\n       <defs>\n        <path d=\"M 12.40625 8.296875 \nL 28.515625 8.296875 \nL 28.515625 63.921875 \nL 10.984375 60.40625 \nL 10.984375 69.390625 \nL 28.421875 72.90625 \nL 38.28125 72.90625 \nL 38.28125 8.296875 \nL 54.390625 8.296875 \nL 54.390625 0 \nL 12.40625 0 \nz\n\" id=\"DejaVuSans-49\"/>\n       </defs>\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n   </g>\n   <g id=\"matplotlib.axis_2\">\n    <g id=\"ytick_1\">\n     <g id=\"line2d_13\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 28.8335 333.916846 \nL 434.651682 333.916846 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_14\"/>\n     <g id=\"text_7\">\n      <!-- 4 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(15.21675 338.703862)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-52\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_2\">\n     <g id=\"line2d_15\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 28.8335 274.484675 \nL 434.651682 274.484675 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_16\"/>\n     <g id=\"text_8\">\n      <!-- 6 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(15.21675 279.271691)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-54\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_3\">\n     <g id=\"line2d_17\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 28.8335 215.052504 \nL 434.651682 215.052504 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_18\"/>\n     <g id=\"text_9\">\n      <!-- 8 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(15.21675 219.83952)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-56\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_4\">\n     <g id=\"line2d_19\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 28.8335 155.620334 \nL 434.651682 155.620334 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_20\"/>\n     <g id=\"text_10\">\n      <!-- 10 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(7.2 160.407349)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_5\">\n     <g id=\"line2d_21\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 28.8335 96.188163 \nL 434.651682 96.188163 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_22\"/>\n     <g id=\"text_11\">\n      <!-- 12 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(7.2 100.975178)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-50\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_6\">\n     <g id=\"line2d_23\">\n      <path clip-path=\"url(#pfb86acef78)\" d=\"M 28.8335 36.755992 \nL 434.651682 36.755992 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_24\"/>\n     <g id=\"text_12\">\n      <!-- 14 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(7.2 41.543008)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-52\"/>\n      </g>\n     </g>\n    </g>\n   </g>\n   <g id=\"line2d_25\">\n    <path clip-path=\"url(#pfb86acef78)\" d=\"M 47.279781 38.967205 \nL 50.66442 40.486692 \nL 54.049058 43.385195 \nL 57.433697 47.433135 \nL 60.818336 52.362234 \nL 64.202975 57.928855 \nL 67.587613 63.944648 \nL 70.972252 70.274972 \nL 74.356891 76.815782 \nL 77.741529 83.467937 \nL 81.126168 90.121574 \nL 84.510807 96.678059 \nL 87.895446 103.075707 \nL 91.280084 109.323251 \nL 94.664723 115.513983 \nL 98.049362 121.804497 \nL 101.434 128.364204 \nL 104.818639 135.313562 \nL 108.203278 142.678686 \nL 111.587917 150.37938 \nL 114.972555 158.254413 \nL 118.357194 166.117258 \nL 121.741833 173.81446 \nL 125.126471 181.271023 \nL 128.51111 188.491134 \nL 131.895749 195.530349 \nL 135.280388 202.459479 \nL 138.665026 209.315573 \nL 142.049665 216.08308 \nL 145.434304 222.692461 \nL 148.818942 229.041778 \nL 152.203581 235.011404 \nL 155.58822 240.495957 \nL 158.972859 245.421438 \nL 162.357497 249.757086 \nL 165.742136 253.512938 \nL 169.126775 256.732706 \nL 172.511413 259.483696 \nL 175.896052 261.841041 \nL 179.280691 263.871619 \nL 182.66533 265.636098 \nL 186.049968 267.19901 \nL 189.434607 268.626778 \nL 192.819246 269.995469 \nL 196.203884 271.378032 \nL 199.588523 272.839979 \nL 202.973162 274.423348 \nL 206.357801 276.141566 \nL 209.742439 277.986589 \nL 213.127078 279.941449 \nL 216.511717 281.985579 \nL 219.896355 284.089727 \nL 223.280994 286.211681 \nL 226.665633 288.279858 \nL 230.050272 290.197526 \nL 233.43491 291.866762 \nL 236.819549 293.212414 \nL 240.204188 294.224213 \nL 243.588826 294.969226 \nL 246.973465 295.569485 \nL 250.358104 296.165609 \nL 253.742743 296.851954 \nL 257.127381 297.642958 \nL 260.51202 298.469494 \nL 263.896659 299.22575 \nL 267.281297 299.829037 \nL 270.665936 300.280036 \nL 274.050575 300.691025 \nL 277.435214 301.254444 \nL 280.819852 302.174228 \nL 284.204491 303.590765 \nL 287.58913 305.512859 \nL 290.973768 307.817285 \nL 294.358407 310.283073 \nL 297.743046 312.667999 \nL 301.127685 314.79525 \nL 304.512323 316.602305 \nL 307.896962 318.148341 \nL 311.281601 319.570008 \nL 314.666239 321.02188 \nL 318.050878 322.60557 \nL 321.435517 324.334971 \nL 324.820156 326.135574 \nL 328.204794 327.882088 \nL 331.589433 329.45162 \nL 334.974072 330.769405 \nL 338.35871 331.834894 \nL 341.743349 332.706146 \nL 345.127988 333.458122 \nL 348.512627 334.144366 \nL 351.897265 334.759603 \nL 355.281904 335.235952 \nL 358.666543 335.476295 \nL 362.051181 335.394996 \nL 365.43582 334.96223 \nL 368.820459 334.214224 \nL 372.205098 333.237512 \nL 375.589736 332.130986 \nL 378.974375 330.9657 \nL 382.359014 329.772269 \nL 385.743652 328.543268 \nL 389.128291 327.270813 \nL 392.51293 325.977283 \nL 395.897569 324.729719 \nL 399.282207 323.628146 \nL 402.666846 322.764367 \nL 406.051485 322.185268 \nL 409.436123 321.87053 \nL 412.820762 321.745629 \nL 416.205401 321.714286 \n\" style=\"fill:none;stroke:#3572c6;stroke-linecap:square;stroke-width:1.2;\"/>\n   </g>\n   <g id=\"line2d_26\"/>\n   <g id=\"patch_3\">\n    <path d=\"M 28.8335 350.30175 \nL 28.8335 24.14175 \n\" style=\"fill:none;stroke:#6a737d;stroke-linecap:square;stroke-linejoin:miter;stroke-width:1.12;\"/>\n   </g>\n   <g id=\"patch_4\">\n    <path d=\"M 434.651682 350.30175 \nL 434.651682 24.14175 \n\" style=\"fill:none;stroke:#6a737d;stroke-linecap:square;stroke-linejoin:miter;stroke-width:1.12;\"/>\n   </g>\n   <g id=\"patch_5\">\n    <path d=\"M 28.8335 350.30175 \nL 434.651682 350.30175 \n\" style=\"fill:none;stroke:#6a737d;stroke-linecap:square;stroke-linejoin:miter;stroke-width:1.12;\"/>\n   </g>\n   <g id=\"patch_6\">\n    <path d=\"M 28.8335 24.14175 \nL 434.651682 24.14175 \n\" style=\"fill:none;stroke:#6a737d;stroke-linecap:square;stroke-linejoin:miter;stroke-width:1.12;\"/>\n   </g>\n   <g id=\"text_13\">\n    <!-- value -->\n    <g style=\"fill:#3f3d46;\" transform=\"translate(212.075341 18.14175)scale(0.144 -0.144)\">\n     <defs>\n      <path d=\"M 2.984375 54.6875 \nL 12.5 54.6875 \nL 29.59375 8.796875 \nL 46.6875 54.6875 \nL 56.203125 54.6875 \nL 35.6875 0 \nL 23.484375 0 \nz\n\" id=\"DejaVuSans-118\"/>\n      <path d=\"M 34.28125 27.484375 \nQ 23.390625 27.484375 19.1875 25 \nQ 14.984375 22.515625 14.984375 16.5 \nQ 14.984375 11.71875 18.140625 8.90625 \nQ 21.296875 6.109375 26.703125 6.109375 \nQ 34.1875 6.109375 38.703125 11.40625 \nQ 43.21875 16.703125 43.21875 25.484375 \nL 43.21875 27.484375 \nz\nM 52.203125 31.203125 \nL 52.203125 0 \nL 43.21875 0 \nL 43.21875 8.296875 \nQ 40.140625 3.328125 35.546875 0.953125 \nQ 30.953125 -1.421875 24.3125 -1.421875 \nQ 15.921875 -1.421875 10.953125 3.296875 \nQ 6 8.015625 6 15.921875 \nQ 6 25.140625 12.171875 29.828125 \nQ 18.359375 34.515625 30.609375 34.515625 \nL 43.21875 34.515625 \nL 43.21875 35.40625 \nQ 43.21875 41.609375 39.140625 45 \nQ 35.0625 48.390625 27.6875 48.390625 \nQ 23 48.390625 18.546875 47.265625 \nQ 14.109375 46.140625 10.015625 43.890625 \nL 10.015625 52.203125 \nQ 14.9375 54.109375 19.578125 55.046875 \nQ 24.21875 56 28.609375 56 \nQ 40.484375 56 46.34375 49.84375 \nQ 52.203125 43.703125 52.203125 31.203125 \nz\n\" id=\"DejaVuSans-97\"/>\n      <path d=\"M 9.421875 75.984375 \nL 18.40625 75.984375 \nL 18.40625 0 \nL 9.421875 0 \nz\n\" id=\"DejaVuSans-108\"/>\n      <path d=\"M 8.5 21.578125 \nL 8.5 54.6875 \nL 17.484375 54.6875 \nL 17.484375 21.921875 \nQ 17.484375 14.15625 20.5 10.265625 \nQ 23.53125 6.390625 29.59375 6.390625 \nQ 36.859375 6.390625 41.078125 11.03125 \nQ 45.3125 15.671875 45.3125 23.6875 \nL 45.3125 54.6875 \nL 54.296875 54.6875 \nL 54.296875 0 \nL 45.3125 0 \nL 45.3125 8.40625 \nQ 42.046875 3.421875 37.71875 1 \nQ 33.40625 -1.421875 27.6875 -1.421875 \nQ 18.265625 -1.421875 13.375 4.4375 \nQ 8.5 10.296875 8.5 21.578125 \nz\nM 31.109375 56 \nz\n\" id=\"DejaVuSans-117\"/>\n      <path d=\"M 56.203125 29.59375 \nL 56.203125 25.203125 \nL 14.890625 25.203125 \nQ 15.484375 15.921875 20.484375 11.0625 \nQ 25.484375 6.203125 34.421875 6.203125 \nQ 39.59375 6.203125 44.453125 7.46875 \nQ 49.3125 8.734375 54.109375 11.28125 \nL 54.109375 2.78125 \nQ 49.265625 0.734375 44.1875 -0.34375 \nQ 39.109375 -1.421875 33.890625 -1.421875 \nQ 20.796875 -1.421875 13.15625 6.1875 \nQ 5.515625 13.8125 5.515625 26.8125 \nQ 5.515625 40.234375 12.765625 48.109375 \nQ 20.015625 56 32.328125 56 \nQ 43.359375 56 49.78125 48.890625 \nQ 56.203125 41.796875 56.203125 29.59375 \nz\nM 47.21875 32.234375 \nQ 47.125 39.59375 43.09375 43.984375 \nQ 39.0625 48.390625 32.421875 48.390625 \nQ 24.90625 48.390625 20.390625 44.140625 \nQ 15.875 39.890625 15.1875 32.171875 \nz\n\" id=\"DejaVuSans-101\"/>\n     </defs>\n     <use xlink:href=\"#DejaVuSans-118\"/>\n     <use x=\"59.179688\" xlink:href=\"#DejaVuSans-97\"/>\n     <use x=\"120.458984\" xlink:href=\"#DejaVuSans-108\"/>\n     <use x=\"148.242188\" xlink:href=\"#DejaVuSans-117\"/>\n     <use x=\"211.621094\" xlink:href=\"#DejaVuSans-101\"/>\n    </g>\n   </g>\n  </g>\n  <g id=\"axes_2\">\n   <g id=\"patch_7\">\n    <path d=\"M 515.815318 350.30175 \nL 921.6335 350.30175 \nL 921.6335 24.14175 \nL 515.815318 24.14175 \nz\n\" style=\"fill:#ffffff;\"/>\n   </g>\n   <g id=\"matplotlib.axis_3\">\n    <g id=\"xtick_7\">\n     <g id=\"line2d_27\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 530.87696 350.30175 \nL 530.87696 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_28\"/>\n     <g id=\"text_14\">\n      <!-- 0 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(526.868585 365.475781)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_8\">\n     <g id=\"line2d_29\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 598.569735 350.30175 \nL 598.569735 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_30\"/>\n     <g id=\"text_15\">\n      <!-- 200 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(586.54461 365.475781)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-50\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_9\">\n     <g id=\"line2d_31\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 666.262509 350.30175 \nL 666.262509 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_32\"/>\n     <g id=\"text_16\">\n      <!-- 400 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(654.237384 365.475781)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-52\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_10\">\n     <g id=\"line2d_33\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 733.955283 350.30175 \nL 733.955283 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_34\"/>\n     <g id=\"text_17\">\n      <!-- 600 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(721.930158 365.475781)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-54\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_11\">\n     <g id=\"line2d_35\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 801.648058 350.30175 \nL 801.648058 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_36\"/>\n     <g id=\"text_18\">\n      <!-- 800 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(789.622933 365.475781)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-56\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"xtick_12\">\n     <g id=\"line2d_37\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 869.340832 350.30175 \nL 869.340832 24.14175 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_38\"/>\n     <g id=\"text_19\">\n      <!-- 1000 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(853.307332 365.475781)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n   </g>\n   <g id=\"matplotlib.axis_4\">\n    <g id=\"ytick_7\">\n     <g id=\"line2d_39\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 515.815318 334.53407 \nL 921.6335 334.53407 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_40\"/>\n     <g id=\"text_20\">\n      <!-- 0 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(502.198568 339.321086)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_8\">\n     <g id=\"line2d_41\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 515.815318 265.36914 \nL 921.6335 265.36914 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_42\"/>\n     <g id=\"text_21\">\n      <!-- 5000 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(478.148318 270.156156)scale(0.126 -0.126)\">\n       <defs>\n        <path d=\"M 10.796875 72.90625 \nL 49.515625 72.90625 \nL 49.515625 64.59375 \nL 19.828125 64.59375 \nL 19.828125 46.734375 \nQ 21.96875 47.46875 24.109375 47.828125 \nQ 26.265625 48.1875 28.421875 48.1875 \nQ 40.625 48.1875 47.75 41.5 \nQ 54.890625 34.8125 54.890625 23.390625 \nQ 54.890625 11.625 47.5625 5.09375 \nQ 40.234375 -1.421875 26.90625 -1.421875 \nQ 22.3125 -1.421875 17.546875 -0.640625 \nQ 12.796875 0.140625 7.71875 1.703125 \nL 7.71875 11.625 \nQ 12.109375 9.234375 16.796875 8.0625 \nQ 21.484375 6.890625 26.703125 6.890625 \nQ 35.15625 6.890625 40.078125 11.328125 \nQ 45.015625 15.765625 45.015625 23.390625 \nQ 45.015625 31 40.078125 35.4375 \nQ 35.15625 39.890625 26.703125 39.890625 \nQ 22.75 39.890625 18.8125 39.015625 \nQ 14.890625 38.140625 10.796875 36.28125 \nz\n\" id=\"DejaVuSans-53\"/>\n       </defs>\n       <use xlink:href=\"#DejaVuSans-53\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_9\">\n     <g id=\"line2d_43\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 515.815318 196.20421 \nL 921.6335 196.20421 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_44\"/>\n     <g id=\"text_22\">\n      <!-- 10000 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(470.131568 200.991226)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"254.492188\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_10\">\n     <g id=\"line2d_45\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 515.815318 127.03928 \nL 921.6335 127.03928 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_46\"/>\n     <g id=\"text_23\">\n      <!-- 15000 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(470.131568 131.826296)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-49\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-53\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"254.492188\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n    <g id=\"ytick_11\">\n     <g id=\"line2d_47\">\n      <path clip-path=\"url(#p93db88a168)\" d=\"M 515.815318 57.87435 \nL 921.6335 57.87435 \n\" style=\"fill:none;stroke:#d0d0d0;stroke-linecap:square;stroke-width:1.12;\"/>\n     </g>\n     <g id=\"line2d_48\"/>\n     <g id=\"text_24\">\n      <!-- 20000 -->\n      <g style=\"fill:#3f3d46;\" transform=\"translate(470.131568 62.661366)scale(0.126 -0.126)\">\n       <use xlink:href=\"#DejaVuSans-50\"/>\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n       <use x=\"254.492188\" xlink:href=\"#DejaVuSans-48\"/>\n      </g>\n     </g>\n    </g>\n   </g>\n   <g id=\"line2d_49\">\n    <path clip-path=\"url(#p93db88a168)\" d=\"M 534.261599 38.967205 \nL 537.646238 56.577405 \nL 541.030877 88.708144 \nL 544.415515 130.065825 \nL 547.800154 174.576458 \nL 551.184793 216.820878 \nL 554.569431 253.027951 \nL 557.95407 281.41167 \nL 561.338709 301.921313 \nL 564.723348 315.653327 \nL 568.107986 324.207919 \nL 571.492625 329.186289 \nL 574.877264 331.906505 \nL 578.261902 333.312741 \nL 581.646541 334.0092 \nL 585.03118 334.345827 \nL 588.415819 334.526655 \nL 591.800457 334.614379 \nL 595.185096 334.644265 \nL 598.569735 334.6735 \nL 601.954373 334.709478 \nL 605.339012 334.757849 \nL 608.723651 334.818777 \nL 612.10829 334.885238 \nL 615.492928 334.943918 \nL 618.877567 334.978601 \nL 622.262206 334.975237 \nL 625.646844 334.926695 \nL 629.031483 334.835451 \nL 632.416122 334.712958 \nL 635.800761 334.576551 \nL 639.185399 334.445835 \nL 642.570038 334.33718 \nL 645.954677 334.262119 \nL 649.339315 334.225845 \nL 652.723954 334.228241 \nL 656.108593 334.265098 \nL 659.493232 334.329898 \nL 662.87787 334.414829 \nL 666.262509 334.511289 \nL 669.647148 334.609654 \nL 673.031786 334.700271 \nL 676.416425 334.773849 \nL 679.801064 334.823242 \nL 683.185703 334.846479 \nL 686.570341 334.847199 \nL 689.95498 334.835365 \nL 693.339619 334.824173 \nL 696.724257 334.82664 \nL 700.108896 334.850744 \nL 703.493535 334.897132 \nL 706.878174 334.958628 \nL 710.262812 335.022261 \nL 713.647451 335.072842 \nL 717.03209 335.097767 \nL 720.416728 335.089565 \nL 723.801367 335.047882 \nL 727.186006 334.978539 \nL 730.570645 334.892712 \nL 733.955283 334.804406 \nL 737.339922 334.728368 \nL 740.724561 334.677065 \nL 744.109199 334.659842 \nL 747.493838 334.680755 \nL 750.878477 334.738056 \nL 754.263116 334.824264 \nL 757.647754 334.92631 \nL 761.032393 335.026952 \nL 764.417032 335.106783 \nL 767.80167 335.147028 \nL 771.186309 335.132671 \nL 774.570948 335.055872 \nL 777.955587 334.91855 \nL 781.340225 334.733564 \nL 784.724864 334.523312 \nL 788.109503 334.317479 \nL 791.494141 334.148245 \nL 794.87878 334.045186 \nL 798.263419 334.030129 \nL 801.648058 334.112487 \nL 805.032696 334.286286 \nL 808.417335 334.529071 \nL 811.801974 334.805795 \nL 815.186612 335.073945 \nL 818.571251 335.292786 \nL 821.95589 335.431981 \nL 825.340529 335.476295 \nL 828.725167 335.426339 \nL 832.109806 335.295819 \nL 835.494445 335.105208 \nL 838.879083 334.876299 \nL 842.263722 334.628157 \nL 845.648361 334.376556 \nL 849.033 334.133975 \nL 852.417638 333.911199 \nL 855.802277 333.717118 \nL 859.186916 333.558655 \nL 862.571554 333.440171 \nL 865.956193 333.363245 \nL 869.340832 333.326335 \nL 872.725471 333.325788 \nL 876.110109 333.356126 \nL 879.494748 333.411067 \nL 882.879387 333.483661 \nL 886.264025 333.567341 \nL 889.648664 333.654777 \nL 893.033303 333.738253 \nL 896.417942 333.810207 \nL 899.80258 333.863112 \nL 903.187219 333.891157 \n\" style=\"fill:none;stroke:#3572c6;stroke-linecap:square;stroke-width:1.2;\"/>\n   </g>\n   <g id=\"line2d_50\"/>\n   <g id=\"patch_8\">\n    <path d=\"M 515.815318 350.30175 \nL 515.815318 24.14175 \n\" style=\"fill:none;stroke:#6a737d;stroke-linecap:square;stroke-linejoin:miter;stroke-width:1.12;\"/>\n   </g>\n   <g id=\"patch_9\">\n    <path d=\"M 921.6335 350.30175 \nL 921.6335 24.14175 \n\" style=\"fill:none;stroke:#6a737d;stroke-linecap:square;stroke-linejoin:miter;stroke-width:1.12;\"/>\n   </g>\n   <g id=\"patch_10\">\n    <path d=\"M 515.815318 350.30175 \nL 921.6335 350.30175 \n\" style=\"fill:none;stroke:#6a737d;stroke-linecap:square;stroke-linejoin:miter;stroke-width:1.12;\"/>\n   </g>\n   <g id=\"patch_11\">\n    <path d=\"M 515.815318 24.14175 \nL 921.6335 24.14175 \n\" style=\"fill:none;stroke:#6a737d;stroke-linecap:square;stroke-linejoin:miter;stroke-width:1.12;\"/>\n   </g>\n   <g id=\"text_25\">\n    <!-- policy -->\n    <g style=\"fill:#3f3d46;\" transform=\"translate(697.527159 18.14175)scale(0.144 -0.144)\">\n     <defs>\n      <path d=\"M 18.109375 8.203125 \nL 18.109375 -20.796875 \nL 9.078125 -20.796875 \nL 9.078125 54.6875 \nL 18.109375 54.6875 \nL 18.109375 46.390625 \nQ 20.953125 51.265625 25.265625 53.625 \nQ 29.59375 56 35.59375 56 \nQ 45.5625 56 51.78125 48.09375 \nQ 58.015625 40.1875 58.015625 27.296875 \nQ 58.015625 14.40625 51.78125 6.484375 \nQ 45.5625 -1.421875 35.59375 -1.421875 \nQ 29.59375 -1.421875 25.265625 0.953125 \nQ 20.953125 3.328125 18.109375 8.203125 \nz\nM 48.6875 27.296875 \nQ 48.6875 37.203125 44.609375 42.84375 \nQ 40.53125 48.484375 33.40625 48.484375 \nQ 26.265625 48.484375 22.1875 42.84375 \nQ 18.109375 37.203125 18.109375 27.296875 \nQ 18.109375 17.390625 22.1875 11.75 \nQ 26.265625 6.109375 33.40625 6.109375 \nQ 40.53125 6.109375 44.609375 11.75 \nQ 48.6875 17.390625 48.6875 27.296875 \nz\n\" id=\"DejaVuSans-112\"/>\n      <path d=\"M 30.609375 48.390625 \nQ 23.390625 48.390625 19.1875 42.75 \nQ 14.984375 37.109375 14.984375 27.296875 \nQ 14.984375 17.484375 19.15625 11.84375 \nQ 23.34375 6.203125 30.609375 6.203125 \nQ 37.796875 6.203125 41.984375 11.859375 \nQ 46.1875 17.53125 46.1875 27.296875 \nQ 46.1875 37.015625 41.984375 42.703125 \nQ 37.796875 48.390625 30.609375 48.390625 \nz\nM 30.609375 56 \nQ 42.328125 56 49.015625 48.375 \nQ 55.71875 40.765625 55.71875 27.296875 \nQ 55.71875 13.875 49.015625 6.21875 \nQ 42.328125 -1.421875 30.609375 -1.421875 \nQ 18.84375 -1.421875 12.171875 6.21875 \nQ 5.515625 13.875 5.515625 27.296875 \nQ 5.515625 40.765625 12.171875 48.375 \nQ 18.84375 56 30.609375 56 \nz\n\" id=\"DejaVuSans-111\"/>\n      <path d=\"M 9.421875 54.6875 \nL 18.40625 54.6875 \nL 18.40625 0 \nL 9.421875 0 \nz\nM 9.421875 75.984375 \nL 18.40625 75.984375 \nL 18.40625 64.59375 \nL 9.421875 64.59375 \nz\n\" id=\"DejaVuSans-105\"/>\n      <path d=\"M 48.78125 52.59375 \nL 48.78125 44.1875 \nQ 44.96875 46.296875 41.140625 47.34375 \nQ 37.3125 48.390625 33.40625 48.390625 \nQ 24.65625 48.390625 19.8125 42.84375 \nQ 14.984375 37.3125 14.984375 27.296875 \nQ 14.984375 17.28125 19.8125 11.734375 \nQ 24.65625 6.203125 33.40625 6.203125 \nQ 37.3125 6.203125 41.140625 7.25 \nQ 44.96875 8.296875 48.78125 10.40625 \nL 48.78125 2.09375 \nQ 45.015625 0.34375 40.984375 -0.53125 \nQ 36.96875 -1.421875 32.421875 -1.421875 \nQ 20.0625 -1.421875 12.78125 6.34375 \nQ 5.515625 14.109375 5.515625 27.296875 \nQ 5.515625 40.671875 12.859375 48.328125 \nQ 20.21875 56 33.015625 56 \nQ 37.15625 56 41.109375 55.140625 \nQ 45.0625 54.296875 48.78125 52.59375 \nz\n\" id=\"DejaVuSans-99\"/>\n      <path d=\"M 32.171875 -5.078125 \nQ 28.375 -14.84375 24.75 -17.8125 \nQ 21.140625 -20.796875 15.09375 -20.796875 \nL 7.90625 -20.796875 \nL 7.90625 -13.28125 \nL 13.1875 -13.28125 \nQ 16.890625 -13.28125 18.9375 -11.515625 \nQ 21 -9.765625 23.484375 -3.21875 \nL 25.09375 0.875 \nL 2.984375 54.6875 \nL 12.5 54.6875 \nL 29.59375 11.921875 \nL 46.6875 54.6875 \nL 56.203125 54.6875 \nz\n\" id=\"DejaVuSans-121\"/>\n     </defs>\n     <use xlink:href=\"#DejaVuSans-112\"/>\n     <use x=\"63.476562\" xlink:href=\"#DejaVuSans-111\"/>\n     <use x=\"124.658203\" xlink:href=\"#DejaVuSans-108\"/>\n     <use x=\"152.441406\" xlink:href=\"#DejaVuSans-105\"/>\n     <use x=\"180.224609\" xlink:href=\"#DejaVuSans-99\"/>\n     <use x=\"235.205078\" xlink:href=\"#DejaVuSans-121\"/>\n    </g>\n   </g>\n   <g id=\"legend_1\">\n    <g id=\"patch_12\">\n     <path d=\"M 843.167 71.210625 \nL 912.8135 71.210625 \nQ 915.3335 71.210625 915.3335 68.690625 \nL 915.3335 32.96175 \nQ 915.3335 30.44175 912.8135 30.44175 \nL 843.167 30.44175 \nQ 840.647 30.44175 840.647 32.96175 \nL 840.647 68.690625 \nQ 840.647 71.210625 843.167 71.210625 \nz\n\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;stroke-width:0.16;\"/>\n    </g>\n    <g id=\"line2d_51\">\n     <path d=\"M 845.687 40.645781 \nL 870.887 40.645781 \n\" style=\"fill:none;stroke:#3572c6;stroke-linecap:square;stroke-width:1.2;\"/>\n    </g>\n    <g id=\"line2d_52\"/>\n    <g id=\"text_26\">\n     <!-- train -->\n     <g style=\"fill:#3f3d46;\" transform=\"translate(880.967 45.055781)scale(0.126 -0.126)\">\n      <defs>\n       <path d=\"M 18.3125 70.21875 \nL 18.3125 54.6875 \nL 36.8125 54.6875 \nL 36.8125 47.703125 \nL 18.3125 47.703125 \nL 18.3125 18.015625 \nQ 18.3125 11.328125 20.140625 9.421875 \nQ 21.96875 7.515625 27.59375 7.515625 \nL 36.8125 7.515625 \nL 36.8125 0 \nL 27.59375 0 \nQ 17.1875 0 13.234375 3.875 \nQ 9.28125 7.765625 9.28125 18.015625 \nL 9.28125 47.703125 \nL 2.6875 47.703125 \nL 2.6875 54.6875 \nL 9.28125 54.6875 \nL 9.28125 70.21875 \nz\n\" id=\"DejaVuSans-116\"/>\n       <path d=\"M 41.109375 46.296875 \nQ 39.59375 47.171875 37.8125 47.578125 \nQ 36.03125 48 33.890625 48 \nQ 26.265625 48 22.1875 43.046875 \nQ 18.109375 38.09375 18.109375 28.8125 \nL 18.109375 0 \nL 9.078125 0 \nL 9.078125 54.6875 \nL 18.109375 54.6875 \nL 18.109375 46.1875 \nQ 20.953125 51.171875 25.484375 53.578125 \nQ 30.03125 56 36.53125 56 \nQ 37.453125 56 38.578125 55.875 \nQ 39.703125 55.765625 41.0625 55.515625 \nz\n\" id=\"DejaVuSans-114\"/>\n       <path d=\"M 54.890625 33.015625 \nL 54.890625 0 \nL 45.90625 0 \nL 45.90625 32.71875 \nQ 45.90625 40.484375 42.875 44.328125 \nQ 39.84375 48.1875 33.796875 48.1875 \nQ 26.515625 48.1875 22.3125 43.546875 \nQ 18.109375 38.921875 18.109375 30.90625 \nL 18.109375 0 \nL 9.078125 0 \nL 9.078125 54.6875 \nL 18.109375 54.6875 \nL 18.109375 46.1875 \nQ 21.34375 51.125 25.703125 53.5625 \nQ 30.078125 56 35.796875 56 \nQ 45.21875 56 50.046875 50.171875 \nQ 54.890625 44.34375 54.890625 33.015625 \nz\n\" id=\"DejaVuSans-110\"/>\n      </defs>\n      <use xlink:href=\"#DejaVuSans-116\"/>\n      <use x=\"39.208984\" xlink:href=\"#DejaVuSans-114\"/>\n      <use x=\"80.322266\" xlink:href=\"#DejaVuSans-97\"/>\n      <use x=\"141.601562\" xlink:href=\"#DejaVuSans-105\"/>\n      <use x=\"169.384766\" xlink:href=\"#DejaVuSans-110\"/>\n     </g>\n    </g>\n    <g id=\"line2d_53\">\n     <path d=\"M 845.687 59.140219 \nL 870.887 59.140219 \n\" style=\"fill:none;stroke:#c44e52;stroke-dasharray:7.68,1.92,1.2,1.92;stroke-dashoffset:0;stroke-width:1.2;\"/>\n    </g>\n    <g id=\"line2d_54\"/>\n    <g id=\"text_27\">\n     <!-- test -->\n     <g style=\"fill:#3f3d46;\" transform=\"translate(880.967 63.550219)scale(0.126 -0.126)\">\n      <defs>\n       <path d=\"M 44.28125 53.078125 \nL 44.28125 44.578125 \nQ 40.484375 46.53125 36.375 47.5 \nQ 32.28125 48.484375 27.875 48.484375 \nQ 21.1875 48.484375 17.84375 46.4375 \nQ 14.5 44.390625 14.5 40.28125 \nQ 14.5 37.15625 16.890625 35.375 \nQ 19.28125 33.59375 26.515625 31.984375 \nL 29.59375 31.296875 \nQ 39.15625 29.25 43.1875 25.515625 \nQ 47.21875 21.78125 47.21875 15.09375 \nQ 47.21875 7.46875 41.1875 3.015625 \nQ 35.15625 -1.421875 24.609375 -1.421875 \nQ 20.21875 -1.421875 15.453125 -0.5625 \nQ 10.6875 0.296875 5.421875 2 \nL 5.421875 11.28125 \nQ 10.40625 8.6875 15.234375 7.390625 \nQ 20.0625 6.109375 24.8125 6.109375 \nQ 31.15625 6.109375 34.5625 8.28125 \nQ 37.984375 10.453125 37.984375 14.40625 \nQ 37.984375 18.0625 35.515625 20.015625 \nQ 33.0625 21.96875 24.703125 23.78125 \nL 21.578125 24.515625 \nQ 13.234375 26.265625 9.515625 29.90625 \nQ 5.8125 33.546875 5.8125 39.890625 \nQ 5.8125 47.609375 11.28125 51.796875 \nQ 16.75 56 26.8125 56 \nQ 31.78125 56 36.171875 55.265625 \nQ 40.578125 54.546875 44.28125 53.078125 \nz\n\" id=\"DejaVuSans-115\"/>\n      </defs>\n      <use xlink:href=\"#DejaVuSans-116\"/>\n      <use x=\"39.208984\" xlink:href=\"#DejaVuSans-101\"/>\n      <use x=\"100.732422\" xlink:href=\"#DejaVuSans-115\"/>\n      <use x=\"152.832031\" xlink:href=\"#DejaVuSans-116\"/>\n     </g>\n    </g>\n   </g>\n  </g>\n </g>\n <defs>\n  <clipPath id=\"pfb86acef78\">\n   <rect height=\"326.16\" width=\"405.818182\" x=\"28.8335\" y=\"24.14175\"/>\n  </clipPath>\n  <clipPath id=\"p93db88a168\">\n   <rect height=\"326.16\" width=\"405.818182\" x=\"515.815318\" y=\"24.14175\"/>\n  </clipPath>\n </defs>\n</svg>\n",
      "image/png": "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\n"
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stderr",
     "text": "8%|▊         | 1115/13156 [01:57<21:09,  9.48it/s]\n"
    },
    {
     "output_type": "error",
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-13-f6f7cdd9927a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mepoch\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn_epochs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0mbatch\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_dataloader\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m         \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreinforce\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      5\u001b[0m         \u001b[0mreinforce\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Documents/programming/python/RecNN/recnn/nn/algo.py\u001b[0m in \u001b[0;36mupdate\u001b[0;34m(self, batch, learn)\u001b[0m\n\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlearn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m         return self.algorithm(batch, self.params, self.nets, self.optimizers,\n\u001b[0m\u001b[1;32m     50\u001b[0m                               \u001b[0mdevice\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwriter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwriter\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     51\u001b[0m                               learn=learn, step=self._step)\n",
      "\u001b[0;32m~/Documents/programming/python/RecNN/recnn/nn/update/reinforce.py\u001b[0m in \u001b[0;36mreinforce_update\u001b[0;34m(batch, params, nets, optimizer, device, debug, writer, learn, step)\u001b[0m\n\u001b[1;32m     82\u001b[0m     \u001b[0mnets\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'policy_net'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrewards\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreward\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     83\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 84\u001b[0;31m     value_loss = value_update(batch, params, nets, optimizer,\n\u001b[0m\u001b[1;32m     85\u001b[0m                               \u001b[0mwriter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwriter\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdevice\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     86\u001b[0m                               debug=debug, learn=True, step=step)\n",
      "\u001b[0;32m~/Documents/programming/python/RecNN/recnn/nn/update/misc.py\u001b[0m in \u001b[0;36mvalue_update\u001b[0;34m(batch, params, nets, optimizer, device, debug, writer, learn, step)\u001b[0m\n\u001b[1;32m     17\u001b[0m     \"\"\"\n\u001b[1;32m     18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m     \u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreward\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnext_state\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdone\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_base_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdevice\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     20\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     21\u001b[0m     \u001b[0;32mwith\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mno_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Documents/programming/python/RecNN/recnn/data/utils.py\u001b[0m in \u001b[0;36mget_base_batch\u001b[0;34m(batch, device, done)\u001b[0m\n\u001b[1;32m    219\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    220\u001b[0m         \u001b[0mbatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'reward'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 221\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    222\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    223\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Documents/programming/python/RecNN/recnn/data/utils.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    219\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    220\u001b[0m         \u001b[0mbatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'reward'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 221\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    222\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    223\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "from tqdm.auto import tqdm\n",
    "for epoch in range(n_epochs):\n",
    "    for batch in tqdm(env.train_dataloader):\n",
    "        loss = reinforce.update(batch)\n",
    "        reinforce.step()\n",
    "        if loss:\n",
    "            plotter.log_losses(loss)\n",
    "        if reinforce._step % plot_every == 0:\n",
    "            clear_output(True)\n",
    "            print('step', reinforce._step)\n",
    "            plotter.plot_loss()\n",
    "        if reinforce._step > 1000:\n",
    "            pass\n",
    "            # assert False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.8.5-final"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}