{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "\n",
       "(function(root) {\n",
       "  function now() {\n",
       "    return new Date();\n",
       "  }\n",
       "\n",
       "  var force = true;\n",
       "\n",
       "  if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
       "    root._bokeh_onload_callbacks = [];\n",
       "    root._bokeh_is_loading = undefined;\n",
       "  }\n",
       "\n",
       "  var JS_MIME_TYPE = 'application/javascript';\n",
       "  var HTML_MIME_TYPE = 'text/html';\n",
       "  var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
       "  var CLASS_NAME = 'output_bokeh rendered_html';\n",
       "\n",
       "  /**\n",
       "   * Render data to the DOM node\n",
       "   */\n",
       "  function render(props, node) {\n",
       "    var script = document.createElement(\"script\");\n",
       "    node.appendChild(script);\n",
       "  }\n",
       "\n",
       "  /**\n",
       "   * Handle when an output is cleared or removed\n",
       "   */\n",
       "  function handleClearOutput(event, handle) {\n",
       "    var cell = handle.cell;\n",
       "\n",
       "    var id = cell.output_area._bokeh_element_id;\n",
       "    var server_id = cell.output_area._bokeh_server_id;\n",
       "    // Clean up Bokeh references\n",
       "    if (id != null && id in Bokeh.index) {\n",
       "      Bokeh.index[id].model.document.clear();\n",
       "      delete Bokeh.index[id];\n",
       "    }\n",
       "\n",
       "    if (server_id !== undefined) {\n",
       "      // Clean up Bokeh references\n",
       "      var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
       "      cell.notebook.kernel.execute(cmd, {\n",
       "        iopub: {\n",
       "          output: function(msg) {\n",
       "            var id = msg.content.text.trim();\n",
       "            if (id in Bokeh.index) {\n",
       "              Bokeh.index[id].model.document.clear();\n",
       "              delete Bokeh.index[id];\n",
       "            }\n",
       "          }\n",
       "        }\n",
       "      });\n",
       "      // Destroy server and session\n",
       "      var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
       "      cell.notebook.kernel.execute(cmd);\n",
       "    }\n",
       "  }\n",
       "\n",
       "  /**\n",
       "   * Handle when a new output is added\n",
       "   */\n",
       "  function handleAddOutput(event, handle) {\n",
       "    var output_area = handle.output_area;\n",
       "    var output = handle.output;\n",
       "\n",
       "    // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
       "    if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
       "      return\n",
       "    }\n",
       "\n",
       "    var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
       "\n",
       "    if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
       "      toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
       "      // store reference to embed id on output_area\n",
       "      output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
       "    }\n",
       "    if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
       "      var bk_div = document.createElement(\"div\");\n",
       "      bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
       "      var script_attrs = bk_div.children[0].attributes;\n",
       "      for (var i = 0; i < script_attrs.length; i++) {\n",
       "        toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
       "      }\n",
       "      // store reference to server id on output_area\n",
       "      output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
       "    }\n",
       "  }\n",
       "\n",
       "  function register_renderer(events, OutputArea) {\n",
       "\n",
       "    function append_mime(data, metadata, element) {\n",
       "      // create a DOM node to render to\n",
       "      var toinsert = this.create_output_subarea(\n",
       "        metadata,\n",
       "        CLASS_NAME,\n",
       "        EXEC_MIME_TYPE\n",
       "      );\n",
       "      this.keyboard_manager.register_events(toinsert);\n",
       "      // Render to node\n",
       "      var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
       "      render(props, toinsert[toinsert.length - 1]);\n",
       "      element.append(toinsert);\n",
       "      return toinsert\n",
       "    }\n",
       "\n",
       "    /* Handle when an output is cleared or removed */\n",
       "    events.on('clear_output.CodeCell', handleClearOutput);\n",
       "    events.on('delete.Cell', handleClearOutput);\n",
       "\n",
       "    /* Handle when a new output is added */\n",
       "    events.on('output_added.OutputArea', handleAddOutput);\n",
       "\n",
       "    /**\n",
       "     * Register the mime type and append_mime function with output_area\n",
       "     */\n",
       "    OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
       "      /* Is output safe? */\n",
       "      safe: true,\n",
       "      /* Index of renderer in `output_area.display_order` */\n",
       "      index: 0\n",
       "    });\n",
       "  }\n",
       "\n",
       "  // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
       "  if (root.Jupyter !== undefined) {\n",
       "    var events = require('base/js/events');\n",
       "    var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
       "\n",
       "    if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
       "      register_renderer(events, OutputArea);\n",
       "    }\n",
       "  }\n",
       "\n",
       "  \n",
       "  if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
       "    root._bokeh_timeout = Date.now() + 5000;\n",
       "    root._bokeh_failed_load = false;\n",
       "  }\n",
       "\n",
       "  var NB_LOAD_WARNING = {'data': {'text/html':\n",
       "     \"<div style='background-color: #fdd'>\\n\"+\n",
       "     \"<p>\\n\"+\n",
       "     \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
       "     \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
       "     \"</p>\\n\"+\n",
       "     \"<ul>\\n\"+\n",
       "     \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
       "     \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
       "     \"</ul>\\n\"+\n",
       "     \"<code>\\n\"+\n",
       "     \"from bokeh.resources import INLINE\\n\"+\n",
       "     \"output_notebook(resources=INLINE)\\n\"+\n",
       "     \"</code>\\n\"+\n",
       "     \"</div>\"}};\n",
       "\n",
       "  function display_loaded() {\n",
       "    var el = document.getElementById(null);\n",
       "    if (el != null) {\n",
       "      el.textContent = \"BokehJS is loading...\";\n",
       "    }\n",
       "    if (root.Bokeh !== undefined) {\n",
       "      if (el != null) {\n",
       "        el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
       "      }\n",
       "    } else if (Date.now() < root._bokeh_timeout) {\n",
       "      setTimeout(display_loaded, 100)\n",
       "    }\n",
       "  }\n",
       "\n",
       "\n",
       "  function run_callbacks() {\n",
       "    try {\n",
       "      root._bokeh_onload_callbacks.forEach(function(callback) {\n",
       "        if (callback != null)\n",
       "          callback();\n",
       "      });\n",
       "    } finally {\n",
       "      delete root._bokeh_onload_callbacks\n",
       "    }\n",
       "    console.debug(\"Bokeh: all callbacks have finished\");\n",
       "  }\n",
       "\n",
       "  function load_libs(css_urls, js_urls, callback) {\n",
       "    if (css_urls == null) css_urls = [];\n",
       "    if (js_urls == null) js_urls = [];\n",
       "\n",
       "    root._bokeh_onload_callbacks.push(callback);\n",
       "    if (root._bokeh_is_loading > 0) {\n",
       "      console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
       "      return null;\n",
       "    }\n",
       "    if (js_urls == null || js_urls.length === 0) {\n",
       "      run_callbacks();\n",
       "      return null;\n",
       "    }\n",
       "    console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
       "    root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
       "\n",
       "    function on_load() {\n",
       "      root._bokeh_is_loading--;\n",
       "      if (root._bokeh_is_loading === 0) {\n",
       "        console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
       "        run_callbacks()\n",
       "      }\n",
       "    }\n",
       "\n",
       "    function on_error() {\n",
       "      console.error(\"failed to load \" + url);\n",
       "    }\n",
       "\n",
       "    for (var i = 0; i < css_urls.length; i++) {\n",
       "      var url = css_urls[i];\n",
       "      const element = document.createElement(\"link\");\n",
       "      element.onload = on_load;\n",
       "      element.onerror = on_error;\n",
       "      element.rel = \"stylesheet\";\n",
       "      element.type = \"text/css\";\n",
       "      element.href = url;\n",
       "      console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
       "      document.body.appendChild(element);\n",
       "    }\n",
       "\n",
       "    for (var i = 0; i < js_urls.length; i++) {\n",
       "      var url = js_urls[i];\n",
       "      var element = document.createElement('script');\n",
       "      element.onload = on_load;\n",
       "      element.onerror = on_error;\n",
       "      element.async = false;\n",
       "      element.src = url;\n",
       "      console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
       "      document.head.appendChild(element);\n",
       "    }\n",
       "  };\n",
       "\n",
       "  function inject_raw_css(css) {\n",
       "    const element = document.createElement(\"style\");\n",
       "    element.appendChild(document.createTextNode(css));\n",
       "    document.body.appendChild(element);\n",
       "  }\n",
       "\n",
       "  var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.1.0.min.js\"];\n",
       "  var css_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.1.0.min.css\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.1.0.min.css\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.1.0.min.css\"];\n",
       "\n",
       "  var inline_js = [\n",
       "    function(Bokeh) {\n",
       "      Bokeh.set_log_level(\"info\");\n",
       "    },\n",
       "    \n",
       "    function(Bokeh) {\n",
       "      \n",
       "    },\n",
       "    function(Bokeh) {} // ensure no trailing comma for IE\n",
       "  ];\n",
       "\n",
       "  function run_inline_js() {\n",
       "    \n",
       "    if ((root.Bokeh !== undefined) || (force === true)) {\n",
       "      for (var i = 0; i < inline_js.length; i++) {\n",
       "        inline_js[i].call(root, root.Bokeh);\n",
       "      }} else if (Date.now() < root._bokeh_timeout) {\n",
       "      setTimeout(run_inline_js, 100);\n",
       "    } else if (!root._bokeh_failed_load) {\n",
       "      console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
       "      root._bokeh_failed_load = true;\n",
       "    } else if (force !== true) {\n",
       "      var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n",
       "      cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
       "    }\n",
       "\n",
       "  }\n",
       "\n",
       "  if (root._bokeh_is_loading === 0) {\n",
       "    console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
       "    run_inline_js();\n",
       "  } else {\n",
       "    load_libs(css_urls, js_urls, function() {\n",
       "      console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
       "      run_inline_js();\n",
       "    });\n",
       "  }\n",
       "}(window));"
      ],
      "application/vnd.holoviews_load.v0+json": "\n(function(root) {\n  function now() {\n    return new Date();\n  }\n\n  var force = true;\n\n  if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n    root._bokeh_onload_callbacks = [];\n    root._bokeh_is_loading = undefined;\n  }\n\n  \n\n  \n  if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n    root._bokeh_timeout = Date.now() + 5000;\n    root._bokeh_failed_load = false;\n  }\n\n  var NB_LOAD_WARNING = {'data': {'text/html':\n     \"<div style='background-color: #fdd'>\\n\"+\n     \"<p>\\n\"+\n     \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n     \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n     \"</p>\\n\"+\n     \"<ul>\\n\"+\n     \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n     \"<li>use INLINE resources instead, as so:</li>\\n\"+\n     \"</ul>\\n\"+\n     \"<code>\\n\"+\n     \"from bokeh.resources import INLINE\\n\"+\n     \"output_notebook(resources=INLINE)\\n\"+\n     \"</code>\\n\"+\n     \"</div>\"}};\n\n  function display_loaded() {\n    var el = document.getElementById(null);\n    if (el != null) {\n      el.textContent = \"BokehJS is loading...\";\n    }\n    if (root.Bokeh !== undefined) {\n      if (el != null) {\n        el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n      }\n    } else if (Date.now() < root._bokeh_timeout) {\n      setTimeout(display_loaded, 100)\n    }\n  }\n\n\n  function run_callbacks() {\n    try {\n      root._bokeh_onload_callbacks.forEach(function(callback) {\n        if (callback != null)\n          callback();\n      });\n    } finally {\n      delete root._bokeh_onload_callbacks\n    }\n    console.debug(\"Bokeh: all callbacks have finished\");\n  }\n\n  function load_libs(css_urls, js_urls, callback) {\n    if (css_urls == null) css_urls = [];\n    if (js_urls == null) js_urls = [];\n\n    root._bokeh_onload_callbacks.push(callback);\n    if (root._bokeh_is_loading > 0) {\n      console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n      return null;\n    }\n    if (js_urls == null || js_urls.length === 0) {\n      run_callbacks();\n      return null;\n    }\n    console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n    root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n    function on_load() {\n      root._bokeh_is_loading--;\n      if (root._bokeh_is_loading === 0) {\n        console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n        run_callbacks()\n      }\n    }\n\n    function on_error() {\n      console.error(\"failed to load \" + url);\n    }\n\n    for (var i = 0; i < css_urls.length; i++) {\n      var url = css_urls[i];\n      const element = document.createElement(\"link\");\n      element.onload = on_load;\n      element.onerror = on_error;\n      element.rel = \"stylesheet\";\n      element.type = \"text/css\";\n      element.href = url;\n      console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n      document.body.appendChild(element);\n    }\n\n    for (var i = 0; i < js_urls.length; i++) {\n      var url = js_urls[i];\n      var element = document.createElement('script');\n      element.onload = on_load;\n      element.onerror = on_error;\n      element.async = false;\n      element.src = url;\n      console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n      document.head.appendChild(element);\n    }\n  };\n\n  function inject_raw_css(css) {\n    const element = document.createElement(\"style\");\n    element.appendChild(document.createTextNode(css));\n    document.body.appendChild(element);\n  }\n\n  var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.1.0.min.js\"];\n  var css_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.1.0.min.css\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.1.0.min.css\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.1.0.min.css\"];\n\n  var inline_js = [\n    function(Bokeh) {\n      Bokeh.set_log_level(\"info\");\n    },\n    \n    function(Bokeh) {\n      \n    },\n    function(Bokeh) {} // ensure no trailing comma for IE\n  ];\n\n  function run_inline_js() {\n    \n    if ((root.Bokeh !== undefined) || (force === true)) {\n      for (var i = 0; i < inline_js.length; i++) {\n        inline_js[i].call(root, root.Bokeh);\n      }} else if (Date.now() < root._bokeh_timeout) {\n      setTimeout(run_inline_js, 100);\n    } else if (!root._bokeh_failed_load) {\n      console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n      root._bokeh_failed_load = true;\n    } else if (force !== true) {\n      var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n      cell.output_area.append_execute_result(NB_LOAD_WARNING)\n    }\n\n  }\n\n  if (root._bokeh_is_loading === 0) {\n    console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n    run_inline_js();\n  } else {\n    load_libs(css_urls, js_urls, function() {\n      console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n      run_inline_js();\n    });\n  }\n}(window));"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<link rel=\"stylesheet\" href=\"https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">\n",
       "<style>div.hololayout {\n",
       "  display: flex;\n",
       "  align-items: center;\n",
       "  margin: 0;\n",
       "}\n",
       "\n",
       "div.holoframe {\n",
       "  width: 75%;\n",
       "}\n",
       "\n",
       "div.holowell {\n",
       "  display: flex;\n",
       "  align-items: center;\n",
       "}\n",
       "\n",
       "form.holoform {\n",
       "  background-color: #fafafa;\n",
       "  border-radius: 5px;\n",
       "  overflow: hidden;\n",
       "  padding-left: 0.8em;\n",
       "  padding-right: 0.8em;\n",
       "  padding-top: 0.4em;\n",
       "  padding-bottom: 0.4em;\n",
       "  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n",
       "  margin-bottom: 20px;\n",
       "  border: 1px solid #e3e3e3;\n",
       "}\n",
       "\n",
       "div.holowidgets {\n",
       "  padding-right: 0;\n",
       "  width: 25%;\n",
       "}\n",
       "\n",
       "div.holoslider {\n",
       "  min-height: 0 !important;\n",
       "  height: 0.8em;\n",
       "  width: 100%;\n",
       "}\n",
       "\n",
       "div.holoformgroup {\n",
       "  padding-top: 0.5em;\n",
       "  margin-bottom: 0.5em;\n",
       "}\n",
       "\n",
       "div.hologroup {\n",
       "  padding-left: 0;\n",
       "  padding-right: 0.8em;\n",
       "  width: 100%;\n",
       "}\n",
       "\n",
       ".holoselect {\n",
       "  width: 92%;\n",
       "  margin-left: 0;\n",
       "  margin-right: 0;\n",
       "}\n",
       "\n",
       ".holotext {\n",
       "  padding-left:  0.5em;\n",
       "  padding-right: 0;\n",
       "  width: 100%;\n",
       "}\n",
       "\n",
       ".holowidgets .ui-resizable-se {\n",
       "  visibility: hidden\n",
       "}\n",
       "\n",
       ".holoframe > .ui-resizable-se {\n",
       "  visibility: hidden\n",
       "}\n",
       "\n",
       ".holowidgets .ui-resizable-s {\n",
       "  visibility: hidden\n",
       "}\n",
       "\n",
       "\n",
       "/* CSS rules for noUISlider based slider used by JupyterLab extension  */\n",
       "\n",
       ".noUi-handle {\n",
       "  width: 20px !important;\n",
       "  height: 20px !important;\n",
       "  left: -5px !important;\n",
       "  top: -5px !important;\n",
       "}\n",
       "\n",
       ".noUi-handle:before, .noUi-handle:after {\n",
       "  visibility: hidden;\n",
       "  height: 0px;\n",
       "}\n",
       "\n",
       ".noUi-target {\n",
       "  margin-left: 0.5em;\n",
       "  margin-right: 0.5em;\n",
       "}\n",
       "\n",
       "div.bk-hbox {\n",
       "    display: flex;\n",
       "    justify-content: center;\n",
       "}\n",
       "\n",
       "div.bk-hbox div.bk-plot {\n",
       "    padding: 8px;\n",
       "}\n",
       "\n",
       "div.bk-hbox div.bk-data-table {\n",
       "    padding: 20px;\n",
       "}\n",
       "</style>\n",
       "\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<script type=\"application/javascript\">function HoloViewsWidget() {\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.init_slider = function(init_val){\n",
       "  if(this.load_json) {\n",
       "    this.from_json()\n",
       "  } else {\n",
       "    this.update_cache();\n",
       "  }\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.populate_cache = function(idx){\n",
       "  this.cache[idx].innerHTML = this.frames[idx];\n",
       "  if (this.embed) {\n",
       "    delete this.frames[idx];\n",
       "  }\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.process_error = function(msg){\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.from_json = function() {\n",
       "  var data_url = this.json_path + this.id + '.json';\n",
       "  $.getJSON(data_url, $.proxy(function(json_data) {\n",
       "    this.frames = json_data;\n",
       "    this.update_cache();\n",
       "    this.update(0);\n",
       "  }, this));\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.dynamic_update = function(current){\n",
       "  if (current === undefined) {\n",
       "    return\n",
       "  }\n",
       "  this.current = current;\n",
       "  if (this.comm) {\n",
       "    var msg = {comm_id: this.id+'_client', content: current}\n",
       "    this.comm.send(msg);\n",
       "  }\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.update_cache = function(force){\n",
       "  var frame_len = Object.keys(this.frames).length;\n",
       "  for (var i=0; i<frame_len; i++) {\n",
       "    if(!this.load_json || this.dynamic)  {\n",
       "      var frame = Object.keys(this.frames)[i];\n",
       "    } else {\n",
       "      var frame = i;\n",
       "    }\n",
       "    if(!(frame in this.cache) || force) {\n",
       "      if ((frame in this.cache) && force) { this.cache[frame].remove() }\n",
       "      var div = document.createElement(\"div\");\n",
       "      var parent = document.getElementById(\"_anim_img\"+this.id);\n",
       "      div.style.display = \"none\";\n",
       "      parent.appendChild(div)\n",
       "      this.cache[frame] = div;\n",
       "      var cache_id = \"_anim_img\"+this.id+\"_\"+frame;\n",
       "      this.populate_cache(frame);\n",
       "    }\n",
       "  }\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.update = function(current){\n",
       "  if(current in this.cache) {\n",
       "    for (var index in this.cache) {\n",
       "      this.cache[index].style.display = \"none\";\n",
       "    }\n",
       "    this.cache[current].style.display = \"\";\n",
       "    this.wait = false;\n",
       "  }\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.init_comms = function() {\n",
       "  var that = this\n",
       "  HoloViews.comm_manager.register_target(this.plot_id, this.id, function (msg) { that.msg_handler(msg) })\n",
       "  if (!this.cached || this.dynamic) {\n",
       "    function ack_callback(msg) {\n",
       "      var msg = msg.metadata;\n",
       "      var comm_id = msg.comm_id;\n",
       "      var comm_status = HoloViews.comm_status[comm_id];\n",
       "      if (that.queue.length > 0) {\n",
       "        that.time = Date.now();\n",
       "        that.dynamic_update(that.queue[that.queue.length-1]);\n",
       "        that.queue = [];\n",
       "      } else {\n",
       "        that.wait = false;\n",
       "      }\n",
       "      if ((msg.msg_type == \"Ready\") && msg.content) {\n",
       "        console.log(\"Python callback returned following output:\", msg.content);\n",
       "      } else if (msg.msg_type == \"Error\") {\n",
       "        console.log(\"Python failed with the following traceback:\", msg.traceback)\n",
       "      }\n",
       "    }\n",
       "    var comm = HoloViews.comm_manager.get_client_comm(this.plot_id, this.id+'_client', ack_callback);\n",
       "    return comm\n",
       "  }\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.msg_handler = function(msg) {\n",
       "  var metadata = msg.metadata;\n",
       "  if ((metadata.msg_type == \"Ready\")) {\n",
       "    if (metadata.content) {\n",
       "      console.log(\"Python callback returned following output:\", metadata.content);\n",
       "    }\n",
       "\treturn;\n",
       "  } else if (metadata.msg_type == \"Error\") {\n",
       "    console.log(\"Python failed with the following traceback:\", metadata.traceback)\n",
       "    return\n",
       "  }\n",
       "  this.process_msg(msg)\n",
       "}\n",
       "\n",
       "HoloViewsWidget.prototype.process_msg = function(msg) {\n",
       "}\n",
       "\n",
       "function SelectionWidget(frames, id, slider_ids, keyMap, dim_vals, notFound, load_json, mode, cached, json_path, dynamic, plot_id){\n",
       "  this.frames = frames;\n",
       "  this.id = id;\n",
       "  this.plot_id = plot_id;\n",
       "  this.slider_ids = slider_ids;\n",
       "  this.keyMap = keyMap\n",
       "  this.current_frame = 0;\n",
       "  this.current_vals = dim_vals;\n",
       "  this.load_json = load_json;\n",
       "  this.mode = mode;\n",
       "  this.notFound = notFound;\n",
       "  this.cached = cached;\n",
       "  this.dynamic = dynamic;\n",
       "  this.cache = {};\n",
       "  this.json_path = json_path;\n",
       "  this.init_slider(this.current_vals[0]);\n",
       "  this.queue = [];\n",
       "  this.wait = false;\n",
       "  if (!this.cached || this.dynamic) {\n",
       "    this.comm = this.init_comms();\n",
       "  }\n",
       "}\n",
       "\n",
       "SelectionWidget.prototype = new HoloViewsWidget;\n",
       "\n",
       "\n",
       "SelectionWidget.prototype.get_key = function(current_vals) {\n",
       "  var key = \"(\";\n",
       "  for (var i=0; i<this.slider_ids.length; i++)\n",
       "  {\n",
       "    var val = this.current_vals[i];\n",
       "    if (!(typeof val === 'string')) {\n",
       "      if (val % 1 === 0) { val = val.toFixed(1); }\n",
       "      else { val = val.toFixed(10); val = val.slice(0, val.length-1);}\n",
       "    }\n",
       "    key += \"'\" + val + \"'\";\n",
       "    if(i != this.slider_ids.length-1) { key += ', ';}\n",
       "    else if(this.slider_ids.length == 1) { key += ',';}\n",
       "  }\n",
       "  key += \")\";\n",
       "  return this.keyMap[key];\n",
       "}\n",
       "\n",
       "SelectionWidget.prototype.set_frame = function(dim_val, dim_idx){\n",
       "  this.current_vals[dim_idx] = dim_val;\n",
       "  var key = this.current_vals;\n",
       "  if (!this.dynamic) {\n",
       "    key = this.get_key(key)\n",
       "  }\n",
       "  if (this.dynamic || !this.cached) {\n",
       "    if ((this.time !== undefined) && ((this.wait) && ((this.time + 10000) > Date.now()))) {\n",
       "      this.queue.push(key);\n",
       "      return\n",
       "    }\n",
       "    this.queue = [];\n",
       "    this.time = Date.now();\n",
       "    this.current_frame = key;\n",
       "    this.wait = true;\n",
       "    this.dynamic_update(key)\n",
       "  } else if (key !== undefined) {\n",
       "    this.update(key)\n",
       "  }\n",
       "}\n",
       "\n",
       "\n",
       "/* Define the ScrubberWidget class */\n",
       "function ScrubberWidget(frames, num_frames, id, interval, load_json, mode, cached, json_path, dynamic, plot_id){\n",
       "  this.slider_id = \"_anim_slider\" + id;\n",
       "  this.loop_select_id = \"_anim_loop_select\" + id;\n",
       "  this.id = id;\n",
       "  this.plot_id = plot_id;\n",
       "  this.interval = interval;\n",
       "  this.current_frame = 0;\n",
       "  this.direction = 0;\n",
       "  this.dynamic = dynamic;\n",
       "  this.timer = null;\n",
       "  this.load_json = load_json;\n",
       "  this.mode = mode;\n",
       "  this.cached = cached;\n",
       "  this.frames = frames;\n",
       "  this.cache = {};\n",
       "  this.length = num_frames;\n",
       "  this.json_path = json_path;\n",
       "  document.getElementById(this.slider_id).max = this.length - 1;\n",
       "  this.init_slider(0);\n",
       "  this.wait = false;\n",
       "  this.queue = [];\n",
       "  if (!this.cached || this.dynamic) {\n",
       "    this.comm = this.init_comms()\n",
       "  }\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype = new HoloViewsWidget;\n",
       "\n",
       "ScrubberWidget.prototype.set_frame = function(frame){\n",
       "  this.current_frame = frame;\n",
       "  var widget = document.getElementById(this.slider_id);\n",
       "  if (widget === null) {\n",
       "    this.pause_animation();\n",
       "    return\n",
       "  }\n",
       "  widget.value = this.current_frame;\n",
       "  if (this.dynamic || !this.cached) {\n",
       "    if ((this.time !== undefined) && ((this.wait) && ((this.time + 10000) > Date.now()))) {\n",
       "      this.queue.push(frame);\n",
       "      return\n",
       "    }\n",
       "    this.queue = [];\n",
       "    this.time = Date.now();\n",
       "    this.wait = true;\n",
       "    this.dynamic_update(frame)\n",
       "  } else {\n",
       "    this.update(frame)\n",
       "  }\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.get_loop_state = function(){\n",
       "  var button_group = document[this.loop_select_id].state;\n",
       "  for (var i = 0; i < button_group.length; i++) {\n",
       "    var button = button_group[i];\n",
       "    if (button.checked) {\n",
       "      return button.value;\n",
       "    }\n",
       "  }\n",
       "  return undefined;\n",
       "}\n",
       "\n",
       "\n",
       "ScrubberWidget.prototype.next_frame = function() {\n",
       "  this.set_frame(Math.min(this.length - 1, this.current_frame + 1));\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.previous_frame = function() {\n",
       "  this.set_frame(Math.max(0, this.current_frame - 1));\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.first_frame = function() {\n",
       "  this.set_frame(0);\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.last_frame = function() {\n",
       "  this.set_frame(this.length - 1);\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.slower = function() {\n",
       "  this.interval /= 0.7;\n",
       "  if(this.direction > 0){this.play_animation();}\n",
       "  else if(this.direction < 0){this.reverse_animation();}\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.faster = function() {\n",
       "  this.interval *= 0.7;\n",
       "  if(this.direction > 0){this.play_animation();}\n",
       "  else if(this.direction < 0){this.reverse_animation();}\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.anim_step_forward = function() {\n",
       "  if(this.current_frame < this.length - 1){\n",
       "    this.next_frame();\n",
       "  }else{\n",
       "    var loop_state = this.get_loop_state();\n",
       "    if(loop_state == \"loop\"){\n",
       "      this.first_frame();\n",
       "    }else if(loop_state == \"reflect\"){\n",
       "      this.last_frame();\n",
       "      this.reverse_animation();\n",
       "    }else{\n",
       "      this.pause_animation();\n",
       "      this.last_frame();\n",
       "    }\n",
       "  }\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.anim_step_reverse = function() {\n",
       "  if(this.current_frame > 0){\n",
       "    this.previous_frame();\n",
       "  } else {\n",
       "    var loop_state = this.get_loop_state();\n",
       "    if(loop_state == \"loop\"){\n",
       "      this.last_frame();\n",
       "    }else if(loop_state == \"reflect\"){\n",
       "      this.first_frame();\n",
       "      this.play_animation();\n",
       "    }else{\n",
       "      this.pause_animation();\n",
       "      this.first_frame();\n",
       "    }\n",
       "  }\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.pause_animation = function() {\n",
       "  this.direction = 0;\n",
       "  if (this.timer){\n",
       "    clearInterval(this.timer);\n",
       "    this.timer = null;\n",
       "  }\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.play_animation = function() {\n",
       "  this.pause_animation();\n",
       "  this.direction = 1;\n",
       "  var t = this;\n",
       "  if (!this.timer) this.timer = setInterval(function(){t.anim_step_forward();}, this.interval);\n",
       "}\n",
       "\n",
       "ScrubberWidget.prototype.reverse_animation = function() {\n",
       "  this.pause_animation();\n",
       "  this.direction = -1;\n",
       "  var t = this;\n",
       "  if (!this.timer) this.timer = setInterval(function(){t.anim_step_reverse();}, this.interval);\n",
       "}\n",
       "\n",
       "function extend(destination, source) {\n",
       "  for (var k in source) {\n",
       "    if (source.hasOwnProperty(k)) {\n",
       "      destination[k] = source[k];\n",
       "    }\n",
       "  }\n",
       "  return destination;\n",
       "}\n",
       "\n",
       "function update_widget(widget, values) {\n",
       "  if (widget.hasClass(\"ui-slider\")) {\n",
       "    widget.slider('option', {\n",
       "      min: 0,\n",
       "      max: values.length-1,\n",
       "      dim_vals: values,\n",
       "      value: 0,\n",
       "      dim_labels: values\n",
       "    })\n",
       "    widget.slider('option', 'slide').call(widget, event, {value: 0})\n",
       "  } else {\n",
       "    widget.empty();\n",
       "    for (var i=0; i<values.length; i++){\n",
       "      widget.append($(\"<option>\", {\n",
       "        value: i,\n",
       "        text: values[i]\n",
       "      }))\n",
       "    };\n",
       "    widget.data('values', values);\n",
       "    widget.data('value', 0);\n",
       "    widget.trigger(\"change\");\n",
       "  };\n",
       "}\n",
       "\n",
       "function init_slider(id, plot_id, dim, values, next_vals, labels, dynamic, step, value, next_dim,\n",
       "                     dim_idx, delay, jQueryUI_CDN, UNDERSCORE_CDN) {\n",
       "  // Slider JS Block START\n",
       "  function loadcssfile(filename){\n",
       "    var fileref=document.createElement(\"link\")\n",
       "    fileref.setAttribute(\"rel\", \"stylesheet\")\n",
       "    fileref.setAttribute(\"type\", \"text/css\")\n",
       "    fileref.setAttribute(\"href\", filename)\n",
       "    document.getElementsByTagName(\"head\")[0].appendChild(fileref)\n",
       "  }\n",
       "  loadcssfile(\"https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\");\n",
       "  /* Check if jQuery and jQueryUI have been loaded\n",
       "     otherwise load with require.js */\n",
       "  var jQuery = window.jQuery,\n",
       "    // check for old versions of jQuery\n",
       "    oldjQuery = jQuery && !!jQuery.fn.jquery.match(/^1\\.[0-4](\\.|$)/),\n",
       "    jquery_path = '',\n",
       "    paths = {},\n",
       "    noConflict;\n",
       "  var jQueryUI = jQuery.ui;\n",
       "  // check for jQuery\n",
       "  if (!jQuery || oldjQuery) {\n",
       "    // load if it's not available or doesn't meet min standards\n",
       "    paths.jQuery = jQuery;\n",
       "    noConflict = !!oldjQuery;\n",
       "  } else {\n",
       "    // register the current jQuery\n",
       "    define('jquery', [], function() { return jQuery; });\n",
       "  }\n",
       "  if (!jQueryUI) {\n",
       "    paths.jQueryUI = jQueryUI_CDN.slice(null, -3);\n",
       "  } else {\n",
       "    define('jQueryUI', [], function() { return jQuery.ui; });\n",
       "  }\n",
       "  paths.underscore = UNDERSCORE_CDN.slice(null, -3);\n",
       "  var jquery_require = {\n",
       "    paths: paths,\n",
       "    shim: {\n",
       "      \"jQueryUI\": {\n",
       "        exports:\"$\",\n",
       "        deps: ['jquery']\n",
       "      },\n",
       "      \"underscore\": {\n",
       "        exports: '_'\n",
       "      }\n",
       "    }\n",
       "  }\n",
       "  require.config(jquery_require);\n",
       "  require([\"jQueryUI\", \"underscore\"], function(jUI, _){\n",
       "    if (noConflict) $.noConflict(true);\n",
       "    var vals = values;\n",
       "    if (dynamic && vals.constructor === Array) {\n",
       "      var default_value = parseFloat(value);\n",
       "      var min = parseFloat(vals[0]);\n",
       "      var max = parseFloat(vals[vals.length-1]);\n",
       "      var wstep = step;\n",
       "      var wlabels = [default_value];\n",
       "      var init_label = default_value;\n",
       "    } else {\n",
       "      var min = 0;\n",
       "      if (dynamic) {\n",
       "        var max = Object.keys(vals).length - 1;\n",
       "        var init_label = labels[value];\n",
       "        var default_value = values[value];\n",
       "      } else {\n",
       "        var max = vals.length - 1;\n",
       "        var init_label = labels[value];\n",
       "        var default_value = value;\n",
       "      }\n",
       "      var wstep = 1;\n",
       "      var wlabels = labels;\n",
       "    }\n",
       "    function adjustFontSize(text) {\n",
       "      var width_ratio = (text.parent().width()/8)/text.val().length;\n",
       "      var size = Math.min(0.9, Math.max(0.6, width_ratio))+'em';\n",
       "      text.css('font-size', size);\n",
       "    }\n",
       "    var slider = $('#_anim_widget'+id+'_'+dim);\n",
       "    slider.slider({\n",
       "      animate: \"fast\",\n",
       "      min: min,\n",
       "      max: max,\n",
       "      step: wstep,\n",
       "      value: default_value,\n",
       "      dim_vals: vals,\n",
       "      dim_labels: wlabels,\n",
       "      next_vals: next_vals,\n",
       "      slide: function(event, ui) {\n",
       "        var vals = slider.slider(\"option\", \"dim_vals\");\n",
       "        var next_vals = slider.slider(\"option\", \"next_vals\");\n",
       "        var dlabels = slider.slider(\"option\", \"dim_labels\");\n",
       "        if (dynamic) {\n",
       "          var dim_val = ui.value;\n",
       "          if (vals.constructor === Array) {\n",
       "            var label = ui.value;\n",
       "          } else {\n",
       "            var label = dlabels[ui.value];\n",
       "          }\n",
       "        } else {\n",
       "          var dim_val = vals[ui.value];\n",
       "          var label = dlabels[ui.value];\n",
       "        }\n",
       "        var text = $('#textInput'+id+'_'+dim);\n",
       "        text.val(label);\n",
       "        adjustFontSize(text);\n",
       "        HoloViews.index[plot_id].set_frame(dim_val, dim_idx);\n",
       "        if (Object.keys(next_vals).length > 0) {\n",
       "          var new_vals = next_vals[dim_val];\n",
       "          var next_widget = $('#_anim_widget'+id+'_'+next_dim);\n",
       "          update_widget(next_widget, new_vals);\n",
       "        }\n",
       "      }\n",
       "    });\n",
       "    slider.keypress(function(event) {\n",
       "      if (event.which == 80 || event.which == 112) {\n",
       "        var start = slider.slider(\"option\", \"value\");\n",
       "        var stop =  slider.slider(\"option\", \"max\");\n",
       "        for (var i=start; i<=stop; i++) {\n",
       "          var delay = i*delay;\n",
       "          $.proxy(function doSetTimeout(i) { setTimeout($.proxy(function() {\n",
       "            var val = {value:i};\n",
       "            slider.slider('value',i);\n",
       "            slider.slider(\"option\", \"slide\")(null, val);\n",
       "          }, slider), delay);}, slider)(i);\n",
       "        }\n",
       "      }\n",
       "      if (event.which == 82 || event.which == 114) {\n",
       "        var start = slider.slider(\"option\", \"value\");\n",
       "        var stop =  slider.slider(\"option\", \"min\");\n",
       "        var count = 0;\n",
       "        for (var i=start; i>=stop; i--) {\n",
       "          var delay = count*delay;\n",
       "          count = count + 1;\n",
       "          $.proxy(function doSetTimeout(i) { setTimeout($.proxy(function() {\n",
       "            var val = {value:i};\n",
       "            slider.slider('value',i);\n",
       "            slider.slider(\"option\", \"slide\")(null, val);\n",
       "          }, slider), delay);}, slider)(i);\n",
       "        }\n",
       "      }\n",
       "    });\n",
       "    var textInput = $('#textInput'+id+'_'+dim)\n",
       "    textInput.val(init_label);\n",
       "    adjustFontSize(textInput);\n",
       "  });\n",
       "}\n",
       "\n",
       "function init_dropdown(id, plot_id, dim, vals, value, next_vals, labels, next_dim, dim_idx, dynamic) {\n",
       "  var widget = $(\"#_anim_widget\"+id+'_'+dim);\n",
       "  widget.data('values', vals)\n",
       "  for (var i=0; i<vals.length; i++){\n",
       "    if (dynamic) {\n",
       "      var val = vals[i];\n",
       "    } else {\n",
       "      var val = i;\n",
       "    }\n",
       "    widget.append($(\"<option>\", {\n",
       "      value: val,\n",
       "      text: labels[i]\n",
       "    }));\n",
       "  };\n",
       "  widget.data(\"next_vals\", next_vals);\n",
       "  widget.val(value);\n",
       "  widget.on('change', function(event, ui) {\n",
       "    if (dynamic) {\n",
       "      var dim_val = parseInt(this.value);\n",
       "    } else {\n",
       "      var dim_val = $.data(this, 'values')[this.value];\n",
       "    }\n",
       "    var next_vals = $.data(this, \"next_vals\");\n",
       "    if (Object.keys(next_vals).length > 0) {\n",
       "      var new_vals = next_vals[dim_val];\n",
       "      var next_widget = $('#_anim_widget'+id+'_'+next_dim);\n",
       "      update_widget(next_widget, new_vals);\n",
       "    }\n",
       "    var widgets = HoloViews.index[plot_id]\n",
       "    if (widgets) {\n",
       "      widgets.set_frame(dim_val, dim_idx);\n",
       "    }\n",
       "  });\n",
       "}\n",
       "\n",
       "\n",
       "if (window.HoloViews === undefined) {\n",
       "  window.HoloViews = {}\n",
       "  window.PyViz = window.HoloViews\n",
       "} else if (window.PyViz === undefined) {\n",
       "  window.PyViz = window.HoloViews\n",
       "}\n",
       "\n",
       "\n",
       "var _namespace = {\n",
       "  init_slider: init_slider,\n",
       "  init_dropdown: init_dropdown,\n",
       "  comms: {},\n",
       "  comm_status: {},\n",
       "  index: {},\n",
       "  plot_index: {},\n",
       "  kernels: {},\n",
       "  receivers: {}\n",
       "}\n",
       "\n",
       "for (var k in _namespace) {\n",
       "  if (!(k in window.HoloViews)) {\n",
       "    window.HoloViews[k] = _namespace[k];\n",
       "  }\n",
       "}\n",
       "\n",
       "// Define Bokeh specific subclasses\n",
       "function BokehSelectionWidget() {\n",
       "  SelectionWidget.apply(this, arguments);\n",
       "}\n",
       "\n",
       "function BokehScrubberWidget() {\n",
       "  ScrubberWidget.apply(this, arguments);\n",
       "}\n",
       "\n",
       "// Let them inherit from the baseclasses\n",
       "BokehSelectionWidget.prototype = Object.create(SelectionWidget.prototype);\n",
       "BokehScrubberWidget.prototype = Object.create(ScrubberWidget.prototype);\n",
       "\n",
       "// Define methods to override on widgets\n",
       "var BokehMethods = {\n",
       "  update_cache : function(){\n",
       "    for (var index in this.frames) {\n",
       "      this.frames[index] = JSON.parse(this.frames[index]);\n",
       "    }\n",
       "  },\n",
       "  update : function(current){\n",
       "    if (current === undefined) {\n",
       "      return;\n",
       "    }\n",
       "    var data = this.frames[current];\n",
       "    if (data !== undefined) {\n",
       "      if (data.root in HoloViews.plot_index) {\n",
       "        var doc = HoloViews.plot_index[data.root].model.document;\n",
       "      } else {\n",
       "        var doc = Bokeh.index[data.root].model.document;\n",
       "      }\n",
       "      doc.apply_json_patch(data.content);\n",
       "    }\n",
       "  },\n",
       "  init_comms: function() {\n",
       "    if (Bokeh.protocol !== undefined) {\n",
       "      this.receiver = new Bokeh.protocol.Receiver()\n",
       "    } else {\n",
       "      this.receiver = null;\n",
       "    }\n",
       "    return HoloViewsWidget.prototype.init_comms.call(this);\n",
       "  },\n",
       "  process_msg : function(msg) {\n",
       "    if (this.plot_id in HoloViews.plot_index) {\n",
       "      var doc = HoloViews.plot_index[this.plot_id].model.document;\n",
       "    } else {\n",
       "      var doc = Bokeh.index[this.plot_id].model.document;\n",
       "    }\n",
       "    if (this.receiver === null) { return }\n",
       "    var receiver = this.receiver;\n",
       "    if (msg.buffers.length > 0) {\n",
       "      receiver.consume(msg.buffers[0].buffer)\n",
       "    } else {\n",
       "      receiver.consume(msg.content.data)\n",
       "    }\n",
       "    const comm_msg = receiver.message;\n",
       "    if ((comm_msg != null) && (doc != null)) {\n",
       "      doc.apply_json_patch(comm_msg.content, comm_msg.buffers)\n",
       "    }\n",
       "  }\n",
       "}\n",
       "\n",
       "// Extend Bokeh widgets with backend specific methods\n",
       "extend(BokehSelectionWidget.prototype, BokehMethods);\n",
       "extend(BokehScrubberWidget.prototype, BokehMethods);\n",
       "\n",
       "window.HoloViews.BokehSelectionWidget = BokehSelectionWidget\n",
       "window.HoloViews.BokehScrubberWidget = BokehScrubberWidget\n",
       "\n",
       "    function JupyterCommManager() {\n",
       "    }\n",
       "\n",
       "    JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n",
       "      if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n",
       "        var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n",
       "        comm_manager.register_target(comm_id, function(comm) {\n",
       "          comm.on_msg(msg_handler);\n",
       "        });\n",
       "      } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n",
       "        window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n",
       "          comm.onMsg = msg_handler;\n",
       "        });\n",
       "      }\n",
       "    }\n",
       "\n",
       "    JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n",
       "      if (comm_id in window.PyViz.comms) {\n",
       "        return window.PyViz.comms[comm_id];\n",
       "      } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n",
       "        var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n",
       "        var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n",
       "        if (msg_handler) {\n",
       "          comm.on_msg(msg_handler);\n",
       "        }\n",
       "      } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n",
       "        var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n",
       "        comm.open();\n",
       "        if (msg_handler) {\n",
       "          comm.onMsg = msg_handler;\n",
       "        }\n",
       "      }\n",
       "\n",
       "      window.PyViz.comms[comm_id] = comm;\n",
       "      return comm;\n",
       "    }\n",
       "\n",
       "    window.PyViz.comm_manager = new JupyterCommManager();\n",
       "    \n",
       "\n",
       "var JS_MIME_TYPE = 'application/javascript';\n",
       "var HTML_MIME_TYPE = 'text/html';\n",
       "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n",
       "var CLASS_NAME = 'output';\n",
       "\n",
       "/**\n",
       " * Render data to the DOM node\n",
       " */\n",
       "function render(props, node) {\n",
       "  var div = document.createElement(\"div\");\n",
       "  var script = document.createElement(\"script\");\n",
       "  node.appendChild(div);\n",
       "  node.appendChild(script);\n",
       "}\n",
       "\n",
       "/**\n",
       " * Handle when a new output is added\n",
       " */\n",
       "function handle_add_output(event, handle) {\n",
       "  var output_area = handle.output_area;\n",
       "  var output = handle.output;\n",
       "  if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
       "    return\n",
       "  }\n",
       "  var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
       "  var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
       "  if (id !== undefined) {\n",
       "    var nchildren = toinsert.length;\n",
       "    var html_node = toinsert[nchildren-1].children[0];\n",
       "    html_node.innerHTML = output.data[HTML_MIME_TYPE];\n",
       "    var scripts = [];\n",
       "    var nodelist = html_node.querySelectorAll(\"script\");\n",
       "    for (var i in nodelist) {\n",
       "      if (nodelist.hasOwnProperty(i)) {\n",
       "        scripts.push(nodelist[i])\n",
       "      }\n",
       "    }\n",
       "\n",
       "    scripts.forEach( function (oldScript) {\n",
       "      var newScript = document.createElement(\"script\");\n",
       "      var attrs = [];\n",
       "      var nodemap = oldScript.attributes;\n",
       "      for (var j in nodemap) {\n",
       "        if (nodemap.hasOwnProperty(j)) {\n",
       "          attrs.push(nodemap[j])\n",
       "        }\n",
       "      }\n",
       "      attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n",
       "      newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n",
       "      oldScript.parentNode.replaceChild(newScript, oldScript);\n",
       "    });\n",
       "    if (JS_MIME_TYPE in output.data) {\n",
       "      toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n",
       "    }\n",
       "    output_area._hv_plot_id = id;\n",
       "    if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n",
       "      window.PyViz.plot_index[id] = Bokeh.index[id];\n",
       "    } else {\n",
       "      window.PyViz.plot_index[id] = null;\n",
       "    }\n",
       "  } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
       "    var bk_div = document.createElement(\"div\");\n",
       "    bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
       "    var script_attrs = bk_div.children[0].attributes;\n",
       "    for (var i = 0; i < script_attrs.length; i++) {\n",
       "      toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
       "    }\n",
       "    // store reference to server id on output_area\n",
       "    output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
       "  }\n",
       "}\n",
       "\n",
       "/**\n",
       " * Handle when an output is cleared or removed\n",
       " */\n",
       "function handle_clear_output(event, handle) {\n",
       "  var id = handle.cell.output_area._hv_plot_id;\n",
       "  var server_id = handle.cell.output_area._bokeh_server_id;\n",
       "  if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n",
       "  var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n",
       "  if (server_id !== null) {\n",
       "    comm.send({event_type: 'server_delete', 'id': server_id});\n",
       "    return;\n",
       "  } else if (comm !== null) {\n",
       "    comm.send({event_type: 'delete', 'id': id});\n",
       "  }\n",
       "  delete PyViz.plot_index[id];\n",
       "  if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n",
       "    var doc = window.Bokeh.index[id].model.document\n",
       "    doc.clear();\n",
       "    const i = window.Bokeh.documents.indexOf(doc);\n",
       "    if (i > -1) {\n",
       "      window.Bokeh.documents.splice(i, 1);\n",
       "    }\n",
       "  }\n",
       "}\n",
       "\n",
       "/**\n",
       " * Handle kernel restart event\n",
       " */\n",
       "function handle_kernel_cleanup(event, handle) {\n",
       "  delete PyViz.comms[\"hv-extension-comm\"];\n",
       "  window.PyViz.plot_index = {}\n",
       "}\n",
       "\n",
       "/**\n",
       " * Handle update_display_data messages\n",
       " */\n",
       "function handle_update_output(event, handle) {\n",
       "  handle_clear_output(event, {cell: {output_area: handle.output_area}})\n",
       "  handle_add_output(event, handle)\n",
       "}\n",
       "\n",
       "function register_renderer(events, OutputArea) {\n",
       "  function append_mime(data, metadata, element) {\n",
       "    // create a DOM node to render to\n",
       "    var toinsert = this.create_output_subarea(\n",
       "    metadata,\n",
       "    CLASS_NAME,\n",
       "    EXEC_MIME_TYPE\n",
       "    );\n",
       "    this.keyboard_manager.register_events(toinsert);\n",
       "    // Render to node\n",
       "    var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
       "    render(props, toinsert[0]);\n",
       "    element.append(toinsert);\n",
       "    return toinsert\n",
       "  }\n",
       "\n",
       "  events.on('output_added.OutputArea', handle_add_output);\n",
       "  events.on('output_updated.OutputArea', handle_update_output);\n",
       "  events.on('clear_output.CodeCell', handle_clear_output);\n",
       "  events.on('delete.Cell', handle_clear_output);\n",
       "  events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n",
       "\n",
       "  OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
       "    safe: true,\n",
       "    index: 0\n",
       "  });\n",
       "}\n",
       "\n",
       "if (window.Jupyter !== undefined) {\n",
       "  try {\n",
       "    var events = require('base/js/events');\n",
       "    var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
       "    if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
       "      register_renderer(events, OutputArea);\n",
       "    }\n",
       "  } catch(err) {\n",
       "  }\n",
       "}\n",
       "</script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import adaptive\n",
    "adaptive.notebook_extension(_inline_js=False)\n",
    "\n",
    "import holoviews as hv\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div id='1003' style='display: table; margin: 0 auto;'>\n",
       "\n",
       "\n",
       "\n",
       "\n",
       "\n",
       "  <div class=\"bk-root\" id=\"b51c0667-4dc8-45a9-b660-a7c8cb034d13\" data-root-id=\"1003\"></div>\n",
       "</div>\n",
       "<script type=\"application/javascript\">(function(root) {\n",
       "  function embed_document(root) {\n",
       "    \n",
       "  var docs_json = {\"4e818bb7-7663-4057-bb70-2f23f9358870\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1012\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1016\",\"type\":\"Grid\"},{\"id\":\"1021\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"1017\",\"type\":\"LinearAxis\"}],\"min_border_bottom\":10,\"min_border_left\":10,\"min_border_right\":10,\"min_border_top\":10,\"plot_height\":300,\"plot_width\":300,\"renderers\":[{\"id\":\"1039\",\"type\":\"GlyphRenderer\"}],\"sizing_mode\":\"fixed\",\"title\":{\"id\":\"1004\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1027\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1001\",\"type\":\"Range1d\"},\"x_scale\":{\"id\":\"1008\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1002\",\"type\":\"Range1d\"},\"y_scale\":{\"id\":\"1010\",\"type\":\"LinearScale\"}},\"id\":\"1003\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#30a2da\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#30a2da\"},\"size\":{\"units\":\"screen\",\"value\":2.449489742783178},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1038\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"1052\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#30a2da\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#30a2da\"},\"size\":{\"units\":\"screen\",\"value\":2.449489742783178},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1037\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"1013\",\"type\":\"BasicTicker\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1050\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1026\",\"type\":\"ResetTool\"},{\"attributes\":{\"axis_label\":\"x\",\"bounds\":\"auto\",\"formatter\":{\"id\":\"1041\",\"type\":\"BasicTickFormatter\"},\"major_label_orientation\":\"horizontal\",\"ticker\":{\"id\":\"1013\",\"type\":\"BasicTicker\"}},\"id\":\"1012\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_color\":{\"value\":\"#30a2da\"},\"line_color\":{\"value\":\"#30a2da\"},\"size\":{\"units\":\"screen\",\"value\":2.449489742783178},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1036\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"text\":\"\",\"text_color\":{\"value\":\"black\"},\"text_font_size\":{\"value\":\"12pt\"}},\"id\":\"1004\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"LinearScale\"},{\"attributes\":{\"overlay\":{\"id\":\"1050\",\"type\":\"BoxAnnotation\"}},\"id\":\"1025\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1041\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1034\",\"type\":\"Selection\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1022\",\"type\":\"SaveTool\"},{\"id\":\"1023\",\"type\":\"PanTool\"},{\"id\":\"1024\",\"type\":\"WheelZoomTool\"},{\"id\":\"1025\",\"type\":\"BoxZoomTool\"},{\"id\":\"1026\",\"type\":\"ResetTool\"}]},\"id\":\"1027\",\"type\":\"Toolbar\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAA0QA==\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1034\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1052\",\"type\":\"UnionRenderers\"}},\"id\":\"1033\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"PanTool\"},{\"attributes\":{\"callback\":null,\"end\":20.0,\"reset_end\":20.0,\"reset_start\":1.0,\"start\":1.0,\"tags\":[[[\"y\",\"y\",null]]]},\"id\":\"1002\",\"type\":\"Range1d\"},{\"attributes\":{\"dimension\":1,\"grid_line_color\":{\"value\":null},\"ticker\":{\"id\":\"1018\",\"type\":\"BasicTicker\"}},\"id\":\"1021\",\"type\":\"Grid\"},{\"attributes\":{\"callback\":null,\"end\":3.0,\"reset_end\":3.0,\"reset_start\":0.0,\"tags\":[[[\"x\",\"x\",null]]]},\"id\":\"1001\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"SaveTool\"},{\"attributes\":{\"grid_line_color\":{\"value\":null},\"ticker\":{\"id\":\"1013\",\"type\":\"BasicTicker\"}},\"id\":\"1016\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"y\",\"bounds\":\"auto\",\"formatter\":{\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},\"major_label_orientation\":\"horizontal\",\"ticker\":{\"id\":\"1018\",\"type\":\"BasicTicker\"}},\"id\":\"1017\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data_source\":{\"id\":\"1033\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1036\",\"type\":\"Scatter\"},\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1038\",\"type\":\"Scatter\"},\"nonselection_glyph\":{\"id\":\"1037\",\"type\":\"Scatter\"},\"selection_glyph\":null,\"view\":{\"id\":\"1040\",\"type\":\"CDSView\"}},\"id\":\"1039\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1018\",\"type\":\"BasicTicker\"},{\"attributes\":{\"source\":{\"id\":\"1033\",\"type\":\"ColumnDataSource\"}},\"id\":\"1040\",\"type\":\"CDSView\"}],\"root_ids\":[\"1003\"]},\"title\":\"Bokeh Application\",\"version\":\"1.1.0\"}};\n",
       "  var render_items = [{\"docid\":\"4e818bb7-7663-4057-bb70-2f23f9358870\",\"roots\":{\"1003\":\"b51c0667-4dc8-45a9-b660-a7c8cb034d13\"}}];\n",
       "  root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
       "\n",
       "  }\n",
       "  if (root.Bokeh !== undefined) {\n",
       "    embed_document(root);\n",
       "  } else {\n",
       "    var attempts = 0;\n",
       "    var timer = setInterval(function(root) {\n",
       "      if (root.Bokeh !== undefined) {\n",
       "        embed_document(root);\n",
       "        clearInterval(timer);\n",
       "      }\n",
       "      attempts++;\n",
       "      if (attempts > 100) {\n",
       "        console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
       "        clearInterval(timer);\n",
       "      }\n",
       "    }, 10, root)\n",
       "  }\n",
       "})(window);</script>"
      ],
      "text/plain": [
       ":Scatter   [x]   (y)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def f24(x):\n",
    "    return np.floor(np.exp(x))\n",
    "\n",
    "xs = np.linspace(0, 3, 200)\n",
    "hv.Scatter((xs, [f24(x) for x in xs]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/docs/checkouts/readthedocs.org/user_builds/adaptive/conda/v0.8.1/lib/python3.6/site-packages/ipykernel_launcher.py:2: IntegrationWarning: The maximum number of subdivisions (50) has been achieved.\n",
      "  If increasing the limit yields no improvement it is advised to analyze \n",
      "  the integrand in order to determine the difficulties.  If the position of a \n",
      "  local difficulty can be determined (singularity, discontinuity) one will \n",
      "  probably gain from splitting up the interval and calling the integrator \n",
      "  on the subranges.  Perhaps a special-purpose integrator should be used.\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(17.65947611079367, 0.017039069845928623)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import scipy.integrate\n",
    "scipy.integrate.quad(f24, 0, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from adaptive.runner import SequentialExecutor\n",
    "\n",
    "learner = adaptive.IntegratorLearner(f24, bounds=(0, 3), tol=1e-8)\n",
    "\n",
    "# We use a SequentialExecutor, which runs the function to be learned in\n",
    "# *this* process only. This means we don't pay\n",
    "# the overhead of evaluating the function in another process.\n",
    "runner = adaptive.Runner(learner, executor=SequentialExecutor(), goal=lambda l: l.done())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "await runner.task  # This is not needed in a notebook environment!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bbf59caea28d4bc8be45c4dc8334f5e5",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='\\n        <dl>\\n        <dt class=\"ignore-css\">status</dt><dd><font color=\"green\">f…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "runner.live_info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "if not runner.task.done():\n",
    "    raise RuntimeError('Wait for the runner to finish before executing the cells below!')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The integral value is 17.6643835377243 with the corresponding error of 1.764637355670263e-07\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div id='1111' style='display: table; margin: 0 auto;'>\n",
       "\n",
       "\n",
       "\n",
       "\n",
       "\n",
       "  <div class=\"bk-root\" id=\"a691dd80-318b-4c0a-bd6d-3c9489448c66\" data-root-id=\"1111\"></div>\n",
       "</div>\n",
       "<script type=\"application/javascript\">(function(root) {\n",
       "  function embed_document(root) {\n",
       "    \n",
       "  var docs_json = {\"ec29d801-f9da-420a-9466-1032e13e9649\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1120\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1124\",\"type\":\"Grid\"},{\"id\":\"1129\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"1125\",\"type\":\"LinearAxis\"}],\"min_border_bottom\":10,\"min_border_left\":10,\"min_border_right\":10,\"min_border_top\":10,\"plot_height\":300,\"plot_width\":300,\"renderers\":[{\"id\":\"1147\",\"type\":\"GlyphRenderer\"}],\"sizing_mode\":\"fixed\",\"title\":{\"id\":\"1112\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1135\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1109\",\"type\":\"Range1d\"},\"x_scale\":{\"id\":\"1116\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1110\",\"type\":\"Range1d\"},\"y_scale\":{\"id\":\"1118\",\"type\":\"LinearScale\"}},\"id\":\"1111\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"grid_line_color\":{\"value\":null},\"ticker\":{\"id\":\"1121\",\"type\":\"BasicTicker\"}},\"id\":\"1124\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"y\",\"bounds\":\"auto\",\"formatter\":{\"id\":\"1151\",\"type\":\"BasicTickFormatter\"},\"major_label_orientation\":\"horizontal\",\"ticker\":{\"id\":\"1126\",\"type\":\"BasicTicker\"}},\"id\":\"1125\",\"type\":\"LinearAxis\"},{\"attributes\":{\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#30a2da\"},\"xs\":{\"field\":\"xs\"},\"ys\":{\"field\":\"ys\"}},\"id\":\"1146\",\"type\":\"MultiLine\"},{\"attributes\":{\"data_source\":{\"id\":\"1141\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1144\",\"type\":\"MultiLine\"},\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1146\",\"type\":\"MultiLine\"},\"nonselection_glyph\":{\"id\":\"1145\",\"type\":\"MultiLine\"},\"selection_glyph\":null,\"view\":{\"id\":\"1148\",\"type\":\"CDSView\"}},\"id\":\"1147\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1126\",\"type\":\"BasicTicker\"},{\"attributes\":{\"source\":{\"id\":\"1141\",\"type\":\"ColumnDataSource\"}},\"id\":\"1148\",\"type\":\"CDSView\"},{\"attributes\":{\"dimension\":1,\"grid_line_color\":{\"value\":null},\"ticker\":{\"id\":\"1126\",\"type\":\"BasicTicker\"}},\"id\":\"1129\",\"type\":\"Grid\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1130\",\"type\":\"SaveTool\"},{\"id\":\"1131\",\"type\":\"PanTool\"},{\"id\":\"1132\",\"type\":\"WheelZoomTool\"},{\"id\":\"1133\",\"type\":\"BoxZoomTool\"},{\"id\":\"1134\",\"type\":\"ResetTool\"}]},\"id\":\"1135\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1130\",\"type\":\"SaveTool\"},{\"attributes\":{\"line_color\":{\"value\":\"#30a2da\"},\"xs\":{\"field\":\"xs\"},\"ys\":{\"field\":\"ys\"}},\"id\":\"1144\",\"type\":\"MultiLine\"},{\"attributes\":{},\"id\":\"1160\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1149\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1131\",\"type\":\"PanTool\"},{\"attributes\":{\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#30a2da\"},\"xs\":{\"field\":\"xs\"},\"ys\":{\"field\":\"ys\"}},\"id\":\"1145\",\"type\":\"MultiLine\"},{\"attributes\":{},\"id\":\"1132\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1142\",\"type\":\"Selection\"},{\"attributes\":{\"overlay\":{\"id\":\"1158\",\"type\":\"BoxAnnotation\"}},\"id\":\"1133\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"callback\":null,\"end\":20.0,\"reset_end\":20.0,\"reset_start\":1.0,\"start\":1.0,\"tags\":[[[\"y\",\"y\",null]]]},\"id\":\"1110\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1134\",\"type\":\"ResetTool\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1158\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"callback\":null,\"end\":2.9957324266433716,\"reset_end\":2.9957324266433716,\"reset_start\":0.6931470036506653,\"start\":0.6931470036506653,\"tags\":[[[\"x\",\"x\",null]]]},\"id\":\"1109\",\"type\":\"Range1d\"},{\"attributes\":{\"callback\":null,\"data\":{\"xs\":[{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[944]}],\"ys\":[{\"__ndarray__\":\"AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAACEAAAAAAAAAIQAAAAAAAAAhAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAYQAAAAAAAABhAAAAAAAAAGEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAcQAAAAAAAABxAAAAAAAAAHEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAAChAAAAAAAAAKEAAAAAAAAAoQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACpAAAAAAAAAKkAAAAAAAAAqQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAACxAAAAAAAAALEAAAAAAAAAsQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAuQAAAAAAAAC5AAAAAAAAALkAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMEAAAAAAAAAwQAAAAAAAADBAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMUAAAAAAAAAxQAAAAAAAADFAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAyQAAAAAAAADJAAAAAAAAAMkAAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAAzQAAAAAAAADNAAAAAAAAAM0AAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA0QA==\",\"dtype\":\"float64\",\"shape\":[944]}]},\"selected\":{\"id\":\"1142\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1160\",\"type\":\"UnionRenderers\"}},\"id\":\"1141\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"text\":\"\",\"text_color\":{\"value\":\"black\"},\"text_font_size\":{\"value\":\"12pt\"}},\"id\":\"1112\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1116\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1121\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1118\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis_label\":\"x\",\"bounds\":\"auto\",\"formatter\":{\"id\":\"1149\",\"type\":\"BasicTickFormatter\"},\"major_label_orientation\":\"horizontal\",\"ticker\":{\"id\":\"1121\",\"type\":\"BasicTicker\"}},\"id\":\"1120\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1151\",\"type\":\"BasicTickFormatter\"}],\"root_ids\":[\"1111\"]},\"title\":\"Bokeh Application\",\"version\":\"1.1.0\"}};\n",
       "  var render_items = [{\"docid\":\"ec29d801-f9da-420a-9466-1032e13e9649\",\"roots\":{\"1111\":\"a691dd80-318b-4c0a-bd6d-3c9489448c66\"}}];\n",
       "  root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
       "\n",
       "  }\n",
       "  if (root.Bokeh !== undefined) {\n",
       "    embed_document(root);\n",
       "  } else {\n",
       "    var attempts = 0;\n",
       "    var timer = setInterval(function(root) {\n",
       "      if (root.Bokeh !== undefined) {\n",
       "        embed_document(root);\n",
       "        clearInterval(timer);\n",
       "      }\n",
       "      attempts++;\n",
       "      if (attempts > 100) {\n",
       "        console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
       "        clearInterval(timer);\n",
       "      }\n",
       "    }, 10, root)\n",
       "  }\n",
       "})(window);</script>"
      ],
      "text/plain": [
       ":Path   [x,y]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print('The integral value is {} with the corresponding error of {}'.format(learner.igral, learner.err))\n",
    "learner.plot()"
   ]
  }
 ],
 "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.6.7"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "1656f5e0a29d4e4ea7a136324b9ea4ee": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.4.0",
      "model_name": "ButtonStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.4.0",
       "_model_name": "ButtonStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.1.0",
       "_view_name": "StyleView",
       "button_color": null,
       "font_weight": ""
      }
     },
     "439091c605b141e383e7dce0c2740cff": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.1.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.1.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.1.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": "none",
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": "100px"
      }
     },
     "67879aaf5e0d4de3a3c2ad4c401f2373": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.4.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.4.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.1.0",
       "_view_name": "StyleView",
       "description_width": ""
      }
     },
     "9c9de536c49e462a82cb9a75418b0c98": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.1.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.1.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.1.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "bbf59caea28d4bc8be45c4dc8334f5e5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.4.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.4.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.4.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_d551254b87974a709b6afc14ab79aebb",
        "IPY_MODEL_f1ac6c17057f485db8e2e9f72ad83821"
       ],
       "layout": "IPY_MODEL_f0862a79ad4647e896833f730c89bd11"
      }
     },
     "d551254b87974a709b6afc14ab79aebb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.4.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.4.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.4.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_tooltip": null,
       "layout": "IPY_MODEL_9c9de536c49e462a82cb9a75418b0c98",
       "placeholder": "​",
       "style": "IPY_MODEL_67879aaf5e0d4de3a3c2ad4c401f2373",
       "value": "\n        <dl>\n        <dt class=\"ignore-css\">status</dt><dd><font color=\"green\">finished</font></dd>\n<dt class=\"ignore-css\">elapsed time</dt><dd>0:00:08.355767</dd>\n<dt class=\"ignore-css\">overhead</dt><dd>65.58%</dd>\n<dt class=\"ignore-css\"># of points</dt><dd>16149</dd>\n        </dl>\n    "
      }
     },
     "f0862a79ad4647e896833f730c89bd11": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.1.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.1.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.1.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": "center",
       "align_self": null,
       "border": "solid 1px",
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": "200px"
      }
     },
     "f1ac6c17057f485db8e2e9f72ad83821": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.4.0",
      "model_name": "ButtonModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.4.0",
       "_model_name": "ButtonModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.4.0",
       "_view_name": "ButtonView",
       "button_style": "",
       "description": "cancel runner",
       "disabled": false,
       "icon": "",
       "layout": "IPY_MODEL_439091c605b141e383e7dce0c2740cff",
       "style": "IPY_MODEL_1656f5e0a29d4e4ea7a136324b9ea4ee",
       "tooltip": ""
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}