Skip to content

Instantly share code, notes, and snippets.

@gravitino
Created July 14, 2021 12:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gravitino/c6eb7c25697d6d515a7416f5ffeabda9 to your computer and use it in GitHub Desktop.
Save gravitino/c6eb7c25697d6d515a7416f5ffeabda9 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Inspecting heart beat lengths\n",
"\n",
"The binary mask gate_cupy is 1 for each position that starts a heartbeat and 0 otherwise. Subsequently, we want to transform this dense representation with many zeroes to a sparse one where one only stores the indices in the stream that start a heartbeat. You could write a CUDA-kernel using [warp-aggregated atomics](https://developer.nvidia.com/blog/cuda-pro-tip-optimized-filtering-warp-aggregated-atomics/) for that purpose. In CuPy, however, this can be achieved easier by filtering the index domain with the predicate gate==1. An adjacent difference (discrete derivative cupy.diff) computes the heartbeat lengths as index distance between positive gate positions. Finally, the computed lengths are visualized in a histogram."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def indices_and_lengths_cupy(gate):\n",
"\n",
" # all indices 0 1 2 3 4 5 6 ...\n",
" iota = cp.arange(len(gate))\n",
"\n",
" # after filtering with gate==1 it becomes 3 6 10\n",
" indices = iota[gate == 1]\n",
" lengths = cp.diff(indices)\n",
" \n",
" return indices, lengths"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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",
" if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
" root._bokeh_timeout = Date.now() + 5000;\n",
" root._bokeh_failed_load = false;\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",
" var skip = [];\n",
" if (window.requirejs) {\n",
" window.requirejs.config({'paths': {'deck.gl': 'https://cdn.jsdelivr.net/npm/@deck.gl/jupyter-widget@^8.1.2/dist/index', 'mapbox-gl': 'https://cdn.jsdelivr.net/npm/mapbox-gl@1.7.0/dist/mapbox-gl.min'}});\n",
" require([], function() {\n",
" })\n",
" }\n",
" if (((window['deck'] !== undefined) && (!(window['deck'] instanceof HTMLElement))) || window.requirejs) {\n",
" var urls = ['https://cdn.jsdelivr.net/npm/deck.gl@8.1.12/dist.min.js', 'https://cdn.jsdelivr.net/npm/@deck.gl/json@8.1.12/dist.min.js', 'https://cdn.jsdelivr.net/npm/@loaders.gl/csv@2.0.2/dist/dist.min.js', 'https://cdn.jsdelivr.net/npm/@loaders.gl/json@2.0.2/dist/dist.min.js', 'https://cdn.jsdelivr.net/npm/@loaders.gl/3d-tiles@2.0.2/dist/dist.min.js'];\n",
" for (var i = 0; i < urls.length; i++) {\n",
" skip.push(urls[i])\n",
" }\n",
" }\n",
" if (((window['mapboxgl'] !== undefined) && (!(window['mapboxgl'] instanceof HTMLElement))) || window.requirejs) {\n",
" var urls = ['https://api.mapbox.com/mapbox-gl-js/v1.7.0/mapbox-gl.js'];\n",
" for (var i = 0; i < urls.length; i++) {\n",
" skip.push(urls[i])\n",
" }\n",
" }\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" if (skip.indexOf(url) >= 0) { on_load(); continue; }\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",
"\tif (!js_urls.length) {\n",
" on_load()\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.jsdelivr.net/npm/deck.gl@8.1.12/dist.min.js\", \"https://cdn.jsdelivr.net/npm/@deck.gl/json@8.1.12/dist.min.js\", \"https://cdn.jsdelivr.net/npm/@loaders.gl/csv@2.0.2/dist/dist.min.js\", \"https://cdn.jsdelivr.net/npm/@loaders.gl/json@2.0.2/dist/dist.min.js\", \"https://cdn.jsdelivr.net/npm/@loaders.gl/3d-tiles@2.0.2/dist/dist.min.js\", \"https://api.mapbox.com/mapbox-gl-js/v1.7.0/mapbox-gl.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-2.2.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.2.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.2.3.min.js\", \"https://unpkg.com/@holoviz/panel@^0.10.3/dist/panel.min.js\"];\n",
" var css_urls = [\"https://api.mapbox.com/mapbox-gl-js/v1.7.0/mapbox-gl.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/card.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/json.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/markdown.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/widgets.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/alerts.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/dataframe.css\"];\n",
"\n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" inject_raw_css(\"\\n.dataframe table{\\n border: none;\\n}\\n\\n.panel-df table{\\n width: 100%;\\n border-collapse: collapse;\\n border: none;\\n}\\n.panel-df td{\\n white-space: nowrap;\\n overflow: auto;\\n text-overflow: ellipsis;\\n}\\n\");\n",
" },\n",
" function(Bokeh) {\n",
" inject_raw_css(\"\\n.multi-select{\\n color: white;\\n z-index: 100;\\n background: rgba(44,43,43,0.5);\\n border-radius: 1px;\\n width: 120px !important;\\n height: 30px !important;\\n}\\n.multi-select > .bk {\\n padding: 5px;\\n width: 120px !important;\\n height: 30px !important;\\n}\\n\\n.deck-chart {\\n z-index: 10;\\n position: initial !important;\\n}\\n\");\n",
" },\n",
" function(Bokeh) {\n",
" inject_raw_css(\"\\n .indicator {\\n text-align: center;\\n }\\n \");\n",
" },\n",
" function(Bokeh) {\n",
" inject_raw_css(\"\\n .indicator {\\n text-align: center;\\n }\\n \");\n",
" },\n",
" function(Bokeh) {\n",
" Bokeh.set_log_level(\"info\");\n",
" },\n",
" \n",
" function(Bokeh) {\n",
" (function(root, factory) {\n",
" factory(root[\"Bokeh\"]);\n",
" })(this, function(Bokeh) {\n",
" var define;\n",
" return (function outer(modules, entry) {\n",
" if (Bokeh != null) {\n",
" return Bokeh.register_plugin(modules, entry);\n",
" } else {\n",
" throw new Error(\"Cannot find Bokeh. You have to load it prior to loading plugins.\");\n",
" }\n",
" })\n",
" ({\n",
" \"custom/main\": function(require, module, exports) {\n",
" var models = {\n",
" \"CustomInspectTool\": require(\"custom/cuxfilter.charts.datashader.custom_extensions.graph_inspect_widget.custom_inspect_tool\").CustomInspectTool\n",
" };\n",
" require(\"base\").register_models(models);\n",
" module.exports = models;\n",
" },\n",
" \"custom/cuxfilter.charts.datashader.custom_extensions.graph_inspect_widget.custom_inspect_tool\": function(require, module, exports) {\n",
" \"use strict\";\n",
" var __importStar = (this && this.__importStar) || function (mod) {\n",
" if (mod && mod.__esModule) return mod;\n",
" var result = {};\n",
" if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n",
" result[\"default\"] = mod;\n",
" return result;\n",
" };\n",
" Object.defineProperty(exports, \"__esModule\", { value: true });\n",
" const inspect_tool_1 = require(\"models/tools/inspectors/inspect_tool\");\n",
" const p = __importStar(require(\"core/properties\"));\n",
" class CustomInspectToolView extends inspect_tool_1.InspectToolView {\n",
" connect_signals() {\n",
" super.connect_signals();\n",
" this.connect(this.model.properties.active.change, () => {\n",
" this.model._active = this.model.properties.active.spec.value;\n",
" });\n",
" }\n",
" }\n",
" exports.CustomInspectToolView = CustomInspectToolView;\n",
" CustomInspectToolView.__name__ = \"CustomInspectToolView\";\n",
" class CustomInspectTool extends inspect_tool_1.InspectTool {\n",
" constructor(attrs) {\n",
" super(attrs);\n",
" }\n",
" static init_CustomInspectTool() {\n",
" this.prototype.default_view = CustomInspectToolView;\n",
" this.define({\n",
" _active: [p.Instance],\n",
" icon: [p.String],\n",
" tool_name: [p.String]\n",
" });\n",
" }\n",
" }\n",
" exports.CustomInspectTool = CustomInspectTool;\n",
" CustomInspectTool.__name__ = \"CustomInspectTool\";\n",
" CustomInspectTool.init_CustomInspectTool();\n",
" //# sourceMappingURL=graph_inspect_widget.py:CustomInspectTool.js.map\n",
" }\n",
" }, \"custom/main\");\n",
" ;\n",
" });\n",
"\n",
" },\n",
" function(Bokeh) {} // ensure no trailing comma for IE\n",
" ];\n",
"\n",
" function run_inline_js() {\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",
" }\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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\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 var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'paths': {'deck.gl': 'https://cdn.jsdelivr.net/npm/@deck.gl/jupyter-widget@^8.1.2/dist/index', 'mapbox-gl': 'https://cdn.jsdelivr.net/npm/mapbox-gl@1.7.0/dist/mapbox-gl.min'}});\n require([], function() {\n })\n }\n if (((window['deck'] !== undefined) && (!(window['deck'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.jsdelivr.net/npm/deck.gl@8.1.12/dist.min.js', 'https://cdn.jsdelivr.net/npm/@deck.gl/json@8.1.12/dist.min.js', 'https://cdn.jsdelivr.net/npm/@loaders.gl/csv@2.0.2/dist/dist.min.js', 'https://cdn.jsdelivr.net/npm/@loaders.gl/json@2.0.2/dist/dist.min.js', 'https://cdn.jsdelivr.net/npm/@loaders.gl/3d-tiles@2.0.2/dist/dist.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n }\n if (((window['mapboxgl'] !== undefined) && (!(window['mapboxgl'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://api.mapbox.com/mapbox-gl-js/v1.7.0/mapbox-gl.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) >= 0) { on_load(); continue; }\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\tif (!js_urls.length) {\n on_load()\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.jsdelivr.net/npm/deck.gl@8.1.12/dist.min.js\", \"https://cdn.jsdelivr.net/npm/@deck.gl/json@8.1.12/dist.min.js\", \"https://cdn.jsdelivr.net/npm/@loaders.gl/csv@2.0.2/dist/dist.min.js\", \"https://cdn.jsdelivr.net/npm/@loaders.gl/json@2.0.2/dist/dist.min.js\", \"https://cdn.jsdelivr.net/npm/@loaders.gl/3d-tiles@2.0.2/dist/dist.min.js\", \"https://api.mapbox.com/mapbox-gl-js/v1.7.0/mapbox-gl.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-2.2.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.2.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.2.3.min.js\", \"https://unpkg.com/@holoviz/panel@^0.10.3/dist/panel.min.js\"];\n var css_urls = [\"https://api.mapbox.com/mapbox-gl-js/v1.7.0/mapbox-gl.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/card.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/json.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/markdown.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/widgets.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/alerts.css\", \"https://unpkg.com/@holoviz/panel@0.10.3/dist/css/dataframe.css\"];\n\n var inline_js = [\n function(Bokeh) {\n inject_raw_css(\"\\n.dataframe table{\\n border: none;\\n}\\n\\n.panel-df table{\\n width: 100%;\\n border-collapse: collapse;\\n border: none;\\n}\\n.panel-df td{\\n white-space: nowrap;\\n overflow: auto;\\n text-overflow: ellipsis;\\n}\\n\");\n },\n function(Bokeh) {\n inject_raw_css(\"\\n.multi-select{\\n color: white;\\n z-index: 100;\\n background: rgba(44,43,43,0.5);\\n border-radius: 1px;\\n width: 120px !important;\\n height: 30px !important;\\n}\\n.multi-select > .bk {\\n padding: 5px;\\n width: 120px !important;\\n height: 30px !important;\\n}\\n\\n.deck-chart {\\n z-index: 10;\\n position: initial !important;\\n}\\n\");\n },\n function(Bokeh) {\n inject_raw_css(\"\\n .indicator {\\n text-align: center;\\n }\\n \");\n },\n function(Bokeh) {\n inject_raw_css(\"\\n .indicator {\\n text-align: center;\\n }\\n \");\n },\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n (function(root, factory) {\n factory(root[\"Bokeh\"]);\n })(this, function(Bokeh) {\n var define;\n return (function outer(modules, entry) {\n if (Bokeh != null) {\n return Bokeh.register_plugin(modules, entry);\n } else {\n throw new Error(\"Cannot find Bokeh. You have to load it prior to loading plugins.\");\n }\n })\n ({\n \"custom/main\": function(require, module, exports) {\n var models = {\n \"CustomInspectTool\": require(\"custom/cuxfilter.charts.datashader.custom_extensions.graph_inspect_widget.custom_inspect_tool\").CustomInspectTool\n };\n require(\"base\").register_models(models);\n module.exports = models;\n },\n \"custom/cuxfilter.charts.datashader.custom_extensions.graph_inspect_widget.custom_inspect_tool\": function(require, module, exports) {\n \"use strict\";\n var __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n };\n Object.defineProperty(exports, \"__esModule\", { value: true });\n const inspect_tool_1 = require(\"models/tools/inspectors/inspect_tool\");\n const p = __importStar(require(\"core/properties\"));\n class CustomInspectToolView extends inspect_tool_1.InspectToolView {\n connect_signals() {\n super.connect_signals();\n this.connect(this.model.properties.active.change, () => {\n this.model._active = this.model.properties.active.spec.value;\n });\n }\n }\n exports.CustomInspectToolView = CustomInspectToolView;\n CustomInspectToolView.__name__ = \"CustomInspectToolView\";\n class CustomInspectTool extends inspect_tool_1.InspectTool {\n constructor(attrs) {\n super(attrs);\n }\n static init_CustomInspectTool() {\n this.prototype.default_view = CustomInspectToolView;\n this.define({\n _active: [p.Instance],\n icon: [p.String],\n tool_name: [p.String]\n });\n }\n }\n exports.CustomInspectTool = CustomInspectTool;\n CustomInspectTool.__name__ = \"CustomInspectTool\";\n CustomInspectTool.init_CustomInspectTool();\n //# sourceMappingURL=graph_inspect_widget.py:CustomInspectTool.js.map\n }\n }, \"custom/main\");\n ;\n });\n\n },\n function(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\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 }\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": {
"application/javascript": [
"\n",
"if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n",
" window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n",
"}\n",
"\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",
" } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n",
" google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n",
" var messages = comm.messages[Symbol.asyncIterator]();\n",
" function processIteratorResult(result) {\n",
" var message = result.value;\n",
" console.log(message)\n",
" var content = {data: message.data, comm_id};\n",
" var buffers = []\n",
" for (var buffer of message.buffers || []) {\n",
" buffers.push(new DataView(buffer))\n",
" }\n",
" var metadata = message.metadata || {};\n",
" var msg = {content, buffers, metadata}\n",
" msg_handler(msg);\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" return messages.next().then(processIteratorResult);\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",
" } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n",
" var comm_promise = google.colab.kernel.comms.open(comm_id)\n",
" comm_promise.then((comm) => {\n",
" window.PyViz.comms[comm_id] = comm;\n",
" if (msg_handler) {\n",
" var messages = comm.messages[Symbol.asyncIterator]();\n",
" function processIteratorResult(result) {\n",
" var message = result.value;\n",
" var content = {data: message.data};\n",
" var metadata = message.metadata || {comm_id};\n",
" var msg = {content, metadata}\n",
" msg_handler(msg);\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" }) \n",
" var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n",
" return comm_promise.then((comm) => {\n",
" comm.send(data, metadata, buffers, disposeOnDone);\n",
" });\n",
" };\n",
" var comm = {\n",
" send: sendClosure\n",
" };\n",
" }\n",
" window.PyViz.comms[comm_id] = comm;\n",
" return comm;\n",
" }\n",
" window.PyViz.comm_manager = new JupyterCommManager();\n",
" \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"
],
"application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\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 } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\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 } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction 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 */\nfunction 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 */\nfunction 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 */\nfunction 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 */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction 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\nif (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"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.holoviews_exec.v0+json": "",
"text/html": [
"<div id='1430'>\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" <div class=\"bk-root\" id=\"d47a504f-f0dd-465b-bda4-b1645bfcdd02\" data-root-id=\"1430\"></div>\n",
"</div>\n",
"<script type=\"application/javascript\">(function(root) {\n",
" function embed_document(root) {\n",
" var docs_json = {\"b36ce39a-6e74-4177-ab1f-39faa56c82b8\":{\"roots\":{\"references\":[{\"attributes\":{\"align\":\"center\",\"text\":\"Segment lengths\"},\"id\":\"1428\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1436\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"1412\"},\"dimension\":1,\"ticker\":null},\"id\":\"1415\",\"type\":\"Grid\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"top\":{\"field\":\"top\"},\"width\":{\"value\":0.9},\"x\":{\"field\":\"x\"}},\"id\":\"1424\",\"type\":\"VBar\"},{\"attributes\":{},\"id\":\"1416\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1404\",\"type\":\"LinearScale\"},{\"attributes\":{\"data_source\":{\"id\":\"1398\"},\"glyph\":{\"id\":\"1424\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1425\"},\"selection_glyph\":null,\"view\":{\"id\":\"1427\"}},\"id\":\"1426\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"below\":[{\"id\":\"1408\"}],\"center\":[{\"id\":\"1411\"},{\"id\":\"1415\"}],\"height\":300,\"left\":[{\"id\":\"1412\"}],\"renderers\":[{\"id\":\"1426\"}],\"subscribed_events\":[\"reset\"],\"title\":{\"id\":\"1428\"},\"toolbar\":{\"id\":\"1419\"},\"width\":600,\"x_range\":{\"id\":\"1400\"},\"x_scale\":{\"id\":\"1404\"},\"y_range\":{\"id\":\"1402\"},\"y_scale\":{\"id\":\"1406\"}},\"id\":\"1399\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1402\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1437\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data\":{\"top\":{\"__ndarray__\":\"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q43EPqSjZ9+rjcQ+pKNn36uNxD6ko2ffq43EPqSjZ9+rjcQ+pKNn36uNxD6ko2ffq43EPqSjZ9+rjcQ+jqNn36uNxD6Oo2ffq43EPo6jZ9+rjcQ+jqNn36uNxD6Oo2ffq43EPo6jZ9+rjcQ+jqNn36uNxD6Oo2ffq43EPo6jZ9+rjcQ+jqNn36uNxD6Oo2ffq43EPo6jZ9+rjcQ+jqNn36uNxD6Oo2ffq43EPo6jZ9+rjcQ+pKNn36uNtD6ko2ffq420PqSjZ9+rjbQ+pKNn36uNtD6ko2ffq420PqSjZ9+rjbQ+pKNn36uNtD6ko2ffq420PqSjZ9+rjbQ+pKNn36uNtD6ko2ffq420PqSjZ9+rjbQ+pKNn36uNtD6ko2ffq420PqSjZ9+rjbQ+pKNn36uNxD6ko2ffq43EPqSjZ9+rjcQ+pKNn36uNxD6ko2ffq43EPqSjZ9+rjcQ+pKNn36uNxD6ko2ffq43EPqSjZ9+rjcQ+pKNn36uNxD6ko2ffq43EPqSjZ9+rjcQ+pKNn36uNxD6ko2ffq43EPqSjZ9+rjcQ+pKNn36uNpD6ko2ffq42kPqSjZ9+rjaQ+pKNn36uNpD6ko2ffq42kPqSjZ9+rjaQ+pKNn36uNpD6ko2ffq42kPqSjZ9+rjaQ+pKNn36uNpD6ko2ffq42kPqSjZ9+rjaQ+pKNn36uNpD6ko2ffq42kPqSjZ9+rjaQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuqNn36uNtD66o2ffq420PrqjZ9+rjbQ+uqNn36uNtD66o2ffq420PrqjZ9+rjbQ+uqNn36uNtD66o2ffq420PrqjZ9+rjbQ+uqNn36uNtD66o2ffq420PrqjZ9+rjbQ+uqNn36uNtD66o2ffq420PrqjZ9+rjbQ+jqNn36uNtD6Oo2ffq420Po6jZ9+rjbQ+jqNn36uNtD6Oo2ffq420Po6jZ9+rjbQ+jqNn36uNtD6Oo2ffq420Po6jZ9+rjbQ+jqNn36uNtD6Oo2ffq420Po6jZ9+rjbQ+jqNn36uNtD6Oo2ffq420Po6jZ9+rjbQ+\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[450]},\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[450]}},\"selected\":{\"id\":\"1438\"},\"selection_policy\":{\"id\":\"1437\"}},\"id\":\"1398\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1434\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis_label\":\"\",\"formatter\":{\"id\":\"1434\"},\"ticker\":{\"id\":\"1413\"}},\"id\":\"1412\",\"type\":\"LinearAxis\"},{\"attributes\":{\"client_comm_id\":\"17eb772c7554429eb46389951e71951b\",\"comm_id\":\"6863b11275fd4b72852384b9a4415e51\",\"plot_id\":\"1430\"},\"id\":\"1471\",\"type\":\"panel.models.comm_manager.CommManager\"},{\"attributes\":{},\"id\":\"1409\",\"type\":\"BasicTicker\"},{\"attributes\":{\"children\":[{\"id\":\"1399\"}],\"margin\":[0,0,0,0],\"name\":\"Row00070\"},\"id\":\"1430\",\"type\":\"Row\"},{\"attributes\":{},\"id\":\"1413\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1406\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1400\",\"type\":\"DataRange1d\"},{\"attributes\":{\"source\":{\"id\":\"1398\"}},\"id\":\"1427\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"top\":{\"field\":\"top\"},\"width\":{\"value\":0.9},\"x\":{\"field\":\"x\"}},\"id\":\"1425\",\"type\":\"VBar\"},{\"attributes\":{\"axis\":{\"id\":\"1408\"},\"ticker\":null},\"id\":\"1411\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1418\",\"type\":\"ResetTool\"},{\"attributes\":{\"formatter\":{\"id\":\"1436\"},\"ticker\":{\"id\":\"1409\"}},\"id\":\"1408\",\"type\":\"LinearAxis\"},{\"attributes\":{\"active_drag\":{\"id\":\"1416\"},\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":{\"id\":\"1417\"},\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1416\"},{\"id\":\"1417\"},{\"id\":\"1418\"}]},\"id\":\"1419\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1417\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1438\",\"type\":\"Selection\"}],\"root_ids\":[\"1430\",\"1471\"]},\"title\":\"Bokeh Application\",\"version\":\"2.2.3\"}};\n",
" var render_items = [{\"docid\":\"b36ce39a-6e74-4177-ab1f-39faa56c82b8\",\"root_ids\":[\"1430\"],\"roots\":{\"1430\":\"d47a504f-f0dd-465b-bda4-b1645bfcdd02\"}}];\n",
" root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
" }\n",
" if (root.Bokeh !== undefined && root.Bokeh.Panel !== undefined && root['deck'] !== undefined ) {\n",
" embed_document(root);\n",
" } else {\n",
" var attempts = 0;\n",
" var timer = setInterval(function(root) {\n",
" if (root.Bokeh !== undefined && root.Bokeh.Panel !== undefined && root['deck'] !== undefined) {\n",
" clearInterval(timer);\n",
" embed_document(root);\n",
" } else if (document.readyState == \"complete\") {\n",
" attempts++;\n",
" if (attempts > 100) {\n",
" clearInterval(timer);\n",
" console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
" }\n",
" }\n",
" }, 10, root)\n",
" }\n",
"})(window);</script>"
],
"text/plain": [
"Bokeh(Figure)"
]
},
"execution_count": 10,
"metadata": {
"application/vnd.holoviews_exec.v0+json": {
"id": "1430"
}
},
"output_type": "execute_result"
}
],
"source": [
"from cuxfilter.charts import bar\n",
"\n",
"# inspect the segment lengths, we will later prune very long and short segments\n",
"indices_cupy, lengths_cupy = indices_and_lengths_cupy(gate_cupy)\n",
"\n",
"# currently, cuxfilter doesn't support histogram chart with density=True,\n",
"# so we will create a histogram chart from a bar chart\n",
"BINS=30\n",
"lengths_hist_cupy = cp.histogram(lengths_cupy, bins=BINS, density=True)\n",
"\n",
"hist_range = cp.max(lengths_cupy) - cp.min(lengths_cupy)\n",
"hist_width = int(hist_range/BINS)\n",
"\n",
"lengths_cudf = cudf.DataFrame({'length': lengths_hist_cupy[0]})\n",
"lengths_cudf = lengths_cudf.loc[lengths_cudf.index.repeat(hist_width)]\n",
"lengths_cudf['x'] = cp.arange(0, BINS * hist_width) + cp.min(lengths_cupy)\n",
"\n",
"bar_cux = bar(x='x', y='length', add_interaction=False)\n",
"\n",
"_ = cux.DataFrame.from_dataframe(lengths_cudf).dashboard([bar_cux])\n",
"bar_cux.chart.title.text = 'Segment lengths'\n",
"bar_cux.chart.title.align = 'center'\n",
"bar_cux.chart.left[0].axis_label = \"\"\n",
"bar_cux.chart.width = WIDTH\n",
"bar_cux.chart.height = HEIGHT\n",
"bar_cux.view()[0]"
]
},
{
"attachments": {
"fe405d68-4f40-4a15-8f04-7f2fda9ad339.png": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5UAAAHhCAIAAABx5g16AAAgAElEQVR4Aey9C1xUV57vW53bPT0z3TPnzjl37sx09+Rzz71zH3N7evo5M6d7mINzpsqoKA9JfMRoYgQT7WjQJgnlC4yaB7ETNaYTTbSCEt4PeYOKihoURUARDSoqIG8BKUAeRdU+H9jWZltVe++qzV671sJfffzEtdde6///7+9vre0vm6LKwOEFAiAAAiAAAiAAAiAAAuwQMLBTKioFARAAARAAARAAARAAAQ7+FYsABEAABEAABEAABECAJQLwryyphVpBAARAAARAAARAAATgX7EGQAAEQAAEQAAEQAAEWCIA/8qSWqgVBEAABEAABEAABEAA/hVrAARAAARAAARAAARAgCUC8K8sqYVaQQAEQAAEQAAEQAAE4F+xBkAABEAABEAABEAABFgiAP/KklqoFQRAAARAAARAAARAAP4VawAEQAAEQAAEQAAEQIAlAvCvLKmFWkEABEAABEAABEAABOBfsQZAAARAAARAAARAAARYIgD/ypJaqBUEQAAEQAAEQAAEQAD+FWsABEAABEAABEAABECAJQLwryyphVpBAARAAARAAARAAATgX7EGQAAEQAAEQAAEQAAEWCIA/8qSWqgVBEAABEAABEAABEAA/hVrAARAAARAAARAAARAgCUC8K8sqYVaQQAEQAAEQAAEQAAE4F+xBkAABEAABEAABEAABFgiAP/KklqoFQRAAARAAARAAARAAP4VawAEQAAEQAAEQAAEQIAlAvCvLKmFWkEABEAABEAABEAABOBfsQZAAARAAARAAARAAARYIgD/ypJaqBUEQGB6ECgsLDROvC5cuOD3K1q0aJHRaHzttdf8XgkKAAEQAAEvCcC/egkKw0AABDQjcOnSpbfffvv555+fPXv2rFmzFixYsGHDhjNnzmiWwN+BGhsbExISrl27JlWIH/2re23wr1IyoR8EQIBaAvCv1EqDwkBgehJISkriHz26//fw4cPT45o//vhjo9GYmZkpdTl+9K/utcG/SsmEfhAAAWoJwL9SKw0KA4FpSKC7u3vmzJlGo/G5554rKytraWlpbm7Ozc0NCgoyGo2zZs26f/8+65dtt9sXLFhAp3/1WBv8K+tLDvWDwBNIAP71CRQdlwwCfiNw8eJF/rHrV199JS4iNzc3JiZm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"
}
},
"cell_type": "markdown",
"metadata": {},
"source": [
"![image.png](attachment:fe405d68-4f40-4a15-8f04-7f2fda9ad339.png)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment