From 2dfba147bcb9ddb38adf8e3af5eab8030bd4f52c Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Fri, 13 Oct 2023 23:42:14 +0000 Subject: [PATCH] build based on 92c4936 --- stable | 2 +- v0.15 | 2 +- v0.15.1/assets/documenter.js | 340 +++++++ v0.15.1/assets/line_connection_example.svg | 436 +++++++++ v0.15.1/assets/loads.svg | 100 ++ v0.15.1/assets/loads_connection_example.svg | 334 +++++++ v0.15.1/assets/loads_delta_3ph.svg | 183 ++++ v0.15.1/assets/loads_wye_1ph.svg | 176 ++++ v0.15.1/assets/loads_wye_2ph.svg | 153 +++ v0.15.1/assets/loads_wye_3ph.svg | 206 ++++ v0.15.1/assets/logo.svg | 1 + v0.15.1/assets/search.js | 267 ++++++ v0.15.1/assets/themes/documenter-dark.css | 7 + v0.15.1/assets/themes/documenter-light.css | 9 + v0.15.1/assets/themeswap.js | 66 ++ v0.15.1/assets/warner.js | 49 + v0.15.1/developer/contributing.html | 2 + v0.15.1/developer/extensions.html | 2 + v0.15.1/developer/roadmap.html | 2 + v0.15.1/developer/style.html | 4 + v0.15.1/index.html | 14 + v0.15.1/installation.html | 4 + v0.15.1/manual/connections.html | 2 + v0.15.1/manual/eng-data-model.html | 12 + v0.15.1/manual/eng2math.html | 2 + v0.15.1/manual/enums.html | 2 + v0.15.1/manual/external-data-formats.html | 2 + v0.15.1/manual/formulations.html | 51 + v0.15.1/manual/load-model.html | 6 + v0.15.1/manual/math-model.html | 64 ++ v0.15.1/manual/power-flow.html | 38 + v0.15.1/manual/quickguide.html | 15 + v0.15.1/manual/specifications.html | 23 + v0.15.1/reference/base.html | 32 + v0.15.1/reference/constants.html | 2 + v0.15.1/reference/constraints.html | 905 ++++++++++++++++++ v0.15.1/reference/data_models.html | 257 +++++ v0.15.1/reference/enums.html | 2 + v0.15.1/reference/formulations.html | 38 + v0.15.1/reference/internal.html | 89 ++ v0.15.1/reference/logging.html | 2 + v0.15.1/reference/objectives.html | 2 + v0.15.1/reference/problems.html | 73 ++ v0.15.1/reference/variables.html | 266 +++++ v0.15.1/search.html | 2 + v0.15.1/search_index.js | 3 + v0.15.1/siteinfo.js | 1 + v0.15.1/tutorials/Beginners Guide.html | 366 +++++++ v0.15.1/tutorials/Beginners Guide.jl.html | 15 + .../Engineering Model - Helper Functions.html | 366 +++++++ ...gineering Model - Helper Functions.jl.html | 15 + .../tutorials/Explicit Neutral Models.html | 366 +++++++ .../tutorials/Explicit Neutral Models.jl.html | 15 + v0.15.1/tutorials/Extension Tutorial.html | 366 +++++++ v0.15.1/tutorials/Extension Tutorial.jl.html | 15 + v0.15.1/tutorials/Native Power Flow.html | 366 +++++++ v0.15.1/tutorials/Native Power Flow.jl.html | 15 + v0.15.1/tutorials/The Engineering Model.html | 366 +++++++ .../tutorials/The Engineering Model.jl.html | 15 + v0.15.1/tutorials/basic.html | 366 +++++++ v0.15.1/tutorials/basic.jl.html | 15 + versions.js | 2 +- 62 files changed, 6916 insertions(+), 3 deletions(-) create mode 100644 v0.15.1/assets/documenter.js create mode 100644 v0.15.1/assets/line_connection_example.svg create mode 100644 v0.15.1/assets/loads.svg create mode 100644 v0.15.1/assets/loads_connection_example.svg create mode 100644 v0.15.1/assets/loads_delta_3ph.svg create mode 100644 v0.15.1/assets/loads_wye_1ph.svg create mode 100644 v0.15.1/assets/loads_wye_2ph.svg create mode 100644 v0.15.1/assets/loads_wye_3ph.svg create mode 100644 v0.15.1/assets/logo.svg create mode 100644 v0.15.1/assets/search.js create mode 100644 v0.15.1/assets/themes/documenter-dark.css create mode 100644 v0.15.1/assets/themes/documenter-light.css create mode 100644 v0.15.1/assets/themeswap.js create mode 100644 v0.15.1/assets/warner.js create mode 100644 v0.15.1/developer/contributing.html create mode 100644 v0.15.1/developer/extensions.html create mode 100644 v0.15.1/developer/roadmap.html create mode 100644 v0.15.1/developer/style.html create mode 100644 v0.15.1/index.html create mode 100644 v0.15.1/installation.html create mode 100644 v0.15.1/manual/connections.html create mode 100644 v0.15.1/manual/eng-data-model.html create mode 100644 v0.15.1/manual/eng2math.html create mode 100644 v0.15.1/manual/enums.html create mode 100644 v0.15.1/manual/external-data-formats.html create mode 100644 v0.15.1/manual/formulations.html create mode 100644 v0.15.1/manual/load-model.html create mode 100644 v0.15.1/manual/math-model.html create mode 100644 v0.15.1/manual/power-flow.html create mode 100644 v0.15.1/manual/quickguide.html create mode 100644 v0.15.1/manual/specifications.html create mode 100644 v0.15.1/reference/base.html create mode 100644 v0.15.1/reference/constants.html create mode 100644 v0.15.1/reference/constraints.html create mode 100644 v0.15.1/reference/data_models.html create mode 100644 v0.15.1/reference/enums.html create mode 100644 v0.15.1/reference/formulations.html create mode 100644 v0.15.1/reference/internal.html create mode 100644 v0.15.1/reference/logging.html create mode 100644 v0.15.1/reference/objectives.html create mode 100644 v0.15.1/reference/problems.html create mode 100644 v0.15.1/reference/variables.html create mode 100644 v0.15.1/search.html create mode 100644 v0.15.1/search_index.js create mode 100644 v0.15.1/siteinfo.js create mode 100644 v0.15.1/tutorials/Beginners Guide.html create mode 100644 v0.15.1/tutorials/Beginners Guide.jl.html create mode 100644 v0.15.1/tutorials/Engineering Model - Helper Functions.html create mode 100644 v0.15.1/tutorials/Engineering Model - Helper Functions.jl.html create mode 100644 v0.15.1/tutorials/Explicit Neutral Models.html create mode 100644 v0.15.1/tutorials/Explicit Neutral Models.jl.html create mode 100644 v0.15.1/tutorials/Extension Tutorial.html create mode 100644 v0.15.1/tutorials/Extension Tutorial.jl.html create mode 100644 v0.15.1/tutorials/Native Power Flow.html create mode 100644 v0.15.1/tutorials/Native Power Flow.jl.html create mode 100644 v0.15.1/tutorials/The Engineering Model.html create mode 100644 v0.15.1/tutorials/The Engineering Model.jl.html create mode 100644 v0.15.1/tutorials/basic.html create mode 100644 v0.15.1/tutorials/basic.jl.html diff --git a/stable b/stable index c06eba1aa..2080a12c7 120000 --- a/stable +++ b/stable @@ -1 +1 @@ -v0.15.0 \ No newline at end of file +v0.15.1 \ No newline at end of file diff --git a/v0.15 b/v0.15 index c06eba1aa..2080a12c7 120000 --- a/v0.15 +++ b/v0.15 @@ -1 +1 @@ -v0.15.0 \ No newline at end of file +v0.15.1 \ No newline at end of file diff --git a/v0.15.1/assets/documenter.js b/v0.15.1/assets/documenter.js new file mode 100644 index 000000000..32e27c514 --- /dev/null +++ b/v0.15.1/assets/documenter.js @@ -0,0 +1,340 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + 'mathjax': 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS_HTML', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "mathjax": { + "exports": "MathJax" + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['mathjax'], function(MathJax) { +MathJax.Hub.Config({ + "jax": [ + "input/TeX", + "output/HTML-CSS", + "output/NativeMML" + ], + "TeX": { + "equationNumbers": { + "autoNumber": "AMS" + } + }, + "tex2jax": { + "inlineMath": [ + [ + "$", + "$" + ], + [ + "\\(", + "\\)" + ] + ], + "processEscapes": true + }, + "config": [ + "MMLorHTML.js" + ], + "extensions": [ + "MathMenu.js", + "MathZoom.js", + "TeX/AMSmath.js", + "TeX/AMSsymbols.js", + "TeX/autobold.js", + "TeX/autoload-all.js" + ] +} +); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fas", "fa-copy"); + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-times"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-times"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function() { + $('#documenter .docs-navbar').headroom({ + "tolerance": {"up": 10, "down": 10}, + }); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function() { + var settings = $('#documenter-settings'); + $('#documenter-settings-button').click(function(){ + settings.toggleClass('is-active'); + }); + // Close the dialog if X is clicked + $('#documenter-settings button.delete').click(function(){ + settings.removeClass('is-active'); + }); + // Close dialog if ESC is pressed + $(document).keyup(function(e) { + if (e.keyCode == 27) settings.removeClass('is-active'); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function() { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button") + sidebar_button.click(function(ev) { + ev.preventDefault(); + sidebar.toggleClass('visible'); + if (sidebar.hasClass('visible')) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind('click', function(ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass('visible')) { + sidebar.removeClass('visible'); + } + }); +}) + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function() { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css('max-width'), 10); + var L0 = e.width(); + if(L0 > L) { + var h0 = parseInt(e.css('font-size'), 10); + e.css('font-size', L * h0 / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on('orientationchange', resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function() { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if(typeof active !== 'undefined') { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +function set_theme(theme) { + var active = null; + var disabled = []; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + var themename = ss.ownerNode.getAttribute("data-theme-name"); + if(themename === null) continue; // ignore non-theme stylesheets + // Find the active theme + if(themename === theme) active = ss; + else disabled.push(ss); + } + if(active !== null) { + active.disabled = false; + if(active.ownerNode.getAttribute("data-theme-primary") === null) { + document.getElementsByTagName('html')[0].className = "theme--" + theme; + } else { + document.getElementsByTagName('html')[0].className = ""; + } + disabled.forEach(function(ss){ + ss.disabled = true; + }); + } + + // Store the theme in localStorage + if(typeof(window.localStorage) !== "undefined") { + window.localStorage.setItem("documenter-theme", theme); + } else { + console.error("Browser does not support window.localStorage"); + } +} + +// Theme picker setup +$(document).ready(function() { + // onchange callback + $('#documenter-themepicker').change(function themepick_callback(ev){ + var themename = $('#documenter-themepicker option:selected').attr('value'); + set_theme(themename); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if(typeof(window.localStorage) !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if(theme !== null) { + $('#documenter-themepicker option').each(function(i,e) { + e.selected = (e.value === theme); + }) + } else { + $('#documenter-themepicker option').each(function(i,e) { + e.selected = $("html").hasClass(`theme--${e.value}`); + }) + } + } +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function() { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if (typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === 'boolean' && DOCUMENTER_VERSION_SELECTOR_DISABLED) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function(x) { + target_href = version_selector_select.children("option:selected").get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && $('#version-selector > option').length == 0) { + var option = $(""); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== 'undefined') { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function(i,x){return x.text}); + DOC_VERSIONS.forEach(function(each) { + var version_url = documenterBaseURL + "/../" + each; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $(""); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}) + +}) diff --git a/v0.15.1/assets/line_connection_example.svg b/v0.15.1/assets/line_connection_example.svg new file mode 100644 index 000000000..20a055522 --- /dev/null +++ b/v0.15.1/assets/line_connection_example.svg @@ -0,0 +1,436 @@ + +image/svg+xmlf +connections=[“a”,“n”] +1 +2 +1 +2 +line +a +f +bus +b +c +n +a +t +bus +n +t +connections=[“a”,“n”] + \ No newline at end of file diff --git a/v0.15.1/assets/loads.svg b/v0.15.1/assets/loads.svg new file mode 100644 index 000000000..63d13178b --- /dev/null +++ b/v0.15.1/assets/loads.svg @@ -0,0 +1,100 @@ + +image/svg+xmlsd[1] +1 +2 + \ No newline at end of file diff --git a/v0.15.1/assets/loads_connection_example.svg b/v0.15.1/assets/loads_connection_example.svg new file mode 100644 index 000000000..cba7a40e7 --- /dev/null +++ b/v0.15.1/assets/loads_connection_example.svg @@ -0,0 +1,334 @@ + +image/svg+xmla +bus +b +c +n +1 +2 +3 +sd[1] +sd[2] +load +connections=[“a”,“c”,“n”] +terminals=[“a”,“b”,“c”,“n”] + \ No newline at end of file diff --git a/v0.15.1/assets/loads_delta_3ph.svg b/v0.15.1/assets/loads_delta_3ph.svg new file mode 100644 index 000000000..96324c607 --- /dev/null +++ b/v0.15.1/assets/loads_delta_3ph.svg @@ -0,0 +1,183 @@ + +image/svg+xmlsd[2] +sd[1] +sd[3] +1 +2 +3 + \ No newline at end of file diff --git a/v0.15.1/assets/loads_wye_1ph.svg b/v0.15.1/assets/loads_wye_1ph.svg new file mode 100644 index 000000000..bc40a154f --- /dev/null +++ b/v0.15.1/assets/loads_wye_1ph.svg @@ -0,0 +1,176 @@ + +image/svg+xml1 +2 +sd[1] +1 +2 +sd[1] + \ No newline at end of file diff --git a/v0.15.1/assets/loads_wye_2ph.svg b/v0.15.1/assets/loads_wye_2ph.svg new file mode 100644 index 000000000..31fdd0df2 --- /dev/null +++ b/v0.15.1/assets/loads_wye_2ph.svg @@ -0,0 +1,153 @@ + +image/svg+xml1 +2 +3 +sd[1] +sd[2] + \ No newline at end of file diff --git a/v0.15.1/assets/loads_wye_3ph.svg b/v0.15.1/assets/loads_wye_3ph.svg new file mode 100644 index 000000000..d663078b8 --- /dev/null +++ b/v0.15.1/assets/loads_wye_3ph.svg @@ -0,0 +1,206 @@ + +image/svg+xml1 +2 +3 +4 +sd[1] +sd[2] +sd[3] + \ No newline at end of file diff --git a/v0.15.1/assets/logo.svg b/v0.15.1/assets/logo.svg new file mode 100644 index 000000000..43252d323 --- /dev/null +++ b/v0.15.1/assets/logo.svg @@ -0,0 +1 @@ +Power Models Distribution \ No newline at end of file diff --git a/v0.15.1/assets/search.js b/v0.15.1/assets/search.js new file mode 100644 index 000000000..c133f7410 --- /dev/null +++ b/v0.15.1/assets/search.js @@ -0,0 +1,267 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'lunr': 'https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.9/lunr.min', + 'lodash': 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + } +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'lunr', 'lodash'], function($, lunr, _) { + +$(document).ready(function() { + // parseUri 1.2.2 + // (c) Steven Levithan + // MIT License + function parseUri (str) { + var o = parseUri.options, + m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), + uri = {}, + i = 14; + + while (i--) uri[o.key[i]] = m[i] || ""; + + uri[o.q.name] = {}; + uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { + if ($1) uri[o.q.name][$1] = $2; + }); + + return uri; + }; + parseUri.options = { + strictMode: false, + key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], + q: { + name: "queryKey", + parser: /(?:^|&)([^&=]*)=?([^&]*)/g + }, + parser: { + strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, + loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ + } + }; + + $("#search-form").submit(function(e) { + e.preventDefault() + }) + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + lunr.stopWordFilter = lunr.generateStopWordFilter([ + 'a', + 'able', + 'about', + 'across', + 'after', + 'almost', + 'also', + 'am', + 'among', + 'an', + 'and', + 'are', + 'as', + 'at', + 'be', + 'because', + 'been', + 'but', + 'by', + 'can', + 'cannot', + 'could', + 'dear', + 'did', + 'does', + 'either', + 'ever', + 'every', + 'from', + 'got', + 'had', + 'has', + 'have', + 'he', + 'her', + 'hers', + 'him', + 'his', + 'how', + 'however', + 'i', + 'if', + 'into', + 'it', + 'its', + 'just', + 'least', + 'like', + 'likely', + 'may', + 'me', + 'might', + 'most', + 'must', + 'my', + 'neither', + 'no', + 'nor', + 'not', + 'of', + 'off', + 'often', + 'on', + 'or', + 'other', + 'our', + 'own', + 'rather', + 'said', + 'say', + 'says', + 'she', + 'should', + 'since', + 'so', + 'some', + 'than', + 'that', + 'the', + 'their', + 'them', + 'then', + 'there', + 'these', + 'they', + 'this', + 'tis', + 'to', + 'too', + 'twas', + 'us', + 'wants', + 'was', + 'we', + 'were', + 'what', + 'when', + 'who', + 'whom', + 'why', + 'will', + 'would', + 'yet', + 'you', + 'your' + ]) + + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!" + // would not find anything if searching for "add!", only for the entire qualification + lunr.tokenizer.separator = /[\s\-\.]+/ + + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + lunr.trimmer = function (token) { + return token.update(function (s) { + return s.replace(/^[^a-zA-Z0-9@!]+/, '').replace(/[^a-zA-Z0-9@!]+$/, '') + }) + } + + lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'juliaStopWordFilter') + lunr.Pipeline.registerFunction(lunr.trimmer, 'juliaTrimmer') + + var index = lunr(function () { + this.ref('location') + this.field('title',{boost: 100}) + this.field('text') + documenterSearchIndex['docs'].forEach(function(e) { + this.add(e) + }, this) + }) + var store = {} + + documenterSearchIndex['docs'].forEach(function(e) { + store[e.location] = {title: e.title, category: e.category, page: e.page} + }) + + $(function(){ + searchresults = $('#documenter-search-results'); + searchinfo = $('#documenter-search-info'); + searchbox = $('#documenter-search-query'); + searchform = $('.docs-search'); + sidebar = $('.docs-sidebar'); + function update_search(querystring) { + tokens = lunr.tokenizer(querystring) + results = index.query(function (q) { + tokens.forEach(function (t) { + q.term(t.toString(), { + fields: ["title"], + boost: 100, + usePipeline: true, + editDistance: 0, + wildcard: lunr.Query.wildcard.NONE + }) + q.term(t.toString(), { + fields: ["title"], + boost: 10, + usePipeline: true, + editDistance: 2, + wildcard: lunr.Query.wildcard.NONE + }) + q.term(t.toString(), { + fields: ["text"], + boost: 1, + usePipeline: true, + editDistance: 0, + wildcard: lunr.Query.wildcard.NONE + }) + }) + }) + searchinfo.text("Number of results: " + results.length) + searchresults.empty() + results.forEach(function(result) { + data = store[result.ref] + link = $(''+data.title+'') + link.attr('href', documenterBaseURL+'/'+result.ref) + if (data.category != "page"){ + cat = $('('+data.category+', '+data.page+')') + } else { + cat = $('('+data.category+')') + } + li = $('
  • ').append(link).append(" ").append(cat) + searchresults.append(li) + }) + } + + function update_search_box() { + querystring = searchbox.val() + update_search(querystring) + } + + searchbox.keyup(_.debounce(update_search_box, 250)) + searchbox.change(update_search_box) + + // Disable enter-key form submission for the searchbox on the search page + // and just re-run search rather than refresh the whole page. + searchform.keypress( + function(event){ + if (event.which == '13') { + if (sidebar.hasClass('visible')) { + sidebar.removeClass('visible'); + } + update_search_box(); + event.preventDefault(); + } + } + ); + + search_query_uri = parseUri(window.location).queryKey["q"] + if(search_query_uri !== undefined) { + search_query = decodeURIComponent(search_query_uri.replace(/\+/g, '%20')) + searchbox.val(search_query) + } + update_search_box(); + }) +}) + +}) diff --git a/v0.15.1/assets/themes/documenter-dark.css b/v0.15.1/assets/themes/documenter-dark.css new file mode 100644 index 000000000..c94a294dc --- /dev/null +++ b/v0.15.1/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable,html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .list:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .highlight:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:15px;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.375em - 1px);padding-left:calc(0.625em - 1px);padding-right:calc(0.625em - 1px);padding-top:calc(0.375em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,embed,iframe,object,video{height:auto;max-width:100%}audio{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-clipped{overflow:hidden !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:15px !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.85em !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:15px !important}.is-size-7-mobile{font-size:.85em !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:15px !important}.is-size-7-tablet{font-size:.85em !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:15px !important}.is-size-7-touch{font-size:.85em !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:15px !important}.is-size-7-desktop{font-size:.85em !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:15px !important}.is-size-7-widescreen{font-size:.85em !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:15px !important}.is-size-7-fullhd{font-size:.85em !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-relative{position:relative !important}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:left}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(0.375em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.375em - 1px);margin-right:0.1875em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:calc(-0.375em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.375em - 1px);margin-right:calc(-0.375em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:#1d2122}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:#282f2f;border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#dde4e6}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#ecf0f1;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:3px;font-size:.85em}html.theme--documenter-dark .button.is-normal{font-size:15px}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#dbdee0;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:290486px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:0.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:3px;font-size:.85em}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}html.theme--documenter-dark .container.is-fluid{margin-left:32px;margin-right:32px;max-width:none}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen{max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd{max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container{max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container{max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:left}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.85em}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:290486px}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{position:absolute;right:0.5rem;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:15px;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#5e6d6f}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#5e6d6f;background-image:linear-gradient(to right, #fff 30%, #5e6d6f 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.85em}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:15px}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.85em;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:0.25rem;margin-right:-0.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.85em}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:15px}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-0.375em;margin-right:0.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:-0.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-0.375em;margin-right:-0.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:290486px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title+.highlight{margin-top:-0.75rem}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:15px}html.theme--documenter-dark .title.is-7{font-size:.85em}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:15px}html.theme--documenter-dark .subtitle.is-7{font-size:.85em}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}html.theme--documenter-dark .highlight pre{overflow:auto;max-width:100%}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.85em}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:290486px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:0.625em;resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:600px;min-height:120px}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:0.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.25em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:290486px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.85em}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:0.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.85em}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:#282f2f}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#ecf0f1}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.85em}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#e5eaec;color:#282f2f}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#ecf0f1;color:#343c3d}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:0.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#282f2f;display:block;font-size:15px;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.85em}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.85em;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:0.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.85em;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:0.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:15px;position:relative;text-align:left}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#5e6d6f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.85em}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#dbdee0;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.25em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.25em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:0.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.85em}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:15px;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:0.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:0.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.85em}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:.75rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #5e6d6f;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #5e6d6f}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#5e6d6f;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .list{background-color:#fff;border-radius:.4em;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1)}html.theme--documenter-dark .list-item{display:block;padding:0.5em 1em}html.theme--documenter-dark .list-item:not(a){color:#fff}html.theme--documenter-dark .list-item:first-child{border-top-left-radius:.4em;border-top-right-radius:.4em}html.theme--documenter-dark .list-item:last-child{border-bottom-left-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .list-item:not(:last-child){border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .list-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark a.list-item{background-color:#282f2f;cursor:pointer}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:left}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:0.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:0.5rem}html.theme--documenter-dark .media .media .media{padding-top:0.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:0.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:15px}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.85em}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:15px}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.85em}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff;color:#4d4d4d}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a;color:#090909}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1;color:#505050}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f;color:#212526}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f8fafc}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#2b4159}html.theme--documenter-dark .message.is-link{background-color:#f6fefc}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#0b2f28}html.theme--documenter-dark .message.is-info{background-color:#f5fbff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#033659}html.theme--documenter-dark .message.is-success{background-color:#f5fff9}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#023518}html.theme--documenter-dark .message.is-warning{background-color:#fffcf5}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#3d2e03}html.theme--documenter-dark .message.is-danger{background-color:#fef6f6}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#7a170c}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:0.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px),print{html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:0.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:#282f2f}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:#282f2f}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#ecf0f1}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#ecf0f1}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{display:block;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item{display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:15px;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.85em}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:290486px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:290486px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.25em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled]{background-color:#dbdee0;border-color:#dbdee0;box-shadow:none;color:#5e6d6f;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{font-size:15px}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs,html.theme--documenter-dark .panel-block{border-bottom:1px solid #5e6d6f;border-left:1px solid #5e6d6f;border-right:1px solid #5e6d6f}html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child,html.theme--documenter-dark .panel-block:first-child{border-top:1px solid #5e6d6f}html.theme--documenter-dark .panel-heading{background-color:#282f2f;border-radius:.4em .4em 0 0;color:#f2f2f2;font-size:1.25em;font-weight:300;line-height:1.25;padding:0.5em 0.75em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:0.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:0.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:15px;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:0.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:0.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-radius:.4em 0 0 .4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-radius:0 .4em .4em 0}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.85em}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.3333333333%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.6666666667%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.3333333333%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.6666666667%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.3333333333%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.6666666667%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.3333333333%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.6666666667%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:#282f2f}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(40,47,47,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:#282f2f}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(40,47,47,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .hero.is-light .tabs a{color:#282f2f;opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:#282f2f}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(236,240,241,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#ecf0f1}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(236,240,241,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#ecf0f1;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section.is-medium{padding:9rem 1.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 1.5rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:#282f2f;text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#ecf0f1;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 5 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:15px}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.85em}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 5 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 1px 2px rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button{margin:auto 0 auto 1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{font-size:1.5rem;margin:auto 0 auto 1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:15px;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:14.25px;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:11.25px;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:12.75px;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark #documenter .docs-main #documenter-search-info{margin-bottom:1rem}html.theme--documenter-dark #documenter .docs-main #documenter-search-results{list-style-type:circle;list-style-position:outside}html.theme--documenter-dark #documenter .docs-main #documenter-search-results li{margin-left:2rem}html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight{background-color:yellow}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2} diff --git a/v0.15.1/assets/themes/documenter-light.css b/v0.15.1/assets/themes/documenter-light.css new file mode 100644 index 000000000..9b9a14b04 --- /dev/null +++ b/v0.15.1/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable,.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.message:not(:last-child),.list:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.highlight:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.375em - 1px);padding-left:calc(0.625em - 1px);padding-right:calc(0.625em - 1px);padding-top:calc(0.375em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,embed,iframe,object,video{height:auto;max-width:100%}audio{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:left}table th{color:#222}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-clipped{overflow:hidden !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-relative{position:relative !important}.box{background-color:#fff;border-radius:6px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(0.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(0.375em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.375em - 1px);margin-right:0.1875em}.button .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:calc(-0.375em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.375em - 1px);margin-right:calc(-0.375em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:#363636}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:#363636}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:#363636}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:#363636}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:#292929}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:#363636;border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#f5f5f5}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#f5f5f5}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#f5f5f5}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#e8e8e8}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#f5f5f5;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#f5f5f5}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{border-radius:2px;font-size:.75rem}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:290486px;padding-left:1em;padding-right:1em}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:0.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:2px;font-size:.75rem}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width: 1056px){.container{max-width:992px}.container.is-fluid{margin-left:32px;margin-right:32px;max-width:none}}@media screen and (max-width: 1215px){.container.is-widescreen{max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd{max-width:1344px}}@media screen and (min-width: 1216px){.container{max-width:1152px}}@media screen and (min-width: 1408px){.container{max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:left}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:290486px}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{position:absolute;right:0.5rem;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:#363636}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#f5f5f5}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-danger{background-color:#da0b00;color:#fff}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#dbdbdb}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #dbdbdb 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #dbdbdb 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #dbdbdb 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #dbdbdb 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #dbdbdb 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #dbdbdb 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#dbdbdb;background-image:linear-gradient(to right, #222 30%, #dbdbdb 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:0.25rem;margin-right:-0.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:#363636}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#f5f5f5}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-0.375em;margin-right:0.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:-0.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-0.375em;margin-right:-0.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:290486px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-0.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}.highlight pre{overflow:auto;max-width:100%}.number{align-items:center;background-color:#f5f5f5;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(54,54,54,0.3)}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(54,54,54,0.3)}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(54,54,54,0.3)}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(54,54,54,0.3)}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:290486px;padding-left:1em;padding-right:1em}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:0.625em;resize:vertical}.textarea:not([rows]){max-height:600px;min-height:120px}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#363636}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:0.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.25em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:290486px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:0.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:#363636}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:#363636}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:#363636}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:#363636}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#f5f5f5}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#f5f5f5}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#f5f5f5}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:0.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:0.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:0.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:left}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#6b6b6b}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.25em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.25em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:0.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:0.5em}.breadcrumb .icon:last-child{margin-left:0.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#222;max-width:100%;position:relative}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:.75rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}.card-image{display:block;position:relative}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #dbdbdb;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #dbdbdb}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#dbdbdb;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.list{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1)}.list-item{display:block;padding:0.5em 1em}.list-item:not(a){color:#222}.list-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-item:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.list-item:not(:last-child){border-bottom:1px solid #dbdbdb}.list-item.is-active{background-color:#2e63b8;color:#fff}a.list-item{background-color:#f5f5f5;cursor:pointer}.media{align-items:flex-start;display:flex;text-align:left}.media .content:not(:last-child){margin-bottom:0.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:0.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:0.5rem}.media .media .media{padding-top:0.5rem}.media .media .media+.media{margin-top:0.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff;color:#4d4d4d}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a;color:#090909}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:#363636}.message.is-light .message-body{border-color:#f5f5f5;color:#505050}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#f5f5f5}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636;color:#2a2a2a}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#f6fbfd}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1f556a}.message.is-link{background-color:#f7f9fd}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#264981}.message.is-info{background-color:#f6fbfe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#12537d}.message.is-success{background-color:#f6fdf9}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#0f361d}.message.is-warning{background-color:#fffdf5}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#3c3108}.message.is-danger{background-color:#fff5f5}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#9b0c04}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:0.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px),print{.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:0.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:#363636}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:#363636}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-brand .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-burger{color:#363636}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:#363636}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#363636}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#f5f5f5}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#f5f5f5}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#f5f5f5}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#f5f5f5}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#f5f5f5}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{display:block;flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item{display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:290486px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:290486px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#363636;min-width:2.25em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel-heading,.panel-tabs,.panel-block{border-bottom:1px solid #dbdbdb;border-left:1px solid #dbdbdb;border-right:1px solid #dbdbdb}.panel-heading:first-child,.panel-tabs:first-child,.panel-block:first-child{border-top:1px solid #dbdbdb}.panel-heading{background-color:#f5f5f5;border-radius:4px 4px 0 0;color:#222;font-size:1.25em;font-weight:300;line-height:1.25;padding:0.5em 0.75em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:0.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:0.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:0.5em}.tabs .icon:last-child{margin-left:0.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-radius:4px 0 0 4px}.tabs.is-toggle li:last-child a{border-radius:0 4px 4px 0}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.3333333333%}.columns.is-mobile>.column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.6666666667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.3333333333%}.columns.is-mobile>.column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.6666666667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.3333333333%}.columns.is-mobile>.column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.6666666667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.3333333333%}.columns.is-mobile>.column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.6666666667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.3333333333%}.column.is-offset-1-mobile{margin-left:8.3333333333%}.column.is-2-mobile{flex:none;width:16.6666666667%}.column.is-offset-2-mobile{margin-left:16.6666666667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.3333333333%}.column.is-offset-4-mobile{margin-left:33.3333333333%}.column.is-5-mobile{flex:none;width:41.6666666667%}.column.is-offset-5-mobile{margin-left:41.6666666667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.3333333333%}.column.is-offset-7-mobile{margin-left:58.3333333333%}.column.is-8-mobile{flex:none;width:66.6666666667%}.column.is-offset-8-mobile{margin-left:66.6666666667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.3333333333%}.column.is-offset-10-mobile{margin-left:83.3333333333%}.column.is-11-mobile{flex:none;width:91.6666666667%}.column.is-offset-11-mobile{margin-left:91.6666666667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.3333333333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.3333333333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.6666666667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.6666666667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.3333333333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.3333333333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.6666666667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.6666666667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.3333333333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.3333333333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.6666666667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.6666666667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.3333333333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.3333333333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.6666666667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.6666666667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.3333333333%}.column.is-offset-1-touch{margin-left:8.3333333333%}.column.is-2-touch{flex:none;width:16.6666666667%}.column.is-offset-2-touch{margin-left:16.6666666667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.3333333333%}.column.is-offset-4-touch{margin-left:33.3333333333%}.column.is-5-touch{flex:none;width:41.6666666667%}.column.is-offset-5-touch{margin-left:41.6666666667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.3333333333%}.column.is-offset-7-touch{margin-left:58.3333333333%}.column.is-8-touch{flex:none;width:66.6666666667%}.column.is-offset-8-touch{margin-left:66.6666666667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.3333333333%}.column.is-offset-10-touch{margin-left:83.3333333333%}.column.is-11-touch{flex:none;width:91.6666666667%}.column.is-offset-11-touch{margin-left:91.6666666667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.3333333333%}.column.is-offset-1-desktop{margin-left:8.3333333333%}.column.is-2-desktop{flex:none;width:16.6666666667%}.column.is-offset-2-desktop{margin-left:16.6666666667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.3333333333%}.column.is-offset-4-desktop{margin-left:33.3333333333%}.column.is-5-desktop{flex:none;width:41.6666666667%}.column.is-offset-5-desktop{margin-left:41.6666666667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.3333333333%}.column.is-offset-7-desktop{margin-left:58.3333333333%}.column.is-8-desktop{flex:none;width:66.6666666667%}.column.is-offset-8-desktop{margin-left:66.6666666667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.3333333333%}.column.is-offset-10-desktop{margin-left:83.3333333333%}.column.is-11-desktop{flex:none;width:91.6666666667%}.column.is-offset-11-desktop{margin-left:91.6666666667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.3333333333%}.column.is-offset-1-widescreen{margin-left:8.3333333333%}.column.is-2-widescreen{flex:none;width:16.6666666667%}.column.is-offset-2-widescreen{margin-left:16.6666666667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.3333333333%}.column.is-offset-4-widescreen{margin-left:33.3333333333%}.column.is-5-widescreen{flex:none;width:41.6666666667%}.column.is-offset-5-widescreen{margin-left:41.6666666667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.3333333333%}.column.is-offset-7-widescreen{margin-left:58.3333333333%}.column.is-8-widescreen{flex:none;width:66.6666666667%}.column.is-offset-8-widescreen{margin-left:66.6666666667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.3333333333%}.column.is-offset-10-widescreen{margin-left:83.3333333333%}.column.is-11-widescreen{flex:none;width:91.6666666667%}.column.is-offset-11-widescreen{margin-left:91.6666666667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.3333333333%}.column.is-offset-1-fullhd{margin-left:8.3333333333%}.column.is-2-fullhd{flex:none;width:16.6666666667%}.column.is-offset-2-fullhd{margin-left:16.6666666667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.3333333333%}.column.is-offset-4-fullhd{margin-left:33.3333333333%}.column.is-5-fullhd{flex:none;width:41.6666666667%}.column.is-offset-5-fullhd{margin-left:41.6666666667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.3333333333%}.column.is-offset-7-fullhd{margin-left:58.3333333333%}.column.is-8-fullhd{flex:none;width:66.6666666667%}.column.is-offset-8-fullhd{margin-left:66.6666666667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.3333333333%}.column.is-offset-10-fullhd{margin-left:83.3333333333%}.column.is-11-fullhd{flex:none;width:91.6666666667%}.column.is-offset-11-fullhd{margin-left:91.6666666667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.3333333333%}.tile.is-2{flex:none;width:16.6666666667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.3333333333%}.tile.is-5{flex:none;width:41.6666666667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.3333333333%}.tile.is-8{flex:none;width:66.6666666667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.3333333333%}.tile.is-11{flex:none;width:91.6666666667%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:#363636}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:#363636}.hero.is-light .subtitle{color:rgba(54,54,54,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:#363636}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(54,54,54,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.hero.is-light .tabs a{color:#363636;opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:#363636}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#f5f5f5}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#f5f5f5}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(245,245,245,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#f5f5f5}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(245,245,245,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#f5f5f5;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#f5f5f5}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 5 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 5 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 1px 2px rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb}.docstring>header code{background-color:transparent}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label,#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}#documenter .docs-main header.docs-navbar .docs-right .docs-settings-button{margin:auto 0 auto 1rem}#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{font-size:1.5rem;margin:auto 0 auto 1rem}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}#documenter .docs-main #documenter-search-info{margin-bottom:1rem}#documenter .docs-main #documenter-search-results{list-style-type:circle;list-style-position:outside}#documenter .docs-main #documenter-search-results li{margin-left:2rem}#documenter .docs-main #documenter-search-results .docs-highlight{background-color:yellow}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{background:#F0F0F0;color:#444}.hljs-comment{color:#888888}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#BC6060}.hljs-literal{color:#78A960}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#4d99bf}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold} diff --git a/v0.15.1/assets/themeswap.js b/v0.15.1/assets/themeswap.js new file mode 100644 index 000000000..c58e993e3 --- /dev/null +++ b/v0.15.1/assets/themeswap.js @@ -0,0 +1,66 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Intialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if(window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the browser supports user color preference + var darkPreference = false; + // Check if the users preference is for dark color scheme + if(window.matchMedia('(prefers-color-scheme: dark)').matches === true) { + darkPreference = true; + } + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; var disabled = []; var darkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if(themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + var isprimary = (ss.ownerNode.getAttribute("data-theme-primary") !== null); + // Check if the theme is primary dark theme + var isDarkTheme = (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null); + // If ss is for dark theme then set the value of darkTheme to the name of the theme + if(isDarkTheme) darkTheme = themename; + // If we find a matching theme (and it's not the default), we'll set active to non-null + if(themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if(themename !== theme) disabled.push(ss); + } + if(active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName('html')[0].className = "theme--" + theme; + // and (2) disable all the other theme stylesheets + disabled.forEach(function(ss){ + ss.disabled = true; + }); + } + else if(darkTheme !== null && darkPreference === true) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName('html')[0].className = "theme--" + darkTheme; + // and (2) disable all the other theme stylesheets + disabled.forEach(function(ss){ + if (ss.ownerNode.getAttribute("data-theme-name") !== darkTheme) { + ss.disabled = true; + } + }); + } +} +set_theme_from_local_storage(); diff --git a/v0.15.1/assets/warner.js b/v0.15.1/assets/warner.js new file mode 100644 index 000000000..5531c8851 --- /dev/null +++ b/v0.15.1/assets/warner.js @@ -0,0 +1,49 @@ +function maybeAddWarning () { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return + }; + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return + }; + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return + }; + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement('meta'); + meta.name = 'robots'; + meta.content = 'noindex'; + + document.getElementsByTagName('head')[0].appendChild(meta); + }; + + const div = document.createElement('div'); + div.classList.add('outdated-warning-overlay'); + const closer = document.createElement('button'); + closer.classList.add('outdated-warning-closer', 'delete'); + closer.addEventListener('click', function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + '/../' + window.DOCUMENTER_STABLE; + div.innerHTML = 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +}; + +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', maybeAddWarning); +} else { + maybeAddWarning(); +}; diff --git a/v0.15.1/developer/contributing.html b/v0.15.1/developer/contributing.html new file mode 100644 index 000000000..f79250ae3 --- /dev/null +++ b/v0.15.1/developer/contributing.html @@ -0,0 +1,2 @@ + +Contributing · PowerModelsDistribution

    Pull Requests

    All pull requests should be reviewed by a core developer, and may include a review by a subject matter expert if the area of the PR is outside that of one of the core developers. In that case, the core developers will primarily review style and design, rather than substance.

    Every PR to PowerModelsDistribution should strive to meet the following guidelines.

    PR Title

    • Should be concise and clear, describing in a phrase the content of the PR
    • Should include a prefix that describes the primary type of the PR
      • ADD: feature addition
      • FIX: bugfix
      • REF: refactor
      • UPD: updates to code for e.g. version bumps of dependencies
      • STY: style changes, no changes to function names, added features, etc.
      • DOC: documentation-only additions/changes
      • RM: dead code removal

    PR Body

    • If the change is breaking, it should be clearly stated up front
    • The purpose of this PR should be clearly stated right away
    • Major changes / additions to the code should be summarized. In the case where a refactor was performed, the name changes of public functions should be documented in the body of the PR
    • Any associated Issues should be referenced in the body of the PR, and it is accepted/encouraged to use Closes #XX to automatically close Issues after the PR is merged

    PR Code

    • An entry should be added to CHANGELOG.md for every PR
    • Documentation should be updated (See Documentation section above for guidelines)
    • Unit tests should be added. In the case where existing unit tests were altered, an explanation for the change must be included
    • Code should be rebased to the latest version of whatever branch the PR is aimed at (no merge conflicts!)

    Versions

    PowerModelsDistribution follows the Semantic Versioning (SemVer) convention of Major.minor.patch, where Major indicates breaking changes, minor indicates non-breaking feature additions, and patch indicates non-breaking bugfixes.

    Currently, because Major==0, minor indicates breaking changes and patch indicates any non-breaking change, including both feature additions and bugfixes. Once PowerModelsDistribution reaches v1.0.0, we will adhere strictly to the SemVer convention.

    Branch Management

    The main branch is a protected branch, meaning that its history will always be contiguous and can never be overwritten.

    Release candidate branches of the format vM.m.0-rc are also protected branches. These branches will contain only breaking changes and will not be merged into main until a new version is ready to be tagged. Pull requests including breaking changes should be directed into the next release candidate branch available, e.g. if the current version of the package is v0.9.0, the next release candidate branch will be v0.10.0-rc.

    Pull requests that include only non-breaking changes can be merged directly into main once approved, and in the case of merge conflicts arising for release candidate branches, the -rc branch will need to be updated to include the latest main.

    Pull requests will generally be merged using squash and merge into the branch they are aimed at, with the exception of release candidate branches, which generally be merged using rebase and merge into main.

    diff --git a/v0.15.1/developer/extensions.html b/v0.15.1/developer/extensions.html new file mode 100644 index 000000000..978cefa42 --- /dev/null +++ b/v0.15.1/developer/extensions.html @@ -0,0 +1,2 @@ + +Extensions · PowerModelsDistribution diff --git a/v0.15.1/developer/roadmap.html b/v0.15.1/developer/roadmap.html new file mode 100644 index 000000000..68b48ad9c --- /dev/null +++ b/v0.15.1/developer/roadmap.html @@ -0,0 +1,2 @@ + +Roadmap · PowerModelsDistribution diff --git a/v0.15.1/developer/style.html b/v0.15.1/developer/style.html new file mode 100644 index 000000000..6708fdb7b --- /dev/null +++ b/v0.15.1/developer/style.html @@ -0,0 +1,4 @@ + +Style Guide · PowerModelsDistribution

    Style Conventions

    In general, the following conventions should be adhered to when making changes or additions to the code base. These conventions should include any conventions applied across the InfrastructureModels ecosystem specific to power engineering (i.e conventions from InfrastructureModels, PowerModels, PowerModelsRestoration, etc.) with some additions specific to PowerModelsDistribution.

    Functions

    Function additions should meeting the following criteria:

    • All functions should be clearly named, without abbreviations, and with underscores between words, e.g. parse_file or constraint_bus_voltage_magnitude; in Python this is known as lower_case_with_underscores. The exception to the abbreviate rule is cases where abbreviations would be expected in the modeling of power systems.
    • All functions that are not prepended by an underscore _ will be exported by default (i.e. when a user uses using PowerModelsDistribution). Public functions should have a detailed docstring instructing on usage
    • All functions that modify data in place should end with an exclamation point ! and the function input that is being modified should be the first argument (or first arguments in the case where multiple inputs are being modified in place). The exceptions to this rule are constraint and variable creation functions (i.e. those functions related to JuMP model creation), which do not include the exclamation point
    • All function arguments, including keyword arguments, should have their types specified.
    • Private functions, i.e. those intended to be for internal use only, should follow the same descriptive naming conventions as functions exported by default, and should always include docstrings to describe their purpose.
    • Functions should be separated by two blank lines
    "this function demonstrates how an internal, in-place data altering function should be defined"
    +function _concise_descriptive_name!(data::Dict{String,<:Any}, a::Real, b::Vector{<:Real}, c::Matrix{<:Complex}; d::Bool=false, e::Vector{Function}=Function[])
    +end

    Types & Enums

    When specifying types, i.e. when specifying the type of a function argument, or creating enums, these guidelines are recommended:

    • Prefer to use Vector{T} instead of Array{T,1}
    • Prefer to use Matrix{T} instead of Array{T,2}
    • Enums should only be used in the ENGINEERING data model, never the MATHEMATICAL data model
    • Enums must be added to the JSON parser when introduced

    Constants

    Whenever possible, const should be used to eliminate unnecessary re-evaluations of code, and every const should have a docstring, whether internal or public.

    JuMP Variables and Constraints

    For functions that create JuMP variables and constraints in particular, we follow the following naming convention as originally adopted by PowerModels:

    <jump macro id>(_<phase variant>)_<comp short name>_<quantity name>(_real|_imaginary|_magnitude|_angle|_factor)(_fr|_to)(_sqr)(_on_off)

    in the interest of intuitive names for users, the following special cases are also acceptable,

    • _power_real -(can be replaced with)-> _active
    • _power_imaginary -(can be replaced with)-> _reactive

    In the case of PowerModelsDistribution, there are additional tags indicating that a function is a multiconductor variant, three-phase specific, etc.:

    • mc multi-conductor, with an explicit neutral (which is the last conductor by convention?)
    • mp multi-phase, for constraints that have no (explicit) neutral and multiple phases
    • 3p three-phase, when a constraint is hard-coded for three phases

    Currently, all phase-aware functions use mc, but this is subject to change in the future as we refactor. If the function is not multiphase specific, these are not needed in the function name.

    Formulation Styles

    • All new formulations should have clear error messages when they do not support existing components. For example, if a formulation addition which is intended to work with OPF does not support delta-wye transformers, the constraint_mc_transformer_power_dy
    • Formulation abstract type and mutable struct must be specified in CapitalizedWords, which is a subtype of camelCase with the first word also capitalized.

    Problem Specification Styles

    • If a new problem specification is only needed due to the requirements of a new formulation, and is not a new type of problem, e.g. another OPF formulation, a build_ function with the same name as the existing formulation should be created that accepts a specific PowerModel (multiple dispatch)
    • If a new problem specification is a new type of problem that will e.g. accept multiple formulations, new build_ and run_ functions should be created that do not collide with existing problem specification functions

    Metaprogramming

    In general, it is better to avoid metaprogramming patterns, like creating functions algorithmically, in order to aid in the debugging of code. Metaprogramming can create significant challenges in interpreting stacktraces upon errors.

    Markdown

    Markdown files should be properly formatted, particularly when including tables. Developers are encouraged to use markdownlint and a markdown formatter (such as in VSCode).

    File Structure

    It is important that new functions, variables, constraints, etc. all go into appropriate places in the code base so that future maintenance and debugging is easier. Pay attention to the current file structure and attempt to conform as best as possible to it. In general

    • /src/core contains the core logic of the package, including variable creation and constraint templates, i.e. things that are agnostic to the formulation
    • /src/data_model contains all of the logic to transform between the ENGINEERING and MATHEMATICAL data models and model creation helper tools
    • src/form contains formulation specific variable and constraint functions, organized under separate files for different formulations
    • src/io contains all of the tools to parse and save files, in particular all of the logic necessary to parse dss files and output json files
    • src/prob contains all problem specifications
    • docs/src contains all source markdown files for the documentation
    • examples contains Jupyter notebooks with walkthroughs of PowerModelsDistribution for new users

    Dependencies (Project.toml)

    All new dependencies should be carefully considered before being added. It is important to keep the number of external dependencies low to avoid reliance on features that may not be maintained in the future. If possible, Julia Standard Library should be used, particularly in the case where reproducing the desired feature is trivial. There will be cases where it is not simple to duplicate a feature and subsequently maintain it within the package, so adding a dependency would be appropriate in such cases.

    All new dependencies are are ultimately approved should also include an entry under [compat] indicating the acceptable versions (Julia automerge requirement). This includes test-only dependencies that appear under [extras]

    The Manifest.toml should not be included in the repo.

    diff --git a/v0.15.1/index.html b/v0.15.1/index.html new file mode 100644 index 000000000..8afb1e162 --- /dev/null +++ b/v0.15.1/index.html @@ -0,0 +1,14 @@ + +Introduction · PowerModelsDistribution

    PowerModelsDistribution Logo

    What is PowerModelsDistribution?

    PowerModelsDistribution.jl is a Julia/JuMP-based package for modeling unbalanced (i.e., multiconductor) power networks.

    Resources for Getting Started

    Read the Installation Guide.

    Read the Quickstart Guide.

    Read the introductory tutorial Introduction to PowerModelsDistribution.

    How the documentation is structured

    The following is a high-level overview of how our documentation is structured. There are three primary sections:

    • The Manual contains detailed documentation for certain aspects of PowerModelsDistribution, such as the data model specification, the Unbalanced Network Formulations, or the Optimization Problem Specifications.

    • Tutorials contains working examples of how to use PowerModelsDistribution. Start here if you are new to PowerModelsDistribution.

    • The API Reference contains a complete list of the functions you can use in PowerModelsDistribution. Look here if you want to know how to use a particular function.

    Citing PowerModelsDistribution

    If you find PowerModelsDistribution useful for your work, we kindly request that you cite the following publication:

    @article{FOBES2020106664,
    +title = "PowerModelsDistribution.jl: An open-source framework for exploring distribution power flow formulations",
    +journal = "Electric Power Systems Research",
    +volume = "189",
    +pages = "106664",
    +year = "2020",
    +issn = "0378-7796",
    +doi = "https://doi.org/10.1016/j.epsr.2020.106664",
    +url = "http://www.sciencedirect.com/science/article/pii/S0378779620304673",
    +author = "David M. Fobes and Sander Claeys and Frederik Geth and Carleton Coffrin",
    +keywords = "Nonlinear optimization, Convex optimization, AC optimal power flow, Julia language, Open-source",
    +abstract = "In this work we introduce PowerModelsDistribution, a free, open-source toolkit for distribution power network optimization, whose primary focus is establishing a baseline implementation of steady-state multi-conductor unbalanced distribution network optimization problems, which includes implementations of Power Flow and Optimal Power Flow problem types. Currently implemented power flow formulations for these problem types include AC (polar and rectangular), a second-order conic relaxation of the Branch Flow Model (BFM) and Bus Injection Model (BIM), a semi-definite relaxation of BFM, and several linear approximations, such as the simplified unbalanced BFM. The results of AC power flow have been validated against OpenDSS, an open-source “electric power distribution system simulator”, using IEEE distribution test feeders (13, 34, 123 bus and LVTestCase), all parsed using a built-in OpenDSS parser. This includes support for standard distribution system components as well as novel resource models such as generic energy storage (multi-period) and photovoltaic systems, with the intention to add support for additional components in the future."
    +}

    The associated Power Systems Computation Conference talk can be found on YouTube.

    License

    This code is provided under a BSD license as part of the Multi-Infrastructure Control and Optimization Toolkit (MICOT) project, LA-CC-13-108.

    diff --git a/v0.15.1/installation.html b/v0.15.1/installation.html new file mode 100644 index 000000000..8f0ca5692 --- /dev/null +++ b/v0.15.1/installation.html @@ -0,0 +1,4 @@ + +Installation Guide · PowerModelsDistribution

    Installation Guide

    From Julia, PowerModelsDistribution is installed using the built-in package manager:

    import Pkg
    +Pkg.add("PowerModelsDistribution")

    Or, within the Julia REPL:

    ]add PowerModelsDistribution

    Installing an Optimizer

    PowerModelsDistribution depends on optimizers to solve Optimization problems, e.g., solve_mc_opf. The table below lists the optimizer packages that have been tested with PowerModelsDistribution, and have been found to work by the team; this list is not exhaustive, there are probably more optimizers that will work.

    Install an optimizer using the Julia Package Manager, e.g.,

    import Pkg
    +Pkg.add("Ipopt")

    Known Working Optimizers

    The table below contains a truncated list of optimizers from the JuMP documentation that have been used by the development team and are confirmed to work with our package. There may be other Optimizers that work, and the Optimizers listed below are not guaranteed to work with all problems; they must be selected for the appropriate problems.

    SolverJulia PackageInstallationLicenseSupports
    Artelys KnitroKNITRO.jlManualComm.(MI)LP, (MI)SOCP, (MI)NLP
    CbcCbc.jlEPL(MI)LP
    CPLEXCPLEX.jlManualComm.(MI)LP, (MI)SOCP
    GurobiGurobi.jlManualComm.(MI)LP, (MI)SOCP
    IpoptIpopt.jlEPLLP, QP, NLP
    Juniper.jlJuniper.jlMIT(MI)SOCP, (MI)NLP
    SCSSCS.jlMITLP, SOCP, SDP

    Where:

    • LP = Linear programming
    • QP = Quadratic programming
    • SOCP = Second-order conic programming (including problems with convex quadratic constraints and/or objective)
    • NLP = Nonlinear programming
    • SDP = Semidefinite programming
    • (MI)XXX = Mixed-integer equivalent of problem type XXX

    For a complete list of JuMP supported optimizers, see JuMP Documentation.

    Unsatisfiable requirements detected

    Did you get an error like Unsatisfiable requirements detected for package D [756980fe]:?

    The Pkg documentation has a section on how to understand and manage these conflicts.

    diff --git a/v0.15.1/manual/connections.html b/v0.15.1/manual/connections.html new file mode 100644 index 000000000..863aa5736 --- /dev/null +++ b/v0.15.1/manual/connections.html @@ -0,0 +1,2 @@ + +Connecting Components · PowerModelsDistribution

    Connecting Components

    One of the main goals of a network model, is specifying how constituent components are connected together. The patterns explained here, are equally applicable to the engineering and mathematical data model.

    The available connections of each component connect to bus terminals. Take for example a bus with four terminals, terminals=["a","b","c","n"].

    Node objects

    Node objects always connect to a single bus (and perhaps also the universal ground, as can be the case for shunts). Therefore, they always have at least two key fields controlling the connectivity: bus and connections. Most node objects also have a configuration field, which affects the interpretation of the values supplied in connections. We will illustrate this for loads below.

    Loads

    A multi-phase load consists of several individual loads, the number of which is implied by the length of properties such as pd_nom, qd_nom etc. The table below illustrates how the length of the field connections and the value of the field configuration determines the layout of the load.

    connectionsconfiguration==WYEconfiguration==DELTA
    22 connections, wye2 connections, delta
    33 connections, wye3 connections, delta
    44 connections, wyeundefined

    For example, we wish to connect a wye-connected load consisting of 2 individual loads (|connections|=3 and configuration=WYE) to our example bus with four available terminals. If we specify connections=["a","c","n"], this leads to

    loads connection example.

    Edge objects

    Edge objects connect two buses (except for generic transformers, which can connect N buses). Therefore, they have the fields

    • f_bus and f_connections, specifying the from-side bus and how the object connects to it;
    • t_bus and t_connections, specifying the same for the to-side.

    Lines

    A line can have a variable number of conductors, which is implied by the size of the fields rs, xs, g_fr, b_fr, g_to and b_to. The fields f_connections and t_connections should specify for each conductor, to which terminals it connects. The figure below illustrates this for a line with 2 conductors,

    line connection example.

    Transformers

    Transformers also have a configuration field. For

    • generic transformers, this is specified per winding, and configuration is therefore a vector of ConnConfig enums (WYE or DELTA);
    • AL2W transformers however are always two-winding, and the secondary is always wye-connected. Therefore, configuration is a scalar, specifying the configuration of the from-side winding.

    Generic transformers have a field buses, a Vector containing the buses to which each winding connects respectively (these do not have to be unique; a split-phase transformer is typically represented by having two windings connect to the same bus). The AL2W transformer however, since it is always two-winding, follows the f_connections/t_connections pattern.

    diff --git a/v0.15.1/manual/eng-data-model.html b/v0.15.1/manual/eng-data-model.html new file mode 100644 index 000000000..27d72c570 --- /dev/null +++ b/v0.15.1/manual/eng-data-model.html @@ -0,0 +1,12 @@ + +Engineering Data Model · PowerModelsDistribution

    Engineering Data Model

    This document describes the ENGINEERING data model type in PowerModelsDistribution, which is transformed at runtime, or at the user's direction into a MATHEMATICAL data model for optimization.

    In this document,

    • nphases refers to the number of non-neutral, non-ground active phases connected to a component,
    • nconductors refers to all active conductors connected to a component, i.e. length(connections), and
    • nwindings refers to the number of windings of a transformer.

    The data structure is in the following format

    Dict{String,Any}(
    +    "data_model" => ENGINEERING,
    +    "component_type" => Dict{String,Dict{String,Any}}(
    +        id => Dict{String,Any}(
    +            "parameter" => value,
    +            ...
    +        ),
    +        ...
    +    ),
    +    ...
    +)

    Valid component types are those that are documented in the sections below. Each component object is identified by an id, which must be a string (id <: String), but id does not appear inside of the component dictionary, and only appears as keys to the component dictionaries under each component type. Note that this requirement is so that data structures will be JSON serializable.

    Each edge or node component (i.e. all those that are not data objects or buses), is expected to have status fields to specify whether the component is active or disabled, bus or f_bus and t_bus, to specify the buses that are connected to the component, and connections or f_connections and t_connections, to specify the terminals of the buses that are actively connected in an ordered list. NOTE: terminals, connections, f_connections, and t_connections, must be type Vector{Int}.

    Parameter values on components are expected to be specified in SI units by default (where applicable) in the engineering data model. Relevant expected units are noted in the sections below. It is possible for the user to select universal scalar factors for power and voltages. For example, if power_scalar_factor and voltage_scalar_factor are their default values given below, where units is listed as watt or var, real units will be kW and kvar. Where units are listed as volt, real units will be kV (multiplied by vm_nom, where that value exists).

    The Used column describes the situations where certain parameters are used. "always" indicates those values are used in all contexts, opf, mld, or any other problem name abbreviation indicate they are used in particular for those problems. "solution" indicates that those parameters are outputs from the solvers. "multinetwork" indicates these values are only used to build multinetwork problems.

    Those parameters that have a default may be omitted by the user from the data model, they will be populated by the specified default values.

    Components that support "codes", such as lines, switches, and transformers, behave such that any property on said object that conflicts with a value in the code will override the value given in the code object. This is noted on each object where this is relevant.

    Root-Level Properties

    At the root level of the data structure, the following fields can be found.

    NameDefaultTypeUsedDescription
    nameStringCase name
    data_modelENGINEERINGDataModelalwaysENGINEERING, MATHEMATICAL, or DSS. Type of the data model (this document describes data_model==ENGINEERING)
    settingsDict()Dict{String,<:Any}alwaysBase settings for the data model, see Settings section below for details

    Settings (settings)

    At the root-level of the data model a settings dictionary object is expected, containing the following fields.

    NameDefaultTypeUnitsUsedDescription
    voltage_scale_factor1e3RealalwaysScalar multiplier for voltage values
    power_scale_factor1e3RealalwaysScalar multiplier for power values
    vbases_defaultDict{String,Real}alwaysInstruction to set the vbase at a number of buses for non-dimensionalization
    sbase_defaultRealalwaysInstruction to set the power base for non-dimensionalization
    base_frequency60.0RealHzalwaysFrequency base, i.e. the base frequency of the whole circuit

    The parameters voltage_scale_factor and power_scale_factordetermine the base for all voltage and power parameters in this data model. For example,

    • voltage_scale_factor=1E3 and vm_nom=4.0: vm_nom is 4.0 kV/4.0E3 V,
    • power_scale_factor=1E6 and pd_nom=2.0: pd_nom is 2.0 MW/2.0E6 W,
    • power_scale_factor=1E6 and qd_nom=5.0: qd_nom is 5.0 MVAr/5.0E6 VAr,

    where the mentioned fields vm_nom, pd_nom and qd_nom are sample voltage and power variables which are defined later.

    On the other hand,vbase_default and sbase_default provide default values for a 'per unit' conversion; these do not affect the interpretation of the parameters in this model, like the scale factors do. Note that vbase_default is a Dict{Any,Real}, with pairs of bus ids and voltage magnitude levels, since in per unit conversion, the voltage base can change from bus to bus. The power base is the same everywhere, and therefore sbase_default has a single value.

    Buses (bus)

    The data model below allows us to include buses of arbitrary many terminals (i.e., more than the usual four). This would be useful for

    • underground lines with multiple neutrals which are not joined at every bus;
    • distribution lines that carry several conventional lines in parallel (see for example the quad circuits in NEVTestCase).
    NameDefaultTypeUnitsUsedDescription
    terminals[1,2,3,4]Vector{Int}alwaysTerminals for which the bus has active connections
    vm_lbVector{Real}voltopfMinimum conductor-to-ground voltage magnitude, size=nphases
    vm_ubVector{Real}voltopfMaximum conductor-to-ground voltage magnitude, size=nphases
    vm_pair_ubVector{Tuple}opfe.g. [(1,2,210)] means |U1-U2|>210
    vm_pair_lbVector{Tuple}opfe.g. [(1,2,230)] means |U1-U2|<230
    grounded[]Vector{Int}alwaysList of terminals which are grounded
    rg[]Vector{Real}alwaysResistance of each defined grounding, size=length(grounded)
    xg[]Vector{Real}alwaysReactance of each defined grounding, size=length(grounded)
    vmVector{Real}voltalwaysVoltage magnitude at bus. If set, voltage magnitude at bus is fixed
    vaVector{Real}degreealwaysVoltage angle at bus. If set, voltage angle at bus is fixed
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively
    time_seriesDict{String,String}multinetworkDictionary containing time series parameters.

    Each terminal c of the bus has an associated complex voltage phasor v[c]. There are two types of voltage magnitude bounds. The first type bounds the voltage magnitude of each v[c] individually,

    • lb <= |v[c]| <= ub

    However, especially in four-wire networks, bounds are more naturally imposed on the difference of two terminal voltages instead, e.g. for terminals c and d,

    • lb <= |v[c]-v[d]| <= ub

    This is why we introduce the fields vm_pair_lb and vm_pair_ub, which define bounds for pairs of terminals,

    • \[\forall\]

      (c,d,lb) $\in$ vm_pair_lb: |v[c]-v[d]| >= lb
    • \[\forall\]

      (c,d,ub) $\in$ vm_pair_ub: |v[c]-v[d]| <= ub

    Finally, we give an example of how grounding impedances should be entered. If terminal 4 is grounded through an impedance Z=1+j2, we write

    • grounded=[4], rg=[1], xg=[2]

    Special Case: three-phase bus

    For three-phase buses, instead of specifying bounds explicitly for each pair of windings, often we want to specify 'phase-to-phase', 'phase-to-neutral' and 'neutral-to-ground' bounds. This can be done conveniently with a number of additional fields. First, phases is a list of the phase terminals, and neutral designates a single terminal to be the neutral.

    • The bounds vm_pn_lb and vm_pn_ub specify the same lower and upper bound for the magnitude of the difference of each phase terminal and the neutral.
    • The bounds vm_pp_lb and vm_pp_ub specify the same lower and upper bound for the magnitude of the difference of all phase terminals.
    • vm_ng_ub specifies an upper bound for the neutral terminal, the lower bound is typically zero.

    If all of these are specified, these bounds also imply valid bounds for the individual voltage magnitudes,

    • \[\forall\]

      c $\in$ phases: vm_pn_lb - vm_ng_ub <= |v[c]| <= vm_pn_ub + vm_ng_ub
    • 0 <= |v[neutral]|<= vm_ng_ub

    Instead of defining the bounds directly, they can be specified through an associated voltage zone.

    NameDefaultTypeUnitsUsedDescription
    phasesVector{Int}alwaysIdentifies the terminal that represents the neutral conductor
    neutralIntalwaysIdentifies the terminal that represents the neutral conductor
    vm_pn_lbRealopfMinimum phase-to-neutral voltage magnitude for all phases
    vm_pn_ubRealopfMaximum phase-to-neutral voltage magnitude for all phases
    vm_pp_lbRealopfMinimum phase-to-phase voltage magnitude for all phases
    vm_pp_ubRealopfMaximum phase-to-phase voltage magnitude for all phases
    vm_ng_ubRealopfMaximum neutral-to-ground voltage magnitude

    Edge Objects

    These objects represent edges on the power grid and therefore require f_bus and t_bus (or buses in the case of transformers), and f_connections and t_connections (or connections in the case of transformers).

    Lines (line)

    This is a pi-model branch. When a linecode is given, and any of rs, xs, b_fr, b_to, g_fr or g_to are specified, any of those overwrite the values on the linecode.

    NameDefaultTypeUnitsUsedDescription
    f_busStringalwaysid of from-side bus connection
    t_busStringalwaysid of to-side bus connection
    f_connectionsVector{Int}alwaysIndicates for each conductor, to which terminal of the f_bus it connects
    t_connectionsVector{Int}alwaysIndicates for each conductor, to which terminal of the t_bus it connects
    linecodeStringalwaysid of an associated linecode
    rsMatrix{Real}ohm/meteralwaysSeries resistance matrix, size=(nconductors,nconductors)
    xsMatrix{Real}ohm/meteralwaysSeries reactance matrix, size=(nconductors,nconductors)
    g_frzeros(nconductors, nconductors)Matrix{Real}siemens/meter/HzalwaysFrom-side conductance, size=(nconductors,nconductors)
    b_frzeros(nconductors, nconductors)Matrix{Real}siemens/meter/HzalwaysFrom-side susceptance, size=(nconductors,nconductors)
    g_tozeros(nconductors, nconductors)Matrix{Real}siemens/meter/HzalwaysTo-side conductance, size=(nconductors,nconductors)
    b_tozeros(nconductors, nconductors)Matrix{Real}siemens/meter/HzalwaysTo-side susceptance, size=(nconductors,nconductors)
    length1.0RealmeteralwaysLength of the line
    cm_ubVector{Real}ampopfSymmetrically applicable current rating, size=nconductors
    sm_ubVector{Real}wattopfSymmetrically applicable power rating, size=nconductors
    vad_lbVector{Real}degreeopfVoltage angle difference lower bound
    vad_ubVector{Real}degreeopfVoltage angle difference upper bound
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively

    Transformers (transformer)

    These are n-winding (nwinding), n-phase (nphase), lossy transformers. Note that most properties are now Vectors (or Vectors of Vectors), indexed over the windings.

    NameDefaultTypeUnitsUsedDescription
    busVector{String}alwaysList of bus for each winding, size=nwindings
    connectionsVector{Vector{Int}}alwaysList of connection for each winding, size=((nconductors),nwindings)
    configurationsfill(WYE, nwindings)Vector{ConnConfig}alwaysWYE or DELTA. List of configuration for each winding, size=nwindings
    xfmrcodeStringalwaysid of
    xsczeros(nwindings*(nwindings-1)/2)Vector{Real}sm_nom[1]alwaysList of short-circuit reactances between each pair of windings, relative to the VA rating of the first winding; enter as a list of the upper-triangle elements
    rwzeros(nwindings)Vector{Real}sm_nom[1]alwaysActive power lost due to resistance of each winding, relative to the VA rating of each winding winding
    cmag0.0Realsm_nom[1]alwaysTotal no-load reactive power drawn by the transformer, relative to VA rating of the first winding (magnetizing current)
    noloadloss0.0Realsm_nom[1]alwaysTotal no-load active power drawn by the transformer, relative to VA rating of the first winding
    tm_nomones(nwindings)Vector{Real}alwaysNominal tap ratio for the transformer, size=nwindings (multiplier)
    tm_ubVector{Vector{Real}}opfMaximum tap ratio for each winding and phase, size=((nphases),nwindings) (base=tm_nom)
    tm_lbVector{Vector{Real}}opfMinimum tap ratio for for each winding and phase, size=((nphases),nwindings) (base=tm_nom)
    tm_setfill(fill(1.0,nphases),nwindings)Vector{Vector{Real}}alwaysSet tap ratio for each winding and phase, size=((nphases),nwindings) (base=tm_nom)
    tm_fixfill(fill(true,nphases),nwindings)Vector{Vector{Bool}}oltcIndicates for each winding and phase whether the tap ratio is fixed, size=((nphases),nwindings)
    polarityfill(1,nwindings)Vector{Int}always
    vm_nomVector{Real}voltalways
    sm_nomVector{Real}wattalways
    sm_ubRealwattopfRating for the total apparent power magnitude at each winding
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively

    Asymmetric, Lossless, Two-Winding (AL2W) Transformers (transformer)

    Special case of the Generic transformer, which is still a transformer object, but has a simplified method for its definition. These are transformers are asymmetric (A), lossless (L) and two-winding (2W). Asymmetric refers to the fact that the secondary is always has a WYE configuration, whilst the primary can be DELTA. The table below indicates alternate, more simple ways to specify the special case of an AL2W Transformer. xsc and rw cannot be specified for an AL2W transformer, because it is lossless. To use this definition format, all of f_bus, t_bus, f_connections, t_connections, and configuration must be used, and none of buses, connections, configurations may be used. xfmrcode is ignored for this component.

    NameDefaultTypeUnitsUsedDescription
    f_busStringalwaysAlternative way to specify buses, requires both f_bus and t_bus
    t_busStringalwaysAlternative way to specify buses, requires both f_bus and t_bus
    f_connectionsVector{Int}alwaysAlternative way to specify connections, requires both f_connections and t_connections, size=nphases
    t_connectionsVector{Int}alwaysAlternative way to specify connections, requires both f_connections and t_connections, size=nphases
    configurationWYEConnConfigalwaysWYE or DELTA. Alternative way to specify the from-side configuration, to-side is always WYE
    tm_nom1.0RealalwaysNominal tap ratio for the transformer (multiplier)
    tm_ubVector{Real}opfMaximum tap ratio for each phase (base=tm_nom), size=nphases
    tm_lbVector{Real}opfMinimum tap ratio for each phase (base=tm_nom), size=nphases
    tm_setfill(1.0,nphases)Vector{Real}alwaysSet tap ratio for each phase (base=tm_nom), size=nphases
    tm_fixfill(true,nphases)Vector{Bool}oltcIndicates for each phase whether the tap ratio is fixed, size=nphases
    sm_ubRealopfRating for the total apparent power magnitude at each winding

    Transformers with voltage regulator control (controls)

    Special case of the Generic transformer, which is part of the transformer object, and emulates a standard utility voltage regulator. The taps of these transformers can be controlled by modelling a line drop compensator.

    NameDefaultTypeUnitsUsedDescription
    vregVector{Vector{Real}}voltoltcVoltage regulator reference, default value is 120.0 for the controlled winding, 0.0 for winding without regulator control, size=((nphases),nwindings)
    bandVector{Vector{Real}}voltoltcVoltage bandwidth, default value is 3.0 for the controlled winding, 0.0 for winding without regulator control, size=((nphases),nwindings)
    ptratioVector{Vector{Real}}oltcVoltage ratio of the potential transformer, default value is 60.0 for the controlled winding, 0.0 for winding without regulator control, size=((nphases),nwindings)
    ctprimVector{Vector{Real}}ampoltcCurrent transformer rating on primary side, default value is 300.0 for the controlled winding, 0.0 for winding without regulator control, size=((nphases),nwindings)
    rVector{Vector{Real}}voltoltcResistance setting on line drop compensator, default value is 0.0 for both controlled winding and winding without regulator control, size=((nphases),nwindings)
    xVector{Vector{Real}}voltoltcReactance setting on line drop compensator, default value is 0.0 for both controlled winding and winding without regulator control, size=((nphases),nwindings)

    Switches (switch)

    Switches without rs, xs or a linecode (conductance/susceptance not considered), defined the switch will be treated as lossless. If lossy parameters are defined, switch objects will be decomposed into virtual branch & bus, and an ideal switch.

    NameDefaultTypeUnitsUsedDescription
    f_busStringalwaysid of from-side bus connection
    t_busStringalwaysid of to-side bus connection
    f_connectionsVector{Int}alwaysIndicates for each conductor, to which terminal of the f_bus it connects
    t_connectionsVector{Int}alwaysIndicates for each conductor, to which terminal of the t_bus it connects
    cm_ubVector{Real}ampopfSymmetrically applicable current rating
    sm_ubVector{Real}wattopfSymmetrically applicable power rating
    linecodeStringalwaysid of an associated linecode, does not take into account conductance/susceptance
    rszeros(nphases,nphases)Matrix{Real}ohmalwaysSeries resistance matrix, size=(nphases,nphases)
    xszeros(nphases,nphases)Matrix{Real}ohmalwaysSeries reactance matrix, size=(nphases,nphases)
    dispatchableNODispatchableNO or YES, indicates whether switch state can be changed in a switching optimization problem
    stateCLOSEDSwitchStatealwaysCLOSED: closed or OPEN: open, to indicate state of switch
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively

    Node Objects

    These are objects that have single bus connections. Every object will have at least bus, connections, and status.

    Shunts (shunt)

    NameDefaultTypeUnitsUsedDescription
    busStringalwaysid of bus connection
    connectionsVector{Int}alwaysOrdered list of connected conductors, size=nconductors
    gsMatrix{Real}siemensalwaysConductance, size=(nconductors,nconductors)
    bsMatrix{Real}siemensalwaysSusceptance, size=(nconductors,nconductors)
    modelGENERICShuntModelGENERIC, CAPACITOR, or REACTOR. Indicates the type of shunt which may be necessary for transient stability analysis
    dispatchableNODispatchablemldNO or YES, indicates whether a shunt can be shed
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively
    time_seriesDict{String,Any}multinetworkDictionary containing time series parameters.

    Shunts with capacitor control (controls)

    Special case of the shunt capacitors, which is part of the shunt object, and emulates a typical utility capacitor control (CapControl) by sending switching messages.

    NameDefaultTypeUnitsUsedDescription
    typeVector{String}capcControl type, default is current for controlled phase, `for uncontrolled phase,size=1forkvartype, otherwisesize=(nphases)`
    elementStringcapcsource_id of element (typically line or transformer) to which CapControl is connected
    terminalVector{Int}capcNumber of the terminal of circuit element to which CapControl is connected, default is 1 for controlled phase, 0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)
    onsettingVector{Real}capcValue at which the CapControl switches the capacitor on, default is 300.0 for controlled phase, 0.0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)
    offsettingVector{Real}capcValue at which the CapControl switches the capacitor off, default is 200.0 for controlled phase, 0.0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)
    voltoverrideVector{Bool}capcIndicate whether voltage over ride is enabled, default is false for both controlled and uncontrolled phases, size=1 for kvar type, otherwise size=(nphases)
    ptratioVector{Real}capcRatio of potential transformer, default is 60.0 for controlled phase, 0.0 for uncontrolled phase, size=(nphases)
    ctratioVector{Real}capcRatio of current transformer, default is 60.0 for controlled phase, 0.0 for uncontrolled phase, size=(nphases)
    vminVector{Real}voltcapcMinimum voltage below which CapControl switches the capacitor on, default is 115.0 for controlled phase, 0.0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)
    vmaxVector{Real}voltcapcMaximum voltage above which CapControl switches the capacitor off, default is 126.0 for controlled phase, 0.0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)

    Loads (load)

    NameDefaultTypeUnitsUsedDescription
    busStringalwaysid of bus connection
    connectionsVector{Int}alwaysOrdered list of connected conductors, size=nconductors
    configurationWYEConnConfigalwaysWYE or DELTA. If WYE, connections[end]=neutral
    modelPOWERLoadModelalwaysPOWER, IMPEDANCE, CURRENT, EXPONENTIAL, or ZIP. Indicates the type of voltage-dependency
    pd_nomVector{Real}wattalwaysNominal active load, with respect to vm_nom, size=nphases
    qd_nomVector{Real}varalwaysNominal reactive load, with respect to vm_nom, size=nphases
    vm_nomRealvoltmodel!=POWERNominal voltage (multiplier)
    dispatchableNODispatchablemldNO or YES, indicates whether a load can be shed
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively
    time_seriesDict{String,String}multinetworkDictionary containing time series parameters.

    Multi-phase loads define a number of individual loads connected between two terminals each. How they are connected, is defined both by configuration and connections. The table below indicates the value of configuration and lengths of the other properties for a consistent definition,

    configurationconnectionspd_nom | qd_nom | pd_exp
    DELTA21
    DELTA33
    WYE21
    WYE32
    WYENN-1

    Note that for delta loads, only 2 and 3 connections are allowed. Each individual load i is connected between two terminals, exposed to a voltage magnitude v[i], which leads to a consumption pd[i]+j*qd[i]. The model then defines the relationship between these quantities,

    modelpd[i]/pd_nom[i]=qd[i]/qd_nom[i]=
    POWER11
    CURRENT(v[i]/vm_nom)(v[i]/vm_nom)
    IMPEDANCE(v[i]/vm_nom)^2(v[i]/vm_nom)^2

    Two more model types are supported, which need additional fields and are defined below.

    model == EXPONENTIAL

    • (pd[i]/pd_nom[i]) = (v[i]/vm_nom)^pd_exp[i]
    • (qd[i]/qd_nom[i]) = (v[i]/vm_nom)^qd_exp[i]
    NameDefaultTypeUnitsUsedDescription
    pd_expRealmodel==EXPONENTIAL
    qd_expRealmodel==EXPONENTIAL

    model == ZIP

    ZIP load models are split into IMPEDANCE, CURRENT, POWER models.

    • (pd[i]/pd_nom) = pd_cz[i]*(v[i]/vm_nom)^2 + pd_ci[i]*(v[i]/vm_nom) + pd_cp[i]
    • (qd[i]/qd_nom) = qd_cz[i]*(v[i]/vm_nom)^2 + qd_ci[i]*(v[i]/vm_nom) + qd_cp[i]
    NameDefaultTypeUnitsUsedDescription
    zipvVector{Real}model==ZIPFirst 3 are ZIP weighting factors for active power (pd_cz,pd_ci,pd_cp), next 3 are ZIP weighting factors for reactive power (qd_cz,qd_ci,qd_cp), last 1 is cut-off voltage in p.u. of base kV; load is 0 below this cut-off

    Generators (generator)

    NameDefaultTypeUnitsUsedDescription
    busStringalwaysid of bus connection
    connectionsVector{Int}alwaysOrdered list of connected conductors, size=nconductors
    configurationWYEConnConfigalwaysWYE or DELTA. If WYE, connections[end]=neutral
    vgVector{Real}voltcontrol_mode==ISOCHRONOUSVoltage magnitude setpoint
    pg_lbzeros(nphases)Vector{Real}wattopfLower bound on active power generation per phase, size=nphases
    pg_ubfill(Inf, nphases)Vector{Real}wattopfUpper bound on active power generation per phase, size=nphases
    qg_lb-pg_ubVector{Real}varopfLower bound on reactive power generation per phase, size=nphases
    qg_ubpg_ubVector{Real}varopfUpper bound on reactive power generation per phase, size=nphases
    pgVector{Real}wattsolutionPresent active power generation per phase, size=nphases
    qgVector{Real}varsolutionPresent reactive power generation per phase, size=nphases
    control_modeFREQUENCYDROOPControlModeFREQUENCYDROOP or ISOCHRONOUS
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively
    time_seriesDict{String,String}multinetworkDictionary containing time series parameters.

    generator Cost Model

    The generator cost model is currently specified by the following fields.

    NameDefaultTypeUnitsUsedDescription
    cost_pg_model2IntopfCost model type, 1 = piecewise-linear, 2 = polynomial
    cost_pg_parameters[0.0, 1.0, 0.0]Vector{Real}/MVAopfCost model polynomial

    Photovoltaic Systems (solar)

    NameDefaultTypeUnitsUsedDescription
    busStringalwaysid of bus connection
    connectionsVector{Int}alwaysOrdered list of connected conductors, size=nconductors
    configurationWYEConnConfigalwaysWYE or DELTA. If WYE, connections[end]=neutral
    pg_lbVector{Real}wattopfLower bound on active power generation per phase, size=nphases
    pg_ubVector{Real}wattopfUpper bound on active power generation per phase, size=nphases
    qg_lbVector{Real}varopfLower bound on reactive power generation per phase, size=nphases
    qg_ubVector{Real}varopfUpper bound on reactive power generation per phase, size=nphases
    pgVector{Real}wattsolutionPresent active power generation per phase, size=nphases
    qgVector{Real}varsolutionPresent reactive power generation per phase, size=nphases
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively
    time_seriesDict{String,String}multinetworkDictionary containing time series parameters.

    solar Cost Model

    The cost model for a photovoltaic system currently matches that of generators.

    NameDefaultTypeUnitsUsedDescription
    cost_pg_model2IntopfCost model type, 1 = piecewise-linear, 2 = polynomial
    cost_pg_parameters[0.0, 1.0, 0.0]Vector{Real}/MVAopfCost model polynomial

    Wind Turbine Systems (wind)

    Wind turbine systems are most closely approximated by induction machines, also known as asynchronous machines. These are not currently supported, but there is plans to support them in the future.

    Storage (storage)

    A storage object is a flexible component that can represent a variety of energy storage objects, like Li-ion batteries, hydrogen fuel cells, flywheels, etc.

    • How to include the inverter model for this? Similar issue as for a PV generator
    NameDefaultTypeUnitsUsedDescription
    busStringalwaysid of bus connection
    connectionsVector{Int}alwaysOrdered list of connected conductors, size=nconductors
    configurationWYEConnConfigalwaysWYE or DELTA. If WYE, connections[end]=neutral
    energyRealwatt-hralwaysStored energy
    energy_ubRealopfmaximum energy rating
    charge_ubRealopfmaximum charge rating
    discharge_ubRealopfmaximum discharge rating
    sm_ubRealwattopfPower rating,
    cm_ubRealampopfCurrent rating,
    charge_efficiencyRealpercentalwayscharging efficiency (losses)
    discharge_efficiencyRealpercentalwaysdischarging efficiency (losses)
    qs_ubRealopfMaximum reactive power injection,
    qs_lbRealopfMinimum reactive power injection,
    rsRealohmalwaysconverter resistance
    xsRealohmalwaysconverter reactance
    pexRealalwaysTotal active power standby exogenous flow (loss)
    qexRealalwaysTotal reactive power standby exogenous flow (loss)
    psVector{Real}wattsolutionPresent active power injection
    qsVector{Real}varsolutionPresent reactive power injection
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively
    time_seriesDict{String,String}multinetworkDictionary containing time series parameters.

    Voltage Sources (voltage_source)

    A voltage source is a source of power at a set voltage magnitude and angle connected to a slack bus. If rs or xs are not specified, the voltage source is assumed to be lossless, otherwise virtual branch and bus will be created in the mathematical model to represent the internal losses of the voltage source.

    NameDefaultTypeUnitsUsedDescription
    busStringalwaysid of bus connection
    connectionsVector{Int}alwaysOrdered list of connected conductors, size=nconductors
    configurationWYEConnConfigalwaysWYE or DELTA. If WYE, connections[end]=neutral
    vmones(nphases)Vector{Real}voltalwaysVoltage magnitude set at slack bus, size=nphases
    vazeros(nphases)RealdegreealwaysVoltage angle offsets at slack bus, applies symmetrically to each phase angle
    rszeros(nconductors,nconductors)Matrix{Real}ohmalwaysInternal series resistance of voltage source, size=(nconductors,nconductors)
    xszeros(nconductors,nconductors)Matrix{Real}ohmalwaysInternal series reactance of voltage soure, size=(nconductors,nconductors)
    statusENABLEDStatusalwaysENABLED or DISABLED. Indicates if component is enabled or disabled, respectively
    time_seriesDict{String,String}multinetworkDictionary containing time series parameters.

    Data Objects (codes, time series, etc.)

    These objects are referenced by node and edge objects, but are not part of the network themselves, only containing data.

    Linecodes (linecode)

    Linecodes are easy ways to specify properties common to multiple lines.

    NameDefaultTypeUnitsUsedDescription
    rsMatrix{Real}ohm/meteralwaysSeries resistance, size=(nconductors,nconductors)
    xsMatrix{Real}ohm/meteralwaysSeries reactance, size=(nconductors,nconductors)
    g_frzeros(nconductors,nconductors)Matrix{Real}siemens/meter/HzalwaysFrom-side conductance, size=(nconductors,nconductors)
    b_frzeros(nconductors,nconductors)Matrix{Real}siemens/meter/HzalwaysFrom-side susceptance, size=(nconductors,nconductors)
    g_tozeros(nconductors,nconductors)Matrix{Real}siemens/meter/HzalwaysTo-side conductance, size=(nconductors,nconductors)
    b_tozeros(nconductors,nconductors)Matrix{Real}siemens/meter/HzalwaysTo-side susceptance, size=(nconductors,nconductors)
    cm_ubfill(Inf,nconductors)Vector{Real}ampereopfmaximum current per conductor, symmetrically applicable
    sm_ubfill(Inf,nconductors)Vector{Real}wattopfmaximum power per conductor, symmetrically applicable

    Transformer Codes (xfmrcode)

    Transformer codes are easy ways to specify properties common to multiple transformers

    NameDefaultTypeUnitsUsedDescription
    configurationsfill(WYE, nwindings)Vector{ConnConfig}alwaysWYE or DELTA. List of configuration for each winding, size=nwindings
    xsc[0.0]Vector{Real}ohmalwaysList of short-circuit reactances between each pair of windings; enter as a list of the upper-triangle elements, size=(nwindings == 2 ? 1 : 3)
    rwzeros(nwindings)Vector{Real}ohmalwaysList of the winding resistance for each winding, size=nwindings
    tm_nomones(nwindings)Vector{Real}alwaysNominal tap ratio for the transformer, size=nwindings (multiplier)
    tm_ubVector{Vector{Real}}opfMaximum tap ratio for each winding and phase, size=((nphases), nwindings) (base=tm_nom)
    tm_lbVector{Vector{Real}}opfMinimum tap ratio for for each winding and phase, size=((nphases), nwindings) (base=tm_nom)
    tm_setfill(fill(1.0, nphases), nwindings)Vector{Vector{Real}}alwaysSet tap ratio for each winding and phase, size=((nphases), nwindings) (base=tm_nom)
    tm_fixfill(fill(true, nphases), nwindings)Vector{Vector{Bool}}alwaysIndicates for each winding and phase whether the tap ratio is fixed, size=((nphases), nwindings)

    Time Series (time_series)

    Time series objects are used to specify time series for e.g. load or generation forecasts.

    Some parameters for components specified in this document can support a time series by inserting a reference to a time_series object into the time_series dictionary inside a component under the relevant parameter name. For example, for a load, if pd_nom is supposed to be a time series, the user would specify "time_series" => Dict("pd_nom" => time_series_id) where time_series_id is the id of an object in time_series, and has type Any.

    NameDefaultTypeUnitsUsedDescription
    timeUnion{Vector{Real},Vector{String}}houralwaysTime points at which values are specified. If time is specified in String, units not required to be in hours.
    valuesVector{Real}alwaysMultipers at each time step given in time
    offset0RealhouralwaysStart time offset
    replacetrueBoolalwaysIndicates to replace with data, instead of multiply. Will only work on non-Array data

    Fuses (fuse)

    Fuses can be defined on any terminal of any physical component

    NameDefaultTypeUnitsUsedDescription
    component_typeString
    component_idString
    terminalsVector{Int}
    fuse_curveArray{Vector{Real},2}specifies the fuse blowing condition
    minimum_melting_curveArray{Vector{Real},2}specifies the minimum melting conditions of the fuse
    diff --git a/v0.15.1/manual/eng2math.html b/v0.15.1/manual/eng2math.html new file mode 100644 index 000000000..65022d90c --- /dev/null +++ b/v0.15.1/manual/eng2math.html @@ -0,0 +1,2 @@ + +Conversion to Mathematical Model · PowerModelsDistribution

    Engineering to Mathematical Data Model Mapping

    In this document we define the mapping from the engineering data model down to the mathematical data model for each physical component.

    bus objects

    Buses are parsed into bus and potentially shunt objects.

    The mathematical bus model contains only lossless connections to ground. All other connections to grounds are converted to equivalent shunts at that bus. For example, take a bus defined as

    bus_eng = Dict("grounded"=>[4, 5], "rg"=>[1.0, 0.0], "xg"=>[2.0, 0.0],...).

    This is equivalent to a shunt g+im*b = 1/(1.0+im*2.0) connected to terminal 4, and a lossless grounding at terminal 5 (since rg[2]==xg[2]==0.0). This is mapped to

    bus_math = Dict("grounded"=>[5], ...),

    shunt_math = Dict("connections"=>[4], "b"=>[b], "g"=>[g]...).

    This simplifies the mathematical model, as the modeller does no longer have to consider lossy groundings explicitly.

    line objects

    Lines are parsed into branch objects with transformer=false

    switch objects

    Switches are parsed into switch. If there are loss parameters provided (i.e. rs and/or xs) then a virtual branch and virtual bus are created to model the impedance

    transformer objects

    A transformer can have N windings, each with its own configuration (delta or wye are supported). This is decomposed to a network of N lossless, two-winding transformers which connect to an internal loss model. The to-winding is always wye-connected, hence we refer to these transformers as 'asymmetric'.

    The internal loss model is a function of

    • the winding resistance rw,
    • the short-circuit reactance xsc,
    • the no-load loss properties noloadloss (resistive) and magnetizing current imag (reactive).

    If all of these are non-zero, this leads to an internal loss model consisting of N virtual buses, (N^2+N)/2 virtual branches, and 1 shunt. These virtual buses and branches are automatically merged and simplified whenever possible; e.g., when all these loss parameters are zero, this simplifies to a single virtual bus, to which all two-winding transformers connect.

    For more detail, please refer to [upcoming technical paper]. #TODO add link to paper

    shunt objects

    Shunts are parsed directly into shunt objects.

    load objects

    Loads are parsed into load objects. See the discussion under the Load Model documentation on the sidebar, for a detailed discussion of the various load models.

    generator objects

    Generators are parsed into gen objects.

    solar objects

    Solar objects (photovoltaic systems) are parsed into gen objects.

    voltage_source objects

    Voltage sources are parsed into gen objects. If loss parameters are specified (i.e. rs and/or xs) then a virtual bus and branch are created to model the internal impedance.

    diff --git a/v0.15.1/manual/enums.html b/v0.15.1/manual/enums.html new file mode 100644 index 000000000..0e770faa7 --- /dev/null +++ b/v0.15.1/manual/enums.html @@ -0,0 +1,2 @@ + +Enums in Engineering Model · PowerModelsDistribution

    PowerModelsDistribution Enum Types

    Within the PowerModelsDistribution Engineering Model we have included the use of Enums. Here we document the fields for which Enums are expected and the possible Enums available.

    Data Model

    Any place in PowerModelsDistribution that calls for specifying the data_model, either in function calls or the "data_model" field inside the data structure itself, will expect a DataModel type.

    The DSS data model is an output of parse_dss, and is an untranslated raw parse of a DSS file. This Enum exists for use by count_nodes, where the method to count the number of active nodes is different between all three models.

    Component Status

    All "status" fields in the ENGINEERING model expect a Status type.

    Connection Configuration

    All "configuration" fields in the ENGINEERING model expect a ConnConfig type.

    Load Model

    For load objects, the "model" field expects a LoadModel type to specify the type of load model to use, where

    • POWER indicates constant power,
    • CURRENT indicates constant current,
    • IMPEDANCE indicates constant impedance,
    • EXPONENTIAL indicates an exponential load model, and
    • ZIP indicates a ZIP model

    Shunt Model

    For shunt objects, the "model" field expects a ShuntModel type to specify the origin of the shunt object, which is important for transient analysis.

    Switch State

    For switch objects, the "state" field expects a SwitchState type to specify whether the switch is currently open or closed.

    Dispatchable Component

    Some components can be Dispatchable, e.g. if a switch is dispatchable that means it is free to open or close, but if not then it is fixed in place, or if a load is dispatchable it implies that it can be shed in a run_mc_mld problem.

    Generator Control Mode

    For generator objects, the "control_mode" field expects a ControlMode type to specify whether the generator is operating in an isochronous mode (i.e. is frequency forming) or droop mode (i.e. is frequency following).

    diff --git a/v0.15.1/manual/external-data-formats.html b/v0.15.1/manual/external-data-formats.html new file mode 100644 index 000000000..73d548c8f --- /dev/null +++ b/v0.15.1/manual/external-data-formats.html @@ -0,0 +1,2 @@ + +External Data Formats · PowerModelsDistribution

    External Data Formats

    OpenDSS

    PowerModelsDistribution supports parsing OpenDSS format files. In particular, we support a raw parsing of all OpenDSS specified components into a dictionary (serializable) structure, and support converting the data values of a smaller subsection of components into their expected types. Those include

    • Line
    • Load
    • Generator
    • Capactior (shunt capacitors only)
    • Reactor
    • Transformer
    • Linecode
    • Xfmrcode
    • Loadshape
    • XYCurve
    • Circuit
    • VSource
    • PVSystem
    • Storage

    Of those, a subset of configurations are converted into a PowerModelsDistribution internal data model, namely:

    Edge Elements

    • line (from lines and line reactors)
    • transformer (arbitrary winding, all connections except zig-zag)
    • switch (from lines w/ switch=y)

    Node Elements

    • generator
    • voltage_source
    • solar (from PVSystem)
    • load (incl. support for constant POWER, constant IMPEDANCE, constant CURRENT, and EXPONENTIAL models)
    • shunt (from shunt capacitors and shunt reactors)
    • storage

    Data Elements

    • linecode
    • xfmrcode
    • time_series (from loadshapes)

    Several notes about the specific design choices w.r.t. OpenDSS are explained below.

    Circuit

    The default connection to the transmission system is modeled as an ideal voltage source named "source" in OpenDSS, which is connected by default to a node named "sourcebus", but this can be changed.

    Lines

    Although Lines and Linecodes are supported, the more generic LineGeometry is not yet supported.

    Transformers

    Unfortunately, in the OpenDSS format, multi-phase transformers with different taps for each phase are not explicitly supported, so to work around this limitation multiple single phase transformers should be defined, which are then "banked" together using the bank property.

    Capacitors and Reactors

    Capacitors and reactors are supported as shunts, although shunts to ground via delta connections are not yet supported. Furthermore, generic reactors are not supported, only those whose second terminal is connected to ground (default for unspecified second terminal). Reactors are also supported as a resistanceless line if their second terminal is connected, but only for topological continuity of the network.

    PowerModelsDistribution JSON

    You can export a PowerModelsDistribution data structure to a JSON file using the print_file command and parse one in using the parse_file command

    diff --git a/v0.15.1/manual/formulations.html b/v0.15.1/manual/formulations.html new file mode 100644 index 000000000..cdb4b154d --- /dev/null +++ b/v0.15.1/manual/formulations.html @@ -0,0 +1,51 @@ + +Unbalanced Formulations · PowerModelsDistribution

    Unbalanced Network Formulations

    AbstractUnbalancedACPModel

    Real-valued formulation from:

    • Formulation without shunts: Mahdad, B., Bouktir, T., & Srairi, K. (2006). A three-phase power flow modelization: a tool for optimal location and control of FACTS devices in unbalanced power systems. In IEEE Industrial Electronics IECON (pp. 2238–2243).

    AbstractUnbalancedDCPModel

    Applying all of the standard DC linearization tricks to the AbstractUnbalancedACPModel

    SDPUBFModel

    The BFM SDP relaxation as described in:

    • Gan, L., & Low, S. H. (2014). Convex relaxations and linear approximation for optimal power flow in multiphase radial networks. In PSSC (pp. 1–9). Wroclaw, Poland. doi:10.1109/PSCC.2014.7038399

    Note that this formulation is complex-valued and additional steps are needed to implement this in JuMP.

    SOCNLPUBFModel

    The starting point is SDPUBFModel. The SDP constraint can be relaxed to a set of SOC constraints, starting from either the real or complex form of the matrix on which the PSD-ness constraint is applied.

    • Kim, S., Kojima, M., & Yamashita, M. (2003). Second order cone programming relaxation of a positive semidefinite constraint. Optimization Methods and Software, 18(5), 535–541. doi:10.1080/1055678031000148696
    • Andersen, M. S., Hansson, A., & Vandenberghe, L. (2014). Reduced-complexity semidefinite relaxations of optimal power flow problems. IEEE Trans. Power Syst., 29(4), 1855–1863.

    SOCConicUBFModel

    See SOCNLPUBFModel

    LPUBFDiagModel

    This formulation has originally been developed by Sankur et al.

    • Sankur, M. D., Dobbe, R., Stewart, E., Callaway, D. S., & Arnold, D. B. (2016). A linearized power flow model for optimization in unbalanced distribution systems. arXiv:1606.04492v2

    and is here cast as only considering the diagonal elements of the linear formulation by Gan and Low:

    • Gan, L., & Low, S. H. (2014). Convex relaxations and linear approximation for optimal power flow in multiphase radial networks. In PSSC (pp. 1–9). Wroclaw, Poland. doi:10.1109/PSCC.2014.7038399

    This furthermore leads to the imaginary part of the lifted node voltage variable W in Gan and Low being redundant, so it is substituted out in LPUBFDiagModel.

    The full formulation from Gan and Low was supported as LPUBFFullModel in PowerModelsDistribution up to version 0.7.

    FBSUBFPowerModel, FOTPUPowerModel, FOTRUPowerModel

    The linear FBS and FOT formulations as described in:

    • Girigoudar, K., & Roald, L.A. (2021). Linearized Three-Phase Optimal Power Flow Models for Distribution Grids with Voltage Unbalance. 2021 IEEE Conference on Decision and Control (CDC).

    Unbalanced Network Formulation Type Hierarchy

    PowerModelsDistribution has a rich model type hierarchy similar to PowerModels. At the top of the type hierarchy we can distinguish between conic, active power only, and branch flow models:

    abstract type AbstractUnbalancedConicModel <: AbstractPowerModel end
    +abstract type AbstractUnbalancedActivePowerModel <: AbstractPowerModel end
    +abstract type AbstractUBFModel <: AbstractPowerModel end
    +abstract type AbstractUBFQPModel <: AbstractUBFModel end
    +abstract type AbstractUBFConicModel <: AbstractUBFModel end
    +const AbstractUnbalancedConicModels = Union{AbstractUnbalancedConicModel, AbstractUBFConicModel}

    Several nonlinear (non-convex) models are available at the top level:

    abstract type AbstractUnbalancedACPModel <: AbstractPowerModel end
    +abstract type AbstractUnbalancedACRModel <: AbstractPowerModel end
    +abstract type AbstractUnbalancedIVRModel <: AbstractUnbalancedACRModel end

    The following relaxations are available under these hierarchies:

    abstract type AbstractNLPUBFModel <: AbstractUBFQPModel end
    +abstract type AbstractConicUBFModel <: AbstractUBFConicModel end
    +const AbstractUBFModels = Union{AbstractNLPUBFModel, AbstractConicUBFModel}
    +
    +abstract type SDPUBFModel <: AbstractConicUBFModel end
    +abstract type SDPUBFKCLMXModel <: SDPUBFModel end
    +abstract type SOCNLPUBFModel <: AbstractNLPUBFModel end
    +abstract type SOCConicUBFModel <: AbstractConicUBFModel end
    +const SOCUBFModels = Union{SOCNLPUBFModel, SOCConicUBFModel}

    where UBF is an unbalanced variant of the Branch Flow models from PowerModels. Models which do not contain UBF in their name are Bus Injection Models e.g. AbstractUnbalancedACPModel. Finally, some linear unbalanced power flow models are available under the following hierarchy:

    abstract type AbstractUnbalancedDCPModel <: AbstractUnbalancedActivePowerModel end
    +abstract type AbstractUnbalancedNFAModel <: AbstractUnbalancedDCPModel end
    +abstract type AbstractLPUBFModel <: AbstractNLPUBFModel end
    +abstract type LPUBFDiagModel <: AbstractLPUBFModel end
    +const LinDist3FlowModel = LPUBFDiagModel
    +abstract type FBSUBFModel <: AbstractLPUBFModel end

    Unbalanced Power Models

    Each of these Models can be used as the type parameter for an UnbalancedPowerModel:

    mutable struct ACPUPowerModel <: AbstractUnbalancedACPModel @pmd_fields end
    +mutable struct ACRUPowerModel <: AbstractUnbalancedACRModel @pmd_fields end
    +mutable struct DCPUPowerModel <: AbstractUnbalancedDCPModel @pmd_fields end
    +mutable struct NFAUPowerModel <: AbstractUnbalancedNFAModel @pmd_fields end
    +
    +mutable struct SDPUBFPowerModel <: SDPUBFModel @pmd_fields end
    +mutable struct SDPUBFKCLMXPowerModel <: SDPUBFKCLMXModel @pmd_fields end
    +
    +mutable struct SOCNLPUBFPowerModel <: SOCNLPUBFModel @pmd_fields end
    +mutable struct SOCConicUBFPowerModel <: SOCConicUBFModel @pmd_fields end
    +
    +mutable struct LPUBFDiagPowerModel <: LPUBFDiagModel @pmd_fields end
    +const LinDist3FlowPowerModel = LPUBFDiagPowerModel
    +mutable struct FBSUBFPowerModel <: FBSUBFModel @pmd_fields end
    +mutable struct FOTPUPowerModel <: AbstractUnbalancedACPModel @pmd_fields end
    +mutable struct FOTRUPowerModel <: AbstractUnbalancedACRModel @pmd_fields end

    Optimization problem classes

    • NLP (nonconvex): ACPUPowerModel, ACRUPowerModel, IVRUPowerModel
    • SDP: SDPUBFPowerModel, SDPUBFKCLMXPowerModel
    • SOC(-representable): SOCNLPUBFPowerModel, SOCConicUBFPowerModel
    • Linear: LPUBFDiagPowerModel (LinDist3FlowPowerModel), FBSUBFPowerModel, FOTPUPowerModel, FOTRUPowerModel, DCPUPowerModel, NFAUPowerModel

    Matrix equations versus scalar equations

    JuMP supports vectorized syntax, but not for nonlinear constraints. Therefore, certain formulations must be implemented in a scalar fashion. Other formulations can be written as matrix (in)equalities. The current implementations are categorized as follows:

    • Scalar: ACPUPowerModel, ACRUPowerModel, IVRUPowerModel, DCPUPowerModel, NFAPowerModel, FBSUBFPowerModel, FOTPUPowerModel, FOTRUPowerModel
    • Matrix: SDPUBFPowerModel, SDPUBFKCLMXPowerModel, SOCNLPUBFPowerModel, SOCConicUBFPowerModel, LPUBFDiagPowerModel

    Explicit Neutral Models

    Explicit neutral (EN) models represent the neutral currents explicitly; unlike all the previous models, which implicitly assume they are grounded immediately where they originate.

    There are two broad classes of formulations: IVR ones an ACR one.

    IVR

    AbstractExplicitNeutralIVRModel

    This abstract type groups all EN IVR formulations, and is a subtype of AbstractUnbalancedIVRModel.

    AbstractNLExplicitNeutralIVRModel

    This abstract type groups non-linear EN IVR formulations, and is a subtype of AbstractExplicitNeutralIVRModel.

    IVRENPowerModel

    This concrete type is a non-linear EN IVR formulation.

    IVRReducedENPowerModel

    This concrete type is a non-linear EN IVR formulation, where the branches only have series current variables (instead of also total current variables).

    AbstractQuadraticExplicitNeutralIVRModel

    This abstract type groups quadratic EN IVR formulations, and is a subtype of AbstractExplicitNeutralIVRModel.

    IVRQuadraticENPowerModel

    This concrete type is a quadratic EN IVR formulation.

    IVRReducedQuadraticENPowerModel

    This concrete type is a quadratic EN IVR formulation, where the branches only have series current variables (instead of also total current variables).

    ACR

    AbstractExplicitNeutralACRModel

    This abstract type is a subtype of AbstractUnbalancedACRModel, analogous to the IVR structure.

    ACRENPowerModel

    This is the only concrete ACR type amongst the EN formulations.

    Overview of hierarchy

    EN-IVR (AbstractExplicitNeutralIVRModel)
    +|
    +|-- NL (AbstractNLExplicitNeutralIVRModel)
    +|   |
    +|   |-- IVRENPowerModel
    +|
    +|-- Quadratic (AbstractQuadraticExplicitNeutralIVRModel)
    +    |
    +    |-- IVRENPowerModel
    +    |
    +    |-- IVRReducedENPowerModel
    +
    +EN-ACR (AbstractExplicitNeutralIVRModel)
    +|
    +|-- ACRENPowerModel
    diff --git a/v0.15.1/manual/load-model.html b/v0.15.1/manual/load-model.html new file mode 100644 index 000000000..3bc06675a --- /dev/null +++ b/v0.15.1/manual/load-model.html @@ -0,0 +1,6 @@ + +Load Models · PowerModelsDistribution

    Load Models

    \[S^d=[S^d_1...S^d_n]^T\]

    is a column vector $n\times 1$, specifying for each individual load how much power is consumed. By definition, this is

    \[S^d=U^d\odot \left(I^d\right)^*,\]

    where $U^d$ is the voltage applied across each individual load and $I^d$ is the current drawn by each load. At the same time, the composed load is connected to a bus with voltage $U^\text{bus}$, and draws a current $I^{\text{bus}}$ and power $S^{\text{bus}}$.

    How these quantities relate to each other, depends on how the load is connected.

    \[(S^d, U^d, I^d) ↔ (S^\text{bus}, U^\text{bus}, I^\text{bus})\]

    In the implementations, these variables are referred to as

    \[\begin{align} +S^d&=\text{pd}+j.\text{qd} & S^\text{bus}&=\text{pd_bus}+j.\text{qd_bus}\\ +I^d&=\text{crd}+j.\text{cid} & I^\text{bus}&=\text{crd_bus}+j.\text{cid_bus}\\ +U^d&=\text{vrd}+j.\text{vid} & U^\text{bus}&=\text{vr}+j.\text{vi}\\ +\end{align}\]

    Voltage dependency

    The general, exponential load model is defined as

    \[P^d_i = P^{d,0}_i \left(\frac{V^d_i}{V^{d,0}_i}\right)^{\alpha_i} = a_i \left(V^d_i\right)^{\alpha_i}\]

    \[Q^d_i = Q^{d,0}_i \left(\frac{V^d_i}{V^{d,0}_i}\right)^{\beta_i} = b_i \left(V^d_i\right)^{\beta_i}.\]

    There are a few cases which get a special name: constant power ($\alpha=\beta=0$), constant current ($\alpha=\beta=1$), and constant impedance ($\alpha=\beta=2$).

    Wye-connected Loads

    A wye-connected load connects between a set of phases $\mathcal{P}$ and a neutral conductor $n$. The voltage as seen by each individual load is then

    \[U^d = U^\text{bus}_\mathcal{P}-U^\text{bus}_n,\]

    whilst the current

    \[I^\text{bus}_\mathcal{P} = I^\text{d},\;\;\;I^\text{bus}_n=-1^TI^d\]

    We now develop the expression for the power drawn at the bus for the phase conductors

    \[S^\text{bus}_\mathcal{P} = (U^d+U^\text{bus}_n)\odot(I^d)^* = S^d+U^\text{bus}_n S^d\oslash U^d.\]

    From conservation of power or simply the formulas above,

    \[S^\text{bus}_n = -1^TS^\text{bus}_\mathcal{P}+1^TS^d.\]

    Grounded neutral

    Note that when the neutral is grounded, i.e. $U^\text{bus}_n=0$, these formulas simplify to

    \[S^\text{bus}_\mathcal{P}=S^d,\;\;\;S^\text{bus}_n=0,\]

    which is why in Kron-reduced unbalanced networks, you can directly insert the power consumed by the loads, in the nodal power balance equations.

    Delta-connected Loads

    Firstly, define the three-phase delta transformation matrix

    \[M^\Delta_3 = \begin{bmatrix}\;\;\;1 & -1 & \;\;0\\ \;\;\;0 & \;\;\;1 & -1\\ -1 & \;\;\;0 & \;\;\;1\end{bmatrix},\]

    which can be extended to more phases in a straight-forward manner. For loads connected between split-phase terminals of triplex nodes (usually located on the secondary side of center-tapped transformers), we define a single-phase delta transformation matrix

    \[M^\Delta_1 = \begin{bmatrix} 1 & -1 \end{bmatrix}.\]

    Now,

    \[U^d = M^\Delta U^\text{bus},\;\;\; I^\text{bus} = \left(M^\Delta\right)^T I^d.\]

    We can related $S^\text{bus}$ to $U^\text{bus}$ and $I^d$

    \[S^\text{bus} = U^\text{bus}\odot \left(I^\text{bus}\right)^* = U^\text{bus}\odot \left(M^\Delta\right)^T\left(I^d\right)^*,\]

    and using the fact that $\left(I^d\right)^*=S^d \oslash U^d$, and the expression above for $U^d$,

    \[S^\text{bus} = U^\text{bus}\left(M^\Delta\right)^T S^d \oslash M^\Delta U^\text{bus}\]

    diff --git a/v0.15.1/manual/math-model.html b/v0.15.1/manual/math-model.html new file mode 100644 index 000000000..d96501527 --- /dev/null +++ b/v0.15.1/manual/math-model.html @@ -0,0 +1,64 @@ + +Mathematical Model · PowerModelsDistribution

    The PowerModelsDistribution Mathematical Model

    As PowerModelsDistribution implements a variety of power network optimization problems, the implementation is the best reference for precise mathematical formulations. This section provides a complex number based mathematical specification for a prototypical unbalanced AC Optimal Power Flow problem, to provide an overview of the typical mathematical models in PowerModelsDistribution.

    Unbalanced AC Optimal Power Flow

    PowerModelsDistribution implements a generalized version of the AC Optimal Power Flow problem, taking into account phase unbalance. [1] These generalizations make it possible for PowerModelsDistribution to more accurately capture real-world distribution network datasets. The core generalizations are,

    • Support for multiple load and shunt components on each bus
    • Line charging (shunt) that supports a conductance and asymmetrical values

    In the mathematical description below,

    • Bold typeface indicates a vector ($\in \mathbb{C}^c$) or matrix ($\in \mathbb{C}^{c\times c}$)
    • Operator $diag$ takes the diagonal (vector) from a square matrix
    • The set of complex numbers is $\mathbb{C}$ and real numbers is $\mathbb{R}$
    • Superscript $H$ indicates complex conjugate transpose (Hermitian adjoint)
    • Note that complex power is defined as $\mathbf{S}_{ij} = \mathbf{V}_{i} \mathbf{I}_{ij}^H$ and is therefore a complex matrix of dimension $c \times c$
    • The line $\mathbf{Y}^c_{ij}, \mathbf{Y}^c_{ji}$ and bus $\mathbf{Y}^s_{k}$ shunt matrices do not need to be diagonal

    Sets

    The definitions of the sets involved remain unchanged w.r.t. the balanced OPF problem definition, except for the addition of the conductor set:

    \[\begin{align} +% +\mbox{sets:} & \nonumber \\ +& N \mbox{ - buses}\nonumber \\ +& R \mbox{ - references buses}\nonumber \\ +& E, E^R \mbox{ - branches, forward and reverse orientation} \nonumber \\ +& G, G_i \mbox{ - generators and generators at bus $i$} \nonumber \\ +& L, L_i \mbox{ - loads and loads at bus $i$} \nonumber \\ +& S, S_i \mbox{ - shunts and shunts at bus $i$} \nonumber \\ +& C \mbox{ - conductors} \nonumber \\ +% +\end{align}\]

    where the set of conductors $C$ typically equals $\{ a,b,c\}$.

    Data

    \[\begin{align} +\mbox{data:} & \nonumber \\ +& S^{gl}_{k,c}, S^{gu}_{k,c} \in \mathbb{C} \;\; \forall k \in G, \forall c \in C \nonumber; \mathbf{S}^{gl}_{k}:= [S^{gl}_{k,c}]_{c \in C}, \mathbf{S}^{gu}_{k} := [S^{gu}_{k,c}]_{c \in C} \\ +& c_{2k}, c_{1k}, c_{0k} \in \mathbb{R} \;\; \forall k \in G \nonumber \\ +& v^l_{i,c}, v^u_{i,c} \in \mathbb{R} \;\; \forall i \in N, \forall c \in C \nonumber; \mathbf{v}^l_{i} := [v^l_{i,c}]_{c \in C}, \mathbf{v}^u_{i} := [v^u_{i,c}]_{c \in C} \\ +& S^d_{k,c}\in \mathbb{C} \;\; \forall k \in L, \forall c \in C \nonumber; \mathbf{S}^d_{k} := [S^d_{k,c}]_{c \in C} \\ +& \mathbf{Y}^s_{k}\in \mathbb{C}^{c\times c} \;\; \forall k \in S \nonumber \\ +& \mathbf{Y}_{ij}, \mathbf{Y}^c_{ij}, \mathbf{Y}^c_{ji}\in \mathbb{C}^{c\times c} \;\; \forall (i,j) \in E \nonumber \\ +& {s^u}_{ij,c}, \theta^{\Delta l}_{ij,c}, \theta^{\Delta u}_{ij,c} \in \mathbb{R}\;\; \forall (i,j) \in E, \forall c \in C \nonumber, {\mathbf{s}^u}_{ij} := [{s^u}_{ij,c}]_{c \in C} \\ +& V^{\text{ref}}_{i,c} \in \mathbb{C} \;\; \forall r \in R; \mathbf{V}^{\text{ref}}_{i} = [V^{\text{ref}}_{i,c}]_{c \in C} \\ +% +\end{align}\]

    where the notation $\mathbf{v}^l_{i} := [v^l_{i,c}]_{c \in C}$ reflects that the vector $\mathbf{v}^l_{i}$ is constructed by putting the individual phase values $v^l_{i,c}$ in a vector (in order $a,b,c$).

    Alternatively, the series impedance of a line can be written in impedance form:

    \[\mathbf{Z}_{ij} \in \mathbb{C}^{c\times c} \;\; \forall (i,j) \in E \nonumber, \mathbf{Y}_{ij} = ( \mathbf{Z}_{ij})^{-1}\]

    where superscript $-1$ indicates the matrix inverse. Note that $\mathbf{Y}_{ij}$ or $\mathbf{Z}_{ij}$ may not be invertible, e.g. in case of single-phase branches in a three-phase grid. In this case the pseudo-inverse can be used.

    Variables for a Bus Injection Model

    \[\begin{align} +& S^g_{k,c} \in \mathbb{C} \;\; \forall k\in G, \forall c \in C \nonumber; \mathbf{S}^g_{k} := [S^g_{k,c}]_{c \in C} \\ +& V_{i,c} \in \mathbb{C} \;\; \forall i\in N, \forall c \in C \nonumber; \mathbf{V}_{i} := [V_{i,c}]_{c \in C} \\ +& \mathbf{S}_{ij} \in \mathbb{C}^{c\times c} \;\; \forall (i,j) \in E \cup E^R \\ +% +\end{align}\]

    Mathematical Formulation of a Bus Injection Model

    A complete mathematical model is as follows,

    \[ +\begin{align} +\mbox{minimize: } & \sum_{k \in G} c_{2k} \left( \sum_{c \in C} \Re(S^g_{k,c}) \right)^2 + c_{1k} \sum_{c \in C} \Re(S^g_{k,c}) + c_{0k} \\ +% +\mbox{subject to: } & \nonumber \\ +& \mathbf{V}_{i} = \mathbf{V}^{\text{ref}}_{i} \;\; \forall r \in R \\ +& S^{gl}_{k,c} \leq S^g_{k,c} \leq S^{gu}_{k,c} \;\; \forall k \in G, \forall c \in C \\ +& v^l_{i,c} \leq |V_{i,c}| \leq v^u_{i,c} \;\; \forall i \in N, \forall c \in C \\ +& \sum_{\substack{k \in G_i}} \mathbf{S}^g_k - \sum_{\substack{k \in L_i}} \mathbf{S}^d_k - \sum_{\substack{k \in S_i}} \mathbf{V}_i \mathbf{V}^H_i (\mathbf{Y}^s_k)^H = \sum_{\substack{(i,j)\in E_i \cup E_i^R}} diag(\mathbf{S}_{ij}) \;\; \forall i\in N \\ +& \mathbf{S}_{ij} = {\mathbf{V}_i \mathbf{V}_i^H} \left( \mathbf{Y}_{ij} + \mathbf{Y}^c_{ij}\right)^H - {\mathbf{V}_i \mathbf{V}^H_j} \mathbf{Y}^H_{ij} \;\; \forall (i,j)\in E \\ +& \mathbf{S}_{ji} = \mathbf{V}_j \mathbf{V}_j^H \left( \mathbf{Y}_{ij} + \mathbf{Y}^c_{ji} \right)^H - {\mathbf{V}^H_i \mathbf{V}_j} \mathbf{Y}^H_{ij} \;\; \forall (i,j)\in E \\ +& |diag(\mathbf{S}_{ij})| \leq \mathbf{s}^u_{ij} \;\; \forall (i,j) \in E \cup E^R \\ +& \theta^{\Delta l}_{ij,c} \leq \angle (V_{i,c} V^*_{j,c}) \leq \theta^{\Delta u}_{ij,c} \;\; \forall (i,j) \in E, \forall c \in C +% +\end{align}\]

    Variables for a Branch Flow Model

    \[\begin{align} +& S^g_{k,c} \in \mathbb{C}\;\; \forall k\in G, \forall c \in C \nonumber; \mathbf{S}^g_{k} := [S^g_{k,c}]_{c \in C} \\ +& V_{i,c} \in \mathbb{C} \;\; \forall i\in N, \forall c \in C \nonumber; \mathbf{V}_{i} := [V_{i,c}]_{c \in C} \\ +& I^{s}_{ij,c} \in \mathbb{C}\;\; \forall e \in E, \forall c \in C \nonumber; \mathbf{I}^{s}_{ij} := [{I}^{s}_{ij,c}]_{c \in C} \\ +& \mathbf{S}_{ij} \in \mathbb{C}^{c\times c} \;\; \forall (i,j) \in E \cup E^R \\ +% +\end{align}\]

    Mathematical Formulation of a Branch Flow Model

    A complete mathematical model is as follows,

    \[\begin{align} +\mbox{minimize: } & \sum_{k \in G} c_{2k} \left( \sum_{c \in C} \Re(S^g_{k,c}) \right)^2 + c_{1k} \sum_{c \in C} \Re(S^g_{k,c}) + c_{0k} \\ +% +\mbox{subject to: } & \nonumber \\ +& \mathbf{V}_{i} = \mathbf{V}^{\text{ref}}_{i} \;\; \forall r \in R \\ +& S^{gl}_{k,c} \leq S^g_{k,c} \leq S^{gu}_{k,c} \;\; \forall k \in G, \forall c \in C \\ +& v^l_{i,c} \leq |V_{i,c}| \leq v^u_{i,c} \;\; \forall i \in N, \forall c \in C \\ +& \sum_{\substack{k \in G_i}} \mathbf{S}^g_k - \sum_{\substack{k \in L_i}} \mathbf{S}^d_k - \sum_{\substack{k \in S_i}} \mathbf{V}_i \mathbf{V}^H_i (\mathbf{Y}^s_k)^H = \sum_{\substack{(i,j)\in E_i \cup E_i^R}} diag(\mathbf{S}_{ij}) \;\; \forall i\in N \\ +& \mathbf{S}_{ij} + \mathbf{S}_{ji} = \mathbf{V}_i \mathbf{V}_i^H (\mathbf{Y}^c_{ij})^H + \mathbf{Z}_{ij} \mathbf{I}^{s}_{ij}(\mathbf{I}^{s}_{ij})^H + \mathbf{V}_j \mathbf{V}_j^H (\mathbf{Y}^c_{ji})^H \;\; \forall (i,j)\in E \\ +& \mathbf{S}^{s}_{ij} = \mathbf{S}_{ij} + \mathbf{V}_i \mathbf{V}_i^H (\mathbf{Y}^c_{ij})^H \;\; \forall (i,j) \in E \cup E^R \\ +& \mathbf{S}^{s}_{ij} = \mathbf{V}_i (\mathbf{I}^{s}_{ij})^H \;\; \forall (i,j) \in E \cup E^R\\ +& \mathbf{V}_i = \mathbf{V}_j - \mathbf{Z}_{ij} \mathbf{I}^{s}_{ij} \forall (i,j)\in E \\ +& |diag(\mathbf{S}_{ij})| \leq \mathbf{s}^u_{ij} \;\; \forall (i,j) \in E \cup E^R \\ +& \theta^{\Delta l}_{ij,c} \leq \angle (V_{i,c} V^*_{j,c}) \leq \theta^{\Delta u}_{ij,c} \;\; \forall (i,j) \in E, \forall c \in C +% +\end{align}\]

    • 1Gan, L., & Low, S. H. (2014). Convex relaxations and linear approximation for optimal power flow in multiphase radial networks. In PSSC (pp. 1–9). Wroclaw, Poland. https://doi.org/10.1109/PSCC.2014.7038399
    diff --git a/v0.15.1/manual/power-flow.html b/v0.15.1/manual/power-flow.html new file mode 100644 index 000000000..c8548f964 --- /dev/null +++ b/v0.15.1/manual/power-flow.html @@ -0,0 +1,38 @@ + +Power Flow Computations · PowerModelsDistribution

    Power Flow Computations

    The typical goal of PowerModelsDistribution is to build a JuMP model that is used to solve distribution power network optimization problems. The JuMP model abstraction enables PowerModelsDistribution to have state-of-the-art performance on a wide range of problem formulations. That said, for the specific case of power flow computations, in some specific applications performance gains can be had by avoiding the JuMP model abstraction and solving the problem more directly. To that end, PowerModelsDistribution includes Julia-native solvers for AC power flow in rectangular voltage coordinates. This section provides an overview of the different power flow options that are available in PowerModelsDistribution and under what circumstances they may be beneficial.

    Generic Power Flow

    The general purpose power flow solver in PowerModelsDistribution is,

    This function builds a JuMP model for a wide variety of unbalanced power flow formulations supported by PowerModelsDistribution. For example it supports,

    • ACPUPowerModel - a non-convex nonlinear AC unbalanced power flow using complex voltages in polar coordinates
    • ACRPowerModel - a non-convex nonlinear AC unbalanced power flow using complex voltages in rectangular coordinates
    • ACRENPowerModel - a non-convex nonlinear AC unbalanced power flow using complex voltages in rectangular coordinates with explicit neutral conductor
    • IVRUPowerModel - a non-convex nonlinear AC power unbalanced flow using current voltage variables in rectangular coordinates
    • IVRENPowerModel - a non-convex nonlinear AC unbalanced power flow using current voltage variables in rectangular coordinates with explicit neutral conductor

    The solve_mc_pf solution method is both formulation and solver agnostic and can leverage the wide range of solvers that are available in the JuMP ecosystem. Many of these solvers are commercial-grade, which in turn makes solve_mc_pf the most reliable power flow solution method in PowerModelsDistribution.

    Warm Starting

    In some applications an initial guess of the power flow solution may be available. In such a case, this information may be able to decrease a solver's time to convergence, especially when solving systems of nonlinear equations. The _start postfix can be used in the network data to initialize the solver's variables and provide a suitable solution guess. The most common values are as follows,

    For each generator,

    • pg_start - active power injection starting point
    • qg_start - reactive power injection starting point

    For each bus,

    • vm_start - voltage magnitude starting point for the ACPUPowerModel model
    • va_start - voltage angle starting point for the ACPUPowerModel model
    • vr_start - real voltage starting point for the IVRUPowerModel model
    • vi_start - imaginary voltage starting point for the IVRUPowerModel model

    The following helper function can be used to use the solution point in the network data as the starting point for solve_mc_pf.

    PowerModelsDistribution.add_start_voltage!Function
    add_start_voltage!(
    +    data_math::Dict{String,Any};
    +    coordinates=:rectangular,
    +    uniform_v_start=missing,
    +    vr_default=0.0,
    +    vi_default=0.0,
    +    vm_default=0.0,
    +    va_default=0.0,
    +    epsilon::Number=1E-3,
    +)::Dict{String,Any}

    Adds start values for the voltage to the buses. For a multinetwork data model, you can calculate the start voltages for a representative network through 'calcstartvoltage', and pass the result as 'uniformvstart' to use the same values for all networks and avoid recalculating it for each network. The argument 'epsilon' controls the offset added to ungrounded terminals which would otherwise be set to zero.

    source
    Warning

    Warm starting a solver is a very delicate task and can easily result in degraded performance. Using PowerModelsDistribution' default flat-start values is recommended before experimenting with warm starting a solver.

    Native Power Flow

    The AC Unbalanced Power Flow problem is ubiquitous in power system analysis. The problem requires solving a system of nonlinear equations, usually via a Newton-Raphson type of algorithm. In PowerModelsDistribution, the standard Julia library is used for solving this system of nonlinear equations. The following function is used to solve Unbalanced Power Flow problem with voltages in rectangular coordinates.

    PowerModelsDistribution.compute_mc_pfFunction
    compute_mc_pf(
    +    data::Dict{String,<:Any};
    +    explicit_neutral::Bool=false,
    +    max_iter::Int=100,
    +    v_start::Union{Dict{<:Any,<:Any},Missing}=missing,
    +    stat_tol::Real=1e-8,
    +    verbose::Bool=false,
    +    kron_reduce::Bool=true,
    +    phase_project::Bool=false,
    +    multinetwork::Bool=false,
    +    global_keys::Set{String}=Set{String}(),
    +    eng2math_extensions::Vector{<:Function}=Function[],
    +    eng2math_passthrough::Dict{String,<:Vector{<:String}}=Dict{String,Vector{String}}(),
    +    make_pu_extensions::Vector{<:Function}=Function[],
    +    map_math2eng_extensions::Dict{String,<:Function}=Dict{String,Function}(),
    +    make_si::Bool=!get(data, "per_unit", false),
    +    make_si_extensions::Vector{<:Function}=Function[],
    +    dimensionalize_math_extensions::Dict{String,Dict{String,Vector{String}}}=Dict{String,Dict{String,Vector{String}}}(),
    +)::Dict{String,Any}

    Takes data in either the ENGINEERING or MATHEMATICAL model, a model type (e.g., ACRUPowerModel), and model builder function (e.g., build_mc_opf), and returns a solution in the original data model defined by data.

    Technical description of the native power flow can be found at https://arxiv.org/abs/2305.04405 where implementation fo the fixed-point current injection algorithm, inspired by the existing open-source implementation in OpenDSS. The current injection method is commonly conceived as a system of nonlinear equalities solved by Newton’s method. However, the fixed point iteration variant commonly outperforms most methods, while supporting meshed topologies from the ground up

    If make_si is false, data will remain in per-unit.

    For an explanation of multinetwork and global_keys, see make_multinetwork

    For an explanation of eng2math_extensions and eng2math_passthrough, see transform_data_model

    For an explanation of make_pu_extensions, see make_per_unit!

    For an explanation of ref_extensions, see instantiate_mc_model

    For an explanation of map_math2eng_extensions, make_si, make_si_extensions, and dimensionalize_math_extensions, see solution_make_si

    source
    compute_mc_pf(
    +  pdf::PowerFlowData,
    +  max_iter::Int,
    +  stat_tol::Float,
    +  verbose::Bool
    +)

    Computes native power flow and requires PowerFlowData (See https://arxiv.org/abs/2305.04405).

    source

    compute_mc_pf is based on the current injection method and is inspired by OpenDSS's algorithm. compute_mc_pf will typically provide an identical result to solve_mc_pf. However, the existence of solution degeneracy around generator injection assignments and multiple power flow solutions can yield different results. The primary advantage of compute_mc_pf over solve_mc_pf is that it does not require building a JuMP model. If the initial point for the Unbalanced Power Flow solution is near-feasible then compute_mc_pf can result in a significant runtime saving by converging quickly and reducing data-wrangling and memory allocation overheads. This initial guess is provided using the standard _start values. The add_start_voltage! function provides a convenient way of setting a suitable starting point.

    Tip

    If compute_mc_pf fails to converge try solve_mc_pf instead.

    The table below reports the accuracy of the native power flow with respect to OpenDSS native solver tested on three IEEE testcases: | IEEE testcases | maximum voltage p.u difference with OpenDSS power flow solver | | –––––––-| ––––––––––––––––––––––––––––––- | | IEEE13 | 3.765096388188572e-6 | | IEEE34 | 6.805369850332029e-8 | | IEEE123 | 4.021326251365659e-8 |

    Input arguments

    compute_mc_pf receives input arguments as follows,

    • data_math - network data in MATHEMATICAL format
    • explicit_neutral - a boolean input indication wether or not the neutral is explicitly modelled
    • v_start - warm start if different from in-built initialization algorithm
    • max_iter - maximum iterations
    • stat_tol - statistical tolerance

    Outputs

    compute_mc_pf provides the following outputs,

    • solution - solution dictionary
    • iterations - number of iterations
    • time_build - time spent on building the power flow data
    • time_solve - time spent on solving the native power flow
    • time_post - time spent to generate solutions
    • time_total - total time
    • termination_status - termination status

    Limitations

    compute_mc_pf has the following limitations,

    • starting from the math dictionary means that transformer decomposition is already done, which is different from what OpenDSS does
    • we calculate the primitive admittance matrix in p.u. whereas OpenDSS algorithm works with actual units
    • no load model relaxation is performed
    • inspired by OpenDSS, we add small ppm values to certain component primitive admittance values to avoid singularity issues
    • inspired by OpenDSS, switch primitive admittance has specific values

    Network Admittance Matrix

    Internally compute_mc_pf utilizes an admittance matrix representation of the network data, which may be useful in other contexts. The foundational type for the admittance matrix representations is SparseMatrixCSC.

    The following function can be used to compute the admittance matrix from PowerModelsDistribution network data.

    diff --git a/v0.15.1/manual/quickguide.html b/v0.15.1/manual/quickguide.html new file mode 100644 index 000000000..918e0bdcb --- /dev/null +++ b/v0.15.1/manual/quickguide.html @@ -0,0 +1,15 @@ + +Getting Started · PowerModelsDistribution

    Quick Start Guide

    Once PowerModelsDistribution is installed, Ipopt is installed, and a network data file (e.g., "case3_unbalanced.dss" in the package folder under ./test/data) has been acquired, an unbalanced AC Optimal Power Flow can be executed with,

    using PowerModelsDistribution
    +using Ipopt
    +
    +solve_mc_opf("case3_unbalanced.dss", ACPUPowerModel, Ipopt.Optimizer)

    Parsing files

    To parse an OpenDSS file into PowerModelsDistribution's default ENGINEERING format, use the parse_file command

    eng = parse_file("case3_unbalanced.dss")

    To examine the MATHEMATICAL model it is possible to transform the data model using the transform_data_model command, but this step is not necessary to run a problem.

    math = transform_data_model(eng)

    Getting Results

    The run commands in PowerModelsDistribution return detailed results data in the form of a dictionary. This dictionary can be saved for further processing as follows,

    result = solve_mc_opf(eng, ACPUPowerModel, Ipopt.Optimizer)

    Alternatively, you can pass the file path string directly:

    result = solve_mc_opf("case3_unbalanced.dss", ACPUPowerModel, Ipopt.Optimizer)

    Accessing Different Formulations

    ACPUPowerModel indicates an unbalanced (i.e., multiconductor) AC formulation in polar coordinates. This more generic solve_mc_opf allows one to solve an OPF problem with any power network formulation in PowerModelsDistribution. For example, the SDPUBFPowerModel relaxation of unbalanced Optimal Power Flow (branch flow model) can be run with,

    using SCS
    +solve_mc_opf(eng, SDPUBFPowerModel, with_optimizer(SCS.Optimizer))

    Note that you have to use a SDP-capable solver, e.g., the open-source solver SCS, to solve SDP models.

    Inspecting the Formulation

    The following example demonstrates how to break a solve_mc_opf call into separate model building and solving steps. This allows inspection of the JuMP model created by PowerModelsDistribution for the AC-OPF problem. Note that the MATHEMATICAL model must be passed to instantiate_mc_model, so the data model must either be transformed with transform_data_model or parsed directly to a MATHEMATICAL model using the data_model keyword argument:

    math = parse_file("case3_unbalanced.dss"; data_model=MATHEMATICAL)
    +pm = instantiate_model(math, ACPUPowerModel, build_mc_opf; ref_extensions=[ref_add_arcs_trans!])
    +print(pm.model)
    +optimize_model!(pm, optimizer=Ipopt.Optimizer)

    Providing a Warm Start

    To reduce the number of solver iterations, it might be useful to provide a (good) initial value to some or all optimization variables. To do so, it is sufficient to assign a value or vector (depending on the dimensions of the variable) in the data dictionary, under the key $(variablename)_start. The example below shows how to do it for the vm and va variables.

    math = parse_file("case3_unbalanced.dss"; data_model=MATHEMATICAL)
    +math["bus"]["2"]["vm_start"] = [0.9959, 0.9959, 0.9959]
    +math["bus"]["2"]["va_start"] = [0.00, -2.0944, 2.0944]

    Providing a bad initial value might result in the opposite effect: longer calculation times or convergence issues, so the start value assignment should be done attentively. If no initial value is provided, a flat start is assigned by default. The default initial value of each variable is indicated in the function where the variable is defined, as the last argument of the comp_start_value function. In the case of vm, this is 1.0, as shown below:

    vm = var(pm, nw)[:vm] = Dict(i => JuMP.@variable(pm.model,
    +        [c in 1:ncnds], base_name="$(nw)_vm_$(i)",
    +        start = comp_start_value(ref(pm, nw, :bus, i), "vm_start", c, 1.0)
    +    ) for i in ids(pm, nw, :bus)
    +)

    Finally, it should be noted that if va_start and vm_start are present in a data dictionary which is passed to the ACR or IVR formulation, these are converted to their rectangular equivalents and used as vr_start and vi_start.

    Examples

    More examples of working with the engineering data model can be found in the /examples folder of the PowerModelsDistribution.jl repository. These are Pluto Notebooks; instructions for running them can be found in the Pluto documentation.

    diff --git a/v0.15.1/manual/specifications.html b/v0.15.1/manual/specifications.html new file mode 100644 index 000000000..5a4bd8134 --- /dev/null +++ b/v0.15.1/manual/specifications.html @@ -0,0 +1,23 @@ + +Problem Specifications · PowerModelsDistribution

    Problem Specifications

    In addition to the standard power flow solve_mc_pf, and optimal power flow solve_mc_opf, there are several notable problem specifications included in PowerModelsDistribution.

    Optimal Power Flow (OPF) with On-Load Tap Changers (OLTC)

    This problem is identical to mc_opf, except that all transformers are now modelled as on-load tap changers (OLTCs). Each phase has an individual tap ratio, which can be either variable or fixed, as specified in the data model.

    OLTC Objective

    objective_mc_min_fuel_cost

    OLTC Variables

    variable_mc_oltc_transformer_tap

    OLTC Constraints

    constraint_mc_transformer_power(pm, i, fix_taps=false)

    Minimal Load Delta (MLD) Problem Specification

    Load shed (continuous) problem. See "Relaxations of AC Maximal Load Delivery for Severe Contingency Analysis" by C. Coffrin et al. (DOI: 10.1109/TPWRS.2018.2876507) for single-phase case.

    MLD Variables

    \[\begin{align} +\mbox{variables: } & \nonumber \\ +& z^v_i \in \{0,1\}\ \ \forall i \in N \mbox{ - bus voltage on/off variable} \\ +& z^g_i \in \{0,1\}\ \ \forall i \in G \mbox{ - generator on/off variable} \\ +& z^{b}_i \in \{0,1\}\ \ \forall i \in B\mbox{ - storage on/off variable} \\ +& z^d_i \in (0,1)\ \ \forall i \in L \mbox{ - continuous load shedding variable} \\ +& z^s_i \in (0,1)\ \ \forall i \in H \mbox{ - continuous shunt shedding variable} +\end{align}\]

    MLD Objective

    \[\begin{align} +\mbox{minimize: }\left ( +\sum_{\substack{i\in N,c\in C}}{10 \left (1-z^v_i \right )} + \sum_{\substack{i\in L,c\in C}}{10 \omega_{i,c}\left |\Re{\left (S^d_i\right )}\right |\left ( 1-z^d_i \right ) } + \sum_{\substack{i\in H,c\in C}}{\left | \Re{\left (S^s_i \right )}\right | \left (1-z^s_i \right ) } + \sum_{\substack{i\in G,c\in C}}{\Delta^g_i } + \sum_{\substack{i\in B,c\in C}}{\Delta^b_i} \right ) +\end{align}\]

    where

    \[\begin{align} +\Delta^g_i &>= \left [\Re{\left (S^g_{i}(0) \right )} - \Re{\left (S^g_i \right )} \right ] \\ +\Delta^g_i &>= -\left [\Re{\left (S^g_{i}(0) \right )} - \Re{\left (S^g_i \right )} \right ] \\ +\Delta^b_i &>= \left [\Re{\left (S^b_{i}(0) \right )} - \Re{\left (S^b_i \right )} \right ] \\ +\Delta^b_i &>= -\left [\Re{\left (S^b_{i}(0) \right )} - \Re{\left (S^b_i \right )} \right ] +\end{align}\]

    MLD Constraints

    \[\begin{align} +\mbox{subject to: } & \nonumber \\ +& z^v_i v^l_{i,c} \leq \left | V_{i,c} \right | \leq z_i^v v^u_{i,c}\ \ \forall i \in N,\forall c \in C \\ +& z^g_i S^{gl}_{i,c} \leq S^g_{i,c} \leq z^g_i S^{gu}_{i,c}\ \ \forall i \in G,\forall c \in C \\ +& \sum_{\substack{k\in G_i,c\in C}} S^g_{k,c} - \sum_{\substack{k\in L_i,c\in C}} z^d_k S^d_{k,c}- \sum_{\substack{k\in H_i,c\in C}} z^s_k Y^s_{k,c}\left | V_{i,c} \right |^2 \nonumber \\ +& = \sum_{\substack{(i,j)\in E_i\cup E_i^R,c\in C}} S_{ij,c}\ \forall i \in N +\end{align}\]

    diff --git a/v0.15.1/reference/base.html b/v0.15.1/reference/base.html new file mode 100644 index 000000000..ce9e018c1 --- /dev/null +++ b/v0.15.1/reference/base.html @@ -0,0 +1,32 @@ + +Base · PowerModelsDistribution

    Base

    Helper functions

    PowerModelsDistribution.set_lower_boundFunction
    function set_lower_bound(
    +	x::JuMP.VariableRef,
    +	bound::Real
    +)

    Local wrapper method for JuMP.setlowerbound, which skips NaN and infinite (-Inf only)

    source
    function set_lower_bound(
    +	xs::Vector{JuMP.VariableRef},
    +	bound::Real
    +)

    Local wrapper method for JuMP.setlowerbound, which skips NaN and infinite (-Inf only). Note that with this signature, the bound is applied to every variable in the vector.

    source
    PowerModelsDistribution.set_upper_boundFunction
    function set_upper_bound(
    +	x::JuMP.VariableRef,
    +	bound
    +)

    Local wrapper method for JuMP.setupperbound, which skips NaN and infinite (+Inf only)

    source
    function set_upper_bound(
    +	xs::Vector{JuMP.VariableRef},
    +	bound::Real
    +)

    Local wrapper method for JuMP.setupperbound, which skips NaN and infinite (+Inf only). Note that with this signature, the bound is applied to every variable in the vector.

    source
    PowerModelsDistribution.comp_start_valueFunction
    comp_start_value(
    +  comp::Dict,
    +  keys::Vector{String},
    +  conductor::Int,
    +  default::Any
    +)

    Searches for start value for a variable key in order from a list of keys of a component comp for conductor conductor, and if one does not exist, uses default

    source
    function comp_start_value(
    +	comp::Dict{String,<:Any},
    +	key::String,
    +	conductor::Int,
    +	default::Any
    +)

    Searches for start value for a variable key of a component comp for conductor conductor, and if one does not exist, uses default

    source
    function comp_start_value(
    +	comp::Dict{String,<:Any},
    +	keys::String,
    +	default::Any=0.0
    +)

    Searches for start value for a variable key in order from a list of keys of a component comp, and if one does not exist, uses default. This is the conductor-agnostic version of comp_start_value.

    source
    function comp_start_value(
    +  comp::Dict,
    +  key::String,
    +  default::Any=0.0
    +)

    Searches for start value for a variable key of a component comp, and if one does not exist, uses default. This is the conductor-agnostic version of comp_start_value.

    source

    Ref Creation Functions

    PowerModelsDistribution.ref_add_core!Method
    ref_add_core!(ref::Dict{Symbol,Any})

    Returns a dict that stores commonly used pre-computed data from of the data dictionary, primarily for converting data-types, filtering out deactivated components, and storing system-wide values that need to be computed globally. Some of the common keys include:

    • :off_angmin and :off_angmax (see calc_theta_delta_bounds(data)),
    • :bus – the set {(i, bus) in ref[:bus] : bus["bus_type"] != 4},
    • :gen – the set {(i, gen) in ref[:gen] : gen["gen_status"] == 1 && gen["gen_bus"] in keys(ref[:bus])},
    • :branch – the set of branches that are active in the network (based on the component status values),
    • :arcs_branch_from – the set [(i,b["f_bus"],b["t_bus"]) for (i,b) in ref[:branch]],
    • :arcs_branch_to – the set [(i,b["t_bus"],b["f_bus"]) for (i,b) in ref[:branch]],
    • :arcs_branch – the set of arcs from both arcs_from and arcs_to,
    • :arcs_switch_from – the set [(i,b["f_bus"],b["t_bus"]) for (i,b) in ref[:switch]],
    • :arcs_switch_to – the set [(i,b["t_bus"],b["f_bus"]) for (i,b) in ref[:switch]],
    • :arcs_switch – the set of arcs from both arcs_switch_from and arcs_switch_to,
    • :arcs_transformer_from – the set [(i,b["f_bus"],b["t_bus"]) for (i,b) in ref[:transformer]],
    • :arcs_transformer_to – the set [(i,b["t_bus"],b["f_bus"]) for (i,b) in ref[:transformer]],
    • :arcs_transformer – the set of arcs from both arcs_transformer_from and arcs_transformer_to,
    • :bus_arcs_branch – the mapping Dict(i => [(l,i,j) for (l,i,j) in ref[:arcs_branch]]),
    • :bus_arcs_transformer – the mapping Dict(i => [(l,i,j) for (l,i,j) in ref[:arcs_transformer]]),
    • :bus_arcs_switch – the mapping Dict(i => [(l,i,j) for (l,i,j) in ref[:arcs_switch]]),
    • :buspairs – (see buspair_parameters(ref[:arcs_branch_from], ref[:branch], ref[:bus])),
    • :bus_gens – the mapping Dict(i => [gen["gen_bus"] for (i,gen) in ref[:gen]]).
    • :bus_loads – the mapping Dict(i => [load["load_bus"] for (i,load) in ref[:load]]).
    • :bus_shunts – the mapping Dict(i => [shunt["shunt_bus"] for (i,shunt) in ref[:shunt]]).
    source

    InfrastructureModels Extensions

    InfrastructureModels.build_solution_valuesFunction

    custom build_solution_values for multiconductor (vector) variables

    source

    custom build_solution_values for multiconductor (vector) nonlinear expressions

    source

    custom build_solution_values for multiconductor (vector) generic affine expressions

    source

    custom build_solution_values for multiconductor (vector) constants

    source

    custom build_solution_values for generic dense axis arrays

    source

    custom build_solution_values for multiconductor (vector) constants

    source
    diff --git a/v0.15.1/reference/constants.html b/v0.15.1/reference/constants.html new file mode 100644 index 000000000..b83abccb5 --- /dev/null +++ b/v0.15.1/reference/constants.html @@ -0,0 +1,2 @@ + +Constants · PowerModelsDistribution diff --git a/v0.15.1/reference/constraints.html b/v0.15.1/reference/constraints.html new file mode 100644 index 000000000..d436c8342 --- /dev/null +++ b/v0.15.1/reference/constraints.html @@ -0,0 +1,905 @@ + +Constraints · PowerModelsDistribution

    Constraints

    PowerModelsDistribution.constraint_SWL_psdMethod

    Take a multi-conductor voltage variable V and a current variable I. The associated power is then defined as S = VI^H Define the lifted variables as W and L as W = VV^H, L = I*I^H Then, it is equally valid that [W S; S^H L] ∈ PSDCone, rank([W S; S^H L])=1 This function adds this PSD constraint for the rectangular coordinates of S, W and L.

    source
    PowerModelsDistribution.constraint_capacitor_on_offMethod
    constraint_capacitor_on_off(pm::AbstractUnbalancedACPModel, i::Int; nw::Int=nw_id_default)

    Add constraints to model capacitor switching

    \[\begin{align} +&\text{kvar control (ON): } q-q_\text{on} ≤ M_q ⋅ z - ϵ ⋅ (1-z), \\ +&\text{kvar control (OFF): } q-q_\text{off} ≥ -M_q ⋅ (1-z) - ϵ ⋅ z, \\ +&\text{voltage control (ON): } v-v_\text{min} ≥ -M_v ⋅ z + ϵ ⋅ (1-z), \\ +&\text{voltage control (OFF): } v-v_\text{max} ≤ M_v ⋅ (1-z) - ϵ ⋅ z. +\end{align}\]

    source
    PowerModelsDistribution.constraint_capacitor_on_offMethod
    constraint_capacitor_on_off(pm::AbstractUnbalancedACRModel, i::Int; nw::Int=nw_id_default)

    Add constraints to model capacitor switching

    \[\begin{align} +&\text{kvar control (ON): } q-q_\text{on} ≤ M_q ⋅ z - ϵ ⋅ (1-z), \\ +&\text{kvar control (OFF): } q-q_\text{off} ≥ -M_q ⋅ (1-z) - ϵ ⋅ z, \\ +&\text{voltage control (ON): } v_r^2 + v_i^2 - v_\text{min}^2 ≥ -M_v ⋅ z + ϵ ⋅ (1-z), \\ +&\text{voltage control (OFF): } v_r^2 + v_i^2 - v_\text{max}^2 ≤ M_v ⋅ (1-z) - ϵ ⋅ z. +\end{align}\]

    source
    PowerModelsDistribution.constraint_capacitor_on_offMethod
    constraint_capacitor_on_off(pm::AbstractUnbalancedIVRModel, i::Int; nw::Int=nw_id_default)

    Add constraints to model capacitor switching

    \[\begin{align} +&\text{kvar control: } s = (vr_fr+im*vi_fr).*(cr_fr-im*ci_fr),\\ +&\text{kvar control (ON): } \Im{s}-q_\text{on} ≤ M_q ⋅ z - ϵ ⋅ (1-z), \\ +&\text{kvar control (OFF): } \Im{s}-q_\text{off} ≥ -M_q ⋅ (1-z) - ϵ ⋅ z, \\ +&\text{voltage control (ON): } v_r^2 + v_i^2 - v_\text{min}^2 ≥ -M_v ⋅ z + ϵ ⋅ (1-z), \\ +&\text{voltage control (OFF): } v_r^2 + v_i^2 - v_\text{max}^2 ≤ M_v ⋅ (1-z) - ϵ ⋅ z. +\end{align}\]

    source
    PowerModelsDistribution.constraint_capacitor_on_offMethod
    constraint_capacitor_on_off(pm::FBSUBFPowerModel, i::Int; nw::Int=nw_id_default)

    Add constraints to model capacitor switching

    \[\begin{align} +&\text{kvar control (ON): } q-q_\text{on} ≤ M_q ⋅ z - ϵ ⋅ (1-z), \\ +&\text{kvar control (OFF): } q-q_\text{off} ≥ -M_q ⋅ (1-z) - ϵ ⋅ z, \\ +&\text{voltage control (ON): } 2 ⋅ v_{r0} ⋅ v_r + 2 ⋅ v_{i0} ⋅ v_i - v_{r0}^2 - v_{i0}^2 - v_\text{min}^2 ≥ -M_v ⋅ z + ϵ ⋅ (1-z), \\ +&\text{voltage control (OFF): } 2 ⋅ v_{r0} ⋅ v_r + 2 ⋅ v_{i0} ⋅ v_i - v_{r0}^2 - v_{i0}^2 - v_\text{max}^2 ≤ M_v ⋅ (1-z) - ϵ ⋅ z. +\end{align}\]

    source
    PowerModelsDistribution.constraint_capacitor_on_offMethod
    constraint_capacitor_on_off(pm::LPUBFDiagModel, i::Int; nw::Int=nw_id_default)

    Add constraints to model capacitor switching

    \[\begin{align} +&\text{kvar control (ON): } q-q_\text{on} ≤ M_q ⋅ z - ϵ ⋅ (1-z), \\ +&\text{kvar control (OFF): } q-q_\text{off} ≥ -M_q ⋅ (1-z) - ϵ ⋅ z, \\ +&\text{voltage control (ON): } w - v_\text{min}^2 ≥ -M_v ⋅ z + ϵ ⋅ (1-z), \\ +&\text{voltage control (OFF): } w - v_\text{max}^2 ≤ M_v ⋅ (1-z) - ϵ ⋅ z. +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_ampacity_fromMethod
    constraint_mc_ampacity_from(pm::AbstractUnbalancedACPModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on branches from-side

    mathp_{fr}^2 + q_{fr}^2 \leq vm_{fr}^2 i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_ampacity_fromMethod
    constraint_mc_ampacity_from(pm::AbstractUnbalancedRectangularModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on branches from-side

    mathp_{fr}^2 + q_{fr}^2 \leq (vr_{fr}^2 + vi_{fr}^2) i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_ampacity_fromMethod
    constraint_mc_ampacity_from(pm::AbstractUnbalancedWModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on branches from-side

    mathp_{fr}^2 + q_{fr}^2 \leq w_{fr} i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_ampacity_fromMethod
    constraint_mc_ampacity_from(pm::AbstractUnbalancedWModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})

    ACP current limit constraint on branches from-side

    mathp_{fr}^2 + q_{fr}^2 \leq w_{fr} i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_ampacity_toMethod
    constraint_mc_ampacity_to(pm::AbstractUnbalancedACPModel, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on branches to-side

    mathp_{to}^2 + q_{to}^2 \leq vm_{to}^2 i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_ampacity_toMethod
    constraint_mc_ampacity_to(pm::AbstractUnbalancedRectangularModels, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on branches to-side

    mathp_{to}^2 + q_{to}^2 \leq (vr_{to}^2 + vi_{to}^2) i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_ampacity_toMethod
    constraint_mc_ampacity_to(pm::AbstractUnbalancedWModels, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on branches to-side

    mathp_{to}^2 + q_{to}^2 \leq w_{to} i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_ampacity_toMethod
    constraint_mc_ampacity_to(pm::AbstractUnbalancedWModels, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, c_rating::Vector{<:Real})

    ACP current limit constraint on branches to-side

    mathp_{to}^2 + q_{to}^2 \leq w_{to} i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_branch_current_limitMethod
    function constraint_mc_branch_current_limit(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector,
    +	t_connections::Vector,
    +	c_rating::Vector{<:Real};
    +	report::Bool=true
    +)

    For ACR models with explicit neutrals, imposes a bound on the total current magnitude per conductor.

    p_fr^2 + q_fr^2 <= r^2 * (vr_fr^2 + vi_fr^2)
    +p_to^2 + q_to^2 <= r^2 * (vr_to^2 + vi_to^2)
    source
    PowerModelsDistribution.constraint_mc_branch_current_limitMethod
    function constraint_mc_branch_current_limit(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector,
    +	t_connections::Vector,
    +	c_rating::Vector{<:Real};
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, imposes a bound on the current magnitude per conductor at both ends of the branch (total current, i.e. including shunt contributions).

    cr_fr^2 + ci_fr^2 <= c_rating^2
    +cr_to^2 + ci_to^2 <= c_rating^2
    source
    PowerModelsDistribution.constraint_mc_branch_current_limitMethod
    function constraint_mc_branch_current_limit(
    +	pm::ExplicitNeutralModels,
    +	id::Int;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true,
    +)

    For models with explicit neutrals, imposes a bound on the current magnitude per conductor at both ends of the branch (total current, i.e. including shunt contributions)

    source
    PowerModelsDistribution.constraint_mc_branch_flowMethod
    constraint_mc_branch_flow(pm::AbstractUnbalancedPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int})

    For superconducting branch flow (brr and brx all zeros)

    source
    PowerModelsDistribution.constraint_mc_bus_voltage_balanceMethod
    constraint_mc_bus_voltage_balance(pm::AbstractUnbalancedPowerModel, bus_id::Int; nw=nw_id_default)::Nothing

    Template function for bus voltage balance constraints.

    Impose all balance related constraints for which key present in data model of bus. For a discussion of sequence components and voltage unbalance factor (VUF), see @INPROCEEDINGS{girigoudarmolzahnroald-2019, author={K. Girigoudar and D. K. Molzahn and L. A. Roald}, booktitle={submitted}, title={{Analytical and Empirical Comparisons of Voltage Unbalance Definitions}}, year={2019}, month={}, url={https://molzahn.github.io/pubs/girigoudarmolzahnroald-2019.pdf} }

    source
    PowerModelsDistribution.constraint_mc_bus_voltage_dropMethod
    function constraint_mc_bus_voltage_drop(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	i::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	r::Matrix{<:Real},
    +	x::Matrix{<:Real}
    +)

    For IVR models with explicit neutrals, defines voltage drop over a branch, linking from and to side complex voltage.

    vr_to == vr_fr - r*csr_fr + x*csi_fr
    +vi_to == vi_fr - r*csi_fr - x*csr_fr
    source
    PowerModelsDistribution.constraint_mc_current_balanceMethod
    function constraint_mc_current_balance(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	i::Int,
    +	terminals::Vector{Int},
    +	grounded::Vector{Bool},
    +	bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},
    +	bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},
    +	bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},
    +	bus_gens::Vector{Tuple{Int,Vector{Int}}},
    +	bus_storage::Vector{Tuple{Int,Vector{Int}}},
    +	bus_loads::Vector{Tuple{Int,Vector{Int}}},
    +	bus_shunts::Vector{Tuple{Int,Vector{Int}}}
    +)

    Kirchhoff's current law applied to buses sum(cr + im*ci) = 0

    source
    PowerModelsDistribution.constraint_mc_current_balance_capcMethod
    constraint_mc_current_balance_capc(pm::AbstractUnbalancedIVRModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Current balance constraints with capacitor control.

    source
    PowerModelsDistribution.constraint_mc_current_fromMethod
    function constraint_mc_current_from(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	f_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	g_sh_fr::Matrix{<:Real},
    +	b_sh_fr::Matrix{<:Real};
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, defines how current distributes over series and shunt impedances of a pi-model branch.

    cr_fr == csr_fr + g_sh_fr*vr_fr - b_sh_fr*vi_fr
    +ci_fr == csi_fr + g_sh_fr*vi_fr + b_sh_fr*vr_fr
    source
    PowerModelsDistribution.constraint_mc_current_fromMethod
    function constraint_mc_current_from(
    +	pm::ReducedExplicitNeutralIVRModels,
    +	nw::Int,
    +	f_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	g_sh_fr::Matrix{<:Real},
    +	b_sh_fr::Matrix{<:Real};
    +	report::Bool=true
    +)

    For branch-reduced IVR models with explicit neutrals, defines how current distributes over series and shunt impedances of a pi-model branch.

    cr_fr = csr_fr + g_sh_fr*vr_fr - b_sh_fr*vi_fr
    +ci_fr = csi_fr + g_sh_fr*vi_fr + b_sh_fr*vr_fr
    source
    PowerModelsDistribution.constraint_mc_current_toMethod
    function constraint_mc_current_to(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	t_bus,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	g_sh_to::Matrix{<:Real},
    +	b_sh_to::Matrix{<:Real};
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, defines how current distributes over series and shunt impedances of a pi-model branch.

    cr_to == csr_to + g_sh_to*vr_to - b_sh_to*vi_to
    +ci_to == csi_to + g_sh_to*vi_to + b_sh_to*vr_to
    source
    PowerModelsDistribution.constraint_mc_current_toMethod
    function constraint_mc_current_to(
    +	pm::ReducedExplicitNeutralIVRModels,
    +	nw::Int,
    +	t_bus,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	g_sh_to::Matrix{<:Real},
    +	b_sh_to::Matrix{<:Real};
    +	report::Bool=true
    +)

    For branch-reduced IVR models with explicit neutrals, defines how current distributes over series and shunt impedances of a pi-model branch.

    cr_to = csr_to + g_sh_to*vr_to - b_sh_to*vi_to
    +ci_to = csi_to + g_sh_to*vi_to + b_sh_to*vr_to
    source
    PowerModelsDistribution.constraint_mc_generator_currentMethod
    function constraint_mc_generator_current(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	id::Int;
    +	nw::Int=nw_id_default,
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For IVR models with explicit neutrals, creates expressions for the terminal current flows :crg_bus and :cig_bus.

    source
    PowerModelsDistribution.constraint_mc_generator_current_deltaMethod
    function constraint_mc_generator_current_delta(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	connections::Vector{Int};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For IVR models with explicit neutrals, creates expressions for the terminal current flows :crg_bus and :cig_bus of delta-connected generators

    source
    PowerModelsDistribution.constraint_mc_generator_current_wyeMethod
    function constraint_mc_generator_current_wye(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	connections::Vector{Int};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For IVR models with explicit neutrals, creates expressions for the terminal current flows :crg_bus and :cig_bus of wye-connected generators

    source
    PowerModelsDistribution.constraint_mc_generator_powerMethod
    constraint_mc_generator_power(pm::AbstractUnbalancedPowerModel, id::Int; nw::Int=nw_id_default, report::Bool=true, bounded::Bool=true)::Nothing

    Template function for generator power constraints

    DELTA

    When connected in delta, the load power gives the reference in the delta reference frame. This means

    \[sd_1 = v_ab.conj(i_ab) = (v_a-v_b).conj(i_ab)\]

    We can relate this to the per-phase power by

    \[sn_a = v_a.conj(i_a) + = v_a.conj(i_ab-i_ca) + = v_a.conj(conj(s_ab/v_ab) - conj(s_ca/v_ca)) + = v_a.(s_ab/(v_a-v_b) - s_ca/(v_c-v_a))\]

    So for delta, sn is constrained indirectly.

    source
    PowerModelsDistribution.constraint_mc_generator_power_deltaMethod
    function constraint_mc_generator_power_delta(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	pmin::Vector{<:Real},
    +	pmax::Vector{<:Real},
    +	qmin::Vector{<:Real},
    +	qmax::Vector{<:Real};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For ACR models with explicit neutrals, links the terminal power flows :pg_bus and :qg_bus to the power variables :pg and :qg for delta-connected generators

    source
    PowerModelsDistribution.constraint_mc_generator_power_deltaMethod
    function constraint_mc_generator_power_delta(
    +	pm::AbstractNLExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	pmin::Vector{<:Real},
    +	pmax::Vector{<:Real},
    +	qmin::Vector{<:Real},
    +	qmax::Vector{<:Real};
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, creates non-linear expressions for the generator power :pd and :qd of delta-connected generators as a function of voltage and current

    source
    PowerModelsDistribution.constraint_mc_generator_power_deltaMethod
    function constraint_mc_generator_power_delta(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	pmin::Vector{<:Real},
    +	pmax::Vector{<:Real},
    +	qmin::Vector{<:Real},
    +	qmax::Vector{<:Real};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, links the generator power variables :pd and :qd of delta-connected generators to the voltage and current

    source
    PowerModelsDistribution.constraint_mc_generator_power_deltaMethod
    constraint_mc_generator_power_delta(pm::FBSUBFPowerModel, nw::Int, id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)

    Adds constraints for delta-connected generators similar to delta-connected loads (zero-order approximation).

    \[\begin{align} +&\text{Initial line-neutral voltage: } V_0 = V_{r0} +j V_{i0}\\ +&\text{Three-phase delta transformation matrix: } M^\Delta = \begin{bmatrix}\;\;\;1 & -1 & \;\;0\\ \;\;\;0 & \;\;\;1 & -1\\ -1 & \;\;\;0 & \;\;\;1\end{bmatrix} \\ +&\text{Single-phase delta transformation matrix (triple nodes): } M^\Delta = \begin{bmatrix}\;1 & -1 \end{bmatrix} \\ +&\text{Initial line-line voltage: } V_0^\Delta = M^\Delta V_0 \\ +&\text{Line-line current: } (I^\Delta)^* = S^\Delta \oslash V_0^\Delta \\ +&\text{Line-neutral current: } I_{bus} = (M^\Delta)^T I^\Delta \\ +&\text{Bus generation power: } S_{bus} = V_0 \oslash I_{bus}^* +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_generator_power_deltaMethod
    constraint_mc_generator_power_delta(pm::FOTPUPowerModel, nw::Int, id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)

    Adds constraints for delta-connected generators similar to delta-connected loads (zero-order approximation).

    \[\begin{align} +&\text{Initial line-neutral voltage: } V_0 = V_{m0} \angle V_{a0}\\ +&\text{Three-phase delta transformation matrix: } M^\Delta = \begin{bmatrix}\;\;\;1 & -1 & \;\;0\\ \;\;\;0 & \;\;\;1 & -1\\ -1 & \;\;\;0 & \;\;\;1\end{bmatrix} \\ +&\text{Single-phase delta transformation matrix (triple nodes): } M^\Delta = \begin{bmatrix}\;1 & -1 \end{bmatrix} \\ +&\text{Initial line-line voltage: } V_0^\Delta = M^\Delta V_0 \\ +&\text{Line-line current: } (I^\Delta)^* = S^\Delta \oslash V_0^\Delta \\ +&\text{Line-neutral current: } I_{bus} = (M^\Delta)^T I^\Delta \\ +&\text{Line-neutral generation power: } S_{bus} = V_0 \oslash I_{bus}^* +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_generator_power_deltaMethod
    constraint_mc_generator_power_delta(pm::FOTRUPowerModel, nw::Int, id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)

    Adds constraints for delta-connected generators similar to delta-connected loads (zero-order approximation).

    \[\begin{align} +&\text{Initial line-neutral voltage: } V_0 = V_{r0} +j V_{i0}\\ +&\text{Three-phase delta transformation matrix: } M^\Delta = \begin{bmatrix}\;\;\;1 & -1 & \;\;0\\ \;\;\;0 & \;\;\;1 & -1\\ -1 & \;\;\;0 & \;\;\;1\end{bmatrix} \\ +&\text{Single-phase delta transformation matrix (triple nodes): } M^\Delta = \begin{bmatrix}\;1 & -1 \end{bmatrix} \\ +&\text{Initial line-line voltage: } V_0^\Delta = M^\Delta V_0 \\ +&\text{Line-line current: } (I^\Delta)^* = S^\Delta \oslash V_0^\Delta \\ +&\text{Line-neutral current: } I_{bus} = (M^\Delta)^T I^\Delta \\ +&\text{Line-neutral generation power: } S_{bus} = V_0 \oslash I_{bus}^* +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_generator_power_deltaMethod
    constraint_mc_generator_power_delta(pm::LPUBFDiagModel, nw::Int, gen_id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)

    Adds constraints for delta-connected generators similar to delta-connected loads (using auxilary variable X).

    \[\begin{align} +&\text{Three-phase delta transformation matrix: } T^\Delta = \begin{bmatrix}\;\;\;1 & -1 & \;\;0\\ \;\;\;0 & \;\;\;1 & -1\\ -1 & \;\;\;0 & \;\;\;1\end{bmatrix} \\ +&\text{Single-phase delta transformation matrix (triple nodes): } T^\Delta = \begin{bmatrix}\;1 & -1 \end{bmatrix} \\ +&\text{Line-neutral generation power: } S_{bus} = diag(T^\Delta X_g) \\ +&\text{Line-line generation power: } S^\Delta = diag(X_g T^\Delta) +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_generator_power_deltaMethod
    constraint_mc_generator_power_delta(pm::SOCUBFModels, nw::Int, gen_id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)

    Adds constraints for delta-connected generators similar to delta-connected loads (using auxilary variable X).

    \[\begin{align} +&\text{Three-phase delta transformation matrix: } T^\Delta = \begin{bmatrix}\;\;\;1 & -1 & \;\;0\\ \;\;\;0 & \;\;\;1 & -1\\ -1 & \;\;\;0 & \;\;\;1\end{bmatrix} \\ +&\text{Single-phase delta transformation matrix (triple nodes): } T^\Delta = \begin{bmatrix}\;1 & -1 \end{bmatrix} \\ +&\text{Line-neutral generation power: } S_{bus} = diag(T^\Delta X_g) \\ +&\text{Line-line generation power: } S^\Delta = diag(X_g T^\Delta) +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_generator_power_wyeMethod
    function constraint_mc_generator_power_wye(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	pmin::Vector{<:Real},
    +	pmax::Vector{<:Real},
    +	qmin::Vector{<:Real},
    +	qmax::Vector{<:Real};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For ACR models with explicit neutrals, links the terminal power flows :pg_bus and :qg_bus to the power variables :pg and :qg for wye-connected generators

    source
    PowerModelsDistribution.constraint_mc_generator_power_wyeMethod
    function constraint_mc_generator_power_wye(
    +	pm::AbstractNLExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	pmin::Vector{<:Real},
    +	pmax::Vector{<:Real},
    +	qmin::Vector{<:Real},
    +	qmax::Vector{<:Real};
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, creates non-linear expressions for the generator power :pd and :qd of wye-connected generators as a function of voltage and current

    source
    PowerModelsDistribution.constraint_mc_generator_power_wyeMethod
    function constraint_mc_generator_power_wye(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	pmin::Vector{<:Real},
    +	pmax::Vector{<:Real},
    +	qmin::Vector{<:Real},
    +	qmax::Vector{<:Real};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, links the generator power variables :pd and :qd of wye-connected generators to the voltage and current

    source
    PowerModelsDistribution.constraint_mc_load_currentMethod
    function constraint_mc_load_current(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	id::Int;
    +	nw::Int=nw_id_default,
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, create non-linear expressions for the terminal current flows :crd_bus and :cid_bus

    source
    PowerModelsDistribution.constraint_mc_load_currentMethod
    function constraint_mc_load_current(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	id::Int;
    +	nw::Int=nw_id_default,
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, create expressions for the terminal current flows :crd_bus and :cid_bus

    source
    PowerModelsDistribution.constraint_mc_load_current_deltaMethod
    function constraint_mc_load_current_delta(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	a::Vector{<:Real},
    +	alpha::Vector{<:Real},
    +	b::Vector{<:Real},
    +	beta::Vector{<:Real};
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, create non-linear expressions for the terminal current flows :crd_bus and :cid_bus of delta-connected loads

    source
    PowerModelsDistribution.constraint_mc_load_current_deltaMethod
    function constraint_mc_load_current_delta(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	connections::Vector{Int};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, create expressions for the terminal current flows :crd_bus and :cid_bus for delta-connected loads

    source
    PowerModelsDistribution.constraint_mc_load_current_deltaMethod
    constraint_mc_load_current_delta(pm::FOTPUPowerModel, nw::Int, load_id::Int, load_bus_id::Int, cp::Vector, cq::Vector)

    No loads require a current variable. Delta loads are zero-order approximations and wye loads are first-order approximations around the initial operating point.

    source
    PowerModelsDistribution.constraint_mc_load_current_wyeMethod
    function constraint_mc_load_current_wye(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	a::Vector{<:Real},
    +	alpha::Vector{<:Real},
    +	b::Vector{<:Real},
    +	beta::Vector{<:Real};
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, create non-linear expressions for the terminal current flows :crd_bus and :cid_bus of wye-connected loads

    source
    PowerModelsDistribution.constraint_mc_load_current_wyeMethod
    function constraint_mc_load_current_wye(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	connections::Vector{Int};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, create expressions for the terminal current flows :crd_bus and :cid_bus for wye-connected loads

    source
    PowerModelsDistribution.constraint_mc_load_powerMethod
    function constraint_mc_load_power(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	id::Int;
    +	nw::Int=nw_id_default,
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, the load power does not require any constraints.

    source
    PowerModelsDistribution.constraint_mc_load_powerMethod
    function constraint_mc_load_power(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	id::Int;
    +	nw::Int=nw_id_default,
    +	report::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, link the load power variables :pd and :qd to the voltage, and link together the power, voltage and current variables

    source
    PowerModelsDistribution.constraint_mc_load_powerMethod
    constraint_mc_load_power(pm::AbstractUnbalancedPowerModel, id::Int; nw::Int=nw_id_default, report::Bool=true)::Nothing

    Template function for load constraints.

    CONSTANT POWER

    Fixes the load power sd.

    \[sd = [sd_1, sd_2, sd_3]\]

    What is actually fixed, depends on whether the load is connected in delta or wye. When connected in wye, the load power equals the per-phase power sn drawn at the bus to which the load is connected.

    \[sd_1 = v_a.conj(i_a) = sn_a\]

    CONSTANT CURRENT

    Sets the active and reactive load power sd to be proportional to the the voltage magnitude.

    \[pd = cp.|vm| +qd = cq.|vm| +sd = cp.|vm| + j.cq.|vm|\]

    CONSTANT IMPEDANCE

    Sets the active and reactive power drawn by the load to be proportional to the square of the voltage magnitude.

    \[pd = cp.|vm|^2 +qd = cq.|vm|^2 +sd = cp.|vm|^2 + j.cq.|vm|^2\]

    DELTA

    When connected in delta, the load power gives the reference in the delta reference frame. This means

    \[sd_1 = v_ab.conj(i_ab) = (v_a-v_b).conj(i_ab)\]

    We can relate this to the per-phase power by

    \[sn_a = v_a.conj(i_a) + = v_a.conj(i_ab-i_ca) + = v_a.conj(conj(s_ab/v_ab) - conj(s_ca/v_ca)) + = v_a.(s_ab/(v_a-v_b) - s_ca/(v_c-v_a))\]

    So for delta, sn is constrained indirectly.

    source
    PowerModelsDistribution.constraint_mc_load_powerMethod
    constraint_mc_load_power(pm::FBSUBFPowerModel, load_id::Int; nw::Int=nw_id_default, report::Bool=true)

    Load model is linearized around initial operating point. Wye loads are first-order and delta loads are zero-order approximations.

    \[\begin{align} +&\text{Initial operating point: } v_{rd}^0 + j ⋅ v_{id}^0~\text{where}~{(v_m^0)}^2 = {(v_{rd}^0)}^2 + {(v_{id}^0)}^2\\ +&\text{Constant power: } P^d = P^{d0},~Q^d = Q^{d0} \\ +&\text{Constant impedance: } P^d = a ⋅ \left(2\cdot v_{rd} ⋅ v_{rd}^0+2 ⋅ v_{id}*v_{id}^0-{(v_{m}^0)}^2\right),\\ +& Q^d = b ⋅ \left(2\cdot v_{rd} ⋅ v_{rd}^0+2 ⋅ v_{id}*v_{id}^0-{(v_{m}^0)}^2\right), \\ +&\text{Constant current: } P^d = a ⋅ \left(v_{m}^0 + \frac{v_{rd} ⋅ v_{rd}^0+ v_{id}*v_{id}^0-{(v_{m}^0)}^2}{v_{m}^0} \right),\\ +& Q^d = b ⋅ \left(v_{m}^0 + \frac{v_{rd} ⋅ v_{rd}^0+ v_{id}*v_{id}^0-{(v_{m}^0)}^2}{v_{m}^0} \right). +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_load_powerMethod
    constraint_mc_load_power(pm::FOTPUPowerModel, load_id::Int; nw::Int=nw_id_default, report::Bool=true)

    Load model is linearized around initial operating point. Wye loads are first-order and delta loads are zero-order approximations.

    \[\begin{align} +&\text{Initial operating point: } v_{m0} \angle v_{a0}\\ +&\text{Constant power: } P^d = P^{d0},~Q^d = Q^{d0} \\ +&\text{Constant impedance: } P^d = a \cdot \left({v_{m0}}^2+2 \cdot v_{m0} \cdot (v_m-v_{m0})\right),\\ +& Q^d = b \cdot \left({v_{m0}}^2+2 \cdot v_{m0} \cdot (v_m-v_{m0})\right), \\ +&\text{Constant current: } P^d = a \cdot v_m,\\ +& Q^d = b \cdot v_m. +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_load_powerMethod
    constraint_mc_load_power(pm::LPUBFDiagModel, load_id::Int; nw::Int=nw_id_default, report::Bool=true)

    Delta/voltage-dependent load models for LPUBFDiagModel. Delta loads use the auxilary power variable (X). The constant current load model is derived by linearizing around the flat-start voltage solution.

    \[\begin{align} +&\text{Constant power:} \Rightarrow P_i^d = P_i^{d0},~Q_i^d = Q_i^{d0} ~\forall i \in L \\ +&\text{Constant impedance (Wye):} \Rightarrow P_i^d = a_i \cdot w_i,~Q_i^d = b_i \cdot w_i ~\forall i \in L \\ +&\text{Constant impedance (Delta):} \Rightarrow P_i^d = 3\cdot a_i \cdot w_i,~Q_i^d = 3\cdot b_i \cdot w_i ~\forall i \in L \\ +&\text{Constant current (Wye):} \Rightarrow P_i^d = \frac{a_i}{2}\cdot \left( 1+w_i \right),~Q_i^d = \frac{b_i}{2}\cdot \left( 1+w_i \right) \forall i \in L \\ +&\text{Constant current (Delta):} \Rightarrow P_i^d = \frac{\sqrt{3} \cdot a_i}{2}\cdot \left( 1+w_i \right),~Q_i^d = \frac{\sqrt{3} \cdot b_i}{2}\cdot \left( 1+w_i \right) \forall i \in L +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_load_power_deltaMethod
    function constraint_mc_load_power_delta(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	a::Vector{<:Real},
    +	alpha::Vector{<:Real},
    +	b::Vector{<:Real},
    +	beta::Vector{<:Real};
    +	report::Bool=true
    +)

    For ACR models with explicit neutrals, creates non-linear expressions for terminal power flows ':pdbus' and ':qdbus' of delta-connected loads

    source
    PowerModelsDistribution.constraint_mc_load_power_deltaMethod
    function constraint_mc_load_power_delta(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	model::LoadModel,
    +	a::Vector{<:Real},
    +	b::Vector{<:Real};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, link the load power variables :pd and :qd to the voltage, and link together the power, voltage and current variables for delta-connected loads

    source
    PowerModelsDistribution.constraint_mc_load_power_wyeMethod
    function constraint_mc_load_power_wye(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	a::Vector{<:Real},
    +	alpha::Vector{<:Real},
    +	b::Vector{<:Real},
    +	beta::Vector{<:Real};
    +	report::Bool=true
    +)

    For ACR models with explicit neutrals, creates non-linear expressions for terminal power flows ':pdbus' and ':qdbus' of wye-connected loads

    source
    PowerModelsDistribution.constraint_mc_load_power_wyeMethod
    function constraint_mc_load_power_wye(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	bus_id::Int,
    +	connections::Vector{Int},
    +	model::LoadModel,
    +	a::Vector{<:Real},
    +	b::Vector{<:Real};
    +	report::Bool=true,
    +	bounded::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, link the load power variables :pd and :qd to the voltage, and link together the power, voltage and current variables for wye-connected loads

    source
    PowerModelsDistribution.constraint_mc_model_voltage_magnitude_differenceMethod
    constraint_mc_model_voltage_magnitude_difference(pm::FBSUBFPowerModel, nw::Int, i::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, r::Matrix{<:Real}, x::Matrix{<:Real}, g_sh_fr::Matrix{<:Real}, b_sh_fr::Matrix{<:Real})

    Voltage drop over a branch linearized around initial operating point (forward sweep)

    \[\begin{align} +&\text{Initial operating points: } (v_{r0}^{fr} + j ⋅ v_{i0}^{fr}),~ (v_{r0}^{to} + j ⋅ v_{i0}^{to})\\ +&\text{Series active power flow: } p_s^{fr} = p^{fr} - g_{sh}^{fr} ⋅ {(v_{m0}^{fr})}^2,\\ +&\text{Series reactive power flow: } q_s^{fr} = q^{fr} + b_{sh}^{fr} ⋅ {(v_{m0}^{fr})}^2,\\ +&\text{Series real current flow: } cr_s^{fr} = \frac{(p_s^{fr} ⋅ v_{r0}^{fr} + q_s^{fr} ⋅ v_{i0}^{fr})}{{(v_{m0}^{fr})}^2},\\ +&\text{Series imaginary current flow: } ci_s^{fr} = \frac{(-q_s^{fr} ⋅ v_{r0}^{fr} + p_s^{fr} ⋅ v_{i0}^{fr})}{{(v_{m0}^{fr})}^2},\\ +&\text{Series real voltage drop: } v_{r}^{to} = v_{r}^{fr} - r ⋅ cr_s^{fr} + x ⋅ ci_s^{fr} ,\\ +&\text{Series imaginary voltage drop: } v_{i}^{to} = v_{i}^{fr} - x ⋅ cr_s^{fr} - r ⋅ ci_s^{fr}. +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_ohms_yt_fromMethod
    function constraint_mc_ohms_yt_from(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	G::Matrix{<:Real},
    +	B::Matrix{<:Real},
    +	G_fr::Matrix{<:Real},
    +	B_fr::Matrix{<:Real}
    +)

    For ACR models with explicit neutrals, creates Ohms constraints for ACR models with explicit neutrals.

    s_fr = v_fr.*conj(Y*(v_fr-v_to))
    +s_fr = (vr_fr+im*vi_fr).*(G-im*B)*([vr_fr-vr_to]-im*[vi_fr-vi_to])
    +s_fr = (vr_fr+im*vi_fr).*([G*vr_fr-G*vr_to-B*vi_fr+B*vi_to]-im*[G*vi_fr-G*vi_to+B*vr_fr-B*vr_to])
    source
    PowerModelsDistribution.constraint_mc_ohms_yt_fromMethod

    Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)

    p_fr ==     g[c,c] * vm_fr[c]^2 +
    +            sum( g[c,d]*vm_fr[c]*vm_fr[d]*cos(va_fr[c]-va_fr[d]) +
    +                 b[c,d]*vm_fr[c]*vm_fr[d]*sin(va_fr[c]-va_fr[d]) for d in conductor_ids(pm) if d != c) +
    +            sum(-g[c,d]*vm_fr[c]*vm_to[d]*cos(va_fr[c]-va_to[d]) +
    +                -b[c,d]*vm_fr[c]*vm_to[d]*sin(va_fr[c]-va_to[d]) for d in conductor_ids(pm))
    +            + g_fr[c,c] * vm_fr[c]^2 +
    +            sum( g_fr[c,d]*vm_fr[c]*vm_fr[d]*cos(va_fr[c]-va_fr[d]) +
    +                 b_fr[c,d]*vm_fr[c]*vm_fr[d]*sin(va_fr[c]-va_fr[d]) for d in conductor_ids(pm) if d != c)
    +            )
    +q_fr == -b[c,c] *vm_fr[c]^2 -
    +            sum( b[c,d]*vm_fr[c]*vm_fr[d]*cos(va_fr[c]-va_fr[d]) -
    +                 g[c,d]*vm_fr[c]*vm_fr[d]*sin(va_fr[c]-va_fr[d]) for d in conductor_ids(pm) if d != c) -
    +            sum(-b[c,d]*vm_fr[c]*vm_to[d]*cos(va_fr[c]-va_to[d]) +
    +                 g[c,d]*vm_fr[c]*vm_to[d]*sin(va_fr[c]-va_to[d]) for d in conductor_ids(pm))
    +            -b_fr[c,c] *vm_fr[c]^2 -
    +            sum( b_fr[c,d]*vm_fr[c]*vm_fr[d]*cos(va_fr[c]-va_fr[d]) -
    +                 g_fr[c,d]*vm_fr[c]*vm_fr[d]*sin(va_fr[c]-va_fr[d]) for d in conductor_ids(pm) if d != c)
    +            )
    source
    PowerModelsDistribution.constraint_mc_ohms_yt_fromMethod
    constraint_mc_ohms_yt_from(pm::FOTPUPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, G::Matrix{<:Real}, B::Matrix{<:Real}, G_fr::Matrix{<:Real}, B_fr::Matrix{<:Real})

    Ohm constraints similar to ACPUPowerModel. The nonlinear functions are approximated around initial operating points.

    source
    PowerModelsDistribution.constraint_mc_ohms_yt_fromMethod
    constraint_mc_ohms_yt_from(pm::FOTRUPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, G::Matrix{<:Real}, B::Matrix{<:Real}, G_fr::Matrix{<:Real}, B_fr::Matrix{<:Real})

    Creates Ohms constraints by linearizing (similar to power balance constraints) around initial operating point.

    source
    PowerModelsDistribution.constraint_mc_ohms_yt_toMethod
    function constraint_mc_ohms_yt_to(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	G::Matrix,
    +	B::Matrix,
    +	G_to::Matrix,
    +	B_to::Matrix
    +)

    For ACR models with explicit neutrals, creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form).

    p[t_idx] ==  (g+g_to)*v[t_bus]^2 + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[t_bus]-t[f_bus])) + (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))
    +q[t_idx] == -(b+b_to)*v[t_bus]^2 - (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[f_bus]-t[t_bus])) + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))
    source
    PowerModelsDistribution.constraint_mc_ohms_yt_toMethod

    Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)

    p[t_idx] ==  (g+g_to)*v[t_bus]^2 + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[t_bus]-t[f_bus])) + (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))
    +q[t_idx] == -(b+b_to)*v[t_bus]^2 - (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[f_bus]-t[t_bus])) + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))
    source
    PowerModelsDistribution.constraint_mc_ohms_yt_toMethod

    Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)

    p[t_idx] ==  (g+g_to)*v[t_bus]^2 + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[t_bus]-t[f_bus])) + (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))
    +q[t_idx] == -(b+b_to)*v[t_bus]^2 - (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[f_bus]-t[t_bus])) + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))
    source
    PowerModelsDistribution.constraint_mc_ohms_yt_toMethod
    constraint_mc_ohms_yt_to(pm::FOTPUPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, G::Matrix{<:Real}, B::Matrix{<:Real}, G_to::Matrix{<:Real}, B_to::Matrix{<:Real})

    Ohm constraints similar to ACPUPowerModel. The nonlinear functions are approximated around initial operating points.

    source
    PowerModelsDistribution.constraint_mc_ohms_yt_toMethod
    constraint_mc_ohms_yt_to(pm::FOTRUPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, G::Matrix, B::Matrix, G_to::Matrix, B_to::Matrix)

    Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)

    source
    PowerModelsDistribution.constraint_mc_power_balanceMethod
    constraint_mc_power_balance(pm::AbstractUnbalancedActivePowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    power balanace constraint with line shunts and transformers, active power only

    \[p_{br} + p_{tr} + p_{sw} == p_{g} - p_{s} - p_{d} - G\]

    source
    PowerModelsDistribution.constraint_mc_power_balanceMethod
    constraint_mc_power_balance(pm::FBSUBFPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance constraints similar to ACRUPowerModel with shunt current calculated using initial operating point.

    source
    PowerModelsDistribution.constraint_mc_power_balanceMethod
    constraint_mc_power_balance(pm::FOTPUPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance equations similar to ACPUPowerModel. The nonlinear functions are approximated around initial operating point.

    \[\begin{align} +&\text{Initial operating points: } v_{m0}^{t} \angle v_{a0}^t,~v_{m0}^u \angle v_{a0}^u\\ +& {v_m^t}^2 \Rightarrow {v_{m0}^t}^2+2 \cdot v_{m0}^t \cdot (v_m^t-v_{m0}^t)\\ +& v_m^t \cdot v_m^u \cdot \cos(v_a^t-v_a^u) \Rightarrow v_{m0}^t \cdot v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) + +\begin{bmatrix} +v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) \\ +v_{m0}^t \cdot \cos(v_{a0}^t-v_{a0}^u) \\ +-v_{m0}^t \cdot v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) \\ +v_{m0}^t \cdot v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) +\end{bmatrix}^\top +\begin{bmatrix} +v_m^t-v_{m0}^t \\ +v_m^u-v_{m0}^u \\ +v_a^t-v_{a0}^t \\ +v_a^u-v_{a0}^u +\end{bmatrix} \\ +& v_m^t \cdot v_m^u \cdot \sin(v_a^t-v_a^u) \Rightarrow v_{m0}^t \cdot v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) + +\begin{bmatrix} +v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) \\ +v_{m0}^t \cdot \sin(v_{a0}^t-v_{a0}^u) \\ +v_{m0}^t \cdot v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) \\ +-v_{m0}^t \cdot v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) +\end{bmatrix}^\top +\begin{bmatrix} +v_m^t-v_{m0}^t \\ +v_m^u-v_{m0}^u \\ +v_a^t-v_{a0}^t \\ +v_a^u-v_{a0}^u +\end{bmatrix} +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_power_balanceMethod
    constraint_mc_power_balance(pm::FOTRUPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance constraints similar to ACRUPowerModel with shunt current linearized around initial operating point.

    \[\begin{align} +&\text{Initial operating point: } (v_{r0} + j ⋅ v_{i0})\\ +& v_{r} ⋅ v_{i} = v_{r0} ⋅ v_{i0} + v_{r} ⋅ v_{i0} + v_{r0} ⋅ v_{i} - 2 ⋅ v_{r0} ⋅ v_{i0} +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_power_balanceMethod
    function constraint_mc_power_balance(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	i::Int,
    +	terminals::Vector{Int},
    +	grounded::Vector{Bool},
    +	bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},
    +	bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},
    +	bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},
    +	bus_gens::Vector{Tuple{Int,Vector{Int}}},
    +	bus_storage::Vector{Tuple{Int,Vector{Int}}},
    +	bus_loads::Vector{Tuple{Int,Vector{Int}}},
    +	bus_shunts::Vector{Tuple{Int,Vector{Int}}}
    +)

    Imposes power balance constraints at each ungrounded terminal of bus i for rectangular voltage models with explicit neutrals. sum(p + im*q) = 0

    source
    PowerModelsDistribution.constraint_mc_power_balance_capcMethod
    constraint_mc_power_balance_capc(pm::AbstractUnbalancedACPModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance constraints with capacitor control.

    \[\begin{align} + & Bs = z ⋅ bs, \\ + &\text{capacitor ON: } z = 1, \\ + &\text{capacitor OFF: } z = 0. +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_power_balance_capcMethod
    constraint_mc_power_balance_capc(pm::AbstractUnbalancedACRModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance constraints with capacitor control.

    \[\begin{align} + & Bt = z ⋅ bs, \\ + &\text{capacitor ON: } z = 1, \\ + &\text{capacitor OFF: } z = 0. +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_power_balance_capcMethod
    constraint_mc_power_balance_capc(pm::FBSUBFPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance constraints with capacitor control similar to ACRUPowerModel with shunt current calculated using initial operating point.

    source
    PowerModelsDistribution.constraint_mc_power_balance_capcMethod
    constraint_mc_power_balance_capc(pm::FOTPUPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance constraints with capacitor control with shunt current calculated using initial operating point.

    \[\begin{align} + & B_s = b_s ⋅ z,~~ cq_{sh} = B_s ⋅ v, \\ + & B_s \cdot v_m^t \cdot v_m^u \cdot \cos(v_a^t-v_a^u) \Rightarrow B_{s0} \cdot v_{m0}^t \cdot v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) + +\begin{bmatrix} +B_{s0} \cdot v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) \\ +B_{s0} \cdot v_{m0}^t \cdot \cos(v_{a0}^t-v_{a0}^u) \\ +-B_{s0} \cdot v_{m0}^t \cdot v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) \\ +B_{s0} \cdot v_{m0}^t \cdot v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) \\ +v_{m0}^t \cdot v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) +\end{bmatrix}^\top +\begin{bmatrix} +v_m^t-v_{m0}^t \\ +v_m^u-v_{m0}^u \\ +v_a^t-v_{a0}^t \\ +v_a^u-v_{a0}^u \\ +B_{s} -B_{s0} +\end{bmatrix} \\ +& B_s \cdot v_m^t \cdot v_m^u \cdot \sin(v_a^t-v_a^u) \Rightarrow B_{s0} \cdot v_{m0}^t \cdot v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) + +\begin{bmatrix} + B_{s0} \cdot v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) \\ + B_{s0} \cdot v_{m0}^t \cdot \sin(v_{a0}^t-v_{a0}^u) \\ + B_{s0} \cdot v_{m0}^t \cdot v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) \\ + -B_{s0} \cdot v_{m0}^t \cdot v_{m0}^u \cdot \cos(v_{a0}^t-v_{a0}^u) \\ + v_{m0}^t \cdot v_{m0}^u \cdot \sin(v_{a0}^t-v_{a0}^u) +\end{bmatrix}^\top +\begin{bmatrix} +v_m^t-v_{m0}^t \\ +v_m^u-v_{m0}^u \\ +v_a^t-v_{a0}^t \\ +v_a^u-v_{a0}^u \\ +B_{s} -B_{s0} +\end{bmatrix} + +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_power_balance_capcMethod
    constraint_mc_power_balance_capc(pm::FOTRUPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance constraints with capacitor control with shunt current calculated using initial operating point.

    \[\begin{align} + & B_t = b_s ⋅ z,~~ cq_{sh} = B_t ⋅ v, \\ + &\text{FOT approximation: } B_t ⋅ v_r ⋅ v_i = B_{t0} ⋅ v_{r0} ⋅ v_{i0} + B_{t} ⋅ v_{r0} ⋅ v_{i0} + B_{t0} ⋅ v_{r} ⋅ v_{i0} + B_{t0} ⋅ v_{r0} ⋅ v_{i} - 3 ⋅ B_{t0} ⋅ v_{r0} ⋅ v_{i0} +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_power_balance_capcMethod
    constraint_mc_power_balance_capc(pm::LPUBFDiagModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})

    Power balance constraints with capacitor control linearized using McCormick envelopes

    \[\begin{align} + & B_s = b_s ⋅ z,~~ cq_{sh} = B_s ⋅ w, \\ + &\text{Underestimator: } cq_{sh} ≥ B_s ⋅ w_\text{min},~~ cq_{sh} ≥ b_s ⋅ w + B_s ⋅ w_\text{max} - b_s ⋅ w_\text{max}\\ + &\text{Overestimator: } cq_{sh} ≤ B_s ⋅ w_\text{max},~~ cq_{sh} ≤ b_s ⋅ w + B_s ⋅ w_\text{min} - b_s ⋅ w_\text{min}\\ +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_power_lossesMethod
    constraint_mc_power_losses(pm::FBSUBFPowerModel, nw::Int, i::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, r::Matrix{<:Real}, x::Matrix{<:Real}, g_sh_fr::Matrix{<:Real}, g_sh_to::Matrix{<:Real}, b_sh_fr::Matrix{<:Real}, b_sh_to::Matrix{<:Real})

    Branch flow model power flow equation linearized around initial operating point (backward sweep)

    \[\begin{align} +&\text{Initial operating points: } (v_{r0}^{fr} + j ⋅ v_{i0}^{fr}),~ (v_{r0}^{to} + j ⋅ v_{i0}^{to})\\ +&\text{Voltage drop: } v_{drop} = (v_{r0}^{fr} + j ⋅ v_{i0}^{fr}) - (v_{r0}^{to} + j ⋅ v_{i0}^{to}),\\ +&\text{Line series admittance: } y = (r+j ⋅ x)^{-1},\\ +&\text{Power loss: } s_{loss} = v_{drop} ⋅ (y ⋅ v_{drop})^*,\\ +&\text{Active power flow: } p^{fr} + p^{to} = g_{sh}^{fr} ⋅ {(v_{m0}^{fr})}^2 + g_{sh}^{to} ⋅ {(v_{m0}^{to})}^2 + \Re(s_{loss}),\\ +&\text{Reactive power flow: } q^{fr} + q^{to} = -b_{sh}^{fr} ⋅ {(v_{m0}^{fr})}^2 - b_{sh}^{to} ⋅ {(v_{m0}^{to})}^2 + \Im(s_{loss}). +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_switch_ampacityMethod
    constraint_mc_switch_ampacity(pm::AbstractUnbalancedACPModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on switches

    mathp_{fr}^2 + q_{fr}^2 \leq vm_{fr}^2 i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_switch_ampacityMethod
    constraint_mc_switch_ampacity(pm::AbstractUnbalancedRectangularModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on switches

    mathp_{fr}^2 + q_{fr}^2 \leq (vr_{fr}^2 + vi_{fr}^2) i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_switch_ampacityMethod
    constraint_mc_switch_ampacity(pm::AbstractUnbalancedWModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing

    ACP current limit constraint on switches from-side

    mathp_{fr}^2 + q_{fr}^2 \leq w_{fr} i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_switch_ampacityMethod
    constraint_mc_switch_ampacity(pm::AbstractUnbalancedWModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})

    ACP current limit constraint on switches from-side

    mathp_{fr}^2 + q_{fr}^2 \leq w_{fr} i_{max}^2

    source
    PowerModelsDistribution.constraint_mc_switch_currentMethod
    function constraint_mc_switch_current(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int};
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, create expressions for the terminal current flows :crsw_bus and cisw_bus, and link the from-side to the to-side switch current

    source
    PowerModelsDistribution.constraint_mc_switch_currentMethod
    function constraint_mc_switch_current(
    +    pm::ExplicitNeutralModels,
    +    id::Int;
    +    nw::Int=nw_id_default,
    +    report::Bool=true
    +)

    For models with explicit neutrals, link the switch currents or create appropiate expressions for them.

    source
    PowerModelsDistribution.constraint_mc_switch_current_limitMethod
    function constraint_mc_switch_current_limit(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	rating::Vector{<:Real}
    +)

    For ACR models with explicit neutrals, imposes a bound on the switch current magnitude per conductor. Note that a bound on the from-side implies the same bound on the to-side current, so it suffices to apply this only explicitly at the from-side.

    source
    PowerModelsDistribution.constraint_mc_switch_current_limitMethod
    function constraint_mc_switch_current_limit(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	connections::Vector{Int},
    +	rating::Vector{<:Real}
    +)

    For IVR models with explicit neutrals, imposes a bound on the switch current magnitude per conductor. Note that a bound on the from-side implies the same bound on the to-side current, so it suffices to apply this only explicitly at the from-side.

    source
    PowerModelsDistribution.constraint_mc_switch_powerMethod
    function constraint_mc_switch_power(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	id::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int};
    +	report::Bool=true
    +)

    constraintmcswitchpower( pm::ReducedExplicitNeutralIVRModels, nw::Int, id::Int, fidx::Tuple{Int,Int,Int}, tidx::Tuple{Int,Int,Int}, fconnections::Vector{Int}, t_connections::Vector{Int}; report::Bool=true )

    For IVR models with explicit neutrals, create expressions for the terminal power flows :psw_bus and qsw_bus, and link the from-side to the to-side switch power

    source
    PowerModelsDistribution.constraint_mc_switch_powerMethod
    function constraint_mc_switch_power(
    +    pm::ExplicitNeutralModels,
    +    id::Int;
    +    nw::Int=nw_id_default,
    +    report::Bool=true
    +)

    For IVR models with explicit neutrals, link the switch power or create appropiate expressions for them

    source
    PowerModelsDistribution.constraint_mc_switch_thermal_limitMethod
    function constraint_mc_switch_thermal_limit(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	rating::Vector{<:Real}
    +)

    For ACR models with explicit neutrals, imposes a bound on the switch power magnitude per conductor. Note that a bound on the from-side implies the same bound on the to-side power when the switch is closed (equal voltages), and also when it is open since the power then equals zero on both ends.

    source
    PowerModelsDistribution.constraint_mc_switch_thermal_limitMethod
    function constraint_mc_switch_thermal_limit(
    +	pm::AbstractNLExplicitNeutralIVRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	rating::Vector{<:Real}
    +)

    This method is not yet implemented for AbstractLPUBFModel. If the limit is finite, a warning is thrown.

    source
    PowerModelsDistribution.constraint_mc_switch_thermal_limitMethod
    function constraint_mc_switch_thermal_limit(
    +	pm::AbstractNLExplicitNeutralIVRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	rating::Vector{<:Real}
    +)

    For IVR models with explicit neutrals, imposes a bound on the switch power magnitude per conductor. Note that a bound on the from-side implies the same bound on the to-side power when the switch is closed (equal voltages), and also when it is open since the power then equals zero on both ends.

    source
    PowerModelsDistribution.constraint_mc_switch_thermal_limitMethod
    function constraint_mc_switch_thermal_limit(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	rating::Vector{<:Real}
    +)

    For quadratic IVR models with explicit neutrals, throw an error because this cannot be represented quadratically without introducing explicit power variables.

    source
    PowerModelsDistribution.constraint_mc_switch_thermal_limitMethod
    constraint_mc_switch_thermal_limit(pm::AbstractUnbalancedActivePowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, rating::Vector{<:Real})::Nothing

    Active power only switch thermal limit constraint

    math-S_{max} \leq p_{fr} \leq S_{max}

    source
    PowerModelsDistribution.constraint_mc_thermal_limit_fromMethod
    function constraint_mc_thermal_limit_from(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	rate_a::Vector{<:Real}
    +)

    For ACR models with explicit neutrals, imposes a bound on the from-side line power magnitude.

    source
    PowerModelsDistribution.constraint_mc_thermal_limit_fromMethod
    function constraint_mc_thermal_limit_from(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	rate_a::Vector{<:Real}
    +)

    For IVR models with explicit neutrals, imposes a bound on the from-side line power magnitude.

    source
    PowerModelsDistribution.constraint_mc_thermal_limit_fromMethod
    function constraint_mc_thermal_limit_from(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	rate_a::Vector{<:Real}
    +)

    For quadratic IVR models with explicit neutrals, throw an error because this cannot be represented quadratically without introducing explicit power variables.

    source
    PowerModelsDistribution.constraint_mc_thermal_limit_toMethod
    function constraint_mc_thermal_limit_to(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	t_idx::Tuple{Int,Int,Int},
    +	t_connections::Vector{Int},
    +	rate_a::Vector{<:Real}
    +)

    For ACR models with explicit neutrals, imposes a bound on the from-side line power magnitude.

    source
    PowerModelsDistribution.constraint_mc_thermal_limit_toMethod
    function constraint_mc_thermal_limit_to(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	t_idx::Tuple{Int,Int,Int},
    +	t_connections::Vector{Int},
    +	rate_a::Vector{<:Real}
    +)

    For IVR models with explicit neutrals, imposes a bound on the to-side line power magnitude.

    source
    PowerModelsDistribution.constraint_mc_thermal_limit_toMethod
    function constraint_mc_thermal_limit_to(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	t_idx::Tuple{Int,Int,Int},
    +	t_connections::Vector{Int},
    +	rate_a::Vector{<:Real}
    +)

    For quadratic IVR models with explicit neutrals, throw an error because this cannot be represented quadratically without introducing explicit power variables.

    source
    PowerModelsDistribution.constraint_mc_theta_refMethod
    function constraint_mc_theta_ref(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	i::Int,
    +	va::Vector{<:Real},
    +	terminals::Vector{Int},
    +	grounded::Vector{Bool}
    +)

    Creates phase angle constraints at bus i

    source
    PowerModelsDistribution.constraint_mc_transformer_currentMethod
    function constraint_mc_transformer_current(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	i::Int;
    +	nw::Int=nw_id_default,
    +	fix_taps::Bool=true
    +)

    For IVR models with explicit neutrals, links the current variables of the from-side and to-side transformer windings, and creates expressions for the terminal current flows

    source
    PowerModelsDistribution.constraint_mc_transformer_current_dyMethod
    function constraint_mc_transformer_current_dy(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	trans_id::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	pol::Int,
    +	tm_set::Vector{<:Real},
    +	tm_fixed::Vector{Bool},
    +	tm_scale::Real
    +)

    For IVR models with explicit neutrals, links the current variables of the from-side and to-side transformer windings, and creates expressions for the terminal current flows for delta-wye connected transformers

    scale*cr_fr_P + cr_to_P == 0
    +scale*ci_fr_P + ci_to_P == 0
    source
    PowerModelsDistribution.constraint_mc_transformer_current_yyMethod
    function constraint_mc_transformer_current_yy(
    +	pm::AbstractExplicitNeutralIVRModel,
    +	nw::Int,
    +	trans_id::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	pol::Int,
    +	tm_set::Vector{<:Real},
    +	tm_fixed::Vector{Bool},
    +	tm_scale::Real
    +)

    For IVR models with explicit neutrals, links the current variables of the from-side and to-side transformer windings, and creates expressions for the terminal current flows for wye-wye connected transformers

    scale*cr_fr_P + cr_to_P == 0
    +scale*ci_fr_P + ci_to_P == 0
    source
    PowerModelsDistribution.constraint_mc_transformer_powerMethod
    constraint_mc_transformer_power(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default, fix_taps::Bool=true)::Nothing

    Template function for Transformer constraints in Power-voltage space, considering winding type, conductor order, polarity and tap settings.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_dyMethod
    function constraint_mc_transformer_power_dy(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	trans_id::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	pol::Int,
    +	tm_set::Vector{<:Real},
    +	tm_fixed::Vector{Bool},
    +	tm_scale::Real
    +)

    For ACR models with explicit neutrals, links the from-side and to-side power variables of delta-wye connected transformers. Expressions for the terminal power flow variables are also added.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_dyMethod
    constraint_mc_transformer_power_dy(pm::FBSUBFPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)

    Add all constraints required to model a two-winding, delta-wye connected transformer similar to ACRUPowerModel with power constraints using initial operating point voltage instead of actual voltage variables.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_dyMethod
    constraint_mc_transformer_power_dy(pm::FOTPUPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)

    Add all constraints required to model a two-winding, delta-wye connected transformer similar to ACPUPowerModel with voltage constraints linearized using first-order Taylor approximation and power constraints simplified using initial operating point voltage instead of actual voltage variables.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_dyMethod
    constraint_mc_transformer_power_dy(pm::FOTRUPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)

    Add all constraints required to model a two-winding, delta-wye connected transformer similar to ACRUPowerModel with power constraints using initial operating point voltage instead of actual voltage variables.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_dyMethod
    constraint_mc_transformer_power_dy(pm::SOCUBFModels, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)

    Constraints to model a two-winding, delta-wye connected transformer.

    \[\begin{align} + &{W}_{fr}^{ij}-{W}_{fr}^{ik}-{W}_{fr}^{lj}+{W}_{fr}^{lk} = t_m^2{W}_{to}^{ij} ~\forall i,j \in \{1,2,3\}~ \text{and}~ k,l \in \{2,3,1\} \\ + &{S}_{fr} = X_tT_t \\ + &{S}_{fr}^\Delta = T_tX_t \\ + & {s}_{fr}^\Delta + {s}_{to} = 0\\ + & {M}_{\Delta} = + \begin{bmatrix} + {W}_{fr} & {X}_{t} \\ + {X}_{t}^{\text{H}} & {L}_{\Delta} + \end{bmatrix} \succeq 0 +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_transformer_power_yyMethod
    function constraint_mc_transformer_power_yy(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	trans_id::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	pol::Int,
    +	tm_set::Vector{<:Real},
    +	tm_fixed::Vector{Bool},
    +	tm_scale::Real
    +)

    For ACR models with explicit neutrals, links the from-side and to-side power variables of wye-wye connected transformers. Expressions for the terminal power flow variables are also added.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_yyMethod
    constraint_mc_transformer_power_yy(pm::FBSUBFPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)

    Add all constraints required to model a two-winding, wye-wye connected transformer similar to ACRUPowerModel.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_yyMethod
    constraint_mc_transformer_power_yy(pm::FOTPUPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)

    Add all constraints required to model a two-winding, wye-wye connected transformer similar to ACPUPowerModel.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_yyMethod
    constraint_mc_transformer_power_yy(pm::FOTRUPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)

    Add all constraints required to model a two-winding, wye-wye connected transformer similar to ACRUPowerModel.

    source
    PowerModelsDistribution.constraint_mc_transformer_power_yyMethod
    constraint_mc_transformer_power_yy(pm::SOCUBFModels, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)

    Constraints to model a two-winding, wye-wye connected transformer.

    \[\begin{align} + & {W}_{fr} = {T}_{m}{T}_{m}^{H} {W}_{to} \\ + & {s}_{fr} + {s}_{to} = 0 +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_transformer_thermal_limitMethod
    function constraint_mc_transformer_thermal_limit(
    +	pm::AbstractExplicitNeutralACRModel,
    +	nw::Int,
    +	id::Int,
    +	f_idx::Tuple,
    +	t_idx::Tuple,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_connections::Vector,
    +	t_connections::Vector,
    +	config::ConnConfig,
    +	sm_ub::Real;
    +	report::Bool=true
    +)

    For ACR models with explicit neutrals, imposes a bound on the magnitude of the total apparent power at each winding of the transformer.

    sum(pt_fr)^2 + sum(qt_fr)^2 <= sm_ub^2
    +sum(pt_to)^2 + sum(qt_to)^2 <= sm_ub^2
    source
    PowerModelsDistribution.constraint_mc_transformer_thermal_limitMethod
    function constraint_mc_transformer_thermal_limit(
    +	pm::AbstractNLExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	f_idx::Tuple,
    +	t_idx::Tuple,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_connections::Vector,
    +	t_connections::Vector,
    +	config::ConnConfig,
    +	sm_ub::Real;
    +	report::Bool=true
    +)

    For non-linear IVR models with explicit neutrals, imposes a bound on the magnitude of the total apparent power at both windings. Expressions are created for the transformer power variables.

    sum(pt_fr)^2 + sum(qt_fr)^2 <= sm_ub^2
    +sum(pt_to)^2 + sum(qt_to)^2 <= sm_ub^2
    source
    PowerModelsDistribution.constraint_mc_transformer_thermal_limitMethod
    function constraint_mc_transformer_thermal_limit(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel,
    +	nw::Int,
    +	id::Int,
    +	f_idx::Tuple,
    +	t_idx::Tuple,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_connections::Vector,
    +	t_connections::Vector,
    +	config::ConnConfig,
    +	sm_ub::Real;
    +	report::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, imposes a bound on the magnitude of the total apparent power at both windings.

    sum(pt_fr)^2 + sum(qt_fr)^2 <= sm_ub^2
    +sum(pt_to)^2 + sum(qt_to)^2 <= sm_ub^2
    source
    PowerModelsDistribution.constraint_mc_transformer_voltage_dyMethod
    function constraint_mc_transformer_voltage_dy(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	trans_id::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	pol::Int,
    +	tm_set::Vector{<:Real},
    +	tm_fixed::Vector{Bool},
    +	tm_scale::Real
    +)

    For rectangular voltage models with explicit neutrals, links the voltage of the from-side and to-side transformer windings for delta-wye connected transformers

    Md*vr_fr_P == scale * (vr_to_P - vr_to_n)
    +Md*vi_fr_P == scale * (vi_to_P - vi_to_n)
    source
    PowerModelsDistribution.constraint_mc_transformer_voltage_yyMethod
    function constraint_mc_transformer_voltage_yy(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	trans_id::Int,
    +	f_bus::Int,
    +	t_bus::Int,
    +	f_idx::Tuple{Int,Int,Int},
    +	t_idx::Tuple{Int,Int,Int},
    +	f_connections::Vector{Int},
    +	t_connections::Vector{Int},
    +	pol::Int,
    +	tm_set::Vector{<:Real},
    +	tm_fixed::Vector{Bool},
    +	tm_scale::Real
    +)

    For rectangular voltage models with explicit neutrals, links the voltage of the from-side and to-side transformer windings for wye-wye connected transformers

    (vr_fr_P-vr_fr_n) == scale * (vr_to_P.-vr_to_n)
    +(vi_fr_P-vi_fr_n) == scale * (vi_to_P.-vi_to_n)
    source
    PowerModelsDistribution.constraint_mc_voltage_absoluteMethod
    function constraint_mc_voltage_absolute(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	i::Int,
    +	terminals::Vector{Int},
    +	grounded::Vector{Bool},
    +	vmin::Vector{<:Real},
    +	vmax::Vector{<:Real};
    +	report::Bool=true
    +)

    Imposes absolute voltage magnitude bounds for models with explicit neutrals

    source
    PowerModelsDistribution.constraint_mc_voltage_absoluteMethod
    function constraint_mc_voltage_absolute(
    +    pm::RectangularVoltageExplicitNeutralModels,
    +    id::Int;
    +    nw::Int=nw_id_default,
    +    bounded::Bool=true,
    +    report::Bool=true,
    +)

    Imposes absolute voltage magnitude bounds for models with explicit neutrals

    source
    PowerModelsDistribution.constraint_mc_voltage_angle_differenceMethod
    constraint_mc_voltage_angle_difference(pm::FBSUBFPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, angmin::Vector{<:Real}, angmax::Vector{<:Real})

    Nothing to do, this model ignores angle difference constraints"

    source
    PowerModelsDistribution.constraint_mc_voltage_angle_differenceMethod
    constraint_mc_voltage_angle_difference(pm::FOTRUPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, angmin::Vector{<:Real}, angmax::Vector{<:Real})

    Nothing to do, this model ignores angle difference constraints"

    source
    PowerModelsDistribution.constraint_mc_voltage_fixedMethod
    function constraint_mc_voltage_fixed(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	i::Int,
    +	vm::Vector{<:Real},
    +	va::Vector{<:Real},
    +	terminals::Vector{Int},
    +	grounded::Vector{Bool}
    +)

    Fixes the voltage variables at bus i to vm.*exp.(im*va)

    source
    PowerModelsDistribution.constraint_mc_voltage_magnitude_boundsMethod
    constraint_mc_voltage_magnitude_bounds(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing

    Template function for voltage magnitude bounds constraints.

    This constraint captures problem agnostic constraints that define limits for voltage magnitudes (where variable bounds cannot be used). Notable examples include IVRUPowerModel and ACRUPowerModel.

    source
    PowerModelsDistribution.constraint_mc_voltage_magnitude_boundsMethod
    constraint_mc_voltage_magnitude_bounds(pm::FBSUBFPowerModel, nw::Int, i::Int, vmin::Vector{<:Real}, vmax::Vector{<:Real})

    Upper voltage magnitude limits are linearized using outer approximation. Lower voltage magnitude limits are linearized around initial operating point.

    \[\begin{align} +&\text{Initial operating point: } ⇒ v_{r}^0 + j ⋅ v_{i}^0~\text{where}~{(v_m^0)}^2 = {(v_{r}^0)}^2 + {(v_{i}^0)}^2\\ +&\text{Lower limits: } 2 ⋅ v_{r} ⋅ v_{r}^0 + 2 ⋅ v_{i} ⋅ v_{i}^0 - {(v_{m}^0)}^2 ≥ v_{min}^2,\\ +&\text{Upper limits: } -v_{max} ≤ v_{r} ≤ v_{max},\\ +& -v_{max} ≤ v_{i} ≤ v_{max},\\ +&-\sqrt{2} ⋅ v_{max} ≤ v_{r} + v_{i} ≤ \sqrt{2} ⋅ v_{max},\\ +& -\sqrt{2} ⋅ v_{max} ≤ v_{r} - v_{i} ≤ \sqrt{2} ⋅ v_{max}. +\end{align}\]

    source
    PowerModelsDistribution.constraint_mc_voltage_magnitude_fixedMethod
    function constraint_mc_voltage_magnitude_fixed(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	i::Int,
    +	vm::Vector{<:Real},
    +	va::Vector{<:Real},
    +	terminals::Vector{Int},
    +	grounded::Vector{Bool}
    +)

    Fixes the voltage variables at bus i to vm.*exp.(im*va)

    source
    PowerModelsDistribution.constraint_mc_voltage_pairwiseMethod
    function constraint_mc_voltage_pairwise(
    +	pm::RectangularVoltageExplicitNeutralModels,
    +	nw::Int,
    +	i::Int,
    +	terminals::Vector{Int},
    +	grounded::Vector{Bool},
    +	vm_pair_lb::Vector,
    +	vm_pair_ub::Vector;
    +	report::Bool=true
    +)

    Imposes pairwise voltage magnitude bounds, i.e. magnitude bounds on the voltage between to terminals, for models with explicit neutrals

    source
    PowerModelsDistribution.constraint_mc_voltage_pairwiseMethod
    function constraint_mc_voltage_pairwise(
    +    pm::RectangularVoltageExplicitNeutralModels,
    +    id::Int;
    +    nw::Int=nw_id_default,
    +    bounded::Bool=true,
    +    report::Bool=true,
    +)

    Imposes pairwise voltage magnitude bounds, i.e. magnitude bounds on the voltage between to terminals, for models with explicit neutrals

    source
    PowerModelsDistribution.constraint_pqwMethod

    Creates the constraints modelling the (relaxed) voltage-dependency of the power consumed in each phase, s=p+jq. This is completely symmetrical for p and q, with appropriate substitutions of the variables and parameters: p->q, a->b, alpha->beta, pmin->qmin, pmax->qmax

    source
    PowerModelsDistribution.constraint_switch_thermal_limitMethod
    constraint_switch_thermal_limit(pm::AbstractUnbalancedPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, rating::Vector{<:Real})::Nothing

    Generic thermal limit constraint for switches (from-side)

    mathp_{fr}^2 + q_{fr}^2 \leq S_{max}^2

    source

    Relaxation Helpers

    PowerModelsDistribution.cut_complex_product_and_angle_differenceMethod
    cut_complex_product_and_angle_difference(m, wf, wt, wr, wi, angmin, angmax)

    A valid inequality for the product of two complex variables with magnitude and angle difference bounds. In the literature this constraints are called the Lifted Nonlinear Cuts (LNCs). @misc{1512.04644, Author = {Carleton Coffrin and Hassan Hijazi and Pascal Van Hentenryck}, Title = {Strengthening the SDP Relaxation of AC Power Flows with Convex Envelopes, Bound Tightening, and Lifted Nonlinear Cuts}, Year = {2015}, Eprint = {arXiv:1512.04644}, }

    source
    PowerModelsDistribution.relaxation_psd_to_socMethod
    relaxation_psd_to_soc(m::JuMP.Model, mxreal, mximag; complex::Bool=true)

    See section 4.3 for complex to real PSD constraint transformation: @article{Fazel2001, author = {Fazel, M. and Hindi, H. and Boyd, S.P.}, title = {{A rank minimization heuristic with application to minimum order system approximation}}, doi = {10.1109/ACC.2001.945730}, journal = {Proc. American Control Conf.}, number = {2}, pages = {4734–4739}, url = {http://ieeexplore.ieee.org/lpdocs/epic03/wrapper.htm?arnumber=945730}, volume = {6}, year = {2001} }

    source
    PowerModelsDistribution.relaxation_psd_to_soc_complexMethod
    relaxation_psd_to_soc_complex(m, mxreal, mximag)

    SDP to SOC relaxation of type 2, applied to complex-value matrix, as described in:

    @article{Kim2003,
    +author = {Kim, S and Kojima, M and Yamashita, M},
    +title = {{Second order cone programming relaxation of a positive semidefinite constraint}},
    +doi = {10.1080/1055678031000148696},
    +journal = {Optimization Methods and Software},
    +number = {5},
    +pages = {535--541},
    +volume = {18},
    +year = {2003}
    +}
    source
    PowerModelsDistribution.relaxation_psd_to_soc_complex_conicMethod
    relaxation_psd_to_soc_complex_conic(m, mxreal, mximag)

    SDP to SOC relaxation of type 2, applied to complex-value matrix, as described in:

    @article{Kim2003,
    +author = {Kim, S and Kojima, M and Yamashita, M},
    +title = {{Second order cone programming relaxation of a positive semidefinite constraint}},
    +doi = {10.1080/1055678031000148696},
    +journal = {Optimization Methods and Software},
    +number = {5},
    +pages = {535--541},
    +volume = {18},
    +year = {2003}
    +}
    source
    PowerModelsDistribution.relaxation_psd_to_soc_conicMethod
    relaxation_psd_to_soc_conic(m, mxreal, mximag; complex=true)

    See section 4.3 for complex to real PSD constraint transformation: @article{Fazel2001, author = {Fazel, M. and Hindi, H. and Boyd, S.P.}, title = {{A rank minimization heuristic with application to minimum order system approximation}}, doi = {10.1109/ACC.2001.945730}, journal = {Proc. American Control Conf.}, number = {2}, pages = {4734–4739}, url = {http://ieeexplore.ieee.org/lpdocs/epic03/wrapper.htm?arnumber=945730}, volume = {6}, year = {2001} }

    source
    PowerModelsDistribution.relaxation_psd_to_soc_realMethod
    relaxation_psd_to_soc_real(m, mx)

    SDP to SOC relaxation of type 2, applied to real-value matrix, as described in:

    @article{Kim2003,
    +author = {Kim, S and Kojima, M and Yamashita, M},
    +title = {{Second order cone programming relaxation of a positive semidefinite constraint}},
    +doi = {10.1080/1055678031000148696},
    +journal = {Optimization Methods and Software},
    +number = {5},
    +pages = {535--541},
    +volume = {18},
    +year = {2003}
    +}
    source
    PowerModelsDistribution.relaxation_psd_to_soc_real_conicMethod
    relaxation_psd_to_soc_real_conic(m, mx)

    SDP to SOC relaxation of type 2, applied to real-value matrix, as described in:

    @article{Kim2003,
    +author = {Kim, S and Kojima, M and Yamashita, M},
    +title = {{Second order cone programming relaxation of a positive semidefinite constraint}},
    +doi = {10.1080/1055678031000148696},
    +journal = {Optimization Methods and Software},
    +number = {5},
    +pages = {535--541},
    +volume = {18},
    +year = {2003}
    +}
    source

    Miscellaneous Helpers

    diff --git a/v0.15.1/reference/data_models.html b/v0.15.1/reference/data_models.html new file mode 100644 index 000000000..0a32b2af1 --- /dev/null +++ b/v0.15.1/reference/data_models.html @@ -0,0 +1,257 @@ + +Data Models · PowerModelsDistribution

    Data Models

    Parsers

    PowerModelsDistribution.parse_fileFunction
    parse_file(
    +    io::IO,
    +    filetype::Union{AbstractString,Missing}=missing;
    +    data_model::DataModel=ENGINEERING,
    +    import_all::Bool=false,
    +    bank_transformers::Bool=true,
    +    transformations::Vector{<:Any}=[],
    +    dss2eng_extensions::Vector{<:Function}=Function[],
    +    eng2math_extensions::Vector{<:Function}=Function[],
    +    eng2math_passthrough::Dict{String,Vector{String}}=Dict{String,Vector{String}}(),
    +    make_pu_extensions::Vector{<:Function}=Function[],
    +    make_pu::Bool=true,
    +    multinetwork::Bool=false,
    +    global_keys::Set{String}=Set{String}(),
    +    kron_reduce::Bool=true,
    +    phase_project::Bool=false,
    +    time_series::String="daily"
    +)::Dict{String,Any}

    Parses the IOStream of a file into a PowerModelsDistribution data structure

    If filetype is missing, parse_file will attempt to detect the filetype, but this may fail, and it is advised to pass the filetype if it is known.

    If data_model is MATHEMATICAL, the data model type will be automatically transformed via transform_data_model.

    For explanation of import_all, bank_transformers, and time_series, see parse_opendss

    For explanation of dss2eng_extensions, see parse_opendss

    For explanation of kron_reduce, see apply_kron_reduction!

    For explanation of phase_project, see apply_phase_projection!

    For explanation of multinetwork and global_keys, see make_multinetwork and transform_data_model

    For explanation of eng2math_extensions and eng2math_passthrough, see transform_data_model

    For explanation of make_pu and make_pu_extensions, see make_per_unit!.

    source
    parse_file(file::String; kwargs...)::Dict{String,Any}

    Loads file into IOStream and passes it onto parse_file

    source
    PowerModelsDistribution.parse_opendssFunction
    parse_opendss(
    +    io::IO;
    +    import_all::Bool=false,
    +    bank_transformers::Bool=true,
    +    time_series::String="daily",
    +    dss2eng_extensions::Vector{<:Function}=Function[],
    +)::Dict{String,Any}

    Parses an IO, into raw dss dictionary via parse_dss, into the ENGINEERING DataModel

    See parse_opendss

    source
    parse_opendss(
    +    data_dss::OpenDssDataModel;
    +    import_all::Bool=false,
    +    bank_transformers::Bool=true,
    +    time_series::String="daily",
    +    dss2eng_extensions::Vector{<:Function}=Function[]
    +)::Dict{String,Any}

    Parses a raw dss data structure (dictionary), resulting from the parsing of a DSS file, into the ENGINEERING DataModel

    If import_all is true, all raw dss properties will be included in the final dictionary under "dss".

    If bank_transformers is true (default), transformers that are indicated to be part of a bank in dss will be combined into a single multiphase transformer.

    time_series defines which property the time series will be taken from, "daily" or "yearly". More complex parsing of time series data should be performed with dss2eng_extensions.

    dss2eng_extensions

    If a user wishes to parse additional components that are not yet natively supported by PowerModelsDistribution, dss2eng_extensions can be utilized. Custom user functions provided under dss2eng_extensions will be excuted after all built-in dss2eng transformations have been performed and transformers have been banked together (if bank_transformers==true). dss2eng_extension functions should have the following function signature:

    dss2eng_func!(data_eng, data_dss)

    where data_eng is a non-multinetwork ENGINEERING data model (i.e., time series data has not yet been expanded into a multinetwork structure), and data_dss is the raw dss data parsed by parse_dss.

    source
    PowerModelsDistribution.parse_jsonFunction
    parse_json(file::String)

    parses json files that were dumped via JSON.print (or PMD.print_file)

    source
    parse_json(io::IO)

    parses json files that were dumped via JSON.print (or PMD.print_file)

    source
    PowerModelsDistribution.print_fileFunction
    print_file(path::String, data::Dict{String,<:Any}; indent::Int=2)

    prints a PowerModelsDistribution data structure into a JSON file

    source
    print_file(io::IO, data::Dict{String,<:Any}; indent::Int=2)

    prints a PowerModelsDistribution data structure into a JSON file

    source

    print_file variant for InfrastructureModel that converts to Dict first

    source

    Constructors

    PowerModelsDistribution.add_object!Method
    add_object!(data_eng::Dict{String,<:Any}, obj_type::String, obj_id::String, object::Dict{String,<:Any})

    Generic add function to add components to an engineering data model

    source
    PowerModelsDistribution.create_al2w_transformerMethod
    create_al2w_transformer(
    +    f_bus::String,
    +    t_bus::String,
    +    f_connections::Vector{Int},
    +    t_connections::Vector{Int};
    +    configuration::ConnConfig=WYE,
    +    tm_nom::Real=1.0,
    +    tm_lb::Union{Vector{<:Real},Missing}=missing,
    +    tm_ub::Union{Vector{<:Real},Missing}=missing,
    +    tm_set::Union{Vector{<:Real},Missing}=missing,
    +    tm_fix::Union{Vector{Bool},Missing}=missing,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    creates a aysmmetric lossless 2-winding transformer object with some defaults

    source
    PowerModelsDistribution.create_busMethod
    create_bus(;
    +    status::Status=ENABLED,
    +    terminals::Vector{Int}=Int[],
    +    grounded::Vector{Int}=Int[],
    +    rg::Vector{<:Real}=Float64[],
    +    xg::Vector{<:Real}=Float64[],
    +    kwargs...
    +)::Dict{String,Any}

    creates a bus object with some defaults

    source
    PowerModelsDistribution.create_generatorMethod
    create_generator(
    +    bus::String,
    +    connections::Vector{Int};
    +    configuration::ConnConfig=WYE,
    +    pg::Union{Vector{<:Real},Missing}=missing,
    +    qg::Union{Vector{<:Real},Missing}=missing,
    +    vg::Union{Vector{<:Real},Missing}=missing,
    +    pg_lb::Union{Vector{<:Real},Missing}=missing,
    +    pg_ub::Union{Vector{<:Real},Missing}=missing,
    +    qg_lb::Union{Vector{<:Real},Missing}=missing,
    +    qg_ub::Union{Vector{<:Real},Missing}=missing,
    +    control_mode::ControlMode=FREQUENCYDROOP,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    creates a generator object with some defaults

    source
    PowerModelsDistribution.create_lineMethod
    create_line(
    +    f_bus::String,
    +    t_bus::String,
    +    f_connections::Vector{Int},
    +    t_connections::Vector{Int};
    +    linecode::Union{String,Missing}=missing,
    +    rs::Union{Matrix{<:Real},Missing}=missing,
    +    xs::Union{Matrix{<:Real},Missing}=missing,
    +    g_fr::Union{Matrix{<:Real},Missing}=missing,
    +    b_fr::Union{Matrix{<:Real},Missing}=missing,
    +    g_to::Union{Matrix{<:Real},Missing}=missing,
    +    b_to::Union{Matrix{<:Real},Missing}=missing,
    +    length::Real=1.0,
    +    cm_ub::Union{Vector{<:Real},Missing}=missing,
    +    sm_ub::Union{Vector{<:Real},Missing}=missing,
    +    vad_lb::Union{Vector{<:Real},Missing}=missing,
    +    vad_ub::Union{Vector{<:Real},Missing}=missing,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    Create a line with some default values

    source
    PowerModelsDistribution.create_linecodeMethod
    create_linecode(
    +    rs::Matrix{<:Real},
    +    xs::Matrix{<:Real};
    +    g_fr::Union{Matrix{<:Real},Missing}=missing,
    +    b_fr::Union{Matrix{<:Real},Missing}=missing,
    +    g_to::Union{Matrix{<:Real},Missing}=missing,
    +    b_to::Union{Matrix{<:Real},Missing}=missing,
    +    cm_ub::Union{Vector{<:Real},Missing}=missing,
    +    kwargs...
    +)::Dict{String,Any}

    creates a linecode with some defaults

    source
    PowerModelsDistribution.create_loadMethod
    create_load(
    +    bus::String,
    +    connections::Vector{Int};
    +    configuration::ConnConfig=WYE,
    +    model::LoadModel=POWER,
    +    pd_nom::Union{Vector{<:Real},Missing}=missing,
    +    qd_nom::Union{Vector{<:Real},Missing}=missing,
    +    vm_nom::Real=1.0,
    +    dispatchable::Dispatchable=NO,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    creates a load object with some defaults

    source
    PowerModelsDistribution.create_shuntMethod
    create_shunt(
    +    bus::String,
    +    connections::Vector{Int};
    +    gs::Union{Matrix{<:Real},Missing}=missing,
    +    bs::Union{Matrix{<:Real},Missing}=missing,
    +    model::ShuntModel=GENERIC,
    +    dispatchable::Dispatchable=NO,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    creates a generic shunt with some defaults

    source
    PowerModelsDistribution.create_solarMethod
    create_solar(
    +    bus::String,
    +    connections::Vector{Int};
    +    configuration::ConnConfig=WYE,
    +    pg_lb::Union{Vector{<:Real},Missing}=missing,
    +    pg_ub::Union{Vector{<:Real},Missing}=missing,
    +    qg_lb::Union{Vector{<:Real},Missing}=missing,
    +    qg_ub::Union{Vector{<:Real},Missing}=missing,
    +    pg::Union{Vector{<:Real},Missing}=missing,
    +    qg::Union{Vector{<:Real},Missing}=missing,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    creates a solar generator with some defaults

    source
    PowerModelsDistribution.create_storageMethod
    create_storage(
    +    configuration::ConnConfig=WYE,
    +    energy::Real=0.0,
    +    energy_ub::Real=0.0,
    +    charge_ub::Real=0.0,
    +    discharge_ub::Real=0.0,
    +    sm_ub::Union{Real,Missing}=missing,
    +    cm_ub::Union{Real,Missing}=missing,
    +    charge_efficiency::Real=1.0,
    +    discharge_efficiency::Real=1.0,
    +    qs_lb::Union{Real,Missing}=missing,
    +    qs_ub::Union{Real,Missing}=missing,
    +    rs::Real=0.0,
    +    xs::Real=0.0,
    +    pex::Real=0.0,
    +    qex::Real=0.0,
    +    ps::Union{Real,Vector{<:Real},Missing}=missing,
    +    qs::Union{Real,Vector{<:Real},Missing}=missing,
    +    status::Status=ENABLED,
    +    kwargs...
    +    )::Dict{String,Any}

    creates energy storage object with some defaults

    source
    PowerModelsDistribution.create_switchMethod
    create_switch(
    +    f_bus::String,
    +    t_bus::String,
    +    f_connections::Vector{Int},
    +    t_connections::Vector{Int};
    +    cm_ub::Union{Vector{<:Real},Missing}=missing,
    +    sm_ub::Union{Vector{<:Real},Missing}=missing,
    +    linecode::Union{String,Missing}=missing,
    +    rs::Union{Matrix{<:Real},Missing}=missing,
    +    xs::Union{Matrix{<:Real},Missing}=missing,
    +    dispatchable::Dispatchable=NO,
    +    state::SwitchState=CLOSED,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    creates a switch object with some defaults

    source
    PowerModelsDistribution.create_transformerMethod
    create_transformer(
    +    buses::Vector{String},
    +    connections::Vector{Vector{Int}};
    +    configurations::Union{Vector{ConnConfig},Missing}=missing,
    +    xfmrcode::Union{String,Missing}=missing,
    +    xsc::Union{Vector{<:Real},Missing}=missing,
    +    rw::Union{Vector{<:Real},Missing}=missing,
    +    imag::Real=0.0,
    +    noloadloss::Real=0.0,
    +    tm_nom::Union{Vector{<:Real},Missing}=missing,
    +    tm_lb::Union{Vector{Vector{<:Real}},Missing}=missing,
    +    tm_ub::Union{Vector{Vector{<:Real}},Missing}=missing,
    +    tm_set::Union{Vector{Vector{<:Real}},Missing}=missing,
    +    tm_fix::Union{Vector{Vector{Bool}},Missing}=missing,
    +    polarity::Union{Vector{Int},Missing}=missing,
    +    vm_nom::Union{Vector{<:Real},Missing}=missing,
    +    sm_nom::Union{Vector{<:Real},Missing}=missing,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    creates a n-winding transformer object with some defaults

    source
    PowerModelsDistribution.create_voltage_sourceMethod
    create_voltage_source(
    +    bus::String,
    +    connections::Vector{Int};
    +    configuration::ConnConfig=WYE,
    +    vm::Union{Vector{<:Real},Missing}=missing,
    +    va::Union{Vector{<:Real},Missing}=missing,
    +    vm_lb::Union{Vector{<:Real},Missing}=missing,
    +    vm_ub::Union{Vector{<:Real},Missing}=missing,
    +    rs::Union{Vector{<:Real},Missing}=missing,
    +    xs::Union{Vector{<:Real},Missing}=missing,
    +    status::Status=ENABLED,
    +    kwargs...
    +)::Dict{String,Any}

    creates a voltage source with some defaults

    source
    PowerModelsDistribution.create_xfmrcodeMethod
    create_xfmrcode(;
    +    configurations::Union{Vector{ConnConfig},Missing}=missing,
    +    xsc::Union{Vector{<:Real},Missing}=missing,
    +    rw::Union{Vector{<:Real},Missing}=missing,
    +    tm_nom::Union{Vector{<:Real},Missing}=missing,
    +    tm_lb::Union{Vector{Vector{<:Real}},Missing}=missing,
    +    tm_ub::Union{Vector{Vector{<:Real}},Missing}=missing,
    +    tm_set::Union{Vector{Vector{<:Real}},Missing}=missing,
    +    tm_fix::Union{Vector{Vector{<:Real}},Missing}=missing,
    +    kwargs...
    +)::Dict{String,Any}

    creates transformer code with some defaults

    source

    Model Transformations

    PowerModelsDistribution.transform_data_modelFunction

    default transform_data_model ErrorException for unsupported combinations

    source
    source
    transform_data_model(
    +    data::Dict{String,<:Any};
    +    kron_reduce::Bool=true,
    +    multinetwork::Bool=false,
    +    global_keys::Set{String}=Set{String}(),
    +    eng2math_passthrough::Dict{String,<:Vector{<:String}}=Dict{String,Vector{String}}(),
    +    eng2math_extensions::Vector{<:Function}=Function[],
    +    make_pu::Bool=true,
    +    make_pu_extensions::Vector{<:Function}=Function[],
    +)::Dict{String,Any}

    Transforms a data model model between ENGINEERING (high-level) and MATHEMATICAL (low-level) DataModel.

    Notes

    Kron reduction

    If kron_reduce==true, apply_kron_reduction! and apply_phase_projection_delta! will be applied to the network data.

    Phase projection

    If phase_project==true, apply_phase_projection! will be applied to the network data.

    Multinetwork transformations

    If multinetwork==true, the data model will be transformed into a multinetwork (e.g., time series) data structure using make_multinetwork before being transformed into a MATHEMATICAL DataModel.

    global_keys::Set{String} can be used to add custom top-level items to the multinetwork data structure, and will only be used in the context where multinetwork==true, and ignored otherwise.

    Custom eng2math transformations

    To add custom transformations between ENGINEERING and MATHEMATICAL data models, eng2math_extensions::Vector{<:Function} can be utilized to pass user-created functions, which are expected to have the signature

    eng2math_func!(data_math::Dict{String,Any}, data_eng::Dict{String,Any})

    where datamath and dataeng equivalent to single subnetworks in a multinetwork data structure, or a non-multinetwork data structure.

    These functions are run after all built-in eng2math transformations have been performed.

    Mapping back to ENGINEERING

    See transform_solution

    Passthrough properties

    To more simply pass through some properties in the built-in eng2math transformations, eng2math_passthrough::Dict{String,Vector{String}} can be used. For example, if in the ENGINEERING model, a property called z was added to switch objects, and a property at the root level of the dictionary was added called max_switch_actions, the user could pass the following dictionary to eng2math_passthrough:

    Dict{String,Vector{String}}(
    +    "switch" => String["z"],
    +    "root" => String["max_switch_actions"],
    +)

    This will result in z showing up on the switch object in the MATHEMATICAL model. Passthrough properties will always land on the primary conversion object in the MATHEMATICAL model if that object gets converted to multiple object types, e.g., voltage_source with internal impedance will result in gen, bus, and branch objects in the MATHEMATICAL model, but passthrough properties will only land on gen.

    Custom per-unit transformations

    To add additional per-unit transformations, a user can supply custom functions to make_pu_extensions::Vector{<:Function}, which will only be used if make_pu==true.

    See make_per_unit! for further explanation.

    source
    PowerModelsDistribution.transform_solutionFunction
    transform_solution(
    +    solution_math::Dict{String,<:Any},
    +    data_math::Dict{String,<:Any};
    +    map::Union{Vector{<:Dict{String,<:Any}},Missing}=missing,
    +    make_si::Bool=true,
    +    convert_rad2deg::Bool=true,
    +    map_math2eng_extensions::Dict{String,<:Function}=Dict{String,Function}(),
    +    make_si_extensions::Vector{<:Function}=Function[],
    +    dimensionalize_math_extensions::Dict{String,<:Dict{String,<:Vector{<:String}}}=Dict{String,Dict{String,Vector{String}}}(),
    +    )::Dict{String,Any}

    Transforms solutions from MATHEMATICAL data structures, back to an ENGINEERING data structure, given a map::Vector{Dict{String,Any}}, typically which was produced automatically by transform_data_model.

    Notes

    If make_si==false, the solution will remain in per-unit, rather than being converted back to SI units (default). Angles will still be converted to degrees unless convert_rad2deg is utilized.

    If convert_rad2deg==false, angles will remain in radians, instead of getting converted to degrees (default).

    Custom SI unit conversions

    See solution_make_si

    Custom math2eng transformations

    To enable automatically mapping back custom components solutions' to the ENGINEERING structure, eng2math_extensions added in transform_data_model should include a push of an item to the map dictionary in the data_math structure. These items should have the structure:

    Dict{String,Any}(
    +    "from" => String,
    +    "to" => Union{String,Vector{String}},
    +    "unmap_function" => PowerModelsDistribution.function!,
    +    "apply_to_subnetworks" => Bool
    +)

    Important things to note are that

    1. The function must be included in map_math2eng_extensions, which has the form:

      julia Dict{String,Function}( "_map_math2eng_func!" => _map_math2eng_func!, )

    2. "apply_to_subnetworks" is optional, and is true by default.

    3. "from" needs to be a single object

    4. "to" can be multiple objects or a single object

    source

    Data Transformations

    Multinetworks

    PowerModelsDistribution.make_multinetworkMethod
    make_multinetwork(
    +    data::Dict{String,<:Any};
    +    sparse::Bool=false,
    +    time_elapsed::Union{Missing,Real,Vector{<:Real}}=missing,
    +    global_keys::Set{String}=Set{String}(),
    +)::Dict{String,Any}

    Expands a data structure into a multinetwork assuming there are time_series objects defined and assigned to some components.

    If global_keys::Set{String} is defined, the global keys that will appear at the top-level of the data structure will include both the default global keys for that data model type, and additionally the keys defined in global_keys.

    time_elapsed defines the time elapsed between subnetworkin hours, and can either be a single Real value, and thus a constant time between each time step, or a Vector with the same length as the number of time steps, or can be left missing, in which case time elapsed will attempt to be discovered, with a fallback on 1 hour default. Time elapsed can be adjusted later using set_time_elapsed!

    make_multinetwork assumes all "time" values in "timeseries" objects to be in the same units, and will attempt to automatically sort multinetworks in the correct order. [`sortmultinetwork!`](@ref sort_multinetwork!) can be used after the fact to re-sort the subnetworks.

    sparse is currently unsupported, and is only included for future compatibility

    source
    PowerModelsDistribution.set_time_elapsed!Method
    set_time_elapsed!(data::Dict{String,<:Any}, time_elapsed::Union{Real,Vector{<:Real}})

    Helper function to set time_elapsed in multinetwork data, given either some constant value of time elapsed or a Vector of time elapsed values of the same length as the number of subnetworks.

    source

    Unit conversions

    PowerModelsDistribution.calc_eng_voltage_basesMethod
    calc_eng_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real})::Tuple{Dict,Dict}

    Calculates voltage bases for each voltage zone for buses and branches for a ENGINEERING data_model

    source
    PowerModelsDistribution.calc_math_voltage_basesMethod
    calc_math_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real})::Tuple{Dict,Dict}

    Calculates voltage bases for each voltage zone for buses and branches for a MATHEMATICAL data_model

    source
    PowerModelsDistribution.calc_voltage_basesMethod
    calc_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real})::Tuple{Dict,Dict}

    Calculates voltage bases for each voltage zone for buses and branches, attempting to automatically decern the data_model type

    source
    PowerModelsDistribution.discover_voltage_zonesMethod
    discover_voltage_zones(data_model::Dict{String,<:Any})::Dict{Int,Set{Any}}

    finds voltage zones by walking through the network and analyzing the transformers, attempting to decern the type of data_model

    source
    PowerModelsDistribution.make_per_unit!Method
    make_per_unit!(
    +    data::Dict{String,Any};
    +    vbases::Union{Missing,Dict{String,Real}}=missing,
    +    sbase::Union{Missing,Real}=missing,
    +    make_pu_extensions::Vector{<:Function}=Function[],
    +)

    Converts units of properties to per-unit from SI units

    make_pu_extensions

    To add additional per-unit transformations, a user can supply custom functions to make_pu_extensions::Vector{<:Function}, which will only be used if make_pu==true.

    For example, if custom properties are added to the MATHEMATICAL model via eng2math_passthrough or eng2math_extensions, those properties will not be converted to per-unit by default, and custom rules will need to be added with functions with the signature:

    rebase_pu_func!(
    +    nw::Dict{String,Any},
    +    data_math::Dict{String,Any},
    +    bus_vbase::Dict{String,Real},
    +    line_vbase::Dict{String,Real},
    +    sbase::Real,
    +    sbase_old::Real,
    +    voltage_scale_factor::Real
    +)

    where,

    • nw is equivalent to the a single subnetwork in a multinetwork data structure (which may be the same as data_math, in the case of a single network),
    • data_math is the complete data structure with the global keys,
    • bus_vbase is a dictionary of the voltage bases of each bus indexed by their MATHEMATICAL model indices,
    • line_vbase is a dictionary of the voltage bases of each branch indexed by their MATHEMATICAL model indices,
    • sbase is the new power base,
    • sbase_old is the power base the data structure started with, and
    • voltage_scale_factor is the scaling factor for voltage.
    source
    PowerModelsDistribution.solution_make_siMethod
    solution_make_si(
    +    solution::Dict{String,<:Any},
    +    math_model::Dict{String,<:Any};
    +    mult_sbase::Bool=true,
    +    mult_vbase::Bool=true,
    +    mult_ibase::Bool=true,
    +    convert_rad2deg::Bool=true,
    +    make_si_extensions::Vector{<:Function}=Function[],
    +    dimensionalize_math_extensions::Dict{String,<:Dict{String,<:Vector{<:String}}}=Dict{String,Dict{String,Vector{String}}}()
    +)::Dict{String,Any}

    Transforms solution dictionaries solution from per-unit back to SI units, requiring the original MATHEMATICAL model math_model to perform the transformation.

    If mult_sbase is false, sbase variables will not be multiplied, thus remaining in per-unit

    If mult_vbase is false, vbase variables will not be multiplied, thus remaining in per-unit

    If mult_ibase is false, ibase variables will not be multiplied, thus remaining in per-unit

    If convert_rad2deg is false, angle variables will not be multiplied, thus remaining in radians

    Custom SI unit conversions

    To convert custom properties not part of formulations already included within PowerModelsDistribution, users will need to either specify multiplicative factors via dimensionalize_math_extensions, or pass user functions via make_si_extensions.

    The latter case requires functions with the signature

    make_si_func!(nw_solution, nw_data, solution, data)

    where nw_solution and nw_data are equivalent to a single subnetwork of a multinetwork structure of the solution and the data in the MATHEMATICAL format, respectively, and solution and data are the full data structures, which may be equivalent to nw_solution and nw_data, if the data is not multinetwork. Changes should be applied to nw_solution in the user functions.

    For dimensionalize_math_extensions, it is possible to easily extended the SI conversions if they are straightforward conversions using vbase, sbase, ibase, or rad2deg. For example, if a custom variable cfr is added to branches, and is scaled by ibase, the following dictionary would be passed:

    Dict{String,Dict{String,Vector{String}}}(
    +    "branch" => Dict{String,Vector{String}}(
    +        "ibase" => String["cfr"]
    +    )
    +)

    which would ensure that this variable gets converted back to SI units upon transformation.

    source

    Data Checking and Correction

    PowerModelsDistribution.correct_bus_types!Method

    checks bus types are suitable for a power flow study, if not, fixes them. the primary checks are that all type 2 buses (i.e., PV) have a connected and active generator and there is a single type 3 bus (i.e., slack bus) with an active connected generator. assumes that the network is a single connected component

    source
    PowerModelsDistribution.correct_network_data!Method
    correct_network_data!(data::Dict{String,Any}; make_pu::Bool=true, make_pu_extensions::Vector{<:Function}=Function[])

    Makes corrections and performs checks on network data structure in either ENGINEERING or MATHEMATICAL formats, and converts to per-unit if data a is MATHEMATICAL data model.

    If make_pu is false, converting to per-unit will be skipped.

    Custom per-unit transformations

    See make_per_unit!

    source

    Statistics and Analysis

    PowerModelsDistribution.calc_connected_componentsFunction
    calc_connected_components(data::Dict{String,<:Any}; edges::Union{Missing, Vector{<:String}}=missing, type::Union{Missing,String}=missing, check_enabled::Bool=true)::Set

    computes the connected components of the network graph returns a set of sets of bus ids, each set is a connected component

    source

    Helper Functions

    PowerModelsDistribution.make_multiconductor!Function
    make_multiconductor!(data::Dict{String,<:Any}, conductors::Int)

    This function is not meant to be an officially supported method for creating reasonable multiconductor data sets.

    Hacky helper function to transform single-conductor network data, from, e.g., matpower/psse, into multi-conductor data.

    source
    PowerModelsDistribution.discover_voltage_zonesFunction
    discover_voltage_zones(data_model::Dict{String,<:Any})::Dict{Int,Set{Any}}

    finds voltage zones by walking through the network and analyzing the transformers, attempting to decern the type of data_model

    source
    PowerModelsDistribution.calc_voltage_basesFunction
    calc_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real})::Tuple{Dict,Dict}

    Calculates voltage bases for each voltage zone for buses and branches, attempting to automatically decern the data_model type

    source
    PowerModelsDistribution.apply_pmd!Function
    apply_pmd!(func!::Function, data::Dict{String,<:Any}; apply_to_subnetworks::Bool=true, kwargs...)

    Version of apply_pmd! that supports kwargs

    source
    apply_pmd!(func!::Function, data::Dict{String,<:Any}; apply_to_subnetworks::Bool=true, kwargs...)

    Version of apply_pmd! that supports kwargs

    source
    apply_pmd!(func!::Function, data::Dict{String,<:Any}, args...; apply_to_subnetworks::Bool=true, kwargs...)

    Version of apply_pmd! that supports args and kwargs

    source
    apply_pmd!(func!::Function, ref::Dict{Symbol,<:Any}, data::Dict{String,<:Any}; apply_to_subnetworks::Bool=true)

    PowerModelsDistribution wrapper for the InfrastructureModels apply! function

    source
    diff --git a/v0.15.1/reference/enums.html b/v0.15.1/reference/enums.html new file mode 100644 index 000000000..486b6ac45 --- /dev/null +++ b/v0.15.1/reference/enums.html @@ -0,0 +1,2 @@ + +Enums · PowerModelsDistribution

    Enums

    diff --git a/v0.15.1/reference/formulations.html b/v0.15.1/reference/formulations.html new file mode 100644 index 000000000..0a6ec9b2f --- /dev/null +++ b/v0.15.1/reference/formulations.html @@ -0,0 +1,38 @@ + +Formulations · PowerModelsDistribution

    Formulations

    Abstract Models

    PowerModelsDistribution.LPUBFDiagModelType

    LinDist3Flow per Arnold et al. (2016), using vector variables for power, voltage and current

    D. B. Arnold, M. Sankur, R. Dobbe, K. Brady, D. S. Callaway and A. Von Meier, "Optimal dispatch of reactive power for voltage regulation and balancing in unbalanced distribution systems," 2016 IEEE Power and Energy Society General Meeting (PESGM), Boston, MA, 2016, pp. 1-5, doi: 10.1109/PESGM.2016.7741261.

    source

    Abstract Union Models

    Power Models

    PowerModelsDistribution.ACPUPowerModelType

    AC power flow Model with polar bus voltage variables. The seminal reference of AC OPF:

    @article{carpentier1962contribution,
    +  title={Contribution to the economic dispatch problem},
    +  author={Carpentier, J},
    +  journal={Bulletin de la Societe Francoise des Electriciens},
    +  volume={3},
    +  number={8},
    +  pages={431--447},
    +  year={1962}
    +}

    History and discussion:

    @techreport{Cain2012,
    +  author = {Cain, Mary B and {O' Neill}, Richard P and Castillo, Anya},
    +  title = {{History of optimal power flow and Models}},
    +  year = {2012}
    +  pages = {1--36},
    +  url = {https://www.ferc.gov/industries/electric/indus-act/market-planning/opf-papers/acopf-1-history-Model-testing.pdf}
    +}
    source
    PowerModelsDistribution.ACRUPowerModelType

    AC power flow Model with rectangular bus voltage variables.

    @techreport{Cain2012,
    +  author = {Cain, Mary B and {O' Neill}, Richard P and Castillo, Anya},
    +  pages = {1--36},
    +  title = {{History of optimal power flow and Models}},
    +  url = {https://www.ferc.gov/industries/electric/indus-act/market-planning/opf-papers/acopf-1-history-Model-testing.pdf}
    +  year = {2012}
    +}
    source
    PowerModelsDistribution.IVRUPowerModelType

    Current voltage formulation of AC OPF. The formulation uses rectangular coordinates for both current and voltage. Note that, even though Kirchhoff's circuit laws are linear in current and voltage, this formulation is nonconvex due to constants power loads/generators and apparent power limits.

    @techreport{ONeill2012,
    +    author = {{O' Neill}, Richard P and Castillo, Anya and Cain, Mary B},
    +    pages = {1--18},
    +    title = {{The IV formulation and linear approximations of the ac optimal power flow problem}},
    +    year = {2012}
    +}

    Applicable to problem formulations with _iv in the name.

    source
    PowerModelsDistribution.DCPUPowerModelType

    Linearized 'DC' power flow Model with polar voltage variables. This model is a basic linear active-power-only approximation, which uses branch susceptance values br_b = -br_x / (br_x^2 + br_x^2) for determining the network phase angles. Furthermore, transformer parameters such as tap ratios and phase shifts are not considered as part of this model. It is important to note that it is also common for active-power-only approximations to use 1/br_x for determining the network phase angles, instead of the br_b value that is used here. Small discrepancies in solutions should be expected when comparing active-power-only approximations across multiple tools.

    @ARTICLE{4956966,
    +  author={B. Stott and J. Jardim and O. Alsac},
    +  journal={IEEE Transactions on Power Systems},
    +  title={DC Power Flow Revisited},
    +  year={2009},
    +  month={Aug},
    +  volume={24},
    +  number={3},
    +  pages={1290-1300},
    +  doi={10.1109/TPWRS.2009.2021235},
    +  ISSN={0885-8950}
    +}
    source

    Mutable Stuct creator

    diff --git a/v0.15.1/reference/internal.html b/v0.15.1/reference/internal.html new file mode 100644 index 000000000..44e0c42ec --- /dev/null +++ b/v0.15.1/reference/internal.html @@ -0,0 +1,89 @@ + +Internal Functions · PowerModelsDistribution

    Internal Functions

    Base.delete!Method

    Base.delete! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.delete!Method

    Base.delete! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.eltypeMethod

    Base.eltype for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.getMethod

    Base.get for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.getindexMethod

    Base.getindex for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.getpropertyMethod

    Base.getproperty for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.haskeyMethod

    Base.haskey for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.isemptyMethod

    Base.isempty for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.iterateMethod

    Base.iterate for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.keysMethod

    Base.keys for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.keytypeMethod

    Base.keytype for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.lengthMethod

    Base.length for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.merge!Method

    Base.merge! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.parseMethod

    Parses dss capacitor control type into CapControlType enum

    source
    Base.setindex!Method

    Base.setindex! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.setproperty!Method

    Base.setproperty! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.showMethod

    Base.show variant for InfrastructureModel,InfrastructureObject to make them Dict-like

    source
    Base.showMethod

    Base.show variant for InfrastructureModel,InfrastructureObject to make them Dict-like

    source
    Base.summaryMethod

    Base.summary for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    Base.valtypeMethod

    Base.valtype for InfrastructureModel,InfrastructureObject to give them Dict-like behavior

    source
    PowerModelsDistribution._adjust_small_line_admittances!Method
    _adjust_small_line_admittances!(data_eng::Dict{String,<:Any}; min_admittance_val::Real=1e-2, replace_admittance_val::Real=0.0)

    Replaces admittances (gfr, gto, bfr, bto) on lines, linecodes, and switches lower than min_admittance_val with replace_admittance_val.

    source
    PowerModelsDistribution._adjust_small_line_impedances!Method
    _adjust_small_line_impedances!(data_eng::Dict{String,<:Any}; min_impedance_val::Real=1e-2, replace_impedance_val::Real=0.0)

    Replaces impedances (rs, xs) on lines, linecodes, and switches lower than min_impedance_val with replace_impedance_val.

    source
    PowerModelsDistribution._apply_kron_reduction!Method
    _apply_kron_reduction!(data_eng::Dict{String,<:Any}; kr_phases::Union{Vector{Int},Vector{String}}=[1,2,3], kr_neutral::Union{Int,String}=4)

    Applies a Kron Reduction to the network, reducing out the kr_neutral, leaving only the kr_phases

    source
    PowerModelsDistribution._apply_voltage_bounds!Method
    _apply_voltage_bounds!(data_eng::Dict{String,<:Any}; vm_lb::Union{Real,Missing}=0.9, vm_ub::Union{Real,Missing}=1.1)

    add voltage bounds to all buses based on per-unit upper (vm_ub) and lower (vm_lb), scaled by the bus's voltage based

    source
    PowerModelsDistribution._calc_branch_current_maxMethod

    Returns a total (shunt+series) current magnitude bound for the from and to side of a branch. The total power rating also implies a current bound through the lower bound on the voltage magnitude of the connected buses.

    source
    PowerModelsDistribution._calc_branch_power_maxMethod

    Returns a total (shunt+series) power magnitude bound for the from and to side of a branch. The total current rating also implies a current bound through the upper bound on the voltage magnitude of the connected buses.

    source
    PowerModelsDistribution._calc_branch_power_max_frtoMethod

    Returns a total (shunt+series) power magnitude bound for the from and to side of a branch. The total current rating also implies a current bound through the upper bound on the voltage magnitude of the connected buses.

    source
    PowerModelsDistribution._calc_bus_vm_ll_boundsMethod

    Returns bounds in line-to-line bounds on the voltage magnitude. If these are not part of the problem specification, then a valid upper bound is implied by the line-to-neutral bounds, but a lower bound (greater than zero) is not. Therefore, a default lower bound is then used, specified by the keyword argument vdmin_eps. The returned bounds are for the pairs 1->2, 2->3, 3->1

    source
    PowerModelsDistribution._calc_load_vboundsMethod

    Returns the voltage magnitude bounds for the individual load elements in a multiphase load. These are inferred from vmin/vmax for wye loads and from calcbusvmll_bounds for delta loads.

    source
    PowerModelsDistribution._calc_shuntMethod

    Given a set of addmittances 'y' connected from the conductors 'fcnds' to the conductors 'tcnds', this method will return a list of conductors 'cnd' and a matrix 'Y', which will satisfy I[cnds] = Y*V[cnds].

    source
    PowerModelsDistribution._calc_voltage_basesMethod
    _calc_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real}, edge_elements::Vector{String})::Tuple{Dict,Dict}

    Calculates voltage bases for each voltage zone for buses and branches given a list of edge_elements

    source
    PowerModelsDistribution._compute_UvMethod
    _compute_Uv(
    +  pfd::PowerFlowData,
    +  max_iter::Int,
    +  stat_tol::Float,
    +  verbose::Bool
    +)

    Computes a nonlinear AC power flow in rectangular coordinates based on the admittance matrix of the network data using the fixed-point current injection method (See https://arxiv.org/abs/2305.04405). Returns a solution data structure in PowerModelsDistribution Dict format.

    source
    PowerModelsDistribution._compute_mc_pfMethod
    _compute_mc_pf(
    +    data_math::Dict{String,<:Any};
    +    v_start::Union{Dict{<:Any,<:Any},Missing}=missing,
    +    explicit_neutral::Bool=false,
    +    max_iter::Int=100,
    +    stat_tol::Real=1E-8,
    +    verbose::Bool=false
    +)::Dict{String,Any}

    Computes native power flow and outputs the result dict (See https://arxiv.org/abs/2305.04405).

    Abbreviations:

    • ntype: node type (variable, fixed, grounded, virtual)
    • bts: bus-terminals for the component
    • ns: nodes
    • vns: virtual nodes
    • nr_vns: number of virtual nodes
    • y_prim: primitive admittance matrix for the component
    • cnlfunc: nonlinear compensation current function handle for the component
    • ctotsfunc: total current function handle for the component
    source
    PowerModelsDistribution._correct_bus_types!Method

    checks bus types are suitable for a power flow study, if not, fixes them. the primary checks are that all type 2 buses (i.e., PV) have a connected and active generator and there is a single type 3 bus (i.e., slack bus) with an active connected generator. Assumes that the network is a single connected component

    source
    PowerModelsDistribution._cpf_branch_interfaceMethod
    _cpf_branch_interface(
    +  branch::Dict,
    +  v_start::Dict,
    +  explicit_neutral::Bool,
    +  line_vbase::Dict,
    +  sbase::Float
    +)

    Branch component interface outputs branch primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.1).

    source
    PowerModelsDistribution._cpf_generator_interfaceMethod
    _cpf_generator_interface(
    +  gen::Dict,
    +  v_start::Dict,
    +  explicit_neutral::Bool,
    +  line_vbase::Dict,
    +  sbase::Float
    +)

    Generator component interface outputs generator primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.4 and 4.5).

    source
    PowerModelsDistribution._cpf_load_interfaceMethod
    _cpf_load_interface(
    +  load::Dict,
    +  v_start::Dict,
    +  explicit_neutral::Bool,
    +  line_vbase::Dict,
    +  sbase::Float
    +)

    Load component interface outputs load primitive Y matrix (See https://arxiv.org/abs/2305.04405 Sections 4.4 and 4.5).

    source
    PowerModelsDistribution._cpf_shunt_interfaceMethod
    _cpf_shunt_interface(
    +  shunt::Dict,
    +  v_start::Dict,
    +  explicit_neutral::Bool,
    +  line_vbase::Dict,
    +  sbase::Float
    +)

    Shunt component interface outputs shunt primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.2).

    source
    PowerModelsDistribution._cpf_storage_interfaceMethod
    _cpf_storage_interface(
    +  storage::Dict,
    +  v_start::Dict,
    +  explicit_neutral::Bool,
    +  line_vbase::Dict,
    +  sbase::Float
    +)

    Storage component interface outputs storage primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.4 and 4.5).

    source
    PowerModelsDistribution._cpf_switch_interfaceMethod
    _cpf_switch_interface(
    +  switch::Dict,
    +  v_start::Dict,
    +  explicit_neutral::Bool,
    +  line_vbase::Dict,
    +  sbase::Float
    +)

    Branch component interface outputs branch primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.2).

    source
    PowerModelsDistribution._cpf_transformer_interfaceMethod
    _cpf_transformer_interface(
    +  tr::Dict,
    +  v_start::Dict,
    +  explicit_neutral::Bool,
    +  line_vbase::Dict,
    +  sbase::Float
    +)

    Transformer component interface outputs transformer primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.3).

    source
    PowerModelsDistribution._dss2eng_load!Function

    Adds loads to data_eng from data_dss

    Constant can still be scaled by other settings, fixed cannot Note that in the current feature set, fixed therefore equals constant

    1: Constant P and Q, default 2: Constant Z 3: Constant P and quadratic Q 4: Exponential 5: Constant I 6: Constant P and fixed Q

    7: Constant P and quadratic Q (i.e., fixed reactance)

    8: ZIP

    source
    PowerModelsDistribution._equivalance_center_tap!Method
    _equivalance_center_tap!(transformer::Dict{String,<:Any}, data_eng::Dict{String,<:Any})

    Removes center tap transformers based on Eq. (1) from Kersting's paper 'Center-Tapped Transformers and 120/240-V Secondary Models' Z0 = 0.5r_t + j0.8x_t

    source
    PowerModelsDistribution._infer_neutral_terminalsMethod

    Return a list of all implicit neutrals as a list of bus-terminal pairs. This is done by starting from a list of all terminals which are either a.connected to the neutral of wye-connected components; b. or are grounded. This initial list is then expanded to all terminals which are galvanically connected to terminals in the initial list.

    source
    PowerModelsDistribution._kronMethod
    _kron(Z::Matrix{T}, Y::Matrix{T}, nconds::Int)::Tuple{Matrix{T}, Matrix{T}} where T <: Complex

    Kron reduces impedance and shunt admittance matrices down to size (nconds, nconds)

    source
    PowerModelsDistribution._kron_reduce_implicit_neutrals!Method
    _kron_reduce_implicit_neutrals!(data_eng::Dict{String,Any})::Dict{String,Any}

    Kron-reduce all (implied) neutral conductors of lines, switches and shunts, and remove any terminals which become unconnected. A line or switch conductor is considered as a neutral conductor if it is connected between two neutral terminals. A terminal is a neutral terminals if it is galvanically connected (i.e. through a line or switch) to a grounded terminal, or the neutral conductor of a wye-connected component.

    source
    PowerModelsDistribution._load_expmodel_paramsMethod
    _load_expmodel_params(load::Dict{String,<:Any}, bus::Dict{String,<:Any})

    Returns the exponential load model parameters for a load. For an exponential load it simply returns certain data model properties, whilst for constantpower, constantcurrent and constant_impedance it returns the equivalent exponential model parameters.

    source
    PowerModelsDistribution._make_lossless!Method
    _make_lossless!(data_eng::Dict{String,<:Any})

    Remove parameters from objects with loss models to make them lossless. This includes linecodes, lines, switches, xfmrcodes, transformers, voltage sources, generators, solar, and storage, which all have (or will have in the future), loss model parameters that can be omitted.

    source
    PowerModelsDistribution._make_matrix_variable_elementMethod
    _make_matrix_variable_element(
    +    model::JuMP.Model,
    +    indices::Array{T,1},
    +    n::Int,
    +    m::Int;
    +    upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    varname::String=""
    +) where T

    Sometimes we want to bound only a subset of the elements of a matrix variable. For example, an unbounded Hermitian variable usually still has a lower bound of zero on the real diagonal elements. When there is a mix of bounded and unbounded elements, the unboundedness is encoded as 'Inf' and '-Inf' in the bound parameters. This cannot be passed directlty to JuMP, because it would lead to an error in Mosek for example. Instead, this method checks whether all bounds for an element (n,m) are Inf, and if so, does not pass a bound to JuMP.

    source
    PowerModelsDistribution._remove_all_bounds!Method
    _remove_all_bounds!(data_eng; exclude::Vector{<:String}=String["energy_ub"], exclude_asset_type::Vector{String}=String[])

    Removes all fields ending in 'ub' or 'lb' that aren't required by the math model. Properties can be excluded from this removal with exclude::Vector{String}

    Whole asset types (e.g., "line") can be excluded using the keyword argument exclude_asset_type::Vector{String}

    By default, "energy_ub" is excluded from this removal, since it is a required properly on storage.

    source
    PowerModelsDistribution._sanatize_lineMethod
    _sanatize_line(line::String)::String

    Sanitizes lines by stripping them clean of extra space and the beginnging and end, making everything lowercase, changing ~ or m to more, and stripping comments

    source
    PowerModelsDistribution._sc2br_impedanceMethod

    Converts a set of short-circuit tests to an equivalent reactance network. Reference: R. C. Dugan, “A perspective on transformer modeling for distribution system analysis,” in 2003 IEEE Power Engineering Society General Meeting (IEEE Cat. No.03CH37491), 2003, vol. 1, pp. 114-119 Vol. 1.

    source
    PowerModelsDistribution._sol_data_model_acr!Method
    _sol_data_model_acr!(solution::Dict{String,<:Any})

    solutionprocessor, see [`solvemcmodel`](@ref solvemc_model), to convert ACR variables back into polar representation (default data model voltage form)

    source
    PowerModelsDistribution._solve_mc_modelMethod
    _solve_mc_model(
    +    data::Dict{String,<:Any},
    +    model_type::Type,
    +    optimizer,
    +    build_method::Function;
    +    multinetwork::Bool=false,
    +    ref_extensions::Vector{<:Function}=Function[],
    +    solution_processors::Vector{<:Function}=Function[],
    +    relax_integrality::Bool=false,
    +    kwargs...
    +)::Dict{String,Any}

    Internal solver interface that uses instantiate_mc_model directly and runs optimize_model!, returning a result

    See solve_mc_model

    source
    PowerModelsDistribution._transform_loops!Method
    _transform_loops!(
    +    data_eng::Dict{String,Any};
    +    zero_series_impedance_threshold::Real=1E-8,
    +    shunt_id_prefix::AbstractString="line_loop"
    +)::Dict{String,Any}

    Transform line loops (connected to a single bus), which are not allowed in the mathematical model. Lossy line loops are converted to equivalent shunts, and lossless ones (i.e. short-circuits) are represented by merging the short-circuited terminals. The argument 'zeroseriesimpedance_threshold' controls the threshold below which the series impedance is considered to be a short-ciruit. This is useful because OpenDSS modelers have to insert tiny impedances to represent short-circuit reactors. The addmittance to ground should be zero to trigger the short-circuit handling.

    source
    diff --git a/v0.15.1/reference/logging.html b/v0.15.1/reference/logging.html new file mode 100644 index 000000000..7e6426d20 --- /dev/null +++ b/v0.15.1/reference/logging.html @@ -0,0 +1,2 @@ + +Logging · PowerModelsDistribution diff --git a/v0.15.1/reference/objectives.html b/v0.15.1/reference/objectives.html new file mode 100644 index 000000000..6d2f85fe7 --- /dev/null +++ b/v0.15.1/reference/objectives.html @@ -0,0 +1,2 @@ + +Objectives · PowerModelsDistribution

    Objectives

    Helpers

    PowerModelsDistribution.calc_pwl_pointsFunction
    calc_pwl_points(ncost::Int, cost::Vector{<:Real}, pmin::Real, pmax::Real; tolerance=1e-2)

    cleans up raw pwl cost points in preparation for building a mathamatical model. The key mathematical properties,

    • the first and last points are strickly outside of the pmin-to-pmax range
    • pmin and pmax occur in the first and last line segments.
    source
    diff --git a/v0.15.1/reference/problems.html b/v0.15.1/reference/problems.html new file mode 100644 index 000000000..bb9dd9f39 --- /dev/null +++ b/v0.15.1/reference/problems.html @@ -0,0 +1,73 @@ + +Problems · PowerModelsDistribution

    Problems

    Solvers

    PowerModelsDistribution.solve_mc_modelMethod
    solve_mc_model(
    +    data::Dict{String,<:Any},
    +    model_type::Type,
    +    optimizer,
    +    build_mc::Function;
    +    ref_extensions::Vector{<:Function}=Function[],
    +    multinetwork::Bool=false,
    +    global_keys::Set{String}=Set{String}(),
    +    eng2math_extensions::Vector{<:Function}=Function[],
    +    eng2math_passthrough::Dict{String,<:Vector{<:String}}=Dict{String,Vector{String}}(),
    +    make_si::Bool=!get(data, "per_unit", false),
    +    make_si_extensions::Vector{<:Function}=Function[],
    +    dimensionalize_math_extensions::Dict{String,Dict{String,Vector{String}}}=Dict{String,Dict{String,Vector{String}}}(),
    +    kwargs...
    +)::Dict{String,Any}

    Takes data in either the ENGINEERING or MATHEMATICAL model, a model type (e.g., ACRUPowerModel), and model builder function (e.g., build_mc_opf), and returns a solution in the original data model defined by data.

    If make_si is false, data will remain in per-unit.

    For an explanation of multinetwork and global_keys, see make_multinetwork

    For an explanation of eng2math_extensions and eng2math_passthrough, see transform_data_model

    For an explanation of make_pu_extensions, see make_per_unit!

    For an explanation of ref_extensions, see instantiate_mc_model

    For an explanation of map_math2eng_extensions, make_si, make_si_extensions, and dimensionalize_math_extensions, see solution_make_si

    source
    PowerModelsDistribution.solve_mc_modelMethod
    solve_mc_model(
    +    file::String,
    +    model_type::Type,
    +    optimizer,
    +    build_mc::Function;
    +    dss2eng_extensions::Vector{<:Function}=Function[],
    +    multinetwork::Bool=false,
    +    global_keys::Set{String}=Set{String}(),
    +    kwargs...
    +)::Dict{String,Any}

    Given a file::String, data will be parsed automatically from the file.

    See solve_mc_model for detailed explanation of function arguments.

    source

    Builders

    PowerModelsDistribution.build_pf_resultMethod
    build_pf_result(
    +  pfd::PowerFlowData,
    +  Uv::Vector,
    +  status::PFTerminationStatus,
    +  its::Int,
    +  time::Real,
    +  stationarity::Real,
    +  verbose::Bool
    +)

    Builds the result dict from the solution dict.

    source

    Model Instantiation

    PowerModelsDistribution.instantiate_mc_modelFunction
    instantiate_mc_model(
    +    data::Dict{String,<:Any},
    +    model_type::Type,
    +    build_method::Function;
    +    ref_extensions::Vector{<:Function}=Function[],
    +    multinetwork::Bool=false,
    +    global_keys::Set{String}=Set{String}(),
    +    eng2math_extensions::Vector{<:Function}=Function[],
    +    eng2math_passthrough::Dict{String,<:Vector{<:String}}=Dict{String,Vector{String}}(),
    +    make_pu_extensions::Vector{<:Function}=Function[],
    +    kwargs...
    +)

    Takes data in either the ENGINEERING or MATHEMATICAL model, a model type (e.g., ACRUPowerModel), and model builder function (e.g., build_mc_opf), and returns an AbstractUnbalancedPowerModel structure.

    For an explanation of multinetwork and global_keys, see make_multinetwork

    For an explanation of eng2math_extensions and eng2math_passthrough, see transform_data_model

    For an explanation of make_pu_extensions, see make_per_unit!

    ref_extensions

    Inside of the model structures, data can be quickly accessed via the ref function. By default, the only ref objects available are created by ref_add_core!, but users can add their own custom ref objects by passing functions via ref_extensions that have the signature:

    ref_add!(ref::Dict{Symbol,Any}, data::Dict{String,Any})

    See the Beginners Guide for an example.

    source

    Solution Helpers

    PowerModelsDistribution.sol_data_model!Method
    sol_data_model!(pm::AbstractUnbalancedACRModel, solution::Dict{String,<:Any})

    solutionprocessor, see [`solvemcmodel`](@ref solvemc_model), to convert ACR variables back into polar representation (default data model voltage form)

    source
    PowerModelsDistribution.sol_data_model!Method
    sol_data_model!(pm::AbstractUnbalancedWModels, solution::Dict{String,<:Any})

    solutionprocessor, see [`solvemcmodel`](@ref solvemc_model), to convert W variables back into polar representation (default data model voltage form)

    source
    PowerModelsDistribution.sol_data_model!Method
    sol_data_model!(pm::FBSUBFPowerModel, solution::Dict{String,<:Any})

    solution_processor, to convert FBS variables back into polar representation (default data model voltage form)

    source
    PowerModelsDistribution.sol_data_model!Method
    sol_data_model!(pm::FOTRUPowerModel, solution::Dict{String,<:Any})

    solution_processor, to convert FOT rectangular variables back into polar representation (default data model voltage form)

    source

    DEPRECIATED Solver functions

    diff --git a/v0.15.1/reference/variables.html b/v0.15.1/reference/variables.html new file mode 100644 index 000000000..e4d9fd240 --- /dev/null +++ b/v0.15.1/reference/variables.html @@ -0,0 +1,266 @@ + +Variables · PowerModelsDistribution

    Variables

    PowerModelsDistribution.variable_mc_branch_currentMethod
    function variable_mc_branch_current(
    +	pm::AbstractExplicitNeutralIVRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, creates total current variables :cr and :ci, series current variables :csr and :csi, and placeholder dictionaries for the terminal current flows :cr_bus and :ci_bus

    source
    PowerModelsDistribution.variable_mc_branch_currentMethod
    function variable_mc_branch_current(
    +	pm::ReducedExplicitNeutralIVRModels;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For branch-reduced IVR models with explicit neutrals, creates series current variables :csr and :csi, placeholder dictionaries for the total current :cr and :ci, and placeholder dictionaries for the terminal current flows :cr_bus and :ci_bus

    source
    PowerModelsDistribution.variable_mc_branch_powerMethod
    function variable_mc_branch_power(
    +	pm::AbstractExplicitNeutralACRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true,
    +)

    For ACR models with explicit neutrals, creates branch power variables :p and :q and placeholder dictionaries for the terminal power flows :p_bus and :q_bus.

    source
    PowerModelsDistribution.variable_mc_bus_voltageMethod
    variable_mc_bus_voltage(pm::FBSUBFPowerModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)

    Voltage variables are defined in rectangular coordinates similar to ACRUPowerModel. An initial operating point is specified for linearization.

    source
    PowerModelsDistribution.variable_mc_bus_voltageMethod
    variable_mc_bus_voltage(pm::FOTPUPowerModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)

    Voltage variables are defined in polar coordinates similar to ACPUPowerModel. An initial operating point is specified for linearization.

    source
    PowerModelsDistribution.variable_mc_bus_voltageMethod
    variable_mc_bus_voltage(pm::FOTRUPowerModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)

    Voltage variables are defined in rectangular coordinates similar to ACRUPowerModel. An initial operating point is specified for linearization similar to FBSUBFPowerModel.

    source
    PowerModelsDistribution.variable_mc_bus_voltageMethod
    function variable_mc_bus_voltage(
    +	pm::RectangularVoltageExplicitNeutralModels;
    +	nw=nw_id_default,
    +	bounded::Bool=true,
    +)

    Creates rectangular voltage variables :vr and :vi for models with explicit neutrals

    source
    PowerModelsDistribution.variable_mc_generator_powerMethod
    function variable_mc_generator_power(
    +	pm::AbstractExplicitNeutralACRModel;
    +	nw::Int=nw_id_default,
    +)

    For ACR models with explicit neutrals, creates generator power variables :pg and :qg, and placeholder dictionaries for terminal power flows :pg_bus and :qg_bus,

    source
    PowerModelsDistribution.variable_mc_generator_powerMethod
    function variable_mc_generator_power(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, creates generator power variables :pg and :qg

    source
    PowerModelsDistribution.variable_mc_generator_powerMethod
    variable_mc_generator_power(pm::AbstractUBFModels; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)

    The variable creation for generators in branch flow model. Delta generators always need an auxilary power variable (X) similar to delta loads. Wye generators however, don't need any variables.

    source
    PowerModelsDistribution.variable_mc_generator_powerMethod
    variable_mc_generator_power(pm::SOCUBFModels; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)

    The variable creation for generators in SOC branch flow model. Delta generators always need an auxilary power variable (X) and current squared variable (CC) similar to delta loads. Wye generators however, don't need any variables.

    source
    PowerModelsDistribution.variable_mc_load_currentMethod
    function variable_mc_load_current(
    +	pm::AbstractExplicitNeutralIVRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For IVR models with explicit neutrals, creates placeholder dictionaries for the load current :crd and :cid, and for the terminal current flows :crd_bus and :cid_bus

    source
    PowerModelsDistribution.variable_mc_load_currentMethod
    function variable_mc_load_current(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, creates load current variables :crd and :cid, and placeholder dictionaries for the terminal current flows :crd_bus and :cid_bus

    source
    PowerModelsDistribution.variable_mc_load_currentMethod
    variable_mc_load_current(pm::FBSUBFPowerModel, load_ids::Vector{Int}; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)

    No loads require a current variable. Delta loads are zero-order approximations and wye loads are first-order approximations around the initial operating point.

    source
    PowerModelsDistribution.variable_mc_load_powerMethod
    function variable_mc_load_power(
    +	pm::AbstractExplicitNeutralACRModel;
    +	nw=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For ACR models with explicit neutrals, creates placeholder dictionaries for load power expressions :pd and :qd

    source
    PowerModelsDistribution.variable_mc_load_powerMethod
    function variable_mc_load_power(
    +	pm::AbstractNLExplicitNeutralIVRModel;
    +	nw=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For non-linear IVR models with explicit neutrals, creates placeholder dictionaries for the load power :pd and :qd, and for the terminal power flows :pd_bus and :qd_bus

    source
    PowerModelsDistribution.variable_mc_load_powerMethod
    function variable_mc_load_power(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true
    +)

    For quadratic IVR models with explicit neutrals, creates load power variables :pd and :qd

    source
    PowerModelsDistribution.variable_mc_load_powerMethod

    The variable creation for the loads is rather complicated because Expressions are used wherever possible instead of explicit variables. Delta loads always need a current variable and auxilary power variable (X), and all other load model variables are then linear transformations of these (linear Expressions). Wye loads however, don't need any variables when the load is modelled as constant power or constant impedance. In all other cases (e.g. when a cone is used to constrain the power), variables need to be created.

    source
    PowerModelsDistribution.variable_mc_load_powerMethod

    The variable creation for the loads is rather complicated because Expressions are used wherever possible instead of explicit variables. All loads need a current variable; for wye loads, this variable will be in the wye reference frame whilst for delta currents it will be in the delta reference frame. All loads need variables for the off-diagonals of the nodal power variables. In some cases, the diagonals elements can be created as Expressions. Delta loads only need a current variable and auxilary power variable (X), and all other load model variables are then linear transformations of these (linear Expressions).

    source
    PowerModelsDistribution.variable_mc_load_power_activeMethod
    function variable_mc_load_power_active(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    Creates load active power variables :pd for models with explicit neutrals

    source
    PowerModelsDistribution.variable_mc_load_power_busMethod

    The bus qualifier denotes that this is the power withdrawn at the bus; Only for grounded wye-connected loads, this is the same as the power consumed by the multi-phase load. The off-diagonals only need to be created for the matrix KCL formulation.

    source
    PowerModelsDistribution.variable_mc_load_power_delta_auxMethod

    Creates power matrix variable X for delta windings; this defines both the wye-side power Sy and the delta-side power Sd through the lin. transformations Sy = X.Td, Sd = Td.X with Td=[1 -1 0; 0 1 -1; -1 0 1]

    See the paper by Zhao et al. for the first convex relaxation of delta transformations. @INPROCEEDINGS{zhaooptimal2017, author={C. Zhao, E. Dall'Anese and S. Low}, booktitle={IREP 2017 Bulk Power Systems Dynamics and Control Symposium}, title={{Optimal Power Flow in Multiphase Radial Networks with Delta Connections}}, year={2017}, month={}, url={https://www.nrel.gov/docs/fy18osti/67852.pdf} }

    See upcoming paper for discussion of bounds. [reference added when accepted]

    source
    PowerModelsDistribution.variable_mc_load_power_delta_auxMethod
    variable_mc_load_power_delta_aux(pm::FBSUBFPowerModel, load_ids::Vector{Int}; nw::Int=nw_id_default, eps::Real=0.1, bounded::Bool=true, report::Bool=true)

    Auxiliary variables are not required since delta loads are zero-order approximations calculated using the initial operating point.

    source
    PowerModelsDistribution.variable_mc_load_power_reactiveMethod
    function variable_mc_load_power_reactive(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    Creates load reactive power variables :qd for models with explicit neutrals

    source
    PowerModelsDistribution.variable_mc_switch_currentMethod
    function variable_mc_switch_current(
    +	pm::AbstractExplicitNeutralIVRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true,
    +)

    For IVR models with explicit neutrals, creates switch current variables :crs and :cis, and placeholder dictionaries for the terminal current flows :crsw_bus and :cisw_bus

    source
    PowerModelsDistribution.variable_mc_switch_current_imaginaryMethod
    function variable_mc_switch_current_imaginary(
    +	pm::ExplicitNeutralModels;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For models with explicit neutrals, creates switch imaginary current variables :cisw for models with explicit neutrals.

    source
    PowerModelsDistribution.variable_mc_switch_current_realMethod
    function variable_mc_switch_current_real(
    +	pm::ExplicitNeutralModels;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For models with explicit neutrals, creates switch real current variables :crsw for models with explicit neutrals.

    source
    PowerModelsDistribution.variable_mc_switch_powerMethod
    function variable_mc_switch_power(
    +	pm::AbstractExplicitNeutralACRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true,
    +)

    For ACR models with explicit neutrals, creates switch power variables :p and :q and placeholder dictionaries for the terminal power flows :ps_bus and :qs_bus.

    source
    PowerModelsDistribution.variable_mc_switch_power_imaginaryMethod
    function variable_mc_switch_power_imaginary(
    +	pm::ExplicitNeutralModels;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For models with explicit neutrals, creates switch reactive power variables :qsw for models with explicit neutrals. This is defined per arc, i.e. with a variable for the from-side and to-side power.

    source
    PowerModelsDistribution.variable_mc_switch_power_realMethod
    function variable_mc_switch_power_real(
    +	pm::ExplicitNeutralModels;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true
    +)

    For models with explicit neutrals, creates switch active power variables :psw for models with explicit neutrals. This is defined per arc, i.e. with a variable for the from-side and to-side power.

    source
    PowerModelsDistribution.variable_mc_transformer_currentMethod
    function variable_mc_transformer_current(
    +	pm::AbstractExplicitNeutralIVRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true,
    +)

    For IVR models with explicit neutrals, create transformer current variables :crt and :cit, and placeholder dictionaries for the terminal current flows :crt_bus and :cit_bus

    source
    PowerModelsDistribution.variable_mc_transformer_powerMethod
    function variable_mc_transformer_power(
    +	pm::AbstractExplicitNeutralACRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true,
    +)

    For ACR models with explicit neutrals, creates transfomer power variables :pt and :qt, and placeholder dictionaries for transformer terminal power flows :pt_bus and :qt_bus

    source
    PowerModelsDistribution.variable_mc_transformer_powerMethod
    function variable_mc_transformer_power(
    +	pm::AbstractNLExplicitNeutralIVRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true,
    +)

    For non-linear IVR models with explicit neutrals, no power variables are required.

    source
    PowerModelsDistribution.variable_mc_transformer_powerMethod
    function variable_mc_transformer_power(
    +	pm::AbstractQuadraticExplicitNeutralIVRModel;
    +	nw::Int=nw_id_default,
    +	bounded::Bool=true,
    +	report::Bool=true,
    +)

    For quadratic IVR models with explicit neutrals, creates transformer power variables :pt and :qt

    source
    PowerModelsDistribution.variable_mx_complexMethod
    variable_mx_complex(
    +    model::JuMP.Model,
    +    indices::Array{T,1},
    +    N::Dict{T,Vector{Int}},
    +    M::Dict{T,Vector{Int}};
    +    upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    symm_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    name::Union{String, Tuple{String,String}}="",
    +    prefix::String=""
    +)::Tuple where T

    Shorthand to create two real matrix variables, where the first is the real part and the second the imaginary part.

    If the name argument is a String, it will be suffixed with 're' and 'im'. It is possible to specify the names of the real and imaginary part directly as a Tuple as well (to achieve P and Q instead of Sre and Sim for example).

    source
    PowerModelsDistribution.variable_mx_complex_with_diagMethod
    variable_mx_complex_with_diag(
    +    model::JuMP.Model,
    +    indices::Array{T,1},
    +    N::Dict{T,Vector{Int}};
    +    upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    symm_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    diag_re::Dict{T,<:Vector{<:Any}}=Dict([(i, zeros(length(N[i]))) for i in indices]),
    +    diag_im::Dict{T,<:Vector{<:Any}}=Dict([(i, zeros(length(N[i]))) for i in indices]),
    +    name::Union{String, Tuple{String,String}}="",
    +    prefix::String=""
    +)::Tuple where T

    Same as variable_mx_complex, but square and the diagonal of the matrix variables consists of the constants passed as the diagre and diagim argument. The diag argument is a dictionary of (index, 1d-array) pairs.

    Useful for power matrices with specified diagonals (constant power wye loads).

    source
    PowerModelsDistribution.variable_mx_hermitianMethod
    variable_mx_hermitian(
    +    model::JuMP.Model,
    +    indices::Array{T,1},
    +    N::Dict{T,Vector{Int}};
    +    upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    symm_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    sqrt_upper_bound::Union{Missing, Dict{T,<:Vector{<:Real}}}=missing,
    +    sqrt_lower_bound::Union{Missing, Dict{T,<:Vector{<:Real}}}=missing,
    +    set_lower_bound_diag_to_zero::Bool=false,
    +    imag_set_diag_to_zero::Bool=true,
    +    name::Union{String,Tuple{String,String}}="",
    +    prefix::String=""
    +)::Tuple where T

    Returns a pair of symmetric and skew-symmetric matrix variables.

    source
    PowerModelsDistribution.variable_mx_realMethod
    variable_mx_real(
    +    model::JuMP.Model,
    +    indices::Array{T,1},
    +    N::Dict{T,Vector{Int}},
    +    M::Dict{T,Vector{Int}};
    +    upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    name::String="",
    +    prefix::String=""
    +) where T

    This function creates a set of real matrix variables of size NxM, indexed over the elements of the indices argument. The upper and lower bounds have to be specified, and are dictionaries with the indices as keys and the matrix bounds as values. The name and prefix arguments will be combined into the base_name argument for JuMP; the prefix will typically be the network number nw. Instead of sequentially creating the matrix variables, the elements of the matrices are created sequentially for all matrices at once. I.e., we loop over the elements, and not over the indices. This is needed so that the variable names printed by JuMP are in line with the current design.

    Returns a dictionary of (index, matrix variable) pairs

    source
    PowerModelsDistribution.variable_mx_real_skewsymmetricMethod
    variable_mx_real_skewsymmetric(
    +    model::JuMP.Model,
    +    indices::Array{T,1},
    +    N::Dict{T,Vector{Int}};
    +    upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    set_diag_to_zero::Bool=true,
    +    name::String="",
    +    prefix::String=""
    +)::Dict where T

    Same as variable_mx_real, but adds skew-symmetry structure.

    source
    PowerModelsDistribution.variable_mx_real_symmetricMethod
    variable_mx_real_symmetric(
    +    model::JuMP.Model,
    +    indices::Array{T,1},
    +    N::Dict{T,Vector{Int}};
    +    upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    name::String="",
    +    prefix::String=""
    +)::Dict where T

    Same as variable_mx_real, but adds symmetry structure

    source
    PowerModelsDistribution.variable_mx_real_with_diagMethod
    variable_mx_real_with_diag(
    +    model::JuMP.Model,
    +    indices::Array{T,1},
    +    N::Dict{T,Vector{Int}};
    +    upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,
    +    diag::Dict{T,<:Vector{<:Any}}=Dict([(i, fill(0, length(N[i]))) for i in indices]),
    +    name::String="",
    +    prefix::String=""
    +) where T

    Same as variable_mx_real, but has to be square and the diagonal of the matrix variables consists of the elements passed as the diag argument. The diag argument is a dictionary of (index, 1d-array) pairs. Useful for power matrices with specified diagonals (constant power wye loads). If not specified, the diagonal elements are set to zero.

    source
    diff --git a/v0.15.1/search.html b/v0.15.1/search.html new file mode 100644 index 000000000..e71a7902d --- /dev/null +++ b/v0.15.1/search.html @@ -0,0 +1,2 @@ + +Search · PowerModelsDistribution diff --git a/v0.15.1/search_index.js b/v0.15.1/search_index.js new file mode 100644 index 000000000..cfb42248b --- /dev/null +++ b/v0.15.1/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"reference/internal.html#Internal-Functions","page":"Internal Functions","title":"Internal Functions","text":"","category":"section"},{"location":"reference/internal.html","page":"Internal Functions","title":"Internal Functions","text":"Modules = [PowerModelsDistribution]\nPublic = false","category":"page"},{"location":"reference/internal.html#PowerModelsDistribution._1to1_maps","page":"Internal Functions","title":"PowerModelsDistribution._1to1_maps","text":"items that are mapped one-to-one from engineering to math models\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._CPF_COMPONENT_INTERFACES","page":"Internal Functions","title":"PowerModelsDistribution._CPF_COMPONENT_INTERFACES","text":"A mapping of supported component types to their functional interfaces.\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._array_delimiters","page":"Internal Functions","title":"PowerModelsDistribution._array_delimiters","text":"different acceptable delimiters for arrays\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._conductor_matrix","page":"Internal Functions","title":"PowerModelsDistribution._conductor_matrix","text":"field names that should become multi-conductor matrix not arrays\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._conductorless","page":"Internal Functions","title":"PowerModelsDistribution._conductorless","text":"field names that should not be multi-conductor values\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._convert_to_meters","page":"Internal Functions","title":"PowerModelsDistribution._convert_to_meters","text":"conversion factors for units to meters\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._double_operators","page":"Internal Functions","title":"PowerModelsDistribution._double_operators","text":"two number operators for reverse polish notation\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss2pmd_capcontrol_type","page":"Internal Functions","title":"PowerModelsDistribution._dss2pmd_capcontrol_type","text":"dss to pmd capcontrol type\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss2pmd_load_model","page":"Internal Functions","title":"PowerModelsDistribution._dss2pmd_load_model","text":"dss to pmd load model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_array_regex","page":"Internal Functions","title":"PowerModelsDistribution._dss_array_regex","text":"regex for dss arrays\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_cmd_buscoords_regex","page":"Internal Functions","title":"PowerModelsDistribution._dss_cmd_buscoords_regex","text":"regex for dss 'buscoords' command\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_cmd_more_regex","page":"Internal Functions","title":"PowerModelsDistribution._dss_cmd_more_regex","text":"regex for dss 'more' command\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_cmd_new_regex","page":"Internal Functions","title":"PowerModelsDistribution._dss_cmd_new_regex","text":"regex for dss 'new' command\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_cmd_set_regex","page":"Internal Functions","title":"PowerModelsDistribution._dss_cmd_set_regex","text":"regex for dss 'set' command\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_control_objects","page":"Internal Functions","title":"PowerModelsDistribution._dss_control_objects","text":"all objects that define controls\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_data_objects","page":"Internal Functions","title":"PowerModelsDistribution._dss_data_objects","text":"all data holding objects\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_edge_objects","page":"Internal Functions","title":"PowerModelsDistribution._dss_edge_objects","text":"all edge types that can help define buses\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_matrix_regex","page":"Internal Functions","title":"PowerModelsDistribution._dss_matrix_regex","text":"regex for dss matrices\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_monitor_objects","page":"Internal Functions","title":"PowerModelsDistribution._dss_monitor_objects","text":"all objects that provide montoring\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_node_objects","page":"Internal Functions","title":"PowerModelsDistribution._dss_node_objects","text":"all node types that can help define buses\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_property_renames","page":"Internal Functions","title":"PowerModelsDistribution._dss_property_renames","text":"collection of dss properties that have been renamed (i.e., deprecated)\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_rpn_array_sep_regex","page":"Internal Functions","title":"PowerModelsDistribution._dss_rpn_array_sep_regex","text":"regex for dss rpn arrays\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_short_prop_names_map","page":"Internal Functions","title":"PowerModelsDistribution._dss_short_prop_names_map","text":"const built at import of short property names\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_supported_commands","page":"Internal Functions","title":"PowerModelsDistribution._dss_supported_commands","text":"supported dss commands\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_supported_components","page":"Internal Functions","title":"PowerModelsDistribution._dss_supported_components","text":"components currently supported for automatic data type parsing\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._dss_unsupported_commands","page":"Internal Functions","title":"PowerModelsDistribution._dss_unsupported_commands","text":"unsupported dss commands\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._eng_edge_elements","page":"Internal Functions","title":"PowerModelsDistribution._eng_edge_elements","text":"list of edge type elements in the engineering model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._eng_model_checks","page":"Internal Functions","title":"PowerModelsDistribution._eng_model_checks","text":"data check functions for the engineering data model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._eng_model_dtypes","page":"Internal Functions","title":"PowerModelsDistribution._eng_model_dtypes","text":"Data types of accepted fields in the engineering data model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._eng_model_req_fields","page":"Internal Functions","title":"PowerModelsDistribution._eng_model_req_fields","text":"required fields in the engineering data model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._eng_node_elements","page":"Internal Functions","title":"PowerModelsDistribution._eng_node_elements","text":"list of nodal type elements in the engineering model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._like_exclusions","page":"Internal Functions","title":"PowerModelsDistribution._like_exclusions","text":"properties that should be excluded from being overwritten during the application of like\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._loss_model_objects","page":"Internal Functions","title":"PowerModelsDistribution._loss_model_objects","text":"collect of components and their properties that define loss models when transforming to the MATHEMATICAL model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._math_dispatchable_elements","page":"Internal Functions","title":"PowerModelsDistribution._math_dispatchable_elements","text":"list of math asset types that are dispatchable\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._math_edge_elements","page":"Internal Functions","title":"PowerModelsDistribution._math_edge_elements","text":"list of edge type elements in the engineering model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._math_node_elements","page":"Internal Functions","title":"PowerModelsDistribution._math_node_elements","text":"list of nodal type elements in the engineering model\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._pmd_math_global_keys","page":"Internal Functions","title":"PowerModelsDistribution._pmd_math_global_keys","text":"list of multinetwork keys that belong at the root level\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#PowerModelsDistribution._single_operators","page":"Internal Functions","title":"PowerModelsDistribution._single_operators","text":"single number operators in reverse polish notation\n\n\n\n\n\n","category":"constant"},{"location":"reference/internal.html#Base.delete!-Union{Tuple{T}, Tuple{T, String}} where T<:InfrastructureObject","page":"Internal Functions","title":"Base.delete!","text":"Base.delete! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.delete!-Union{Tuple{T}, Tuple{T, Symbol}} where T<:InfrastructureObject","page":"Internal Functions","title":"Base.delete!","text":"Base.delete! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.eltype-Tuple{T} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.eltype","text":"Base.eltype for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.get-Union{Tuple{T}, Tuple{T, String, Any}} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.get","text":"Base.get for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.getindex-Union{Tuple{T}, Tuple{T, String}} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.getindex","text":"Base.getindex for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.getproperty-Tuple{Any, String}","page":"Internal Functions","title":"Base.getproperty","text":"Base.getproperty for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.haskey-Union{Tuple{T}, Tuple{T, String}} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.haskey","text":"Base.haskey for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.isempty-Tuple{T} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.isempty","text":"Base.isempty for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.iterate-Union{Tuple{T}, Tuple{T, Int64}} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.iterate","text":"Base.iterate for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.keys-Tuple{T} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.keys","text":"Base.keys for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.keytype-Tuple{InfrastructureModel}","page":"Internal Functions","title":"Base.keytype","text":"Base.keytype for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.length-Tuple{T} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.length","text":"Base.length for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.merge!-Union{Tuple{T}, Tuple{T, T}} where T<:DssObject","page":"Internal Functions","title":"Base.merge!","text":"Base.merge! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.parse-Union{Tuple{T}, Tuple{Type{T}, String}} where T<:CapControlType","page":"Internal Functions","title":"Base.parse","text":"Parses dss capacitor control type into CapControlType enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.parse-Union{Tuple{T}, Tuple{Type{T}, String}} where T<:ConnConfig","page":"Internal Functions","title":"Base.parse","text":"Parses dss conn properties into ConnConfig enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.parse-Union{Tuple{T}, Tuple{Type{T}, String}} where T<:LoadModel","page":"Internal Functions","title":"Base.parse","text":"Parses dss load model into LoadModel enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.parse-Union{Tuple{T}, Tuple{Type{T}, String}} where T<:Status","page":"Internal Functions","title":"Base.parse","text":"Parses dss enabled property into Status enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.parse-Union{Tuple{T}, Tuple{Type{T}, String}} where T<:String","page":"Internal Functions","title":"Base.parse","text":"parser to pass through String\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.parse-Union{Tuple{T}, Tuple{subtype}, Tuple{Type{T}, String}} where {subtype, T<:Matrix{subtype}}","page":"Internal Functions","title":"Base.parse","text":"parses a dss type matrix into Matrix{T}\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.parse-Union{Tuple{T}, Tuple{subtype}, Tuple{Type{T}, String}} where {subtype, T<:Vector{subtype}}","page":"Internal Functions","title":"Base.parse","text":"parses a dss type vector into Vector{T}\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.setindex!-Union{Tuple{T}, Tuple{U}, Tuple{T, U, String}} where {U, T<:Union{InfrastructureObject, InfrastructureModel}}","page":"Internal Functions","title":"Base.setindex!","text":"Base.setindex! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.setproperty!-Tuple{Any, String, Any}","page":"Internal Functions","title":"Base.setproperty!","text":"Base.setproperty! for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.setproperty!-Tuple{DssObject, String, String, Type}","page":"Internal Functions","title":"Base.setproperty!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.show-Union{Tuple{T}, Tuple{IO, MIME{Symbol(\"text/plain\")}, T}} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.show","text":"Base.show variant for InfrastructureModel,InfrastructureObject to make them Dict-like\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.show-Union{Tuple{T}, Tuple{IO, T}} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.show","text":"Base.show variant for InfrastructureModel,InfrastructureObject to make them Dict-like\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.summary-Union{Tuple{T}, Tuple{IO, T}} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.summary","text":"Base.summary for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.valtype-Tuple{T} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"Base.valtype","text":"Base.valtype for InfrastructureModel,InfrastructureObject to give them Dict-like behavior\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.zero-Tuple{Type{Char}}","page":"Internal Functions","title":"Base.zero","text":"Base.zero for Char\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.zero-Tuple{Type{ConnConfig}}","page":"Internal Functions","title":"Base.zero","text":"Base.zero for ConnConfig enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.zero-Tuple{Type{Dispatchable}}","page":"Internal Functions","title":"Base.zero","text":"Base.zero for Dispatchable enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.zero-Tuple{Type{LoadModel}}","page":"Internal Functions","title":"Base.zero","text":"Base.zero for LoadModel enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.zero-Tuple{Type{ShuntModel}}","page":"Internal Functions","title":"Base.zero","text":"Base.zero for ShuntModel enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.zero-Tuple{Type{Status}}","page":"Internal Functions","title":"Base.zero","text":"Base.zero for Status enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.zero-Tuple{Type{String}}","page":"Internal Functions","title":"Base.zero","text":"Base.zero for String\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#Base.zero-Tuple{Type{SwitchState}}","page":"Internal Functions","title":"Base.zero","text":"Base.zero for SwitchState enum\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#InfrastructureModels.build_solution_values-Tuple{JuMP.Containers.DenseAxisArray{var\"#s1566\", 1, Ax, L} where {var\"#s1566\", Ax, L<:Tuple{JuMP.Containers._AxisLookup}}}","page":"Internal Functions","title":"InfrastructureModels.build_solution_values","text":"custom build_solution_values for generic dense axis arrays\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#InfrastructureModels.build_solution_values-Tuple{JuMP.Containers.DenseAxisArray{var\"#s1566\", 1, Ax, L} where {var\"#s1566\"<:JuMP.GenericAffExpr, Ax, L<:Tuple{JuMP.Containers._AxisLookup}}}","page":"Internal Functions","title":"InfrastructureModels.build_solution_values","text":"custom build_solution_values for multiconductor (vector) generic affine expressions\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#InfrastructureModels.build_solution_values-Tuple{JuMP.Containers.DenseAxisArray{var\"#s1566\", 1, Ax, L} where {var\"#s1566\"<:JuMP.NonlinearExpression, Ax, L<:Tuple{JuMP.Containers._AxisLookup}}}","page":"Internal Functions","title":"InfrastructureModels.build_solution_values","text":"custom build_solution_values for multiconductor (vector) nonlinear expressions\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#InfrastructureModels.build_solution_values-Tuple{JuMP.Containers.DenseAxisArray{var\"#s1566\", 1, Ax, L} where {var\"#s1566\"<:JuMP.VariableRef, Ax, L<:Tuple{JuMP.Containers._AxisLookup}}}","page":"Internal Functions","title":"InfrastructureModels.build_solution_values","text":"custom build_solution_values for multiconductor (vector) variables\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#InfrastructureModels.build_solution_values-Tuple{JuMP.Containers.DenseAxisArray{var\"#s1566\", 1, Ax, L} where {var\"#s1566\"<:Number, Ax, L<:Tuple{JuMP.Containers._AxisLookup}}}","page":"Internal Functions","title":"InfrastructureModels.build_solution_values","text":"custom build_solution_values for multiconductor (vector) constants\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#InfrastructureModels.build_solution_values-Tuple{LinearAlgebra.Symmetric{JuMP.VariableRef, Matrix{JuMP.VariableRef}}}","page":"Internal Functions","title":"InfrastructureModels.build_solution_values","text":"custom build_solution_values for multiconductor (vector) constants\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#InfrastructureModels.solution_preprocessor-Tuple{AbstractUnbalancedPowerModel, Dict}","page":"Internal Functions","title":"InfrastructureModels.solution_preprocessor","text":"Definition of the default solution preprocessor for PowerModelsDistribution\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._add_eng_obj!-Tuple{Dict{String}, String, Any, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._add_eng_obj!","text":"add engineering data object to engineering data model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._add_gen_cost_model!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._add_gen_cost_model!","text":"convert cost model names\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._add_implicit_absolute_bounds!-Tuple{Any, Vector}","page":"Internal Functions","title":"PowerModelsDistribution._add_implicit_absolute_bounds!","text":"When a terminal is grounded, any pairwise bounds it occurs in imply an absolute bound for the other terminal in the pair. This method converts such pairwise bounds to absolute ones.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._add_unused_kwargs!-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._add_unused_kwargs!","text":"adds kwargs that were specified but unused by the required defaults to the component\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._adjust_line_limits!-Tuple{Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._adjust_line_limits!","text":"_adjust_line_limits!(data_eng::Dict{String,<:Any}, mult::Real)\n\nMultiplies limits (sm_ub and/or cm_ub) on line objects (line, linecode, switch) by a multiplier mult\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._adjust_small_line_admittances!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._adjust_small_line_admittances!","text":"_adjust_small_line_admittances!(data_eng::Dict{String,<:Any}; min_admittance_val::Real=1e-2, replace_admittance_val::Real=0.0)\n\nReplaces admittances (gfr, gto, bfr, bto) on lines, linecodes, and switches lower than min_admittance_val with replace_admittance_val.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._adjust_small_line_impedances!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._adjust_small_line_impedances!","text":"_adjust_small_line_impedances!(data_eng::Dict{String,<:Any}; min_impedance_val::Real=1e-2, replace_impedance_val::Real=0.0)\n\nReplaces impedances (rs, xs) on lines, linecodes, and switches lower than min_impedance_val with replace_impedance_val.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._adjust_small_line_lengths!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._adjust_small_line_lengths!","text":"_adjust_small_line_lengths!(data_eng::Dict{String,<:Any}; min_length_val::Real=25.0, replace_length_val::Real=0.0)\n\nReplaces length on lines, switches lower than min_length_val with replace_length_val.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._adjust_transformer_limits!-Tuple{Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._adjust_transformer_limits!","text":"_adjust_transformer_limits!(data_eng::Dict{String,<:Any}, mult::Real)\n\nMultiplies limits (sm_ub and/or cm_ub) on transformer objects by a multiplier mult\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._admittance_conversion-Tuple{Dict{String}, Dict{String}, String}","page":"Internal Functions","title":"PowerModelsDistribution._admittance_conversion","text":"converts admittance by multiplying by 2πωl\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_filter!-Tuple{Dict{String}, Vector{String}, Int64, Union{BitArray, Array}}","page":"Internal Functions","title":"PowerModelsDistribution._apply_filter!","text":"Filters out values of a vector or matrix for certain properties (transformer winding variant)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_filter!-Tuple{Dict{String}, Vector{String}, Union{BitArray, Array}}","page":"Internal Functions","title":"PowerModelsDistribution._apply_filter!","text":"Filters out values of a vector or matrix for certain properties\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_func_vals-Tuple{Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._apply_func_vals","text":"helper to apply function values\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_kron_reduction!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._apply_kron_reduction!","text":"_apply_kron_reduction!(data_eng::Dict{String,<:Any}; kr_phases::Union{Vector{Int},Vector{String}}=[1,2,3], kr_neutral::Union{Int,String}=4)\n\nApplies a Kron Reduction to the network, reducing out the kr_neutral, leaving only the kr_phases\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_linecode!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._apply_linecode!","text":"applies a linecode to a line in preparation for converting to mathematical model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_phase_projection!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._apply_phase_projection!","text":"_apply_phase_projection!(data_eng::Dict{String,<:Any})\n\npad matrices and vectors to max number of conductors\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_phase_projection_delta!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._apply_phase_projection_delta!","text":"_apply_phase_projection_delta!(data_eng::Dict{String,<:Any})\n\nphase projection for components where unprojected states are not yet supported (delta configurations).\n\nSee apply_phase_projection!\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_property_pairs-Union{Tuple{T}, Tuple{T, Vector{Pair{String, String}}, OpenDssDataModel, OpenDssRawDataModel}} where T<:DssLinegeometry","page":"Internal Functions","title":"PowerModelsDistribution._apply_property_pairs","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_property_pairs-Union{Tuple{T}, Tuple{T, Vector{Pair{String, String}}, OpenDssDataModel, OpenDssRawDataModel}} where T<:DssObject","page":"Internal Functions","title":"PowerModelsDistribution._apply_property_pairs","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_property_pairs-Union{Tuple{T}, Tuple{T, Vector{Pair{String, String}}, OpenDssDataModel, OpenDssRawDataModel}} where T<:DssRegcontrol","page":"Internal Functions","title":"PowerModelsDistribution._apply_property_pairs","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_property_pairs-Union{Tuple{T}, Tuple{T, Vector{Pair{String, String}}, OpenDssDataModel, OpenDssRawDataModel}} where T<:Union{DssGenerator, DssLoad, DssPvsystem, DssStorage}","page":"Internal Functions","title":"PowerModelsDistribution._apply_property_pairs","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_property_pairs-Union{Tuple{T}, Tuple{T, Vector{Pair{String, String}}, OpenDssDataModel, OpenDssRawDataModel}} where T<:Union{DssGrowthshape, DssLoadshape, DssSpectrum, DssXycurve}","page":"Internal Functions","title":"PowerModelsDistribution._apply_property_pairs","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_property_pairs-Union{Tuple{T}, Tuple{T, Vector{Pair{String, String}}, OpenDssDataModel, OpenDssRawDataModel}} where T<:Union{DssTransformer, DssXfmrcode}","page":"Internal Functions","title":"PowerModelsDistribution._apply_property_pairs","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_property_pairs-Union{Tuple{T}, Tuple{T, Vector{Pair{String, String}}}} where T<:DssOptions","page":"Internal Functions","title":"PowerModelsDistribution._apply_property_pairs","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_voltage_angle_difference_bounds!","page":"Internal Functions","title":"PowerModelsDistribution._apply_voltage_angle_difference_bounds!","text":"_apply_voltage_angle_difference_bounds!(eng::Dict{String,<:Any}, vad::Real=5.0)\n\nApplies voltage angle difference bound given by vad::Real in degrees (i.e., the allowed drift of angle from one end of a line to another) to all lines. By default, vad=5.0.\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._apply_voltage_bounds!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._apply_voltage_bounds!","text":"_apply_voltage_bounds!(data_eng::Dict{String,<:Any}; vm_lb::Union{Real,Missing}=0.9, vm_ub::Union{Real,Missing}=1.1)\n\nadd voltage bounds to all buses based on per-unit upper (vm_ub) and lower (vm_lb), scaled by the bus's voltage based\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._apply_xfmrcode!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._apply_xfmrcode!","text":"applies a xfmrcode to a transformer in preparation for converting to mathematical model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._bank_transformers!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._bank_transformers!","text":"Combines transformers with 'bank' keyword into a single transformer\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._barrel_roll-Union{Tuple{T}, Tuple{Vector{T}, Int64}} where T","page":"Internal Functions","title":"PowerModelsDistribution._barrel_roll","text":"shifts a vector by shift spots to the left\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._biggest_der-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._biggest_der","text":"finds the largest active generation asset (gen, storage) in an island\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._biggest_generator-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._biggest_generator","text":"find the largest active generator in a collection of generators\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._bts_to_start_voltage-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._bts_to_start_voltage","text":"_bts_to_start_voltage(\n dm::Dict\n)\n\nAssigns the initialisation voltages to appropriate bus terminals.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_bus_shunt_matrices-Tuple{AbstractUnbalancedPowerModel, Int64, Vector{Int64}, Vector{<:Tuple{Int64, Vector{Int64}}}}","page":"Internal Functions","title":"PowerModelsDistribution._build_bus_shunt_matrices","text":"helper function to build bus shunt matrices for power balance constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_loss_model!-Tuple{Dict{String}, String, Vector{String}, Vector{Float64}, Dict{Tuple{Int64, Int64}, ComplexF64}, ComplexF64, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._build_loss_model!","text":"loss model builder for transformer decomposition\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_mc_mn_opb-Tuple{AbstractUnbalancedPowerModel}","page":"Internal Functions","title":"PowerModelsDistribution._build_mc_mn_opb","text":"_build_mc_mn_opb(pm::AbstractUnbalancedPowerModel)\n\nConstructor for Optimal Power Balance\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_mc_osw-Tuple{AbstractUBFModels}","page":"Internal Functions","title":"PowerModelsDistribution._build_mc_osw","text":"constructor for branch flow osw\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_mc_osw-Tuple{AbstractUnbalancedIVRModel}","page":"Internal Functions","title":"PowerModelsDistribution._build_mc_osw","text":"constructor for OSW in current-voltage variable space\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_mc_osw-Tuple{AbstractUnbalancedPowerModel}","page":"Internal Functions","title":"PowerModelsDistribution._build_mc_osw","text":"Constructor for Optimal Switching\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_mc_osw_mi-Tuple{AbstractUBFModels}","page":"Internal Functions","title":"PowerModelsDistribution._build_mc_osw_mi","text":"_build_mc_osw_mi(pm::AbstractUBFModels)\n\nconstructor for mixed-integer branch flow osw\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_mc_osw_mi-Tuple{AbstractUnbalancedPowerModel}","page":"Internal Functions","title":"PowerModelsDistribution._build_mc_osw_mi","text":"Constructor for Optimal Switching\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._build_time_series_reference!-Tuple{Dict{String}, Union{DssGenerator, DssLoad, DssPvsystem, DssStorage}, OpenDssDataModel, String, String, String}","page":"Internal Functions","title":"PowerModelsDistribution._build_time_series_reference!","text":"helper function to properly reference time series variables from opendss\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_branch_current_max-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_branch_current_max","text":"Returns a total (shunt+series) current magnitude bound for the from and to side of a branch. The total power rating also implies a current bound through the lower bound on the voltage magnitude of the connected buses.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_branch_current_max_frto-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_branch_current_max_frto","text":"Returns a total (shunt+series) current magnitude bound for the from and to side of a branch. The total power rating also implies a current bound through the lower bound on the voltage magnitude of the connected buses.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_branch_power_max-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_branch_power_max","text":"Returns a total (shunt+series) power magnitude bound for the from and to side of a branch. The total current rating also implies a current bound through the upper bound on the voltage magnitude of the connected buses.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_branch_power_max_frto-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_branch_power_max_frto","text":"Returns a total (shunt+series) power magnitude bound for the from and to side of a branch. The total current rating also implies a current bound through the upper bound on the voltage magnitude of the connected buses.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_branch_series_current_max-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_branch_series_current_max","text":"Returns a valid series current magnitude bound for a branch.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_bus_vm_ll_bounds-Tuple{Dict}","page":"Internal Functions","title":"PowerModelsDistribution._calc_bus_vm_ll_bounds","text":"Returns bounds in line-to-line bounds on the voltage magnitude. If these are not part of the problem specification, then a valid upper bound is implied by the line-to-neutral bounds, but a lower bound (greater than zero) is not. Therefore, a default lower bound is then used, specified by the keyword argument vdmin_eps. The returned bounds are for the pairs 1->2, 2->3, 3->1\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_comp_lines-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_comp_lines","text":"_calc_comp_lines(component::Dict{String,<:Any})\n\ncompute lines in m and b from from pwl cost models\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_connected_components_eng-Tuple{Any}","page":"Internal Functions","title":"PowerModelsDistribution._calc_connected_components_eng","text":"computes the connected components of the network graph returns a set of sets of bus ids, each set is a connected component\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_connected_components_math-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_connected_components_math","text":"computes the connected components of the network graph returns a set of sets of bus ids, each set is a connected component\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_gen_current_max-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_gen_current_max","text":"Returns a current magnitude bound for the generators.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_ground_shunt_admittance_matrix-Union{Tuple{T}, Tuple{Vector{Int64}, Matrix{T}, Int64}} where T<:Number","page":"Internal Functions","title":"PowerModelsDistribution._calc_ground_shunt_admittance_matrix","text":"Given a set of terminals 'cnds' with associated shunt admittance 'Y', this method will calculate the reduced admittance matrix if terminal 'ground' is grounded.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_load_current_magnitude_bounds-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_load_current_magnitude_bounds","text":"Returns magnitude bounds for the current going through the load.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_load_current_max-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_load_current_max","text":"Returns a magnitude bound for the current going through the load.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_load_pq_bounds-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_load_pq_bounds","text":"Calculates lower and upper bounds for the loads themselves (not the power withdrawn at the bus).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_load_vbounds-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_load_vbounds","text":"Returns the voltage magnitude bounds for the individual load elements in a multiphase load. These are inferred from vmin/vmax for wye loads and from calcbusvmll_bounds for delta loads.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_max_cost_index-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_max_cost_index","text":"_calc_max_cost_index(data::Dict{String,<:Any})\n\nComputes maximum cost index of subnetworks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_shunt-Tuple{Vector{Int64}, Vector{Int64}, Vector{<:Union{Real, Vector{<:Real}}}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_shunt","text":"Given a set of addmittances 'y' connected from the conductors 'fcnds' to the conductors 'tcnds', this method will return a list of conductors 'cnd' and a matrix 'Y', which will satisfy I[cnds] = Y*V[cnds].\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_transformer_current_max_frto-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_transformer_current_max_frto","text":"Returns a current magnitude bound for the from and to side of a transformer. The total power rating also implies a current bound through the lower bound on the voltage magnitude of the connected buses.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_transformer_power_ub_frto-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_transformer_power_ub_frto","text":"Returns a power magnitude bound for the from and to side of a transformer. The total current rating also implies a current bound through the upper bound on the voltage magnitude of the connected buses.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._calc_voltage_bases-Tuple{Dict{String}, Dict{String, <:Real}, Vector{String}}","page":"Internal Functions","title":"PowerModelsDistribution._calc_voltage_bases","text":"_calc_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real}, edge_elements::Vector{String})::Tuple{Dict,Dict}\n\nCalculates voltage bases for each voltage zone for buses and branches given a list of edge_elements\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._cc_dfs-Union{Tuple{T}, Tuple{T, Dict{T, Vector{T}}, Dict{T, Set{T}}, Set{T}}} where T<:Union{Int64, String}","page":"Internal Functions","title":"PowerModelsDistribution._cc_dfs","text":"DFS on a graph\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_branch_loops-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._check_branch_loops","text":"checks that all branches connect two distinct buses\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_bus-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_bus","text":"bus data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_bus_and_terminals","page":"Internal Functions","title":"PowerModelsDistribution._check_bus_and_terminals","text":"checks bus_name exists and has terminals\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._check_configuration_infer_dim-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._check_configuration_infer_dim","text":"checks the connection configuration and infers the dimensions of the connection (number of connected terminals)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_connectivity-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._check_connectivity","text":"checks connectivity of object\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_connectivity-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._check_connectivity","text":"checks that all buses are unique and other components link to valid buses\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_eng_component_dtypes-Tuple{Dict{String}, String, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_eng_component_dtypes","text":"checks that an engineering model component has the correct data types\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_equal-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._check_equal","text":"checks if data structures are equivalent, and if not, will enumerate the differences\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_generator-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_generator","text":"generator data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_has_keys-Tuple{Dict{String}, Vector{String}}","page":"Internal Functions","title":"PowerModelsDistribution._check_has_keys","text":"checks that a component has fields\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_has_size-Tuple{Dict{String}, Vector{String}, Union{Int64, Tuple}}","page":"Internal Functions","title":"PowerModelsDistribution._check_has_size","text":"check that fields has size data_size\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_line-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_line","text":"line data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_linecode-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_linecode","text":"linecode data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_load-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_load","text":"load data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_load_needs_cone-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._check_load_needs_cone","text":"Returns a Bool, indicating whether the convex hull of the voltage-dependent relationship needs a cone inclusion constraint.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_same_size-Tuple{Dict{String}, Vector{String}}","page":"Internal Functions","title":"PowerModelsDistribution._check_same_size","text":"check that all data in fields have the same size\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_shunt-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_shunt","text":"shunt data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_shunt_capacitor-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_shunt_capacitor","text":"shunt capacitor data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_transformer-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_transformer","text":"Transformer, n-windings three-phase lossy data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_var_keys-NTuple{4, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_var_keys","text":"checks if a sufficient number of variables exist for the given keys collection\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._check_voltage_source-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._check_voltage_source","text":"voltage source data checks\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._collect_nw_bus_lookups!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._collect_nw_bus_lookups!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._collect_nw_maps!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._collect_nw_maps!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._compose_yprim_banked_ideal_transformers_Dyg-Tuple{Vector{<:Real}, Vector{Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, Vector{Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._compose_yprim_banked_ideal_transformers_Dyg","text":"composeyprimbankedidealtransformersDyg( ts::Vector, npairsfr::Tuple, npairsto::Tuple, ppm::Float )\n\nModifies ideal delta-wye_grounded transformers to avoid singularity error, through the ppm value, inspired by OpenDSS.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._compose_yprim_banked_ideal_transformers_Ygyg-Tuple{Vector{<:Real}, Vector{Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, Vector{Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._compose_yprim_banked_ideal_transformers_Ygyg","text":"composeyprimbankedidealtransformersYgyg( ts::Vector, npairsfr::Tuple, npairsto::Tuple, ppm::Float )\n\nModifies ideal wyegrounded-wyegrounded transformers to avoid singularity error, through the ppm value, inspired by OpenDSS.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._compose_yprim_banked_ideal_transformers_Yy-Tuple{Vector{<:Real}, Vector{Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, Vector{Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._compose_yprim_banked_ideal_transformers_Yy","text":"_compose_yprim_banked_ideal_transformers_Yy(\n ts::Vector,\n npairs_fr::Tuple,\n npairs_to::Tuple,\n ppm::Float\n)\n\nModifies ideal wye-wye transformers to avoid singularity error, through the ppm value, inspired by OpenDSS.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._compute_Uv-Tuple{PowerFlowData}","page":"Internal Functions","title":"PowerModelsDistribution._compute_Uv","text":"_compute_Uv(\n pfd::PowerFlowData,\n max_iter::Int,\n stat_tol::Float,\n verbose::Bool\n)\n\nComputes a nonlinear AC power flow in rectangular coordinates based on the admittance matrix of the network data using the fixed-point current injection method (See https://arxiv.org/abs/2305.04405). Returns a solution data structure in PowerModelsDistribution Dict format.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._compute_bus_type-Tuple{Int64, Int64, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._compute_bus_type","text":"computes the bus type based on existing bustype, the status of the generation object, and the controlmode\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._compute_mc_pf-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._compute_mc_pf","text":"_compute_mc_pf(\n data_math::Dict{String,<:Any};\n v_start::Union{Dict{<:Any,<:Any},Missing}=missing,\n explicit_neutral::Bool=false,\n max_iter::Int=100,\n stat_tol::Real=1E-8,\n verbose::Bool=false\n)::Dict{String,Any}\n\nComputes native power flow and outputs the result dict (See https://arxiv.org/abs/2305.04405).\n\nAbbreviations:\n\nntype: node type (variable, fixed, grounded, virtual)\nbts: bus-terminals for the component\nns: nodes\nvns: virtual nodes\nnr_vns: number of virtual nodes\ny_prim: primitive admittance matrix for the component\ncnlfunc: nonlinear compensation current function handle for the component\nctotsfunc: total current function handle for the component\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._convert_grounding-NTuple{4, Any}","page":"Internal Functions","title":"PowerModelsDistribution._convert_grounding","text":"lossy grounding to perfect grounding and shunts\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._convert_model_to_dict-Tuple{Union{InfrastructureObject, InfrastructureModel}}","page":"Internal Functions","title":"PowerModelsDistribution._convert_model_to_dict","text":"Helper function to convert InfrastructureModel,InfrastructureObject into Dict{String,Any}\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._correct_branch_directions!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._correct_branch_directions!","text":"checks that all parallel branches have the same orientation\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._correct_bus_types!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._correct_bus_types!","text":"checks bus types are suitable for a power flow study, if not, fixes them. the primary checks are that all type 2 buses (i.e., PV) have a connected and active generator and there is a single type 3 bus (i.e., slack bus) with an active connected generator. Assumes that the network is a single connected component\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._correct_cost_function!-NTuple{5, Any}","page":"Internal Functions","title":"PowerModelsDistribution._correct_cost_function!","text":"throws warnings if cost functions are malformed\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._correct_cost_functions!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._correct_cost_functions!","text":"throws warnings if cost functions are malformed\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._correct_mc_thermal_limits!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._correct_mc_thermal_limits!","text":"_correct_mc_thermal_limits!(data::Dict{String,<:Any})\n\nchecks that each branch has non-negative thermal ratings and removes zero thermal ratings\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._correct_mc_voltage_angle_differences!","page":"Internal Functions","title":"PowerModelsDistribution._correct_mc_voltage_angle_differences!","text":"_correct_mc_voltage_angle_differences!(data::Dict{String,<:Any}, default_pad::Real=deg2rad(10.0))\n\nchecks that voltage angle differences are within 90 deg., if not tightens to a default of 10deg (adjustable)\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._cpf_branch_interface-Tuple{Dict{String}, Dict, Bool, Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._cpf_branch_interface","text":"_cpf_branch_interface(\n branch::Dict,\n v_start::Dict,\n explicit_neutral::Bool,\n line_vbase::Dict,\n sbase::Float\n)\n\nBranch component interface outputs branch primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.1).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._cpf_generator_interface-Tuple{Dict{String}, Dict, Bool, Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._cpf_generator_interface","text":"_cpf_generator_interface(\n gen::Dict,\n v_start::Dict,\n explicit_neutral::Bool,\n line_vbase::Dict,\n sbase::Float\n)\n\nGenerator component interface outputs generator primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.4 and 4.5).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._cpf_load_interface-Tuple{Dict{String}, Dict, Bool, Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._cpf_load_interface","text":"_cpf_load_interface(\n load::Dict,\n v_start::Dict,\n explicit_neutral::Bool,\n line_vbase::Dict,\n sbase::Float\n)\n\nLoad component interface outputs load primitive Y matrix (See https://arxiv.org/abs/2305.04405 Sections 4.4 and 4.5).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._cpf_shunt_interface-Tuple{Dict{String}, Dict, Bool, Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._cpf_shunt_interface","text":"_cpf_shunt_interface(\n shunt::Dict,\n v_start::Dict,\n explicit_neutral::Bool,\n line_vbase::Dict,\n sbase::Float\n)\n\nShunt component interface outputs shunt primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.2).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._cpf_storage_interface-Tuple{Dict{String}, Dict, Bool, Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._cpf_storage_interface","text":"_cpf_storage_interface(\n storage::Dict,\n v_start::Dict,\n explicit_neutral::Bool,\n line_vbase::Dict,\n sbase::Float\n)\n\nStorage component interface outputs storage primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.4 and 4.5).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._cpf_switch_interface-Tuple{Dict{String}, Dict, Bool, Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._cpf_switch_interface","text":"_cpf_switch_interface(\n switch::Dict,\n v_start::Dict,\n explicit_neutral::Bool,\n line_vbase::Dict,\n sbase::Float\n)\n\nBranch component interface outputs branch primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.2).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._cpf_transformer_interface-Tuple{Dict{String}, Dict, Bool, Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._cpf_transformer_interface","text":"_cpf_transformer_interface(\n tr::Dict,\n v_start::Dict,\n explicit_neutral::Bool,\n line_vbase::Dict,\n sbase::Float\n)\n\nTransformer component interface outputs transformer primitive Y matrix (See https://arxiv.org/abs/2305.04405 Section 4.3).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._discover_buses-Tuple{OpenDssDataModel}","page":"Internal Functions","title":"PowerModelsDistribution._discover_buses","text":"Discovers all of the buses (not separately defined in OpenDSS), from 'lines'\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._discover_terminals!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._discover_terminals!","text":"discovers all terminals in the network\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._discover_voltage_zones-Tuple{Dict{String}, Vector{String}}","page":"Internal Functions","title":"PowerModelsDistribution._discover_voltage_zones","text":"discover_voltage_zones(data_model::Dict{String,<:Any}, edge_elements::Vector{String})::Dict{Int,Set{Any}}\n\nfinds voltage zones by walking through the network and analyzing the transformers\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_bus!","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_bus!","text":"Adds nodes as buses to data_eng from data_dss\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_buscoords!-Tuple{Dict{String}, OpenDssDataModel}","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_buscoords!","text":"Parses buscoords lon,lat (if present) into their respective buses\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_capacitor!-Tuple{Dict{String}, OpenDssDataModel, Bool}","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_capacitor!","text":"Adds capacitors to data_eng from data_dss\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_capcontrol!-Tuple{Dict{String}, OpenDssDataModel, Bool}","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_capcontrol!","text":"Adds capcontrol to data_eng from data_dss\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_generator!","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_generator!","text":"Adds generators to data_eng from data_dss\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_line!-Tuple{Dict{String}, OpenDssDataModel, Bool}","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_line!","text":"Adds lines to data_eng from data_dss\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_linecode!-Tuple{Dict{String}, OpenDssDataModel, Bool}","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_linecode!","text":"Adds lines to data_eng from data_dss\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_load!","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_load!","text":"Adds loads to data_eng from data_dss\n\nConstant can still be scaled by other settings, fixed cannot Note that in the current feature set, fixed therefore equals constant\n\n1: Constant P and Q, default 2: Constant Z 3: Constant P and quadratic Q 4: Exponential 5: Constant I 6: Constant P and fixed Q\n\n7: Constant P and quadratic Q (i.e., fixed reactance)\n\n8: ZIP\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_loadshape!","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_loadshape!","text":"Adds loadshapes to data_eng from data_dss\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_pvsystem!","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_pvsystem!","text":"Adds pvsystems to data_eng from data_dss\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_reactor!-Tuple{Dict{String}, OpenDssDataModel, Bool}","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_reactor!","text":"Adds shunt reactors to data_eng from data_dss\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_regcontrol!-Tuple{Dict{String}, OpenDssDataModel, Bool}","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_regcontrol!","text":"Adds regcontrol to data_eng from data_dss\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_storage!","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_storage!","text":"Adds storage to data_eng from data_dss\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_transformer!-Tuple{Dict{String}, OpenDssDataModel, Bool, String}","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_transformer!","text":"Adds transformers to data_eng from data_dss\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_vsource!","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_vsource!","text":"Adds vsources to data_eng from data_dss\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._dss2eng_xfmrcode!","page":"Internal Functions","title":"PowerModelsDistribution._dss2eng_xfmrcode!","text":"Adds transformers to data_eng from data_dss\n\n\n\n\n\n","category":"function"},{"location":"reference/internal.html#PowerModelsDistribution._equivalance_center_tap!-Tuple{Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._equivalance_center_tap!","text":"_equivalance_center_tap!(transformer::Dict{String,<:Any}, data_eng::Dict{String,<:Any})\n\nRemoves center tap transformers based on Eq. (1) from Kersting's paper 'Center-Tapped Transformers and 120/240-V Secondary Models' Z0 = 0.5r_t + j0.8x_t\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._fill_matrix!-Union{Tuple{T}, Tuple{Matrix{T}, Vector{Vector{String}}}} where T","page":"Internal Functions","title":"PowerModelsDistribution._fill_matrix!","text":"Helper function for Base.parse for dss matrices\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._fill_vector!-Union{Tuple{T}, Tuple{Vector{T}, Vector{String}}} where T","page":"Internal Functions","title":"PowerModelsDistribution._fill_vector!","text":"Helper function for Base.parse for dss vectors\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._fix_arrays!-Tuple{Any, Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._fix_arrays!","text":"helper function to fix matrices (from vector of vectors) and vector dtypes\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._fix_dtypes!-Tuple{Dict}","page":"Internal Functions","title":"PowerModelsDistribution._fix_dtypes!","text":"recursive function to fix data types from data imported from json\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._fix_enums!-Tuple{Any, Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._fix_enums!","text":"helper function to convert stringified enums\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._fix_nulls!-Tuple{Any, Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._fix_nulls!","text":"helper function to fix null values from json (usually Inf or NaN)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._generate_short_property_names-Tuple{}","page":"Internal Functions","title":"PowerModelsDistribution._generate_short_property_names","text":"Helper function to generate 'short' property names\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._generate_vm_pairs-Tuple{Vector, ConnConfig, Real, Real}","page":"Internal Functions","title":"PowerModelsDistribution._generate_vm_pairs","text":"Generates pairwise bounds for oneport components.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_cncable_data-Tuple{OpenDssDataModel, Vector{String}}","page":"Internal Functions","title":"PowerModelsDistribution._get_cncable_data","text":"gets concentric neutral cable data for line geometry\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_complete_conductor_set-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._get_complete_conductor_set","text":"finds maximal set of ungrounded phases\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_conductor_indicator-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._get_conductor_indicator","text":"returns the conductor indicator for a ENGINEERING component\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_conductors_ordered-Tuple{AbstractString}","page":"Internal Functions","title":"PowerModelsDistribution._get_conductors_ordered","text":"Returns an ordered list of defined conductors. If ground=false, will omit any 0\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_delta_transformation_matrix-Tuple{Int64}","page":"Internal Functions","title":"PowerModelsDistribution._get_delta_transformation_matrix","text":"creates a delta transformation matrix\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_geometry_data-Tuple{OpenDssDataModel, String}","page":"Internal Functions","title":"PowerModelsDistribution._get_geometry_data","text":"gets line geometry data for line, including applying line spacing if specified\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_idxs-Tuple{Vector, Vector}","page":"Internal Functions","title":"PowerModelsDistribution._get_idxs","text":"Given a vector and a list of elements to find, this method will return a list of the positions of the elements in that vector.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_ilocs-Tuple{Vector, Any}","page":"Internal Functions","title":"PowerModelsDistribution._get_ilocs","text":"get locations of terminal in connections list\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases!-Tuple{DssEdgeObject}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases!-Tuple{DssGictransformer}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases!-Tuple{DssLinecode}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases!-Tuple{DssNodeObject}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases!-Tuple{DssTransformer}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases!-Tuple{DssXfmrcode}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases!-Tuple{Union{DssControlObject, DssDataObject}}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases-Tuple{AbstractString, AbstractString}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases","text":"returns number of phases implied by a two-bus (edge) object\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases-Tuple{AbstractString}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases","text":"returns number of phases implied by a single-bus (node) object\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_implied_nphases-Tuple{Vector{<:AbstractString}}","page":"Internal Functions","title":"PowerModelsDistribution._get_implied_nphases","text":"returns number of phases implied by a transformer object\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_line_impedance_parameters-Tuple{Dict{String, Any}, Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._get_line_impedance_parameters","text":"Obtain impedance parameters, directly or from linecode.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_math_obj-Tuple{Dict{String}, String}","page":"Internal Functions","title":"PowerModelsDistribution._get_math_obj","text":"returns component from the mathematical data model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_raw_fields-Tuple{Vector{Pair{String, String}}}","page":"Internal Functions","title":"PowerModelsDistribution._get_raw_fields","text":"Helper function to pull the specified properties from dss property pairs\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_spacing_data-Tuple{OpenDssDataModel, String}","page":"Internal Functions","title":"PowerModelsDistribution._get_spacing_data","text":"get line spacing data for line or line geometry\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_tight_absolute_voltage_magnitude_bounds-Tuple{Dict}","page":"Internal Functions","title":"PowerModelsDistribution._get_tight_absolute_voltage_magnitude_bounds","text":"Returns the tightest set of absolute voltage magnitude bounds, removing looser bounds which are implied by the tighter ones.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_tight_pairwise_voltage_magnitude_bounds-Tuple{Dict}","page":"Internal Functions","title":"PowerModelsDistribution._get_tight_pairwise_voltage_magnitude_bounds","text":"Returns the tightest set of pairwise voltage magnitude bounds, removing looser bounds which are implied by the tighter ones.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_tscable_data-Tuple{OpenDssDataModel, Vector{String}}","page":"Internal Functions","title":"PowerModelsDistribution._get_tscable_data","text":"gets tape shielded cable data for line geometry\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_v-Tuple{PowerFlowData, Vector{ComplexF64}, Union{Int64, Tuple{Int64, Int64}}}","page":"Internal Functions","title":"PowerModelsDistribution._get_v","text":"_get_v(\n pfd::struct,\n Vp::Vector,\n n::Union{Tuple, Int}\n)\n\nCalculates the voltage from PowerFlowData struct.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._get_wire_data-Tuple{OpenDssDataModel, Vector{String}}","page":"Internal Functions","title":"PowerModelsDistribution._get_wire_data","text":"gets overhead wire data for line geometry\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._has_nl_expression-Tuple{Any}","page":"Internal Functions","title":"PowerModelsDistribution._has_nl_expression","text":"helper to determine if expession has any Nonlinear terms\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._impedance_conversion-Tuple{Dict{String}, Dict{String}, String}","page":"Internal Functions","title":"PowerModelsDistribution._impedance_conversion","text":"converts impendance in Ohm/m by multiplying by length\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._import_all!-Tuple{Dict{String}, DssObject}","page":"Internal Functions","title":"PowerModelsDistribution._import_all!","text":"creates a dss dict inside object that imports all items in prop_order from dss_obj\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._infer_int_dim-Tuple{Vector, ConnConfig, Any}","page":"Internal Functions","title":"PowerModelsDistribution._infer_int_dim","text":"infer the internal dimension of a winding, load or generator based on the connections and the configuration\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._infer_int_dim_transformer-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._infer_int_dim_transformer","text":"infer the internal dimension for a transformer (only in the MATHEMATICAL data model format)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._infer_int_dim_unit-Tuple{Dict{String}, Any}","page":"Internal Functions","title":"PowerModelsDistribution._infer_int_dim_unit","text":"infer the internal dimension for a unit, i.e. any one-port component with connections and configuration properties\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._infer_neutral_terminals-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._infer_neutral_terminals","text":"Return a list of all implicit neutrals as a list of bus-terminal pairs. This is done by starting from a list of all terminals which are either a.connected to the neutral of wye-connected components; b. or are grounded. This initial list is then expanded to all terminals which are galvanically connected to terminals in the initial list.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._infer_partial_property_name-Union{Tuple{T}, Tuple{AbstractString, T}} where T<:DssObject","page":"Internal Functions","title":"PowerModelsDistribution._infer_partial_property_name","text":"Helper function to infer a full property name from a partial one\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._init_base_components!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._init_base_components!","text":"initializes the base components that are expected by powermodelsdistribution in the mathematical model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._init_dss_data-Tuple{}","page":"Internal Functions","title":"PowerModelsDistribution._init_dss_data","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._init_math_obj-Tuple{String, Any, Dict{String}, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._init_math_obj","text":"initializes the base math object of any type, and copies any one-to-one mappings\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._init_unmap_eng_obj!-Tuple{Dict{String}, String, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._init_unmap_eng_obj!","text":"initialization actions for unmapping\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._is_after-Tuple{Vector{Pair{String, String}}, String, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._is_after","text":"helper function to determine if property1 appears after property2 in the property pair list for objects that have windings\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._is_after-Tuple{Vector{Pair{String, String}}, String, String}","page":"Internal Functions","title":"PowerModelsDistribution._is_after","text":"helper function to determine if property1 appears after property2 in the property pair list\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._is_loadshape_split-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._is_loadshape_split","text":"checks if loadshape has both pmult and qmult\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._is_loadshape_split-Tuple{DssLoadshape}","page":"Internal Functions","title":"PowerModelsDistribution._is_loadshape_split","text":"checks if loadshape has both pmult and qmult\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._is_multiport_component-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._is_multiport_component","text":"Indicates whether the passed component has a multiport structure (e.g. transformers).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._is_oneport_component-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._is_oneport_component","text":"Indicates whether the passed component has a oneport structure (e.g. loads and generators).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._is_twoport_component-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._is_twoport_component","text":"Indicates whether the passed component has a twoport structure (e.g. lines and switches).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._isa_dss_array-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._isa_dss_array","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._isa_rpn-Tuple{AbstractString}","page":"Internal Functions","title":"PowerModelsDistribution._isa_rpn","text":"detects if expr is Reverse Polish Notation expression\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._kron-Union{Tuple{T}, Tuple{Matrix{T}, Int64}} where T<:Complex","page":"Internal Functions","title":"PowerModelsDistribution._kron","text":"_kron(Z::Matrix{T}, nconds::Int)::Matrix{T} where T <: Complex\n\nKron reduces impedance matrix down to size (nconds, nconds)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._kron-Union{Tuple{T}, Tuple{Matrix{T}, Matrix{T}, Int64}} where T<:Complex","page":"Internal Functions","title":"PowerModelsDistribution._kron","text":"_kron(Z::Matrix{T}, Y::Matrix{T}, nconds::Int)::Tuple{Matrix{T}, Matrix{T}} where T <: Complex\n\nKron reduces impedance and shunt admittance matrices down to size (nconds, nconds)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._kron_reduce_branch!-Tuple{Dict{String}, Vector{String}, Vector{String}, Vector{Int64}, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._kron_reduce_branch!","text":"performs kron reduction on branch\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._kron_reduce_branch-Tuple{Vector{Matrix}, Vector{Matrix}, Vector{Int64}, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._kron_reduce_branch","text":"performs kron reduction on branch - helper function\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._kron_reduce_implicit_neutrals!-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._kron_reduce_implicit_neutrals!","text":"_kron_reduce_implicit_neutrals!(data_eng::Dict{String,Any})::Dict{String,Any}\n\nKron-reduce all (implied) neutral conductors of lines, switches and shunts, and remove any terminals which become unconnected. A line or switch conductor is considered as a neutral conductor if it is connected between two neutral terminals. A terminal is a neutral terminals if it is galvanically connected (i.e. through a line or switch) to a grounded terminal, or the neutral conductor of a wye-connected component.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._kron_reduce_linecode!-Tuple{Any, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._kron_reduce_linecode!","text":"Kron-reduce specified neutral conductors of a linecode.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._kron_reduce_series_impedance-Tuple{Matrix, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._kron_reduce_series_impedance","text":"Return the Kron-reduction of the specified neutral conductors of a series impedance matrix.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._kron_reduce_shunt_addmittance-Tuple{Matrix, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._kron_reduce_shunt_addmittance","text":"Return the Kron-reduction of the specified neutral conductors of a shunt addmittance matrix.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._line_reverse!-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._line_reverse!","text":"Reverse the direction of a line.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._load_expmodel_params-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._load_expmodel_params","text":"_load_expmodel_params(load::Dict{String,<:Any}, bus::Dict{String,<:Any})\n\nReturns the exponential load model parameters for a load. For an exponential load it simply returns certain data model properties, whilst for constantpower, constantcurrent and constant_impedance it returns the equivalent exponential model parameters.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._loop_line_to_shunt-Tuple{Dict{String, Any}, AbstractString}","page":"Internal Functions","title":"PowerModelsDistribution._loop_line_to_shunt","text":"Create an equivalent shunt for a line which connects to a single bus.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_filtered_logger-Tuple{Any}","page":"Internal Functions","title":"PowerModelsDistribution._make_filtered_logger","text":"_make_filtered_logger(level::Logging.LogLevel)\n\nHelper function to create the filtered logger for PMD\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_full_matrix_variable-Union{Tuple{T}, Tuple{Vector{T}, Vector{T}, Vector{T}}} where T","page":"Internal Functions","title":"PowerModelsDistribution._make_full_matrix_variable","text":"makes a full matrix variable from a diagonal, and lower and upper triangular vectors\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_hermitian_matrix_variable-Tuple{Any, Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._make_hermitian_matrix_variable","text":"makes a hermitian matrix variable from diagonal, and lower and upper triangular vectors\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_lossless!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._make_lossless!","text":"_make_lossless!(data_eng::Dict{String,<:Any})\n\nRemove parameters from objects with loss models to make them lossless. This includes linecodes, lines, switches, xfmrcodes, transformers, voltage sources, generators, solar, and storage, which all have (or will have in the future), loss model parameters that can be omitted.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_math_per_unit!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._make_math_per_unit!","text":"converts the MATHEMATICAL model to per unit from SI\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_matrix_variable_element-Union{Tuple{T}, Tuple{JuMP.Model, Vector{T}, Int64, Int64}} where T","page":"Internal Functions","title":"PowerModelsDistribution._make_matrix_variable_element","text":"_make_matrix_variable_element(\n model::JuMP.Model,\n indices::Array{T,1},\n n::Int,\n m::Int;\n upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n varname::String=\"\"\n) where T\n\nSometimes we want to bound only a subset of the elements of a matrix variable. For example, an unbounded Hermitian variable usually still has a lower bound of zero on the real diagonal elements. When there is a mix of bounded and unbounded elements, the unboundedness is encoded as 'Inf' and '-Inf' in the bound parameters. This cannot be passed directlty to JuMP, because it would lead to an error in Mosek for example. Instead, this method checks whether all bounds for an element (n,m) are Inf, and if so, does not pass a bound to JuMP.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_multiconductor!-Tuple{Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._make_multiconductor!","text":"Hacky helper function to transform single-conductor network data, from, e.g., matpower/psse, into multi-conductor data\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_multinetwork_eng-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._make_multinetwork_eng","text":"Expands an ENGINEERING data structure into a multinetwork, see make_multinetwork\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._make_multinetwork_math-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._make_multinetwork_math","text":"Expands an MATHEMATICAL data structure into a multinetwork, see make_multinetwork\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_conductor_ids!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_conductor_ids!","text":"helper function to map non integer conductor ids into integers\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math","text":"base function for converting engineering model to mathematical model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_bus!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_bus!","text":"converts engineering bus components into mathematical bus components\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_generator!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_generator!","text":"converts engineering generators into mathematical generators\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_line!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_line!","text":"converts engineering lines into mathematical branches\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_load!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_load!","text":"converts engineering load components into mathematical load components\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_nw!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_nw!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_shunt!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_shunt!","text":"converts engineering generic shunt components into mathematical shunt components\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_solar!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_solar!","text":"converts engineering solar components into mathematical generators\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_storage!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_storage!","text":"converts engineering storage into mathematical storage\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_switch!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_switch!","text":"converts engineering switches into mathematical switches and (if neeed) impedance branches to represent loss model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_transformer!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_transformer!","text":"converts engineering n-winding transformers into mathematical ideal 2-winding lossless transformer branches and impedance branches to represent the loss model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_eng2math_voltage_source!-Tuple{Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_eng2math_voltage_source!","text":"converts engineering voltage sources into mathematical generators and (if needed) impedance branches to represent the loss model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_bus!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_bus!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_generator!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_generator!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_line!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_line!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_load!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_load!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_root!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_root!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_shunt!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_shunt!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_solar!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_solar!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_storage!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_storage!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_switch!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_switch!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_transformer!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_transformer!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._map_math2eng_voltage_source!-Tuple{Dict{String}, Dict{String}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._map_math2eng_voltage_source!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._mat2ltrivec!-Union{Tuple{Union{Matrix{T}, LinearAlgebra.Symmetric{T, S} where S<:(AbstractMatrix{<:T})}}, Tuple{T}} where T","page":"Internal Functions","title":"PowerModelsDistribution._mat2ltrivec!","text":"matrix to lower triangular vector\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._mat2utrivec!-Union{Tuple{Union{Matrix{T}, LinearAlgebra.Symmetric{T, S} where S<:(AbstractMatrix{<:T})}}, Tuple{T}} where T","page":"Internal Functions","title":"PowerModelsDistribution._mat2utrivec!","text":"matrix to upper triangular vector\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._mat_mult_rm_nan-Tuple{Matrix, Union{LinearAlgebra.Adjoint, Matrix}}","page":"Internal Functions","title":"PowerModelsDistribution._mat_mult_rm_nan","text":"matrix multiplication removing NaN values\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._merge_bus_flows-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Vector, Vector}","page":"Internal Functions","title":"PowerModelsDistribution._merge_bus_flows","text":"Merges flow variables that enter the same terminals, i.e. multiple neutrals of an underground cable connected to same neutral terminal\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._merge_terminals!-Tuple{Dict{String, Any}, String, Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._merge_terminals!","text":"Merge a terminal into another for a specified bus, i.e. as if they are short-ciruited.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._missing2false-Tuple{Union{Missing, Bool}}","page":"Internal Functions","title":"PowerModelsDistribution._missing2false","text":"Helper to convert \n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._nan2zero-Tuple{Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._nan2zero","text":"Replaces NaN values with zeros\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_linquad-Tuple{AbstractUnbalancedPowerModel}","page":"Internal Functions","title":"PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_linquad","text":"gen connections adaptation of min fuel cost polynomial linquad objective\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_linquad_switch-Tuple{AbstractUnbalancedIVRModel}","page":"Internal Functions","title":"PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_linquad_switch","text":"Multiconductor adaptation of min fuel cost polynomial linquad objective\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_linquad_switch-Tuple{AbstractUnbalancedPowerModel}","page":"Internal Functions","title":"PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_linquad_switch","text":"gen connections adaptation of min fuel cost polynomial linquad objective\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_nl-Tuple{AbstractUnbalancedPowerModel}","page":"Internal Functions","title":"PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_nl","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_nl_switch-Tuple{AbstractUnbalancedPowerModel}","page":"Internal Functions","title":"PowerModelsDistribution._objective_mc_min_fuel_cost_polynomial_nl_switch","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._pad_connections!-Tuple{Dict{String}, String, Int64, Union{Vector{Int64}, Vector{String}}}","page":"Internal Functions","title":"PowerModelsDistribution._pad_connections!","text":"adds conductors to connections during padding process, transformer winding variant\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._pad_connections!-Tuple{Dict{String}, String, Union{Vector{Int64}, Vector{String}}}","page":"Internal Functions","title":"PowerModelsDistribution._pad_connections!","text":"adds conductors to connections during padding process\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._pad_properties!-Tuple{Dict{String}, Vector{String}, Int64, Vector{Int64}, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._pad_properties!","text":"pads properties to have the total number of conductors for the whole system (transformer winding variant)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._pad_properties!-Tuple{Dict{String}, Vector{String}, Vector{Int64}, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._pad_properties!","text":"pads properties to have the total number of conductors for the whole system\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._pad_properties_delta!-Tuple{Dict{String}, Vector{String}, Vector{Int64}, Int64, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._pad_properties_delta!","text":"pads properties to have the total number of conductors for the whole system - delta connection variant\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._pad_properties_delta!-Tuple{Dict{String}, Vector{String}, Vector{Int64}, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._pad_properties_delta!","text":"pads properties to have the total number of conductors for the whole system - delta connection variant\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_array-Union{Tuple{T}, Tuple{Type{T}, AbstractString}} where T","page":"Internal Functions","title":"PowerModelsDistribution._parse_array","text":"helper function to parse reverse polish notation arrays\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_bus_id-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_bus_id","text":"Parses busnames as defined in OpenDSS, e.g. 'primary.1.2.3.0'\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_command_from_line-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_command_from_line","text":"_parse_command_from_line(line::String)::Tuple{String,String}\n\nParses the dss command from the line (if present), optionnally making the command set if implicitly used.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_csvfile-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_csvfile","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dblfile-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dblfile","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_buscoords!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_buscoords!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_buscoords-Tuple{IO}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_buscoords","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_clear!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_clear!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_compile!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_compile!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_disable!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_disable!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_edit!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_edit!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_enable!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_enable!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_latloncoords!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_latloncoords!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_more!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_more!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_new!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_new!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_redirect!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_redirect!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_set!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_set!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_cmd_setbusxy!-Tuple{DssRawModel, String, Int64}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_cmd_setbusxy!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_matrix-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_matrix","text":"Helper function for Base.parse for dss matrices\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_obj_type_name-Tuple{AbstractString}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_obj_type_name","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_dss_vector-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_dss_vector","text":"Helper function for Base.parse for dss vectors\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_file_inside_mult!-Tuple{DssObject, String, String, String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_file_inside_mult!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_file_inside_shape_ref!-Tuple{DssObject, OpenDssDataModel, OpenDssRawDataModel, String, String, String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_file_inside_shape_ref!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_match_element-Tuple{RegexMatch, String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_match_element","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_pqcsvfile-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_pqcsvfile","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_rpn-Tuple{AbstractString}","page":"Internal Functions","title":"PowerModelsDistribution._parse_rpn","text":"helper function to parse reverse polish notation\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_rpn-Union{Tuple{T}, Tuple{Type{T}, AbstractString}} where T","page":"Internal Functions","title":"PowerModelsDistribution._parse_rpn","text":"parses Reverse Polish Notation expr\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_rpn-Union{Tuple{T}, Tuple{Type{T}, AbstractString}} where T<:(Vector)","page":"Internal Functions","title":"PowerModelsDistribution._parse_rpn","text":"helper function to parse reverse polish notation vectors\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._parse_sngfile-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._parse_sngfile","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._pmd_metafmt-Tuple{Base.CoreLogging.LogLevel, Vararg{Any, 5}}","page":"Internal Functions","title":"PowerModelsDistribution._pmd_metafmt","text":"_pmd_metafmt(level::Logging.LogLevel, _module, group, id, file, line)\n\nMetaFormatter for ConsoleLogger for PMD to adjust log message format\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._propagate_network_topology!-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._propagate_network_topology!","text":"_propagate_network_topology!(data::Dict{String,Any})\n\nhelper function to propagate bus status to any connected components\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rebase_pu_branch!-Tuple{Dict{String}, Vararg{Real, 4}}","page":"Internal Functions","title":"PowerModelsDistribution._rebase_pu_branch!","text":"per-unit conversion for branches\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rebase_pu_bus!-Tuple{Dict{String}, Vararg{Real, 4}}","page":"Internal Functions","title":"PowerModelsDistribution._rebase_pu_bus!","text":"per-unit conversion for buses\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rebase_pu_generator!-Tuple{Dict{String}, Real, Real, Real, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._rebase_pu_generator!","text":"per-unit conversion for generators\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rebase_pu_load!-Tuple{Dict{String}, Vararg{Real, 4}}","page":"Internal Functions","title":"PowerModelsDistribution._rebase_pu_load!","text":"per-unit conversion for loads\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rebase_pu_shunt!-Tuple{Dict{String}, Vararg{Real, 4}}","page":"Internal Functions","title":"PowerModelsDistribution._rebase_pu_shunt!","text":"per-unit conversion for shunts\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rebase_pu_storage!-Tuple{Dict{String}, Real, Real, Real}","page":"Internal Functions","title":"PowerModelsDistribution._rebase_pu_storage!","text":"per-unit conversion for storage\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rebase_pu_switch!-Tuple{Dict{String}, Vararg{Real, 4}}","page":"Internal Functions","title":"PowerModelsDistribution._rebase_pu_switch!","text":"per-unit conversion for switches\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rebase_pu_transformer_2w_ideal!-Tuple{Dict{String}, Vararg{Real, 5}}","page":"Internal Functions","title":"PowerModelsDistribution._rebase_pu_transformer_2w_ideal!","text":"per-unit conversion for ideal 2-winding transformers\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._ref_add_connected_components!-Tuple{Dict{Symbol}, Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._ref_add_connected_components!","text":"adds connected components for opb problem type\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._register_awaiting_ground!-Tuple{Dict{String}, Vector{Int64}}","page":"Internal Functions","title":"PowerModelsDistribution._register_awaiting_ground!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._remove_all_bounds!-Tuple{Any}","page":"Internal Functions","title":"PowerModelsDistribution._remove_all_bounds!","text":"_remove_all_bounds!(data_eng; exclude::Vector{<:String}=String[\"energy_ub\"], exclude_asset_type::Vector{String}=String[])\n\nRemoves all fields ending in 'ub' or 'lb' that aren't required by the math model. Properties can be excluded from this removal with exclude::Vector{String}\n\nWhole asset types (e.g., \"line\") can be excluded using the keyword argument exclude_asset_type::Vector{String}\n\nBy default, \"energy_ub\" is excluded from this removal, since it is a required properly on storage.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._remove_line_limits!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._remove_line_limits!","text":"_remove_line_limits!(data_eng::Dict{String,<:Any})\n\nRemoves fields cm_ub and sm_ub from lines, switches, and linecodes\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._remove_pwl_cost_duplicates!-Tuple{Any, Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._remove_pwl_cost_duplicates!","text":"checks that each point in the a pwl function is unqiue, simplifies the function if duplicates appear\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._remove_transformer_limits!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._remove_transformer_limits!","text":"_remove_transformer_limits!(data_eng::Dict{String,<:Any})\n\nRemoves field sm_ub from transformers, xfmrcodes\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._remove_unconnected_terminals!-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._remove_unconnected_terminals!","text":"_remove_unconnected_terminals!(data_eng::Dict{String,Any})::Dict{String,Any}\n\nRemove all terminals which are unconnected (not considering a grounding as a connection).\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._rescale_cost_model!-Tuple{Dict{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._rescale_cost_model!","text":"rescales the cost model terms\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._sanatize_line-Tuple{String}","page":"Internal Functions","title":"PowerModelsDistribution._sanatize_line","text":"_sanatize_line(line::String)::String\n\nSanitizes lines by stripping them clean of extra space and the beginnging and end, making everything lowercase, changing ~ or m to more, and stripping comments\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._sanitize_property_name-Tuple{String, String}","page":"Internal Functions","title":"PowerModelsDistribution._sanitize_property_name","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._sc2br_impedance-Tuple{Dict{Tuple{Int64, Int64}, ComplexF64}}","page":"Internal Functions","title":"PowerModelsDistribution._sc2br_impedance","text":"Converts a set of short-circuit tests to an equivalent reactance network. Reference: R. C. Dugan, “A perspective on transformer modeling for distribution system analysis,” in 2003 IEEE Power Engineering Society General Meeting (IEEE Cat. No.03CH37491), 2003, vol. 1, pp. 114-119 Vol. 1.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._scale-Tuple{Dict{String}, String, Real}","page":"Internal Functions","title":"PowerModelsDistribution._scale","text":"function for applying a scale to a paramter\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._scale_props!-Tuple{Dict{String}, Vector{String}, Real}","page":"Internal Functions","title":"PowerModelsDistribution._scale_props!","text":"helper function to apply a scale factor to given properties\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._show-Union{Tuple{T}, Tuple{IO, T}} where T<:Union{InfrastructureObject, InfrastructureModel}","page":"Internal Functions","title":"PowerModelsDistribution._show","text":"Helper functions for Base.show for InfrastructureModel,InfrastructureObject\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._simplify_cost_terms!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._simplify_cost_terms!","text":"\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._simplify_pwl_cost!-Tuple{Any, Any, Any}","page":"Internal Functions","title":"PowerModelsDistribution._simplify_pwl_cost!","text":"checks the slope of each segment in a pwl function, simplifies the function if the slope changes is below a tolerance\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._slice_branches!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._slice_branches!","text":"slices branches based on connected terminals\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._sol_data_model_acr!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._sol_data_model_acr!","text":"_sol_data_model_acr!(solution::Dict{String,<:Any})\n\nsolutionprocessor, see [`solvemcmodel`](@ref solvemc_model), to convert ACR variables back into polar representation (default data model voltage form)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._sol_data_model_w!-Tuple{Dict{String}}","page":"Internal Functions","title":"PowerModelsDistribution._sol_data_model_w!","text":"converts w models voltages to standard voltage magnitude (sqrt)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._solve_mc_model-Tuple{Dict{String}, Type, Any, Function}","page":"Internal Functions","title":"PowerModelsDistribution._solve_mc_model","text":"_solve_mc_model(\n data::Dict{String,<:Any},\n model_type::Type,\n optimizer,\n build_method::Function;\n multinetwork::Bool=false,\n ref_extensions::Vector{<:Function}=Function[],\n solution_processors::Vector{<:Function}=Function[],\n relax_integrality::Bool=false,\n kwargs...\n)::Dict{String,Any}\n\nInternal solver interface that uses instantiate_mc_model directly and runs optimize_model!, returning a result\n\nSee solve_mc_model\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._solve_mc_osw-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Internal Functions","title":"PowerModelsDistribution._solve_mc_osw","text":"Solve optimal switching problem\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._solve_mc_osw_mi-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Internal Functions","title":"PowerModelsDistribution._solve_mc_osw_mi","text":"Solve mixed-integer optimal switching problem\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._solve_mn_mc_opb-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Internal Functions","title":"PowerModelsDistribution._solve_mn_mc_opb","text":"_solve_mn_mc_opb(data::Union{Dict{String,<:Any},String}, model_type::Type, solver; kwargs...)\n\nsolve test mn mc problem\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._standardize_cost_terms!-Tuple{Dict{String}, Int64, String}","page":"Internal Functions","title":"PowerModelsDistribution._standardize_cost_terms!","text":"ensures all polynomial costs functions have at exactly comp_order terms\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._strip_lines!-Tuple{Vector{String}}","page":"Internal Functions","title":"PowerModelsDistribution._strip_lines!","text":"strips lines that are either commented (block or single) or empty\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._sum_rm_nan-Tuple{Vector}","page":"Internal Functions","title":"PowerModelsDistribution._sum_rm_nan","text":"BOUND manipulation methods (0*Inf->0 is often desired)\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._transform_loops!-Tuple{Dict{String, Any}}","page":"Internal Functions","title":"PowerModelsDistribution._transform_loops!","text":"_transform_loops!(\n data_eng::Dict{String,Any};\n zero_series_impedance_threshold::Real=1E-8,\n shunt_id_prefix::AbstractString=\"line_loop\"\n)::Dict{String,Any}\n\nTransform line loops (connected to a single bus), which are not allowed in the mathematical model. Lossy line loops are converted to equivalent shunts, and lossless ones (i.e. short-circuits) are represented by merging the short-circuited terminals. The argument 'zeroseriesimpedance_threshold' controls the threshold below which the series impedance is considered to be a short-ciruit. This is useful because OpenDSS modelers have to insert tiny impedances to represent short-circuit reactors. The addmittance to ground should be zero to trigger the short-circuit handling.\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._update_bus_terminal_projections!-Tuple{Dict{String}, Dict{String, <:Vector{Int64}}}","page":"Internal Functions","title":"PowerModelsDistribution._update_bus_terminal_projections!","text":"helper function to update the terminals on projected buses\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._vec2ltri!-Union{Tuple{Vector{T}}, Tuple{T}} where T","page":"Internal Functions","title":"PowerModelsDistribution._vec2ltri!","text":"vector to lower triangular\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._vec2utri!-Union{Tuple{Vector{T}}, Tuple{T}} where T","page":"Internal Functions","title":"PowerModelsDistribution._vec2utri!","text":"https://stackoverflow.com/questions/39039553/lower-triangular-matrix-in-julia\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._wrap_to_180-Tuple{Any}","page":"Internal Functions","title":"PowerModelsDistribution._wrap_to_180","text":"wraps angles in degrees to 180\n\n\n\n\n\n","category":"method"},{"location":"reference/internal.html#PowerModelsDistribution._wrap_to_pi-Tuple{Any}","page":"Internal Functions","title":"PowerModelsDistribution._wrap_to_pi","text":"wraps angles in radians to pi\n\n\n\n\n\n","category":"method"},{"location":"tutorials/Extension Tutorial.html#Extending-PowerModelsDistribution.jl","page":"Extending PowerModelsDistribution","title":"Extending PowerModelsDistribution.jl","text":"","category":"section"},{"location":"tutorials/Extension Tutorial.html","page":"Extending PowerModelsDistribution","title":"Extending PowerModelsDistribution","text":"Stub for Extension Tutorial.jl Pluto Notebook in the examples/ folder. The Pluto Notebook will get rendered and inserted as an iframe at documentation build time.","category":"page"},{"location":"manual/math-model.html#The-PowerModelsDistribution-Mathematical-Model","page":"Mathematical Model","title":"The PowerModelsDistribution Mathematical Model","text":"","category":"section"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"As PowerModelsDistribution implements a variety of power network optimization problems, the implementation is the best reference for precise mathematical formulations. This section provides a complex number based mathematical specification for a prototypical unbalanced AC Optimal Power Flow problem, to provide an overview of the typical mathematical models in PowerModelsDistribution.","category":"page"},{"location":"manual/math-model.html#Unbalanced-AC-Optimal-Power-Flow","page":"Mathematical Model","title":"Unbalanced AC Optimal Power Flow","text":"","category":"section"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"PowerModelsDistribution implements a generalized version of the AC Optimal Power Flow problem, taking into account phase unbalance. [1] These generalizations make it possible for PowerModelsDistribution to more accurately capture real-world distribution network datasets. The core generalizations are,","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"Support for multiple load and shunt components on each bus\nLine charging (shunt) that supports a conductance and asymmetrical values","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"In the mathematical description below,","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"Bold typeface indicates a vector (in mathbbC^c) or matrix (in mathbbC^ctimes c)\nOperator diag takes the diagonal (vector) from a square matrix\nThe set of complex numbers is mathbbC and real numbers is mathbbR\nSuperscript H indicates complex conjugate transpose (Hermitian adjoint)\nNote that complex power is defined as mathbfS_ij = mathbfV_i mathbfI_ij^H and is therefore a complex matrix of dimension c times c\nThe line mathbfY^c_ij mathbfY^c_ji and bus mathbfY^s_k shunt matrices do not need to be diagonal","category":"page"},{"location":"manual/math-model.html#Sets","page":"Mathematical Model","title":"Sets","text":"","category":"section"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"The definitions of the sets involved remain unchanged w.r.t. the balanced OPF problem definition, except for the addition of the conductor set:","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"beginalign\n\nmboxsets nonumber \n N mbox - busesnonumber \n R mbox - references busesnonumber \n E E^R mbox - branches forward and reverse orientation nonumber \n G G_i mbox - generators and generators at bus i nonumber \n L L_i mbox - loads and loads at bus i nonumber \n S S_i mbox - shunts and shunts at bus i nonumber \n C mbox - conductors nonumber \n\nendalign","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"where the set of conductors C typically equals abc.","category":"page"},{"location":"manual/math-model.html#Data","page":"Mathematical Model","title":"Data","text":"","category":"section"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"beginalign\nmboxdata nonumber \n S^gl_kc S^gu_kc in mathbbC forall k in G forall c in C nonumber mathbfS^gl_k= S^gl_kc_c in C mathbfS^gu_k = S^gu_kc_c in C \n c_2k c_1k c_0k in mathbbR forall k in G nonumber \n v^l_ic v^u_ic in mathbbR forall i in N forall c in C nonumber mathbfv^l_i = v^l_ic_c in C mathbfv^u_i = v^u_ic_c in C \n S^d_kcin mathbbC forall k in L forall c in C nonumber mathbfS^d_k = S^d_kc_c in C \n mathbfY^s_kin mathbbC^ctimes c forall k in S nonumber \n mathbfY_ij mathbfY^c_ij mathbfY^c_jiin mathbbC^ctimes c forall (ij) in E nonumber \n s^u_ijc theta^Delta l_ijc theta^Delta u_ijc in mathbbR forall (ij) in E forall c in C nonumber mathbfs^u_ij = s^u_ijc_c in C \n V^textref_ic in mathbbC forall r in R mathbfV^textref_i = V^textref_ic_c in C \n\nendalign","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"where the notation mathbfv^l_i = v^l_ic_c in C reflects that the vector mathbfv^l_i is constructed by putting the individual phase values v^l_ic in a vector (in order abc).","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"Alternatively, the series impedance of a line can be written in impedance form:","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"mathbfZ_ij in mathbbC^ctimes c forall (ij) in E nonumber mathbfY_ij = ( mathbfZ_ij)^-1","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"where superscript -1 indicates the matrix inverse. Note that mathbfY_ij or mathbfZ_ij may not be invertible, e.g. in case of single-phase branches in a three-phase grid. In this case the pseudo-inverse can be used.","category":"page"},{"location":"manual/math-model.html#Variables-for-a-Bus-Injection-Model","page":"Mathematical Model","title":"Variables for a Bus Injection Model","text":"","category":"section"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"beginalign\n S^g_kc in mathbbC forall kin G forall c in C nonumber mathbfS^g_k = S^g_kc_c in C \n V_ic in mathbbC forall iin N forall c in C nonumber mathbfV_i = V_ic_c in C \n mathbfS_ij in mathbbC^ctimes c forall (ij) in E cup E^R \n\nendalign","category":"page"},{"location":"manual/math-model.html#Mathematical-Formulation-of-a-Bus-Injection-Model","page":"Mathematical Model","title":"Mathematical Formulation of a Bus Injection Model","text":"","category":"section"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"A complete mathematical model is as follows,","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"\nbeginalign\nmboxminimize sum_k in G c_2k left( sum_c in C Re(S^g_kc) right)^2 + c_1k sum_c in C Re(S^g_kc) + c_0k \n\nmboxsubject to nonumber \n mathbfV_i = mathbfV^textref_i forall r in R \n S^gl_kc leq S^g_kc leq S^gu_kc forall k in G forall c in C \n v^l_ic leq V_ic leq v^u_ic forall i in N forall c in C \n sum_substackk in G_i mathbfS^g_k - sum_substackk in L_i mathbfS^d_k - sum_substackk in S_i mathbfV_i mathbfV^H_i (mathbfY^s_k)^H = sum_substack(ij)in E_i cup E_i^R diag(mathbfS_ij) forall iin N \n mathbfS_ij = mathbfV_i mathbfV_i^H left( mathbfY_ij + mathbfY^c_ijright)^H - mathbfV_i mathbfV^H_j mathbfY^H_ij forall (ij)in E \n mathbfS_ji = mathbfV_j mathbfV_j^H left( mathbfY_ij + mathbfY^c_ji right)^H - mathbfV^H_i mathbfV_j mathbfY^H_ij forall (ij)in E \n diag(mathbfS_ij) leq mathbfs^u_ij forall (ij) in E cup E^R \n theta^Delta l_ijc leq angle (V_ic V^*_jc) leq theta^Delta u_ijc forall (ij) in E forall c in C\n\nendalign","category":"page"},{"location":"manual/math-model.html#Variables-for-a-Branch-Flow-Model","page":"Mathematical Model","title":"Variables for a Branch Flow Model","text":"","category":"section"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"beginalign\n S^g_kc in mathbbC forall kin G forall c in C nonumber mathbfS^g_k = S^g_kc_c in C \n V_ic in mathbbC forall iin N forall c in C nonumber mathbfV_i = V_ic_c in C \n I^s_ijc in mathbbC forall e in E forall c in C nonumber mathbfI^s_ij = I^s_ijc_c in C \n mathbfS_ij in mathbbC^ctimes c forall (ij) in E cup E^R \n\nendalign","category":"page"},{"location":"manual/math-model.html#Mathematical-Formulation-of-a-Branch-Flow-Model","page":"Mathematical Model","title":"Mathematical Formulation of a Branch Flow Model","text":"","category":"section"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"A complete mathematical model is as follows,","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"beginalign\nmboxminimize sum_k in G c_2k left( sum_c in C Re(S^g_kc) right)^2 + c_1k sum_c in C Re(S^g_kc) + c_0k \n\nmboxsubject to nonumber \n mathbfV_i = mathbfV^textref_i forall r in R \n S^gl_kc leq S^g_kc leq S^gu_kc forall k in G forall c in C \n v^l_ic leq V_ic leq v^u_ic forall i in N forall c in C \n sum_substackk in G_i mathbfS^g_k - sum_substackk in L_i mathbfS^d_k - sum_substackk in S_i mathbfV_i mathbfV^H_i (mathbfY^s_k)^H = sum_substack(ij)in E_i cup E_i^R diag(mathbfS_ij) forall iin N \n mathbfS_ij + mathbfS_ji = mathbfV_i mathbfV_i^H (mathbfY^c_ij)^H + mathbfZ_ij mathbfI^s_ij(mathbfI^s_ij)^H + mathbfV_j mathbfV_j^H (mathbfY^c_ji)^H forall (ij)in E \n mathbfS^s_ij = mathbfS_ij + mathbfV_i mathbfV_i^H (mathbfY^c_ij)^H forall (ij) in E cup E^R \n mathbfS^s_ij = mathbfV_i (mathbfI^s_ij)^H forall (ij) in E cup E^R\n mathbfV_i = mathbfV_j - mathbfZ_ij mathbfI^s_ij forall (ij)in E \n diag(mathbfS_ij) leq mathbfs^u_ij forall (ij) in E cup E^R \n theta^Delta l_ijc leq angle (V_ic V^*_jc) leq theta^Delta u_ijc forall (ij) in E forall c in C\n\nendalign","category":"page"},{"location":"manual/math-model.html","page":"Mathematical Model","title":"Mathematical Model","text":"[1]: Gan, L., & Low, S. H. (2014). Convex relaxations and linear approximation for optimal power flow in multiphase radial networks. In PSSC (pp. 1–9). Wroclaw, Poland. https://doi.org/10.1109/PSCC.2014.7038399","category":"page"},{"location":"tutorials/Native Power Flow.html#Native-Power-Flow-Solver","page":"Native Power Flow Solver","title":"Native Power Flow Solver","text":"","category":"section"},{"location":"tutorials/Native Power Flow.html","page":"Native Power Flow Solver","title":"Native Power Flow Solver","text":"Stub for Native Power Flow.jl Pluto Notebook in the examples/ folder. The Pluto Notebook will get rendered and inserted as an iframe at documentation build time.","category":"page"},{"location":"installation.html#Installation-Guide","page":"Installation Guide","title":"Installation Guide","text":"","category":"section"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"From Julia, PowerModelsDistribution is installed using the built-in package manager:","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"import Pkg\nPkg.add(\"PowerModelsDistribution\")","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"Or, within the Julia REPL:","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"]add PowerModelsDistribution","category":"page"},{"location":"installation.html#Installing-an-Optimizer","page":"Installation Guide","title":"Installing an Optimizer","text":"","category":"section"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"PowerModelsDistribution depends on optimizers to solve Optimization problems, e.g., solve_mc_opf. The table below lists the optimizer packages that have been tested with PowerModelsDistribution, and have been found to work by the team; this list is not exhaustive, there are probably more optimizers that will work.","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"Install an optimizer using the Julia Package Manager, e.g.,","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"import Pkg\nPkg.add(\"Ipopt\")","category":"page"},{"location":"installation.html#Known-Working-Optimizers","page":"Installation Guide","title":"Known Working Optimizers","text":"","category":"section"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"The table below contains a truncated list of optimizers from the JuMP documentation that have been used by the development team and are confirmed to work with our package. There may be other Optimizers that work, and the Optimizers listed below are not guaranteed to work with all problems; they must be selected for the appropriate problems.","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"Solver Julia Package Installation License Supports\nArtelys Knitro KNITRO.jl Manual Comm. (MI)LP, (MI)SOCP, (MI)NLP\nCbc Cbc.jl EPL (MI)LP\nCPLEX CPLEX.jl Manual Comm. (MI)LP, (MI)SOCP\nGurobi Gurobi.jl Manual Comm. (MI)LP, (MI)SOCP\nIpopt Ipopt.jl EPL LP, QP, NLP\nJuniper.jl Juniper.jl MIT (MI)SOCP, (MI)NLP\nSCS SCS.jl MIT LP, SOCP, SDP","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"Where:","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"LP = Linear programming\nQP = Quadratic programming\nSOCP = Second-order conic programming (including problems with convex quadratic constraints and/or objective)\nNLP = Nonlinear programming\nSDP = Semidefinite programming\n(MI)XXX = Mixed-integer equivalent of problem type XXX","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"For a complete list of JuMP supported optimizers, see JuMP Documentation.","category":"page"},{"location":"installation.html#Unsatisfiable-requirements-detected","page":"Installation Guide","title":"Unsatisfiable requirements detected","text":"","category":"section"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"Did you get an error like Unsatisfiable requirements detected for package D [756980fe]:?","category":"page"},{"location":"installation.html","page":"Installation Guide","title":"Installation Guide","text":"The Pkg documentation has a section on how to understand and manage these conflicts.","category":"page"},{"location":"manual/external-data-formats.html#External-Data-Formats","page":"External Data Formats","title":"External Data Formats","text":"","category":"section"},{"location":"manual/external-data-formats.html#OpenDSS","page":"External Data Formats","title":"OpenDSS","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"PowerModelsDistribution supports parsing OpenDSS format files. In particular, we support a raw parsing of all OpenDSS specified components into a dictionary (serializable) structure, and support converting the data values of a smaller subsection of components into their expected types. Those include","category":"page"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"Line\nLoad\nGenerator\nCapactior (shunt capacitors only)\nReactor\nTransformer\nLinecode\nXfmrcode\nLoadshape\nXYCurve\nCircuit\nVSource\nPVSystem\nStorage","category":"page"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"Of those, a subset of configurations are converted into a PowerModelsDistribution internal data model, namely:","category":"page"},{"location":"manual/external-data-formats.html#Edge-Elements","page":"External Data Formats","title":"Edge Elements","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"line (from lines and line reactors)\ntransformer (arbitrary winding, all connections except zig-zag)\nswitch (from lines w/ switch=y)","category":"page"},{"location":"manual/external-data-formats.html#Node-Elements","page":"External Data Formats","title":"Node Elements","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"generator\nvoltage_source\nsolar (from PVSystem)\nload (incl. support for constant POWER, constant IMPEDANCE, constant CURRENT, and EXPONENTIAL models)\nshunt (from shunt capacitors and shunt reactors)\nstorage","category":"page"},{"location":"manual/external-data-formats.html#Data-Elements","page":"External Data Formats","title":"Data Elements","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"linecode\nxfmrcode\ntime_series (from loadshapes)","category":"page"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"Several notes about the specific design choices w.r.t. OpenDSS are explained below.","category":"page"},{"location":"manual/external-data-formats.html#Circuit","page":"External Data Formats","title":"Circuit","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"The default connection to the transmission system is modeled as an ideal voltage source named \"source\" in OpenDSS, which is connected by default to a node named \"sourcebus\", but this can be changed.","category":"page"},{"location":"manual/external-data-formats.html#Lines","page":"External Data Formats","title":"Lines","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"Although Lines and Linecodes are supported, the more generic LineGeometry is not yet supported.","category":"page"},{"location":"manual/external-data-formats.html#Transformers","page":"External Data Formats","title":"Transformers","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"Unfortunately, in the OpenDSS format, multi-phase transformers with different taps for each phase are not explicitly supported, so to work around this limitation multiple single phase transformers should be defined, which are then \"banked\" together using the bank property.","category":"page"},{"location":"manual/external-data-formats.html#Capacitors-and-Reactors","page":"External Data Formats","title":"Capacitors and Reactors","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"Capacitors and reactors are supported as shunts, although shunts to ground via delta connections are not yet supported. Furthermore, generic reactors are not supported, only those whose second terminal is connected to ground (default for unspecified second terminal). Reactors are also supported as a resistanceless line if their second terminal is connected, but only for topological continuity of the network.","category":"page"},{"location":"manual/external-data-formats.html#PowerModelsDistribution-JSON","page":"External Data Formats","title":"PowerModelsDistribution JSON","text":"","category":"section"},{"location":"manual/external-data-formats.html","page":"External Data Formats","title":"External Data Formats","text":"You can export a PowerModelsDistribution data structure to a JSON file using the print_file command and parse one in using the parse_file command","category":"page"},{"location":"tutorials/Explicit Neutral Models.html#Explicit-Neutral-Models","page":"Explicit Neutral Models","title":"Explicit Neutral Models","text":"","category":"section"},{"location":"tutorials/Explicit Neutral Models.html","page":"Explicit Neutral Models","title":"Explicit Neutral Models","text":"Stub for Explicit Neutral Models.jl Pluto Notebook in the examples/ folder. The Pluto Notebook will get rendered and inserted as an iframe at documentation build time.","category":"page"},{"location":"developer/style.html#Style-Conventions","page":"Style Guide","title":"Style Conventions","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"In general, the following conventions should be adhered to when making changes or additions to the code base. These conventions should include any conventions applied across the InfrastructureModels ecosystem specific to power engineering (i.e conventions from InfrastructureModels, PowerModels, PowerModelsRestoration, etc.) with some additions specific to PowerModelsDistribution.","category":"page"},{"location":"developer/style.html#Functions","page":"Style Guide","title":"Functions","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"Function additions should meeting the following criteria:","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"All functions should be clearly named, without abbreviations, and with underscores between words, e.g. parse_file or constraint_bus_voltage_magnitude; in Python this is known as lower_case_with_underscores. The exception to the abbreviate rule is cases where abbreviations would be expected in the modeling of power systems.\nAll functions that are not prepended by an underscore _ will be exported by default (i.e. when a user uses using PowerModelsDistribution). Public functions should have a detailed docstring instructing on usage\nAll functions that modify data in place should end with an exclamation point ! and the function input that is being modified should be the first argument (or first arguments in the case where multiple inputs are being modified in place). The exceptions to this rule are constraint and variable creation functions (i.e. those functions related to JuMP model creation), which do not include the exclamation point\nAll function arguments, including keyword arguments, should have their types specified.\nPrivate functions, i.e. those intended to be for internal use only, should follow the same descriptive naming conventions as functions exported by default, and should always include docstrings to describe their purpose.\nFunctions should be separated by two blank lines","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"\"this function demonstrates how an internal, in-place data altering function should be defined\"\nfunction _concise_descriptive_name!(data::Dict{String,<:Any}, a::Real, b::Vector{<:Real}, c::Matrix{<:Complex}; d::Bool=false, e::Vector{Function}=Function[])\nend","category":"page"},{"location":"developer/style.html#Types-and-Enums","page":"Style Guide","title":"Types & Enums","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"When specifying types, i.e. when specifying the type of a function argument, or creating enums, these guidelines are recommended:","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"Prefer to use Vector{T} instead of Array{T,1}\nPrefer to use Matrix{T} instead of Array{T,2}\nEnums should only be used in the ENGINEERING data model, never the MATHEMATICAL data model\nEnums must be added to the JSON parser when introduced","category":"page"},{"location":"developer/style.html#Constants","page":"Style Guide","title":"Constants","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"Whenever possible, const should be used to eliminate unnecessary re-evaluations of code, and every const should have a docstring, whether internal or public.","category":"page"},{"location":"developer/style.html#JuMP-Variables-and-Constraints","page":"Style Guide","title":"JuMP Variables and Constraints","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"For functions that create JuMP variables and constraints in particular, we follow the following naming convention as originally adopted by PowerModels:","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"(_)__(_real|_imaginary|_magnitude|_angle|_factor)(_fr|_to)(_sqr)(_on_off)","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"in the interest of intuitive names for users, the following special cases are also acceptable,","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"_power_real -(can be replaced with)-> _active\n_power_imaginary -(can be replaced with)-> _reactive","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"In the case of PowerModelsDistribution, there are additional tags indicating that a function is a multiconductor variant, three-phase specific, etc.:","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"mc multi-conductor, with an explicit neutral (which is the last conductor by convention?)\nmp multi-phase, for constraints that have no (explicit) neutral and multiple phases\n3p three-phase, when a constraint is hard-coded for three phases","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"Currently, all phase-aware functions use mc, but this is subject to change in the future as we refactor. If the function is not multiphase specific, these are not needed in the function name.","category":"page"},{"location":"developer/style.html#Formulation-Styles","page":"Style Guide","title":"Formulation Styles","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"All new formulations should have clear error messages when they do not support existing components. For example, if a formulation addition which is intended to work with OPF does not support delta-wye transformers, the constraint_mc_transformer_power_dy\nFormulation abstract type and mutable struct must be specified in CapitalizedWords, which is a subtype of camelCase with the first word also capitalized.","category":"page"},{"location":"developer/style.html#Problem-Specification-Styles","page":"Style Guide","title":"Problem Specification Styles","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"If a new problem specification is only needed due to the requirements of a new formulation, and is not a new type of problem, e.g. another OPF formulation, a build_ function with the same name as the existing formulation should be created that accepts a specific PowerModel (multiple dispatch)\nIf a new problem specification is a new type of problem that will e.g. accept multiple formulations, new build_ and run_ functions should be created that do not collide with existing problem specification functions","category":"page"},{"location":"developer/style.html#Metaprogramming","page":"Style Guide","title":"Metaprogramming","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"In general, it is better to avoid metaprogramming patterns, like creating functions algorithmically, in order to aid in the debugging of code. Metaprogramming can create significant challenges in interpreting stacktraces upon errors.","category":"page"},{"location":"developer/style.html#Markdown","page":"Style Guide","title":"Markdown","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"Markdown files should be properly formatted, particularly when including tables. Developers are encouraged to use markdownlint and a markdown formatter (such as in VSCode).","category":"page"},{"location":"developer/style.html#File-Structure","page":"Style Guide","title":"File Structure","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"It is important that new functions, variables, constraints, etc. all go into appropriate places in the code base so that future maintenance and debugging is easier. Pay attention to the current file structure and attempt to conform as best as possible to it. In general","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"/src/core contains the core logic of the package, including variable creation and constraint templates, i.e. things that are agnostic to the formulation\n/src/data_model contains all of the logic to transform between the ENGINEERING and MATHEMATICAL data models and model creation helper tools\nsrc/form contains formulation specific variable and constraint functions, organized under separate files for different formulations\nsrc/io contains all of the tools to parse and save files, in particular all of the logic necessary to parse dss files and output json files\nsrc/prob contains all problem specifications\ndocs/src contains all source markdown files for the documentation\nexamples contains Jupyter notebooks with walkthroughs of PowerModelsDistribution for new users","category":"page"},{"location":"developer/style.html#Dependencies-(Project.toml)","page":"Style Guide","title":"Dependencies (Project.toml)","text":"","category":"section"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"All new dependencies should be carefully considered before being added. It is important to keep the number of external dependencies low to avoid reliance on features that may not be maintained in the future. If possible, Julia Standard Library should be used, particularly in the case where reproducing the desired feature is trivial. There will be cases where it is not simple to duplicate a feature and subsequently maintain it within the package, so adding a dependency would be appropriate in such cases.","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"All new dependencies are are ultimately approved should also include an entry under [compat] indicating the acceptable versions (Julia automerge requirement). This includes test-only dependencies that appear under [extras]","category":"page"},{"location":"developer/style.html","page":"Style Guide","title":"Style Guide","text":"The Manifest.toml should not be included in the repo.","category":"page"},{"location":"tutorials/Beginners Guide.html#Introduction-to-PowerModelsDistribution","page":"Beginners Guide","title":"Introduction to PowerModelsDistribution","text":"","category":"section"},{"location":"tutorials/Beginners Guide.html","page":"Beginners Guide","title":"Beginners Guide","text":"Stub for Beginners Guide.jl Pluto Notebook in the examples/ folder. The Pluto Notebook will get rendered and inserted as an iframe at documentation build time.","category":"page"},{"location":"tutorials/Engineering Model - Helper Functions.html#tutorial-eng-model-helpers","page":"Engineering Model: Helper Functions","title":"The Engineering Model: Helper Functions","text":"","category":"section"},{"location":"tutorials/Engineering Model - Helper Functions.html","page":"Engineering Model: Helper Functions","title":"Engineering Model: Helper Functions","text":"Stub for Engineering Model - Helper Functions.jl Pluto Notebook in the examples/ folder. The Pluto Notebook will get rendered and inserted as an iframe at documentation build time.","category":"page"},{"location":"manual/power-flow.html#Power-Flow-Computations","page":"Power Flow Computations","title":"Power Flow Computations","text":"","category":"section"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"The typical goal of PowerModelsDistribution is to build a JuMP model that is used to solve distribution power network optimization problems. The JuMP model abstraction enables PowerModelsDistribution to have state-of-the-art performance on a wide range of problem formulations. That said, for the specific case of power flow computations, in some specific applications performance gains can be had by avoiding the JuMP model abstraction and solving the problem more directly. To that end, PowerModelsDistribution includes Julia-native solvers for AC power flow in rectangular voltage coordinates. This section provides an overview of the different power flow options that are available in PowerModelsDistribution and under what circumstances they may be beneficial.","category":"page"},{"location":"manual/power-flow.html#Generic-Power-Flow","page":"Power Flow Computations","title":"Generic Power Flow","text":"","category":"section"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"The general purpose power flow solver in PowerModelsDistribution is,","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"solve_mc_pf","category":"page"},{"location":"manual/power-flow.html#PowerModelsDistribution.solve_mc_pf","page":"Power Flow Computations","title":"PowerModelsDistribution.solve_mc_pf","text":"Power Flow Problem\n\n\n\n\n\n","category":"function"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"This function builds a JuMP model for a wide variety of unbalanced power flow formulations supported by PowerModelsDistribution. For example it supports,","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"ACPUPowerModel - a non-convex nonlinear AC unbalanced power flow using complex voltages in polar coordinates\nACRPowerModel - a non-convex nonlinear AC unbalanced power flow using complex voltages in rectangular coordinates\nACRENPowerModel - a non-convex nonlinear AC unbalanced power flow using complex voltages in rectangular coordinates with explicit neutral conductor\nIVRUPowerModel - a non-convex nonlinear AC power unbalanced flow using current voltage variables in rectangular coordinates\nIVRENPowerModel - a non-convex nonlinear AC unbalanced power flow using current voltage variables in rectangular coordinates with explicit neutral conductor","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"The solve_mc_pf solution method is both formulation and solver agnostic and can leverage the wide range of solvers that are available in the JuMP ecosystem. Many of these solvers are commercial-grade, which in turn makes solve_mc_pf the most reliable power flow solution method in PowerModelsDistribution.","category":"page"},{"location":"manual/power-flow.html#Warm-Starting","page":"Power Flow Computations","title":"Warm Starting","text":"","category":"section"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"In some applications an initial guess of the power flow solution may be available. In such a case, this information may be able to decrease a solver's time to convergence, especially when solving systems of nonlinear equations. The _start postfix can be used in the network data to initialize the solver's variables and provide a suitable solution guess. The most common values are as follows,","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"For each generator,","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"pg_start - active power injection starting point\nqg_start - reactive power injection starting point","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"For each bus,","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"vm_start - voltage magnitude starting point for the ACPUPowerModel model\nva_start - voltage angle starting point for the ACPUPowerModel model\nvr_start - real voltage starting point for the IVRUPowerModel model\nvi_start - imaginary voltage starting point for the IVRUPowerModel model","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"The following helper function can be used to use the solution point in the network data as the starting point for solve_mc_pf.","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"add_start_voltage!","category":"page"},{"location":"manual/power-flow.html#PowerModelsDistribution.add_start_voltage!","page":"Power Flow Computations","title":"PowerModelsDistribution.add_start_voltage!","text":"add_start_voltage!(\n data_math::Dict{String,Any};\n coordinates=:rectangular,\n uniform_v_start=missing,\n vr_default=0.0,\n vi_default=0.0,\n vm_default=0.0,\n va_default=0.0,\n epsilon::Number=1E-3,\n)::Dict{String,Any}\n\nAdds start values for the voltage to the buses. For a multinetwork data model, you can calculate the start voltages for a representative network through 'calcstartvoltage', and pass the result as 'uniformvstart' to use the same values for all networks and avoid recalculating it for each network. The argument 'epsilon' controls the offset added to ungrounded terminals which would otherwise be set to zero.\n\n\n\n\n\n","category":"function"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"warning: Warning\n","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"Warm starting a solver is a very delicate task and can easily result in degraded performance. Using PowerModelsDistribution' default flat-start values is recommended before experimenting with warm starting a solver.","category":"page"},{"location":"manual/power-flow.html#Native-Power-Flow","page":"Power Flow Computations","title":"Native Power Flow","text":"","category":"section"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"The AC Unbalanced Power Flow problem is ubiquitous in power system analysis. The problem requires solving a system of nonlinear equations, usually via a Newton-Raphson type of algorithm. In PowerModelsDistribution, the standard Julia library is used for solving this system of nonlinear equations. The following function is used to solve Unbalanced Power Flow problem with voltages in rectangular coordinates.","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"compute_mc_pf","category":"page"},{"location":"manual/power-flow.html#PowerModelsDistribution.compute_mc_pf","page":"Power Flow Computations","title":"PowerModelsDistribution.compute_mc_pf","text":"compute_mc_pf(\n data::Dict{String,<:Any};\n explicit_neutral::Bool=false,\n max_iter::Int=100,\n v_start::Union{Dict{<:Any,<:Any},Missing}=missing,\n stat_tol::Real=1e-8,\n verbose::Bool=false,\n kron_reduce::Bool=true,\n phase_project::Bool=false,\n multinetwork::Bool=false,\n global_keys::Set{String}=Set{String}(),\n eng2math_extensions::Vector{<:Function}=Function[],\n eng2math_passthrough::Dict{String,<:Vector{<:String}}=Dict{String,Vector{String}}(),\n make_pu_extensions::Vector{<:Function}=Function[],\n map_math2eng_extensions::Dict{String,<:Function}=Dict{String,Function}(),\n make_si::Bool=!get(data, \"per_unit\", false),\n make_si_extensions::Vector{<:Function}=Function[],\n dimensionalize_math_extensions::Dict{String,Dict{String,Vector{String}}}=Dict{String,Dict{String,Vector{String}}}(),\n)::Dict{String,Any}\n\nTakes data in either the ENGINEERING or MATHEMATICAL model, a model type (e.g., ACRUPowerModel), and model builder function (e.g., build_mc_opf), and returns a solution in the original data model defined by data.\n\nTechnical description of the native power flow can be found at https://arxiv.org/abs/2305.04405 where implementation fo the fixed-point current injection algorithm, inspired by the existing open-source implementation in OpenDSS. The current injection method is commonly conceived as a system of nonlinear equalities solved by Newton’s method. However, the fixed point iteration variant commonly outperforms most methods, while supporting meshed topologies from the ground up\n\nIf make_si is false, data will remain in per-unit.\n\nFor an explanation of multinetwork and global_keys, see make_multinetwork\n\nFor an explanation of eng2math_extensions and eng2math_passthrough, see transform_data_model\n\nFor an explanation of make_pu_extensions, see make_per_unit!\n\nFor an explanation of ref_extensions, see instantiate_mc_model\n\nFor an explanation of map_math2eng_extensions, make_si, make_si_extensions, and dimensionalize_math_extensions, see solution_make_si\n\n\n\n\n\ncompute_mc_pf(\n pdf::PowerFlowData,\n max_iter::Int,\n stat_tol::Float,\n verbose::Bool\n)\n\nComputes native power flow and requires PowerFlowData (See https://arxiv.org/abs/2305.04405).\n\n\n\n\n\n","category":"function"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"compute_mc_pf is based on the current injection method and is inspired by OpenDSS's algorithm. compute_mc_pf will typically provide an identical result to solve_mc_pf. However, the existence of solution degeneracy around generator injection assignments and multiple power flow solutions can yield different results. The primary advantage of compute_mc_pf over solve_mc_pf is that it does not require building a JuMP model. If the initial point for the Unbalanced Power Flow solution is near-feasible then compute_mc_pf can result in a significant runtime saving by converging quickly and reducing data-wrangling and memory allocation overheads. This initial guess is provided using the standard _start values. The add_start_voltage! function provides a convenient way of setting a suitable starting point.","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"tip: Tip\n","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"If compute_mc_pf fails to converge try solve_mc_pf instead.","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"The table below reports the accuracy of the native power flow with respect to OpenDSS native solver tested on three IEEE testcases: | IEEE testcases | maximum voltage p.u difference with OpenDSS power flow solver | | –––––––-| ––––––––––––––––––––––––––––––- | | IEEE13 | 3.765096388188572e-6 | | IEEE34 | 6.805369850332029e-8 | | IEEE123 | 4.021326251365659e-8 |","category":"page"},{"location":"manual/power-flow.html#Input-arguments","page":"Power Flow Computations","title":"Input arguments","text":"","category":"section"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"compute_mc_pf receives input arguments as follows,","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"data_math - network data in MATHEMATICAL format\nexplicit_neutral - a boolean input indication wether or not the neutral is explicitly modelled\nv_start - warm start if different from in-built initialization algorithm\nmax_iter - maximum iterations\nstat_tol - statistical tolerance","category":"page"},{"location":"manual/power-flow.html#Outputs","page":"Power Flow Computations","title":"Outputs","text":"","category":"section"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"compute_mc_pf provides the following outputs,","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"solution - solution dictionary\niterations - number of iterations\ntime_build - time spent on building the power flow data\ntime_solve - time spent on solving the native power flow\ntime_post - time spent to generate solutions\ntime_total - total time\ntermination_status - termination status","category":"page"},{"location":"manual/power-flow.html#Limitations","page":"Power Flow Computations","title":"Limitations","text":"","category":"section"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"compute_mc_pf has the following limitations,","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"starting from the math dictionary means that transformer decomposition is already done, which is different from what OpenDSS does\nwe calculate the primitive admittance matrix in p.u. whereas OpenDSS algorithm works with actual units\nno load model relaxation is performed\ninspired by OpenDSS, we add small ppm values to certain component primitive admittance values to avoid singularity issues\ninspired by OpenDSS, switch primitive admittance has specific values","category":"page"},{"location":"manual/power-flow.html#Network-Admittance-Matrix","page":"Power Flow Computations","title":"Network Admittance Matrix","text":"","category":"section"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"Internally compute_mc_pf utilizes an admittance matrix representation of the network data, which may be useful in other contexts. The foundational type for the admittance matrix representations is SparseMatrixCSC.","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"The following function can be used to compute the admittance matrix from PowerModelsDistribution network data.","category":"page"},{"location":"manual/power-flow.html","page":"Power Flow Computations","title":"Power Flow Computations","text":"calc_admittance_matrix","category":"page"},{"location":"manual/power-flow.html#PowerModelsDistribution.calc_admittance_matrix","page":"Power Flow Computations","title":"PowerModelsDistribution.calc_admittance_matrix","text":"calc_admittance_matrix(\n data_math::Dict,\n v_start::Dict,\n explicit_neutral::Bool\n)\n\nCalculates the admittance matrix from PowerFlowData struct.\n\n\n\n\n\n","category":"function"},{"location":"manual/formulations.html#Unbalanced-Network-Formulations","page":"Unbalanced Formulations","title":"Unbalanced Network Formulations","text":"","category":"section"},{"location":"manual/formulations.html#[AbstractUnbalancedACPModel](@ref-AbstractUnbalancedACPModel)","page":"Unbalanced Formulations","title":"AbstractUnbalancedACPModel","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Real-valued formulation from:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Formulation without shunts: Mahdad, B., Bouktir, T., & Srairi, K. (2006). A three-phase power flow modelization: a tool for optimal location and control of FACTS devices in unbalanced power systems. In IEEE Industrial Electronics IECON (pp. 2238–2243).","category":"page"},{"location":"manual/formulations.html#[AbstractUnbalancedDCPModel](@ref-AbstractUnbalancedDCPModel)","page":"Unbalanced Formulations","title":"AbstractUnbalancedDCPModel","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Applying all of the standard DC linearization tricks to the AbstractUnbalancedACPModel","category":"page"},{"location":"manual/formulations.html#[SDPUBFModel](@ref-SDPUBFModel)","page":"Unbalanced Formulations","title":"SDPUBFModel","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"The BFM SDP relaxation as described in:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Gan, L., & Low, S. H. (2014). Convex relaxations and linear approximation for optimal power flow in multiphase radial networks. In PSSC (pp. 1–9). Wroclaw, Poland. doi:10.1109/PSCC.2014.7038399","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Note that this formulation is complex-valued and additional steps are needed to implement this in JuMP.","category":"page"},{"location":"manual/formulations.html#[SOCNLPUBFModel](@ref-SOCNLPUBFModel)","page":"Unbalanced Formulations","title":"SOCNLPUBFModel","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"The starting point is SDPUBFModel. The SDP constraint can be relaxed to a set of SOC constraints, starting from either the real or complex form of the matrix on which the PSD-ness constraint is applied.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Kim, S., Kojima, M., & Yamashita, M. (2003). Second order cone programming relaxation of a positive semidefinite constraint. Optimization Methods and Software, 18(5), 535–541. doi:10.1080/1055678031000148696\nAndersen, M. S., Hansson, A., & Vandenberghe, L. (2014). Reduced-complexity semidefinite relaxations of optimal power flow problems. IEEE Trans. Power Syst., 29(4), 1855–1863.","category":"page"},{"location":"manual/formulations.html#[SOCConicUBFModel](@ref-SOCConicUBFModel)","page":"Unbalanced Formulations","title":"SOCConicUBFModel","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"See SOCNLPUBFModel","category":"page"},{"location":"manual/formulations.html#[LPUBFDiagModel](@ref-LPUBFDiagModel)","page":"Unbalanced Formulations","title":"LPUBFDiagModel","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This formulation has originally been developed by Sankur et al.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Sankur, M. D., Dobbe, R., Stewart, E., Callaway, D. S., & Arnold, D. B. (2016). A linearized power flow model for optimization in unbalanced distribution systems. arXiv:1606.04492v2","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"and is here cast as only considering the diagonal elements of the linear formulation by Gan and Low:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Gan, L., & Low, S. H. (2014). Convex relaxations and linear approximation for optimal power flow in multiphase radial networks. In PSSC (pp. 1–9). Wroclaw, Poland. doi:10.1109/PSCC.2014.7038399","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This furthermore leads to the imaginary part of the lifted node voltage variable W in Gan and Low being redundant, so it is substituted out in LPUBFDiagModel.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"The full formulation from Gan and Low was supported as LPUBFFullModel in PowerModelsDistribution up to version 0.7. ","category":"page"},{"location":"manual/formulations.html#[FBSUBFPowerModel](@ref-FBSUBFPowerModel),-[FOTPUPowerModel](@ref-FOTPUPowerModel),-[FOTRUPowerModel](@ref-FOTRUPowerModel)","page":"Unbalanced Formulations","title":"FBSUBFPowerModel, FOTPUPowerModel, FOTRUPowerModel","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"The linear FBS and FOT formulations as described in:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Girigoudar, K., & Roald, L.A. (2021). Linearized Three-Phase Optimal Power Flow Models for Distribution Grids with Voltage Unbalance. 2021 IEEE Conference on Decision and Control (CDC).","category":"page"},{"location":"manual/formulations.html#Unbalanced-Network-Formulation-Type-Hierarchy","page":"Unbalanced Formulations","title":"Unbalanced Network Formulation Type Hierarchy","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"PowerModelsDistribution has a rich model type hierarchy similar to PowerModels. At the top of the type hierarchy we can distinguish between conic, active power only, and branch flow models:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"abstract type AbstractUnbalancedConicModel <: AbstractPowerModel end\nabstract type AbstractUnbalancedActivePowerModel <: AbstractPowerModel end\nabstract type AbstractUBFModel <: AbstractPowerModel end\nabstract type AbstractUBFQPModel <: AbstractUBFModel end\nabstract type AbstractUBFConicModel <: AbstractUBFModel end\nconst AbstractUnbalancedConicModels = Union{AbstractUnbalancedConicModel, AbstractUBFConicModel}","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Several nonlinear (non-convex) models are available at the top level:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"abstract type AbstractUnbalancedACPModel <: AbstractPowerModel end\nabstract type AbstractUnbalancedACRModel <: AbstractPowerModel end\nabstract type AbstractUnbalancedIVRModel <: AbstractUnbalancedACRModel end","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"The following relaxations are available under these hierarchies:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"abstract type AbstractNLPUBFModel <: AbstractUBFQPModel end\nabstract type AbstractConicUBFModel <: AbstractUBFConicModel end\nconst AbstractUBFModels = Union{AbstractNLPUBFModel, AbstractConicUBFModel}\n\nabstract type SDPUBFModel <: AbstractConicUBFModel end\nabstract type SDPUBFKCLMXModel <: SDPUBFModel end\nabstract type SOCNLPUBFModel <: AbstractNLPUBFModel end\nabstract type SOCConicUBFModel <: AbstractConicUBFModel end\nconst SOCUBFModels = Union{SOCNLPUBFModel, SOCConicUBFModel}","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"where UBF is an unbalanced variant of the Branch Flow models from PowerModels. Models which do not contain UBF in their name are Bus Injection Models e.g. AbstractUnbalancedACPModel. Finally, some linear unbalanced power flow models are available under the following hierarchy:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"abstract type AbstractUnbalancedDCPModel <: AbstractUnbalancedActivePowerModel end\nabstract type AbstractUnbalancedNFAModel <: AbstractUnbalancedDCPModel end\nabstract type AbstractLPUBFModel <: AbstractNLPUBFModel end\nabstract type LPUBFDiagModel <: AbstractLPUBFModel end\nconst LinDist3FlowModel = LPUBFDiagModel\nabstract type FBSUBFModel <: AbstractLPUBFModel end","category":"page"},{"location":"manual/formulations.html#Unbalanced-Power-Models","page":"Unbalanced Formulations","title":"Unbalanced Power Models","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Each of these Models can be used as the type parameter for an UnbalancedPowerModel:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"mutable struct ACPUPowerModel <: AbstractUnbalancedACPModel @pmd_fields end\nmutable struct ACRUPowerModel <: AbstractUnbalancedACRModel @pmd_fields end\nmutable struct DCPUPowerModel <: AbstractUnbalancedDCPModel @pmd_fields end\nmutable struct NFAUPowerModel <: AbstractUnbalancedNFAModel @pmd_fields end\n\nmutable struct SDPUBFPowerModel <: SDPUBFModel @pmd_fields end\nmutable struct SDPUBFKCLMXPowerModel <: SDPUBFKCLMXModel @pmd_fields end\n\nmutable struct SOCNLPUBFPowerModel <: SOCNLPUBFModel @pmd_fields end\nmutable struct SOCConicUBFPowerModel <: SOCConicUBFModel @pmd_fields end\n\nmutable struct LPUBFDiagPowerModel <: LPUBFDiagModel @pmd_fields end\nconst LinDist3FlowPowerModel = LPUBFDiagPowerModel\nmutable struct FBSUBFPowerModel <: FBSUBFModel @pmd_fields end\nmutable struct FOTPUPowerModel <: AbstractUnbalancedACPModel @pmd_fields end\nmutable struct FOTRUPowerModel <: AbstractUnbalancedACRModel @pmd_fields end","category":"page"},{"location":"manual/formulations.html#Optimization-problem-classes","page":"Unbalanced Formulations","title":"Optimization problem classes","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"NLP (nonconvex): ACPUPowerModel, ACRUPowerModel, IVRUPowerModel\nSDP: SDPUBFPowerModel, SDPUBFKCLMXPowerModel\nSOC(-representable): SOCNLPUBFPowerModel, SOCConicUBFPowerModel\nLinear: LPUBFDiagPowerModel (LinDist3FlowPowerModel), FBSUBFPowerModel, FOTPUPowerModel, FOTRUPowerModel, DCPUPowerModel, NFAUPowerModel ","category":"page"},{"location":"manual/formulations.html#Matrix-equations-versus-scalar-equations","page":"Unbalanced Formulations","title":"Matrix equations versus scalar equations","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"JuMP supports vectorized syntax, but not for nonlinear constraints. Therefore, certain formulations must be implemented in a scalar fashion. Other formulations can be written as matrix (in)equalities. The current implementations are categorized as follows:","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Scalar: ACPUPowerModel, ACRUPowerModel, IVRUPowerModel, DCPUPowerModel, NFAPowerModel, FBSUBFPowerModel, FOTPUPowerModel, FOTRUPowerModel\nMatrix: SDPUBFPowerModel, SDPUBFKCLMXPowerModel, SOCNLPUBFPowerModel, SOCConicUBFPowerModel, LPUBFDiagPowerModel","category":"page"},{"location":"manual/formulations.html#Explicit-Neutral-Models","page":"Unbalanced Formulations","title":"Explicit Neutral Models","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"Explicit neutral (EN) models represent the neutral currents explicitly; unlike all the previous models, which implicitly assume they are grounded immediately where they originate.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"There are two broad classes of formulations: IVR ones an ACR one.","category":"page"},{"location":"manual/formulations.html#IVR","page":"Unbalanced Formulations","title":"IVR","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"AbstractExplicitNeutralIVRModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This abstract type groups all EN IVR formulations, and is a subtype of AbstractUnbalancedIVRModel.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"AbstractNLExplicitNeutralIVRModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This abstract type groups non-linear EN IVR formulations, and is a subtype of AbstractExplicitNeutralIVRModel.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"IVRENPowerModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This concrete type is a non-linear EN IVR formulation.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"IVRReducedENPowerModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This concrete type is a non-linear EN IVR formulation, where the branches only have series current variables (instead of also total current variables).","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"AbstractQuadraticExplicitNeutralIVRModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This abstract type groups quadratic EN IVR formulations, and is a subtype of AbstractExplicitNeutralIVRModel.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"IVRQuadraticENPowerModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This concrete type is a quadratic EN IVR formulation.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"IVRReducedQuadraticENPowerModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This concrete type is a quadratic EN IVR formulation, where the branches only have series current variables (instead of also total current variables).","category":"page"},{"location":"manual/formulations.html#ACR","page":"Unbalanced Formulations","title":"ACR","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"AbstractExplicitNeutralACRModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This abstract type is a subtype of AbstractUnbalancedACRModel, analogous to the IVR structure.","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"ACRENPowerModel","category":"page"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"This is the only concrete ACR type amongst the EN formulations.","category":"page"},{"location":"manual/formulations.html#Overview-of-hierarchy","page":"Unbalanced Formulations","title":"Overview of hierarchy","text":"","category":"section"},{"location":"manual/formulations.html","page":"Unbalanced Formulations","title":"Unbalanced Formulations","text":"EN-IVR (AbstractExplicitNeutralIVRModel)\n|\n|-- NL (AbstractNLExplicitNeutralIVRModel)\n| |\n| |-- IVRENPowerModel\n|\n|-- Quadratic (AbstractQuadraticExplicitNeutralIVRModel)\n |\n |-- IVRENPowerModel\n |\n |-- IVRReducedENPowerModel\n\nEN-ACR (AbstractExplicitNeutralIVRModel)\n|\n|-- ACRENPowerModel","category":"page"},{"location":"manual/enums.html#PowerModelsDistribution-Enum-Types","page":"Enums in Engineering Model","title":"PowerModelsDistribution Enum Types","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"Within the PowerModelsDistribution Engineering Model we have included the use of Enums. Here we document the fields for which Enums are expected and the possible Enums available.","category":"page"},{"location":"manual/enums.html#Data-Model","page":"Enums in Engineering Model","title":"Data Model","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"Any place in PowerModelsDistribution that calls for specifying the data_model, either in function calls or the \"data_model\" field inside the data structure itself, will expect a DataModel type.","category":"page"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"The DSS data model is an output of parse_dss, and is an untranslated raw parse of a DSS file. This Enum exists for use by count_nodes, where the method to count the number of active nodes is different between all three models.","category":"page"},{"location":"manual/enums.html#Component-Status","page":"Enums in Engineering Model","title":"Component Status","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"All \"status\" fields in the ENGINEERING model expect a Status type.","category":"page"},{"location":"manual/enums.html#Connection-Configuration","page":"Enums in Engineering Model","title":"Connection Configuration","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"All \"configuration\" fields in the ENGINEERING model expect a ConnConfig type.","category":"page"},{"location":"manual/enums.html#Load-Model","page":"Enums in Engineering Model","title":"Load Model","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"For load objects, the \"model\" field expects a LoadModel type to specify the type of load model to use, where","category":"page"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"POWER indicates constant power,\nCURRENT indicates constant current,\nIMPEDANCE indicates constant impedance,\nEXPONENTIAL indicates an exponential load model, and\nZIP indicates a ZIP model","category":"page"},{"location":"manual/enums.html#Shunt-Model","page":"Enums in Engineering Model","title":"Shunt Model","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"For shunt objects, the \"model\" field expects a ShuntModel type to specify the origin of the shunt object, which is important for transient analysis.","category":"page"},{"location":"manual/enums.html#Switch-State","page":"Enums in Engineering Model","title":"Switch State","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"For switch objects, the \"state\" field expects a SwitchState type to specify whether the switch is currently open or closed.","category":"page"},{"location":"manual/enums.html#Dispatchable-Component","page":"Enums in Engineering Model","title":"Dispatchable Component","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"Some components can be Dispatchable, e.g. if a switch is dispatchable that means it is free to open or close, but if not then it is fixed in place, or if a load is dispatchable it implies that it can be shed in a run_mc_mld problem.","category":"page"},{"location":"manual/enums.html#Generator-Control-Mode","page":"Enums in Engineering Model","title":"Generator Control Mode","text":"","category":"section"},{"location":"manual/enums.html","page":"Enums in Engineering Model","title":"Enums in Engineering Model","text":"For generator objects, the \"control_mode\" field expects a ControlMode type to specify whether the generator is operating in an isochronous mode (i.e. is frequency forming) or droop mode (i.e. is frequency following).","category":"page"},{"location":"manual/specifications.html#Problem-Specifications","page":"Problem Specifications","title":"Problem Specifications","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"In addition to the standard power flow solve_mc_pf, and optimal power flow solve_mc_opf, there are several notable problem specifications included in PowerModelsDistribution.","category":"page"},{"location":"manual/specifications.html#Optimal-Power-Flow-(OPF)-with-On-Load-Tap-Changers-(OLTC)","page":"Problem Specifications","title":"Optimal Power Flow (OPF) with On-Load Tap Changers (OLTC)","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"This problem is identical to mc_opf, except that all transformers are now modelled as on-load tap changers (OLTCs). Each phase has an individual tap ratio, which can be either variable or fixed, as specified in the data model.","category":"page"},{"location":"manual/specifications.html#OLTC-Objective","page":"Problem Specifications","title":"OLTC Objective","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"objective_mc_min_fuel_cost","category":"page"},{"location":"manual/specifications.html#OLTC-Variables","page":"Problem Specifications","title":"OLTC Variables","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"variable_mc_oltc_transformer_tap","category":"page"},{"location":"manual/specifications.html#OLTC-Constraints","page":"Problem Specifications","title":"OLTC Constraints","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"constraint_mc_transformer_power(pm, i, fix_taps=false)","category":"page"},{"location":"manual/specifications.html#Minimal-Load-Delta-(MLD)-Problem-Specification","page":"Problem Specifications","title":"Minimal Load Delta (MLD) Problem Specification","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"Load shed (continuous) problem. See \"Relaxations of AC Maximal Load Delivery for Severe Contingency Analysis\" by C. Coffrin et al. (DOI: 10.1109/TPWRS.2018.2876507) for single-phase case.","category":"page"},{"location":"manual/specifications.html#MLD-Variables","page":"Problem Specifications","title":"MLD Variables","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"beginalign\nmboxvariables nonumber \n z^v_i in 01 forall i in N mbox - bus voltage onoff variable \n z^g_i in 01 forall i in G mbox - generator onoff variable \n z^b_i in 01 forall i in Bmbox - storage onoff variable \n z^d_i in (01) forall i in L mbox - continuous load shedding variable \n z^s_i in (01) forall i in H mbox - continuous shunt shedding variable\nendalign","category":"page"},{"location":"manual/specifications.html#MLD-Objective","page":"Problem Specifications","title":"MLD Objective","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"beginalign\nmboxminimize left (\nsum_substackiin Ncin C10 left (1-z^v_i right ) + sum_substackiin Lcin C10 omega_icleft Releft (S^d_iright )right left ( 1-z^d_i right ) + sum_substackiin Hcin Cleft Releft (S^s_i right )right left (1-z^s_i right ) + sum_substackiin Gcin CDelta^g_i + sum_substackiin Bcin CDelta^b_i right )\nendalign","category":"page"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"where","category":"page"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"beginalign\nDelta^g_i = left Releft (S^g_i(0) right ) - Releft (S^g_i right ) right \nDelta^g_i = -left Releft (S^g_i(0) right ) - Releft (S^g_i right ) right \nDelta^b_i = left Releft (S^b_i(0) right ) - Releft (S^b_i right ) right \nDelta^b_i = -left Releft (S^b_i(0) right ) - Releft (S^b_i right ) right \nendalign","category":"page"},{"location":"manual/specifications.html#MLD-Constraints","page":"Problem Specifications","title":"MLD Constraints","text":"","category":"section"},{"location":"manual/specifications.html","page":"Problem Specifications","title":"Problem Specifications","text":"beginalign\nmboxsubject to nonumber \n z^v_i v^l_ic leq left V_ic right leq z_i^v v^u_ic forall i in Nforall c in C \n z^g_i S^gl_ic leq S^g_ic leq z^g_i S^gu_ic forall i in Gforall c in C \n sum_substackkin G_icin C S^g_kc - sum_substackkin L_icin C z^d_k S^d_kc- sum_substackkin H_icin C z^s_k Y^s_kcleft V_ic right ^2 nonumber \n = sum_substack(ij)in E_icup E_i^Rcin C S_ijc forall i in N\nendalign","category":"page"},{"location":"reference/logging.html#LoggingAPI","page":"Logging","title":"Logging","text":"","category":"section"},{"location":"reference/logging.html","page":"Logging","title":"Logging","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nPages = [\"logging.jl\"]","category":"page"},{"location":"reference/logging.html#PowerModelsDistribution.reset_logging_level!-Tuple{}","page":"Logging","title":"PowerModelsDistribution.reset_logging_level!","text":"reset_logging_level!()\n\nResets the log level to Info\n\n\n\n\n\n","category":"method"},{"location":"reference/logging.html#PowerModelsDistribution.restore_global_logger!-Tuple{}","page":"Logging","title":"PowerModelsDistribution.restore_global_logger!","text":"restore_global_logger!()\n\nRestores the global logger to its default state (before PMD was loaded)\n\n\n\n\n\n","category":"method"},{"location":"reference/logging.html#PowerModelsDistribution.set_logging_level!-Tuple{Symbol}","page":"Logging","title":"PowerModelsDistribution.set_logging_level!","text":"set_logging_level!(level::Symbol)\n\nSets the logging level for PMD: :Info, :Warn, :Error\n\n\n\n\n\n","category":"method"},{"location":"reference/logging.html#PowerModelsDistribution.silence!-Tuple{}","page":"Logging","title":"PowerModelsDistribution.silence!","text":"silence!()\n\nSets loglevel for PMD to :Error, silencing Info and Warn\n\n\n\n\n\n","category":"method"},{"location":"reference/base.html#Base","page":"Base","title":"Base","text":"","category":"section"},{"location":"reference/base.html","page":"Base","title":"Base","text":"ref\nvar\nids\ncon\nsol\nnws\nnw_ids","category":"page"},{"location":"reference/base.html#PowerModelsDistribution.ref","page":"Base","title":"PowerModelsDistribution.ref","text":"helper function to access the AbstractUnbalancedPowerModel structs' ref, returns (id,data) pairs\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#PowerModelsDistribution.var","page":"Base","title":"PowerModelsDistribution.var","text":"helper function to access the AbstractUnbalancedPowerModel structs' var, returns JuMP VariableRef\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#PowerModelsDistribution.ids","page":"Base","title":"PowerModelsDistribution.ids","text":"helper function to access the ids of AbstractUnbalancedPowerModel structs' ref, returns ints\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#PowerModelsDistribution.con","page":"Base","title":"PowerModelsDistribution.con","text":"helper function to access the AbstractUnbalancedPowerModel structs' con, returns JuMP Constraint\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#PowerModelsDistribution.sol","page":"Base","title":"PowerModelsDistribution.sol","text":"helper function to access the AbstractUnbalancedPowerModel structs' sol, returns Dict\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#PowerModelsDistribution.nws","page":"Base","title":"PowerModelsDistribution.nws","text":"helper function to access multinetwork data from AbstractUnbalancedPowerModel structs, returns (id,data) pairs\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#PowerModelsDistribution.nw_ids","page":"Base","title":"PowerModelsDistribution.nw_ids","text":"helper function to access the ids of multinetworks from AbstractUnbalancedPowerModel structs, returns ints\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#Helper-functions","page":"Base","title":"Helper functions","text":"","category":"section"},{"location":"reference/base.html","page":"Base","title":"Base","text":"@smart_constraint\nset_lower_bound\nset_upper_bound\ncomp_start_value","category":"page"},{"location":"reference/base.html#PowerModelsDistribution.@smart_constraint","page":"Base","title":"PowerModelsDistribution.@smart_constraint","text":"@smart_constraint model::JuMP.Model vars::Vector expr::JuMP.Expression\n\nDetection of whether a constraint should be NL or not\"\n\n\n\n\n\n","category":"macro"},{"location":"reference/base.html#PowerModelsDistribution.set_lower_bound","page":"Base","title":"PowerModelsDistribution.set_lower_bound","text":"function set_lower_bound(\n\tx::JuMP.VariableRef,\n\tbound::Real\n)\n\nLocal wrapper method for JuMP.setlowerbound, which skips NaN and infinite (-Inf only)\n\n\n\n\n\nfunction set_lower_bound(\n\txs::Vector{JuMP.VariableRef},\n\tbound::Real\n)\n\nLocal wrapper method for JuMP.setlowerbound, which skips NaN and infinite (-Inf only). Note that with this signature, the bound is applied to every variable in the vector.\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#PowerModelsDistribution.set_upper_bound","page":"Base","title":"PowerModelsDistribution.set_upper_bound","text":"function set_upper_bound(\n\tx::JuMP.VariableRef,\n\tbound\n)\n\nLocal wrapper method for JuMP.setupperbound, which skips NaN and infinite (+Inf only)\n\n\n\n\n\nfunction set_upper_bound(\n\txs::Vector{JuMP.VariableRef},\n\tbound::Real\n)\n\nLocal wrapper method for JuMP.setupperbound, which skips NaN and infinite (+Inf only). Note that with this signature, the bound is applied to every variable in the vector.\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#PowerModelsDistribution.comp_start_value","page":"Base","title":"PowerModelsDistribution.comp_start_value","text":"comp_start_value(\n comp::Dict,\n keys::Vector{String},\n conductor::Int,\n default::Any\n)\n\nSearches for start value for a variable key in order from a list of keys of a component comp for conductor conductor, and if one does not exist, uses default\n\n\n\n\n\nfunction comp_start_value(\n\tcomp::Dict{String,<:Any},\n\tkey::String,\n\tconductor::Int,\n\tdefault::Any\n)\n\nSearches for start value for a variable key of a component comp for conductor conductor, and if one does not exist, uses default\n\n\n\n\n\nfunction comp_start_value(\n\tcomp::Dict{String,<:Any},\n\tkeys::String,\n\tdefault::Any=0.0\n)\n\nSearches for start value for a variable key in order from a list of keys of a component comp, and if one does not exist, uses default. This is the conductor-agnostic version of comp_start_value.\n\n\n\n\n\nfunction comp_start_value(\n comp::Dict,\n key::String,\n default::Any=0.0\n)\n\nSearches for start value for a variable key of a component comp, and if one does not exist, uses default. This is the conductor-agnostic version of comp_start_value.\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#Ref-Creation-Functions","page":"Base","title":"Ref Creation Functions","text":"","category":"section"},{"location":"reference/base.html","page":"Base","title":"Base","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"ref_\")","category":"page"},{"location":"reference/base.html#PowerModelsDistribution.ref_add_connected_components!-Tuple{Dict{Symbol}, Dict{String}}","page":"Base","title":"PowerModelsDistribution.ref_add_connected_components!","text":"ref_add_connected_components!(ref::Dict{Symbol,<:Any}, data::Dict{String,<:Any})\n\nRef-extension for opb problem type to add connected components ref\n\n\n\n\n\n","category":"method"},{"location":"reference/base.html#PowerModelsDistribution.ref_add_core!-Tuple{Dict{Symbol, Any}}","page":"Base","title":"PowerModelsDistribution.ref_add_core!","text":"ref_add_core!(ref::Dict{Symbol,Any})\n\nReturns a dict that stores commonly used pre-computed data from of the data dictionary, primarily for converting data-types, filtering out deactivated components, and storing system-wide values that need to be computed globally. Some of the common keys include:\n\n:off_angmin and :off_angmax (see calc_theta_delta_bounds(data)),\n:bus – the set {(i, bus) in ref[:bus] : bus[\"bus_type\"] != 4},\n:gen – the set {(i, gen) in ref[:gen] : gen[\"gen_status\"] == 1 && gen[\"gen_bus\"] in keys(ref[:bus])},\n:branch – the set of branches that are active in the network (based on the component status values),\n:arcs_branch_from – the set [(i,b[\"f_bus\"],b[\"t_bus\"]) for (i,b) in ref[:branch]],\n:arcs_branch_to – the set [(i,b[\"t_bus\"],b[\"f_bus\"]) for (i,b) in ref[:branch]],\n:arcs_branch – the set of arcs from both arcs_from and arcs_to,\n:arcs_switch_from – the set [(i,b[\"f_bus\"],b[\"t_bus\"]) for (i,b) in ref[:switch]],\n:arcs_switch_to – the set [(i,b[\"t_bus\"],b[\"f_bus\"]) for (i,b) in ref[:switch]],\n:arcs_switch – the set of arcs from both arcs_switch_from and arcs_switch_to,\n:arcs_transformer_from – the set [(i,b[\"f_bus\"],b[\"t_bus\"]) for (i,b) in ref[:transformer]],\n:arcs_transformer_to – the set [(i,b[\"t_bus\"],b[\"f_bus\"]) for (i,b) in ref[:transformer]],\n:arcs_transformer – the set of arcs from both arcs_transformer_from and arcs_transformer_to,\n:bus_arcs_branch – the mapping Dict(i => [(l,i,j) for (l,i,j) in ref[:arcs_branch]]),\n:bus_arcs_transformer – the mapping Dict(i => [(l,i,j) for (l,i,j) in ref[:arcs_transformer]]),\n:bus_arcs_switch – the mapping Dict(i => [(l,i,j) for (l,i,j) in ref[:arcs_switch]]),\n:buspairs – (see buspair_parameters(ref[:arcs_branch_from], ref[:branch], ref[:bus])),\n:bus_gens – the mapping Dict(i => [gen[\"gen_bus\"] for (i,gen) in ref[:gen]]).\n:bus_loads – the mapping Dict(i => [load[\"load_bus\"] for (i,load) in ref[:load]]).\n:bus_shunts – the mapping Dict(i => [shunt[\"shunt_bus\"] for (i,shunt) in ref[:shunt]]).\n\n\n\n\n\n","category":"method"},{"location":"reference/base.html#PowerModelsDistribution.ref_calc_storage_injection_bounds-Tuple{Any, Any}","page":"Base","title":"PowerModelsDistribution.ref_calc_storage_injection_bounds","text":"ref_calc_storage_injection_bounds(storage, buses)\n\nComputes storage bounds\n\n\n\n\n\n","category":"method"},{"location":"reference/base.html#InfrastructureModels-Extensions","page":"Base","title":"InfrastructureModels Extensions","text":"","category":"section"},{"location":"reference/base.html","page":"Base","title":"Base","text":"PowerModelsDistribution._IM.solution_preprocessor\nPowerModelsDistribution._IM.build_solution_values","category":"page"},{"location":"reference/base.html#InfrastructureModels.solution_preprocessor","page":"Base","title":"InfrastructureModels.solution_preprocessor","text":"Definition of the default solution preprocessor for PowerModelsDistribution\n\n\n\n\n\n","category":"function"},{"location":"reference/base.html#InfrastructureModels.build_solution_values","page":"Base","title":"InfrastructureModels.build_solution_values","text":"custom build_solution_values for multiconductor (vector) variables\n\n\n\n\n\ncustom build_solution_values for multiconductor (vector) nonlinear expressions\n\n\n\n\n\ncustom build_solution_values for multiconductor (vector) generic affine expressions\n\n\n\n\n\ncustom build_solution_values for multiconductor (vector) constants\n\n\n\n\n\ncustom build_solution_values for generic dense axis arrays\n\n\n\n\n\ncustom build_solution_values for multiconductor (vector) constants\n\n\n\n\n\n","category":"function"},{"location":"reference/variables.html#VariableAPI","page":"Variables","title":"Variables","text":"","category":"section"},{"location":"reference/variables.html","page":"Variables","title":"Variables","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"variable\")","category":"page"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current-Tuple{AbstractExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current","text":"function variable_mc_branch_current(\n\tpm::AbstractExplicitNeutralIVRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, creates total current variables :cr and :ci, series current variables :csr and :csi, and placeholder dictionaries for the terminal current flows :cr_bus and :ci_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current-Tuple{AbstractLPUBFModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current-Tuple{AbstractUnbalancedIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current-Tuple{ReducedExplicitNeutralIVRModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current","text":"function variable_mc_branch_current(\n\tpm::ReducedExplicitNeutralIVRModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor branch-reduced IVR models with explicit neutrals, creates series current variables :csr and :csi, placeholder dictionaries for the total current :cr and :ci, and placeholder dictionaries for the terminal current flows :cr_bus and :ci_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current_imaginary","text":"variable: ci[l,i,j] for (l,i,j) in arcs\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current_imaginary","text":"function variable_mc_branch_current_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates branch imaginary current variables :ci for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current_real","text":"variable: cr[l,i,j] for (l,i,j) in arcs\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current_real","text":"function variable_mc_branch_current_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates branch real current variables :cr for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current_series_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current_series_imaginary","text":"variable: csi[l] for l in branch\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current_series_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current_series_imaginary","text":"function variable_mc_branch_current_series_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates branch imaginary series current variables :csi for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current_series_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current_series_real","text":"variable: csr[l] for l in branch\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_current_series_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_current_series_real","text":"function variable_mc_branch_current_series_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates branch real series current variables :csr for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_flow_ne_reactive-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_flow_ne_reactive","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power-Tuple{AbstractExplicitNeutralACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power","text":"function variable_mc_branch_power(\n\tpm::AbstractExplicitNeutralACRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nFor ACR models with explicit neutrals, creates branch power variables :p and :q and placeholder dictionaries for the terminal power flows :p_bus and :q_bus.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power","text":"branch flow variables, delegated back to PowerModels\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power-Tuple{FBSUBFPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power","text":"variable_mc_branch_power(pm::FBSUBFPowerModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nBranch flow variables similar to LPUBFDiagModel\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power-Tuple{LPUBFDiagModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power_imaginary-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power_imaginary","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power_imaginary","text":"variable: q[l,i,j] for (l,i,j) in arcs\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power_imaginary","text":"function variable_mc_branch_power_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates branch reactive power variables :q for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power_real-Tuple{AbstractUnbalancedAPLossLessModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power_real","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power_real","text":"variable: p[l,i,j] for (l,i,j) in arcs\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_branch_power_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_branch_power_real","text":"function variable_mc_branch_power_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates branch active power variables :p for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{AbstractUnbalancedACPModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{AbstractUnbalancedACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{AbstractUnbalancedDCPModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{AbstractUnbalancedIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{AbstractUnbalancedNFAModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"nothing to do, these models do not have complex voltage variables\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{FBSUBFPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"variable_mc_bus_voltage(pm::FBSUBFPowerModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nVoltage variables are defined in rectangular coordinates similar to ACRUPowerModel. An initial operating point is specified for linearization.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{FOTPUPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"variable_mc_bus_voltage(pm::FOTPUPowerModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nVoltage variables are defined in polar coordinates similar to ACPUPowerModel. An initial operating point is specified for linearization.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{FOTRUPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"variable_mc_bus_voltage(pm::FOTRUPowerModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nVoltage variables are defined in rectangular coordinates similar to ACRUPowerModel. An initial operating point is specified for linearization similar to FBSUBFPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{LPUBFDiagModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage","text":"function variable_mc_bus_voltage(\n\tpm::RectangularVoltageExplicitNeutralModels;\n\tnw=nw_id_default,\n\tbounded::Bool=true,\n)\n\nCreates rectangular voltage variables :vr and :vi for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_angle-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_angle","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_imaginary","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_imaginary","text":"function variable_mc_bus_voltage_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates imaginary voltage variables :vr for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_imaginary_on_off-Tuple{AbstractUnbalancedACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_imaginary_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_indicator-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_indicator","text":"Create variables for bus status\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_magnitude_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_magnitude_on_off","text":"on/off voltage magnitude variable\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_magnitude_only-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_magnitude_only","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_magnitude_sqr-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_magnitude_sqr","text":"variable: w[i] >= 0 for i in `buses\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_magnitude_sqr_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_magnitude_sqr_on_off","text":"voltage variable magnitude squared (relaxed form)\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_on_off-Tuple{AbstractUnbalancedACPModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_on_off-Tuple{AbstractUnbalancedACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_on_off-Tuple{AbstractUnbalancedDCPModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_on_off-Tuple{LPUBFDiagModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_on_off","text":"Create voltage variables for branch flow model\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_prod_hermitian-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_prod_hermitian","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_real","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_real","text":"function variable_mc_bus_voltage_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates real voltage variables :vr for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_bus_voltage_real_on_off-Tuple{AbstractUnbalancedACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_bus_voltage_real_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_capacitor_reactive_power-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_capacitor_reactive_power","text":"variable_mc_capacitor_reactive_power(pm::AbstractUnbalancedPowerModel; nw::Int=nw_id_default)\n\nCapacitor (with capcontrol) relaxed power variables for AbstractLPUBFModel (using McCormick envelopes)\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_capacitor_switch_state-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_capacitor_switch_state","text":"variable_mc_capacitor_switch_state(pm::AbstractUnbalancedPowerModel, relax::Bool; nw::Int=nw_id_default, report::Bool=true)\n\nCapacitor (with capcontrol) switch state (open/close) variables\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_capcontrol-Tuple{AbstractLPUBFModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_capcontrol","text":"variable_mc_capcontrol(pm::AbstractLPUBFModel; nw::Int=nw_id_default, relax::Bool=false, report::Bool=true)\n\nCapacitor switching and relaxed power variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_capcontrol-Tuple{AbstractUnbalancedNFAModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_capcontrol","text":"nothing to do, these models do not have complex voltage variables\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_capcontrol-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_capcontrol","text":"variable_mc_capcontrol(pm::AbstractUnbalancedPowerModel; nw::Int=nw_id_default, relax::Bool=false, report::Bool=true)\n\nCapacitor switching variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_gen_indicator-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_gen_indicator","text":"Create variables for generator status\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_current-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_current","text":"For the matrix KCL formulation, the generator needs an explicit current variable.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_current-Tuple{AbstractUnbalancedIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_current","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_current-Tuple{SOCUBFModels, Vector{Int64}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_current","text":"variable_mc_generator_current(pm::SOCUBFModels, gen_ids::Vector{Int}; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nFor the SOC branch-flow formulation, the delta-generator needs an explicit current variable.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_current_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_current_imaginary","text":"variable: cig[j] for j in gen\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_current_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_current_imaginary","text":"function variable_mc_generator_current_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates generator imaginary current variables :cig for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_current_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_current_real","text":"variable: crg[j] for j in gen\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_current_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_current_real","text":"function variable_mc_generator_current_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates generator real current variables :crg for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power-Tuple{AbstractExplicitNeutralACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power","text":"function variable_mc_generator_power(\n\tpm::AbstractExplicitNeutralACRModel;\n\tnw::Int=nw_id_default,\n)\n\nFor ACR models with explicit neutrals, creates generator power variables :pg and :qg, and placeholder dictionaries for terminal power flows :pg_bus and :qg_bus,\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power-Tuple{AbstractNLExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power","text":"function variable_mc_generator_power(\n\tpm::AbstractNLExplicitNeutralIVRModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true\n)\n\nFor IVR models with explicit neutrals, no power variables are required\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power-Tuple{AbstractQuadraticExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power","text":"function variable_mc_generator_power(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, creates generator power variables :pg and :qg\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power","text":"variable_mc_generator_power(pm::AbstractUBFModels; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nThe variable creation for generators in branch flow model. Delta generators always need an auxilary power variable (X) similar to delta loads. Wye generators however, don't need any variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power","text":"create variables for generators, delegate to PowerModels\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power-Tuple{SDPUBFKCLMXModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power","text":"For the matrix KCL formulation, the generator needs an explicit current and power variable.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power-Tuple{SOCUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power","text":"variable_mc_generator_power(pm::SOCUBFModels; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nThe variable creation for generators in SOC branch flow model. Delta generators always need an auxilary power variable (X) and current squared variable (CC) similar to delta loads. Wye generators however, don't need any variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_delta_aux-Tuple{AbstractUBFModels, Vector{Int64}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_delta_aux","text":"variable_mc_generator_power_delta_aux(pm::AbstractUBFModels, gen_ids::Vector{Int}; nw::Int=nw_id_default, eps::Real=0.1, bounded::Bool=true, report::Bool=true)\n\nCreates power matrix variable X for delta-connected generators similar to delta loads.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_imaginary-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_imaginary","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_imaginary","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_imaginary","text":"function variable_mc_generator_power_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates generator reactive power variables :qg for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_imaginary_on_off-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_imaginary_on_off","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_imaginary_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_imaginary_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_mx-Tuple{SDPUBFKCLMXModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_mx","text":"For the matrix KCL formulation, the generator needs an explicit power variable.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_real","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_real","text":"function variable_mc_generator_power_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates generator active power variables :pg for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_generator_power_real_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_generator_power_real_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_current-Tuple{AbstractExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_current","text":"function variable_mc_load_current(\n\tpm::AbstractExplicitNeutralIVRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, creates placeholder dictionaries for the load current :crd and :cid, and for the terminal current flows :crd_bus and :cid_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_current-Tuple{AbstractQuadraticExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_current","text":"function variable_mc_load_current(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, creates load current variables :crd and :cid, and placeholder dictionaries for the terminal current flows :crd_bus and :cid_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_current-Tuple{AbstractUBFModels, Vector{Int64}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_current","text":"All loads need a current variable; for wye loads, this variable will be in the wye reference frame whilst for delta currents it will be in the delta reference frame.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_current-Tuple{AbstractUnbalancedIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_current","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_current-Tuple{FBSUBFPowerModel, Vector{Int64}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_current","text":"variable_mc_load_current(pm::FBSUBFPowerModel, load_ids::Vector{Int}; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nNo loads require a current variable. Delta loads are zero-order approximations and wye loads are first-order approximations around the initial operating point.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_current_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_current_imaginary","text":"function variable_mc_load_current_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates load imaginary current variables :cid for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_current_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_current_real","text":"function variable_mc_load_current_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates load real current variables :crd for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_indicator-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_indicator","text":"Create variables for demand status\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power-Tuple{AbstractExplicitNeutralACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power","text":"function variable_mc_load_power(\n\tpm::AbstractExplicitNeutralACRModel;\n\tnw=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor ACR models with explicit neutrals, creates placeholder dictionaries for load power expressions :pd and :qd\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power-Tuple{AbstractNLExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power","text":"function variable_mc_load_power(\n\tpm::AbstractNLExplicitNeutralIVRModel;\n\tnw=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor non-linear IVR models with explicit neutrals, creates placeholder dictionaries for the load power :pd and :qd, and for the terminal power flows :pd_bus and :qd_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power-Tuple{AbstractQuadraticExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power","text":"function variable_mc_load_power(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, creates load power variables :pd and :qd\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power-Tuple{AbstractUBFModels, Vector{Int64}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power","text":"These variables reflect the power consumed by the load, NOT the power injected into the bus nodes; these variables only coincide for wye-connected loads with a grounded neutral.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power","text":"The variable creation for the loads is rather complicated because Expressions are used wherever possible instead of explicit variables. Delta loads always need a current variable and auxilary power variable (X), and all other load model variables are then linear transformations of these (linear Expressions). Wye loads however, don't need any variables when the load is modelled as constant power or constant impedance. In all other cases (e.g. when a cone is used to constrain the power), variables need to be created.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power","text":"Create a dictionary with values of type Any for the load. Depending on the load model, this can be a parameter or a NLexpression. These will be inserted into KCL.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power","text":"Create a dictionary with values of type Any for the load. Depending on the load model, this can be a parameter or a NLexpression. These will be inserted into KCL.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power-Tuple{SDPUBFKCLMXModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power","text":"The variable creation for the loads is rather complicated because Expressions are used wherever possible instead of explicit variables. All loads need a current variable; for wye loads, this variable will be in the wye reference frame whilst for delta currents it will be in the delta reference frame. All loads need variables for the off-diagonals of the nodal power variables. In some cases, the diagonals elements can be created as Expressions. Delta loads only need a current variable and auxilary power variable (X), and all other load model variables are then linear transformations of these (linear Expressions).\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power_active-Tuple{AbstractQuadraticExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power_active","text":"function variable_mc_load_power_active(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates load active power variables :pd for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power_bus-Tuple{SDPUBFKCLMXModel, Vector{Int64}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power_bus","text":"The bus qualifier denotes that this is the power withdrawn at the bus; Only for grounded wye-connected loads, this is the same as the power consumed by the multi-phase load. The off-diagonals only need to be created for the matrix KCL formulation.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power_delta_aux-Tuple{AbstractUBFModels, Vector{Int64}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power_delta_aux","text":"Creates power matrix variable X for delta windings; this defines both the wye-side power Sy and the delta-side power Sd through the lin. transformations Sy = X.Td, Sd = Td.X with Td=[1 -1 0; 0 1 -1; -1 0 1]\n\nSee the paper by Zhao et al. for the first convex relaxation of delta transformations. @INPROCEEDINGS{zhaooptimal2017, \tauthor={C. Zhao, E. Dall'Anese and S. Low}, \tbooktitle={IREP 2017 Bulk Power Systems Dynamics and Control Symposium}, \ttitle={{Optimal Power Flow in Multiphase Radial Networks with Delta Connections}}, \tyear={2017}, \tmonth={}, url={https://www.nrel.gov/docs/fy18osti/67852.pdf} }\n\nSee upcoming paper for discussion of bounds. [reference added when accepted]\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power_delta_aux-Tuple{FBSUBFPowerModel, Vector{Int64}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power_delta_aux","text":"variable_mc_load_power_delta_aux(pm::FBSUBFPowerModel, load_ids::Vector{Int}; nw::Int=nw_id_default, eps::Real=0.1, bounded::Bool=true, report::Bool=true)\n\nAuxiliary variables are not required since delta loads are zero-order approximations calculated using the initial operating point.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_load_power_reactive-Tuple{AbstractQuadraticExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_load_power_reactive","text":"function variable_mc_load_power_reactive(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates load reactive power variables :qd for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_oltc_transformer_tap-Tuple{AbstractUnbalancedNFAModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_oltc_transformer_tap","text":"no voltage variables\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_oltc_transformer_tap-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_oltc_transformer_tap","text":"Create tap variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_shunt_indicator-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_shunt_indicator","text":"Create variables for shunt status\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_slack_bus_power-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_slack_bus_power","text":"generates variables for both active and reactive slack at each bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_slack_bus_power_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_slack_bus_power_imaginary","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_slack_bus_power_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_slack_bus_power_real","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_current-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_current","text":"do nothing by default but some formulations require this\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_current-Tuple{AbstractUnbalancedWConvexModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_current","text":"do nothing by default but some formulations require this\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_indicator-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_indicator","text":"Create variables for storage status\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power","text":"variables for modeling storage units, includes grid injection and internal variables\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_control_imaginary-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_control_imaginary","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_control_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_control_imaginary","text":"a reactive power slack variable that enables the storage device to inject or consume reactive power at its connecting bus, subject to the injection limits of the device.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_control_imaginary_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_control_imaginary_on_off","text":"a reactive power slack variable that enables the storage device to inject or consume reactive power at its connecting bus, subject to the injection limits of the device.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_imaginary-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_imaginary","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_imaginary","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_imaginary_on_off-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_imaginary_on_off","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_imaginary_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_imaginary_on_off","text":"Create variables for reactive storage injection\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_mi-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_mi","text":"variable_mc_storage_power_mi(pm::AbstractUnbalancedPowerModel; nw::Int=nw_id_default, relax::Bool=false, bounded::Bool=true, report::Bool=true)\n\nVariables for storage power (mixed-integer if relax==false)\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_mi_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_mi_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_on_off","text":"Create variables for active and reactive storage injection\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_real","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_storage_power_real_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_storage_power_real_on_off","text":"Create variables for active storage injection\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_current-Tuple{AbstractExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_current","text":"function variable_mc_switch_current(\n\tpm::AbstractExplicitNeutralIVRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nFor IVR models with explicit neutrals, creates switch current variables :crs and :cis, and placeholder dictionaries for the terminal current flows :crsw_bus and :cisw_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_current-Tuple{AbstractUnbalancedIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_current","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_current-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_current","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_current_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_current_imaginary","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_current_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_current_imaginary","text":"function variable_mc_switch_current_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor models with explicit neutrals, creates switch imaginary current variables :cisw for models with explicit neutrals.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_current_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_current_real","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_current_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_current_real","text":"function variable_mc_switch_current_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor models with explicit neutrals, creates switch real current variables :crsw for models with explicit neutrals.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power-Tuple{AbstractExplicitNeutralACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power","text":"function variable_mc_switch_power(\n\tpm::AbstractExplicitNeutralACRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nFor ACR models with explicit neutrals, creates switch power variables :p and :q and placeholder dictionaries for the terminal power flows :ps_bus and :qs_bus.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power","text":"matrix power variables for switches\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power-Tuple{LPUBFDiagModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power","text":"variable_mc_switch_power(pm::LPUBFDiagModel; nw::Int=nw_id_default, bounded::Bool=true, report::Bool=true)\n\nSwitch power variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power_imaginary-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power_imaginary","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power_imaginary","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power_imaginary","text":"function variable_mc_switch_power_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor models with explicit neutrals, creates switch reactive power variables :qsw for models with explicit neutrals. This is defined per arc, i.e. with a variable for the from-side and to-side power.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power_real","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_power_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_power_real","text":"function variable_mc_switch_power_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nFor models with explicit neutrals, creates switch active power variables :psw for models with explicit neutrals. This is defined per arc, i.e. with a variable for the from-side and to-side power.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_switch_state-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_switch_state","text":"switch state (open/close) variables\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_current-Tuple{AbstractExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_current","text":"function variable_mc_transformer_current(\n\tpm::AbstractExplicitNeutralIVRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nFor IVR models with explicit neutrals, create transformer current variables :crt and :cit, and placeholder dictionaries for the terminal current flows :crt_bus and :cit_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_current-Tuple{AbstractUnbalancedIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_current","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_current_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_current_imaginary","text":"variable: ci[l,i,j] for (l,i,j) in arcs\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_current_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_current_imaginary","text":"function variable_mc_transformer_current_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates transformer imaginary current variables :cit for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_current_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_current_real","text":"variable: cr[l,i,j] for (l,i,j) in arcs\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_current_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_current_real","text":"function variable_mc_transformer_current_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates transformer real current variables :crt for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power-Tuple{AbstractExplicitNeutralACRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power","text":"function variable_mc_transformer_power(\n\tpm::AbstractExplicitNeutralACRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nFor ACR models with explicit neutrals, creates transfomer power variables :pt and :qt, and placeholder dictionaries for transformer terminal power flows :pt_bus and :qt_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power-Tuple{AbstractNLExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power","text":"function variable_mc_transformer_power(\n\tpm::AbstractNLExplicitNeutralIVRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nFor non-linear IVR models with explicit neutrals, no power variables are required.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power-Tuple{AbstractQuadraticExplicitNeutralIVRModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power","text":"function variable_mc_transformer_power(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nFor quadratic IVR models with explicit neutrals, creates transformer power variables :pt and :qt\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power-Tuple{AbstractUBFModels}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power","text":"defines matrix transformer power variables for the unbalanced branch flow models\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power","text":"Creates variables for both active and reactive power flow at each transformer.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power-Tuple{FBSUBFPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power","text":"Creates variables for both active and reactive power flow at each transformer.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power-Tuple{LPUBFDiagModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power","text":"Creates variables for both active and reactive power flow at each transformer.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power_imaginary-Tuple{AbstractUnbalancedActivePowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power_imaginary","text":"apo models ignore reactive power flows\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power_imaginary-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power_imaginary","text":"Create variables for the reactive power flowing into all transformer windings.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power_imaginary-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power_imaginary","text":"function variable_mc_transformer_power_imaginary(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates transformer reactive power variables :qt for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power_real-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power_real","text":"Create variables for the active power flowing into all transformer windings.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mc_transformer_power_real-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}}","page":"Variables","title":"PowerModelsDistribution.variable_mc_transformer_power_real","text":"function variable_mc_transformer_power_real(\n\tpm::ExplicitNeutralModels;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true\n)\n\nCreates transformer active power variables :pt for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mx_complex-Union{Tuple{T}, Tuple{JuMP.Model, Vector{T}, Dict{T, Vector{Int64}}, Dict{T, Vector{Int64}}}} where T","page":"Variables","title":"PowerModelsDistribution.variable_mx_complex","text":"variable_mx_complex(\n model::JuMP.Model,\n indices::Array{T,1},\n N::Dict{T,Vector{Int}},\n M::Dict{T,Vector{Int}};\n upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n symm_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n name::Union{String, Tuple{String,String}}=\"\",\n prefix::String=\"\"\n)::Tuple where T\n\nShorthand to create two real matrix variables, where the first is the real part and the second the imaginary part.\n\nIf the name argument is a String, it will be suffixed with 're' and 'im'. It is possible to specify the names of the real and imaginary part directly as a Tuple as well (to achieve P and Q instead of Sre and Sim for example).\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mx_complex_with_diag-Union{Tuple{T}, Tuple{JuMP.Model, Vector{T}, Dict{T, Vector{Int64}}}} where T","page":"Variables","title":"PowerModelsDistribution.variable_mx_complex_with_diag","text":"variable_mx_complex_with_diag(\n model::JuMP.Model,\n indices::Array{T,1},\n N::Dict{T,Vector{Int}};\n upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n symm_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n diag_re::Dict{T,<:Vector{<:Any}}=Dict([(i, zeros(length(N[i]))) for i in indices]),\n diag_im::Dict{T,<:Vector{<:Any}}=Dict([(i, zeros(length(N[i]))) for i in indices]),\n name::Union{String, Tuple{String,String}}=\"\",\n prefix::String=\"\"\n)::Tuple where T\n\nSame as variable_mx_complex, but square and the diagonal of the matrix variables consists of the constants passed as the diagre and diagim argument. The diag argument is a dictionary of (index, 1d-array) pairs.\n\nUseful for power matrices with specified diagonals (constant power wye loads).\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mx_hermitian-Union{Tuple{T}, Tuple{JuMP.Model, Vector{T}, Dict{T, Vector{Int64}}}} where T","page":"Variables","title":"PowerModelsDistribution.variable_mx_hermitian","text":"variable_mx_hermitian(\n model::JuMP.Model,\n indices::Array{T,1},\n N::Dict{T,Vector{Int}};\n upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n symm_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n sqrt_upper_bound::Union{Missing, Dict{T,<:Vector{<:Real}}}=missing,\n sqrt_lower_bound::Union{Missing, Dict{T,<:Vector{<:Real}}}=missing,\n set_lower_bound_diag_to_zero::Bool=false,\n imag_set_diag_to_zero::Bool=true,\n name::Union{String,Tuple{String,String}}=\"\",\n prefix::String=\"\"\n)::Tuple where T\n\nReturns a pair of symmetric and skew-symmetric matrix variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mx_real-Union{Tuple{T}, Tuple{JuMP.Model, Vector{T}, Dict{T, Vector{Int64}}, Dict{T, Vector{Int64}}}} where T","page":"Variables","title":"PowerModelsDistribution.variable_mx_real","text":"variable_mx_real(\n model::JuMP.Model,\n indices::Array{T,1},\n N::Dict{T,Vector{Int}},\n M::Dict{T,Vector{Int}};\n upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n name::String=\"\",\n prefix::String=\"\"\n) where T\n\nThis function creates a set of real matrix variables of size NxM, indexed over the elements of the indices argument. The upper and lower bounds have to be specified, and are dictionaries with the indices as keys and the matrix bounds as values. The name and prefix arguments will be combined into the base_name argument for JuMP; the prefix will typically be the network number nw. Instead of sequentially creating the matrix variables, the elements of the matrices are created sequentially for all matrices at once. I.e., we loop over the elements, and not over the indices. This is needed so that the variable names printed by JuMP are in line with the current design.\n\nReturns a dictionary of (index, matrix variable) pairs\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mx_real_skewsymmetric-Union{Tuple{T}, Tuple{JuMP.Model, Vector{T}, Dict{T, Vector{Int64}}}} where T","page":"Variables","title":"PowerModelsDistribution.variable_mx_real_skewsymmetric","text":"variable_mx_real_skewsymmetric(\n model::JuMP.Model,\n indices::Array{T,1},\n N::Dict{T,Vector{Int}};\n upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n set_diag_to_zero::Bool=true,\n name::String=\"\",\n prefix::String=\"\"\n)::Dict where T\n\nSame as variable_mx_real, but adds skew-symmetry structure.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mx_real_symmetric-Union{Tuple{T}, Tuple{JuMP.Model, Vector{T}, Dict{T, Vector{Int64}}}} where T","page":"Variables","title":"PowerModelsDistribution.variable_mx_real_symmetric","text":"variable_mx_real_symmetric(\n model::JuMP.Model,\n indices::Array{T,1},\n N::Dict{T,Vector{Int}};\n upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n name::String=\"\",\n prefix::String=\"\"\n)::Dict where T\n\nSame as variable_mx_real, but adds symmetry structure\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_mx_real_with_diag-Union{Tuple{T}, Tuple{JuMP.Model, Vector{T}, Dict{T, Vector{Int64}}}} where T","page":"Variables","title":"PowerModelsDistribution.variable_mx_real_with_diag","text":"variable_mx_real_with_diag(\n model::JuMP.Model,\n indices::Array{T,1},\n N::Dict{T,Vector{Int}};\n upper_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n lower_bound::Union{Missing, Dict{T,<:Matrix{<:Real}}}=missing,\n diag::Dict{T,<:Vector{<:Any}}=Dict([(i, fill(0, length(N[i]))) for i in indices]),\n name::String=\"\",\n prefix::String=\"\"\n) where T\n\nSame as variable_mx_real, but has to be square and the diagonal of the matrix variables consists of the elements passed as the diag argument. The diag argument is a dictionary of (index, 1d-array) pairs. Useful for power matrices with specified diagonals (constant power wye loads). If not specified, the diagonal elements are set to zero.\n\n\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_storage_charge-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_storage_charge","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_storage_complementary_indicator-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_storage_complementary_indicator","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_storage_discharge-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_storage_discharge","text":"\n\n\n\n","category":"method"},{"location":"reference/variables.html#PowerModelsDistribution.variable_storage_energy-Tuple{AbstractUnbalancedPowerModel}","page":"Variables","title":"PowerModelsDistribution.variable_storage_energy","text":"\n\n\n\n","category":"method"},{"location":"tutorials/The Engineering Model.html#tutorial-eng-model","page":"The Engineering Data Model","title":"Introduction to the Engineering Model","text":"","category":"section"},{"location":"tutorials/The Engineering Model.html","page":"The Engineering Data Model","title":"The Engineering Data Model","text":"Stub for The Engineering Model.jl Pluto Notebook in the examples/ folder. The Pluto Notebook will get rendered and inserted as an iframe at documentation build time.","category":"page"},{"location":"manual/connections.html#Connecting-Components","page":"Connecting Components","title":"Connecting Components","text":"","category":"section"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"One of the main goals of a network model, is specifying how constituent components are connected together. The patterns explained here, are equally applicable to the engineering and mathematical data model.","category":"page"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"The available connections of each component connect to bus terminals. Take for example a bus with four terminals, terminals=[\"a\",\"b\",\"c\",\"n\"].","category":"page"},{"location":"manual/connections.html#Node-objects","page":"Connecting Components","title":"Node objects","text":"","category":"section"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"Node objects always connect to a single bus (and perhaps also the universal ground, as can be the case for shunts). Therefore, they always have at least two key fields controlling the connectivity: bus and connections. Most node objects also have a configuration field, which affects the interpretation of the values supplied in connections. We will illustrate this for loads below.","category":"page"},{"location":"manual/connections.html#Loads","page":"Connecting Components","title":"Loads","text":"","category":"section"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"A multi-phase load consists of several individual loads, the number of which is implied by the length of properties such as pd_nom, qd_nom etc. The table below illustrates how the length of the field connections and the value of the field configuration determines the layout of the load.","category":"page"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"connections configuration==WYE configuration==DELTA\n2 (Image: 2 connections, wye) (Image: 2 connections, delta)\n3 (Image: 3 connections, wye) (Image: 3 connections, delta)\n4 (Image: 4 connections, wye) undefined","category":"page"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"For example, we wish to connect a wye-connected load consisting of 2 individual loads (|connections|=3 and configuration=WYE) to our example bus with four available terminals. If we specify connections=[\"a\",\"c\",\"n\"], this leads to","category":"page"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"(Image: loads connection example).","category":"page"},{"location":"manual/connections.html#Edge-objects","page":"Connecting Components","title":"Edge objects","text":"","category":"section"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"Edge objects connect two buses (except for generic transformers, which can connect N buses). Therefore, they have the fields","category":"page"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"f_bus and f_connections, specifying the from-side bus and how the object connects to it;\nt_bus and t_connections, specifying the same for the to-side.","category":"page"},{"location":"manual/connections.html#Lines","page":"Connecting Components","title":"Lines","text":"","category":"section"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"A line can have a variable number of conductors, which is implied by the size of the fields rs, xs, g_fr, b_fr, g_to and b_to. The fields f_connections and t_connections should specify for each conductor, to which terminals it connects. The figure below illustrates this for a line with 2 conductors,","category":"page"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"(Image: line connection example).","category":"page"},{"location":"manual/connections.html#Transformers","page":"Connecting Components","title":"Transformers","text":"","category":"section"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"Transformers also have a configuration field. For","category":"page"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"generic transformers, this is specified per winding, and configuration is therefore a vector of ConnConfig enums (WYE or DELTA);\nAL2W transformers however are always two-winding, and the secondary is always wye-connected. Therefore, configuration is a scalar, specifying the configuration of the from-side winding.","category":"page"},{"location":"manual/connections.html","page":"Connecting Components","title":"Connecting Components","text":"Generic transformers have a field buses, a Vector containing the buses to which each winding connects respectively (these do not have to be unique; a split-phase transformer is typically represented by having two windings connect to the same bus). The AL2W transformer however, since it is always two-winding, follows the f_connections/t_connections pattern.","category":"page"},{"location":"reference/constants.html#ConstantsAPI","page":"Constants","title":"Constants","text":"","category":"section"},{"location":"reference/constants.html","page":"Constants","title":"Constants","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:constant]\nFilter = t -> isa(t, Dict) || isa(t, Vector) || isa(t, String)","category":"page"},{"location":"reference/constants.html#PowerModelsDistribution.dimensionalize_math","page":"Constants","title":"PowerModelsDistribution.dimensionalize_math","text":"lists of scaling factors and what they apply to\n\n\n\n\n\n","category":"constant"},{"location":"reference/constants.html#PowerModelsDistribution.pmd_eng_asset_types","page":"Constants","title":"PowerModelsDistribution.pmd_eng_asset_types","text":"list of all eng asset types\n\n\n\n\n\n","category":"constant"},{"location":"reference/constants.html#PowerModelsDistribution.pmd_math_asset_types","page":"Constants","title":"PowerModelsDistribution.pmd_math_asset_types","text":"list of all math asset types\n\n\n\n\n\n","category":"constant"},{"location":"reference/constants.html#PowerModelsDistribution.pmd_math_component_status","page":"Constants","title":"PowerModelsDistribution.pmd_math_component_status","text":"maps component types to status parameters\n\n\n\n\n\n","category":"constant"},{"location":"reference/constants.html#PowerModelsDistribution.pmd_math_component_status_inactive","page":"Constants","title":"PowerModelsDistribution.pmd_math_component_status_inactive","text":"maps component types to inactive status values\n\n\n\n\n\n","category":"constant"},{"location":"reference/data_models.html#DataModelAPI","page":"Data Models","title":"Data Models","text":"","category":"section"},{"location":"reference/data_models.html#Parsers","page":"Data Models","title":"Parsers","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"parse_file\nparse_dss\nparse_opendss\nparse_json\nprint_file","category":"page"},{"location":"reference/data_models.html#PowerModelsDistribution.parse_file","page":"Data Models","title":"PowerModelsDistribution.parse_file","text":"parse_file(\n io::IO,\n filetype::Union{AbstractString,Missing}=missing;\n data_model::DataModel=ENGINEERING,\n import_all::Bool=false,\n bank_transformers::Bool=true,\n transformations::Vector{<:Any}=[],\n dss2eng_extensions::Vector{<:Function}=Function[],\n eng2math_extensions::Vector{<:Function}=Function[],\n eng2math_passthrough::Dict{String,Vector{String}}=Dict{String,Vector{String}}(),\n make_pu_extensions::Vector{<:Function}=Function[],\n make_pu::Bool=true,\n multinetwork::Bool=false,\n global_keys::Set{String}=Set{String}(),\n kron_reduce::Bool=true,\n phase_project::Bool=false,\n time_series::String=\"daily\"\n)::Dict{String,Any}\n\nParses the IOStream of a file into a PowerModelsDistribution data structure\n\nIf filetype is missing, parse_file will attempt to detect the filetype, but this may fail, and it is advised to pass the filetype if it is known.\n\nIf data_model is MATHEMATICAL, the data model type will be automatically transformed via transform_data_model.\n\nFor explanation of import_all, bank_transformers, and time_series, see parse_opendss\n\nFor explanation of dss2eng_extensions, see parse_opendss\n\nFor explanation of kron_reduce, see apply_kron_reduction!\n\nFor explanation of phase_project, see apply_phase_projection!\n\nFor explanation of multinetwork and global_keys, see make_multinetwork and transform_data_model\n\nFor explanation of eng2math_extensions and eng2math_passthrough, see transform_data_model\n\nFor explanation of make_pu and make_pu_extensions, see make_per_unit!.\n\n\n\n\n\nparse_file(file::String; kwargs...)::Dict{String,Any}\n\nLoads file into IOStream and passes it onto parse_file\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.parse_dss","page":"Data Models","title":"PowerModelsDistribution.parse_dss","text":"\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.parse_opendss","page":"Data Models","title":"PowerModelsDistribution.parse_opendss","text":"parse_opendss(\n io::IO;\n import_all::Bool=false,\n bank_transformers::Bool=true,\n time_series::String=\"daily\",\n dss2eng_extensions::Vector{<:Function}=Function[],\n)::Dict{String,Any}\n\nParses an IO, into raw dss dictionary via parse_dss, into the ENGINEERING DataModel\n\nSee parse_opendss\n\n\n\n\n\nparse_opendss(\n data_dss::OpenDssDataModel;\n import_all::Bool=false,\n bank_transformers::Bool=true,\n time_series::String=\"daily\",\n dss2eng_extensions::Vector{<:Function}=Function[]\n)::Dict{String,Any}\n\nParses a raw dss data structure (dictionary), resulting from the parsing of a DSS file, into the ENGINEERING DataModel\n\nIf import_all is true, all raw dss properties will be included in the final dictionary under \"dss\".\n\nIf bank_transformers is true (default), transformers that are indicated to be part of a bank in dss will be combined into a single multiphase transformer.\n\ntime_series defines which property the time series will be taken from, \"daily\" or \"yearly\". More complex parsing of time series data should be performed with dss2eng_extensions.\n\ndss2eng_extensions\n\nIf a user wishes to parse additional components that are not yet natively supported by PowerModelsDistribution, dss2eng_extensions can be utilized. Custom user functions provided under dss2eng_extensions will be excuted after all built-in dss2eng transformations have been performed and transformers have been banked together (if bank_transformers==true). dss2eng_extension functions should have the following function signature:\n\ndss2eng_func!(data_eng, data_dss)\n\nwhere data_eng is a non-multinetwork ENGINEERING data model (i.e., time series data has not yet been expanded into a multinetwork structure), and data_dss is the raw dss data parsed by parse_dss.\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.parse_json","page":"Data Models","title":"PowerModelsDistribution.parse_json","text":"parse_json(file::String)\n\nparses json files that were dumped via JSON.print (or PMD.print_file)\n\n\n\n\n\nparse_json(io::IO)\n\nparses json files that were dumped via JSON.print (or PMD.print_file)\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.print_file","page":"Data Models","title":"PowerModelsDistribution.print_file","text":"print_file(path::String, data::Dict{String,<:Any}; indent::Int=2)\n\nprints a PowerModelsDistribution data structure into a JSON file\n\n\n\n\n\nprint_file(io::IO, data::Dict{String,<:Any}; indent::Int=2)\n\nprints a PowerModelsDistribution data structure into a JSON file\n\n\n\n\n\nprint_file variant for InfrastructureModel that converts to Dict first\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#Constructors","page":"Data Models","title":"Constructors","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nPages = [\"components.jl\"]","category":"page"},{"location":"reference/data_models.html#PowerModelsDistribution.Model","page":"Data Models","title":"PowerModelsDistribution.Model","text":"Model(model_type::DataModel)\n\nInstantiates a PowerModelsDistribution data model\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_bus!","page":"Data Models","title":"PowerModelsDistribution.add_bus!","text":"adds a bus to provided ENGINEERING model, see create_bus\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_generator!","page":"Data Models","title":"PowerModelsDistribution.add_generator!","text":"adds a generator to provided ENGINEERING model, see create_generator\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_line!","page":"Data Models","title":"PowerModelsDistribution.add_line!","text":"adds a line to provided ENGINEERING model, see create_line\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_linecode!","page":"Data Models","title":"PowerModelsDistribution.add_linecode!","text":"adds a linecode to provided ENGINEERING model, see create_linecode\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_load!","page":"Data Models","title":"PowerModelsDistribution.add_load!","text":"adds a load to provided ENGINEERING model, see create_load\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_object!-Tuple{Dict{String}, String, String, Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.add_object!","text":"add_object!(data_eng::Dict{String,<:Any}, obj_type::String, obj_id::String, object::Dict{String,<:Any})\n\nGeneric add function to add components to an engineering data model\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.add_shunt!","page":"Data Models","title":"PowerModelsDistribution.add_shunt!","text":"adds a shunt to provided ENGINEERING model, see create_shunt\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_solar!","page":"Data Models","title":"PowerModelsDistribution.add_solar!","text":"adds a PV to provided ENGINEERING model, see create_solar\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_storage!","page":"Data Models","title":"PowerModelsDistribution.add_storage!","text":"adds a storage to provided ENGINEERING model, see create_storage\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_switch!","page":"Data Models","title":"PowerModelsDistribution.add_switch!","text":"adds a switch to provided ENGINEERING model, see create_switch\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_transformer!","page":"Data Models","title":"PowerModelsDistribution.add_transformer!","text":"adds a transformer to provided ENGINEERING model, see create_transformer and create_al2w_transformer\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_vbase_default!-Tuple{Dict{String}, String, Real}","page":"Data Models","title":"PowerModelsDistribution.add_vbase_default!","text":"add_vbase_default!(data_eng::Dict{String,<:Any}, bus::String, vbase::Real)\n\nFunction to add default vbase for a bus\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.add_voltage_source!","page":"Data Models","title":"PowerModelsDistribution.add_voltage_source!","text":"adds a voltage source to provided ENGINEERING model, see create_voltage_source\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.add_xfmrcode!","page":"Data Models","title":"PowerModelsDistribution.add_xfmrcode!","text":"adds a transformer code (xmfrcode) to provided ENGINEERING model, see create_xfmrcode\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.create_al2w_transformer-Tuple{String, String, Vector{Int64}, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_al2w_transformer","text":"create_al2w_transformer(\n f_bus::String,\n t_bus::String,\n f_connections::Vector{Int},\n t_connections::Vector{Int};\n configuration::ConnConfig=WYE,\n tm_nom::Real=1.0,\n tm_lb::Union{Vector{<:Real},Missing}=missing,\n tm_ub::Union{Vector{<:Real},Missing}=missing,\n tm_set::Union{Vector{<:Real},Missing}=missing,\n tm_fix::Union{Vector{Bool},Missing}=missing,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\ncreates a aysmmetric lossless 2-winding transformer object with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_bus-Tuple{}","page":"Data Models","title":"PowerModelsDistribution.create_bus","text":"create_bus(;\n status::Status=ENABLED,\n terminals::Vector{Int}=Int[],\n grounded::Vector{Int}=Int[],\n rg::Vector{<:Real}=Float64[],\n xg::Vector{<:Real}=Float64[],\n kwargs...\n)::Dict{String,Any}\n\ncreates a bus object with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_generator-Tuple{String, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_generator","text":"create_generator(\n bus::String,\n connections::Vector{Int};\n configuration::ConnConfig=WYE,\n pg::Union{Vector{<:Real},Missing}=missing,\n qg::Union{Vector{<:Real},Missing}=missing,\n vg::Union{Vector{<:Real},Missing}=missing,\n pg_lb::Union{Vector{<:Real},Missing}=missing,\n pg_ub::Union{Vector{<:Real},Missing}=missing,\n qg_lb::Union{Vector{<:Real},Missing}=missing,\n qg_ub::Union{Vector{<:Real},Missing}=missing,\n control_mode::ControlMode=FREQUENCYDROOP,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\ncreates a generator object with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_line-Tuple{String, String, Vector{Int64}, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_line","text":"create_line(\n f_bus::String,\n t_bus::String,\n f_connections::Vector{Int},\n t_connections::Vector{Int};\n linecode::Union{String,Missing}=missing,\n rs::Union{Matrix{<:Real},Missing}=missing,\n xs::Union{Matrix{<:Real},Missing}=missing,\n g_fr::Union{Matrix{<:Real},Missing}=missing,\n b_fr::Union{Matrix{<:Real},Missing}=missing,\n g_to::Union{Matrix{<:Real},Missing}=missing,\n b_to::Union{Matrix{<:Real},Missing}=missing,\n length::Real=1.0,\n cm_ub::Union{Vector{<:Real},Missing}=missing,\n sm_ub::Union{Vector{<:Real},Missing}=missing,\n vad_lb::Union{Vector{<:Real},Missing}=missing,\n vad_ub::Union{Vector{<:Real},Missing}=missing,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\nCreate a line with some default values\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_linecode-Tuple{Matrix{<:Real}, Matrix{<:Real}}","page":"Data Models","title":"PowerModelsDistribution.create_linecode","text":"create_linecode(\n rs::Matrix{<:Real},\n xs::Matrix{<:Real};\n g_fr::Union{Matrix{<:Real},Missing}=missing,\n b_fr::Union{Matrix{<:Real},Missing}=missing,\n g_to::Union{Matrix{<:Real},Missing}=missing,\n b_to::Union{Matrix{<:Real},Missing}=missing,\n cm_ub::Union{Vector{<:Real},Missing}=missing,\n kwargs...\n)::Dict{String,Any}\n\ncreates a linecode with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_load-Tuple{String, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_load","text":"create_load(\n bus::String,\n connections::Vector{Int};\n configuration::ConnConfig=WYE,\n model::LoadModel=POWER,\n pd_nom::Union{Vector{<:Real},Missing}=missing,\n qd_nom::Union{Vector{<:Real},Missing}=missing,\n vm_nom::Real=1.0,\n dispatchable::Dispatchable=NO,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\ncreates a load object with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_shunt-Tuple{String, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_shunt","text":"create_shunt(\n bus::String,\n connections::Vector{Int};\n gs::Union{Matrix{<:Real},Missing}=missing,\n bs::Union{Matrix{<:Real},Missing}=missing,\n model::ShuntModel=GENERIC,\n dispatchable::Dispatchable=NO,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\ncreates a generic shunt with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_solar-Tuple{String, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_solar","text":"create_solar(\n bus::String,\n connections::Vector{Int};\n configuration::ConnConfig=WYE,\n pg_lb::Union{Vector{<:Real},Missing}=missing,\n pg_ub::Union{Vector{<:Real},Missing}=missing,\n qg_lb::Union{Vector{<:Real},Missing}=missing,\n qg_ub::Union{Vector{<:Real},Missing}=missing,\n pg::Union{Vector{<:Real},Missing}=missing,\n qg::Union{Vector{<:Real},Missing}=missing,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\ncreates a solar generator with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_storage-Tuple{String, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_storage","text":"create_storage(\n configuration::ConnConfig=WYE,\n energy::Real=0.0,\n energy_ub::Real=0.0,\n charge_ub::Real=0.0,\n discharge_ub::Real=0.0,\n sm_ub::Union{Real,Missing}=missing,\n cm_ub::Union{Real,Missing}=missing,\n charge_efficiency::Real=1.0,\n discharge_efficiency::Real=1.0,\n qs_lb::Union{Real,Missing}=missing,\n qs_ub::Union{Real,Missing}=missing,\n rs::Real=0.0,\n xs::Real=0.0,\n pex::Real=0.0,\n qex::Real=0.0,\n ps::Union{Real,Vector{<:Real},Missing}=missing,\n qs::Union{Real,Vector{<:Real},Missing}=missing,\n status::Status=ENABLED,\n kwargs...\n )::Dict{String,Any}\n\ncreates energy storage object with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_switch-Tuple{String, String, Vector{Int64}, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_switch","text":"create_switch(\n f_bus::String,\n t_bus::String,\n f_connections::Vector{Int},\n t_connections::Vector{Int};\n cm_ub::Union{Vector{<:Real},Missing}=missing,\n sm_ub::Union{Vector{<:Real},Missing}=missing,\n linecode::Union{String,Missing}=missing,\n rs::Union{Matrix{<:Real},Missing}=missing,\n xs::Union{Matrix{<:Real},Missing}=missing,\n dispatchable::Dispatchable=NO,\n state::SwitchState=CLOSED,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\ncreates a switch object with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_transformer-Tuple{Vector{String}, Vector{Vector{Int64}}}","page":"Data Models","title":"PowerModelsDistribution.create_transformer","text":"create_transformer(\n buses::Vector{String},\n connections::Vector{Vector{Int}};\n configurations::Union{Vector{ConnConfig},Missing}=missing,\n xfmrcode::Union{String,Missing}=missing,\n xsc::Union{Vector{<:Real},Missing}=missing,\n rw::Union{Vector{<:Real},Missing}=missing,\n imag::Real=0.0,\n noloadloss::Real=0.0,\n tm_nom::Union{Vector{<:Real},Missing}=missing,\n tm_lb::Union{Vector{Vector{<:Real}},Missing}=missing,\n tm_ub::Union{Vector{Vector{<:Real}},Missing}=missing,\n tm_set::Union{Vector{Vector{<:Real}},Missing}=missing,\n tm_fix::Union{Vector{Vector{Bool}},Missing}=missing,\n polarity::Union{Vector{Int},Missing}=missing,\n vm_nom::Union{Vector{<:Real},Missing}=missing,\n sm_nom::Union{Vector{<:Real},Missing}=missing,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\ncreates a n-winding transformer object with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_voltage_source-Tuple{String, Vector{Int64}}","page":"Data Models","title":"PowerModelsDistribution.create_voltage_source","text":"create_voltage_source(\n bus::String,\n connections::Vector{Int};\n configuration::ConnConfig=WYE,\n vm::Union{Vector{<:Real},Missing}=missing,\n va::Union{Vector{<:Real},Missing}=missing,\n vm_lb::Union{Vector{<:Real},Missing}=missing,\n vm_ub::Union{Vector{<:Real},Missing}=missing,\n rs::Union{Vector{<:Real},Missing}=missing,\n xs::Union{Vector{<:Real},Missing}=missing,\n status::Status=ENABLED,\n kwargs...\n)::Dict{String,Any}\n\ncreates a voltage source with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.create_xfmrcode-Tuple{}","page":"Data Models","title":"PowerModelsDistribution.create_xfmrcode","text":"create_xfmrcode(;\n configurations::Union{Vector{ConnConfig},Missing}=missing,\n xsc::Union{Vector{<:Real},Missing}=missing,\n rw::Union{Vector{<:Real},Missing}=missing,\n tm_nom::Union{Vector{<:Real},Missing}=missing,\n tm_lb::Union{Vector{Vector{<:Real}},Missing}=missing,\n tm_ub::Union{Vector{Vector{<:Real}},Missing}=missing,\n tm_set::Union{Vector{Vector{<:Real}},Missing}=missing,\n tm_fix::Union{Vector{Vector{<:Real}},Missing}=missing,\n kwargs...\n)::Dict{String,Any}\n\ncreates transformer code with some defaults\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.delete_component!-Tuple{Dict{String}, String, String}","page":"Data Models","title":"PowerModelsDistribution.delete_component!","text":"delete_component!(data_eng::Dict{String,<:Any}, component_type::String, component_id::String)\n\ndeletes a component from the engineering data model\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#Model-Transformations","page":"Data Models","title":"Model Transformations","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"transform_data_model\ntransform_solution","category":"page"},{"location":"reference/data_models.html#PowerModelsDistribution.transform_data_model","page":"Data Models","title":"PowerModelsDistribution.transform_data_model","text":"default transform_data_model ErrorException for unsupported combinations\n\n\n\n\n\n\n\n\n\ntransform_data_model(\n data::Dict{String,<:Any};\n kron_reduce::Bool=true,\n multinetwork::Bool=false,\n global_keys::Set{String}=Set{String}(),\n eng2math_passthrough::Dict{String,<:Vector{<:String}}=Dict{String,Vector{String}}(),\n eng2math_extensions::Vector{<:Function}=Function[],\n make_pu::Bool=true,\n make_pu_extensions::Vector{<:Function}=Function[],\n)::Dict{String,Any}\n\nTransforms a data model model between ENGINEERING (high-level) and MATHEMATICAL (low-level) DataModel.\n\nNotes\n\nKron reduction\n\nIf kron_reduce==true, apply_kron_reduction! and apply_phase_projection_delta! will be applied to the network data.\n\nPhase projection\n\nIf phase_project==true, apply_phase_projection! will be applied to the network data.\n\nMultinetwork transformations\n\nIf multinetwork==true, the data model will be transformed into a multinetwork (e.g., time series) data structure using make_multinetwork before being transformed into a MATHEMATICAL DataModel.\n\nglobal_keys::Set{String} can be used to add custom top-level items to the multinetwork data structure, and will only be used in the context where multinetwork==true, and ignored otherwise.\n\nCustom eng2math transformations\n\nTo add custom transformations between ENGINEERING and MATHEMATICAL data models, eng2math_extensions::Vector{<:Function} can be utilized to pass user-created functions, which are expected to have the signature\n\neng2math_func!(data_math::Dict{String,Any}, data_eng::Dict{String,Any})\n\nwhere datamath and dataeng equivalent to single subnetworks in a multinetwork data structure, or a non-multinetwork data structure.\n\nThese functions are run after all built-in eng2math transformations have been performed.\n\nMapping back to ENGINEERING\n\nSee transform_solution\n\nPassthrough properties\n\nTo more simply pass through some properties in the built-in eng2math transformations, eng2math_passthrough::Dict{String,Vector{String}} can be used. For example, if in the ENGINEERING model, a property called z was added to switch objects, and a property at the root level of the dictionary was added called max_switch_actions, the user could pass the following dictionary to eng2math_passthrough:\n\nDict{String,Vector{String}}(\n \"switch\" => String[\"z\"],\n \"root\" => String[\"max_switch_actions\"],\n)\n\nThis will result in z showing up on the switch object in the MATHEMATICAL model. Passthrough properties will always land on the primary conversion object in the MATHEMATICAL model if that object gets converted to multiple object types, e.g., voltage_source with internal impedance will result in gen, bus, and branch objects in the MATHEMATICAL model, but passthrough properties will only land on gen.\n\nCustom per-unit transformations\n\nTo add additional per-unit transformations, a user can supply custom functions to make_pu_extensions::Vector{<:Function}, which will only be used if make_pu==true.\n\nSee make_per_unit! for further explanation.\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.transform_solution","page":"Data Models","title":"PowerModelsDistribution.transform_solution","text":"transform_solution(\n solution_math::Dict{String,<:Any},\n data_math::Dict{String,<:Any};\n map::Union{Vector{<:Dict{String,<:Any}},Missing}=missing,\n make_si::Bool=true,\n convert_rad2deg::Bool=true,\n map_math2eng_extensions::Dict{String,<:Function}=Dict{String,Function}(),\n make_si_extensions::Vector{<:Function}=Function[],\n dimensionalize_math_extensions::Dict{String,<:Dict{String,<:Vector{<:String}}}=Dict{String,Dict{String,Vector{String}}}(),\n )::Dict{String,Any}\n\nTransforms solutions from MATHEMATICAL data structures, back to an ENGINEERING data structure, given a map::Vector{Dict{String,Any}}, typically which was produced automatically by transform_data_model.\n\nNotes\n\nIf make_si==false, the solution will remain in per-unit, rather than being converted back to SI units (default). Angles will still be converted to degrees unless convert_rad2deg is utilized.\n\nIf convert_rad2deg==false, angles will remain in radians, instead of getting converted to degrees (default).\n\nCustom SI unit conversions\n\nSee solution_make_si\n\nCustom math2eng transformations\n\nTo enable automatically mapping back custom components solutions' to the ENGINEERING structure, eng2math_extensions added in transform_data_model should include a push of an item to the map dictionary in the data_math structure. These items should have the structure:\n\nDict{String,Any}(\n \"from\" => String,\n \"to\" => Union{String,Vector{String}},\n \"unmap_function\" => PowerModelsDistribution.function!,\n \"apply_to_subnetworks\" => Bool\n)\n\nImportant things to note are that\n\nThe function must be included in map_math2eng_extensions, which has the form:\njulia Dict{String,Function}( \"_map_math2eng_func!\" => _map_math2eng_func!, )\n\"apply_to_subnetworks\" is optional, and is true by default.\n\"from\" needs to be a single object\n\"to\" can be multiple objects or a single object\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#Data-Transformations","page":"Data Models","title":"Data Transformations","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nPages = [\"transformations.jl\"]","category":"page"},{"location":"reference/data_models.html#Multinetworks","page":"Data Models","title":"Multinetworks","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nPages = [\"multinetwork.jl\"]","category":"page"},{"location":"reference/data_models.html#InfrastructureModels.ismultinetwork-Tuple{AbstractUnbalancedPowerModel}","page":"Data Models","title":"InfrastructureModels.ismultinetwork","text":"ismultinetwork(pm::AbstractUnbalancedPowerModel)\n\nChecks if power model struct is multinetwork\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.make_multinetwork-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.make_multinetwork","text":"make_multinetwork(\n data::Dict{String,<:Any};\n sparse::Bool=false,\n time_elapsed::Union{Missing,Real,Vector{<:Real}}=missing,\n global_keys::Set{String}=Set{String}(),\n)::Dict{String,Any}\n\nExpands a data structure into a multinetwork assuming there are time_series objects defined and assigned to some components.\n\nIf global_keys::Set{String} is defined, the global keys that will appear at the top-level of the data structure will include both the default global keys for that data model type, and additionally the keys defined in global_keys.\n\ntime_elapsed defines the time elapsed between subnetworkin hours, and can either be a single Real value, and thus a constant time between each time step, or a Vector with the same length as the number of time steps, or can be left missing, in which case time elapsed will attempt to be discovered, with a fallback on 1 hour default. Time elapsed can be adjusted later using set_time_elapsed!\n\nmake_multinetwork assumes all \"time\" values in \"timeseries\" objects to be in the same units, and will attempt to automatically sort multinetworks in the correct order. [`sortmultinetwork!`](@ref sort_multinetwork!) can be used after the fact to re-sort the subnetworks.\n\nsparse is currently unsupported, and is only included for future compatibility\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.set_time_elapsed!-Tuple{Dict{String}, Union{Real, Vector{<:Real}}}","page":"Data Models","title":"PowerModelsDistribution.set_time_elapsed!","text":"set_time_elapsed!(data::Dict{String,<:Any}, time_elapsed::Union{Real,Vector{<:Real}})\n\nHelper function to set time_elapsed in multinetwork data, given either some constant value of time elapsed or a Vector of time elapsed values of the same length as the number of subnetworks.\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.sort_multinetwork!-Tuple{Dict{String}, Vector}","page":"Data Models","title":"PowerModelsDistribution.sort_multinetwork!","text":"sort_multinetwork!(mn_data::Dict{String,<:Any}, times::Vector{<:Any})\n\nHelper function to manually sort your multinetwork frames, given some pre-sorted vector of time values times\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#Unit-conversions","page":"Data Models","title":"Unit conversions","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nPages = [\"units.jl\"]","category":"page"},{"location":"reference/data_models.html#PowerModelsDistribution.calc_eng_voltage_bases-Tuple{Dict{String}, Dict{String, <:Real}}","page":"Data Models","title":"PowerModelsDistribution.calc_eng_voltage_bases","text":"calc_eng_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real})::Tuple{Dict,Dict}\n\nCalculates voltage bases for each voltage zone for buses and branches for a ENGINEERING data_model\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.calc_math_voltage_bases-Tuple{Dict{String}, Dict{String, <:Real}}","page":"Data Models","title":"PowerModelsDistribution.calc_math_voltage_bases","text":"calc_math_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real})::Tuple{Dict,Dict}\n\nCalculates voltage bases for each voltage zone for buses and branches for a MATHEMATICAL data_model\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.calc_voltage_bases-Tuple{Dict{String}, Dict{String, <:Real}}","page":"Data Models","title":"PowerModelsDistribution.calc_voltage_bases","text":"calc_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real})::Tuple{Dict,Dict}\n\nCalculates voltage bases for each voltage zone for buses and branches, attempting to automatically decern the data_model type\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.discover_eng_voltage_zones-Tuple{Dict{String, Any}}","page":"Data Models","title":"PowerModelsDistribution.discover_eng_voltage_zones","text":"discover_voltage_zones(data_model::Dict{String,<:Any})::Dict{Int,Set{Any}}\n\nfinds voltage zones by walking through the network and analyzing the transformers for a ENGINEERING data_model\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.discover_math_voltage_zones-Tuple{Dict{String, Any}}","page":"Data Models","title":"PowerModelsDistribution.discover_math_voltage_zones","text":"discover_math_voltage_zones(data_model::Dict{String,<:Any})::Dict{Int,Set{Any}}\n\nfinds voltage zones by walking through the network and analyzing the transformers for a MATHEMATICAL data_model\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.discover_voltage_zones-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.discover_voltage_zones","text":"discover_voltage_zones(data_model::Dict{String,<:Any})::Dict{Int,Set{Any}}\n\nfinds voltage zones by walking through the network and analyzing the transformers, attempting to decern the type of data_model\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.make_per_unit!-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.make_per_unit!","text":"make_per_unit!(\n data::Dict{String,Any};\n vbases::Union{Missing,Dict{String,Real}}=missing,\n sbase::Union{Missing,Real}=missing,\n make_pu_extensions::Vector{<:Function}=Function[],\n)\n\nConverts units of properties to per-unit from SI units\n\nmake_pu_extensions\n\nTo add additional per-unit transformations, a user can supply custom functions to make_pu_extensions::Vector{<:Function}, which will only be used if make_pu==true.\n\nFor example, if custom properties are added to the MATHEMATICAL model via eng2math_passthrough or eng2math_extensions, those properties will not be converted to per-unit by default, and custom rules will need to be added with functions with the signature:\n\nrebase_pu_func!(\n nw::Dict{String,Any},\n data_math::Dict{String,Any},\n bus_vbase::Dict{String,Real},\n line_vbase::Dict{String,Real},\n sbase::Real,\n sbase_old::Real,\n voltage_scale_factor::Real\n)\n\nwhere,\n\nnw is equivalent to the a single subnetwork in a multinetwork data structure (which may be the same as data_math, in the case of a single network),\ndata_math is the complete data structure with the global keys,\nbus_vbase is a dictionary of the voltage bases of each bus indexed by their MATHEMATICAL model indices,\nline_vbase is a dictionary of the voltage bases of each branch indexed by their MATHEMATICAL model indices,\nsbase is the new power base,\nsbase_old is the power base the data structure started with, and\nvoltage_scale_factor is the scaling factor for voltage.\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.solution_make_si-Tuple{Dict{String}, Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.solution_make_si","text":"solution_make_si(\n solution::Dict{String,<:Any},\n math_model::Dict{String,<:Any};\n mult_sbase::Bool=true,\n mult_vbase::Bool=true,\n mult_ibase::Bool=true,\n convert_rad2deg::Bool=true,\n make_si_extensions::Vector{<:Function}=Function[],\n dimensionalize_math_extensions::Dict{String,<:Dict{String,<:Vector{<:String}}}=Dict{String,Dict{String,Vector{String}}}()\n)::Dict{String,Any}\n\nTransforms solution dictionaries solution from per-unit back to SI units, requiring the original MATHEMATICAL model math_model to perform the transformation.\n\nIf mult_sbase is false, sbase variables will not be multiplied, thus remaining in per-unit\n\nIf mult_vbase is false, vbase variables will not be multiplied, thus remaining in per-unit\n\nIf mult_ibase is false, ibase variables will not be multiplied, thus remaining in per-unit\n\nIf convert_rad2deg is false, angle variables will not be multiplied, thus remaining in radians\n\nCustom SI unit conversions\n\nTo convert custom properties not part of formulations already included within PowerModelsDistribution, users will need to either specify multiplicative factors via dimensionalize_math_extensions, or pass user functions via make_si_extensions.\n\nThe latter case requires functions with the signature\n\nmake_si_func!(nw_solution, nw_data, solution, data)\n\nwhere nw_solution and nw_data are equivalent to a single subnetwork of a multinetwork structure of the solution and the data in the MATHEMATICAL format, respectively, and solution and data are the full data structures, which may be equivalent to nw_solution and nw_data, if the data is not multinetwork. Changes should be applied to nw_solution in the user functions.\n\nFor dimensionalize_math_extensions, it is possible to easily extended the SI conversions if they are straightforward conversions using vbase, sbase, ibase, or rad2deg. For example, if a custom variable cfr is added to branches, and is scaled by ibase, the following dictionary would be passed:\n\nDict{String,Dict{String,Vector{String}}}(\n \"branch\" => Dict{String,Vector{String}}(\n \"ibase\" => String[\"cfr\"]\n )\n)\n\nwhich would ensure that this variable gets converted back to SI units upon transformation.\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#Data-Checking-and-Correction","page":"Data Models","title":"Data Checking and Correction","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"correct\") || startswith(string(t), \"check\")","category":"page"},{"location":"reference/data_models.html#PowerModelsDistribution.check_branch_loops-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.check_branch_loops","text":"check_branch_loops(data::Dict{String,<:Any})\n\nchecks that all branches connect two distinct buses\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.check_connectivity-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.check_connectivity","text":"check_connectivity(data::Dict{String,<:Any})\n\nchecks that all buses are unique and other components link to valid buses\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.check_cost_models-Tuple{AbstractUnbalancedPowerModel}","page":"Data Models","title":"PowerModelsDistribution.check_cost_models","text":"check_cost_models(pm::AbstractUnbalancedPowerModel)\n\nChecks that all cost models are of the same type\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.check_eng_data_model-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.check_eng_data_model","text":"check_eng_data_model(data_eng::Dict{String,<:Any})\n\nchecks the engineering data model for correct data types, required fields and applies default checks\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.check_gen_cost_models-Tuple{AbstractUnbalancedPowerModel}","page":"Data Models","title":"PowerModelsDistribution.check_gen_cost_models","text":"check_gen_cost_models(pm::AbstractUnbalancedPowerModel)\n\nChecks that all generator cost models are of the same type\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.correct_branch_directions!-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.correct_branch_directions!","text":"correct_branch_directions!(data::Dict{String,<:Any})\n\nchecks that all parallel branches have the same orientation\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.correct_bus_types!-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.correct_bus_types!","text":"checks bus types are suitable for a power flow study, if not, fixes them. the primary checks are that all type 2 buses (i.e., PV) have a connected and active generator and there is a single type 3 bus (i.e., slack bus) with an active connected generator. assumes that the network is a single connected component\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.correct_cost_functions!-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.correct_cost_functions!","text":"correct_cost_functions!(data::Dict{String,<:Any})\n\nthrows warnings if cost functions are malformed\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.correct_json_import!-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.correct_json_import!","text":"correct_json_import!(data::Dict{String,<:Any})\n\nhelper function to correct data imported from json\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.correct_mc_thermal_limits!-Tuple{Dict{String}}","page":"Data Models","title":"PowerModelsDistribution.correct_mc_thermal_limits!","text":"correct_mc_thermal_limits!(data::Dict{String,<:Any})\n\nchecks that each branch has non-negative thermal ratings and removes zero thermal ratings\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#PowerModelsDistribution.correct_mc_voltage_angle_differences!","page":"Data Models","title":"PowerModelsDistribution.correct_mc_voltage_angle_differences!","text":"correct_mc_voltage_angle_differences!(data::Dict{String,<:Any}, default_pad::Real=deg2rad(10.0))\n\nchecks that voltage angle differences are within 90 deg., if not tightens to a default of 10deg (adjustable)\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.correct_network_data!-Tuple{Dict{String, Any}}","page":"Data Models","title":"PowerModelsDistribution.correct_network_data!","text":"correct_network_data!(data::Dict{String,Any}; make_pu::Bool=true, make_pu_extensions::Vector{<:Function}=Function[])\n\nMakes corrections and performs checks on network data structure in either ENGINEERING or MATHEMATICAL formats, and converts to per-unit if data a is MATHEMATICAL data model.\n\nIf make_pu is false, converting to per-unit will be skipped.\n\nCustom per-unit transformations\n\nSee make_per_unit!\n\n\n\n\n\n","category":"method"},{"location":"reference/data_models.html#Statistics-and-Analysis","page":"Data Models","title":"Statistics and Analysis","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"count_nodes\ncount_active_connections\ncount_active_terminals\nidentify_load_blocks\nidentify_blocks\nidentify_islands\ncalc_connected_components","category":"page"},{"location":"reference/data_models.html#PowerModelsDistribution.count_nodes","page":"Data Models","title":"PowerModelsDistribution.count_nodes","text":"count_nodes(data::Dict{String,<:Any})::Int\n\nCounts number of nodes in network\n\n\n\n\n\ncount_nodes(data::Dict{String,<:Any})::Int\n\nCounts number of nodes in network\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.count_active_connections","page":"Data Models","title":"PowerModelsDistribution.count_active_connections","text":"count_active_connections(data::Dict{String,<:Any})\n\nCounts active ungrounded connections on edge components\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.count_active_terminals","page":"Data Models","title":"PowerModelsDistribution.count_active_terminals","text":"count_active_terminals(data::Dict{String,<:Any}; count_grounded::Bool=false)\n\nCounts active ungrounded terminals on buses\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.identify_load_blocks","page":"Data Models","title":"PowerModelsDistribution.identify_load_blocks","text":"identify_load_blocks(data::Dict{String,<:Any})\n\ncomputes load blocks based on switch locations\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.identify_blocks","page":"Data Models","title":"PowerModelsDistribution.identify_blocks","text":"identify_blocks(data::Dict{String,<:Any})\n\ncomputes connected blocks currently in the model based on switch states\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.identify_islands","page":"Data Models","title":"PowerModelsDistribution.identify_islands","text":"identify_islands(data::Dict{String,<:Any})\n\ncomputes component islands base only on edge and bus status\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.calc_connected_components","page":"Data Models","title":"PowerModelsDistribution.calc_connected_components","text":"calc_connected_components(data::Dict{String,<:Any}; edges::Union{Missing, Vector{<:String}}=missing, type::Union{Missing,String}=missing, check_enabled::Bool=true)::Set\n\ncomputes the connected components of the network graph returns a set of sets of bus ids, each set is a connected component\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#Helper-Functions","page":"Data Models","title":"Helper Functions","text":"","category":"section"},{"location":"reference/data_models.html","page":"Data Models","title":"Data Models","text":"iseng\nismath\nfind_conductor_ids!\nmake_multiconductor!\ndiscover_voltage_zones\ncalc_voltage_bases\napply_pmd!\nget_pmd_data","category":"page"},{"location":"reference/data_models.html#PowerModelsDistribution.iseng","page":"Data Models","title":"PowerModelsDistribution.iseng","text":"iseng(data::Dict{String,Any})\n\nHelper function to check is data is ENGINEERING model\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.ismath","page":"Data Models","title":"PowerModelsDistribution.ismath","text":"ismath(data::Dict{String,Any})\n\nHelper function to check if data is MATHEMATICAL model\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.find_conductor_ids!","page":"Data Models","title":"PowerModelsDistribution.find_conductor_ids!","text":"find_conductor_ids!(data::Dict{String,Any})\n\nFinds all conductor ids and puts a list of them under \"conductor_ids\" at the root level\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.make_multiconductor!","page":"Data Models","title":"PowerModelsDistribution.make_multiconductor!","text":"make_multiconductor!(data::Dict{String,<:Any}, conductors::Int)\n\nThis function is not meant to be an officially supported method for creating reasonable multiconductor data sets.\n\nHacky helper function to transform single-conductor network data, from, e.g., matpower/psse, into multi-conductor data.\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.discover_voltage_zones","page":"Data Models","title":"PowerModelsDistribution.discover_voltage_zones","text":"discover_voltage_zones(data_model::Dict{String,<:Any})::Dict{Int,Set{Any}}\n\nfinds voltage zones by walking through the network and analyzing the transformers, attempting to decern the type of data_model\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.calc_voltage_bases","page":"Data Models","title":"PowerModelsDistribution.calc_voltage_bases","text":"calc_voltage_bases(data_model::Dict{String,<:Any}, vbase_sources::Dict{String,<:Real})::Tuple{Dict,Dict}\n\nCalculates voltage bases for each voltage zone for buses and branches, attempting to automatically decern the data_model type\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.apply_pmd!","page":"Data Models","title":"PowerModelsDistribution.apply_pmd!","text":"apply_pmd!(func!::Function, data::Dict{String,<:Any}; apply_to_subnetworks::Bool=true, kwargs...)\n\nVersion of apply_pmd! that supports kwargs\n\n\n\n\n\napply_pmd!(func!::Function, data::Dict{String,<:Any}; apply_to_subnetworks::Bool=true, kwargs...)\n\nVersion of apply_pmd! that supports kwargs\n\n\n\n\n\napply_pmd!(func!::Function, data::Dict{String,<:Any}, args...; apply_to_subnetworks::Bool=true, kwargs...)\n\nVersion of apply_pmd! that supports args and kwargs\n\n\n\n\n\napply_pmd!(func!::Function, ref::Dict{Symbol,<:Any}, data::Dict{String,<:Any}; apply_to_subnetworks::Bool=true)\n\nPowerModelsDistribution wrapper for the InfrastructureModels apply! function\n\n\n\n\n\n","category":"function"},{"location":"reference/data_models.html#PowerModelsDistribution.get_pmd_data","page":"Data Models","title":"PowerModelsDistribution.get_pmd_data","text":"get_pmd_data(data::Dict{String, <:Any})\n\nConvenience function for retrieving the power-distribution-only portion of network data\n\n\n\n\n\n","category":"function"},{"location":"reference/objectives.html#ObjectiveAPI","page":"Objectives","title":"Objectives","text":"","category":"section"},{"location":"reference/objectives.html","page":"Objectives","title":"Objectives","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"objective\")","category":"page"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_max_load_setpoint-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_max_load_setpoint","text":"objective_mc_max_load_setpoint(pm::AbstractUnbalancedPowerModel)\n\nmaximum loadability objective (continuous load shed) with storage\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_fuel_cost-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_fuel_cost","text":"objective_mc_min_fuel_cost(pm::AbstractUnbalancedPowerModel)\n\nStandard fuel cost minimization objective\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_fuel_cost_polynomial-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_fuel_cost_polynomial","text":"objective_mc_min_fuel_cost_polynomial(pm::AbstractUnbalancedPowerModel)\n\nFuel cost minimization objective for polynomial terms\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_fuel_cost_polynomial_switch-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_fuel_cost_polynomial_switch","text":"objective_mc_min_fuel_cost_polynomial_switch(pm::AbstractUnbalancedPowerModel)\n\nFuel cost minimization objective for polynomial terms including switches\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_fuel_cost_pwl-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_fuel_cost_pwl","text":"objective_mc_min_fuel_cost_pwl(pm::AbstractUnbalancedPowerModel)\n\nFuel cost minimization objective with piecewise linear terms\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_fuel_cost_pwl_switch-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_fuel_cost_pwl_switch","text":"objective_mc_min_fuel_cost_pwl_switch(pm::AbstractUnbalancedPowerModel)\n\nFuel cost minimization objective with piecewise linear terms including switches\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_fuel_cost_switch-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_fuel_cost_switch","text":"objective_mc_min_fuel_cost_switch(pm::AbstractUnbalancedPowerModel)\n\nStandard fuel cost minimization objective including switches\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_load_setpoint_delta-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_load_setpoint_delta","text":"objective_mc_min_load_setpoint_delta(pm::AbstractUnbalancedPowerModel)\n\nminimum load delta objective with storage\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_load_setpoint_delta_simple-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_load_setpoint_delta_simple","text":"objective_mc_min_load_setpoint_delta_simple(pm::AbstractUnbalancedPowerModel)\n\nsimplified minimum load delta objective (continuous load shed)\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_load_setpoint_delta_simple_switch-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_load_setpoint_delta_simple_switch","text":"objective_mc_min_load_setpoint_delta_simple_switch(pm::AbstractUnbalancedPowerModel)\n\nsimplified minimum load delta objective (continuous load shed) including a switch state term\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_min_slack_bus_power-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_min_slack_bus_power","text":"objective_mc_min_slack_bus_power(pm::AbstractUnbalancedPowerModel)\n\na quadratic penalty for bus power slack variables\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_mc_variable_pg_cost-Tuple{AbstractUnbalancedPowerModel}","page":"Objectives","title":"PowerModelsDistribution.objective_mc_variable_pg_cost","text":"objective_mc_variable_pg_cost(pm::AbstractUnbalancedPowerModel)\n\nadds pg_cost variables and constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#PowerModelsDistribution.objective_variable_pg_cost-Tuple{AbstractUnbalancedIVRModel}","page":"Objectives","title":"PowerModelsDistribution.objective_variable_pg_cost","text":"objective_variable_pg_cost(pm::AbstractUnbalancedIVRModel)\n\nadds pg_cost variables and constraints for the IVR formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/objectives.html#Helpers","page":"Objectives","title":"Helpers","text":"","category":"section"},{"location":"reference/objectives.html","page":"Objectives","title":"Objectives","text":"calc_max_cost_index\nsimplify_cost_terms!\ncalc_pwl_points\ncalc_cost_pwl_lines\nstandardize_cost_terms!","category":"page"},{"location":"reference/objectives.html#PowerModelsDistribution.calc_max_cost_index","page":"Objectives","title":"PowerModelsDistribution.calc_max_cost_index","text":"calc_max_cost_index(data::Dict{String,<:Any})\n\nComputes maximum cost index\n\n\n\n\n\n","category":"function"},{"location":"reference/objectives.html#PowerModelsDistribution.simplify_cost_terms!","page":"Objectives","title":"PowerModelsDistribution.simplify_cost_terms!","text":"simplify_cost_terms!(data::Dict{String,<:Any})\n\ntrims zeros from higher order cost terms\n\n\n\n\n\n","category":"function"},{"location":"reference/objectives.html#PowerModelsDistribution.calc_pwl_points","page":"Objectives","title":"PowerModelsDistribution.calc_pwl_points","text":"calc_pwl_points(ncost::Int, cost::Vector{<:Real}, pmin::Real, pmax::Real; tolerance=1e-2)\n\ncleans up raw pwl cost points in preparation for building a mathamatical model. The key mathematical properties,\n\nthe first and last points are strickly outside of the pmin-to-pmax range\npmin and pmax occur in the first and last line segments.\n\n\n\n\n\n","category":"function"},{"location":"reference/objectives.html#PowerModelsDistribution.calc_cost_pwl_lines","page":"Objectives","title":"PowerModelsDistribution.calc_cost_pwl_lines","text":"calc_cost_pwl_lines(comp_dict::Dict)\n\ncompute lines in m and b from from pwl cost models data is a list of components. Can be run on data or ref data structures\n\n\n\n\n\n","category":"function"},{"location":"reference/objectives.html#PowerModelsDistribution.standardize_cost_terms!","page":"Objectives","title":"PowerModelsDistribution.standardize_cost_terms!","text":"standardize_cost_terms!(data::Dict{String,<:Any}; order=-1)\n\nensures all polynomial costs functions have the same number of terms\n\n\n\n\n\n","category":"function"},{"location":"tutorials/basic.html#Using-PowerModelsDistribution","page":"Basics","title":"Using PowerModelsDistribution","text":"","category":"section"},{"location":"tutorials/basic.html","page":"Basics","title":"Basics","text":"Stub for basic.jl Pluto Notebook in the examples/ folder. The Pluto Notebook will get rendered and inserted as an iframe at documentation build time.","category":"page"},{"location":"manual/quickguide.html#Quick-Start-Guide","page":"Getting Started","title":"Quick Start Guide","text":"","category":"section"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"Once PowerModelsDistribution is installed, Ipopt is installed, and a network data file (e.g., \"case3_unbalanced.dss\" in the package folder under ./test/data) has been acquired, an unbalanced AC Optimal Power Flow can be executed with,","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"using PowerModelsDistribution\nusing Ipopt\n\nsolve_mc_opf(\"case3_unbalanced.dss\", ACPUPowerModel, Ipopt.Optimizer)","category":"page"},{"location":"manual/quickguide.html#Parsing-files","page":"Getting Started","title":"Parsing files","text":"","category":"section"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"To parse an OpenDSS file into PowerModelsDistribution's default ENGINEERING format, use the parse_file command","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"eng = parse_file(\"case3_unbalanced.dss\")","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"To examine the MATHEMATICAL model it is possible to transform the data model using the transform_data_model command, but this step is not necessary to run a problem.","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"math = transform_data_model(eng)","category":"page"},{"location":"manual/quickguide.html#Getting-Results","page":"Getting Started","title":"Getting Results","text":"","category":"section"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"The run commands in PowerModelsDistribution return detailed results data in the form of a dictionary. This dictionary can be saved for further processing as follows,","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"result = solve_mc_opf(eng, ACPUPowerModel, Ipopt.Optimizer)","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"Alternatively, you can pass the file path string directly:","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"result = solve_mc_opf(\"case3_unbalanced.dss\", ACPUPowerModel, Ipopt.Optimizer)","category":"page"},{"location":"manual/quickguide.html#Accessing-Different-Formulations","page":"Getting Started","title":"Accessing Different Formulations","text":"","category":"section"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"ACPUPowerModel indicates an unbalanced (i.e., multiconductor) AC formulation in polar coordinates. This more generic solve_mc_opf allows one to solve an OPF problem with any power network formulation in PowerModelsDistribution. For example, the SDPUBFPowerModel relaxation of unbalanced Optimal Power Flow (branch flow model) can be run with,","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"using SCS\nsolve_mc_opf(eng, SDPUBFPowerModel, with_optimizer(SCS.Optimizer))","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"Note that you have to use a SDP-capable solver, e.g., the open-source solver SCS, to solve SDP models.","category":"page"},{"location":"manual/quickguide.html#Inspecting-the-Formulation","page":"Getting Started","title":"Inspecting the Formulation","text":"","category":"section"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"The following example demonstrates how to break a solve_mc_opf call into separate model building and solving steps. This allows inspection of the JuMP model created by PowerModelsDistribution for the AC-OPF problem. Note that the MATHEMATICAL model must be passed to instantiate_mc_model, so the data model must either be transformed with transform_data_model or parsed directly to a MATHEMATICAL model using the data_model keyword argument:","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"math = parse_file(\"case3_unbalanced.dss\"; data_model=MATHEMATICAL)\npm = instantiate_model(math, ACPUPowerModel, build_mc_opf; ref_extensions=[ref_add_arcs_trans!])\nprint(pm.model)\noptimize_model!(pm, optimizer=Ipopt.Optimizer)","category":"page"},{"location":"manual/quickguide.html#Providing-a-Warm-Start","page":"Getting Started","title":"Providing a Warm Start","text":"","category":"section"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"To reduce the number of solver iterations, it might be useful to provide a (good) initial value to some or all optimization variables. To do so, it is sufficient to assign a value or vector (depending on the dimensions of the variable) in the data dictionary, under the key $(variablename)_start. The example below shows how to do it for the vm and va variables.","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"math = parse_file(\"case3_unbalanced.dss\"; data_model=MATHEMATICAL)\nmath[\"bus\"][\"2\"][\"vm_start\"] = [0.9959, 0.9959, 0.9959]\nmath[\"bus\"][\"2\"][\"va_start\"] = [0.00, -2.0944, 2.0944]","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"Providing a bad initial value might result in the opposite effect: longer calculation times or convergence issues, so the start value assignment should be done attentively. If no initial value is provided, a flat start is assigned by default. The default initial value of each variable is indicated in the function where the variable is defined, as the last argument of the comp_start_value function. In the case of vm, this is 1.0, as shown below:","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"vm = var(pm, nw)[:vm] = Dict(i => JuMP.@variable(pm.model,\n [c in 1:ncnds], base_name=\"$(nw)_vm_$(i)\",\n start = comp_start_value(ref(pm, nw, :bus, i), \"vm_start\", c, 1.0)\n ) for i in ids(pm, nw, :bus)\n)","category":"page"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"Finally, it should be noted that if va_start and vm_start are present in a data dictionary which is passed to the ACR or IVR formulation, these are converted to their rectangular equivalents and used as vr_start and vi_start.","category":"page"},{"location":"manual/quickguide.html#Examples","page":"Getting Started","title":"Examples","text":"","category":"section"},{"location":"manual/quickguide.html","page":"Getting Started","title":"Getting Started","text":"More examples of working with the engineering data model can be found in the /examples folder of the PowerModelsDistribution.jl repository. These are Pluto Notebooks; instructions for running them can be found in the Pluto documentation.","category":"page"},{"location":"reference/formulations.html#FormulationAPI","page":"Formulations","title":"Formulations","text":"","category":"section"},{"location":"reference/formulations.html#Abstract-Models","page":"Formulations","title":"Abstract Models","text":"","category":"section"},{"location":"reference/formulations.html","page":"Formulations","title":"Formulations","text":"AbstractUnbalancedPowerModel\nAbstractUnbalancedActivePowerModel\nAbstractUnbalancedConicModel\nAbstractUBFModel\nAbstractUBFAModel\nAbstractUBFQPModel\nAbstractUBFConicModel\nAbstractUnbalancedACPModel\nAbstractUnbalancedACRModel\nAbstractUnbalancedIVRModel\nAbstractUnbalancedDCPModel\nAbstractUnbalancedNFAModel\nAbstractNLPUBFModel\nAbstractConicUBFModel\nSDPUBFModel\nSDPUBFKCLMXModel\nSOCNLPUBFModel\nSOCConicUBFModel\nAbstractLPUBFModel\nLPUBFDiagModel\nLinDist3FlowModel","category":"page"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedPowerModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedPowerModel","text":"root of the power formulation type hierarchy\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedActivePowerModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedActivePowerModel","text":"active power only models\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedConicModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedConicModel","text":"variants that target conic solvers\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUBFModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUBFModel","text":"for branch flow models\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUBFAModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUBFAModel","text":"for variants of branch flow models that target LP solvers\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUBFQPModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUBFQPModel","text":"for variants of branch flow models that target QP or NLP solvers\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUBFConicModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUBFConicModel","text":"for variants of branch flow models that target conic solvers\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedACPModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedACPModel","text":"Abstract Power-Voltage (Polar) formulation\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedACRModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedACRModel","text":"Abstract Power-Voltage (Rectangular) formulation\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedIVRModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedIVRModel","text":"Abstract Current-Voltage (Rectangular) formulation\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedDCPModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedDCPModel","text":"\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedNFAModel","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedNFAModel","text":"\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractNLPUBFModel","page":"Formulations","title":"PowerModelsDistribution.AbstractNLPUBFModel","text":"Base Abstract NLP Unbalanced Branch Flow Model\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractConicUBFModel","page":"Formulations","title":"PowerModelsDistribution.AbstractConicUBFModel","text":"Base Abstract Conic Unbalanced Branch Flow Model\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SDPUBFModel","page":"Formulations","title":"PowerModelsDistribution.SDPUBFModel","text":"SDP BFM per Gan and Low 2014, PSCC\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SDPUBFKCLMXModel","page":"Formulations","title":"PowerModelsDistribution.SDPUBFKCLMXModel","text":"SDP BFM with KCL as matrix equation, Geth 2020 (under review)\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SOCNLPUBFModel","page":"Formulations","title":"PowerModelsDistribution.SOCNLPUBFModel","text":"SOC relaxation of SDPUBFModel per Kim, Kojima, & Yamashita 2003, cast as an QCP\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SOCConicUBFModel","page":"Formulations","title":"PowerModelsDistribution.SOCConicUBFModel","text":"SOC relaxation of SDPUBFModel per Kim, Kojima, & Yamashita 2003, cast as a SOC\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractLPUBFModel","page":"Formulations","title":"PowerModelsDistribution.AbstractLPUBFModel","text":"Abstract form for linear unbalanced power flow models\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.LPUBFDiagModel","page":"Formulations","title":"PowerModelsDistribution.LPUBFDiagModel","text":"LinDist3Flow per Arnold et al. (2016), using vector variables for power, voltage and current\n\nD. B. Arnold, M. Sankur, R. Dobbe, K. Brady, D. S. Callaway and A. Von Meier, \"Optimal dispatch of reactive power for voltage regulation and balancing in unbalanced distribution systems,\" 2016 IEEE Power and Energy Society General Meeting (PESGM), Boston, MA, 2016, pp. 1-5, doi: 10.1109/PESGM.2016.7741261.\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.LinDist3FlowModel","page":"Formulations","title":"PowerModelsDistribution.LinDist3FlowModel","text":"More popular name for the LPUBFDiagModel\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#Abstract-Union-Models","page":"Formulations","title":"Abstract Union Models","text":"","category":"section"},{"location":"reference/formulations.html","page":"Formulations","title":"Formulations","text":"AbstractUBFModels\nKCLMXModels\nSOCUBFModels\nAbstractUnbalancedWModels\nAbstractUnbalancedWConvexModels\nAbstractUnbalancedAPLossLessModels\nAbstractUnbalancedPolarModels","category":"page"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUBFModels","page":"Formulations","title":"PowerModelsDistribution.AbstractUBFModels","text":"Collection of Unbalanced Branch Flow Models\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.KCLMXModels","page":"Formulations","title":"PowerModelsDistribution.KCLMXModels","text":"Collection of Semidefinite Models\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SOCUBFModels","page":"Formulations","title":"PowerModelsDistribution.SOCUBFModels","text":"Collection of Second Order Cone Models\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedWModels","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedWModels","text":"Collection of AbstractUnbalancedPowerModels that include W relaxations\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedWConvexModels","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedWConvexModels","text":"Collection of convex AbstractUnbalancedPowerModels that include W relaxations\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedAPLossLessModels","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedAPLossLessModels","text":"Collection of AbstractUnbalancedPowerModels that are Active Power only and Lossless\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.AbstractUnbalancedPolarModels","page":"Formulations","title":"PowerModelsDistribution.AbstractUnbalancedPolarModels","text":"Collection of AbstractUnbalancedPowerModels that have a Polar representation\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#Power-Models","page":"Formulations","title":"Power Models","text":"","category":"section"},{"location":"reference/formulations.html","page":"Formulations","title":"Formulations","text":"ACPUPowerModel\nACRUPowerModel\nIVRUPowerModel\nDCPUPowerModel\nNFAUPowerModel\nLPUBFDiagPowerModel\nLinDist3FlowPowerModel\nSDPUBFPowerModel\nSDPUBFKCLMXPowerModel\nSOCNLPUBFPowerModel\nSOCConicUBFPowerModel","category":"page"},{"location":"reference/formulations.html#PowerModelsDistribution.ACPUPowerModel","page":"Formulations","title":"PowerModelsDistribution.ACPUPowerModel","text":"AC power flow Model with polar bus voltage variables. The seminal reference of AC OPF:\n\n@article{carpentier1962contribution,\n title={Contribution to the economic dispatch problem},\n author={Carpentier, J},\n journal={Bulletin de la Societe Francoise des Electriciens},\n volume={3},\n number={8},\n pages={431--447},\n year={1962}\n}\n\nHistory and discussion:\n\n@techreport{Cain2012,\n author = {Cain, Mary B and {O' Neill}, Richard P and Castillo, Anya},\n title = {{History of optimal power flow and Models}},\n year = {2012}\n pages = {1--36},\n url = {https://www.ferc.gov/industries/electric/indus-act/market-planning/opf-papers/acopf-1-history-Model-testing.pdf}\n}\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.ACRUPowerModel","page":"Formulations","title":"PowerModelsDistribution.ACRUPowerModel","text":"AC power flow Model with rectangular bus voltage variables.\n\n@techreport{Cain2012,\n author = {Cain, Mary B and {O' Neill}, Richard P and Castillo, Anya},\n pages = {1--36},\n title = {{History of optimal power flow and Models}},\n url = {https://www.ferc.gov/industries/electric/indus-act/market-planning/opf-papers/acopf-1-history-Model-testing.pdf}\n year = {2012}\n}\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.IVRUPowerModel","page":"Formulations","title":"PowerModelsDistribution.IVRUPowerModel","text":"Current voltage formulation of AC OPF. The formulation uses rectangular coordinates for both current and voltage. Note that, even though Kirchhoff's circuit laws are linear in current and voltage, this formulation is nonconvex due to constants power loads/generators and apparent power limits.\n\n@techreport{ONeill2012,\n author = {{O' Neill}, Richard P and Castillo, Anya and Cain, Mary B},\n pages = {1--18},\n title = {{The IV formulation and linear approximations of the ac optimal power flow problem}},\n year = {2012}\n}\n\nApplicable to problem formulations with _iv in the name.\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.DCPUPowerModel","page":"Formulations","title":"PowerModelsDistribution.DCPUPowerModel","text":"Linearized 'DC' power flow Model with polar voltage variables. This model is a basic linear active-power-only approximation, which uses branch susceptance values br_b = -br_x / (br_x^2 + br_x^2) for determining the network phase angles. Furthermore, transformer parameters such as tap ratios and phase shifts are not considered as part of this model. It is important to note that it is also common for active-power-only approximations to use 1/br_x for determining the network phase angles, instead of the br_b value that is used here. Small discrepancies in solutions should be expected when comparing active-power-only approximations across multiple tools.\n\n@ARTICLE{4956966,\n author={B. Stott and J. Jardim and O. Alsac},\n journal={IEEE Transactions on Power Systems},\n title={DC Power Flow Revisited},\n year={2009},\n month={Aug},\n volume={24},\n number={3},\n pages={1290-1300},\n doi={10.1109/TPWRS.2009.2021235},\n ISSN={0885-8950}\n}\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.NFAUPowerModel","page":"Formulations","title":"PowerModelsDistribution.NFAUPowerModel","text":"The an active power only network flow approximation, also known as the transportation model.\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.LPUBFDiagPowerModel","page":"Formulations","title":"PowerModelsDistribution.LPUBFDiagPowerModel","text":"default LP unbalanced DistFlow constructor\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.LinDist3FlowPowerModel","page":"Formulations","title":"PowerModelsDistribution.LinDist3FlowPowerModel","text":"More popular name for the LPUBFDiagPowerModel\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SDPUBFPowerModel","page":"Formulations","title":"PowerModelsDistribution.SDPUBFPowerModel","text":"default SDP unbalanced DistFlow constructor\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SDPUBFKCLMXPowerModel","page":"Formulations","title":"PowerModelsDistribution.SDPUBFKCLMXPowerModel","text":"default SDP unbalanced DistFlow with matrix KCL constructor\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SOCNLPUBFPowerModel","page":"Formulations","title":"PowerModelsDistribution.SOCNLPUBFPowerModel","text":"default SOC unbalanced DistFlow constructor\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#PowerModelsDistribution.SOCConicUBFPowerModel","page":"Formulations","title":"PowerModelsDistribution.SOCConicUBFPowerModel","text":"default SOC unbalanced DistFlow constructor\n\n\n\n\n\n","category":"type"},{"location":"reference/formulations.html#Mutable-Stuct-creator","page":"Formulations","title":"Mutable Stuct creator","text":"","category":"section"},{"location":"reference/formulations.html","page":"Formulations","title":"Formulations","text":"@pmd_fields","category":"page"},{"location":"reference/formulations.html#PowerModelsDistribution.@pmd_fields","page":"Formulations","title":"PowerModelsDistribution.@pmd_fields","text":"a macro for adding the base PowerModels fields to a type definition\n\n\n\n\n\n","category":"macro"},{"location":"manual/eng2math.html#Engineering-to-Mathematical-Data-Model-Mapping","page":"Conversion to Mathematical Model","title":"Engineering to Mathematical Data Model Mapping","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"In this document we define the mapping from the engineering data model down to the mathematical data model for each physical component.","category":"page"},{"location":"manual/eng2math.html#bus-objects","page":"Conversion to Mathematical Model","title":"bus objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"Buses are parsed into bus and potentially shunt objects.","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"The mathematical bus model contains only lossless connections to ground. All other connections to grounds are converted to equivalent shunts at that bus. For example, take a bus defined as","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"bus_eng = Dict(\"grounded\"=>[4, 5], \"rg\"=>[1.0, 0.0], \"xg\"=>[2.0, 0.0],...).","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"This is equivalent to a shunt g+im*b = 1/(1.0+im*2.0) connected to terminal 4, and a lossless grounding at terminal 5 (since rg[2]==xg[2]==0.0). This is mapped to","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"bus_math = Dict(\"grounded\"=>[5], ...),","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"shunt_math = Dict(\"connections\"=>[4], \"b\"=>[b], \"g\"=>[g]...).","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"This simplifies the mathematical model, as the modeller does no longer have to consider lossy groundings explicitly.","category":"page"},{"location":"manual/eng2math.html#line-objects","page":"Conversion to Mathematical Model","title":"line objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"Lines are parsed into branch objects with transformer=false","category":"page"},{"location":"manual/eng2math.html#switch-objects","page":"Conversion to Mathematical Model","title":"switch objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"Switches are parsed into switch. If there are loss parameters provided (i.e. rs and/or xs) then a virtual branch and virtual bus are created to model the impedance","category":"page"},{"location":"manual/eng2math.html#transformer-objects","page":"Conversion to Mathematical Model","title":"transformer objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"A transformer can have N windings, each with its own configuration (delta or wye are supported). This is decomposed to a network of N lossless, two-winding transformers which connect to an internal loss model. The to-winding is always wye-connected, hence we refer to these transformers as 'asymmetric'.","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"The internal loss model is a function of","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"the winding resistance rw,\nthe short-circuit reactance xsc,\nthe no-load loss properties noloadloss (resistive) and magnetizing current imag (reactive).","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"If all of these are non-zero, this leads to an internal loss model consisting of N virtual buses, (N^2+N)/2 virtual branches, and 1 shunt. These virtual buses and branches are automatically merged and simplified whenever possible; e.g., when all these loss parameters are zero, this simplifies to a single virtual bus, to which all two-winding transformers connect.","category":"page"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"For more detail, please refer to [upcoming technical paper]. #TODO add link to paper","category":"page"},{"location":"manual/eng2math.html#shunt-objects","page":"Conversion to Mathematical Model","title":"shunt objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"Shunts are parsed directly into shunt objects.","category":"page"},{"location":"manual/eng2math.html#load-objects","page":"Conversion to Mathematical Model","title":"load objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"Loads are parsed into load objects. See the discussion under the Load Model documentation on the sidebar, for a detailed discussion of the various load models.","category":"page"},{"location":"manual/eng2math.html#generator-objects","page":"Conversion to Mathematical Model","title":"generator objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"Generators are parsed into gen objects.","category":"page"},{"location":"manual/eng2math.html#solar-objects","page":"Conversion to Mathematical Model","title":"solar objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"Solar objects (photovoltaic systems) are parsed into gen objects.","category":"page"},{"location":"manual/eng2math.html#voltage_source-objects","page":"Conversion to Mathematical Model","title":"voltage_source objects","text":"","category":"section"},{"location":"manual/eng2math.html","page":"Conversion to Mathematical Model","title":"Conversion to Mathematical Model","text":"Voltage sources are parsed into gen objects. If loss parameters are specified (i.e. rs and/or xs) then a virtual bus and branch are created to model the internal impedance.","category":"page"},{"location":"manual/eng-data-model.html#Engineering-Data-Model","page":"Engineering Data Model","title":"Engineering Data Model","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"This document describes the ENGINEERING data model type in PowerModelsDistribution, which is transformed at runtime, or at the user's direction into a MATHEMATICAL data model for optimization.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"In this document,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"nphases refers to the number of non-neutral, non-ground active phases connected to a component,\nnconductors refers to all active conductors connected to a component, i.e. length(connections), and\nnwindings refers to the number of windings of a transformer.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"The data structure is in the following format","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Dict{String,Any}(\n \"data_model\" => ENGINEERING,\n \"component_type\" => Dict{String,Dict{String,Any}}(\n id => Dict{String,Any}(\n \"parameter\" => value,\n ...\n ),\n ...\n ),\n ...\n)","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Valid component types are those that are documented in the sections below. Each component object is identified by an id, which must be a string (id <: String), but id does not appear inside of the component dictionary, and only appears as keys to the component dictionaries under each component type. Note that this requirement is so that data structures will be JSON serializable.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Each edge or node component (i.e. all those that are not data objects or buses), is expected to have status fields to specify whether the component is active or disabled, bus or f_bus and t_bus, to specify the buses that are connected to the component, and connections or f_connections and t_connections, to specify the terminals of the buses that are actively connected in an ordered list. NOTE: terminals, connections, f_connections, and t_connections, must be type Vector{Int}.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Parameter values on components are expected to be specified in SI units by default (where applicable) in the engineering data model. Relevant expected units are noted in the sections below. It is possible for the user to select universal scalar factors for power and voltages. For example, if power_scalar_factor and voltage_scalar_factor are their default values given below, where units is listed as watt or var, real units will be kW and kvar. Where units are listed as volt, real units will be kV (multiplied by vm_nom, where that value exists).","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"The Used column describes the situations where certain parameters are used. \"always\" indicates those values are used in all contexts, opf, mld, or any other problem name abbreviation indicate they are used in particular for those problems. \"solution\" indicates that those parameters are outputs from the solvers. \"multinetwork\" indicates these values are only used to build multinetwork problems.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Those parameters that have a default may be omitted by the user from the data model, they will be populated by the specified default values.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Components that support \"codes\", such as lines, switches, and transformers, behave such that any property on said object that conflicts with a value in the code will override the value given in the code object. This is noted on each object where this is relevant.","category":"page"},{"location":"manual/eng-data-model.html#Root-Level-Properties","page":"Engineering Data Model","title":"Root-Level Properties","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"At the root level of the data structure, the following fields can be found.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Used Description\nname String Case name\ndata_model ENGINEERING DataModel always ENGINEERING, MATHEMATICAL, or DSS. Type of the data model (this document describes data_model==ENGINEERING)\nsettings Dict() Dict{String,<:Any} always Base settings for the data model, see Settings section below for details","category":"page"},{"location":"manual/eng-data-model.html#Settings-(settings)","page":"Engineering Data Model","title":"Settings (settings)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"At the root-level of the data model a settings dictionary object is expected, containing the following fields.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nvoltage_scale_factor 1e3 Real always Scalar multiplier for voltage values\npower_scale_factor 1e3 Real always Scalar multiplier for power values\nvbases_default Dict{String,Real} always Instruction to set the vbase at a number of buses for non-dimensionalization\nsbase_default Real always Instruction to set the power base for non-dimensionalization\nbase_frequency 60.0 Real Hz always Frequency base, i.e. the base frequency of the whole circuit","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"The parameters voltage_scale_factor and power_scale_factordetermine the base for all voltage and power parameters in this data model. For example,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"voltage_scale_factor=1E3 and vm_nom=4.0: vm_nom is 4.0 kV/4.0E3 V,\npower_scale_factor=1E6 and pd_nom=2.0: pd_nom is 2.0 MW/2.0E6 W,\npower_scale_factor=1E6 and qd_nom=5.0: qd_nom is 5.0 MVAr/5.0E6 VAr,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"where the mentioned fields vm_nom, pd_nom and qd_nom are sample voltage and power variables which are defined later.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"On the other hand,vbase_default and sbase_default provide default values for a 'per unit' conversion; these do not affect the interpretation of the parameters in this model, like the scale factors do. Note that vbase_default is a Dict{Any,Real}, with pairs of bus ids and voltage magnitude levels, since in per unit conversion, the voltage base can change from bus to bus. The power base is the same everywhere, and therefore sbase_default has a single value.","category":"page"},{"location":"manual/eng-data-model.html#Buses-(bus)","page":"Engineering Data Model","title":"Buses (bus)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"The data model below allows us to include buses of arbitrary many terminals (i.e., more than the usual four). This would be useful for","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"underground lines with multiple neutrals which are not joined at every bus;\ndistribution lines that carry several conventional lines in parallel (see for example the quad circuits in NEVTestCase).","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nterminals [1,2,3,4] Vector{Int} always Terminals for which the bus has active connections\nvm_lb Vector{Real} volt opf Minimum conductor-to-ground voltage magnitude, size=nphases\nvm_ub Vector{Real} volt opf Maximum conductor-to-ground voltage magnitude, size=nphases\nvm_pair_ub Vector{Tuple} opf e.g. [(1,2,210)] means |U1-U2|>210\nvm_pair_lb Vector{Tuple} opf e.g. [(1,2,230)] means |U1-U2|<230\ngrounded [] Vector{Int} always List of terminals which are grounded\nrg [] Vector{Real} always Resistance of each defined grounding, size=length(grounded)\nxg [] Vector{Real} always Reactance of each defined grounding, size=length(grounded)\nvm Vector{Real} volt always Voltage magnitude at bus. If set, voltage magnitude at bus is fixed\nva Vector{Real} degree always Voltage angle at bus. If set, voltage angle at bus is fixed\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively\ntime_series Dict{String,String} multinetwork Dictionary containing time series parameters.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Each terminal c of the bus has an associated complex voltage phasor v[c]. There are two types of voltage magnitude bounds. The first type bounds the voltage magnitude of each v[c] individually,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"lb <= |v[c]| <= ub","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"However, especially in four-wire networks, bounds are more naturally imposed on the difference of two terminal voltages instead, e.g. for terminals c and d,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"lb <= |v[c]-v[d]| <= ub","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"This is why we introduce the fields vm_pair_lb and vm_pair_ub, which define bounds for pairs of terminals,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"forall\n(c,d,lb) in vm_pair_lb: |v[c]-v[d]| >= lb\nforall\n(c,d,ub) in vm_pair_ub: |v[c]-v[d]| <= ub","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Finally, we give an example of how grounding impedances should be entered. If terminal 4 is grounded through an impedance Z=1+j2, we write","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"grounded=[4], rg=[1], xg=[2]","category":"page"},{"location":"manual/eng-data-model.html#Special-Case:-three-phase-bus","page":"Engineering Data Model","title":"Special Case: three-phase bus","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"For three-phase buses, instead of specifying bounds explicitly for each pair of windings, often we want to specify 'phase-to-phase', 'phase-to-neutral' and 'neutral-to-ground' bounds. This can be done conveniently with a number of additional fields. First, phases is a list of the phase terminals, and neutral designates a single terminal to be the neutral.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"The bounds vm_pn_lb and vm_pn_ub specify the same lower and upper bound for the magnitude of the difference of each phase terminal and the neutral.\nThe bounds vm_pp_lb and vm_pp_ub specify the same lower and upper bound for the magnitude of the difference of all phase terminals.\nvm_ng_ub specifies an upper bound for the neutral terminal, the lower bound is typically zero.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"If all of these are specified, these bounds also imply valid bounds for the individual voltage magnitudes,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"forall\nc in phases: vm_pn_lb - vm_ng_ub <= |v[c]| <= vm_pn_ub + vm_ng_ub\n0 <= |v[neutral]|<= vm_ng_ub","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Instead of defining the bounds directly, they can be specified through an associated voltage zone.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nphases Vector{Int} always Identifies the terminal that represents the neutral conductor\nneutral Int always Identifies the terminal that represents the neutral conductor\nvm_pn_lb Real opf Minimum phase-to-neutral voltage magnitude for all phases\nvm_pn_ub Real opf Maximum phase-to-neutral voltage magnitude for all phases\nvm_pp_lb Real opf Minimum phase-to-phase voltage magnitude for all phases\nvm_pp_ub Real opf Maximum phase-to-phase voltage magnitude for all phases\nvm_ng_ub Real opf Maximum neutral-to-ground voltage magnitude","category":"page"},{"location":"manual/eng-data-model.html#Edge-Objects","page":"Engineering Data Model","title":"Edge Objects","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"These objects represent edges on the power grid and therefore require f_bus and t_bus (or buses in the case of transformers), and f_connections and t_connections (or connections in the case of transformers).","category":"page"},{"location":"manual/eng-data-model.html#Lines-(line)","page":"Engineering Data Model","title":"Lines (line)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"This is a pi-model branch. When a linecode is given, and any of rs, xs, b_fr, b_to, g_fr or g_to are specified, any of those overwrite the values on the linecode.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nf_bus String always id of from-side bus connection\nt_bus String always id of to-side bus connection\nf_connections Vector{Int} always Indicates for each conductor, to which terminal of the f_bus it connects\nt_connections Vector{Int} always Indicates for each conductor, to which terminal of the t_bus it connects\nlinecode String always id of an associated linecode\nrs Matrix{Real} ohm/meter always Series resistance matrix, size=(nconductors,nconductors)\nxs Matrix{Real} ohm/meter always Series reactance matrix, size=(nconductors,nconductors)\ng_fr zeros(nconductors, nconductors) Matrix{Real} siemens/meter/Hz always From-side conductance, size=(nconductors,nconductors)\nb_fr zeros(nconductors, nconductors) Matrix{Real} siemens/meter/Hz always From-side susceptance, size=(nconductors,nconductors)\ng_to zeros(nconductors, nconductors) Matrix{Real} siemens/meter/Hz always To-side conductance, size=(nconductors,nconductors)\nb_to zeros(nconductors, nconductors) Matrix{Real} siemens/meter/Hz always To-side susceptance, size=(nconductors,nconductors)\nlength 1.0 Real meter always Length of the line\ncm_ub Vector{Real} amp opf Symmetrically applicable current rating, size=nconductors\nsm_ub Vector{Real} watt opf Symmetrically applicable power rating, size=nconductors\nvad_lb Vector{Real} degree opf Voltage angle difference lower bound\nvad_ub Vector{Real} degree opf Voltage angle difference upper bound\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively","category":"page"},{"location":"manual/eng-data-model.html#Transformers-(transformer)","page":"Engineering Data Model","title":"Transformers (transformer)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"These are n-winding (nwinding), n-phase (nphase), lossy transformers. Note that most properties are now Vectors (or Vectors of Vectors), indexed over the windings.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nbus Vector{String} always List of bus for each winding, size=nwindings\nconnections Vector{Vector{Int}} always List of connection for each winding, size=((nconductors),nwindings)\nconfigurations fill(WYE, nwindings) Vector{ConnConfig} always WYE or DELTA. List of configuration for each winding, size=nwindings\nxfmrcode String always id of\nxsc zeros(nwindings*(nwindings-1)/2) Vector{Real} sm_nom[1] always List of short-circuit reactances between each pair of windings, relative to the VA rating of the first winding; enter as a list of the upper-triangle elements\nrw zeros(nwindings) Vector{Real} sm_nom[1] always Active power lost due to resistance of each winding, relative to the VA rating of each winding winding\ncmag 0.0 Real sm_nom[1] always Total no-load reactive power drawn by the transformer, relative to VA rating of the first winding (magnetizing current)\nnoloadloss 0.0 Real sm_nom[1] always Total no-load active power drawn by the transformer, relative to VA rating of the first winding\ntm_nom ones(nwindings) Vector{Real} always Nominal tap ratio for the transformer, size=nwindings (multiplier)\ntm_ub Vector{Vector{Real}} opf Maximum tap ratio for each winding and phase, size=((nphases),nwindings) (base=tm_nom)\ntm_lb Vector{Vector{Real}} opf Minimum tap ratio for for each winding and phase, size=((nphases),nwindings) (base=tm_nom)\ntm_set fill(fill(1.0,nphases),nwindings) Vector{Vector{Real}} always Set tap ratio for each winding and phase, size=((nphases),nwindings) (base=tm_nom)\ntm_fix fill(fill(true,nphases),nwindings) Vector{Vector{Bool}} oltc Indicates for each winding and phase whether the tap ratio is fixed, size=((nphases),nwindings)\npolarity fill(1,nwindings) Vector{Int} always \nvm_nom Vector{Real} volt always \nsm_nom Vector{Real} watt always \nsm_ub Real watt opf Rating for the total apparent power magnitude at each winding\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively","category":"page"},{"location":"manual/eng-data-model.html#Asymmetric,-Lossless,-Two-Winding-(AL2W)-Transformers-(transformer)","page":"Engineering Data Model","title":"Asymmetric, Lossless, Two-Winding (AL2W) Transformers (transformer)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Special case of the Generic transformer, which is still a transformer object, but has a simplified method for its definition. These are transformers are asymmetric (A), lossless (L) and two-winding (2W). Asymmetric refers to the fact that the secondary is always has a WYE configuration, whilst the primary can be DELTA. The table below indicates alternate, more simple ways to specify the special case of an AL2W Transformer. xsc and rw cannot be specified for an AL2W transformer, because it is lossless. To use this definition format, all of f_bus, t_bus, f_connections, t_connections, and configuration must be used, and none of buses, connections, configurations may be used. xfmrcode is ignored for this component.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nf_bus String always Alternative way to specify buses, requires both f_bus and t_bus\nt_bus String always Alternative way to specify buses, requires both f_bus and t_bus\nf_connections Vector{Int} always Alternative way to specify connections, requires both f_connections and t_connections, size=nphases\nt_connections Vector{Int} always Alternative way to specify connections, requires both f_connections and t_connections, size=nphases\nconfiguration WYE ConnConfig always WYE or DELTA. Alternative way to specify the from-side configuration, to-side is always WYE\ntm_nom 1.0 Real always Nominal tap ratio for the transformer (multiplier)\ntm_ub Vector{Real} opf Maximum tap ratio for each phase (base=tm_nom), size=nphases\ntm_lb Vector{Real} opf Minimum tap ratio for each phase (base=tm_nom), size=nphases\ntm_set fill(1.0,nphases) Vector{Real} always Set tap ratio for each phase (base=tm_nom), size=nphases\ntm_fix fill(true,nphases) Vector{Bool} oltc Indicates for each phase whether the tap ratio is fixed, size=nphases\nsm_ub Real opf Rating for the total apparent power magnitude at each winding","category":"page"},{"location":"manual/eng-data-model.html#Transformers-with-voltage-regulator-control-(controls)","page":"Engineering Data Model","title":"Transformers with voltage regulator control (controls)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Special case of the Generic transformer, which is part of the transformer object, and emulates a standard utility voltage regulator. The taps of these transformers can be controlled by modelling a line drop compensator.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nvreg Vector{Vector{Real}} volt oltc Voltage regulator reference, default value is 120.0 for the controlled winding, 0.0 for winding without regulator control, size=((nphases),nwindings)\nband Vector{Vector{Real}} volt oltc Voltage bandwidth, default value is 3.0 for the controlled winding, 0.0 for winding without regulator control, size=((nphases),nwindings)\nptratio Vector{Vector{Real}} oltc Voltage ratio of the potential transformer, default value is 60.0 for the controlled winding, 0.0 for winding without regulator control, size=((nphases),nwindings)\nctprim Vector{Vector{Real}} amp oltc Current transformer rating on primary side, default value is 300.0 for the controlled winding, 0.0 for winding without regulator control, size=((nphases),nwindings)\nr Vector{Vector{Real}} volt oltc Resistance setting on line drop compensator, default value is 0.0 for both controlled winding and winding without regulator control, size=((nphases),nwindings)\nx Vector{Vector{Real}} volt oltc Reactance setting on line drop compensator, default value is 0.0 for both controlled winding and winding without regulator control, size=((nphases),nwindings)","category":"page"},{"location":"manual/eng-data-model.html#Switches-(switch)","page":"Engineering Data Model","title":"Switches (switch)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Switches without rs, xs or a linecode (conductance/susceptance not considered), defined the switch will be treated as lossless. If lossy parameters are defined, switch objects will be decomposed into virtual branch & bus, and an ideal switch.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nf_bus String always id of from-side bus connection\nt_bus String always id of to-side bus connection\nf_connections Vector{Int} always Indicates for each conductor, to which terminal of the f_bus it connects\nt_connections Vector{Int} always Indicates for each conductor, to which terminal of the t_bus it connects\ncm_ub Vector{Real} amp opf Symmetrically applicable current rating\nsm_ub Vector{Real} watt opf Symmetrically applicable power rating\nlinecode String always id of an associated linecode, does not take into account conductance/susceptance\nrs zeros(nphases,nphases) Matrix{Real} ohm always Series resistance matrix, size=(nphases,nphases)\nxs zeros(nphases,nphases) Matrix{Real} ohm always Series reactance matrix, size=(nphases,nphases)\ndispatchable NO Dispatchable NO or YES, indicates whether switch state can be changed in a switching optimization problem\nstate CLOSED SwitchState always CLOSED: closed or OPEN: open, to indicate state of switch\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively","category":"page"},{"location":"manual/eng-data-model.html#Node-Objects","page":"Engineering Data Model","title":"Node Objects","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"These are objects that have single bus connections. Every object will have at least bus, connections, and status.","category":"page"},{"location":"manual/eng-data-model.html#Shunts-(shunt)","page":"Engineering Data Model","title":"Shunts (shunt)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nbus String always id of bus connection\nconnections Vector{Int} always Ordered list of connected conductors, size=nconductors\ngs Matrix{Real} siemens always Conductance, size=(nconductors,nconductors)\nbs Matrix{Real} siemens always Susceptance, size=(nconductors,nconductors)\nmodel GENERIC ShuntModel GENERIC, CAPACITOR, or REACTOR. Indicates the type of shunt which may be necessary for transient stability analysis\ndispatchable NO Dispatchable mld NO or YES, indicates whether a shunt can be shed\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively\ntime_series Dict{String,Any} multinetwork Dictionary containing time series parameters.","category":"page"},{"location":"manual/eng-data-model.html#Shunts-with-capacitor-control-(controls)","page":"Engineering Data Model","title":"Shunts with capacitor control (controls)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Special case of the shunt capacitors, which is part of the shunt object, and emulates a typical utility capacitor control (CapControl) by sending switching messages.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\ntype Vector{String} capc Control type, default is current for controlled phase, `for uncontrolled phase,size=1forkvartype, otherwisesize=(nphases)`\nelement String capc source_id of element (typically line or transformer) to which CapControl is connected\nterminal Vector{Int} capc Number of the terminal of circuit element to which CapControl is connected, default is 1 for controlled phase, 0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)\nonsetting Vector{Real} capc Value at which the CapControl switches the capacitor on, default is 300.0 for controlled phase, 0.0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)\noffsetting Vector{Real} capc Value at which the CapControl switches the capacitor off, default is 200.0 for controlled phase, 0.0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)\nvoltoverride Vector{Bool} capc Indicate whether voltage over ride is enabled, default is false for both controlled and uncontrolled phases, size=1 for kvar type, otherwise size=(nphases)\nptratio Vector{Real} capc Ratio of potential transformer, default is 60.0 for controlled phase, 0.0 for uncontrolled phase, size=(nphases)\nctratio Vector{Real} capc Ratio of current transformer, default is 60.0 for controlled phase, 0.0 for uncontrolled phase, size=(nphases)\nvmin Vector{Real} volt capc Minimum voltage below which CapControl switches the capacitor on, default is 115.0 for controlled phase, 0.0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)\nvmax Vector{Real} volt capc Maximum voltage above which CapControl switches the capacitor off, default is 126.0 for controlled phase, 0.0 for uncontrolled phase, size=1 for kvar type, otherwise size=(nphases)","category":"page"},{"location":"manual/eng-data-model.html#Loads-(load)","page":"Engineering Data Model","title":"Loads (load)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nbus String always id of bus connection\nconnections Vector{Int} always Ordered list of connected conductors, size=nconductors\nconfiguration WYE ConnConfig always WYE or DELTA. If WYE, connections[end]=neutral\nmodel POWER LoadModel always POWER, IMPEDANCE, CURRENT, EXPONENTIAL, or ZIP. Indicates the type of voltage-dependency\npd_nom Vector{Real} watt always Nominal active load, with respect to vm_nom, size=nphases\nqd_nom Vector{Real} var always Nominal reactive load, with respect to vm_nom, size=nphases\nvm_nom Real volt model!=POWER Nominal voltage (multiplier)\ndispatchable NO Dispatchable mld NO or YES, indicates whether a load can be shed\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively\ntime_series Dict{String,String} multinetwork Dictionary containing time series parameters.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Multi-phase loads define a number of individual loads connected between two terminals each. How they are connected, is defined both by configuration and connections. The table below indicates the value of configuration and lengths of the other properties for a consistent definition,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"configuration connections pd_nom | qd_nom | pd_exp\nDELTA 2 1\nDELTA 3 3\nWYE 2 1\nWYE 3 2\nWYE N N-1","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Note that for delta loads, only 2 and 3 connections are allowed. Each individual load i is connected between two terminals, exposed to a voltage magnitude v[i], which leads to a consumption pd[i]+j*qd[i]. The model then defines the relationship between these quantities,","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"model pd[i]/pd_nom[i]= qd[i]/qd_nom[i]=\nPOWER 1 1\nCURRENT (v[i]/vm_nom) (v[i]/vm_nom)\nIMPEDANCE (v[i]/vm_nom)^2 (v[i]/vm_nom)^2","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Two more model types are supported, which need additional fields and are defined below.","category":"page"},{"location":"manual/eng-data-model.html#model-EXPONENTIAL","page":"Engineering Data Model","title":"model == EXPONENTIAL","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"(pd[i]/pd_nom[i]) = (v[i]/vm_nom)^pd_exp[i]\n(qd[i]/qd_nom[i]) = (v[i]/vm_nom)^qd_exp[i]","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\npd_exp Real model==EXPONENTIAL \nqd_exp Real model==EXPONENTIAL ","category":"page"},{"location":"manual/eng-data-model.html#model-ZIP","page":"Engineering Data Model","title":"model == ZIP","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"ZIP load models are split into IMPEDANCE, CURRENT, POWER models.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"(pd[i]/pd_nom) = pd_cz[i]*(v[i]/vm_nom)^2 + pd_ci[i]*(v[i]/vm_nom) + pd_cp[i]\n(qd[i]/qd_nom) = qd_cz[i]*(v[i]/vm_nom)^2 + qd_ci[i]*(v[i]/vm_nom) + qd_cp[i]","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nzipv Vector{Real} model==ZIP First 3 are ZIP weighting factors for active power (pd_cz,pd_ci,pd_cp), next 3 are ZIP weighting factors for reactive power (qd_cz,qd_ci,qd_cp), last 1 is cut-off voltage in p.u. of base kV; load is 0 below this cut-off","category":"page"},{"location":"manual/eng-data-model.html#Generators-(generator)","page":"Engineering Data Model","title":"Generators (generator)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nbus String always id of bus connection\nconnections Vector{Int} always Ordered list of connected conductors, size=nconductors\nconfiguration WYE ConnConfig always WYE or DELTA. If WYE, connections[end]=neutral\nvg Vector{Real} volt control_mode==ISOCHRONOUS Voltage magnitude setpoint\npg_lb zeros(nphases) Vector{Real} watt opf Lower bound on active power generation per phase, size=nphases\npg_ub fill(Inf, nphases) Vector{Real} watt opf Upper bound on active power generation per phase, size=nphases\nqg_lb -pg_ub Vector{Real} var opf Lower bound on reactive power generation per phase, size=nphases\nqg_ub pg_ub Vector{Real} var opf Upper bound on reactive power generation per phase, size=nphases\npg Vector{Real} watt solution Present active power generation per phase, size=nphases\nqg Vector{Real} var solution Present reactive power generation per phase, size=nphases\ncontrol_mode FREQUENCYDROOP ControlMode FREQUENCYDROOP or ISOCHRONOUS\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively\ntime_series Dict{String,String} multinetwork Dictionary containing time series parameters.","category":"page"},{"location":"manual/eng-data-model.html#generator-Cost-Model","page":"Engineering Data Model","title":"generator Cost Model","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"The generator cost model is currently specified by the following fields.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\ncost_pg_model 2 Int opf Cost model type, 1 = piecewise-linear, 2 = polynomial\ncost_pg_parameters [0.0, 1.0, 0.0] Vector{Real} /MVA opf Cost model polynomial","category":"page"},{"location":"manual/eng-data-model.html#Photovoltaic-Systems-(solar)","page":"Engineering Data Model","title":"Photovoltaic Systems (solar)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nbus String always id of bus connection\nconnections Vector{Int} always Ordered list of connected conductors, size=nconductors\nconfiguration WYE ConnConfig always WYE or DELTA. If WYE, connections[end]=neutral\npg_lb Vector{Real} watt opf Lower bound on active power generation per phase, size=nphases\npg_ub Vector{Real} watt opf Upper bound on active power generation per phase, size=nphases\nqg_lb Vector{Real} var opf Lower bound on reactive power generation per phase, size=nphases\nqg_ub Vector{Real} var opf Upper bound on reactive power generation per phase, size=nphases\npg Vector{Real} watt solution Present active power generation per phase, size=nphases\nqg Vector{Real} var solution Present reactive power generation per phase, size=nphases\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively\ntime_series Dict{String,String} multinetwork Dictionary containing time series parameters.","category":"page"},{"location":"manual/eng-data-model.html#solar-Cost-Model","page":"Engineering Data Model","title":"solar Cost Model","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"The cost model for a photovoltaic system currently matches that of generators.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\ncost_pg_model 2 Int opf Cost model type, 1 = piecewise-linear, 2 = polynomial\ncost_pg_parameters [0.0, 1.0, 0.0] Vector{Real} /MVA opf Cost model polynomial","category":"page"},{"location":"manual/eng-data-model.html#Wind-Turbine-Systems-(wind)","page":"Engineering Data Model","title":"Wind Turbine Systems (wind)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Wind turbine systems are most closely approximated by induction machines, also known as asynchronous machines. These are not currently supported, but there is plans to support them in the future.","category":"page"},{"location":"manual/eng-data-model.html#Storage-(storage)","page":"Engineering Data Model","title":"Storage (storage)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"A storage object is a flexible component that can represent a variety of energy storage objects, like Li-ion batteries, hydrogen fuel cells, flywheels, etc.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"How to include the inverter model for this? Similar issue as for a PV generator","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nbus String always id of bus connection\nconnections Vector{Int} always Ordered list of connected conductors, size=nconductors\nconfiguration WYE ConnConfig always WYE or DELTA. If WYE, connections[end]=neutral\nenergy Real watt-hr always Stored energy\nenergy_ub Real opf maximum energy rating\ncharge_ub Real opf maximum charge rating\ndischarge_ub Real opf maximum discharge rating\nsm_ub Real watt opf Power rating,\ncm_ub Real amp opf Current rating,\ncharge_efficiency Real percent always charging efficiency (losses)\ndischarge_efficiency Real percent always discharging efficiency (losses)\nqs_ub Real opf Maximum reactive power injection,\nqs_lb Real opf Minimum reactive power injection,\nrs Real ohm always converter resistance\nxs Real ohm always converter reactance\npex Real always Total active power standby exogenous flow (loss)\nqex Real always Total reactive power standby exogenous flow (loss)\nps Vector{Real} watt solution Present active power injection\nqs Vector{Real} var solution Present reactive power injection\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively\ntime_series Dict{String,String} multinetwork Dictionary containing time series parameters.","category":"page"},{"location":"manual/eng-data-model.html#Voltage-Sources-(voltage_source)","page":"Engineering Data Model","title":"Voltage Sources (voltage_source)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"A voltage source is a source of power at a set voltage magnitude and angle connected to a slack bus. If rs or xs are not specified, the voltage source is assumed to be lossless, otherwise virtual branch and bus will be created in the mathematical model to represent the internal losses of the voltage source.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nbus String always id of bus connection\nconnections Vector{Int} always Ordered list of connected conductors, size=nconductors\nconfiguration WYE ConnConfig always WYE or DELTA. If WYE, connections[end]=neutral\nvm ones(nphases) Vector{Real} volt always Voltage magnitude set at slack bus, size=nphases\nva zeros(nphases) Real degree always Voltage angle offsets at slack bus, applies symmetrically to each phase angle\nrs zeros(nconductors,nconductors) Matrix{Real} ohm always Internal series resistance of voltage source, size=(nconductors,nconductors)\nxs zeros(nconductors,nconductors) Matrix{Real} ohm always Internal series reactance of voltage soure, size=(nconductors,nconductors)\nstatus ENABLED Status always ENABLED or DISABLED. Indicates if component is enabled or disabled, respectively\ntime_series Dict{String,String} multinetwork Dictionary containing time series parameters.","category":"page"},{"location":"manual/eng-data-model.html#Data-Objects-(codes,-time-series,-etc.)","page":"Engineering Data Model","title":"Data Objects (codes, time series, etc.)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"These objects are referenced by node and edge objects, but are not part of the network themselves, only containing data.","category":"page"},{"location":"manual/eng-data-model.html#Linecodes-(linecode)","page":"Engineering Data Model","title":"Linecodes (linecode)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Linecodes are easy ways to specify properties common to multiple lines.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nrs Matrix{Real} ohm/meter always Series resistance, size=(nconductors,nconductors)\nxs Matrix{Real} ohm/meter always Series reactance, size=(nconductors,nconductors)\ng_fr zeros(nconductors,nconductors) Matrix{Real} siemens/meter/Hz always From-side conductance, size=(nconductors,nconductors)\nb_fr zeros(nconductors,nconductors) Matrix{Real} siemens/meter/Hz always From-side susceptance, size=(nconductors,nconductors)\ng_to zeros(nconductors,nconductors) Matrix{Real} siemens/meter/Hz always To-side conductance, size=(nconductors,nconductors)\nb_to zeros(nconductors,nconductors) Matrix{Real} siemens/meter/Hz always To-side susceptance, size=(nconductors,nconductors)\ncm_ub fill(Inf,nconductors) Vector{Real} ampere opf maximum current per conductor, symmetrically applicable\nsm_ub fill(Inf,nconductors) Vector{Real} watt opf maximum power per conductor, symmetrically applicable","category":"page"},{"location":"manual/eng-data-model.html#Transformer-Codes-(xfmrcode)","page":"Engineering Data Model","title":"Transformer Codes (xfmrcode)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Transformer codes are easy ways to specify properties common to multiple transformers","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\nconfigurations fill(WYE, nwindings) Vector{ConnConfig} always WYE or DELTA. List of configuration for each winding, size=nwindings\nxsc [0.0] Vector{Real} ohm always List of short-circuit reactances between each pair of windings; enter as a list of the upper-triangle elements, size=(nwindings == 2 ? 1 : 3)\nrw zeros(nwindings) Vector{Real} ohm always List of the winding resistance for each winding, size=nwindings\ntm_nom ones(nwindings) Vector{Real} always Nominal tap ratio for the transformer, size=nwindings (multiplier)\ntm_ub Vector{Vector{Real}} opf Maximum tap ratio for each winding and phase, size=((nphases), nwindings) (base=tm_nom)\ntm_lb Vector{Vector{Real}} opf Minimum tap ratio for for each winding and phase, size=((nphases), nwindings) (base=tm_nom)\ntm_set fill(fill(1.0, nphases), nwindings) Vector{Vector{Real}} always Set tap ratio for each winding and phase, size=((nphases), nwindings) (base=tm_nom)\ntm_fix fill(fill(true, nphases), nwindings) Vector{Vector{Bool}} always Indicates for each winding and phase whether the tap ratio is fixed, size=((nphases), nwindings)","category":"page"},{"location":"manual/eng-data-model.html#Time-Series-(time_series)","page":"Engineering Data Model","title":"Time Series (time_series)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Time series objects are used to specify time series for e.g. load or generation forecasts.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Some parameters for components specified in this document can support a time series by inserting a reference to a time_series object into the time_series dictionary inside a component under the relevant parameter name. For example, for a load, if pd_nom is supposed to be a time series, the user would specify \"time_series\" => Dict(\"pd_nom\" => time_series_id) where time_series_id is the id of an object in time_series, and has type Any.","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\ntime Union{Vector{Real},Vector{String}} hour always Time points at which values are specified. If time is specified in String, units not required to be in hours.\nvalues Vector{Real} always Multipers at each time step given in time\noffset 0 Real hour always Start time offset\nreplace true Bool always Indicates to replace with data, instead of multiply. Will only work on non-Array data","category":"page"},{"location":"manual/eng-data-model.html#Fuses-(fuse)","page":"Engineering Data Model","title":"Fuses (fuse)","text":"","category":"section"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Fuses can be defined on any terminal of any physical component","category":"page"},{"location":"manual/eng-data-model.html","page":"Engineering Data Model","title":"Engineering Data Model","text":"Name Default Type Units Used Description\ncomponent_type String \ncomponent_id String \nterminals Vector{Int} \nfuse_curve Array{Vector{Real},2} specifies the fuse blowing condition\nminimum_melting_curve Array{Vector{Real},2} specifies the minimum melting conditions of the fuse","category":"page"},{"location":"developer/contributing.html#Pull-Requests","page":"Contributing","title":"Pull Requests","text":"","category":"section"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"All pull requests should be reviewed by a core developer, and may include a review by a subject matter expert if the area of the PR is outside that of one of the core developers. In that case, the core developers will primarily review style and design, rather than substance.","category":"page"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"Every PR to PowerModelsDistribution should strive to meet the following guidelines.","category":"page"},{"location":"developer/contributing.html#PR-Title","page":"Contributing","title":"PR Title","text":"","category":"section"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"Should be concise and clear, describing in a phrase the content of the PR\nShould include a prefix that describes the primary type of the PR\nADD: feature addition\nFIX: bugfix\nREF: refactor\nUPD: updates to code for e.g. version bumps of dependencies\nSTY: style changes, no changes to function names, added features, etc.\nDOC: documentation-only additions/changes\nRM: dead code removal","category":"page"},{"location":"developer/contributing.html#PR-Body","page":"Contributing","title":"PR Body","text":"","category":"section"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"If the change is breaking, it should be clearly stated up front\nThe purpose of this PR should be clearly stated right away\nMajor changes / additions to the code should be summarized. In the case where a refactor was performed, the name changes of public functions should be documented in the body of the PR\nAny associated Issues should be referenced in the body of the PR, and it is accepted/encouraged to use Closes #XX to automatically close Issues after the PR is merged","category":"page"},{"location":"developer/contributing.html#PR-Code","page":"Contributing","title":"PR Code","text":"","category":"section"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"An entry should be added to CHANGELOG.md for every PR\nDocumentation should be updated (See Documentation section above for guidelines)\nUnit tests should be added. In the case where existing unit tests were altered, an explanation for the change must be included\nCode should be rebased to the latest version of whatever branch the PR is aimed at (no merge conflicts!)","category":"page"},{"location":"developer/contributing.html#Versions","page":"Contributing","title":"Versions","text":"","category":"section"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"PowerModelsDistribution follows the Semantic Versioning (SemVer) convention of Major.minor.patch, where Major indicates breaking changes, minor indicates non-breaking feature additions, and patch indicates non-breaking bugfixes.","category":"page"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"Currently, because Major==0, minor indicates breaking changes and patch indicates any non-breaking change, including both feature additions and bugfixes. Once PowerModelsDistribution reaches v1.0.0, we will adhere strictly to the SemVer convention.","category":"page"},{"location":"developer/contributing.html#Branch-Management","page":"Contributing","title":"Branch Management","text":"","category":"section"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"The main branch is a protected branch, meaning that its history will always be contiguous and can never be overwritten.","category":"page"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"Release candidate branches of the format vM.m.0-rc are also protected branches. These branches will contain only breaking changes and will not be merged into main until a new version is ready to be tagged. Pull requests including breaking changes should be directed into the next release candidate branch available, e.g. if the current version of the package is v0.9.0, the next release candidate branch will be v0.10.0-rc.","category":"page"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"Pull requests that include only non-breaking changes can be merged directly into main once approved, and in the case of merge conflicts arising for release candidate branches, the -rc branch will need to be updated to include the latest main.","category":"page"},{"location":"developer/contributing.html","page":"Contributing","title":"Contributing","text":"Pull requests will generally be merged using squash and merge into the branch they are aimed at, with the exception of release candidate branches, which generally be merged using rebase and merge into main.","category":"page"},{"location":"reference/problems.html#ProblemAPI","page":"Problems","title":"Problems","text":"","category":"section"},{"location":"reference/problems.html#Solvers","page":"Problems","title":"Solvers","text":"","category":"section"},{"location":"reference/problems.html","page":"Problems","title":"Problems","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"solve\")","category":"page"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_mld-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_mld","text":"Solve load shedding problem with storage\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_mld_uc-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_mld_uc","text":"Solve unit commitment load shedding problem (!relaxed)\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_model-Tuple{Dict{String}, Type, Any, Function}","page":"Problems","title":"PowerModelsDistribution.solve_mc_model","text":"solve_mc_model(\n data::Dict{String,<:Any},\n model_type::Type,\n optimizer,\n build_mc::Function;\n ref_extensions::Vector{<:Function}=Function[],\n multinetwork::Bool=false,\n global_keys::Set{String}=Set{String}(),\n eng2math_extensions::Vector{<:Function}=Function[],\n eng2math_passthrough::Dict{String,<:Vector{<:String}}=Dict{String,Vector{String}}(),\n make_si::Bool=!get(data, \"per_unit\", false),\n make_si_extensions::Vector{<:Function}=Function[],\n dimensionalize_math_extensions::Dict{String,Dict{String,Vector{String}}}=Dict{String,Dict{String,Vector{String}}}(),\n kwargs...\n)::Dict{String,Any}\n\nTakes data in either the ENGINEERING or MATHEMATICAL model, a model type (e.g., ACRUPowerModel), and model builder function (e.g., build_mc_opf), and returns a solution in the original data model defined by data.\n\nIf make_si is false, data will remain in per-unit.\n\nFor an explanation of multinetwork and global_keys, see make_multinetwork\n\nFor an explanation of eng2math_extensions and eng2math_passthrough, see transform_data_model\n\nFor an explanation of make_pu_extensions, see make_per_unit!\n\nFor an explanation of ref_extensions, see instantiate_mc_model\n\nFor an explanation of map_math2eng_extensions, make_si, make_si_extensions, and dimensionalize_math_extensions, see solution_make_si\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_model-Tuple{String, Type, Any, Function}","page":"Problems","title":"PowerModelsDistribution.solve_mc_model","text":"solve_mc_model(\n file::String,\n model_type::Type,\n optimizer,\n build_mc::Function;\n dss2eng_extensions::Vector{<:Function}=Function[],\n multinetwork::Bool=false,\n global_keys::Set{String}=Set{String}(),\n kwargs...\n)::Dict{String,Any}\n\nGiven a file::String, data will be parsed automatically from the file.\n\nSee solve_mc_model for detailed explanation of function arguments.\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_opf-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_opf","text":"function solve_mc_opf(\n\tdata::Union{Dict{String,<:Any},String},\n\tmodel_type::Type,\n\tsolver;\n\tkwargs...\n)\n\nSolve Optimal Power Flow\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_opf_capc-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_opf_capc","text":"solve_mc_opf_capc(data::Union{Dict{String,<:Any},String}, model_type::Type, solver; kwargs...)\n\nSolve OPF with capacitor control\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_opf_oltc-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_opf_oltc","text":"Solve on-load tap-changer OPF\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_opf_oltc_capc-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_opf_oltc_capc","text":"solve_mc_opf_capc(data::Union{Dict{String,<:Any},String}, model_type::Type, solver; kwargs...)\n\nSolve OPF with capacitor control\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_opf_pbs-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_opf_pbs","text":"Solve OPF problem with slack power at every bus\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_pf-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_pf","text":"Power Flow Problem\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mc_pf_pbs-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mc_pf_pbs","text":"Solve PF problem with slack power at every bus\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mn_mc_mld_simple-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mn_mc_mld_simple","text":"Solve multinetwork load shedding problem with storage\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.solve_mn_mc_opf-Tuple{Union{String, Dict{String}}, Type, Any}","page":"Problems","title":"PowerModelsDistribution.solve_mn_mc_opf","text":"function solve_mn_mc_opf(\n\tdata::Union{Dict{String,<:Any},String},\n\tmodel_type::Type,\n\tsolver;\n\tkwargs...\n)\n\nSolve multinetwork optimal power flow problem\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#Builders","page":"Problems","title":"Builders","text":"","category":"section"},{"location":"reference/problems.html","page":"Problems","title":"Problems","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"build\")","category":"page"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_mld-Tuple{AbstractUBFModels}","page":"Problems","title":"PowerModelsDistribution.build_mc_mld","text":"Load shedding problem for Branch Flow model\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_mld-Tuple{AbstractUnbalancedIVRModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_mld","text":"\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_mld-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_mld","text":"Load shedding problem including storage (snap-shot)\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_mld_bf-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_mld_bf","text":"Load shedding problem for Branch Flow model\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_mld_uc-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_mld_uc","text":"Standard unit commitment (!relaxed) load shedding problem\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf-Tuple{AbstractExplicitNeutralACRModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf","text":"function build_mc_opf(\n\tpm::AbstractExplicitNeutralACRModel\n)\n\nconstructor for OPF in power-voltage variable space with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf-Tuple{AbstractExplicitNeutralIVRModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf","text":"function build_mc_opf(\n\tpm::AbstractExplicitNeutralIVRModel\n)\n\nconstructor for OPF in current-voltage variable space with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf-Tuple{AbstractUBFModels}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf","text":"function build_mc_opf(\n\tpm::AbstractUBFModels\n)\n\nconstructor for branch flow opf\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf-Tuple{AbstractUnbalancedIVRModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf","text":"function build_mc_opf(\n\tpm::AbstractUnbalancedIVRModel\n)\n\nconstructor for OPF in current-voltage variable space\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf","text":"function build_mc_opf(\n\tpm::AbstractUnbalancedPowerModel\n)\n\nConstructor for Optimal Power Flow\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf_capc-Tuple{AbstractUBFModels}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf_capc","text":"constructor for branch flow opf with capcontrol\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf_capc-Tuple{AbstractUnbalancedIVRModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf_capc","text":"constructor for capcontrol OPF in current-voltage variable space\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf_capc-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf_capc","text":"build_mc_opf_capc(pm::AbstractUnbalancedPowerModel)\n\nConstructor for capcontrol OPF\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf_oltc-Tuple{AbstractUBFModels}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf_oltc","text":"constructor for branch flow on-load tap-changer OPF\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf_oltc-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf_oltc","text":"constructor for on-load tap-changer OPF\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf_oltc_capc-Tuple{AbstractUBFModels}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf_oltc_capc","text":"constructor for branch flow opf\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf_oltc_capc-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf_oltc_capc","text":"build_mc_opf_capc(pm::AbstractUnbalancedPowerModel)\n\nConstructor for capcontrol OPF\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_opf_pbs-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_opf_pbs","text":"OPF problem with slack power at every bus\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_pf-Tuple{AbstractUBFModels}","page":"Problems","title":"PowerModelsDistribution.build_mc_pf","text":"Constructor for Branch Flow Power Flow\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_pf-Tuple{AbstractUnbalancedIVRModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_pf","text":"Constructor for Power Flow in current-voltage variable space\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_pf-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_pf","text":"Constructor for Power Flow Problem\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mc_pf_pbs-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mc_pf_pbs","text":"PF problem with slack power at every bus\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mn_mc_mld_simple-Tuple{AbstractUBFModels}","page":"Problems","title":"PowerModelsDistribution.build_mn_mc_mld_simple","text":"Multinetwork load shedding problem for Branch Flow model\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mn_mc_mld_simple-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mn_mc_mld_simple","text":"Multinetwork load shedding problem including storage\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mn_mc_opf-Tuple{AbstractExplicitNeutralIVRModel}","page":"Problems","title":"PowerModelsDistribution.build_mn_mc_opf","text":"function buildmcopf( pm::AbstractExplicitNeutralIVRModel )\n\nconstructor for multinetwork OPF in current-voltage variable space with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mn_mc_opf-Tuple{AbstractUBFModels}","page":"Problems","title":"PowerModelsDistribution.build_mn_mc_opf","text":"function build_mn_mc_opf(\n\tpm::AbstractUBFModels\n)\n\nMultinetwork branch flow optimal power flow problem\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mn_mc_opf-Tuple{AbstractUnbalancedIVRModel}","page":"Problems","title":"PowerModelsDistribution.build_mn_mc_opf","text":"function build_mn_mc_opf(\n\tpm::AbstractUnbalancedIVRModel\n)\n\nMultinetwork current-voltage optimal power flow problem\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_mn_mc_opf-Tuple{AbstractUnbalancedPowerModel}","page":"Problems","title":"PowerModelsDistribution.build_mn_mc_opf","text":"function build_mn_mc_opf(\n\tpm::AbstractUnbalancedPowerModel\n)\n\nMultinetwork optimal power flow problem\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_pf_result-Tuple{PowerFlowData, Vector{ComplexF64}, PFTerminationStatus, Int64, Real, Real}","page":"Problems","title":"PowerModelsDistribution.build_pf_result","text":"build_pf_result(\n pfd::PowerFlowData,\n Uv::Vector,\n status::PFTerminationStatus,\n its::Int,\n time::Real,\n stationarity::Real,\n verbose::Bool\n)\n\nBuilds the result dict from the solution dict.\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.build_pf_solution-Tuple{PowerFlowData, Vector{ComplexF64}}","page":"Problems","title":"PowerModelsDistribution.build_pf_solution","text":"build_pf_solution(\n pfd::PowerFlowData,\n Uv::Vector\n)\n\nBuilds the solution dict.\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#Model-Instantiation","page":"Problems","title":"Model Instantiation","text":"","category":"section"},{"location":"reference/problems.html","page":"Problems","title":"Problems","text":"instantiate_mc_model","category":"page"},{"location":"reference/problems.html#PowerModelsDistribution.instantiate_mc_model","page":"Problems","title":"PowerModelsDistribution.instantiate_mc_model","text":"instantiate_mc_model(\n data::Dict{String,<:Any},\n model_type::Type,\n build_method::Function;\n ref_extensions::Vector{<:Function}=Function[],\n multinetwork::Bool=false,\n global_keys::Set{String}=Set{String}(),\n eng2math_extensions::Vector{<:Function}=Function[],\n eng2math_passthrough::Dict{String,<:Vector{<:String}}=Dict{String,Vector{String}}(),\n make_pu_extensions::Vector{<:Function}=Function[],\n kwargs...\n)\n\nTakes data in either the ENGINEERING or MATHEMATICAL model, a model type (e.g., ACRUPowerModel), and model builder function (e.g., build_mc_opf), and returns an AbstractUnbalancedPowerModel structure.\n\nFor an explanation of multinetwork and global_keys, see make_multinetwork\n\nFor an explanation of eng2math_extensions and eng2math_passthrough, see transform_data_model\n\nFor an explanation of make_pu_extensions, see make_per_unit!\n\nref_extensions\n\nInside of the model structures, data can be quickly accessed via the ref function. By default, the only ref objects available are created by ref_add_core!, but users can add their own custom ref objects by passing functions via ref_extensions that have the signature:\n\nref_add!(ref::Dict{Symbol,Any}, data::Dict{String,Any})\n\nSee the Beginners Guide for an example.\n\n\n\n\n\n","category":"function"},{"location":"reference/problems.html#Solution-Helpers","page":"Problems","title":"Solution Helpers","text":"","category":"section"},{"location":"reference/problems.html","page":"Problems","title":"Problems","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"sol_\")","category":"page"},{"location":"reference/problems.html#PowerModelsDistribution.sol_data_model!-Tuple{AbstractUnbalancedACRModel, Dict{String}}","page":"Problems","title":"PowerModelsDistribution.sol_data_model!","text":"sol_data_model!(pm::AbstractUnbalancedACRModel, solution::Dict{String,<:Any})\n\nsolutionprocessor, see [`solvemcmodel`](@ref solvemc_model), to convert ACR variables back into polar representation (default data model voltage form)\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.sol_data_model!-Tuple{AbstractUnbalancedPowerModel, Dict{String}}","page":"Problems","title":"PowerModelsDistribution.sol_data_model!","text":"sol_data_model!(pm::AbstractUnbalancedPowerModel, solution::Dict{String,<:Any})\n\ndoes nothing (no sol_data_model! exists for the formulation attempting to be converted)\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.sol_data_model!-Tuple{AbstractUnbalancedWModels, Dict{String}}","page":"Problems","title":"PowerModelsDistribution.sol_data_model!","text":"sol_data_model!(pm::AbstractUnbalancedWModels, solution::Dict{String,<:Any})\n\nsolutionprocessor, see [`solvemcmodel`](@ref solvemc_model), to convert W variables back into polar representation (default data model voltage form)\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.sol_data_model!-Tuple{FBSUBFPowerModel, Dict{String}}","page":"Problems","title":"PowerModelsDistribution.sol_data_model!","text":"sol_data_model!(pm::FBSUBFPowerModel, solution::Dict{String,<:Any})\n\nsolution_processor, to convert FBS variables back into polar representation (default data model voltage form)\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#PowerModelsDistribution.sol_data_model!-Tuple{FOTRUPowerModel, Dict{String}}","page":"Problems","title":"PowerModelsDistribution.sol_data_model!","text":"sol_data_model!(pm::FOTRUPowerModel, solution::Dict{String,<:Any})\n\nsolution_processor, to convert FOT rectangular variables back into polar representation (default data model voltage form)\n\n\n\n\n\n","category":"method"},{"location":"reference/problems.html#DEPRECIATED-Solver-functions","page":"Problems","title":"DEPRECIATED Solver functions","text":"","category":"section"},{"location":"reference/problems.html","page":"Problems","title":"Problems","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"run\")","category":"page"},{"location":"manual/load-model.html#Load-Models","page":"Load Models","title":"Load Models","text":"","category":"section"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"S^d=S^d_1S^d_n^T","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"is a column vector ntimes 1, specifying for each individual load how much power is consumed. By definition, this is","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"S^d=U^dodot left(I^dright)^*","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"where U^d is the voltage applied across each individual load and I^d is the current drawn by each load. At the same time, the composed load is connected to a bus with voltage U^textbus, and draws a current I^textbus and power S^textbus.","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"How these quantities relate to each other, depends on how the load is connected.","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"(S^d U^d I^d) (S^textbus U^textbus I^textbus)","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"In the implementations, these variables are referred to as","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"beginalign\nS^d=textpd+jtextqd S^textbus=textpd_bus+jtextqd_bus\nI^d=textcrd+jtextcid I^textbus=textcrd_bus+jtextcid_bus\nU^d=textvrd+jtextvid U^textbus=textvr+jtextvi\nendalign","category":"page"},{"location":"manual/load-model.html#Voltage-dependency","page":"Load Models","title":"Voltage dependency","text":"","category":"section"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"The general, exponential load model is defined as","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"P^d_i = P^d0_i left(fracV^d_iV^d0_iright)^alpha_i = a_i left(V^d_iright)^alpha_i","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"Q^d_i = Q^d0_i left(fracV^d_iV^d0_iright)^beta_i = b_i left(V^d_iright)^beta_i","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"There are a few cases which get a special name: constant power (alpha=beta=0), constant current (alpha=beta=1), and constant impedance (alpha=beta=2).","category":"page"},{"location":"manual/load-model.html#Wye-connected-Loads","page":"Load Models","title":"Wye-connected Loads","text":"","category":"section"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"A wye-connected load connects between a set of phases mathcalP and a neutral conductor n. The voltage as seen by each individual load is then","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"U^d = U^textbus_mathcalP-U^textbus_n","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"whilst the current","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"I^textbus_mathcalP = I^textdI^textbus_n=-1^TI^d","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"We now develop the expression for the power drawn at the bus for the phase conductors","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"S^textbus_mathcalP = (U^d+U^textbus_n)odot(I^d)^* = S^d+U^textbus_n S^doslash U^d","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"From conservation of power or simply the formulas above,","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"S^textbus_n = -1^TS^textbus_mathcalP+1^TS^d","category":"page"},{"location":"manual/load-model.html#Grounded-neutral","page":"Load Models","title":"Grounded neutral","text":"","category":"section"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"Note that when the neutral is grounded, i.e. U^textbus_n=0, these formulas simplify to","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"S^textbus_mathcalP=S^dS^textbus_n=0","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"which is why in Kron-reduced unbalanced networks, you can directly insert the power consumed by the loads, in the nodal power balance equations.","category":"page"},{"location":"manual/load-model.html#Delta-connected-Loads","page":"Load Models","title":"Delta-connected Loads","text":"","category":"section"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"Firstly, define the three-phase delta transformation matrix","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"M^Delta_3 = beginbmatrix1 -1 0 0 1 -1 -1 0 1endbmatrix","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"which can be extended to more phases in a straight-forward manner. For loads connected between split-phase terminals of triplex nodes (usually located on the secondary side of center-tapped transformers), we define a single-phase delta transformation matrix","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"M^Delta_1 = beginbmatrix 1 -1 endbmatrix","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"Now,","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"U^d = M^Delta U^textbus I^textbus = left(M^Deltaright)^T I^d","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"We can related S^textbus to U^textbus and I^d","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"S^textbus = U^textbusodot left(I^textbusright)^* = U^textbusodot left(M^Deltaright)^Tleft(I^dright)^*","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"and using the fact that left(I^dright)^*=S^d oslash U^d, and the expression above for U^d,","category":"page"},{"location":"manual/load-model.html","page":"Load Models","title":"Load Models","text":"S^textbus = U^textbusleft(M^Deltaright)^T S^d oslash M^Delta U^textbus","category":"page"},{"location":"index.html#![PowerModelsDistribution-Logo](assets/logo.svg)","page":"Introduction","title":"(Image: PowerModelsDistribution Logo)","text":"","category":"section"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"CurrentModule = PowerModelsDistribution","category":"page"},{"location":"index.html#What-is-PowerModelsDistribution?","page":"Introduction","title":"What is PowerModelsDistribution?","text":"","category":"section"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"PowerModelsDistribution.jl is a Julia/JuMP-based package for modeling unbalanced (i.e., multiconductor) power networks.","category":"page"},{"location":"index.html#Resources-for-Getting-Started","page":"Introduction","title":"Resources for Getting Started","text":"","category":"section"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"Read the Installation Guide.","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"Read the Quickstart Guide.","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"Read the introductory tutorial Introduction to PowerModelsDistribution.","category":"page"},{"location":"index.html#How-the-documentation-is-structured","page":"Introduction","title":"How the documentation is structured","text":"","category":"section"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"The following is a high-level overview of how our documentation is structured. There are three primary sections:","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"The Manual contains detailed documentation for certain aspects of PowerModelsDistribution, such as the data model specification, the Unbalanced Network Formulations, or the Optimization Problem Specifications.\nTutorials contains working examples of how to use PowerModelsDistribution. Start here if you are new to PowerModelsDistribution.\nThe API Reference contains a complete list of the functions you can use in PowerModelsDistribution. Look here if you want to know how to use a particular function.","category":"page"},{"location":"index.html#Citing-PowerModelsDistribution","page":"Introduction","title":"Citing PowerModelsDistribution","text":"","category":"section"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"If you find PowerModelsDistribution useful for your work, we kindly request that you cite the following publication:","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"@article{FOBES2020106664,\ntitle = \"PowerModelsDistribution.jl: An open-source framework for exploring distribution power flow formulations\",\njournal = \"Electric Power Systems Research\",\nvolume = \"189\",\npages = \"106664\",\nyear = \"2020\",\nissn = \"0378-7796\",\ndoi = \"https://doi.org/10.1016/j.epsr.2020.106664\",\nurl = \"http://www.sciencedirect.com/science/article/pii/S0378779620304673\",\nauthor = \"David M. Fobes and Sander Claeys and Frederik Geth and Carleton Coffrin\",\nkeywords = \"Nonlinear optimization, Convex optimization, AC optimal power flow, Julia language, Open-source\",\nabstract = \"In this work we introduce PowerModelsDistribution, a free, open-source toolkit for distribution power network optimization, whose primary focus is establishing a baseline implementation of steady-state multi-conductor unbalanced distribution network optimization problems, which includes implementations of Power Flow and Optimal Power Flow problem types. Currently implemented power flow formulations for these problem types include AC (polar and rectangular), a second-order conic relaxation of the Branch Flow Model (BFM) and Bus Injection Model (BIM), a semi-definite relaxation of BFM, and several linear approximations, such as the simplified unbalanced BFM. The results of AC power flow have been validated against OpenDSS, an open-source “electric power distribution system simulator”, using IEEE distribution test feeders (13, 34, 123 bus and LVTestCase), all parsed using a built-in OpenDSS parser. This includes support for standard distribution system components as well as novel resource models such as generic energy storage (multi-period) and photovoltaic systems, with the intention to add support for additional components in the future.\"\n}","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"The associated Power Systems Computation Conference talk can be found on YouTube.","category":"page"},{"location":"index.html#License","page":"Introduction","title":"License","text":"","category":"section"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"This code is provided under a BSD license as part of the Multi-Infrastructure Control and Optimization Toolkit (MICOT) project, LA-CC-13-108.","category":"page"},{"location":"reference/enums.html#EnumAPI","page":"Enums","title":"Enums","text":"","category":"section"},{"location":"reference/enums.html","page":"Enums","title":"Enums","text":"PowerModelsDistributionEnums\nDataModel\nENGINEERING\nMATHEMATICAL\nDSS\nMATPOWER\nLoadModel\nPOWER\nCURRENT\nIMPEDANCE\nEXPONENTIAL\nZIP\nShuntModel\nGENERIC\nCAPACITOR\nREACTOR\nSwitchState\nOPEN\nCLOSED\nControlMode\nFREQUENCYDROOP\nISOCHRONOUS\nConnConfig\nWYE\nDELTA\nDispatchable\nNO\nYES\nStatus\nDISABLED\nENABLED","category":"page"},{"location":"reference/enums.html#PowerModelsDistribution.PowerModelsDistributionEnums","page":"Enums","title":"PowerModelsDistribution.PowerModelsDistributionEnums","text":"Collection of the built-in Enums for PowerModelsDistribution\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.DataModel","page":"Enums","title":"PowerModelsDistribution.DataModel","text":"DataModel\n\nAn Enum to descibe the current data model contained in the structure\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.ENGINEERING","page":"Enums","title":"PowerModelsDistribution.ENGINEERING","text":"Model type for models that are in the PowerModelsDistribution engineering representation\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.MATHEMATICAL","page":"Enums","title":"PowerModelsDistribution.MATHEMATICAL","text":"Model type for models that are in the mathematical representation\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.DSS","page":"Enums","title":"PowerModelsDistribution.DSS","text":"Model type for raw dss imports\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.MATPOWER","page":"Enums","title":"PowerModelsDistribution.MATPOWER","text":"Model type for models imported via parse_file from PowerModels\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.LoadModel","page":"Enums","title":"PowerModelsDistribution.LoadModel","text":"LoadModel\n\nAn Enum to describe the type of load, e.g., constant power, constant current, etc.\n\nInformation about load models can be found under Load Models\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.POWER","page":"Enums","title":"PowerModelsDistribution.POWER","text":"Constant Power load model\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.CURRENT","page":"Enums","title":"PowerModelsDistribution.CURRENT","text":"Constant Current load model\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.IMPEDANCE","page":"Enums","title":"PowerModelsDistribution.IMPEDANCE","text":"Constant Impedance load model\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.EXPONENTIAL","page":"Enums","title":"PowerModelsDistribution.EXPONENTIAL","text":"Exponential load model\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.ZIP","page":"Enums","title":"PowerModelsDistribution.ZIP","text":"ZIP load model\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.ShuntModel","page":"Enums","title":"PowerModelsDistribution.ShuntModel","text":"ShuntModel\n\nAn Enum to describe the type of shunt, e.g., generic, capcitor or reactor type.\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.GENERIC","page":"Enums","title":"PowerModelsDistribution.GENERIC","text":"Generic shunt model, usually indicates user-created\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.CAPACITOR","page":"Enums","title":"PowerModelsDistribution.CAPACITOR","text":"Capacitor shunt model, usually indicates parsed from capacitor dss object\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.REACTOR","page":"Enums","title":"PowerModelsDistribution.REACTOR","text":"Reactor shunt model, usually indicates parsed from reactor dss object\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.SwitchState","page":"Enums","title":"PowerModelsDistribution.SwitchState","text":"SwitchState\n\nAn Enum to descibe whether a switch is open or closed\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.OPEN","page":"Enums","title":"PowerModelsDistribution.OPEN","text":"Switch state is open\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.CLOSED","page":"Enums","title":"PowerModelsDistribution.CLOSED","text":"Switch state is closed\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.ControlMode","page":"Enums","title":"PowerModelsDistribution.ControlMode","text":"ControlMode\n\nAn Enum to descibe the current control mode of the generation object\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.FREQUENCYDROOP","page":"Enums","title":"PowerModelsDistribution.FREQUENCYDROOP","text":"Generation resource is in frequency droop mode (following)\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.ISOCHRONOUS","page":"Enums","title":"PowerModelsDistribution.ISOCHRONOUS","text":"Generation resource is in isochronous mode (forming)\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.ConnConfig","page":"Enums","title":"PowerModelsDistribution.ConnConfig","text":"ConnConfig\n\nAn Enum to describe the connection configuration, e.g., wye or delta\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.WYE","page":"Enums","title":"PowerModelsDistribution.WYE","text":"Wye connection configuration\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.DELTA","page":"Enums","title":"PowerModelsDistribution.DELTA","text":"Delta connection configuration\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.Dispatchable","page":"Enums","title":"PowerModelsDistribution.Dispatchable","text":"Dispatchable\n\nAn Enum to describe whether an object is dispatchable, e.g., can a switch state be controled, or can a load or shunt be shed individually.\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.NO","page":"Enums","title":"PowerModelsDistribution.NO","text":"The object is not dispatchable / controllable\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.YES","page":"Enums","title":"PowerModelsDistribution.YES","text":"The object is dispatchable / controllable\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.Status","page":"Enums","title":"PowerModelsDistribution.Status","text":"Status\n\nAn Enum to describe whether an object is enabled or disabled\n\n\n\n\n\n","category":"type"},{"location":"reference/enums.html#PowerModelsDistribution.DISABLED","page":"Enums","title":"PowerModelsDistribution.DISABLED","text":"The object is disabled\n\n\n\n\n\n","category":"constant"},{"location":"reference/enums.html#PowerModelsDistribution.ENABLED","page":"Enums","title":"PowerModelsDistribution.ENABLED","text":"The object is enabled\n\n\n\n\n\n","category":"constant"},{"location":"reference/constraints.html#ConstraintAPI","page":"Constraints","title":"Constraints","text":"","category":"section"},{"location":"reference/constraints.html","page":"Constraints","title":"Constraints","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nFilter = t -> startswith(string(t), \"constraint\")","category":"page"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_M_psd-Tuple{JuMP.Model, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.constraint_M_psd","text":"For rectangular coordinates of a complex matrix M=Mre+im*Mim, this function applies constraints equivalent to requiring that M itself is PSD.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_SWL_psd-Tuple{JuMP.Model, Vararg{Any, 6}}","page":"Constraints","title":"PowerModelsDistribution.constraint_SWL_psd","text":"Take a multi-conductor voltage variable V and a current variable I. The associated power is then defined as S = VI^H Define the lifted variables as W and L as W = VV^H, L = I*I^H Then, it is equally valid that [W S; S^H L] ∈ PSDCone, rank([W S; S^H L])=1 This function adds this PSD constraint for the rectangular coordinates of S, W and L.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_capacitor_on_off-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Vector{Tuple{Int64, Vector{Int64}}}}","page":"Constraints","title":"PowerModelsDistribution.constraint_capacitor_on_off","text":"constraint_capacitor_on_off(pm::AbstractUnbalancedACPModel, i::Int; nw::Int=nw_id_default)\n\nAdd constraints to model capacitor switching\n\nbeginalign\ntextkvar control (ON) q-q_texton M_q z - ϵ (1-z) \ntextkvar control (OFF) q-q_textoff -M_q (1-z) - ϵ z \ntextvoltage control (ON) v-v_textmin -M_v z + ϵ (1-z) \ntextvoltage control (OFF) v-v_textmax M_v (1-z) - ϵ z\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_capacitor_on_off-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{Tuple{Int64, Vector{Int64}}}}","page":"Constraints","title":"PowerModelsDistribution.constraint_capacitor_on_off","text":"constraint_capacitor_on_off(pm::AbstractUnbalancedACRModel, i::Int; nw::Int=nw_id_default)\n\nAdd constraints to model capacitor switching\n\nbeginalign\ntextkvar control (ON) q-q_texton M_q z - ϵ (1-z) \ntextkvar control (OFF) q-q_textoff -M_q (1-z) - ϵ z \ntextvoltage control (ON) v_r^2 + v_i^2 - v_textmin^2 -M_v z + ϵ (1-z) \ntextvoltage control (OFF) v_r^2 + v_i^2 - v_textmax^2 M_v (1-z) - ϵ z\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_capacitor_on_off-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Vector{Tuple{Int64, Vector{Int64}}}}","page":"Constraints","title":"PowerModelsDistribution.constraint_capacitor_on_off","text":"constraint_capacitor_on_off(pm::AbstractUnbalancedIVRModel, i::Int; nw::Int=nw_id_default)\n\nAdd constraints to model capacitor switching\n\nbeginalign\ntextkvar control s = (vr_fr+im*vi_fr)*(cr_fr-im*ci_fr)\ntextkvar control (ON) Ims-q_texton M_q z - ϵ (1-z) \ntextkvar control (OFF) Ims-q_textoff -M_q (1-z) - ϵ z \ntextvoltage control (ON) v_r^2 + v_i^2 - v_textmin^2 -M_v z + ϵ (1-z) \ntextvoltage control (OFF) v_r^2 + v_i^2 - v_textmax^2 M_v (1-z) - ϵ z\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_capacitor_on_off-Tuple{FBSUBFPowerModel, Int64, Int64, Vector{Tuple{Int64, Vector{Int64}}}}","page":"Constraints","title":"PowerModelsDistribution.constraint_capacitor_on_off","text":"constraint_capacitor_on_off(pm::FBSUBFPowerModel, i::Int; nw::Int=nw_id_default)\n\nAdd constraints to model capacitor switching\n\nbeginalign\ntextkvar control (ON) q-q_texton M_q z - ϵ (1-z) \ntextkvar control (OFF) q-q_textoff -M_q (1-z) - ϵ z \ntextvoltage control (ON) 2 v_r0 v_r + 2 v_i0 v_i - v_r0^2 - v_i0^2 - v_textmin^2 -M_v z + ϵ (1-z) \ntextvoltage control (OFF) 2 v_r0 v_r + 2 v_i0 v_i - v_r0^2 - v_i0^2 - v_textmax^2 M_v (1-z) - ϵ z\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_capacitor_on_off-Tuple{FOTRUPowerModel, Int64, Int64, Vector{Tuple{Int64, Vector{Int64}}}}","page":"Constraints","title":"PowerModelsDistribution.constraint_capacitor_on_off","text":"constraint_capacitor_on_off(pm::FOTRUPowerModel, i::Int; nw::Int=nw_id_default)\n\nAdd constraints to model capacitor switching similar to FBSUBFPowerModel\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_capacitor_on_off-Tuple{LPUBFDiagModel, Int64, Int64, Vector{Tuple{Int64, Vector{Int64}}}}","page":"Constraints","title":"PowerModelsDistribution.constraint_capacitor_on_off","text":"constraint_capacitor_on_off(pm::LPUBFDiagModel, i::Int; nw::Int=nw_id_default)\n\nAdd constraints to model capacitor switching\n\nbeginalign\ntextkvar control (ON) q-q_texton M_q z - ϵ (1-z) \ntextkvar control (OFF) q-q_textoff -M_q (1-z) - ϵ z \ntextvoltage control (ON) w - v_textmin^2 -M_v z + ϵ (1-z) \ntextvoltage control (OFF) w - v_textmax^2 M_v (1-z) - ϵ z\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_from-Tuple{AbstractUnbalancedACPModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_from","text":"constraint_mc_ampacity_from(pm::AbstractUnbalancedACPModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on branches from-side\n\nmathp_{fr}^2 + q_{fr}^2 \\leq vm_{fr}^2 i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_from-Tuple{AbstractUnbalancedActivePowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Float64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_from","text":"nothing to do, no voltage variables\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_from-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_from","text":"constraint_mc_ampacity_from(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for branch current limit constraint from-side\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_from-Tuple{AbstractUnbalancedRectangularModels, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_from","text":"constraint_mc_ampacity_from(pm::AbstractUnbalancedRectangularModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on branches from-side\n\nmathp_{fr}^2 + q_{fr}^2 \\leq (vr_{fr}^2 + vi_{fr}^2) i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_from-Tuple{AbstractUnbalancedWModels, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_from","text":"constraint_mc_ampacity_from(pm::AbstractUnbalancedWModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on branches from-side\n\nmathp_{fr}^2 + q_{fr}^2 \\leq w_{fr} i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_from-Tuple{LPUBFDiagModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_from","text":"constraint_mc_ampacity_from(pm::AbstractUnbalancedWModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})\n\nACP current limit constraint on branches from-side\n\nmathp_{fr}^2 + q_{fr}^2 \\leq w_{fr} i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_to-Tuple{AbstractUnbalancedACPModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_to","text":"constraint_mc_ampacity_to(pm::AbstractUnbalancedACPModel, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on branches to-side\n\nmathp_{to}^2 + q_{to}^2 \\leq vm_{to}^2 i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_to-Tuple{AbstractUnbalancedActivePowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Float64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_to","text":"nothing to do, no voltage variables\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_to-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_to","text":"constraint_mc_ampacity_to(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothin\n\nTemplate function for branch current limit constraint to-side\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_to-Tuple{AbstractUnbalancedRectangularModels, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_to","text":"constraint_mc_ampacity_to(pm::AbstractUnbalancedRectangularModels, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on branches to-side\n\nmathp_{to}^2 + q_{to}^2 \\leq (vr_{to}^2 + vi_{to}^2) i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_to-Tuple{AbstractUnbalancedWModels, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_to","text":"constraint_mc_ampacity_to(pm::AbstractUnbalancedWModels, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on branches to-side\n\nmathp_{to}^2 + q_{to}^2 \\leq w_{to} i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ampacity_to-Tuple{LPUBFDiagModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ampacity_to","text":"constraint_mc_ampacity_to(pm::AbstractUnbalancedWModels, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, c_rating::Vector{<:Real})\n\nACP current limit constraint on branches to-side\n\nmathp_{to}^2 + q_{to}^2 \\leq w_{to} i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_branch_current_limit-Tuple{AbstractExplicitNeutralACRModel, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector, Vector, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_branch_current_limit","text":"function constraint_mc_branch_current_limit(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector,\n\tt_connections::Vector,\n\tc_rating::Vector{<:Real};\n\treport::Bool=true\n)\n\nFor ACR models with explicit neutrals, imposes a bound on the total current magnitude per conductor.\n\np_fr^2 + q_fr^2 <= r^2 * (vr_fr^2 + vi_fr^2)\np_to^2 + q_to^2 <= r^2 * (vr_to^2 + vi_to^2)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_branch_current_limit-Tuple{AbstractExplicitNeutralIVRModel, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector, Vector, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_branch_current_limit","text":"function constraint_mc_branch_current_limit(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector,\n\tt_connections::Vector,\n\tc_rating::Vector{<:Real};\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, imposes a bound on the current magnitude per conductor at both ends of the branch (total current, i.e. including shunt contributions).\n\ncr_fr^2 + ci_fr^2 <= c_rating^2\ncr_to^2 + ci_to^2 <= c_rating^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_branch_current_limit-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_branch_current_limit","text":"function constraint_mc_branch_current_limit(\n\tpm::ExplicitNeutralModels,\n\tid::Int;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nFor models with explicit neutrals, imposes a bound on the current magnitude per conductor at both ends of the branch (total current, i.e. including shunt contributions)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_branch_current_series_product_hermitian-Tuple{AbstractUBFModels}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_branch_current_series_product_hermitian","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_branch_flow-Tuple{AbstractUnbalancedAPLossLessModels, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_branch_flow","text":"Already handled by variablemcbranchpowerreal\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_branch_flow-Tuple{AbstractUnbalancedPowerModel, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_branch_flow","text":"constraint_mc_branch_flow(pm::AbstractUnbalancedPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int})\n\nFor superconducting branch flow (brr and brx all zeros)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_balance-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_balance","text":"constraint_mc_bus_voltage_balance(pm::AbstractUnbalancedPowerModel, bus_id::Int; nw=nw_id_default)::Nothing\n\nTemplate function for bus voltage balance constraints.\n\nImpose all balance related constraints for which key present in data model of bus. For a discussion of sequence components and voltage unbalance factor (VUF), see @INPROCEEDINGS{girigoudarmolzahnroald-2019, \tauthor={K. Girigoudar and D. K. Molzahn and L. A. Roald}, \tbooktitle={submitted}, \ttitle={{Analytical and Empirical Comparisons of Voltage Unbalance Definitions}}, \tyear={2019}, \tmonth={}, url={https://molzahn.github.io/pubs/girigoudarmolzahnroald-2019.pdf} }\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_drop-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_drop","text":"function constraint_mc_bus_voltage_drop(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\ti::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tr::Matrix{<:Real},\n\tx::Matrix{<:Real}\n)\n\nFor IVR models with explicit neutrals, defines voltage drop over a branch, linking from and to side complex voltage.\n\nvr_to == vr_fr - r*csr_fr + x*csi_fr\nvi_to == vi_fr - r*csi_fr - x*csr_fr\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_drop-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_drop","text":"Defines voltage drop over a branch, linking from and to side complex voltage\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_drop-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_drop","text":"constraint_mc_bus_voltage_drop(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for bus voltage drop constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_ll-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Vector, Vector}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_ll","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_negative_sequence-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_negative_sequence","text":"a = exp(im2π/3) U+ = (1Ua + aUb a^2Uc)/3 U- = (1Ua + a^2Ub aUc)/3 vuf = |U-|/|U+| |U-| <= vufmax|U+| |U-|^2 <= vufmax^2*|U+|^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_on_off-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_on_off","text":"on/off bus voltage magnitude constraint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_on_off-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_on_off","text":"constraint_mc_bus_voltage_magnitude_on_off(pm::AbstractUnbalancedPowerModel, nw::Int, i::Int, vmin::Vector{<:Real}, vmax::Vector{<:Real})::Nothing\n\nGeneric on/off bus voltage magnitude constraint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_on_off-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_on_off","text":"constraint_mc_bus_voltage_magnitude_on_off(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for on/off voltage magnitude constraint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_positive_sequence-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_positive_sequence","text":"a = exp(im2π/3) U+ = (1Ua + aUb a^2Uc)/3 U- = (1Ua + a^2Ub aUc)/3 vuf = |U-|/|U+| |U-| <= vufmax|U+| |U-|^2 <= vufmax^2*|U+|^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_sqr_on_off-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_sqr_on_off","text":"on/off bus voltage magnitude squared constraint for relaxed formulations\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_sqr_on_off-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_sqr_on_off","text":"constraint_mc_bus_voltage_magnitude_sqr_on_off(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for on/off voltage magnitude squared constraint for relaxed formulations\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_vuf-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_vuf","text":"a = exp(im2π/3) U+ = (1Ua + aUb a^2Uc)/3 U- = (1Ua + a^2Ub aUc)/3 vuf = |U-|/|U+| |U-| <= vufmax|U+| |U-|^2 <= vufmax^2*|U+|^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_zero_sequence-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_magnitude_zero_sequence","text":"a = exp(im2π/3) U+ = (1Ua + aUb a^2Uc)/3 U- = (1Ua + a^2Ub aUc)/3 vuf = |U-|/|U+| |U-| <= vufmax|U+| |U-|^2 <= vufmax^2*|U+|^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_on_off-Tuple{AbstractUnbalancedACPModel}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_on_off","text":"bus voltage on/off constraint for load shed problem\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_on_off-Tuple{AbstractUnbalancedACRModel}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_on_off","text":"bus voltage on/off constraint for load shed problem\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_on_off-Tuple{AbstractUnbalancedDCPModel}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_on_off","text":"on/off bus voltage constraint for DCP formulation, nothing to do\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_on_off-Tuple{AbstractUnbalancedPowerModel}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_on_off","text":"constraint_mc_bus_voltage_on_off(pm::AbstractUnbalancedPowerModel; nw::Int=nw_id_default)::Nothing\n\nTemplate function for on/off constraint for bus voltages\"\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_bus_voltage_on_off-Tuple{AbstractUnbalancedWModels}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_bus_voltage_on_off","text":"on/off bus voltage constraint for relaxed forms\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_balance-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_balance","text":"Kirchhoff's current law applied to buses sum(cr + im*ci) = 0\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_balance-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_balance","text":"constraint_mc_current_balance(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for KCL constraints in current-voltage variable space\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_balance-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_balance","text":"function constraint_mc_current_balance(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ti::Int,\n\tterminals::Vector{Int},\n\tgrounded::Vector{Bool},\n\tbus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},\n\tbus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},\n\tbus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},\n\tbus_gens::Vector{Tuple{Int,Vector{Int}}},\n\tbus_storage::Vector{Tuple{Int,Vector{Int}}},\n\tbus_loads::Vector{Tuple{Int,Vector{Int}}},\n\tbus_shunts::Vector{Tuple{Int,Vector{Int}}}\n)\n\nKirchhoff's current law applied to buses sum(cr + im*ci) = 0\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_balance_capc-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_balance_capc","text":"constraint_mc_current_balance_capc(pm::AbstractUnbalancedIVRModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nCurrent balance constraints with capacitor control.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_balance_capc-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_balance_capc","text":"constraint_mc_current_balance_capc(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for KCL constraints in current-voltage variable space with capacitor control variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_from-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_from","text":"function constraint_mc_current_from(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tf_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tg_sh_fr::Matrix{<:Real},\n\tb_sh_fr::Matrix{<:Real};\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, defines how current distributes over series and shunt impedances of a pi-model branch.\n\ncr_fr == csr_fr + g_sh_fr*vr_fr - b_sh_fr*vi_fr\nci_fr == csi_fr + g_sh_fr*vi_fr + b_sh_fr*vr_fr\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_from-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_from","text":"Defines how current distributes over series and shunt impedances of a pi-model branch\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_from-Tuple{AbstractUnbalancedIVRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_from","text":"constraint_mc_current_from(pm::AbstractUnbalancedIVRModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for current constraints on branches (from-side)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_from-Tuple{ReducedExplicitNeutralIVRModels, Int64, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_from","text":"function constraint_mc_current_from(\n\tpm::ReducedExplicitNeutralIVRModels,\n\tnw::Int,\n\tf_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tg_sh_fr::Matrix{<:Real},\n\tb_sh_fr::Matrix{<:Real};\n\treport::Bool=true\n)\n\nFor branch-reduced IVR models with explicit neutrals, defines how current distributes over series and shunt impedances of a pi-model branch.\n\ncr_fr = csr_fr + g_sh_fr*vr_fr - b_sh_fr*vi_fr\nci_fr = csi_fr + g_sh_fr*vi_fr + b_sh_fr*vr_fr\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_limit-Tuple{AbstractUnbalancedIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_limit","text":"Bounds the current magnitude at both from and to side of a branch cr[f_idx]^2 + ci[f_idx]^2 <= c_rating_a^2 cr[t_idx]^2 + ci[t_idx]^2 <= c_rating_a^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_to-Tuple{AbstractExplicitNeutralIVRModel, Int64, Any, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_to","text":"function constraint_mc_current_to(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tt_bus,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tg_sh_to::Matrix{<:Real},\n\tb_sh_to::Matrix{<:Real};\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, defines how current distributes over series and shunt impedances of a pi-model branch.\n\ncr_to == csr_to + g_sh_to*vr_to - b_sh_to*vi_to\nci_to == csi_to + g_sh_to*vi_to + b_sh_to*vr_to\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_to-Tuple{AbstractUnbalancedIVRModel, Int64, Any, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_to","text":"Defines how current distributes over series and shunt impedances of a pi-model branch\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_to-Tuple{AbstractUnbalancedIVRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_to","text":"constraint_mc_current_to(pm::AbstractUnbalancedIVRModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for current constraints on branches (to-side)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_current_to-Tuple{ReducedExplicitNeutralIVRModels, Int64, Any, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_current_to","text":"function constraint_mc_current_to(\n\tpm::ReducedExplicitNeutralIVRModels,\n\tnw::Int,\n\tt_bus,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tg_sh_to::Matrix{<:Real},\n\tb_sh_to::Matrix{<:Real};\n\treport::Bool=true\n)\n\nFor branch-reduced IVR models with explicit neutrals, defines how current distributes over series and shunt impedances of a pi-model branch.\n\ncr_to = csr_to + g_sh_to*vr_to - b_sh_to*vi_to\nci_to = csi_to + g_sh_to*vi_to + b_sh_to*vr_to\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_active_bounds-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_active_bounds","text":"pmin <= Re(v*cg') <= pmax\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_active_bounds-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_active_bounds","text":"constraint_mc_gen_active_bounds(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for defining limits on active power output of a generator where bounds can't be used.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_power_on_off-Tuple{AbstractUnbalancedActivePowerModel, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_power_on_off","text":"on/off constraint for generators\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_power_on_off-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Vector{<:Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_power_on_off","text":"on/off constraint for generators\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_power_on_off-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_power_on_off","text":"constraint_mc_gen_power_on_off(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for generator power on/off constraints (MLD problems)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_power_setpoint_real-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_power_setpoint_real","text":"pg[i] == pg\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_power_setpoint_real-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_power_setpoint_real","text":"constraint_mc_gen_power_setpoint_real(pm::AbstractUnbalancedPowerModel, nw::Int, i::Int, pg::Vector{<:Real})::Nothing\n\nGeneric generator real power setpoint constraint\n\nP_g == P_g^setpoint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_power_setpoint_real-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_power_setpoint_real","text":"constraint_mc_gen_power_setpoint_real(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for generator active power setpoint constraint, for power flow problems\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_reactive_bounds-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_reactive_bounds","text":"qmin <= Im(v*cg') <= qmax\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_gen_reactive_bounds-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_gen_reactive_bounds","text":"constraint_mc_gen_reactive_bounds(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for defines limits on reactive power output of a generator where bounds can't be used.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_current-Tuple{AbstractExplicitNeutralIVRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_current","text":"function constraint_mc_generator_current(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tid::Int;\n\tnw::Int=nw_id_default,\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor IVR models with explicit neutrals, creates expressions for the terminal current flows :crg_bus and :cig_bus.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_current_delta-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_current_delta","text":"function constraint_mc_generator_current_delta(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tconnections::Vector{Int};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor IVR models with explicit neutrals, creates expressions for the terminal current flows :crg_bus and :cig_bus of delta-connected generators\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_current_wye-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_current_wye","text":"function constraint_mc_generator_current_wye(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tconnections::Vector{Int};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor IVR models with explicit neutrals, creates expressions for the terminal current flows :crg_bus and :cig_bus of wye-connected generators\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power-Tuple{AbstractUnbalancedActivePowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power","text":"Only support wye-connected generators.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power","text":"constraint_mc_generator_power(pm::AbstractUnbalancedPowerModel, id::Int; nw::Int=nw_id_default, report::Bool=true, bounded::Bool=true)::Nothing\n\nTemplate function for generator power constraints\n\nDELTA\n\nWhen connected in delta, the load power gives the reference in the delta reference frame. This means\n\nsd_1 = v_abconj(i_ab) = (v_a-v_b)conj(i_ab)\n\nWe can relate this to the per-phase power by\n\nsn_a = v_aconj(i_a)\n = v_aconj(i_ab-i_ca)\n = v_aconj(conj(s_abv_ab) - conj(s_cav_ca))\n = v_a(s_ab(v_a-v_b) - s_ca(v_c-v_a))\n\nSo for delta, sn is constrained indirectly.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power-Tuple{SDPUBFKCLMXModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power","text":"Link the current and power withdrawn by a generator at the bus through a PSD constraint. The rank-1 constraint is dropped in this formulation.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power","text":"function constraint_mc_generator_power(\n pm::ExplicitNeutralModels,\n id::Int;\n nw::Int=nw_id_default,\n report::Bool=true\n)\n\nConstrains generator power variables for models with explicit neutrals.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"function constraint_mc_generator_power_delta(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\tpmin::Vector{<:Real},\n\tpmax::Vector{<:Real},\n\tqmin::Vector{<:Real},\n\tqmax::Vector{<:Real};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor ACR models with explicit neutrals, links the terminal power flows :pg_bus and :qg_bus to the power variables :pg and :qg for delta-connected generators\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{AbstractNLExplicitNeutralIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"function constraint_mc_generator_power_delta(\n\tpm::AbstractNLExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\tpmin::Vector{<:Real},\n\tpmax::Vector{<:Real},\n\tqmin::Vector{<:Real},\n\tqmax::Vector{<:Real};\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, creates non-linear expressions for the generator power :pd and :qd of delta-connected generators as a function of voltage and current\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"function constraint_mc_generator_power_delta(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\tpmin::Vector{<:Real},\n\tpmax::Vector{<:Real},\n\tqmin::Vector{<:Real},\n\tqmax::Vector{<:Real};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, links the generator power variables :pd and :qd of delta-connected generators to the voltage and current\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{FBSUBFPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"constraint_mc_generator_power_delta(pm::FBSUBFPowerModel, nw::Int, id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)\n\nAdds constraints for delta-connected generators similar to delta-connected loads (zero-order approximation).\n\nbeginalign\ntextInitial line-neutral voltage V_0 = V_r0 +j V_i0\ntextThree-phase delta transformation matrix M^Delta = beginbmatrix1 -1 0 0 1 -1 -1 0 1endbmatrix \ntextSingle-phase delta transformation matrix (triple nodes) M^Delta = beginbmatrix1 -1 endbmatrix \ntextInitial line-line voltage V_0^Delta = M^Delta V_0 \ntextLine-line current (I^Delta)^* = S^Delta oslash V_0^Delta \ntextLine-neutral current I_bus = (M^Delta)^T I^Delta \ntextBus generation power S_bus = V_0 oslash I_bus^*\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{FOTPUPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"constraint_mc_generator_power_delta(pm::FOTPUPowerModel, nw::Int, id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)\n\nAdds constraints for delta-connected generators similar to delta-connected loads (zero-order approximation).\n\nbeginalign\ntextInitial line-neutral voltage V_0 = V_m0 angle V_a0\ntextThree-phase delta transformation matrix M^Delta = beginbmatrix1 -1 0 0 1 -1 -1 0 1endbmatrix \ntextSingle-phase delta transformation matrix (triple nodes) M^Delta = beginbmatrix1 -1 endbmatrix \ntextInitial line-line voltage V_0^Delta = M^Delta V_0 \ntextLine-line current (I^Delta)^* = S^Delta oslash V_0^Delta \ntextLine-neutral current I_bus = (M^Delta)^T I^Delta \ntextLine-neutral generation power S_bus = V_0 oslash I_bus^*\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{FOTRUPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"constraint_mc_generator_power_delta(pm::FOTRUPowerModel, nw::Int, id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)\n\nAdds constraints for delta-connected generators similar to delta-connected loads (zero-order approximation).\n\nbeginalign\ntextInitial line-neutral voltage V_0 = V_r0 +j V_i0\ntextThree-phase delta transformation matrix M^Delta = beginbmatrix1 -1 0 0 1 -1 -1 0 1endbmatrix \ntextSingle-phase delta transformation matrix (triple nodes) M^Delta = beginbmatrix1 -1 endbmatrix \ntextInitial line-line voltage V_0^Delta = M^Delta V_0 \ntextLine-line current (I^Delta)^* = S^Delta oslash V_0^Delta \ntextLine-neutral current I_bus = (M^Delta)^T I^Delta \ntextLine-neutral generation power S_bus = V_0 oslash I_bus^*\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{IVRUPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"delta connected generator setpoint constraint for IVR formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{LPUBFDiagModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"constraint_mc_generator_power_delta(pm::LPUBFDiagModel, nw::Int, gen_id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)\n\nAdds constraints for delta-connected generators similar to delta-connected loads (using auxilary variable X).\n\nbeginalign\ntextThree-phase delta transformation matrix T^Delta = beginbmatrix1 -1 0 0 1 -1 -1 0 1endbmatrix \ntextSingle-phase delta transformation matrix (triple nodes) T^Delta = beginbmatrix1 -1 endbmatrix \ntextLine-neutral generation power S_bus = diag(T^Delta X_g) \ntextLine-line generation power S^Delta = diag(X_g T^Delta)\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_delta-Tuple{SOCUBFModels, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_delta","text":"constraint_mc_generator_power_delta(pm::SOCUBFModels, nw::Int, gen_id::Int, bus_id::Int, connections::Vector{Int}, pmin::Vector{<:Real}, pmax::Vector{<:Real}, qmin::Vector{<:Real}, qmax::Vector{<:Real}; report::Bool=true, bounded::Bool=true)\n\nAdds constraints for delta-connected generators similar to delta-connected loads (using auxilary variable X).\n\nbeginalign\ntextThree-phase delta transformation matrix T^Delta = beginbmatrix1 -1 0 0 1 -1 -1 0 1endbmatrix \ntextSingle-phase delta transformation matrix (triple nodes) T^Delta = beginbmatrix1 -1 endbmatrix \ntextLine-neutral generation power S_bus = diag(T^Delta X_g) \ntextLine-line generation power S^Delta = diag(X_g T^Delta)\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_wye-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_wye","text":"function constraint_mc_generator_power_wye(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\tpmin::Vector{<:Real},\n\tpmax::Vector{<:Real},\n\tqmin::Vector{<:Real},\n\tqmax::Vector{<:Real};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor ACR models with explicit neutrals, links the terminal power flows :pg_bus and :qg_bus to the power variables :pg and :qg for wye-connected generators\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_wye-Tuple{AbstractNLExplicitNeutralIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_wye","text":"function constraint_mc_generator_power_wye(\n\tpm::AbstractNLExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\tpmin::Vector{<:Real},\n\tpmax::Vector{<:Real},\n\tqmin::Vector{<:Real},\n\tqmax::Vector{<:Real};\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, creates non-linear expressions for the generator power :pd and :qd of wye-connected generators as a function of voltage and current\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_wye-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_wye","text":"function constraint_mc_generator_power_wye(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\tpmin::Vector{<:Real},\n\tpmax::Vector{<:Real},\n\tqmin::Vector{<:Real},\n\tqmax::Vector{<:Real};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, links the generator power variables :pd and :qd of wye-connected generators to the voltage and current\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_wye-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_wye","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_generator_power_wye-Tuple{IVRUPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_generator_power_wye","text":"wye connected generator setpoint constraint for IVR formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_current-Tuple{AbstractExplicitNeutralIVRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_current","text":"function constraint_mc_load_current(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tid::Int;\n\tnw::Int=nw_id_default,\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, create non-linear expressions for the terminal current flows :crd_bus and :cid_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_current-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_current","text":"function constraint_mc_load_current(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tid::Int;\n\tnw::Int=nw_id_default,\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, create expressions for the terminal current flows :crd_bus and :cid_bus\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_current_delta-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_current_delta","text":"function constraint_mc_load_current_delta(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\ta::Vector{<:Real},\n\talpha::Vector{<:Real},\n\tb::Vector{<:Real},\n\tbeta::Vector{<:Real};\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, create non-linear expressions for the terminal current flows :crd_bus and :cid_bus of delta-connected loads\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_current_delta-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Int64, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_current_delta","text":"function constraint_mc_load_current_delta(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tconnections::Vector{Int};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, create expressions for the terminal current flows :crd_bus and :cid_bus for delta-connected loads\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_current_delta-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Vector, Vector}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_current_delta","text":"We want to express sab = cp.|vab|+im.cq.|vab| iab = conj(sab/vab) = |vab|.(cq-im.cq)/conj(vab) = (1/|vab|).(cp-im.cq)*vab idem for ibc and ica And then sa = va.conj(ia) = va.conj(iab-ica) idem for sb and sc\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_current_delta-Tuple{FOTPUPowerModel, Int64, Int64, Int64, Vector, Vector}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_current_delta","text":"constraint_mc_load_current_delta(pm::FOTPUPowerModel, nw::Int, load_id::Int, load_bus_id::Int, cp::Vector, cq::Vector)\n\nNo loads require a current variable. Delta loads are zero-order approximations and wye loads are first-order approximations around the initial operating point.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_current_wye-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_current_wye","text":"function constraint_mc_load_current_wye(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\ta::Vector{<:Real},\n\talpha::Vector{<:Real},\n\tb::Vector{<:Real},\n\tbeta::Vector{<:Real};\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, create non-linear expressions for the terminal current flows :crd_bus and :cid_bus of wye-connected loads\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_current_wye-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Int64, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_current_wye","text":"function constraint_mc_load_current_wye(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tconnections::Vector{Int};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, create expressions for the terminal current flows :crd_bus and :cid_bus for wye-connected loads\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{AbstractExplicitNeutralIVRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"function constraint_mc_load_power(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tid::Int;\n\tnw::Int=nw_id_default,\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, the load power does not require any constraints.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"function constraint_mc_load_power(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tid::Int;\n\tnw::Int=nw_id_default,\n\treport::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, link the load power variables :pd and :qd to the voltage, and link together the power, voltage and current variables\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{AbstractUBFModels, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"Creates the constraints modelling the (relaxed) voltage-dependent loads.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{AbstractUnbalancedActivePowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"Only support wye-connected, constant-power loads.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"constraint_mc_load_power(pm::AbstractUnbalancedPowerModel, id::Int; nw::Int=nw_id_default, report::Bool=true)::Nothing\n\nTemplate function for load constraints.\n\nCONSTANT POWER\n\nFixes the load power sd.\n\nsd = sd_1 sd_2 sd_3\n\nWhat is actually fixed, depends on whether the load is connected in delta or wye. When connected in wye, the load power equals the per-phase power sn drawn at the bus to which the load is connected.\n\nsd_1 = v_aconj(i_a) = sn_a\n\nCONSTANT CURRENT\n\nSets the active and reactive load power sd to be proportional to the the voltage magnitude.\n\npd = cpvm\nqd = cqvm\nsd = cpvm + jcqvm\n\nCONSTANT IMPEDANCE\n\nSets the active and reactive power drawn by the load to be proportional to the square of the voltage magnitude.\n\npd = cpvm^2\nqd = cqvm^2\nsd = cpvm^2 + jcqvm^2\n\nDELTA\n\nWhen connected in delta, the load power gives the reference in the delta reference frame. This means\n\nsd_1 = v_abconj(i_ab) = (v_a-v_b)conj(i_ab)\n\nWe can relate this to the per-phase power by\n\nsn_a = v_aconj(i_a)\n = v_aconj(i_ab-i_ca)\n = v_aconj(conj(s_abv_ab) - conj(s_cav_ca))\n = v_a(s_ab(v_a-v_b) - s_ca(v_c-v_a))\n\nSo for delta, sn is constrained indirectly.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{FBSUBFPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"constraint_mc_load_power(pm::FBSUBFPowerModel, load_id::Int; nw::Int=nw_id_default, report::Bool=true)\n\nLoad model is linearized around initial operating point. Wye loads are first-order and delta loads are zero-order approximations.\n\nbeginalign\ntextInitial operating point v_rd^0 + j v_id^0textwhere(v_m^0)^2 = (v_rd^0)^2 + (v_id^0)^2\ntextConstant power P^d = P^d0Q^d = Q^d0 \ntextConstant impedance P^d = a left(2cdot v_rd v_rd^0+2 v_id*v_id^0-(v_m^0)^2right)\n Q^d = b left(2cdot v_rd v_rd^0+2 v_id*v_id^0-(v_m^0)^2right) \ntextConstant current P^d = a left(v_m^0 + fracv_rd v_rd^0+ v_id*v_id^0-(v_m^0)^2v_m^0 right)\n Q^d = b left(v_m^0 + fracv_rd v_rd^0+ v_id*v_id^0-(v_m^0)^2v_m^0 right)\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{FOTPUPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"constraint_mc_load_power(pm::FOTPUPowerModel, load_id::Int; nw::Int=nw_id_default, report::Bool=true)\n\nLoad model is linearized around initial operating point. Wye loads are first-order and delta loads are zero-order approximations.\n\nbeginalign\ntextInitial operating point v_m0 angle v_a0\ntextConstant power P^d = P^d0Q^d = Q^d0 \ntextConstant impedance P^d = a cdot left(v_m0^2+2 cdot v_m0 cdot (v_m-v_m0)right)\n Q^d = b cdot left(v_m0^2+2 cdot v_m0 cdot (v_m-v_m0)right) \ntextConstant current P^d = a cdot v_m\n Q^d = b cdot v_m\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{FOTRUPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"constraint_mc_load_power(pm::FOTRUPowerModel, load_id::Int; nw::Int=nw_id_default, report::Bool=true)\n\nLoad model is linearized around initial operating point similar to FBSUBFPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{LPUBFDiagModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"constraint_mc_load_power(pm::LPUBFDiagModel, load_id::Int; nw::Int=nw_id_default, report::Bool=true)\n\nDelta/voltage-dependent load models for LPUBFDiagModel. Delta loads use the auxilary power variable (X). The constant current load model is derived by linearizing around the flat-start voltage solution.\n\nbeginalign\ntextConstant power Rightarrow P_i^d = P_i^d0Q_i^d = Q_i^d0 forall i in L \ntextConstant impedance (Wye) Rightarrow P_i^d = a_i cdot w_iQ_i^d = b_i cdot w_i forall i in L \ntextConstant impedance (Delta) Rightarrow P_i^d = 3cdot a_i cdot w_iQ_i^d = 3cdot b_i cdot w_i forall i in L \ntextConstant current (Wye) Rightarrow P_i^d = fraca_i2cdot left( 1+w_i right)Q_i^d = fracb_i2cdot left( 1+w_i right) forall i in L \ntextConstant current (Delta) Rightarrow P_i^d = fracsqrt3 cdot a_i2cdot left( 1+w_i right)Q_i^d = fracsqrt3 cdot b_i2cdot left( 1+w_i right) forall i in L\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{SDPUBFKCLMXModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"Creates the constraints modelling the (relaxed) voltage-dependent loads for the matrix KCL formulation.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power","text":"function constraint_mc_load_power(\n\tpm::ExplicitNeutralModels,\n\tid::Int;\n\tnw::Int=nw_id_default,\n\treport::Bool=true\n)\n\nConstrains load power variables for models with explicit neutrals.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_delta-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_delta","text":"function constraint_mc_load_power_delta(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\ta::Vector{<:Real},\n\talpha::Vector{<:Real},\n\tb::Vector{<:Real},\n\tbeta::Vector{<:Real};\n\treport::Bool=true\n)\n\nFor ACR models with explicit neutrals, creates non-linear expressions for terminal power flows ':pdbus' and ':qdbus' of delta-connected loads\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_delta-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Int64, Int64, Vector{Int64}, LoadModel, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_delta","text":"function constraint_mc_load_power_delta(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\tmodel::LoadModel,\n\ta::Vector{<:Real},\n\tb::Vector{<:Real};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, link the load power variables :pd and :qd to the voltage, and link together the power, voltage and current variables for delta-connected loads\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_delta-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_delta","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_delta-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_delta","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_delta-Tuple{IVRUPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_delta","text":"delta connected load setpoint constraint for IVR formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_wye-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_wye","text":"function constraint_mc_load_power_wye(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\ta::Vector{<:Real},\n\talpha::Vector{<:Real},\n\tb::Vector{<:Real},\n\tbeta::Vector{<:Real};\n\treport::Bool=true\n)\n\nFor ACR models with explicit neutrals, creates non-linear expressions for terminal power flows ':pdbus' and ':qdbus' of wye-connected loads\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_wye-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Int64, Int64, Vector{Int64}, LoadModel, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_wye","text":"function constraint_mc_load_power_wye(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tbus_id::Int,\n\tconnections::Vector{Int},\n\tmodel::LoadModel,\n\ta::Vector{<:Real},\n\tb::Vector{<:Real};\n\treport::Bool=true,\n\tbounded::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, link the load power variables :pd and :qd to the voltage, and link together the power, voltage and current variables for wye-connected loads\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_wye-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_wye","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_wye-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_wye","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_load_power_wye-Tuple{IVRUPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_load_power_wye","text":"wye connected load setpoint constraint for IVR formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_current-Tuple{AbstractLPUBFModel, Int64, Vararg{Any, 5}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_current","text":"Defines relationship between branch (series) power flow, branch (series) current and node voltage magnitude\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_current-Tuple{AbstractUBFModels}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_current","text":"constraint_mc_model_current(pm::AbstractUBFModels; nw::Int=nw_id_default)::Nothing\n\nTemplate function for constraints for model current\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_current-Tuple{SDPUBFModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_current","text":"Defines relationship between branch (series) power flow, branch (series) current and node voltage magnitude\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_current-Tuple{SOCConicUBFModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_current","text":"Defines relationship between branch (series) power flow, branch (series) current and node voltage magnitude\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_current-Tuple{SOCUBFModels, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_current","text":"Defines relationship between branch (series) power flow, branch (series) current and node voltage magnitude\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_voltage-Tuple{AbstractUnbalancedDCPModel, Int64, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_voltage","text":"nothing to do, these models do not have complex voltage constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_voltage-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_voltage","text":"do nothing by default\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_voltage-Tuple{AbstractUnbalancedPowerModel}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_voltage","text":"constraint_mc_model_voltage(pm::AbstractUnbalancedPowerModel; nw::Int=nw_id_default)::Nothing\n\nTemplate function for model voltage constraints.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_voltage_magnitude_difference-Tuple{AbstractUBFModels, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_voltage_magnitude_difference","text":"Defines voltage drop over a branch, linking from and to side voltage\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_voltage_magnitude_difference-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_voltage_magnitude_difference","text":"constraint_mc_model_voltage_magnitude_difference(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for constraints for modeling voltage magnitude difference across branches\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_voltage_magnitude_difference-Tuple{FBSUBFPowerModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_voltage_magnitude_difference","text":"constraint_mc_model_voltage_magnitude_difference(pm::FBSUBFPowerModel, nw::Int, i::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, r::Matrix{<:Real}, x::Matrix{<:Real}, g_sh_fr::Matrix{<:Real}, b_sh_fr::Matrix{<:Real})\n\nVoltage drop over a branch linearized around initial operating point (forward sweep)\n\nbeginalign\ntextInitial operating points (v_r0^fr + j v_i0^fr) (v_r0^to + j v_i0^to)\ntextSeries active power flow p_s^fr = p^fr - g_sh^fr (v_m0^fr)^2\ntextSeries reactive power flow q_s^fr = q^fr + b_sh^fr (v_m0^fr)^2\ntextSeries real current flow cr_s^fr = frac(p_s^fr v_r0^fr + q_s^fr v_i0^fr)(v_m0^fr)^2\ntextSeries imaginary current flow ci_s^fr = frac(-q_s^fr v_r0^fr + p_s^fr v_i0^fr)(v_m0^fr)^2\ntextSeries real voltage drop v_r^to = v_r^fr - r cr_s^fr + x ci_s^fr \ntextSeries imaginary voltage drop v_i^to = v_i^fr - x cr_s^fr - r ci_s^fr\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_model_voltage_magnitude_difference-Tuple{LPUBFDiagModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_model_voltage_magnitude_difference","text":"Defines voltage drop over a branch, linking from and to side voltage\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_network_power_balance-Tuple{AbstractUnbalancedAPLossLessModels, Int64, Vararg{Any, 8}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_network_power_balance","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_network_power_balance-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_network_power_balance","text":"constraint_mc_network_power_balance(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for constraints that ensures that power generation and demand are balanced in OBF problem\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_from-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_from","text":"function constraint_mc_ohms_yt_from(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tG::Matrix{<:Real},\n\tB::Matrix{<:Real},\n\tG_fr::Matrix{<:Real},\n\tB_fr::Matrix{<:Real}\n)\n\nFor ACR models with explicit neutrals, creates Ohms constraints for ACR models with explicit neutrals.\n\ns_fr = v_fr.*conj(Y*(v_fr-v_to))\ns_fr = (vr_fr+im*vi_fr).*(G-im*B)*([vr_fr-vr_to]-im*[vi_fr-vi_to])\ns_fr = (vr_fr+im*vi_fr).*([G*vr_fr-G*vr_to-B*vi_fr+B*vi_to]-im*[G*vi_fr-G*vi_to+B*vr_fr-B*vr_to])\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_from-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_from","text":"Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)\n\np_fr == g[c,c] * vm_fr[c]^2 +\n sum( g[c,d]*vm_fr[c]*vm_fr[d]*cos(va_fr[c]-va_fr[d]) +\n b[c,d]*vm_fr[c]*vm_fr[d]*sin(va_fr[c]-va_fr[d]) for d in conductor_ids(pm) if d != c) +\n sum(-g[c,d]*vm_fr[c]*vm_to[d]*cos(va_fr[c]-va_to[d]) +\n -b[c,d]*vm_fr[c]*vm_to[d]*sin(va_fr[c]-va_to[d]) for d in conductor_ids(pm))\n + g_fr[c,c] * vm_fr[c]^2 +\n sum( g_fr[c,d]*vm_fr[c]*vm_fr[d]*cos(va_fr[c]-va_fr[d]) +\n b_fr[c,d]*vm_fr[c]*vm_fr[d]*sin(va_fr[c]-va_fr[d]) for d in conductor_ids(pm) if d != c)\n )\nq_fr == -b[c,c] *vm_fr[c]^2 -\n sum( b[c,d]*vm_fr[c]*vm_fr[d]*cos(va_fr[c]-va_fr[d]) -\n g[c,d]*vm_fr[c]*vm_fr[d]*sin(va_fr[c]-va_fr[d]) for d in conductor_ids(pm) if d != c) -\n sum(-b[c,d]*vm_fr[c]*vm_to[d]*cos(va_fr[c]-va_to[d]) +\n g[c,d]*vm_fr[c]*vm_to[d]*sin(va_fr[c]-va_to[d]) for d in conductor_ids(pm))\n -b_fr[c,c] *vm_fr[c]^2 -\n sum( b_fr[c,d]*vm_fr[c]*vm_fr[d]*cos(va_fr[c]-va_fr[d]) -\n g_fr[c,d]*vm_fr[c]*vm_fr[d]*sin(va_fr[c]-va_fr[d]) for d in conductor_ids(pm) if d != c)\n )\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_from-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_from","text":"Creates Ohms constraints\n\nsfr = vfr.conj(Y(vfr-vto)) sfr = (vrfr+imvi_fr).(G-imB)([vrfr-vrto]-im[vifr-vito]) sfr = (vrfr+imvifr).([Gvrfr-Gvr_to-Bvifr+B*vito]-im[Gvifr-G*vito+Bvr_fr-Bvr_to])\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_from-Tuple{AbstractUnbalancedDCPModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_from","text":"Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)\n\np[f_idx] == -b*(t[f_bus] - t[t_bus])\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_from-Tuple{AbstractUnbalancedNFAModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_from","text":"nothing to do, no voltage angle variables\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_from-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_from","text":"constraint_mc_ohms_yt_from(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)\n\nTemplate function for ohms constraint for branches on the from-side\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_from-Tuple{FOTPUPowerModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_from","text":"constraint_mc_ohms_yt_from(pm::FOTPUPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, G::Matrix{<:Real}, B::Matrix{<:Real}, G_fr::Matrix{<:Real}, B_fr::Matrix{<:Real})\n\nOhm constraints similar to ACPUPowerModel. The nonlinear functions are approximated around initial operating points.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_from-Tuple{FOTRUPowerModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_from","text":"constraint_mc_ohms_yt_from(pm::FOTRUPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, G::Matrix{<:Real}, B::Matrix{<:Real}, G_fr::Matrix{<:Real}, B_fr::Matrix{<:Real})\n\nCreates Ohms constraints by linearizing (similar to power balance constraints) around initial operating point.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vararg{Matrix, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"function constraint_mc_ohms_yt_to(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tG::Matrix,\n\tB::Matrix,\n\tG_to::Matrix,\n\tB_to::Matrix\n)\n\nFor ACR models with explicit neutrals, creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form).\n\np[t_idx] == (g+g_to)*v[t_bus]^2 + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[t_bus]-t[f_bus])) + (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))\nq[t_idx] == -(b+b_to)*v[t_bus]^2 - (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[f_bus]-t[t_bus])) + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)\n\np[t_idx] == (g+g_to)*v[t_bus]^2 + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[t_bus]-t[f_bus])) + (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))\nq[t_idx] == -(b+b_to)*v[t_bus]^2 - (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[f_bus]-t[t_bus])) + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vararg{Matrix, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)\n\np[t_idx] == (g+g_to)*v[t_bus]^2 + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[t_bus]-t[f_bus])) + (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))\nq[t_idx] == -(b+b_to)*v[t_bus]^2 - (-b*tr+g*ti)/tm*(v[t_bus]*v[f_bus]*cos(t[f_bus]-t[t_bus])) + (-g*tr-b*ti)/tm*(v[t_bus]*v[f_bus]*sin(t[t_bus]-t[f_bus]))\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{AbstractUnbalancedAPLossLessModels, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"Do nothing, this model is symmetric\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"constraint_mc_ohms_yt_to(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)\n\nTemplate function for ohms constraint for branches on the to-side\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{AbstractUnbalancedWModels, Int64, Int64, Vararg{Any, 11}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"Creates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{FOTPUPowerModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"constraint_mc_ohms_yt_to(pm::FOTPUPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, G::Matrix{<:Real}, B::Matrix{<:Real}, G_to::Matrix{<:Real}, B_to::Matrix{<:Real})\n\nOhm constraints similar to ACPUPowerModel. The nonlinear functions are approximated around initial operating points.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{FOTRUPowerModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vararg{Matrix, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"constraint_mc_ohms_yt_to(pm::FOTRUPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, G::Matrix, B::Matrix, G_to::Matrix, B_to::Matrix)\n\nCreates Ohms constraints (yt post fix indicates that Y and T values are in rectangular form)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_ohms_yt_to-Tuple{NFAUPowerModel, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_ohms_yt_to","text":"nothing to do, this model is symmetric\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_oltc_tap_fix-Tuple{AbstractUnbalancedPowerModel, Int64, Vector, Vector}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_oltc_tap_fix","text":"For a variable tap transformer, fix the tap variables which are fixed. For example, an OLTC where the third phase is fixed, will have tap variables for all phases, but the third tap variable should be fixed.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{AbstractUnbalancedActivePowerModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"constraint_mc_power_balance(pm::AbstractUnbalancedActivePowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\npower balanace constraint with line shunts and transformers, active power only\n\np_br + p_tr + p_sw == p_g - p_s - p_d - G\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"constraint_mc_power_balance(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for KCL constraints.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{AbstractUnbalancedWModels, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{FBSUBFPowerModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"constraint_mc_power_balance(pm::FBSUBFPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance constraints similar to ACRUPowerModel with shunt current calculated using initial operating point.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{FOTPUPowerModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"constraint_mc_power_balance(pm::FOTPUPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance equations similar to ACPUPowerModel. The nonlinear functions are approximated around initial operating point.\n\nbeginalign\ntextInitial operating points v_m0^t angle v_a0^tv_m0^u angle v_a0^u\n v_m^t^2 Rightarrow v_m0^t^2+2 cdot v_m0^t cdot (v_m^t-v_m0^t)\n v_m^t cdot v_m^u cdot cos(v_a^t-v_a^u) Rightarrow v_m0^t cdot v_m0^u cdot cos(v_a0^t-v_a0^u) +\nbeginbmatrix\nv_m0^u cdot cos(v_a0^t-v_a0^u) \nv_m0^t cdot cos(v_a0^t-v_a0^u) \n-v_m0^t cdot v_m0^u cdot sin(v_a0^t-v_a0^u) \nv_m0^t cdot v_m0^u cdot sin(v_a0^t-v_a0^u)\nendbmatrix^top\nbeginbmatrix\nv_m^t-v_m0^t \nv_m^u-v_m0^u \nv_a^t-v_a0^t \nv_a^u-v_a0^u\nendbmatrix \n v_m^t cdot v_m^u cdot sin(v_a^t-v_a^u) Rightarrow v_m0^t cdot v_m0^u cdot sin(v_a0^t-v_a0^u) +\nbeginbmatrix\nv_m0^u cdot sin(v_a0^t-v_a0^u) \nv_m0^t cdot sin(v_a0^t-v_a0^u) \nv_m0^t cdot v_m0^u cdot cos(v_a0^t-v_a0^u) \n-v_m0^t cdot v_m0^u cdot cos(v_a0^t-v_a0^u)\nendbmatrix^top\nbeginbmatrix\nv_m^t-v_m0^t \nv_m^u-v_m0^u \nv_a^t-v_a0^t \nv_a^u-v_a0^u\nendbmatrix\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{FOTRUPowerModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"constraint_mc_power_balance(pm::FOTRUPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance constraints similar to ACRUPowerModel with shunt current linearized around initial operating point.\n\nbeginalign\ntextInitial operating point (v_r0 + j v_i0)\n v_r v_i = v_r0 v_i0 + v_r v_i0 + v_r0 v_i - 2 v_r0 v_i0\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{LPUBFDiagModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{SDPUBFKCLMXModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"Shunt handling in matrix form: I = Y.U S = U.I' = U.(Y.U)' = U.U'.Y' = W.Y' = (Wr+j.Wi)(G+jB)' = (Wr+j.Wi)(G'-j.B') = (Wr.G'+Wi.B')+j(-Wr.B'+Wi.G') P = Wr.G'+Wi.B' Q = -Wr.B'+Wi.G'\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance","text":"function constraint_mc_power_balance(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ti::Int,\n\tterminals::Vector{Int},\n\tgrounded::Vector{Bool},\n\tbus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},\n\tbus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},\n\tbus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}},\n\tbus_gens::Vector{Tuple{Int,Vector{Int}}},\n\tbus_storage::Vector{Tuple{Int,Vector{Int}}},\n\tbus_loads::Vector{Tuple{Int,Vector{Int}}},\n\tbus_shunts::Vector{Tuple{Int,Vector{Int}}}\n)\n\nImposes power balance constraints at each ungrounded terminal of bus i for rectangular voltage models with explicit neutrals. sum(p + im*q) = 0\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_capc-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_capc","text":"constraint_mc_power_balance_capc(pm::AbstractUnbalancedACPModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance constraints with capacitor control.\n\nbeginalign\n Bs = z bs \n textcapacitor ON z = 1 \n textcapacitor OFF z = 0\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_capc-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_capc","text":"constraint_mc_power_balance_capc(pm::AbstractUnbalancedACRModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance constraints with capacitor control.\n\nbeginalign\n Bt = z bs \n textcapacitor ON z = 1 \n textcapacitor OFF z = 0\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_capc-Tuple{AbstractUnbalancedActivePowerModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_capc","text":"nothing to do in capc, no complex voltage variables in these models\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_capc-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_capc","text":"constraint_mc_power_balance_capc(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)\n\nTemplate function for KCL constraints with capacitor control variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_capc-Tuple{FBSUBFPowerModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_capc","text":"constraint_mc_power_balance_capc(pm::FBSUBFPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance constraints with capacitor control similar to ACRUPowerModel with shunt current calculated using initial operating point.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_capc-Tuple{FOTPUPowerModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_capc","text":"constraint_mc_power_balance_capc(pm::FOTPUPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance constraints with capacitor control with shunt current calculated using initial operating point.\n\nbeginalign\n B_s = b_s z cq_sh = B_s v \n B_s cdot v_m^t cdot v_m^u cdot cos(v_a^t-v_a^u) Rightarrow B_s0 cdot v_m0^t cdot v_m0^u cdot cos(v_a0^t-v_a0^u) +\nbeginbmatrix\nB_s0 cdot v_m0^u cdot cos(v_a0^t-v_a0^u) \nB_s0 cdot v_m0^t cdot cos(v_a0^t-v_a0^u) \n-B_s0 cdot v_m0^t cdot v_m0^u cdot sin(v_a0^t-v_a0^u) \nB_s0 cdot v_m0^t cdot v_m0^u cdot sin(v_a0^t-v_a0^u) \nv_m0^t cdot v_m0^u cdot cos(v_a0^t-v_a0^u)\nendbmatrix^top\nbeginbmatrix\nv_m^t-v_m0^t \nv_m^u-v_m0^u \nv_a^t-v_a0^t \nv_a^u-v_a0^u \nB_s -B_s0\nendbmatrix \n B_s cdot v_m^t cdot v_m^u cdot sin(v_a^t-v_a^u) Rightarrow B_s0 cdot v_m0^t cdot v_m0^u cdot sin(v_a0^t-v_a0^u) +\nbeginbmatrix\n B_s0 cdot v_m0^u cdot sin(v_a0^t-v_a0^u) \n B_s0 cdot v_m0^t cdot sin(v_a0^t-v_a0^u) \n B_s0 cdot v_m0^t cdot v_m0^u cdot cos(v_a0^t-v_a0^u) \n -B_s0 cdot v_m0^t cdot v_m0^u cdot cos(v_a0^t-v_a0^u) \n v_m0^t cdot v_m0^u cdot sin(v_a0^t-v_a0^u)\nendbmatrix^top\nbeginbmatrix\nv_m^t-v_m0^t \nv_m^u-v_m0^u \nv_a^t-v_a0^t \nv_a^u-v_a0^u \nB_s -B_s0\nendbmatrix\n\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_capc-Tuple{FOTRUPowerModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_capc","text":"constraint_mc_power_balance_capc(pm::FOTRUPowerModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance constraints with capacitor control with shunt current calculated using initial operating point.\n\nbeginalign\n B_t = b_s z cq_sh = B_t v \n textFOT approximation B_t v_r v_i = B_t0 v_r0 v_i0 + B_t v_r0 v_i0 + B_t0 v_r v_i0 + B_t0 v_r0 v_i - 3 B_t0 v_r0 v_i0\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_capc-Tuple{LPUBFDiagModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_capc","text":"constraint_mc_power_balance_capc(pm::LPUBFDiagModel, nw::Int, i::Int, terminals::Vector{Int}, grounded::Vector{Bool}, bus_arcs::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_sw::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_arcs_trans::Vector{Tuple{Tuple{Int,Int,Int},Vector{Int}}}, bus_gens::Vector{Tuple{Int,Vector{Int}}}, bus_storage::Vector{Tuple{Int,Vector{Int}}}, bus_loads::Vector{Tuple{Int,Vector{Int}}}, bus_shunts::Vector{Tuple{Int,Vector{Int}}})\n\nPower balance constraints with capacitor control linearized using McCormick envelopes\n\nbeginalign\n B_s = b_s z cq_sh = B_s w \n textUnderestimator cq_sh B_s w_textmin cq_sh b_s w + B_s w_textmax - b_s w_textmax\n textOverestimator cq_sh B_s w_textmax cq_sh b_s w + B_s w_textmin - b_s w_textmin\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_shed-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_shed","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_shed-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_shed","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_shed-Tuple{AbstractUnbalancedDCPModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_shed","text":"power balance constraint with line shunts and transformers for load shed problem, DCP formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_shed-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_shed","text":"constraint_mc_power_balance_shed(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for KCL constraints for load shed problem\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_shed-Tuple{AbstractUnbalancedWModels, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_shed","text":"KCL for load shed problem with transformers (AbstractWForms)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_shed_simple-Tuple{AbstractUnbalancedDCPModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_shed_simple","text":"power balance constraint with line shunts and transformers for load shed problem, DCP formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_simple-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_simple","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_simple-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_simple","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_simple-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_simple","text":"constraint_mc_power_balance_simple(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for KCL constraints for simple load shedding\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_slack-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_slack","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_slack-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vector{Tuple{Tuple{Int64, Int64, Int64}, Vector{Int64}}}, Vararg{Vector{Tuple{Int64, Vector{Int64}}}, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_slack","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_slack-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_slack","text":"constraint_mc_power_balance_slack(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for KCL constraints which include a slack power at every bus\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_balance_slack-Tuple{AbstractUnbalancedWModels, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{<:Tuple{Tuple{Int64, Int64, Int64}, Vector{Union{Int64, String}}}}, Vector{<:Tuple{Tuple{Int64, Int64, Int64}, Vector{Union{Int64, String}}}}, Vector{<:Tuple{Tuple{Int64, Int64, Int64}, Vector{Union{Int64, String}}}}, Vector{<:Tuple{Int64, Vector{Union{Int64, String}}}}, Vector{<:Tuple{Int64, Vector{Union{Int64, String}}}}, Vector{<:Tuple{Int64, Vector{Union{Int64, String}}}}, Vector{<:Tuple{Int64, Vector{Union{Int64, String}}}}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_balance_slack","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_losses-Tuple{AbstractUBFModels, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_losses","text":"Defines branch flow model power flow equations\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_losses-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_losses","text":"constraint_mc_power_losses(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for constraints for modeling power losses across branches\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_losses-Tuple{FBSUBFPowerModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_losses","text":"constraint_mc_power_losses(pm::FBSUBFPowerModel, nw::Int, i::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, r::Matrix{<:Real}, x::Matrix{<:Real}, g_sh_fr::Matrix{<:Real}, g_sh_to::Matrix{<:Real}, b_sh_fr::Matrix{<:Real}, b_sh_to::Matrix{<:Real})\n\nBranch flow model power flow equation linearized around initial operating point (backward sweep)\n\nbeginalign\ntextInitial operating points (v_r0^fr + j v_i0^fr) (v_r0^to + j v_i0^to)\ntextVoltage drop v_drop = (v_r0^fr + j v_i0^fr) - (v_r0^to + j v_i0^to)\ntextLine series admittance y = (r+j x)^-1\ntextPower loss s_loss = v_drop (y v_drop)^*\ntextActive power flow p^fr + p^to = g_sh^fr (v_m0^fr)^2 + g_sh^to (v_m0^to)^2 + Re(s_loss)\ntextReactive power flow q^fr + q^to = -b_sh^fr (v_m0^fr)^2 - b_sh^to (v_m0^to)^2 + Im(s_loss)\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_power_losses-Tuple{LPUBFDiagModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}, Matrix{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_power_losses","text":"Defines branch flow model power flow equations\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_regen_setpoint_active-Tuple{AbstractUnbalancedIVRModel, Int64, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_regen_setpoint_active","text":"qq[i] == qq\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_current_limit-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_current_limit","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_current_limit-Tuple{AbstractUnbalancedActivePowerModel, Int64, Int64, Int64, Vector{Int64}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_current_limit","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_current_limit-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_current_limit","text":"constraint_mc_storage_current_limit(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for storage current limit constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUBFAModel, Int64, Int64, Int64, Vector{Int64}, Vararg{Real, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"Neglects the active and reactive loss terms associated with the squared current magnitude.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUBFModels, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"Neglects the active and reactive loss terms associated with the squared current magnitude.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Vector{Int64}, Vararg{Real, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Vector{Int64}, Vararg{Real, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUnbalancedACRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUnbalancedAPLossLessModels, Int64, Int64, Int64, Vector{Int64}, Vararg{Real, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"active power only, lossless model\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUnbalancedAPLossLessModels, Int64, Vararg{Any, 6}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUnbalancedActivePowerModel, Int64, Int64, Int64, Vector{Int64}, Vararg{Real, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"active power only\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"constraint_mc_storage_losses(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for storage loss constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_losses-Tuple{AbstractUnbalancedWConvexModels, Int64, Int64, Int64, Vector{Int64}, Vararg{Real, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_losses","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_on_off-Tuple{AbstractUnbalancedActivePowerModel, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_on_off-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Vector{Int64}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Vector{<:Real}, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_on_off-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_on_off","text":"constraint_mc_storage_on_off(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTempate function for storage on/off constraints for MLD problems\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_power_setpoint_real-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_power_setpoint_real","text":"constraint_mc_storage_power_setpoint_real(pm::AbstractUnbalancedPowerModel, nw::Int, i::Int, ps::Real)::Nothing\n\nGeneric storage real power setpoint constraint\n\nP_s == P_s^setpoint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_power_setpoint_real-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_power_setpoint_real","text":"constraint_mc_storage_power_setpoint_real(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for storage active power setpoint constraint, for power flow problems\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_thermal_limit-Tuple{AbstractUnbalancedActivePowerModel, Int64, Int64, Vector{Int64}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_thermal_limit","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_thermal_limit-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Vector{Int64}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_thermal_limit","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_thermal_limit-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_thermal_limit","text":"constraint_mc_storage_thermal_limit(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for storage thermal limit constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_storage_thermal_limit-Tuple{LPUBFDiagModel, Int64, Int64, Vector{Int64}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_storage_thermal_limit","text":"constraintmcstoragethermallimit(pm::AbstractUnbalancedPowerModel, nw::Int, i::Int, connections::Vector{Int}, rating::Real)\n\nLinear version of storage thermal limit constraint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_ampacity-Tuple{AbstractUnbalancedACPModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_ampacity","text":"constraint_mc_switch_ampacity(pm::AbstractUnbalancedACPModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on switches\n\nmathp_{fr}^2 + q_{fr}^2 \\leq vm_{fr}^2 i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_ampacity-Tuple{AbstractUnbalancedActivePowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Float64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_ampacity","text":"nothing to do, no voltage variables\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_ampacity-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_ampacity","text":"constraint_mc_switch_ampacity(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for switch current limit constraint from-side\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_ampacity-Tuple{AbstractUnbalancedRectangularModels, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_ampacity","text":"constraint_mc_switch_ampacity(pm::AbstractUnbalancedRectangularModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on switches\n\nmathp_{fr}^2 + q_{fr}^2 \\leq (vr_{fr}^2 + vi_{fr}^2) i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_ampacity-Tuple{AbstractUnbalancedWModels, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_ampacity","text":"constraint_mc_switch_ampacity(pm::AbstractUnbalancedWModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})::Nothing\n\nACP current limit constraint on switches from-side\n\nmathp_{fr}^2 + q_{fr}^2 \\leq w_{fr} i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_ampacity-Tuple{LPUBFDiagModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_ampacity","text":"constraint_mc_switch_ampacity(pm::AbstractUnbalancedWModels, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, c_rating::Vector{<:Real})\n\nACP current limit constraint on switches from-side\n\nmathp_{fr}^2 + q_{fr}^2 \\leq w_{fr} i_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_current-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_current","text":"function constraint_mc_switch_current(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int};\n\treport::Bool=true\n)\n\nFor IVR models with explicit neutrals, create expressions for the terminal current flows :crsw_bus and cisw_bus, and link the from-side to the to-side switch current\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_current-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_current","text":"function constraint_mc_switch_current(\n pm::ExplicitNeutralModels,\n id::Int;\n nw::Int=nw_id_default,\n report::Bool=true\n)\n\nFor models with explicit neutrals, link the switch currents or create appropiate expressions for them.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_current_limit-Tuple{AbstractExplicitNeutralACRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_current_limit","text":"function constraint_mc_switch_current_limit(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\trating::Vector{<:Real}\n)\n\nFor ACR models with explicit neutrals, imposes a bound on the switch current magnitude per conductor. Note that a bound on the from-side implies the same bound on the to-side current, so it suffices to apply this only explicitly at the from-side.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_current_limit-Tuple{AbstractExplicitNeutralIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_current_limit","text":"function constraint_mc_switch_current_limit(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tconnections::Vector{Int},\n\trating::Vector{<:Real}\n)\n\nFor IVR models with explicit neutrals, imposes a bound on the switch current magnitude per conductor. Note that a bound on the from-side implies the same bound on the to-side current, so it suffices to apply this only explicitly at the from-side.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_current_limit-Tuple{AbstractUnbalancedIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_current_limit","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_current_limit-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_current_limit","text":"constraint_mc_switch_current_limit(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for switch current limit constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_power-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_power","text":"function constraint_mc_switch_power(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tid::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int};\n\treport::Bool=true\n)\n\nconstraintmcswitchpower( pm::ReducedExplicitNeutralIVRModels, nw::Int, id::Int, fidx::Tuple{Int,Int,Int}, tidx::Tuple{Int,Int,Int}, fconnections::Vector{Int}, t_connections::Vector{Int}; report::Bool=true )\n\nFor IVR models with explicit neutrals, create expressions for the terminal power flows :psw_bus and qsw_bus, and link the from-side to the to-side switch power\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_power-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_power","text":"function constraint_mc_switch_power(\n pm::ExplicitNeutralModels,\n id::Int;\n nw::Int=nw_id_default,\n report::Bool=true\n)\n\nFor IVR models with explicit neutrals, link the switch power or create appropiate expressions for them\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_power_on_off-Tuple{AbstractUnbalancedIVRModel, Int64, Tuple{Int64, Int64, Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_power_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_power_on_off-Tuple{AbstractUnbalancedPowerModel, Int64, Tuple{Int64, Int64, Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_power_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state","text":"constraint_mc_switch_state(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for switch state constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_closed-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_closed","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_closed-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_closed","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_closed-Tuple{AbstractUnbalancedDCPModel, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_closed","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_closed-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_closed","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_closed-Tuple{AbstractUnbalancedNFAModel, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_closed","text":"nothing to do\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_closed-Tuple{AbstractUnbalancedWModels, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_closed","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_closed-Tuple{FBSUBFPowerModel, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_closed","text":"constraint_mc_switch_state_closed(pm::FBSUBFPowerModel, nw::Int, f_bus::Int, t_bus::Int, f_connections::Vector{Int}, t_connections::Vector{Int})\n\nVoltage constraints for closed switches similar to ACRUPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_on_off-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_on_off-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_on_off-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_on_off-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_on_off","text":"constraint_mc_switch_state_on_off(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default, relax::Bool=false)::Nothing\n\nTemplate function for switch state on/off constraints (MLD problems)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_on_off-Tuple{AbstractUnbalancedWModels, Int64, Int64, Int64, Int64, Vector{Int64}, Vector{Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_on_off","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_open-Tuple{AbstractUnbalancedActivePowerModel, Int64, Tuple{Int64, Int64, Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_open","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_open-Tuple{AbstractUnbalancedIVRModel, Int64, Tuple{Int64, Int64, Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_open","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_state_open-Tuple{AbstractUnbalancedPowerModel, Int64, Tuple{Int64, Int64, Int64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_state_open","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_thermal_limit-Tuple{AbstractExplicitNeutralACRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_thermal_limit","text":"function constraint_mc_switch_thermal_limit(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\trating::Vector{<:Real}\n)\n\nFor ACR models with explicit neutrals, imposes a bound on the switch power magnitude per conductor. Note that a bound on the from-side implies the same bound on the to-side power when the switch is closed (equal voltages), and also when it is open since the power then equals zero on both ends.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_thermal_limit-Tuple{AbstractLPUBFModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Float64}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_thermal_limit","text":"function constraint_mc_switch_thermal_limit(\n\tpm::AbstractNLExplicitNeutralIVRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\trating::Vector{<:Real}\n)\n\nThis method is not yet implemented for AbstractLPUBFModel. If the limit is finite, a warning is thrown.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_thermal_limit-Tuple{AbstractNLExplicitNeutralIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_thermal_limit","text":"function constraint_mc_switch_thermal_limit(\n\tpm::AbstractNLExplicitNeutralIVRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\trating::Vector{<:Real}\n)\n\nFor IVR models with explicit neutrals, imposes a bound on the switch power magnitude per conductor. Note that a bound on the from-side implies the same bound on the to-side power when the switch is closed (equal voltages), and also when it is open since the power then equals zero on both ends.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_thermal_limit-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_thermal_limit","text":"function constraint_mc_switch_thermal_limit(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\trating::Vector{<:Real}\n)\n\nFor quadratic IVR models with explicit neutrals, throw an error because this cannot be represented quadratically without introducing explicit power variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_thermal_limit-Tuple{AbstractUnbalancedActivePowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_thermal_limit","text":"constraint_mc_switch_thermal_limit(pm::AbstractUnbalancedActivePowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, rating::Vector{<:Real})::Nothing\n\nActive power only switch thermal limit constraint\n\nmath-S_{max} \\leq p_{fr} \\leq S_{max}\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_switch_thermal_limit-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_switch_thermal_limit","text":"constraint_mc_switch_thermal_limit(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for switch thermal limit constraint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_from-Tuple{AbstractExplicitNeutralACRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_from","text":"function constraint_mc_thermal_limit_from(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\trate_a::Vector{<:Real}\n)\n\nFor ACR models with explicit neutrals, imposes a bound on the from-side line power magnitude.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_from-Tuple{AbstractExplicitNeutralIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_from","text":"function constraint_mc_thermal_limit_from(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\trate_a::Vector{<:Real}\n)\n\nFor IVR models with explicit neutrals, imposes a bound on the from-side line power magnitude.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_from-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_from","text":"function constraint_mc_thermal_limit_from(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\trate_a::Vector{<:Real}\n)\n\nFor quadratic IVR models with explicit neutrals, throw an error because this cannot be represented quadratically without introducing explicit power variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_from-Tuple{AbstractUnbalancedActivePowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_from","text":"-rate_a <= p[f_idx] <= rate_a\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_from-Tuple{AbstractUnbalancedIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_from","text":"p[f_idx]^2 + q[f_idx]^2 <= rate_a^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_from-Tuple{AbstractUnbalancedPowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_from","text":"constraint_mc_thermal_limit_from(pm::AbstractUnbalancedPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, rate_a::Vector{<:Real})::Nothing\n\nGeneric thermal limit constraint for branches (from-side)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_from-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_from","text":"constraint_mc_thermal_limit_from(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for branch thermal constraints (from-side)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_to-Tuple{AbstractExplicitNeutralACRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_to","text":"function constraint_mc_thermal_limit_to(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tt_idx::Tuple{Int,Int,Int},\n\tt_connections::Vector{Int},\n\trate_a::Vector{<:Real}\n)\n\nFor ACR models with explicit neutrals, imposes a bound on the from-side line power magnitude.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_to-Tuple{AbstractExplicitNeutralIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_to","text":"function constraint_mc_thermal_limit_to(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\tt_idx::Tuple{Int,Int,Int},\n\tt_connections::Vector{Int},\n\trate_a::Vector{<:Real}\n)\n\nFor IVR models with explicit neutrals, imposes a bound on the to-side line power magnitude.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_to-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_to","text":"function constraint_mc_thermal_limit_to(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tt_idx::Tuple{Int,Int,Int},\n\tt_connections::Vector{Int},\n\trate_a::Vector{<:Real}\n)\n\nFor quadratic IVR models with explicit neutrals, throw an error because this cannot be represented quadratically without introducing explicit power variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_to-Tuple{AbstractUnbalancedActivePowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_to","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_to-Tuple{AbstractUnbalancedIVRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_to","text":"p[t_idx]^2 + q[t_idx]^2 <= rate_a^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_to-Tuple{AbstractUnbalancedPowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_to","text":"constraint_mc_thermal_limit_to(pm::AbstractUnbalancedPowerModel, nw::Int, t_idx::Tuple{Int,Int,Int}, t_connections::Vector{Int}, rate_a::Vector{<:Real})::Nothing\n\nGeneric thermal limit constraint for branches (to-side)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_thermal_limit_to-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_thermal_limit_to","text":"constraint_mc_thermal_limit_to(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for branch thermal constraints (to-side)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"Creates phase angle constraints at reference buses\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{AbstractUnbalancedNFAModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"nothing to do, no voltage angle variables\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{AbstractUnbalancedPolarModels, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"Creates phase angle constraints at reference buses\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"constraint_mc_theta_ref(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for reference angle constraints.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{AbstractUnbalancedWModels, Int64, Int64, Any}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"do nothing, no way to represent this in these variables\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{AbstractUnbalancedWModels, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{FBSUBFPowerModel, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"constraint_mc_theta_ref(pm::FBSUBFPowerModel, nw::Int, i::Int, va_ref::Vector{<:Real})\n\nCreates phase angle constraints at reference buses similar to ACRUPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{LPUBFDiagModel, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"balanced three-phase phasor\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_theta_ref-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Vector{<:Real}, Vector{Int64}, Vector{Bool}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_theta_ref","text":"function constraint_mc_theta_ref(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ti::Int,\n\tva::Vector{<:Real},\n\tterminals::Vector{Int},\n\tgrounded::Vector{Bool}\n)\n\nCreates phase angle constraints at bus i\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_current-Tuple{AbstractExplicitNeutralIVRModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_current","text":"function constraint_mc_transformer_current(\n\tpm::AbstractExplicitNeutralIVRModel,\n\ti::Int;\n\tnw::Int=nw_id_default,\n\tfix_taps::Bool=true\n)\n\nFor IVR models with explicit neutrals, links the current variables of the from-side and to-side transformer windings, and creates expressions for the terminal current flows\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_current_dy-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_current_dy","text":"function constraint_mc_transformer_current_dy(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\ttrans_id::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tpol::Int,\n\ttm_set::Vector{<:Real},\n\ttm_fixed::Vector{Bool},\n\ttm_scale::Real\n)\n\nFor IVR models with explicit neutrals, links the current variables of the from-side and to-side transformer windings, and creates expressions for the terminal current flows for delta-wye connected transformers\n\nscale*cr_fr_P + cr_to_P == 0\nscale*ci_fr_P + ci_to_P == 0\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_current_yy-Tuple{AbstractExplicitNeutralIVRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_current_yy","text":"function constraint_mc_transformer_current_yy(\n\tpm::AbstractExplicitNeutralIVRModel,\n\tnw::Int,\n\ttrans_id::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tpol::Int,\n\ttm_set::Vector{<:Real},\n\ttm_fixed::Vector{Bool},\n\ttm_scale::Real\n)\n\nFor IVR models with explicit neutrals, links the current variables of the from-side and to-side transformer windings, and creates expressions for the terminal current flows for wye-wye connected transformers\n\nscale*cr_fr_P + cr_to_P == 0\nscale*ci_fr_P + ci_to_P == 0\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power","text":"constraint_mc_transformer_power(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default, fix_taps::Bool=true)::Nothing\n\nTemplate function for Transformer constraints in Power-voltage space, considering winding type, conductor order, polarity and tap settings.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power-Tuple{NFAUPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power","text":"constraint_mc_transformer_power(pm::NFAUPowerModel, i::Int; nw::Int=nw_id_default)\n\ntransformer active power only constraint pf=-pt\n\np_ffc == -pttc\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_dy-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_dy","text":"function constraint_mc_transformer_power_dy(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\ttrans_id::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tpol::Int,\n\ttm_set::Vector{<:Real},\n\ttm_fixed::Vector{Bool},\n\ttm_scale::Real\n)\n\nFor ACR models with explicit neutrals, links the from-side and to-side power variables of delta-wye connected transformers. Expressions for the terminal power flow variables are also added.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_dy-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_dy","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_dy-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_dy","text":"This function adds all constraints required to model a two-winding, delta-wye connected transformer.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_dy-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_dy","text":"delta-wye transformer power constraint for IVR formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_dy-Tuple{FBSUBFPowerModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_dy","text":"constraint_mc_transformer_power_dy(pm::FBSUBFPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)\n\nAdd all constraints required to model a two-winding, delta-wye connected transformer similar to ACRUPowerModel with power constraints using initial operating point voltage instead of actual voltage variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_dy-Tuple{FOTPUPowerModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_dy","text":"constraint_mc_transformer_power_dy(pm::FOTPUPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)\n\nAdd all constraints required to model a two-winding, delta-wye connected transformer similar to ACPUPowerModel with voltage constraints linearized using first-order Taylor approximation and power constraints simplified using initial operating point voltage instead of actual voltage variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_dy-Tuple{FOTRUPowerModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_dy","text":"constraint_mc_transformer_power_dy(pm::FOTRUPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)\n\nAdd all constraints required to model a two-winding, delta-wye connected transformer similar to ACRUPowerModel with power constraints using initial operating point voltage instead of actual voltage variables.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_dy-Tuple{SOCUBFModels, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_dy","text":"constraint_mc_transformer_power_dy(pm::SOCUBFModels, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)\n\nConstraints to model a two-winding, delta-wye connected transformer.\n\nbeginalign\n W_fr^ij-W_fr^ik-W_fr^lj+W_fr^lk = t_m^2W_to^ij forall ij in 123 textand kl in 231 \n S_fr = X_tT_t \n S_fr^Delta = T_tX_t \n s_fr^Delta + s_to = 0\n M_Delta =\n beginbmatrix\n W_fr X_t \n X_t^textH L_Delta\n endbmatrix succeq 0\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"function constraint_mc_transformer_power_yy(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\ttrans_id::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tpol::Int,\n\ttm_set::Vector{<:Real},\n\ttm_fixed::Vector{Bool},\n\ttm_scale::Real\n)\n\nFor ACR models with explicit neutrals, links the from-side and to-side power variables of wye-wye connected transformers. Expressions for the terminal power flow variables are also added.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"This function adds all constraints required to model a two-winding, wye-wye connected transformer.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{AbstractUnbalancedIVRModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"wye-wye transformer power constraint for IVR formulation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{FBSUBFPowerModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"constraint_mc_transformer_power_yy(pm::FBSUBFPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)\n\nAdd all constraints required to model a two-winding, wye-wye connected transformer similar to ACRUPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{FOTPUPowerModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"constraint_mc_transformer_power_yy(pm::FOTPUPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)\n\nAdd all constraints required to model a two-winding, wye-wye connected transformer similar to ACPUPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{FOTRUPowerModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"constraint_mc_transformer_power_yy(pm::FOTRUPowerModel, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)\n\nAdd all constraints required to model a two-winding, wye-wye connected transformer similar to ACRUPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{LPUBFDiagModel, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"Links to and from power and voltages in a wye-wye transformer, assumes tm_fixed is true\n\nw_fr_i=(pol_i*tm_scale*tm_i)^2w_to_i\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_power_yy-Tuple{SOCUBFModels, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_power_yy","text":"constraint_mc_transformer_power_yy(pm::SOCUBFModels, nw::Int, trans_id::Int, f_bus::Int, t_bus::Int, f_idx::Tuple{Int,Int,Int}, t_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, pol::Int, tm_set::Vector{<:Real}, tm_fixed::Vector{Bool}, tm_scale::Real)\n\nConstraints to model a two-winding, wye-wye connected transformer.\n\nbeginalign\n W_fr = T_mT_m^H W_to \n s_fr + s_to = 0\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_thermal_limit-Tuple{AbstractExplicitNeutralACRModel, Int64, Int64, Tuple, Tuple, Int64, Int64, Vector, Vector, ConnConfig, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_thermal_limit","text":"function constraint_mc_transformer_thermal_limit(\n\tpm::AbstractExplicitNeutralACRModel,\n\tnw::Int,\n\tid::Int,\n\tf_idx::Tuple,\n\tt_idx::Tuple,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_connections::Vector,\n\tt_connections::Vector,\n\tconfig::ConnConfig,\n\tsm_ub::Real;\n\treport::Bool=true\n)\n\nFor ACR models with explicit neutrals, imposes a bound on the magnitude of the total apparent power at each winding of the transformer.\n\nsum(pt_fr)^2 + sum(qt_fr)^2 <= sm_ub^2\nsum(pt_to)^2 + sum(qt_to)^2 <= sm_ub^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_thermal_limit-Tuple{AbstractNLExplicitNeutralIVRModel, Int64, Int64, Tuple, Tuple, Int64, Int64, Vector, Vector, ConnConfig, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_thermal_limit","text":"function constraint_mc_transformer_thermal_limit(\n\tpm::AbstractNLExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tf_idx::Tuple,\n\tt_idx::Tuple,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_connections::Vector,\n\tt_connections::Vector,\n\tconfig::ConnConfig,\n\tsm_ub::Real;\n\treport::Bool=true\n)\n\nFor non-linear IVR models with explicit neutrals, imposes a bound on the magnitude of the total apparent power at both windings. Expressions are created for the transformer power variables.\n\nsum(pt_fr)^2 + sum(qt_fr)^2 <= sm_ub^2\nsum(pt_to)^2 + sum(qt_to)^2 <= sm_ub^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_thermal_limit-Tuple{AbstractQuadraticExplicitNeutralIVRModel, Int64, Int64, Tuple, Tuple, Int64, Int64, Vector, Vector, ConnConfig, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_thermal_limit","text":"function constraint_mc_transformer_thermal_limit(\n\tpm::AbstractQuadraticExplicitNeutralIVRModel,\n\tnw::Int,\n\tid::Int,\n\tf_idx::Tuple,\n\tt_idx::Tuple,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_connections::Vector,\n\tt_connections::Vector,\n\tconfig::ConnConfig,\n\tsm_ub::Real;\n\treport::Bool=true\n)\n\nFor quadratic IVR models with explicit neutrals, imposes a bound on the magnitude of the total apparent power at both windings.\n\nsum(pt_fr)^2 + sum(qt_fr)^2 <= sm_ub^2\nsum(pt_to)^2 + sum(qt_to)^2 <= sm_ub^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_thermal_limit-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_thermal_limit","text":"function constraint_mc_transformer_thermal_limit(\n\tpm::ExplicitNeutralModels,\n\tid::Int;\n\tnw::Int=nw_id_default,\n\tbounded::Bool=true,\n\treport::Bool=true,\n)\n\nImposes a bound on the total apparent at each transformer winding\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_voltage-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_voltage","text":"function constraint_mc_transformer_voltage(\n pm::ExplicitNeutralModels,\n i::Int;\n nw::Int=nw_id_default,\n fix_taps::Bool=true\n)\n\nFor models with explicit neutrals, links the voltage of the from-side and to-side transformer windings\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_voltage_dy-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_voltage_dy","text":"function constraint_mc_transformer_voltage_dy(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ttrans_id::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tpol::Int,\n\ttm_set::Vector{<:Real},\n\ttm_fixed::Vector{Bool},\n\ttm_scale::Real\n)\n\nFor rectangular voltage models with explicit neutrals, links the voltage of the from-side and to-side transformer windings for delta-wye connected transformers\n\nMd*vr_fr_P == scale * (vr_to_P - vr_to_n)\nMd*vi_fr_P == scale * (vi_to_P - vi_to_n)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_transformer_voltage_yy-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Int64, Int64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Int64, Vector{<:Real}, Vector{Bool}, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_transformer_voltage_yy","text":"function constraint_mc_transformer_voltage_yy(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ttrans_id::Int,\n\tf_bus::Int,\n\tt_bus::Int,\n\tf_idx::Tuple{Int,Int,Int},\n\tt_idx::Tuple{Int,Int,Int},\n\tf_connections::Vector{Int},\n\tt_connections::Vector{Int},\n\tpol::Int,\n\ttm_set::Vector{<:Real},\n\ttm_fixed::Vector{Bool},\n\ttm_scale::Real\n)\n\nFor rectangular voltage models with explicit neutrals, links the voltage of the from-side and to-side transformer windings for wye-wye connected transformers\n\n(vr_fr_P-vr_fr_n) == scale * (vr_to_P.-vr_to_n)\n(vi_fr_P-vi_fr_n) == scale * (vi_to_P.-vi_to_n)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_absolute-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_absolute","text":"function constraint_mc_voltage_absolute(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ti::Int,\n\tterminals::Vector{Int},\n\tgrounded::Vector{Bool},\n\tvmin::Vector{<:Real},\n\tvmax::Vector{<:Real};\n\treport::Bool=true\n)\n\nImposes absolute voltage magnitude bounds for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_absolute-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_absolute","text":"function constraint_mc_voltage_absolute(\n pm::RectangularVoltageExplicitNeutralModels,\n id::Int;\n nw::Int=nw_id_default,\n bounded::Bool=true,\n report::Bool=true,\n)\n\nImposes absolute voltage magnitude bounds for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_angle_difference-Tuple{AbstractUBFModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_angle_difference","text":"This is duplicated at PowerModelsDistribution level to correctly handle the indexing of the shunts.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_angle_difference-Tuple{AbstractUnbalancedACRModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_angle_difference","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_angle_difference-Tuple{AbstractUnbalancedIVRModel, Int64, Any, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_angle_difference","text":"Bounds the voltage angle difference between bus pairs\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_angle_difference-Tuple{AbstractUnbalancedNFAModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_angle_difference","text":"nothing to do, these models do not have angle difference constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_angle_difference-Tuple{AbstractUnbalancedPolarModels, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_angle_difference","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_angle_difference-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_angle_difference","text":"constraint_mc_voltage_angle_difference(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for constraints of the voltage angle difference across branches\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_angle_difference-Tuple{FBSUBFPowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_angle_difference","text":"constraint_mc_voltage_angle_difference(pm::FBSUBFPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, angmin::Vector{<:Real}, angmax::Vector{<:Real})\n\nNothing to do, this model ignores angle difference constraints\"\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_angle_difference-Tuple{FOTRUPowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{Int64}, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_angle_difference","text":"constraint_mc_voltage_angle_difference(pm::FOTRUPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, t_connections::Vector{Int}, angmin::Vector{<:Real}, angmax::Vector{<:Real})\n\nNothing to do, this model ignores angle difference constraints\"\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_fixed-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Vector{<:Real}, Vector{<:Real}, Vector{Int64}, Vector{Bool}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_fixed","text":"function constraint_mc_voltage_fixed(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ti::Int,\n\tvm::Vector{<:Real},\n\tva::Vector{<:Real},\n\tterminals::Vector{Int},\n\tgrounded::Vector{Bool}\n)\n\nFixes the voltage variables at bus i to vm.*exp.(im*va)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_bounds-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_bounds","text":"vmin <= vm[i] <= vmax\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_bounds-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_bounds","text":"constraint_mc_voltage_magnitude_bounds(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for voltage magnitude bounds constraints.\n\nThis constraint captures problem agnostic constraints that define limits for voltage magnitudes (where variable bounds cannot be used). Notable examples include IVRUPowerModel and ACRUPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_bounds-Tuple{FBSUBFPowerModel, Int64, Int64, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_bounds","text":"constraint_mc_voltage_magnitude_bounds(pm::FBSUBFPowerModel, nw::Int, i::Int, vmin::Vector{<:Real}, vmax::Vector{<:Real})\n\nUpper voltage magnitude limits are linearized using outer approximation. Lower voltage magnitude limits are linearized around initial operating point.\n\nbeginalign\ntextInitial operating point v_r^0 + j v_i^0textwhere(v_m^0)^2 = (v_r^0)^2 + (v_i^0)^2\ntextLower limits 2 v_r v_r^0 + 2 v_i v_i^0 - (v_m^0)^2 v_min^2\ntextUpper limits -v_max v_r v_max\n -v_max v_i v_max\n-sqrt2 v_max v_r + v_i sqrt2 v_max\n -sqrt2 v_max v_r - v_i sqrt2 v_max\nendalign\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_bounds-Tuple{FOTRUPowerModel, Int64, Int64, Vector{<:Real}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_bounds","text":"constraint_mc_voltage_magnitude_bounds(pm::FOTRUPowerModel, nw::Int, i::Int, vmin::Vector{<:Real}, vmax::Vector{<:Real})\n\nLinearized voltage magnitude limits similar to FBSUBFPowerModel.\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_fixed-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Vector{<:Real}, Vector{Int64}, Vector{Bool}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_fixed","text":"function constraint_mc_voltage_magnitude_fixed(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ti::Int,\n\tvm::Vector{<:Real},\n\tva::Vector{<:Real},\n\tterminals::Vector{Int},\n\tgrounded::Vector{Bool}\n)\n\nFixes the voltage variables at bus i to vm.*exp.(im*va)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_only-Tuple{AbstractUnbalancedACPModel, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_only","text":"vm[i] == vmref\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_only-Tuple{AbstractUnbalancedACRModel, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_only","text":"vm[i] == vmref\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_only-Tuple{AbstractUnbalancedActivePowerModel, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_only","text":"nothing to do\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_only-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_only","text":"constraint_mc_voltage_magnitude_only(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for voltage magnitude setpoint constraint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_magnitude_only-Tuple{AbstractUnbalancedWModels, Int64, Int64, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_magnitude_only","text":"vm[i] == vmref\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_pairwise-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64, Int64, Vector{Int64}, Vector{Bool}, Vector{<:Tuple{Any, Any, Real}}, Vector{<:Tuple{Any, Any, Real}}}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_pairwise","text":"function constraint_mc_voltage_pairwise(\n\tpm::RectangularVoltageExplicitNeutralModels,\n\tnw::Int,\n\ti::Int,\n\tterminals::Vector{Int},\n\tgrounded::Vector{Bool},\n\tvm_pair_lb::Vector,\n\tvm_pair_ub::Vector;\n\treport::Bool=true\n)\n\nImposes pairwise voltage magnitude bounds, i.e. magnitude bounds on the voltage between to terminals, for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_pairwise-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_pairwise","text":"function constraint_mc_voltage_pairwise(\n pm::RectangularVoltageExplicitNeutralModels,\n id::Int;\n nw::Int=nw_id_default,\n bounded::Bool=true,\n report::Bool=true,\n)\n\nImposes pairwise voltage magnitude bounds, i.e. magnitude bounds on the voltage between to terminals, for models with explicit neutrals\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_psd-Tuple{SDPUBFModel, Int64, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_psd","text":"Add explicit PSD-ness of W for nodes where it is not implied\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_psd-Tuple{SOCConicUBFModel, Int64, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_psd","text":"Add explicit PSD-ness of W for nodes where it is not implied\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_psd-Tuple{SOCUBFModels, Int64, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_psd","text":"Add explicit PSD-ness of W for nodes where it is not implied\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_mc_voltage_reference-Tuple{Union{RectangularVoltageExplicitNeutralModels, ExplicitNeutralModels}, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_mc_voltage_reference","text":"function constraint_mc_voltage_reference(\n pm::ExplicitNeutralModels,\n id::Int;\n nw::Int=nw_id_default,\n bounded::Bool=true,\n report::Bool=true,\n)\n\nImposes suitable constraints for the voltage at the reference bus\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_pqw-Tuple{JuMP.Model, JuMP.VariableRef, JuMP.VariableRef, Vararg{Real, 6}}","page":"Constraints","title":"PowerModelsDistribution.constraint_pqw","text":"Creates the constraints modelling the (relaxed) voltage-dependency of the power consumed in each phase, s=p+jq. This is completely symmetrical for p and q, with appropriate substitutions of the variables and parameters: p->q, a->b, alpha->beta, pmin->qmin, pmax->qmax\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_complementarity_mi-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Real, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_complementarity_mi","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_complementarity_mi-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_complementarity_mi","text":"constraint_storage_complementarity_mi(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)\n\nTemplate function for mixed-integer storage complementarity constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_complementarity_nl-Tuple{AbstractUnbalancedPowerModel, Int64, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_complementarity_nl","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_complementarity_nl-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_complementarity_nl","text":"constraint_storage_complementarity_nl(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)\n\nTemplate function for nonlinear storage complementarity constraints\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_complementarity_nl-Tuple{LPUBFDiagModel, Int64, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_complementarity_nl","text":"constraint_storage_complementarity_nl(pm::LPUBFDiagModel, n::Int, i::Int)\n\nLinear version of storage complementarity constraint\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_state-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Int64, Real, Real, Real}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_state","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_state-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_state","text":"constraint_storage_state(pm::AbstractUnbalancedPowerModel, i::Int, nw_1::Int, nw_2::Int)::Nothing\n\nTemplate function for storage state constraints for multinetwork problems\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_state-Tuple{AbstractUnbalancedPowerModel, Int64}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_state","text":"constraint_storage_state(pm::AbstractUnbalancedPowerModel, i::Int; nw::Int=nw_id_default)::Nothing\n\nTemplate function for storage state constraints (non multinetwork)\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_storage_state_initial-Tuple{AbstractUnbalancedPowerModel, Int64, Int64, Vararg{Real, 4}}","page":"Constraints","title":"PowerModelsDistribution.constraint_storage_state_initial","text":"\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.constraint_switch_thermal_limit-Tuple{AbstractUnbalancedPowerModel, Int64, Tuple{Int64, Int64, Int64}, Vector{Int64}, Vector{<:Real}}","page":"Constraints","title":"PowerModelsDistribution.constraint_switch_thermal_limit","text":"constraint_switch_thermal_limit(pm::AbstractUnbalancedPowerModel, nw::Int, f_idx::Tuple{Int,Int,Int}, f_connections::Vector{Int}, rating::Vector{<:Real})::Nothing\n\nGeneric thermal limit constraint for switches (from-side)\n\nmathp_{fr}^2 + q_{fr}^2 \\leq S_{max}^2\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#Relaxation-Helpers","page":"Constraints","title":"Relaxation Helpers","text":"","category":"section"},{"location":"reference/constraints.html","page":"Constraints","title":"Constraints","text":"Modules = [PowerModelsDistribution]\nPrivate = false\nOrder = [:function]\nPages = [\"relaxation_scheme.jl\"]","category":"page"},{"location":"reference/constraints.html#PowerModelsDistribution.cut_complex_product_and_angle_difference-NTuple{7, Any}","page":"Constraints","title":"PowerModelsDistribution.cut_complex_product_and_angle_difference","text":"cut_complex_product_and_angle_difference(m, wf, wt, wr, wi, angmin, angmax)\n\nA valid inequality for the product of two complex variables with magnitude and angle difference bounds. In the literature this constraints are called the Lifted Nonlinear Cuts (LNCs). @misc{1512.04644, Author = {Carleton Coffrin and Hassan Hijazi and Pascal Van Hentenryck}, Title = {Strengthening the SDP Relaxation of AC Power Flows with Convex Envelopes, Bound Tightening, and Lifted Nonlinear Cuts}, Year = {2015}, Eprint = {arXiv:1512.04644}, }\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.relaxation_psd_to_psd_real-Tuple{Any, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.relaxation_psd_to_psd_real","text":"relaxation_psd_to_psd_real(m, mxreal, mximag; ndim=3)\n\nFor debugging / exploration: real-valued SDP to SDP relaxation based on PSDness of principal minors, default is 3x3 SDP relaxation\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.relaxation_psd_to_soc-Tuple{JuMP.Model, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.relaxation_psd_to_soc","text":"relaxation_psd_to_soc(m::JuMP.Model, mxreal, mximag; complex::Bool=true)\n\nSee section 4.3 for complex to real PSD constraint transformation: @article{Fazel2001, author = {Fazel, M. and Hindi, H. and Boyd, S.P.}, title = {{A rank minimization heuristic with application to minimum order system approximation}}, doi = {10.1109/ACC.2001.945730}, journal = {Proc. American Control Conf.}, number = {2}, pages = {4734–4739}, url = {http://ieeexplore.ieee.org/lpdocs/epic03/wrapper.htm?arnumber=945730}, volume = {6}, year = {2001} }\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.relaxation_psd_to_soc_complex-Tuple{Any, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.relaxation_psd_to_soc_complex","text":"relaxation_psd_to_soc_complex(m, mxreal, mximag)\n\nSDP to SOC relaxation of type 2, applied to complex-value matrix, as described in:\n\n@article{Kim2003,\nauthor = {Kim, S and Kojima, M and Yamashita, M},\ntitle = {{Second order cone programming relaxation of a positive semidefinite constraint}},\ndoi = {10.1080/1055678031000148696},\njournal = {Optimization Methods and Software},\nnumber = {5},\npages = {535--541},\nvolume = {18},\nyear = {2003}\n}\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.relaxation_psd_to_soc_complex_conic-Tuple{Any, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.relaxation_psd_to_soc_complex_conic","text":"relaxation_psd_to_soc_complex_conic(m, mxreal, mximag)\n\nSDP to SOC relaxation of type 2, applied to complex-value matrix, as described in:\n\n@article{Kim2003,\nauthor = {Kim, S and Kojima, M and Yamashita, M},\ntitle = {{Second order cone programming relaxation of a positive semidefinite constraint}},\ndoi = {10.1080/1055678031000148696},\njournal = {Optimization Methods and Software},\nnumber = {5},\npages = {535--541},\nvolume = {18},\nyear = {2003}\n}\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.relaxation_psd_to_soc_conic-Tuple{Any, Any, Any}","page":"Constraints","title":"PowerModelsDistribution.relaxation_psd_to_soc_conic","text":"relaxation_psd_to_soc_conic(m, mxreal, mximag; complex=true)\n\nSee section 4.3 for complex to real PSD constraint transformation: @article{Fazel2001, author = {Fazel, M. and Hindi, H. and Boyd, S.P.}, title = {{A rank minimization heuristic with application to minimum order system approximation}}, doi = {10.1109/ACC.2001.945730}, journal = {Proc. American Control Conf.}, number = {2}, pages = {4734–4739}, url = {http://ieeexplore.ieee.org/lpdocs/epic03/wrapper.htm?arnumber=945730}, volume = {6}, year = {2001} }\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.relaxation_psd_to_soc_real-Tuple{Any, Any}","page":"Constraints","title":"PowerModelsDistribution.relaxation_psd_to_soc_real","text":"relaxation_psd_to_soc_real(m, mx)\n\nSDP to SOC relaxation of type 2, applied to real-value matrix, as described in:\n\n@article{Kim2003,\nauthor = {Kim, S and Kojima, M and Yamashita, M},\ntitle = {{Second order cone programming relaxation of a positive semidefinite constraint}},\ndoi = {10.1080/1055678031000148696},\njournal = {Optimization Methods and Software},\nnumber = {5},\npages = {535--541},\nvolume = {18},\nyear = {2003}\n}\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#PowerModelsDistribution.relaxation_psd_to_soc_real_conic-Tuple{Any, Any}","page":"Constraints","title":"PowerModelsDistribution.relaxation_psd_to_soc_real_conic","text":"relaxation_psd_to_soc_real_conic(m, mx)\n\nSDP to SOC relaxation of type 2, applied to real-value matrix, as described in:\n\n@article{Kim2003,\nauthor = {Kim, S and Kojima, M and Yamashita, M},\ntitle = {{Second order cone programming relaxation of a positive semidefinite constraint}},\ndoi = {10.1080/1055678031000148696},\njournal = {Optimization Methods and Software},\nnumber = {5},\npages = {535--541},\nvolume = {18},\nyear = {2003}\n}\n\n\n\n\n\n","category":"method"},{"location":"reference/constraints.html#Miscellaneous-Helpers","page":"Constraints","title":"Miscellaneous Helpers","text":"","category":"section"},{"location":"reference/constraints.html","page":"Constraints","title":"Constraints","text":"calculate_tm_scale\ncalc_branch_y\ncalc_buspair_parameters","category":"page"},{"location":"reference/constraints.html#PowerModelsDistribution.calculate_tm_scale","page":"Constraints","title":"PowerModelsDistribution.calculate_tm_scale","text":"Calculates the tap scale factor for the non-dimensionalized equations.\n\n\n\n\n\n","category":"function"},{"location":"reference/constraints.html#PowerModelsDistribution.calc_branch_y","page":"Constraints","title":"PowerModelsDistribution.calc_branch_y","text":"calc_branch_y(branch::Dict{String,<:Any})\n\ncomputes branch admittance matrices\n\n\n\n\n\n","category":"function"},{"location":"reference/constraints.html#PowerModelsDistribution.calc_buspair_parameters","page":"Constraints","title":"PowerModelsDistribution.calc_buspair_parameters","text":"calc_buspair_parameters(buses, branches)\n\nComputes the buspair parameters for the network\n\n\n\n\n\n","category":"function"}] +} diff --git a/v0.15.1/siteinfo.js b/v0.15.1/siteinfo.js new file mode 100644 index 000000000..af5dc7cd0 --- /dev/null +++ b/v0.15.1/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.15.1"; diff --git a/v0.15.1/tutorials/Beginners Guide.html b/v0.15.1/tutorials/Beginners Guide.html new file mode 100644 index 000000000..6780a66ac --- /dev/null +++ b/v0.15.1/tutorials/Beginners Guide.html @@ -0,0 +1,366 @@ + + + + + + Beginners Guide · PowerModelsDistribution + + + + + + + + + + + + + + + + + + +
    + + + +
    + + diff --git a/v0.15.1/tutorials/Beginners Guide.jl.html b/v0.15.1/tutorials/Beginners Guide.jl.html new file mode 100644 index 000000000..663053cbb --- /dev/null +++ b/v0.15.1/tutorials/Beginners Guide.jl.html @@ -0,0 +1,15 @@ + + + + + +
    \ No newline at end of file diff --git a/v0.15.1/tutorials/Engineering Model - Helper Functions.html b/v0.15.1/tutorials/Engineering Model - Helper Functions.html new file mode 100644 index 000000000..7103c39af --- /dev/null +++ b/v0.15.1/tutorials/Engineering Model - Helper Functions.html @@ -0,0 +1,366 @@ + + + + + + Engineering Model: Helper Functions · PowerModelsDistribution + + + + + + + + + + + + + + + + + + +
    + + + +
    + + diff --git a/v0.15.1/tutorials/Engineering Model - Helper Functions.jl.html b/v0.15.1/tutorials/Engineering Model - Helper Functions.jl.html new file mode 100644 index 000000000..6163ea133 --- /dev/null +++ b/v0.15.1/tutorials/Engineering Model - Helper Functions.jl.html @@ -0,0 +1,15 @@ + + + + + +
    \ No newline at end of file diff --git a/v0.15.1/tutorials/Explicit Neutral Models.html b/v0.15.1/tutorials/Explicit Neutral Models.html new file mode 100644 index 000000000..38fd889b6 --- /dev/null +++ b/v0.15.1/tutorials/Explicit Neutral Models.html @@ -0,0 +1,366 @@ + + + + + + Explicit Neutral Models · PowerModelsDistribution + + + + + + + + + + + + + + + + + + +
    + + + +
    + + diff --git a/v0.15.1/tutorials/Explicit Neutral Models.jl.html b/v0.15.1/tutorials/Explicit Neutral Models.jl.html new file mode 100644 index 000000000..6791c06e1 --- /dev/null +++ b/v0.15.1/tutorials/Explicit Neutral Models.jl.html @@ -0,0 +1,15 @@ + + + + + +
    \ No newline at end of file diff --git a/v0.15.1/tutorials/Extension Tutorial.html b/v0.15.1/tutorials/Extension Tutorial.html new file mode 100644 index 000000000..1e3f47165 --- /dev/null +++ b/v0.15.1/tutorials/Extension Tutorial.html @@ -0,0 +1,366 @@ + + + + + + Extending PowerModelsDistribution · PowerModelsDistribution + + + + + + + + + + + + + + + + + + +
    + + + +
    + + diff --git a/v0.15.1/tutorials/Extension Tutorial.jl.html b/v0.15.1/tutorials/Extension Tutorial.jl.html new file mode 100644 index 000000000..06c094c3d --- /dev/null +++ b/v0.15.1/tutorials/Extension Tutorial.jl.html @@ -0,0 +1,15 @@ + + + + + +
    \ No newline at end of file diff --git a/v0.15.1/tutorials/Native Power Flow.html b/v0.15.1/tutorials/Native Power Flow.html new file mode 100644 index 000000000..0350a400e --- /dev/null +++ b/v0.15.1/tutorials/Native Power Flow.html @@ -0,0 +1,366 @@ + + + + + + Native Power Flow Solver · PowerModelsDistribution + + + + + + + + + + + + + + + + + + +
    + + + +
    + + diff --git a/v0.15.1/tutorials/Native Power Flow.jl.html b/v0.15.1/tutorials/Native Power Flow.jl.html new file mode 100644 index 000000000..952d9ff6e --- /dev/null +++ b/v0.15.1/tutorials/Native Power Flow.jl.html @@ -0,0 +1,15 @@ + + + + + +
    \ No newline at end of file diff --git a/v0.15.1/tutorials/The Engineering Model.html b/v0.15.1/tutorials/The Engineering Model.html new file mode 100644 index 000000000..5a0f34c9f --- /dev/null +++ b/v0.15.1/tutorials/The Engineering Model.html @@ -0,0 +1,366 @@ + + + + + + The Engineering Data Model · PowerModelsDistribution + + + + + + + + + + + + + + + + + + +
    + + + +
    + + diff --git a/v0.15.1/tutorials/The Engineering Model.jl.html b/v0.15.1/tutorials/The Engineering Model.jl.html new file mode 100644 index 000000000..52039b87b --- /dev/null +++ b/v0.15.1/tutorials/The Engineering Model.jl.html @@ -0,0 +1,15 @@ + + + + + +
    \ No newline at end of file diff --git a/v0.15.1/tutorials/basic.html b/v0.15.1/tutorials/basic.html new file mode 100644 index 000000000..309a0742c --- /dev/null +++ b/v0.15.1/tutorials/basic.html @@ -0,0 +1,366 @@ + + + + + + Basics · PowerModelsDistribution + + + + + + + + + + + + + + + + + + +
    + + + +
    + + diff --git a/v0.15.1/tutorials/basic.jl.html b/v0.15.1/tutorials/basic.jl.html new file mode 100644 index 000000000..240ebe2c8 --- /dev/null +++ b/v0.15.1/tutorials/basic.jl.html @@ -0,0 +1,15 @@ + + + + + +
    \ No newline at end of file diff --git a/versions.js b/versions.js index dc59999aa..5024ef342 100644 --- a/versions.js +++ b/versions.js @@ -16,5 +16,5 @@ var DOC_VERSIONS = [ "v0.1", "dev", ]; -var DOCUMENTER_NEWEST = "v0.15.0"; +var DOCUMENTER_NEWEST = "v0.15.1"; var DOCUMENTER_STABLE = "stable";