diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 4bbfa50b1..531f96f98 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -17,6 +17,10 @@ This form is written in GitHub's Markdown format. For a reference on this type of syntax, see GitHub's documentation: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax +This template contains guidance for your submission within the < ! - -, - - > blocks. +These are comments in HTML syntax and will not appear in the submission. +Be sure to use the "Preview" feature on GitHub to ensure your submission is formatted as intended. + When including code snippets, please paste the text itself and wrap the code block with ticks (see the other character on the tilde ~ key in a US keyboard) to format it as code. For example, Python code should be wrapped in ticks like this: diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index c4d7fe27c..221ab53c5 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -16,6 +16,10 @@ This form is written in GitHub's Markdown format. For a reference on this type of syntax, see GitHub's documentation: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax +This template contains guidance for your submission within the < ! - -, - - > blocks. +These are comments in HTML syntax and will not appear in the submission. +Be sure to use the "Preview" feature on GitHub to ensure your submission is formatted as intended. + When including code snippets, please paste the text itself and wrap the code block with ticks (see the other character on the tilde ~ key in a US keyboard) to format it as code. For example, Python code should be wrapped in ticks like this: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7fff63847..1d4a4b35e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -14,6 +14,10 @@ This form is written in GitHub's Markdown format. For a reference on this type of syntax, see GitHub's documentation: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax +This template contains guidance for your submission within the < ! - -, - - > blocks. +These are comments in HTML syntax and will not appear in the submission. +Be sure to use the "Preview" feature on GitHub to ensure your submission is formatted as intended. + When including code snippets, please paste the text itself and wrap the code block with ticks (see the other character on the tilde ~ key in a US keyboard) to format it as code. For example, Python code should be wrapped in ticks like this: diff --git a/.gitignore b/.gitignore index 5693c7c46..97fbbddb2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ __pycache__/ dist build .pytest_cache +.ruff_cache # pip meta data pip-wheel-metadata diff --git a/docs/code_quality.ipynb b/docs/code_quality.ipynb index afe3491a8..6e07d0f77 100644 --- a/docs/code_quality.ipynb +++ b/docs/code_quality.ipynb @@ -30,9 +30,17 @@ { "data": { "text/html": [ - "
\n", - " \n", - " Loading BokehJS ...\n", + "\n", + "
\n", + " \n", + " Loading BokehJS ...\n", "
\n" ] }, @@ -41,7 +49,7 @@ }, { "data": { - "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const 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\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const 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 const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const 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 const cmd_clean = \"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_clean, {\n iopub: {\n output: function(msg) {\n const 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 const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const 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 const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\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 const 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 const 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 const events = require('base/js/events');\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\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 \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"1002\");\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 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(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\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 const cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\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/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const 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\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const 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 const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const 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 const cmd_clean = \"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_clean, {\n iopub: {\n output: function(msg) {\n const 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 const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const 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 const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\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 const 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 const 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 const events = require('base/js/events');\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\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 \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"p1001\");\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 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(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\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 const cell = $(document.getElementById(\"p1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\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.bokehjs_load.v0+json": "" }, "metadata": {}, @@ -60,19 +68,27 @@ "\n", "columns = [\"commit_hash\", \"commit_hash_8char\", \"date\", \"jensen\", \"gauss\", \"gch\", \"cc\", \"code_coverage\", \"tooltip_label\"]\n", "data = [\n", - " (\"df25a9cfacd3d652361d2bd37f568af00acb2631\", \"df25a9cf\", datetime(2021,12, 29), 1.2691, 1.2584, 1.6432, None, 0.4344, \"df25a9cf\"),\n", - " (\"b797390a43298a815f3ff57955cfdc71ecf3e866\", \"b797390a\", datetime(2022, 1, 3), 0.6867, 1.2354, 1.8026, None, 0.2993, \"b797390a\"),\n", - " (\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\", \"01a02d5f\", datetime(2022, 1, 4), 0.4227, 0.9118, 1.4492, None, 0.3022, \"01a02d5f\"),\n", - " (\"dd847210082035d43b0273ae63a76a53cb8d2e12\", \"dd847210\", datetime(2022, 1, 6), 0.4081, 0.9049, 1.5270, None, 0.3627, \"dd847210\"),\n", - " (\"33779269e98cc882a5f066c462d8ec1eadf37a1a\", \"33779269\", datetime(2022, 1, 10), 0.4147, 0.9126, 1.5391, None, 0.3690, \"33779269\"),\n", - " (\"12890e029a7155b074b9b325d320d1798338e287\", \"12890e02\", datetime(2022, 1, 11), 0.4152, 0.9070, 1.5128, None, 0.3682, \"12890e02\"),\n", - " (\"66dafc08bd620d96deda7d526b0e4bfc3b086650\", \"66dafc08\", datetime(2022, 1, 12), 0.4204, 0.9005, 1.5031, None, 0.3709, \"66dafc08\"),\n", - " (\"a325819b3b03b84bd76ad455e3f9b4600744ba14\", \"a325819b\", datetime(2022, 1, 13), 0.4250, 0.9043, 1.5006, None, 0.3709, \"a325819b\"),\n", - " (\"8a2c1a610295c007f0222ce737723c341189811d\", \"8a2c1a61\", datetime(2022, 1, 14), 0.4258, 0.9197, 1.5082, None, 0.3708, \"8a2c1a61\"),\n", - " (\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\", \"c6bc79b0\", datetime(2022, 1, 14), 0.4270, 0.8828, 1.4818, None, 0.3701, \"c6bc79b0\"),\n", - " (\"03e1f461c152e4f221fe92c834f2787680cf5772\", \"03e1f461\", datetime(2022, 1, 18), 0.4621, 0.9151, 1.5274, 2.0719, 0.3673, \"PR #56\"),\n", - " (\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\", \"9e96d6c4\", datetime(2022, 1, 19), 0.4659, 0.9056, 1.5061, 2.0561, 0.3825, \"v3.0rc1\"),\n", - " (\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\", \"2a98428f\", datetime(2022, 2, 11), 0.2996, 0.9091, 1.5168, 2.0349, 0.3824, \"PR #317\"),\n", + " (\"df25a9cfacd3d652361d2bd37f568af00acb2631\", \"df25a9cf\", datetime(2021, 12, 29), 1.2691, 1.2584, 1.6432, None, 0.4344, \"df25a9cf\"),\n", + " (\"b797390a43298a815f3ff57955cfdc71ecf3e866\", \"b797390a\", datetime(2022, 1, 3), 0.6867, 1.2354, 1.8026, None, 0.2993, \"b797390a\"),\n", + " (\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\", \"01a02d5f\", datetime(2022, 1, 4), 0.4227, 0.9118, 1.4492, None, 0.3022, \"01a02d5f\"),\n", + " (\"dd847210082035d43b0273ae63a76a53cb8d2e12\", \"dd847210\", datetime(2022, 1, 6), 0.4081, 0.9049, 1.5270, None, 0.3627, \"dd847210\"),\n", + " (\"33779269e98cc882a5f066c462d8ec1eadf37a1a\", \"33779269\", datetime(2022, 1, 10), 0.4147, 0.9126, 1.5391, None, 0.3690, \"33779269\"),\n", + " (\"12890e029a7155b074b9b325d320d1798338e287\", \"12890e02\", datetime(2022, 1, 11), 0.4152, 0.9070, 1.5128, None, 0.3682, \"12890e02\"),\n", + " (\"66dafc08bd620d96deda7d526b0e4bfc3b086650\", \"66dafc08\", datetime(2022, 1, 12), 0.4204, 0.9005, 1.5031, None, 0.3709, \"66dafc08\"),\n", + " (\"a325819b3b03b84bd76ad455e3f9b4600744ba14\", \"a325819b\", datetime(2022, 1, 13), 0.4250, 0.9043, 1.5006, None, 0.3709, \"a325819b\"),\n", + " (\"8a2c1a610295c007f0222ce737723c341189811d\", \"8a2c1a61\", datetime(2022, 1, 14), 0.4258, 0.9197, 1.5082, None, 0.3708, \"8a2c1a61\"),\n", + " (\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\", \"c6bc79b0\", datetime(2022, 1, 14), 0.4270, 0.8828, 1.4818, None, 0.3701, \"c6bc79b0\"),\n", + " (\"03e1f461c152e4f221fe92c834f2787680cf5772\", \"03e1f461\", datetime(2022, 1, 18), 0.4621, 0.9151, 1.5274, 2.0719, 0.3673, \"PR #56\"),\n", + " (\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\", \"9e96d6c4\", datetime(2022, 1, 19), 0.4659, 0.9056, 1.5061, 2.0561, 0.3825, \"v3.0rc1\"),\n", + " (\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\", \"2a98428f\", datetime(2022, 2, 11), 0.2996, 0.9091, 1.5168, 2.0349, 0.3824, \"PR #317\"),\n", + " (\"9b4e85cf1b41ba7001aaba1a830b93e176f3dd43\", \"9b4e85cf\", datetime(2022, 3, 1), 0.3149, 0.9785, 1.5866, 2.1160, 0.1572, \"v3.0\"),\n", + " (\"d18f4d263ecabf502242592f9d60815a07c7b89c\", \"d18f4d26\", datetime(2022, 3, 4), 0.3155, 0.9814, 1.5938, 2.1226, 0.1572, \"v3.0.1\"),\n", + " (\"a23241bb9e45078e36a4662d48c9d3fe0c3316e4\", \"a23241bb\", datetime(2022, 4, 6), 0.3194, 0.9837, 1.5738, 2.0836, 0.1682, \"v3.1\"),\n", + " (\"c2006b0011a5df036c306c15e75763ec492dafda\", \"c2006b00\", datetime(2022, 6, 22), 0.3168, 0.9827, 1.5993, 2.0720, 0.1681, \"v3.1.1\"),\n", + " (\"0c2adf3e702b6427da946a6ba9dbedbea22738be\", \"0c2adf3e\", datetime(2022, 9, 16), 0.3239, 0.9861, 1.5735, 2.4211, 0.1502, \"v3.2\"),\n", + " (\"39c466000b1874e06a6f58da9c30bb877fc8d4d2\", \"39c46600\", datetime(2022, 11, 20), 0.3242, 0.9905, 1.5766, 2.1132, 0.1899, \"v3.2.1\"),\n", + " (\"8436fd78b002e5792f5d0dd1409332d171036d49\", \"8436fd78\", datetime(2023, 2, 8), 0.3285, 0.9904, 1.5838, 2.0666, 0.1905, \"v3.2.2\"),\n", + " (\"16628a0ba45a675df762245694e0a7666a3478f8\", \"16628a0b\", datetime(2023, 3, 7), 0.3599, 1.0296, 1.7992, 2.4483, 0.1972, \"v3.3\"),\n", "]\n", "\n", "df = pd.DataFrame(data=data, columns=columns)\n", @@ -92,7 +108,7 @@ "data": { "text/html": [ "\n", - "
\n" + "
\n" ] }, "metadata": {}, @@ -100,12 +116,12 @@ }, { "data": { - "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"a5ebcb57-ca23-495f-bcbf-8f77d9804a82\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1016\"}],\"center\":[{\"id\":\"1019\"},{\"id\":\"1023\"},{\"id\":\"1068\"}],\"height\":450,\"left\":[{\"id\":\"1020\"}],\"renderers\":[{\"id\":\"1044\"},{\"id\":\"1074\"},{\"id\":\"1102\"},{\"id\":\"1131\"},{\"id\":\"1159\"},{\"id\":\"1188\"},{\"id\":\"1216\"},{\"id\":\"1245\"}],\"title\":{\"id\":\"1006\"},\"toolbar\":{\"id\":\"1032\"},\"x_range\":{\"id\":\"1008\"},\"x_scale\":{\"id\":\"1012\"},\"y_range\":{\"id\":\"1010\"},\"y_scale\":{\"id\":\"1014\"}},\"id\":\"1005\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"git ref\",\"@tooltip_label\"]]},\"id\":\"1031\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"months\":[0,4,8]},\"id\":\"1065\",\"type\":\"MonthsTicker\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1052\",\"type\":\"AllLabels\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1030\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1051\",\"type\":\"DatetimeTickFormatter\"},{\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]},\"id\":\"1063\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1071\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1073\"},\"nonselection_glyph\":{\"id\":\"1072\"},\"view\":{\"id\":\"1075\"}},\"id\":\"1074\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"months\":[0,2,4,6,8,10]},\"id\":\"1064\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,15]},\"id\":\"1062\",\"type\":\"DaysTicker\"},{\"attributes\":{},\"id\":\"1049\",\"type\":\"AllLabels\"},{\"attributes\":{\"months\":[0,6]},\"id\":\"1066\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},\"id\":\"1059\",\"type\":\"DaysTicker\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]},\"id\":\"1060\",\"type\":\"DaysTicker\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1043\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1185\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1187\"},\"nonselection_glyph\":{\"id\":\"1186\"},\"view\":{\"id\":\"1189\"}},\"id\":\"1188\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1067\",\"type\":\"YearsTicker\"},{\"attributes\":{\"days\":[1,8,15,22]},\"id\":\"1061\",\"type\":\"DaysTicker\"},{\"attributes\":{\"border_line_color\":\"black\",\"click_policy\":\"mute\",\"coordinates\":null,\"group\":null,\"items\":[{\"id\":\"1069\"},{\"id\":\"1126\"},{\"id\":\"1183\"},{\"id\":\"1240\"}],\"location\":\"bottom_left\"},\"id\":\"1068\",\"type\":\"Legend\"},{\"attributes\":{\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"max_interval\":1800000.0,\"min_interval\":1000.0,\"num_minor_ticks\":0},\"id\":\"1057\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1189\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"red\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1186\",\"type\":\"Circle\"},{\"attributes\":{\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1213\",\"type\":\"Line\"},{\"attributes\":{\"mantissas\":[1,2,5],\"max_interval\":500.0,\"num_minor_ticks\":0},\"id\":\"1056\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"red\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1187\",\"type\":\"Circle\"},{\"attributes\":{\"fill_color\":{\"value\":\"blue\"},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1071\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1156\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1158\"},\"nonselection_glyph\":{\"id\":\"1157\"},\"view\":{\"id\":\"1160\"}},\"id\":\"1159\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1029\",\"type\":\"HelpTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1242\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1244\"},\"nonselection_glyph\":{\"id\":\"1243\"},\"view\":{\"id\":\"1246\"}},\"id\":\"1245\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1042\",\"type\":\"Line\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1215\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"cc\"},\"renderers\":[{\"id\":\"1216\"},{\"id\":\"1245\"}]},\"id\":\"1240\",\"type\":\"LegendItem\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"cyan\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1243\",\"type\":\"Circle\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1214\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1217\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1027\",\"type\":\"SaveTool\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1246\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"cyan\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1244\",\"type\":\"Circle\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1075\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1072\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1099\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1101\"},\"nonselection_glyph\":{\"id\":\"1100\"},\"view\":{\"id\":\"1103\"}},\"id\":\"1102\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"id\":\"1056\"},{\"id\":\"1057\"},{\"id\":\"1058\"},{\"id\":\"1059\"},{\"id\":\"1060\"},{\"id\":\"1061\"},{\"id\":\"1062\"},{\"id\":\"1063\"},{\"id\":\"1064\"},{\"id\":\"1065\"},{\"id\":\"1066\"},{\"id\":\"1067\"}]},\"id\":\"1017\",\"type\":\"DatetimeTicker\"},{\"attributes\":{\"fill_color\":{\"value\":\"green\"},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1128\",\"type\":\"Circle\"},{\"attributes\":{\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1099\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1160\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1073\",\"type\":\"Circle\"},{\"attributes\":{\"axis_label\":\"Commit date\",\"coordinates\":null,\"formatter\":{\"id\":\"1051\"},\"group\":null,\"major_label_policy\":{\"id\":\"1052\"},\"ticker\":{\"id\":\"1017\"}},\"id\":\"1016\",\"type\":\"DatetimeAxis\"},{\"attributes\":{\"label\":{\"value\":\"gch\"},\"renderers\":[{\"id\":\"1159\"},{\"id\":\"1188\"}]},\"id\":\"1183\",\"type\":\"LegendItem\"},{\"attributes\":{\"axis\":{\"id\":\"1016\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1157\",\"type\":\"Line\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"green\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1129\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"green\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1130\",\"type\":\"Circle\"},{\"attributes\":{\"fill_color\":{\"value\":\"cyan\"},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1242\",\"type\":\"Circle\"},{\"attributes\":{\"axis_label\":\"Time to solution (s)\",\"coordinates\":null,\"formatter\":{\"id\":\"1048\"},\"group\":null,\"major_label_policy\":{\"id\":\"1049\"},\"ticker\":{\"id\":\"1021\"}},\"id\":\"1020\",\"type\":\"LinearAxis\"},{\"attributes\":{\"overlay\":{\"id\":\"1030\"}},\"id\":\"1026\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1045\",\"type\":\"CDSView\"},{\"attributes\":{\"data\":{\"cc\":{\"__ndarray__\":\"AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H/BqKROQJMAQN5xio7kcgBADwu1pnlHAEA=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"code_coverage\":{\"__ndarray__\":\"PnlYqDXN2z/WVuwvuyfTPxB6Nqs+V9M/vJaQD3o21z8EVg4tsp3XP+PHmLuWkNc/lIeFWtO81z+Uh4Va07zXP9DVVuwvu9c/cvkP6bev1z/9h/Tb14HXP3sUrkfhetg/t2J/2T152D8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"commit_hash\":[\"df25a9cfacd3d652361d2bd37f568af00acb2631\",\"b797390a43298a815f3ff57955cfdc71ecf3e866\",\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\",\"dd847210082035d43b0273ae63a76a53cb8d2e12\",\"33779269e98cc882a5f066c462d8ec1eadf37a1a\",\"12890e029a7155b074b9b325d320d1798338e287\",\"66dafc08bd620d96deda7d526b0e4bfc3b086650\",\"a325819b3b03b84bd76ad455e3f9b4600744ba14\",\"8a2c1a610295c007f0222ce737723c341189811d\",\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\",\"03e1f461c152e4f221fe92c834f2787680cf5772\",\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\",\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\"],\"commit_hash_8char\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"03e1f461\",\"9e96d6c4\",\"2a98428f\"],\"date\":{\"__ndarray__\":\"AACAyDfgd0IAAEDF0+F3QgAAACsm4ndCAACA9srid0IAAICNFOR3QgAAQPNm5HdCAAAAWbnkd0IAAMC+C+V3QgAAgCRe5XdCAACAJF7ld0IAAIC7p+Z3QgAAQCH65ndCAACARWHud0I=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"gauss\":{\"__ndarray__\":\"GJXUCWgi9D+Hp1fKMsTzPwXFjzF3Le0/FNBE2PD07D8VjErqBDTtP6AaL90kBu0/N4lBYOXQ7D/HuriNBvDsP8oyxLEubu0/5BQdyeU/7D8qOpLLf0jtP0I+6Nms+uw/LGUZ4lgX7T8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"gch\":{\"__ndarray__\":\"X5hMFYxK+j9IUPwYc9f8P6vP1VbsL/c/O99PjZdu+D+qYFRSJ6D4P4Y41sVtNPg/seHplbIM+D+mCkYldQL4PzY8vVKWIfg/oWez6nO19z8AkX77OnD4P/AWSFD8GPg/MCqpE9BE+D8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12],\"jensen\":{\"__ndarray__\":\"WKg1zTtO9D/vOEVHcvnlP5M6AU2EDds/rthfdk8e2j9DrWnecYraPxgmUwWjkto/8kHPZtXn2j8zMzMzMzPbP1XBqKROQNs/hxbZzvdT2z+J0t7gC5PdP6g1zTtO0d0/Imx4eqUs0z8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"tooltip_label\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"PR #56\",\"v3.0rc1\",\"PR #317\"]},\"selected\":{\"id\":\"1054\"},\"selection_policy\":{\"id\":\"1053\"}},\"id\":\"1003\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"tools\":[{\"id\":\"1024\"},{\"id\":\"1025\"},{\"id\":\"1026\"},{\"id\":\"1027\"},{\"id\":\"1028\"},{\"id\":\"1029\"},{\"id\":\"1031\"}]},\"id\":\"1032\",\"type\":\"Toolbar\"},{\"attributes\":{\"label\":{\"value\":\"gauss\"},\"renderers\":[{\"id\":\"1102\"},{\"id\":\"1131\"}]},\"id\":\"1126\",\"type\":\"LegendItem\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1132\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1053\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"jensen\"},\"renderers\":[{\"id\":\"1044\"},{\"id\":\"1074\"}]},\"id\":\"1069\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1028\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1054\",\"type\":\"Selection\"},{\"attributes\":{\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1041\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1156\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1101\",\"type\":\"Line\"},{\"attributes\":{\"fill_color\":{\"value\":\"red\"},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1185\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"5x5 Wind Farm Timing Test\"},\"id\":\"1006\",\"type\":\"Title\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1041\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1043\"},\"nonselection_glyph\":{\"id\":\"1042\"},\"view\":{\"id\":\"1045\"}},\"id\":\"1044\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1128\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1130\"},\"nonselection_glyph\":{\"id\":\"1129\"},\"view\":{\"id\":\"1132\"}},\"id\":\"1131\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"max_interval\":43200000.0,\"min_interval\":3600000.0,\"num_minor_ticks\":0},\"id\":\"1058\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"axis\":{\"id\":\"1020\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1023\",\"type\":\"Grid\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1158\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1213\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1215\"},\"nonselection_glyph\":{\"id\":\"1214\"},\"view\":{\"id\":\"1217\"}},\"id\":\"1216\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1014\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1103\",\"type\":\"CDSView\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1100\",\"type\":\"Line\"}],\"root_ids\":[\"1005\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n const render_items = [{\"docid\":\"a5ebcb57-ca23-495f-bcbf-8f77d9804a82\",\"root_ids\":[\"1005\"],\"roots\":{\"1005\":\"429c3bdb-607d-4642-8df9-f49a4e8ebc89\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\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);", + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"21218f0e-3400-4726-a211-3eed891931fd\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1006\",\"attributes\":{\"height\":450,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1008\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1007\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1020\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1022\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1009\",\"attributes\":{\"text\":\"5x5 Wind Farm Timing Test\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1097\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1002\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1004\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1003\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAA\"},\"shape\":[21],\"dtype\":\"int32\",\"order\":\"little\"}],[\"commit_hash\",{\"type\":\"ndarray\",\"array\":[\"df25a9cfacd3d652361d2bd37f568af00acb2631\",\"b797390a43298a815f3ff57955cfdc71ecf3e866\",\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\",\"dd847210082035d43b0273ae63a76a53cb8d2e12\",\"33779269e98cc882a5f066c462d8ec1eadf37a1a\",\"12890e029a7155b074b9b325d320d1798338e287\",\"66dafc08bd620d96deda7d526b0e4bfc3b086650\",\"a325819b3b03b84bd76ad455e3f9b4600744ba14\",\"8a2c1a610295c007f0222ce737723c341189811d\",\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\",\"03e1f461c152e4f221fe92c834f2787680cf5772\",\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\",\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\",\"9b4e85cf1b41ba7001aaba1a830b93e176f3dd43\",\"d18f4d263ecabf502242592f9d60815a07c7b89c\",\"a23241bb9e45078e36a4662d48c9d3fe0c3316e4\",\"c2006b0011a5df036c306c15e75763ec492dafda\",\"0c2adf3e702b6427da946a6ba9dbedbea22738be\",\"39c466000b1874e06a6f58da9c30bb877fc8d4d2\",\"8436fd78b002e5792f5d0dd1409332d171036d49\",\"16628a0ba45a675df762245694e0a7666a3478f8\"],\"shape\":[21],\"dtype\":\"object\",\"order\":\"little\"}],[\"commit_hash_8char\",{\"type\":\"ndarray\",\"array\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"03e1f461\",\"9e96d6c4\",\"2a98428f\",\"9b4e85cf\",\"d18f4d26\",\"a23241bb\",\"c2006b00\",\"0c2adf3e\",\"39c46600\",\"8436fd78\",\"16628a0b\"],\"shape\":[21],\"dtype\":\"object\",\"order\":\"little\"}],[\"date\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AACAyDfgd0IAAEDF0+F3QgAAACsm4ndCAACA9srid0IAAICNFOR3QgAAQPNm5HdCAAAAWbnkd0IAAMC+C+V3QgAAgCRe5XdCAACAJF7ld0IAAIC7p+Z3QgAAQCH65ndCAACARWHud0IAAABtLPR3QgAAQJ4j9XdCAAAAvML/d0IAAMBWixh4QgAAQIU5NHhCAAAAWyVJeEIAAAAn5WJ4QgAAQOKVa3hC\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"jensen\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"WKg1zTtO9D/vOEVHcvnlP5M6AU2EDds/rthfdk8e2j9DrWnecYraPxgmUwWjkto/8kHPZtXn2j8zMzMzMzPbP1XBqKROQNs/hxbZzvdT2z+J0t7gC5PdP6g1zTtO0d0/Imx4eqUs0z9lqmBUUifUP/7UeOkmMdQ/4umVsgxx1D/129eBc0bUP18pyxDHutQ/qz5XW7G/1D+gGi/dJAbVP0YldQKaCNc/\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"gauss\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GJXUCWgi9D+Hp1fKMsTzPwXFjzF3Le0/FNBE2PD07D8VjErqBDTtP6AaL90kBu0/N4lBYOXQ7D/HuriNBvDsP8oyxLEubu0/5BQdyeU/7D8qOpLLf0jtP0I+6Nms+uw/LGUZ4lgX7T8dWmQ730/vP7prCfmgZ+8/CmgibHh67z817zhFR3LvPzy9UpYhju8/GQRWDi2y7z82qz5XW7HvP7dif9k9efA/\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"gch\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"X5hMFYxK+j9IUPwYc9f8P6vP1VbsL/c/O99PjZdu+D+qYFRSJ6D4P4Y41sVtNPg/seHplbIM+D+mCkYldQL4PzY8vVKWIfg/oWez6nO19z8AkX77OnD4P/AWSFD8GPg/MCqpE9BE+D9tVn2utmL5PznWxW00gPk/5x2n6Egu+T+C4seYu5b5P5MYBFYOLfk/RPrt68A5+T8QejarPlf5P0Rpb/CFyfw/\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"cc\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H/BqKROQJMAQN5xio7kcgBADwu1pnlHAEAhsHJoke0AQLPqc7UV+wBAl5APejarAED6fmq8dJMAQMrDQq1pXgNA8kHPZtXnAEAOT6+UZYgAQNlfdk8elgNA\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"code_coverage\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"PnlYqDXN2z/WVuwvuyfTPxB6Nqs+V9M/vJaQD3o21z8EVg4tsp3XP+PHmLuWkNc/lIeFWtO81z+Uh4Va07zXP9DVVuwvu9c/cvkP6bev1z/9h/Tb14HXP3sUrkfhetg/t2J/2T152D+QMXctIR/EP5Axdy0hH8Q/K/aX3ZOHxT+jkjoBTYTFP0T67evAOcM/ylTBqKROyD/8qfHSTWLIP662Yn/ZPck/\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"tooltip_label\",{\"type\":\"ndarray\",\"array\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"PR #56\",\"v3.0rc1\",\"PR #317\",\"v3.0\",\"v3.0.1\",\"v3.1\",\"v3.1.1\",\"v3.2\",\"v3.2.1\",\"v3.2.2\",\"v3.3\"],\"shape\":[21],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1098\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1099\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1094\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"jensen\"},\"line_color\":\"blue\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1095\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"jensen\"},\"line_color\":\"blue\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1096\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"jensen\"},\"line_color\":\"blue\",\"line_alpha\":0.2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1108\",\"attributes\":{\"data_source\":{\"id\":\"p1002\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1109\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1110\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1105\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"jensen\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"blue\"},\"fill_color\":{\"type\":\"value\",\"value\":\"blue\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1106\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"jensen\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"blue\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"blue\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1107\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"jensen\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"blue\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"blue\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1117\",\"attributes\":{\"data_source\":{\"id\":\"p1002\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1118\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1119\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1114\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gauss\"},\"line_color\":\"green\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1115\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gauss\"},\"line_color\":\"green\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1116\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gauss\"},\"line_color\":\"green\",\"line_alpha\":0.2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1127\",\"attributes\":{\"data_source\":{\"id\":\"p1002\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1128\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1129\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1124\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gauss\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"green\"},\"fill_color\":{\"type\":\"value\",\"value\":\"green\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1125\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gauss\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"green\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"green\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1126\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gauss\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"green\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"green\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1136\",\"attributes\":{\"data_source\":{\"id\":\"p1002\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1137\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1138\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1133\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gch\"},\"line_color\":\"red\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1134\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gch\"},\"line_color\":\"red\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1135\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gch\"},\"line_color\":\"red\",\"line_alpha\":0.2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1146\",\"attributes\":{\"data_source\":{\"id\":\"p1002\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1147\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1148\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1143\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gch\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"red\"},\"fill_color\":{\"type\":\"value\",\"value\":\"red\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1144\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gch\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"red\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"red\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1145\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"gch\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"red\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"red\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1155\",\"attributes\":{\"data_source\":{\"id\":\"p1002\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1156\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1157\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1152\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"cc\"},\"line_color\":\"cyan\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1153\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"cc\"},\"line_color\":\"cyan\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1154\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"cc\"},\"line_color\":\"cyan\",\"line_alpha\":0.2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1165\",\"attributes\":{\"data_source\":{\"id\":\"p1002\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1166\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1167\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1162\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"cc\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"cyan\"},\"fill_color\":{\"type\":\"value\",\"value\":\"cyan\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1163\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"cc\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"cyan\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"cyan\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1164\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"cc\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"cyan\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"cyan\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1012\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1074\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1075\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1076\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1077\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1078\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1079\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1080\"},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1082\",\"attributes\":{\"renderers\":\"auto\",\"tooltips\":[[\"git ref\",\"@tooltip_label\"]]}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1067\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1069\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1068\"},\"axis_label\":\"Time to solution (s)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1070\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"DatetimeAxis\",\"id\":\"p1024\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"DatetimeTicker\",\"id\":\"p1026\",\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p1027\",\"attributes\":{\"num_minor_ticks\":0,\"mantissas\":[1,2,5],\"max_interval\":500.0}},{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p1028\",\"attributes\":{\"num_minor_ticks\":0,\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"min_interval\":1000.0,\"max_interval\":1800000.0}},{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p1029\",\"attributes\":{\"num_minor_ticks\":0,\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"min_interval\":3600000.0,\"max_interval\":43200000.0}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p1030\",\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p1031\",\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p1032\",\"attributes\":{\"days\":[1,8,15,22]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p1033\",\"attributes\":{\"days\":[1,15]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p1034\",\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p1035\",\"attributes\":{\"months\":[0,2,4,6,8,10]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p1036\",\"attributes\":{\"months\":[0,4,8]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p1037\",\"attributes\":{\"months\":[0,6]}},{\"type\":\"object\",\"name\":\"YearsTicker\",\"id\":\"p1038\"}]}},\"formatter\":{\"type\":\"object\",\"name\":\"DatetimeTickFormatter\",\"id\":\"p1025\"},\"axis_label\":\"Commit date\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1039\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1066\",\"attributes\":{\"axis\":{\"id\":\"p1024\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1073\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1067\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p1100\",\"attributes\":{\"location\":\"bottom_left\",\"border_line_color\":\"black\",\"click_policy\":\"mute\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1101\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"jensen\"},\"renderers\":[{\"id\":\"p1097\"},{\"id\":\"p1108\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1120\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"gauss\"},\"renderers\":[{\"id\":\"p1117\"},{\"id\":\"p1127\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1139\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"gch\"},\"renderers\":[{\"id\":\"p1136\"},{\"id\":\"p1146\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p1158\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"cc\"},\"renderers\":[{\"id\":\"p1155\"},{\"id\":\"p1165\"}]}}]}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n const render_items = [{\"docid\":\"21218f0e-3400-4726-a211-3eed891931fd\",\"roots\":{\"p1006\":\"f841ef3a-f375-407a-8bd0-2b69e0f7dad0\"},\"root_ids\":[\"p1006\"]}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\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);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { - "id": "1005" + "id": "p1006" } }, "output_type": "display_data" @@ -167,7 +183,7 @@ "data": { "text/html": [ "\n", - "
\n" + "
\n" ] }, "metadata": {}, @@ -175,12 +191,12 @@ }, { "data": { - "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"a3ad1ac9-909e-4221-a4f9-bb91110ed496\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1412\"}],\"center\":[{\"id\":\"1415\"},{\"id\":\"1419\"}],\"height\":450,\"left\":[{\"id\":\"1416\"}],\"renderers\":[{\"id\":\"1440\"},{\"id\":\"1446\"}],\"title\":{\"id\":\"1402\"},\"toolbar\":{\"id\":\"1428\"},\"x_range\":{\"id\":\"1404\"},\"x_scale\":{\"id\":\"1408\"},\"y_range\":{\"id\":\"1448\"},\"y_scale\":{\"id\":\"1410\"}},\"id\":\"1401\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1439\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1408\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1474\",\"type\":\"AllLabels\"},{\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"id\":\"1481\"},{\"id\":\"1482\"},{\"id\":\"1483\"},{\"id\":\"1484\"},{\"id\":\"1485\"},{\"id\":\"1486\"},{\"id\":\"1487\"},{\"id\":\"1488\"},{\"id\":\"1489\"},{\"id\":\"1490\"},{\"id\":\"1491\"},{\"id\":\"1492\"}]},\"id\":\"1413\",\"type\":\"DatetimeTicker\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1426\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1443\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1445\"},\"nonselection_glyph\":{\"id\":\"1444\"},\"view\":{\"id\":\"1447\"}},\"id\":\"1446\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1053\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1473\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"mantissas\":[1,2,5],\"max_interval\":500.0,\"num_minor_ticks\":0},\"id\":\"1481\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{},\"id\":\"1425\",\"type\":\"HelpTool\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Code Coverage\"},\"id\":\"1402\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1476\",\"type\":\"DatetimeTickFormatter\"},{\"attributes\":{},\"id\":\"1054\",\"type\":\"Selection\"},{\"attributes\":{\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1437\",\"type\":\"Line\"},{\"attributes\":{\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"max_interval\":1800000.0,\"min_interval\":1000.0,\"num_minor_ticks\":0},\"id\":\"1482\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1437\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1439\"},\"nonselection_glyph\":{\"id\":\"1438\"},\"view\":{\"id\":\"1441\"}},\"id\":\"1440\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"max_interval\":43200000.0,\"min_interval\":3600000.0,\"num_minor_ticks\":0},\"id\":\"1483\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"axis_label\":\"Commit date\",\"coordinates\":null,\"formatter\":{\"id\":\"1476\"},\"group\":null,\"major_label_policy\":{\"id\":\"1477\"},\"ticker\":{\"id\":\"1413\"}},\"id\":\"1412\",\"type\":\"DatetimeAxis\"},{\"attributes\":{\"days\":[1,15]},\"id\":\"1487\",\"type\":\"DaysTicker\"},{\"attributes\":{},\"id\":\"1477\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1417\",\"type\":\"BasicTicker\"},{\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]},\"id\":\"1488\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"git ref\",\"@tooltip_label\"]]},\"id\":\"1427\",\"type\":\"HoverTool\"},{\"attributes\":{\"months\":[0,6]},\"id\":\"1491\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},\"id\":\"1484\",\"type\":\"DaysTicker\"},{\"attributes\":{\"axis_label\":\"Test coverage as a percentage of Python code\",\"coordinates\":null,\"formatter\":{\"id\":\"1473\"},\"group\":null,\"major_label_policy\":{\"id\":\"1474\"},\"ticker\":{\"id\":\"1417\"}},\"id\":\"1416\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1416\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1419\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1492\",\"type\":\"YearsTicker\"},{\"attributes\":{\"days\":[1,8,15,22]},\"id\":\"1486\",\"type\":\"DaysTicker\"},{\"attributes\":{\"months\":[0,2,4,6,8,10]},\"id\":\"1489\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]},\"id\":\"1485\",\"type\":\"DaysTicker\"},{\"attributes\":{},\"id\":\"1404\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1438\",\"type\":\"Line\"},{\"attributes\":{\"months\":[0,4,8]},\"id\":\"1490\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1445\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1444\",\"type\":\"Circle\"},{\"attributes\":{\"overlay\":{\"id\":\"1426\"}},\"id\":\"1422\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1441\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1410\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis\":{\"id\":\"1412\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1415\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1447\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1420\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1421\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"data\":{\"cc\":{\"__ndarray__\":\"AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H/BqKROQJMAQN5xio7kcgBADwu1pnlHAEA=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"code_coverage\":{\"__ndarray__\":\"PnlYqDXN2z/WVuwvuyfTPxB6Nqs+V9M/vJaQD3o21z8EVg4tsp3XP+PHmLuWkNc/lIeFWtO81z+Uh4Va07zXP9DVVuwvu9c/cvkP6bev1z/9h/Tb14HXP3sUrkfhetg/t2J/2T152D8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"commit_hash\":[\"df25a9cfacd3d652361d2bd37f568af00acb2631\",\"b797390a43298a815f3ff57955cfdc71ecf3e866\",\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\",\"dd847210082035d43b0273ae63a76a53cb8d2e12\",\"33779269e98cc882a5f066c462d8ec1eadf37a1a\",\"12890e029a7155b074b9b325d320d1798338e287\",\"66dafc08bd620d96deda7d526b0e4bfc3b086650\",\"a325819b3b03b84bd76ad455e3f9b4600744ba14\",\"8a2c1a610295c007f0222ce737723c341189811d\",\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\",\"03e1f461c152e4f221fe92c834f2787680cf5772\",\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\",\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\"],\"commit_hash_8char\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"03e1f461\",\"9e96d6c4\",\"2a98428f\"],\"date\":{\"__ndarray__\":\"AACAyDfgd0IAAEDF0+F3QgAAACsm4ndCAACA9srid0IAAICNFOR3QgAAQPNm5HdCAAAAWbnkd0IAAMC+C+V3QgAAgCRe5XdCAACAJF7ld0IAAIC7p+Z3QgAAQCH65ndCAACARWHud0I=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"gauss\":{\"__ndarray__\":\"GJXUCWgi9D+Hp1fKMsTzPwXFjzF3Le0/FNBE2PD07D8VjErqBDTtP6AaL90kBu0/N4lBYOXQ7D/HuriNBvDsP8oyxLEubu0/5BQdyeU/7D8qOpLLf0jtP0I+6Nms+uw/LGUZ4lgX7T8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"gch\":{\"__ndarray__\":\"X5hMFYxK+j9IUPwYc9f8P6vP1VbsL/c/O99PjZdu+D+qYFRSJ6D4P4Y41sVtNPg/seHplbIM+D+mCkYldQL4PzY8vVKWIfg/oWez6nO19z8AkX77OnD4P/AWSFD8GPg/MCqpE9BE+D8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12],\"jensen\":{\"__ndarray__\":\"WKg1zTtO9D/vOEVHcvnlP5M6AU2EDds/rthfdk8e2j9DrWnecYraPxgmUwWjkto/8kHPZtXn2j8zMzMzMzPbP1XBqKROQNs/hxbZzvdT2z+J0t7gC5PdP6g1zTtO0d0/Imx4eqUs0z8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"tooltip_label\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"PR #56\",\"v3.0rc1\",\"PR #317\"]},\"selected\":{\"id\":\"1054\"},\"selection_policy\":{\"id\":\"1053\"}},\"id\":\"1003\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1424\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1448\",\"type\":\"Range1d\"},{\"attributes\":{\"fill_color\":{\"value\":\"blue\"},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1443\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1423\",\"type\":\"SaveTool\"},{\"attributes\":{\"tools\":[{\"id\":\"1420\"},{\"id\":\"1421\"},{\"id\":\"1422\"},{\"id\":\"1423\"},{\"id\":\"1424\"},{\"id\":\"1425\"},{\"id\":\"1427\"}]},\"id\":\"1428\",\"type\":\"Toolbar\"}],\"root_ids\":[\"1401\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n const render_items = [{\"docid\":\"a3ad1ac9-909e-4221-a4f9-bb91110ed496\",\"root_ids\":[\"1401\"],\"roots\":{\"1401\":\"d55f5948-693b-4c15-84a6-da35cf41220b\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\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);", + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"b098bb33-6e97-4a09-a0f1-de427400a24a\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1535\",\"attributes\":{\"height\":450,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1537\"},\"y_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1638\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1549\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1551\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1538\",\"attributes\":{\"text\":\"Code Coverage\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1626\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1002\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1004\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1003\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAA\"},\"shape\":[21],\"dtype\":\"int32\",\"order\":\"little\"}],[\"commit_hash\",{\"type\":\"ndarray\",\"array\":[\"df25a9cfacd3d652361d2bd37f568af00acb2631\",\"b797390a43298a815f3ff57955cfdc71ecf3e866\",\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\",\"dd847210082035d43b0273ae63a76a53cb8d2e12\",\"33779269e98cc882a5f066c462d8ec1eadf37a1a\",\"12890e029a7155b074b9b325d320d1798338e287\",\"66dafc08bd620d96deda7d526b0e4bfc3b086650\",\"a325819b3b03b84bd76ad455e3f9b4600744ba14\",\"8a2c1a610295c007f0222ce737723c341189811d\",\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\",\"03e1f461c152e4f221fe92c834f2787680cf5772\",\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\",\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\",\"9b4e85cf1b41ba7001aaba1a830b93e176f3dd43\",\"d18f4d263ecabf502242592f9d60815a07c7b89c\",\"a23241bb9e45078e36a4662d48c9d3fe0c3316e4\",\"c2006b0011a5df036c306c15e75763ec492dafda\",\"0c2adf3e702b6427da946a6ba9dbedbea22738be\",\"39c466000b1874e06a6f58da9c30bb877fc8d4d2\",\"8436fd78b002e5792f5d0dd1409332d171036d49\",\"16628a0ba45a675df762245694e0a7666a3478f8\"],\"shape\":[21],\"dtype\":\"object\",\"order\":\"little\"}],[\"commit_hash_8char\",{\"type\":\"ndarray\",\"array\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"03e1f461\",\"9e96d6c4\",\"2a98428f\",\"9b4e85cf\",\"d18f4d26\",\"a23241bb\",\"c2006b00\",\"0c2adf3e\",\"39c46600\",\"8436fd78\",\"16628a0b\"],\"shape\":[21],\"dtype\":\"object\",\"order\":\"little\"}],[\"date\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AACAyDfgd0IAAEDF0+F3QgAAACsm4ndCAACA9srid0IAAICNFOR3QgAAQPNm5HdCAAAAWbnkd0IAAMC+C+V3QgAAgCRe5XdCAACAJF7ld0IAAIC7p+Z3QgAAQCH65ndCAACARWHud0IAAABtLPR3QgAAQJ4j9XdCAAAAvML/d0IAAMBWixh4QgAAQIU5NHhCAAAAWyVJeEIAAAAn5WJ4QgAAQOKVa3hC\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"jensen\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"WKg1zTtO9D/vOEVHcvnlP5M6AU2EDds/rthfdk8e2j9DrWnecYraPxgmUwWjkto/8kHPZtXn2j8zMzMzMzPbP1XBqKROQNs/hxbZzvdT2z+J0t7gC5PdP6g1zTtO0d0/Imx4eqUs0z9lqmBUUifUP/7UeOkmMdQ/4umVsgxx1D/129eBc0bUP18pyxDHutQ/qz5XW7G/1D+gGi/dJAbVP0YldQKaCNc/\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"gauss\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GJXUCWgi9D+Hp1fKMsTzPwXFjzF3Le0/FNBE2PD07D8VjErqBDTtP6AaL90kBu0/N4lBYOXQ7D/HuriNBvDsP8oyxLEubu0/5BQdyeU/7D8qOpLLf0jtP0I+6Nms+uw/LGUZ4lgX7T8dWmQ730/vP7prCfmgZ+8/CmgibHh67z817zhFR3LvPzy9UpYhju8/GQRWDi2y7z82qz5XW7HvP7dif9k9efA/\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"gch\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"X5hMFYxK+j9IUPwYc9f8P6vP1VbsL/c/O99PjZdu+D+qYFRSJ6D4P4Y41sVtNPg/seHplbIM+D+mCkYldQL4PzY8vVKWIfg/oWez6nO19z8AkX77OnD4P/AWSFD8GPg/MCqpE9BE+D9tVn2utmL5PznWxW00gPk/5x2n6Egu+T+C4seYu5b5P5MYBFYOLfk/RPrt68A5+T8QejarPlf5P0Rpb/CFyfw/\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"cc\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H/BqKROQJMAQN5xio7kcgBADwu1pnlHAEAhsHJoke0AQLPqc7UV+wBAl5APejarAED6fmq8dJMAQMrDQq1pXgNA8kHPZtXnAEAOT6+UZYgAQNlfdk8elgNA\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"code_coverage\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"PnlYqDXN2z/WVuwvuyfTPxB6Nqs+V9M/vJaQD3o21z8EVg4tsp3XP+PHmLuWkNc/lIeFWtO81z+Uh4Va07zXP9DVVuwvu9c/cvkP6bev1z/9h/Tb14HXP3sUrkfhetg/t2J/2T152D+QMXctIR/EP5Axdy0hH8Q/K/aX3ZOHxT+jkjoBTYTFP0T67evAOcM/ylTBqKROyD/8qfHSTWLIP662Yn/ZPck/\"},\"shape\":[21],\"dtype\":\"float64\",\"order\":\"little\"}],[\"tooltip_label\",{\"type\":\"ndarray\",\"array\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"PR #56\",\"v3.0rc1\",\"PR #317\",\"v3.0\",\"v3.0.1\",\"v3.1\",\"v3.1.1\",\"v3.2\",\"v3.2.1\",\"v3.2.2\",\"v3.3\"],\"shape\":[21],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1627\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1628\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1623\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"code_coverage\"},\"line_color\":\"blue\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1624\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"code_coverage\"},\"line_color\":\"blue\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1625\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"code_coverage\"},\"line_color\":\"blue\",\"line_alpha\":0.2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1635\",\"attributes\":{\"data_source\":{\"id\":\"p1002\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1636\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1637\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1632\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"code_coverage\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"blue\"},\"fill_color\":{\"type\":\"value\",\"value\":\"blue\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1633\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"code_coverage\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"blue\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"blue\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1634\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"date\"},\"y\":{\"type\":\"field\",\"field\":\"code_coverage\"},\"size\":{\"type\":\"value\",\"value\":6},\"line_color\":{\"type\":\"value\",\"value\":\"blue\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"blue\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1541\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1603\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1604\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1605\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1606\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1607\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1608\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1609\"},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1611\",\"attributes\":{\"renderers\":\"auto\",\"tooltips\":[[\"git ref\",\"@tooltip_label\"]]}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1596\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1598\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1597\"},\"axis_label\":\"Test coverage as a percentage of Python code\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1599\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"DatetimeAxis\",\"id\":\"p1553\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"DatetimeTicker\",\"id\":\"p1555\",\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p1556\",\"attributes\":{\"num_minor_ticks\":0,\"mantissas\":[1,2,5],\"max_interval\":500.0}},{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p1557\",\"attributes\":{\"num_minor_ticks\":0,\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"min_interval\":1000.0,\"max_interval\":1800000.0}},{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p1558\",\"attributes\":{\"num_minor_ticks\":0,\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"min_interval\":3600000.0,\"max_interval\":43200000.0}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p1559\",\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p1560\",\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p1561\",\"attributes\":{\"days\":[1,8,15,22]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p1562\",\"attributes\":{\"days\":[1,15]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p1563\",\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p1564\",\"attributes\":{\"months\":[0,2,4,6,8,10]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p1565\",\"attributes\":{\"months\":[0,4,8]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p1566\",\"attributes\":{\"months\":[0,6]}},{\"type\":\"object\",\"name\":\"YearsTicker\",\"id\":\"p1567\"}]}},\"formatter\":{\"type\":\"object\",\"name\":\"DatetimeTickFormatter\",\"id\":\"p1554\"},\"axis_label\":\"Commit date\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1568\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1595\",\"attributes\":{\"axis\":{\"id\":\"p1553\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1602\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1596\"}}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n const render_items = [{\"docid\":\"b098bb33-6e97-4a09-a0f1-de427400a24a\",\"roots\":{\"p1535\":\"cee48e03-5483-4cb3-b868-0e39b1ca10a8\"},\"root_ids\":[\"p1535\"]}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\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);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { - "id": "1401" + "id": "p1535" } }, "output_type": "display_data" @@ -224,7 +240,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.2" + "version": "3.10.0" }, "orig_nbformat": 4, "vscode": { diff --git a/docs/floating_wind_turbine.md b/docs/floating_wind_turbine.md index 0647dafe1..e8def2df9 100644 --- a/docs/floating_wind_turbine.md +++ b/docs/floating_wind_turbine.md @@ -13,7 +13,7 @@ performance curve, and corrections must be included to accurately predict the po production. Support for modeling this impact on a floating wind turbine were added in -[PR#518](https://github.com/NREL/floris/pull/518/files) and allow for correcting the +[PR#518](https://github.com/NREL/floris/pull/518/files) and allow for correcting the user-supplied performance curve for the average tilt. This is accomplished by including an additional input, `floating_tilt_table`, in the turbine definition which sets the steady tilt angle of the turbine based on wind speed. An interpolation is created and diff --git a/examples/inputs/jensen.yaml b/examples/inputs/jensen.yaml index 8e87a265d..abb889e0a 100644 --- a/examples/inputs/jensen.yaml +++ b/examples/inputs/jensen.yaml @@ -45,9 +45,9 @@ wake: turbulence_model: crespo_hernandez velocity_model: jensen - enable_secondary_steering: true - enable_yaw_added_recovery: true - enable_transverse_velocities: true + enable_secondary_steering: false + enable_yaw_added_recovery: false + enable_transverse_velocities: false wake_deflection_parameters: gauss: diff --git a/floris/simulation/farm.py b/floris/simulation/farm.py index a83312596..ffa8b875f 100644 --- a/floris/simulation/farm.py +++ b/floris/simulation/farm.py @@ -216,18 +216,17 @@ def construct_turbine_map(self): self.turbine_map = [Turbine.from_dict(turb) for turb in self.turbine_definitions] def construct_turbine_fCts(self): - self.turbine_fCts = [(turb.turbine_type, turb.fCt_interp) for turb in self.turbine_map] - - def construct_turbine_fCps(self): - self.turbine_fCps = [(turb.turbine_type, turb.fCp_interp) for turb in self.turbine_map] + self.turbine_fCts = { + turb.turbine_type: turb.fCt_interp for turb in self.turbine_map + } def construct_turbine_fTilts(self): self.turbine_fTilts = [(turb.turbine_type, turb.fTilt_interp) for turb in self.turbine_map] def construct_turbine_power_interps(self): - self.turbine_power_interps = [ - (turb.turbine_type, turb.power_interp) for turb in self.turbine_map - ] + self.turbine_power_interps = { + turb.turbine_type: turb.power_interp for turb in self.turbine_map + } def construct_coordinates(self): self.coordinates = np.array([ diff --git a/floris/simulation/floris.py b/floris/simulation/floris.py index 718e9aa3b..d60b8892d 100644 --- a/floris/simulation/floris.py +++ b/floris/simulation/floris.py @@ -68,7 +68,6 @@ def __attrs_post_init__(self) -> None: # Initialize farm quanitities that depend on other objects self.farm.construct_turbine_map() self.farm.construct_turbine_fCts() - self.farm.construct_turbine_fCps() self.farm.construct_turbine_power_interps() self.farm.construct_hub_heights() self.farm.construct_rotor_diameters() diff --git a/floris/simulation/flow_field.py b/floris/simulation/flow_field.py index aae7e028d..2e6011a12 100644 --- a/floris/simulation/flow_field.py +++ b/floris/simulation/flow_field.py @@ -183,10 +183,7 @@ def calculate_speed_ups(self, het_map, x, y, z=None): # Calculate the 3-dimensional speed ups; reshape is needed as the generator # adds an extra dimension speed_ups = np.reshape( - [ - het_map[0][i](x[i:i+1,:,:,:,:], y[i:i+1,:,:,:,:], z[i:i+1,:,:,:,:]) - for i in range(len(het_map[0])) - ], + [het_map[0][i](x[i:i+1], y[i:i+1], z[i:i+1]) for i in range( len(het_map[0]))], np.shape(x) ) @@ -195,10 +192,7 @@ def calculate_speed_ups(self, het_map, x, y, z=None): if np.isnan(speed_ups).any(): idx_nan = np.where(np.isnan(speed_ups)) speed_ups_out_of_region = np.reshape( - [ - het_map[1][i](x[i:i+1,:,:,:,:], y[i:i+1,:,:,:,:], z[i:i+1,:,:,:,:]) - for i in range(len(het_map[1])) - ], + [het_map[1][i](x[i:i+1], y[i:i+1], z[i:i+1]) for i in range(len(het_map[1]))], np.shape(x) ) @@ -208,10 +202,7 @@ def calculate_speed_ups(self, het_map, x, y, z=None): # Calculate the 2-dimensional speed ups; reshape is needed as the generator # adds an extra dimension speed_ups = np.reshape( - [ - het_map[0][i](x[i:i+1,:,:,:,:], y[i:i+1,:,:,:,:]) - for i in range(len(het_map[0])) - ], + [het_map[0][i](x[i:i+1], y[i:i+1]) for i in range(len(het_map[0]))], np.shape(x) ) @@ -220,10 +211,7 @@ def calculate_speed_ups(self, het_map, x, y, z=None): if np.isnan(speed_ups).any(): idx_nan = np.where(np.isnan(speed_ups)) speed_ups_out_of_region = np.reshape( - [ - het_map[1][i](x[i:i+1,:,:,:,:], y[i:i+1,:,:,:,:]) - for i in range(len(het_map[1])) - ], + [het_map[1][i](x[i:i+1], y[i:i+1]) for i in range(len(het_map[1]))], np.shape(x) ) diff --git a/floris/simulation/grid.py b/floris/simulation/grid.py index 9f8fdc3ed..7bc6cf94a 100644 --- a/floris/simulation/grid.py +++ b/floris/simulation/grid.py @@ -53,14 +53,14 @@ class Grid(ABC): all of these arrays are the same size Args: - turbine_coordinates (`list[Vec3]`): The collection of turbine coordinate (`Vec3`) objects. - reference_turbine_diameter (:py:obj:`float`): The reference turbine's rotor diameter. - grid_resolution (:py:obj:`int` | :py:obj:`Iterable(int,)`): Grid resolution specific - to each grid type. + turbine_coordinates (`list[Vec3]`): The series of turbine coordinate (`Vec3`) objects. + reference_turbine_diameter (:py:obj:`float`): A reference turbine's rotor diameter. + grid_resolution (:py:obj:`int` | :py:obj:`Iterable(int,)`): Grid resolution with values + specific to each grid type. wind_directions (:py:obj:`NDArrayFloat`): Wind directions supplied by the user. wind_speeds (:py:obj:`NDArrayFloat`): Wind speeds supplied by the user. - time_series (:py:obj:`bool`): True/false flag to indicate whether the supplied wind - data is a time series. + time_series (:py:obj:`bool`): Flag to indicate whether the supplied wind data is a time + series. """ turbine_coordinates: list[Vec3] = field() reference_turbine_diameter: float @@ -133,11 +133,15 @@ class TurbineGrid(Grid): """See `Grid` for more details. Args: - turbine_coordinates (`list[Vec3]`): The collection of turbine coordinate (`Vec3`) objects. - reference_turbine_diameter (:py:obj:`float`): The reference turbine's rotor diameter. - wind_directions (`list[float]`): The input wind directions - wind_speeds (`list[float]`): The input wind speeds - grid_resolution (:py:obj:`int`): The number of points on each turbine + turbine_coordinates (`list[Vec3]`): The series of turbine coordinate (`Vec3`) objects. + reference_turbine_diameter (:py:obj:`float`): A reference turbine's rotor diameter. + grid_resolution (:py:obj:`int` | :py:obj:`Iterable(int,)`): The number of points in each + direction of the square grid on the rotor plane. For example, grid_resolution=3 + creates a 3x3 grid within the rotor swept area. + wind_directions (:py:obj:`NDArrayFloat`): Wind directions supplied by the user. + wind_speeds (:py:obj:`NDArrayFloat`): Wind speeds supplied by the user. + time_series (:py:obj:`bool`): Flag to indicate whether the supplied wind data is a time + series. """ # TODO: describe these and the differences between `sorted_indices` and `sorted_coord_indices` sorted_indices: NDArrayInt = field(init=False) @@ -256,7 +260,9 @@ def set_grid(self) -> None: self.sorted_coord_indices = x.argsort(axis=2) self.unsorted_indices = self.sorted_indices.argsort(axis=2) - # Put the turbines into the final arrays in their sorted order + # Put the turbine coordinates into the final arrays in their sorted order + # These are the coordinates that should be used within the internal calculations + # such as the wake models and the solvers. self.x_sorted = np.take_along_axis(_x, self.sorted_indices, axis=2) self.y_sorted = np.take_along_axis(_y, self.sorted_indices, axis=2) self.z_sorted = np.take_along_axis(_z, self.sorted_indices, axis=2) diff --git a/floris/simulation/solver.py b/floris/simulation/solver.py index 94d390b79..f1c8e636e 100644 --- a/floris/simulation/solver.py +++ b/floris/simulation/solver.py @@ -258,7 +258,6 @@ def full_flow_sequential_solver( turbine_grid_farm.construct_turbine_map() turbine_grid_farm.construct_turbine_fCts() - turbine_grid_farm.construct_turbine_fCps() turbine_grid_farm.construct_turbine_power_interps() turbine_grid_farm.construct_hub_heights() turbine_grid_farm.construct_rotor_diameters() @@ -466,24 +465,14 @@ def cc_solver( z_i = np.mean(grid.z_sorted[:, :, i:i+1], axis=(3, 4)) z_i = z_i[:, :, :, None, None] + rotor_diameter_i = farm.rotor_diameters_sorted[: ,:, i:i+1, None, None] + mask2 = ( np.array(grid.x_sorted < x_i + 0.01) * np.array(grid.x_sorted > x_i - 0.01) - * np.array(grid.y_sorted < y_i + 0.51*126.0) - * np.array(grid.y_sorted > y_i - 0.51*126.0) + * np.array(grid.y_sorted < y_i + 0.51 * rotor_diameter_i) + * np.array(grid.y_sorted > y_i - 0.51 * rotor_diameter_i) ) - # mask2 = ( - # np.logical_and( - # np.logical_and( - # np.logical_and( - # grid.x_sorted < x_i + 0.01, - # grid.x_sorted > x_i - 0.01 - # ), - # grid.y_sorted < y_i + 0.51*126.0 - # ), - # grid.y_sorted > y_i - 0.51*126.0 - # ) - # ) turb_inflow_field = ( turb_inflow_field * ~mask2 + (flow_field.u_initial_sorted - turb_u_wake) * mask2 @@ -534,7 +523,6 @@ def cc_solver( turbulence_intensity_i = turbine_turbulence_intensity[:, :, i:i+1] yaw_angle_i = farm.yaw_angles_sorted[:, :, i:i+1, None, None] hub_height_i = farm.hub_heights_sorted[: ,:, i:i+1, None, None] - rotor_diameter_i = farm.rotor_diameters_sorted[: ,:, i:i+1, None, None] TSR_i = farm.TSRs_sorted[: ,:, i:i+1, None, None] effective_yaw_i = np.zeros_like(yaw_angle_i) @@ -666,7 +654,6 @@ def full_flow_cc_solver( turbine_grid_farm.construct_turbine_map() turbine_grid_farm.construct_turbine_fCts() - turbine_grid_farm.construct_turbine_fCps() turbine_grid_farm.construct_turbine_power_interps() turbine_grid_farm.construct_hub_heights() turbine_grid_farm.construct_rotor_diameters() @@ -1090,7 +1077,6 @@ def full_flow_turbopark_solver( # turbine_grid_farm.construct_turbine_map() # turbine_grid_farm.construct_turbine_fCts() - # turbine_grid_farm.construct_turbine_fCps() # turbine_grid_farm.construct_turbine_power_interps() # turbine_grid_farm.construct_hub_heights() # turbine_grid_farm.construct_rotor_diameters() diff --git a/floris/simulation/turbine.py b/floris/simulation/turbine.py index 21f14bbf3..edcfc74b6 100644 --- a/floris/simulation/turbine.py +++ b/floris/simulation/turbine.py @@ -256,9 +256,8 @@ def power( rotor_effective_velocities = rotor_effective_velocities[:, :, ix_filter] turbine_type_map = turbine_type_map[:, :, ix_filter] - # Loop over each turbine type given to get thrust coefficient for all turbines + # Loop over each turbine type given to get power for all turbines p = np.zeros(np.shape(rotor_effective_velocities)) - power_interp = dict(power_interp) turb_types = np.unique(turbine_type_map) for turb_type in turb_types: # Using a masked array, apply the thrust coefficient for all turbines of the current @@ -276,7 +275,7 @@ def Ct( yaw_angle: NDArrayFloat, tilt_angle: NDArrayFloat, ref_tilt_cp_ct: NDArrayFloat, - fCt: NDArrayObject, + fCt: dict, tilt_interp: NDArrayObject, correct_cp_ct_for_tilt: NDArrayBool, turbine_type_map: NDArrayObject, @@ -294,8 +293,8 @@ def Ct( tilt_angle (NDArrayFloat[wd, ws, turbines]): The tilt angle for each turbine. ref_tilt_cp_ct (NDArrayFloat[wd, ws, turbines]): The reference tilt angle for each turbine that the Cp/Ct tables are defined at. - fCt (Iterable[tuple]): The thrust coefficient interpolation functions - for each turbine. + fCt (dict): The thrust coefficient interpolation functions for each turbine. Keys are + the turbine type string and values are the interpolation functions. tilt_interp (Iterable[tuple]): The tilt interpolation functions for each turbine. correct_cp_ct_for_tilt (NDArrayBool[wd, ws, turbines]): Boolean for determining if the @@ -341,7 +340,6 @@ def Ct( # Loop over each turbine type given to get thrust coefficient for all turbines thrust_coefficient = np.zeros(np.shape(average_velocities)) - fCt = dict(fCt) turb_types = np.unique(turbine_type_map) for turb_type in turb_types: # Using a masked array, apply the thrust coefficient for all turbines of the current @@ -360,7 +358,7 @@ def axial_induction( yaw_angle: NDArrayFloat, # (wind directions, wind speeds, turbines) tilt_angle: NDArrayFloat, # (wind directions, wind speeds, turbines) ref_tilt_cp_ct: NDArrayFloat, - fCt: NDArrayObject, # (turbines) + fCt: dict, # (turbines) tilt_interp: NDArrayObject, # (turbines) correct_cp_ct_for_tilt: NDArrayBool, # (wind directions, wind speeds, turbines) turbine_type_map: NDArrayObject, # (wind directions, 1, turbines) @@ -376,8 +374,8 @@ def axial_induction( tilt_angle (NDArrayFloat[wd, ws, turbines]): The tilt angle for each turbine. ref_tilt_cp_ct (NDArrayFloat[wd, ws, turbines]): The reference tilt angle for each turbine that the Cp/Ct tables are defined at. - fCt (Iterable[tuple]): The thrust coefficient interpolation functions - for each turbine. + fCt (dict): The thrust coefficient interpolation functions for each turbine. Keys are + the turbine type string and values are the interpolation functions. tilt_interp (Iterable[tuple]): The tilt interpolation functions for each turbine. correct_cp_ct_for_tilt (NDArrayBool[wd, ws, turbines]): Boolean for determining if the @@ -468,9 +466,9 @@ class PowerThrustTable(FromDictMixin): """Helper class to convert the dictionary and list-based inputs to a object of arrays. Args: - power (NDArrayFloat): The power produced at a given windspeed. - thrust (NDArrayFloat): The thrust at a given windspeed. - wind_speed (NDArrayFloat): Windspeed values, m/s. + power (NDArrayFloat): The power produced at a given wind speed. + thrust (NDArrayFloat): The thrust at a given wind speed. + wind_speed (NDArrayFloat): Wind speed values, m/s. Raises: ValueError: Raised if the power, thrust, and wind_speed are not all 1-d array-like shapes. diff --git a/floris/tools/floris_interface.py b/floris/tools/floris_interface.py index e22664172..3fe103dbf 100644 --- a/floris/tools/floris_interface.py +++ b/floris/tools/floris_interface.py @@ -213,7 +213,7 @@ def reinitialize( # wtg_id: list[str] | None = None, # with_resolution: float | None = None, solver_settings: dict | None = None, - time_series: bool | None = False, + time_series: bool = False, layout: tuple[list[float], list[float]] | tuple[NDArrayFloat, NDArrayFloat] | None = None, het_map=None, ): @@ -259,10 +259,7 @@ def reinitialize( if turbine_library_path is not None: farm_dict["turbine_library_path"] = turbine_library_path - if time_series: - flow_field_dict["time_series"] = True - else: - flow_field_dict["time_series"] = False + flow_field_dict["time_series"] = time_series ## Wake # if wake is not None: @@ -289,7 +286,7 @@ def get_plane_of_points( ): """ Calculates velocity values through the - :py:meth:`~.FlowField.calculate_wake` method at points in plane + :py:meth:`FlorisInterface.calculate_wake` method at points in plane specified by inputs. Args: @@ -298,9 +295,8 @@ def get_plane_of_points( planar_coordinate (float, optional): Value of normal vector to slice through. Defaults to None. - Returns: - :py:class:`pandas.DataFrame`: containing values of x1, x2, u, v, w + :py:class:`pandas.DataFrame`: containing values of x1, x2, x3, u, v, w """ # Get results vectors x_flat = self.floris.grid.x_sorted[0, 0].flatten() diff --git a/floris/tools/visualization.py b/floris/tools/visualization.py index 178ad17e5..4f781bf3c 100644 --- a/floris/tools/visualization.py +++ b/floris/tools/visualization.py @@ -327,18 +327,28 @@ def plot_rotor_values( save_path: Union[str, None] = None, show: bool = False ) -> Union[None, tuple[plt.figure, plt.axes, plt.axis, plt.colorbar]]: - """Plots the gridded turbine rotor values. This is intended to be used for + """ + Plots the gridded turbine rotor values. This is intended to be used for understanding the differences between two sets of values, so each subplot can be used for inspection of what values are differing, and under what conditions. Parameters: values (np.ndarray): The 5-dimensional array of values to plot. Should be: N wind directions x N wind speeds x N turbines X N rotor points X N rotor points. - cmap (str): The matplotlib colormap to be used, default "coolwarm". - return_fig_objects (bool): Indicator to return the primary figure objects for + wd_index (int): The index for the wind direction to plot. + ws_index (int): The index of the wind speed to plot. + n_rows (int): The number of rows to include for subplots. With ncols, this should + generally add up to the number of turbines in the farm. + n_cols (int): The number of columns to include for subplots. With ncols, this should + generally add up to the number of turbines in the farm. + t_range (range | None): Optional. The turbine count used to create the title for each + subplot. If not provided, the size of the 2-th dimension of `values` is used. + cmap (str): Optional. The matplotlib colormap to be used, default "coolwarm". + return_fig_objects (bool): Optional. Flag to return the primary figure objects for further editing, default False. - save_path (str | None): Where to save the figure, if a value is provided. - t_range is turbine range; i.e. the turbine index to loop over + save_path (str | None): Optional. Where to save the figure, if a value is provided. + show (bool): Optional. Flag to run `plt.show()` to present all the plots + currently created with matplotlib. Returns: None | tuple[plt.figure, plt.axes, plt.axis, plt.colorbar]: If @@ -347,9 +357,9 @@ def plot_rotor_values( Example: from floris.tools.visualization import plot_rotor_values - plot_rotor_values(floris.flow_field.u, wd_index=0, ws_index=0) - plot_rotor_values(floris.flow_field.v, wd_index=0, ws_index=0) - plot_rotor_values(floris.flow_field.w, wd_index=0, ws_index=0, show=True) + plot_rotor_values(floris.flow_field.u, wd_index=0, ws_index=0, n_rows=1, ncols=4) + plot_rotor_values(floris.flow_field.v, wd_index=0, ws_index=0, n_rows=1, ncols=4) + plot_rotor_values(floris.flow_field.w, wd_index=0, ws_index=0, n_rows=1, ncols=4, show=True) """ cmap = plt.cm.get_cmap(name=cmap) @@ -360,6 +370,11 @@ def plot_rotor_values( fig = plt.figure() axes = fig.subplots(n_rows, n_cols) + # For 1x1, fig.subplots returns an Axes object, but for more than 1x1 it returns a np.array. + # In this case, convert to an array so that the rest of this function can be simplified. + if n_rows == 1 and n_cols == 1: + axes = np.array([axes]) + titles = np.array([f"T{i}" for i in t_range]) for ax, t, i in zip(axes.flatten(), titles, t_range): diff --git a/floris/utilities.py b/floris/utilities.py index 276bf26b6..a164a2b0d 100644 --- a/floris/utilities.py +++ b/floris/utilities.py @@ -12,6 +12,8 @@ # See https://floris.readthedocs.io for documentation +from __future__ import annotations + import os from typing import Tuple @@ -188,14 +190,51 @@ def wrap_360(x): return x % 360.0 -def wind_delta(wind_directions): +def wind_delta(wind_directions: NDArrayFloat | float): + """ + This function calculates the deviation from West (270) for a given wind direction or series + of wind directions. First, 270 is subtracted from the input wind direction, and then the + remainder after dividing by 360 is retained (modulo). The table below lists examples of + results. + + | Input | Result | + | ----- | ------ | + | 270.0 | 0.0 | + | 280.0 | 10.0 | + | 360.0 | 90.0 | + | 180.0 | 270.0 | + | -10.0 | 80.0 | + |-100.0 | 350.0 | + + Args: + wind_directions (NDArrayFloat | float): A single or series of wind directions. They can be + any number, negative or positive, but it is typically between 0 and 360. + + Returns: + NDArrayFloat | float: The delta between the given wind direction and 270 in positive + quantities between 0 and 360. The returned type is the same as wind_directions. """ - This is included as a function in order to facilitate testing. + + return (wind_directions - 270) % 360 + + +def rotate_coordinates_rel_west( + wind_directions: NDArrayFloat, + coordinates: NDArrayFloat +): """ - return ((wind_directions - 270) % 360 + 360) % 360 + This function rotates the given coordinates so that they are aligned with West (270) rather + than North (0). The rotation happens about the centroid of the coordinates. + Args: + wind_directions (NDArrayFloat): Series of wind directions to base the rotation + coordinates (NDArrayFloat): Series of coordinates to rotate with shape (N coordinates, 3) + so that each element of the array coordinates[i] yields a three-component coordinate -def rotate_coordinates_rel_west(wind_directions, coordinates): + Returns: + (NDArrayFloat, NDArrayFloat, NDArrayFloat): x, y, and z components of the rotated + coordinates with shape (N wind directions, 1, N coordinates) + """ # Calculate the difference in given wind direction from 270 / West wind_deviation_from_west = wind_delta(wind_directions) wind_deviation_from_west = np.reshape(wind_deviation_from_west, (len(wind_directions), 1, 1)) diff --git a/tests/turbine_unit_test.py b/tests/turbine_unit_test.py index 882705334..9f72fc6eb 100644 --- a/tests/turbine_unit_test.py +++ b/tests/turbine_unit_test.py @@ -250,7 +250,7 @@ def test_ct(): yaw_angle=np.zeros((1, 1, 1)), tilt_angle=np.ones((1, 1, 1)) * 5.0, ref_tilt_cp_ct=np.ones((1, 1, 1)) * 5.0, - fCt=np.array([(turbine.turbine_type, turbine.fCt_interp)]), + fCt={turbine.turbine_type: turbine.fCt_interp}, tilt_interp=np.array([(turbine.turbine_type, None)]), correct_cp_ct_for_tilt=np.array([[[False]]]), turbine_type_map=turbine_type_map[:,:,0] @@ -266,7 +266,7 @@ def test_ct(): yaw_angle=np.zeros((1, 1, N_TURBINES)), tilt_angle=np.ones((1, 1, N_TURBINES)) * 5.0, ref_tilt_cp_ct=np.ones((1, 1, N_TURBINES)) * 5.0, - fCt=np.array([(turbine.turbine_type, turbine.fCt_interp)]), + fCt={turbine.turbine_type: turbine.fCt_interp}, tilt_interp=np.array([(turbine.turbine_type, None)]), correct_cp_ct_for_tilt=np.array([[[False] * N_TURBINES]]), turbine_type_map=turbine_type_map, @@ -287,7 +287,7 @@ def test_ct(): yaw_angle=np.zeros((1, 1, 1)), tilt_angle=np.ones((1, 1, 1)) * 5.0, ref_tilt_cp_ct=np.ones((1, 1, 1)) * 5.0, - fCt=np.array([(turbine_floating.turbine_type, turbine_floating.fCt_interp)]), + fCt={turbine.turbine_type: turbine_floating.fCt_interp}, tilt_interp=np.array([(turbine_floating.turbine_type, turbine_floating.fTilt_interp)]), correct_cp_ct_for_tilt=np.array([[[True]]]), turbine_type_map=turbine_type_map[:,:,0] @@ -314,7 +314,7 @@ def test_power(): p = power( ref_density_cp_ct=AIR_DENSITY, rotor_effective_velocities=wind_speed * np.ones((1, 1, 1, 3, 3)), - power_interp=np.array([(turbine.turbine_type, turbine.fCp_interp)]), + power_interp={turbine.turbine_type: turbine.fCp_interp}, turbine_type_map=turbine_type_map[:,:,0] ) @@ -336,7 +336,7 @@ def test_power(): # velocities=np.ones((N_TURBINES, 3, 3)) * WIND_CONDITION_BROADCAST, # 3 x 4 x 4 x 3 x 3 # yaw_angle=np.zeros((1, 1, N_TURBINES)), # pP=turbine.pP * np.ones((3, 4, N_TURBINES)), - # power_interp=np.array([(turbine.turbine_type, turbine.fCp_interp)]), + # power_interp={turbine.turbine_type: turbine.fCp_interp}, # turbine_type_map=turbine_type_map, # ix_filter=INDEX_FILTER, # ) @@ -379,7 +379,7 @@ def test_axial_induction(): yaw_angle=np.zeros((1, 1, 1)), tilt_angle=np.ones((1, 1, 1)) * 5.0, ref_tilt_cp_ct=np.ones((1, 1, 1)) * 5.0, - fCt=np.array([(turbine.turbine_type, turbine.fCt_interp)]), + fCt={turbine.turbine_type: turbine.fCt_interp}, tilt_interp=np.array([(turbine.turbine_type, None)]), correct_cp_ct_for_tilt=np.array([[[False]]]), turbine_type_map=turbine_type_map[0,0,0], @@ -392,7 +392,7 @@ def test_axial_induction(): yaw_angle=np.zeros((1, 1, N_TURBINES)), tilt_angle=np.ones((1, 1, N_TURBINES)) * 5.0, ref_tilt_cp_ct=np.ones((1, 1, N_TURBINES)) * 5.0, - fCt=np.array([(turbine.turbine_type, turbine.fCt_interp)]), + fCt={turbine.turbine_type: turbine.fCt_interp}, tilt_interp=np.array([(turbine.turbine_type, None)] * N_TURBINES), correct_cp_ct_for_tilt=np.array([[[False] * N_TURBINES]]), turbine_type_map=turbine_type_map, @@ -410,7 +410,7 @@ def test_axial_induction(): yaw_angle=np.zeros((1, 1, 1)), tilt_angle=np.ones((1, 1, 1)) * 5.0, ref_tilt_cp_ct=np.ones((1, 1, 1)) * 5.0, - fCt=np.array([(turbine_floating.turbine_type, turbine_floating.fCt_interp)]), + fCt={turbine.turbine_type: turbine_floating.fCt_interp}, tilt_interp=np.array([(turbine_floating.turbine_type, turbine_floating.fTilt_interp)]), correct_cp_ct_for_tilt=np.array([[[True]]]), turbine_type_map=turbine_type_map[0,0,0], diff --git a/tests/utilities_unit_test.py b/tests/utilities_unit_test.py index eeefc6f93..3599d31a3 100644 --- a/tests/utilities_unit_test.py +++ b/tests/utilities_unit_test.py @@ -76,11 +76,13 @@ def test_wrap_360(): assert wrap_360(361.0) == 1.0 -def test_wind_deviation_from_west(): +def test_wind_delta(): assert wind_delta(270.0) == 0.0 assert wind_delta(280.0) == 10.0 assert wind_delta(360.0) == 90.0 assert wind_delta(180.0) == 270.0 + assert wind_delta(-10.0) == 80.0 + assert wind_delta(-100.0) == 350.0 def test_rotate_coordinates_rel_west():