diff --git a/MINDFulPluto/src/static/html/DashboardIndex.html b/MINDFulPluto/src/static/html/DashboardIndex.html new file mode 100644 index 0000000..0f09c09 --- /dev/null +++ b/MINDFulPluto/src/static/html/DashboardIndex.html @@ -0,0 +1,387 @@ + +
+ +
+ +
+
+
+
+ + MINDFulPlutoGUI v0.1.3 + +
+ + +
+ +
+ + +
+
+
+
+ Intent Creation +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+
+ Drawing +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/MINDFulPluto/src/static/scripts/GetViewportSize.js b/MINDFulPluto/src/static/scripts/GetViewportSize.js new file mode 100644 index 0000000..3e20b90 --- /dev/null +++ b/MINDFulPluto/src/static/scripts/GetViewportSize.js @@ -0,0 +1,52 @@ +function getViewportSize() { + let viewportWidth; + let viewportHeight; + // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight + if (typeof window.innerWidth != 'undefined') { + viewportWidth = window.innerWidth, + viewportHeight = window.innerHeight + windowDevicePixelRatio = window.devicePixelRatio + } + + //TODO: Add DPR to older versions + /* // IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document) + else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) { + viewportWidth = document.documentElement.clientWidth, + viewportHeight = document.documentElement.clientHeight + } + // older versions of IE + else { + viewportWidth = document.getElementsByTagName('body')[0].clientWidth, + viewportHeight = document.getElementsByTagName('body')[0].clientHeight + } */ + + + const viewportHeightInput = document.getElementById('viewportHeight'); + const viewportWidthInput = document.getElementById('viewportWidth'); + const windowDevicePixelRatioInput = document.getElementById('windowDevicePixelRatio'); + + viewportHeightInput.value = viewportHeight; + viewportHeightInput.dispatchEvent(new CustomEvent("input")); + + viewportWidthInput.value = viewportWidth; + viewportWidthInput.dispatchEvent(new CustomEvent("input")); + + windowDevicePixelRatioInput.value = windowDevicePixelRatio; + windowDevicePixelRatioInput.dispatchEvent(new CustomEvent("input")); + + console.log("Set viewport fields") +} + +window.addEventListener("resize", () => { + getViewportSize(); +}) + +//while element windowDevicePixelRatio is not set, keep trying to set it +const vpIntervalID = setInterval(() => { + if (document.getElementById('windowDevicePixelRatio').value == "") { + getViewportSize(); + } + else { + clearInterval(vpIntervalID); + } +}, 1000); \ No newline at end of file diff --git a/MINDFulPluto/src/static/scripts/Init.js b/MINDFulPluto/src/static/scripts/Init.js new file mode 100644 index 0000000..a7c24d5 --- /dev/null +++ b/MINDFulPluto/src/static/scripts/Init.js @@ -0,0 +1,36 @@ +function initJS() { + tsparticlesWrapper(); + reformatNotebook(); + + updateButtonAvailabilities(); + sendIntentCommand("update_ui"); +} + +async function waitTillPageLoad() { + // while (document.readyState !== "complete") { + // await new Promise(resolve => setTimeout(resolve, 100)); + // console.log(document.readyState); + // } + + while (true) { + try { + add_toast_to_div("MINDFulPluto.jl", "Page loaded."); + + //get toast div + let toastContainer = document.getElementById("toast_container"); + //remove all children + while (toastContainer.firstChild) { + toastContainer.removeChild(toastContainer.firstChild); + } + break; + } + catch (e) { + await new Promise(resolve => setTimeout(resolve, 1000)); + console.log(document.readyState); + } + + } + + initJS(); +} +waitTillPageLoad(); diff --git a/MINDFulPluto/src/static/scripts/IntentCommands.js b/MINDFulPluto/src/static/scripts/IntentCommands.js new file mode 100644 index 0000000..ac9b1c3 --- /dev/null +++ b/MINDFulPluto/src/static/scripts/IntentCommands.js @@ -0,0 +1,53 @@ +function createIntent() { + //find domain_selection_select and get value + const domain_1 = document.querySelector("#domain_selection_1").value; + const domain_2 = document.querySelector("#domain_selection_2").value; + const node_1 = document.querySelector("#node_selection_1").value; + const node_2 = document.querySelector("#node_selection_2").value; + const topology = document.querySelector("#topology_select").value; + + sendIntentCommand(`create_intent ${domain_1} ${domain_2} ${node_1} ${node_2} ${topology}`) +} + +function updateDomainList() { + const topology = document.querySelector("#topology_select").value; + sendIntentCommand(`update_domain_list ${topology}`) +} + +function updateNodeList(node_number) { + const domain = document.querySelector(`#domain_selection_${node_number}`).value; + const topology = document.querySelector("#topology_select").value; + + sendIntentCommand(`update_node_list ${topology} ${domain} ${node_number}`) +} + +function drawIntent() { + const intent_index = document.querySelector("#intent_selection_select").selectedIndex; + const plottingType = document.querySelector("#plot_selection_select").value; + const position = document.querySelector("#wanted_pos_select").value; + const domain = document.querySelector("#domain_drawing_select").value; + + sendIntentCommand(`draw_intent ${intent_index} ${plottingType} ${position} ${domain}`) +} + +function updateDomainListDrawing() { + const intent_index = document.querySelector("#intent_selection_select").selectedIndex; + const plottingType = document.querySelector("#plot_selection_select").value; + + sendIntentCommand(`update_domain_list_drawing ${intent_index} ${plottingType}`) +} + +function removePlot() { + const position = document.querySelector("#wanted_pos_select").value; + console.log(position) + // Find all codeFolded elements + const plotDivs = document.querySelectorAll(".code_folded"); + console.log(plotDivs); + // Find the position-th plotDiv (index 2+3) + const plotDiv = plotDivs[parseInt(position) + 1]; + console.log(plotDiv); + // Find rich_output + const plutoShoulder = plotDiv.querySelector(".rich_output"); + // Remove it + plutoShoulder.remove(); +} \ No newline at end of file diff --git a/MINDFulPluto/src/static/scripts/SwitchViews.js b/MINDFulPluto/src/static/scripts/SwitchViews.js new file mode 100644 index 0000000..423f5c4 --- /dev/null +++ b/MINDFulPluto/src/static/scripts/SwitchViews.js @@ -0,0 +1,321 @@ +function changeViewDisplay(target, visible) { + const display = visible ? 'block' : 'none'; + const display_flex = visible ? 'flex' : 'none'; + + if (visible === true) { + //hide everything + changeViewDisplay('visualisation', false); + changeViewDisplay('intenttable', false); + changeViewDisplay('devmode', false); + } + + switch (target) { + case "visualisation": + //hide content > .row (vis) + document.querySelectorAll('.content > .row').forEach((card, i) => { + card.style.display = display_flex; + }); + + //hide plotting cells + Array.prototype.slice.call(document.querySelectorAll('.code_folded'), -2).forEach((card, i) => { + card.style.display = display; + }); + + if (visible === true) { + setVisualisationModeCellStyle(); + } + break; + + case "intenttable": + //hide content > .table-container + document.querySelectorAll('.content > .table-container').forEach((card, i) => { + card.style.display = display_flex; + }); + break; + + case "devmode": + //hide last 2 cells (dev mode) + let cells = document.querySelectorAll('.show_input '); + cells = Array.prototype.slice.call(cells, -2); + cells.forEach((cell, i) => { + cell.style.display = display; + }); + + if (visible === true) { + setDevmodeCellStyle(); + } + + break; + + default: + break; + } +} + +function setVisualisationModeCellStyle() { + cells = document.querySelectorAll('.code_folded '); + cells = Array.prototype.slice.call(cells, -2); + + cells.forEach((cell, i) => { + cell.querySelector('.cm-editor').style.background = 'transparent'; + + cell.style.display = 'inline-block'; + cell.style.verticalAlign = 'top'; + cell.style.width = '30vw'; + cell.style.maxWidth = '30vw'; + cell.style.height = '50vh'; + cell.style.margin = '2.5%'; + cell.style.textAlign = 'start'; + + cell.style.background = 'rgba(217, 147, 232, 0.1)'; + cell.style.borderRadius = '16px'; + cell.style.boxShadow = '0 4px 30px rgba(0, 0, 0, 0.1)'; + + cell.style.padding = '20px 20px 20px 20px'; + + //find element pluto-trafficlight + cell.querySelector('pluto-trafficlight').style.display = 'none'; + + let log_container = cell.querySelector('pluto-logs-container'); + if (log_container != null) { + log_container.style.display = 'transparent'; + } + + //remove pluto-log-icon + let log_icon = cell.querySelector('pluto-log-icon'); + if (log_icon != null) { + log_icon.style.display = 'none'; + } + + //find class=Stdout and change style + let stdout = cell.querySelector('pluto-log-dot') + if (stdout != null) { + stdout.style.background = 'transparent'; + stdout.style.border = '2px solid #FFFFFF'; + } + + let rich_output = cell.querySelector('pluto-output'); + if (rich_output != null) { + rich_output.style.borderRadius = '16px'; + rich_output.style.background = 'black'; + } + + + }); + + let p_nb = document.getElementsByTagName('pluto-notebook')[0]; + p_nb.style.marginTop = '31vh'; + p_nb.style.marginLeft = '20vw'; + p_nb.style.marginRight = '-25vw'; + p_nb.style.backgroundColor = 'transparent'; +} + +function setDevmodeCellStyle() { + //get last 3 cells + let cells = document.querySelectorAll('.show_input '); + + //only last 3 cells + cells = Array.prototype.slice.call(cells, -2); + + //move cells to top of screen in a grid + cells.forEach((cell, i) => { + cell.querySelector('.cm-editor').style.background = 'transparent'; + + cell.style.display = 'inline-block'; + cell.style.verticalAlign = 'top'; + cell.style.width = '30vw'; + cell.style.margin = '2.5%'; + cell.style.textAlign = 'start'; + + cell.style.background = 'rgba(217, 147, 232, 0.1)'; + cell.style.borderRadius = '16px'; + cell.style.boxShadow = '0 4px 30px rgba(0, 0, 0, 0.1)'; + + cell.style.padding = '20px 20px 20px 20px'; + + //find element pluto-trafficlight + cell.querySelector('pluto-trafficlight').style.display = 'none'; + + let log_container = cell.querySelector('pluto-logs-container'); + if (log_container != null) { + log_container.style.display = 'transparent'; + } + + //remove pluto-log-icon + let log_icon = cell.querySelector('pluto-log-icon'); + if (log_icon != null) { + log_icon.style.display = 'none'; + } + + //find class=Stdout and change style + let stdout = cell.querySelector('pluto-log-dot') + if (stdout != null) { + stdout.style.background = 'transparent'; + stdout.style.border = '2px solid #FFFFFF'; + } + + + + }); + + //change pluto-notebook style + let p_nb = document.getElementsByTagName('pluto-notebook')[0]; + p_nb.style.marginTop = '1.5vh'; + p_nb.style.marginLeft = '20vw'; + p_nb.style.marginRight = '-25vw'; + p_nb.style.backgroundColor = 'transparent'; +} + +function reformatNotebook() { + //find body + let body = document.querySelector("body"); + //set overflow hidden + body.style.overflow = "hidden"; + + + //find
+ let main = document.querySelector("main"); + + //set main style to max-width 100% + main.style.maxWidth = "100%"; + //set main color to darkslategray + + //find rich-output class and remove backgroundColor + document.querySelectorAll(".rich_output").forEach((cell, i) => { + cell.style.background = "transparent"; + }); + + //remove header + document.querySelector("header").style.display = "none"; + + //remove footer + document.querySelector("footer").style.display = "none"; + + + //place first cell ath the top and 2nd cell at the bottom + document.querySelectorAll(".code_folded ").forEach((cell, i) => { + if (i == 0) { + cell.style.display = "none"; + } + else if (i == 1) { + cell.style.position = "absolute"; + cell.style.top = "0"; + cell.style.left = "0"; + cell.style.width = "100%"; + cell.style.margin = "0"; + } + }); + + //hide shown cells + document.querySelectorAll(".show_input").forEach((cell, i) => { + cell.style.display = "none"; + }); + + //hide div with class="helpbox-true hidden " + document.querySelectorAll(".helpbox-true.hidden").forEach((cell, i) => { + cell.style.display = "none"; + }); + + //find title=Drag to move cell + document.querySelectorAll("pluto-shoulder").forEach((cell, i) => { + cell.style.display = "none"; + cell.style.width = "0px"; + }); + + //find tag main and set class to container-fluid + document.getElementsByTagName("main")[0].className = "container"; + //document.getElementsByTagName("main")[0].style += " padding-bottom: 0px;"; + + + //find tag pluto-notebook and set class to row + document.getElementsByTagName("pluto-notebook")[0].className = "row"; + document.getElementsByTagName("pluto-notebook")[0].style = "width: 100vw;"; + document.getElementsByTagName("pluto-notebook")[0].style = "background: rgba(0,0,0,0) !important;"; + document.getElementsByTagName("pluto-notebook")[0].style = "margin-top: 30vh; margin-left:10vw; margin-right:10vw;"; + + //find shown cells and set class to col except for the first one + document.querySelectorAll(".code_folded").forEach((cell, i) => { + if (i > 1) { + cell.className += "col"; + } else { + + } + }); + + + //show all cards + document.querySelectorAll('.card').forEach((card, i) => { + card.style.display = 'block'; + }); + + //hide last 2 cells + let cells = document.querySelectorAll('.show_input '); + cells = Array.prototype.slice.call(cells, -2); + cells.forEach((cell, i) => { + cell.style.display = 'none'; + }); + + document.querySelectorAll('.code_folded').forEach((card, i) => { + //if col in className of card + if (card.className.includes('col')) { + card.style.display = 'none'; + } + }); + + + cells = document.querySelectorAll('.code_folded '); + cells = Array.prototype.slice.call(cells, -2); + + cells.forEach((cell, i) => { + cell.querySelector('.cm-editor').style.background = 'transparent'; + + cell.style.display = 'inline-block'; + cell.style.verticalAlign = 'top'; + cell.style.width = '30vw'; + cell.style.maxWidth = '30vw'; + cell.style.height = '50vh'; + cell.style.margin = '2.5%'; + cell.style.textAlign = 'start'; + + cell.style.background = 'rgba(217, 147, 232, 0.1)'; + cell.style.borderRadius = '16px'; + cell.style.boxShadow = '0 4px 30px rgba(0, 0, 0, 0.1)'; + + cell.style.padding = '20px 20px 20px 20px'; + + //find element pluto-trafficlight + cell.querySelector('pluto-trafficlight').style.display = 'none'; + + let log_container = cell.querySelector('pluto-logs-container'); + if (log_container != null) { + log_container.style.display = 'transparent'; + } + + //remove pluto-log-icon + let log_icon = cell.querySelector('pluto-log-icon'); + if (log_icon != null) { + log_icon.style.display = 'none'; + } + + //find class=Stdout and change style + let stdout = cell.querySelector('pluto-log-dot') + if (stdout != null) { + stdout.style.background = 'transparent'; + stdout.style.border = '2px solid #FFFFFF'; + } + + let rich_output = cell.querySelector('pluto-output'); + if (rich_output != null) { + rich_output.style.borderRadius = '16px'; + rich_output.style.background = 'black'; + } + + + }); + + let p_nb = document.getElementsByTagName('pluto-notebook')[0]; + p_nb.style.marginTop = '31vh'; + p_nb.style.marginLeft = '20vw'; + p_nb.style.marginRight = '-25vw'; + p_nb.style.backgroundColor = 'transparent'; +} \ No newline at end of file diff --git a/MINDFulPluto/src/static/scripts/TSParticlesConfig.js b/MINDFulPluto/src/static/scripts/TSParticlesConfig.js new file mode 100644 index 0000000..569edc0 --- /dev/null +++ b/MINDFulPluto/src/static/scripts/TSParticlesConfig.js @@ -0,0 +1,214 @@ +function sleep(time) { + return new Promise((resolve) => setTimeout(resolve, time)); +} + +let load_tsparticles = async () => { + await loadLinksPreset(tsParticles); + + await tsParticles.load("tsparticles", { + fullScreen: { + enable: true, + zIndex: -10 + }, + particles: { + number: { + density: { + enable: true, + width: 1920, + height: 1080 + }, + "limit": 0, + "value": 100 + }, + size: { + value: 4, + }, + opacity: { + random: { + enable: true, + minimumValue: 0.3 + }, + value: { + min: 0.3, + max: 0.8 + }, + animation: { + count: 0, + enable: true, + speed: 0.5, + decay: 0, + delay: 0, + sync: false, + mode: "auto", + startValue: "random", + destroy: "none", + minimumValue: 0.3 + } + }, + color: { + value: "#f399ff", + }, + links: { + color: "#f399ff", + distance: 200, + enable: true, + opacity: 0.8, + width: 2, + + }, + + move: { + angle: { + offset: 0, + value: 90 + }, + attract: { + distance: 200, + enable: true, + rotate: { + x: 3000, + y: 3000 + } + }, + center: { + x: 50, + y: 50, + mode: "percent", + radius: 0 + }, + decay: 0, + distance: {}, + direction: "none", + drift: 0, + enable: true, + gravity: { + acceleration: 9.81, + enable: false, + inverse: false, + maxSpeed: 50 + }, + path: { + clamp: true, + delay: { + random: { + enable: false, + minimumValue: 0 + }, + value: 0 + }, + enable: false, + options: {} + }, + outModes: { + default: "out", + bottom: "out", + left: "out", + right: "out", + top: "out" + }, + random: false, + size: false, + speed: 2, + spin: { + acceleration: 0, + enable: false + }, + straight: false, + trail: { + enable: false, + length: 10, + fill: {} + }, + vibrate: false, + warp: false + } + + }, + + interactivity: { + detectsOn: "window", + events: { + onHover: { + enable: true, + mode: "grab", + parallax: { + enable: true, + force: 2, + smooth: 10 + } + } + }, + modes: { + grab: { + distance: 150, + links: { + blink: false, + consent: false, + opacity: 1 + } + }, + } + }, + preset: "links", + }); +}; + + +const tsparticlesWrapper = async () => { + //check if tsParticles div is already there + if (document.getElementById("tsparticles") !== null) { + return; + } + + while (true) { + try { + await load_tsparticles(); + break; + } + catch (e) { + //console.log(e); + + if (e instanceof TypeError) { + console.log("TypeError, loading tsparticles again!"); + + let body = document.getElementsByTagName("body")[0]; + + //get src of scripts + src = []; + for (let i = 0; i < body.getElementsByTagName("script").length; i++) { + // if tsparticles in src + if (body.getElementsByTagName("script")[i].src.includes("tsparticles")) { + body.removeChild(body.getElementsByTagName("script")[i]);; + } + } + + body = document.querySelector("body"); + + let scripts = ["https://cdn.jsdelivr.net/npm/tsparticles-engine@2/tsparticles.engine.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-basic@2/tsparticles.basic.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-interaction-particles-links@2/tsparticles.interaction.particles.links.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-move-base@2/tsparticles.move.base.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-shape-circle@2/tsparticles.shape.circle.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-updater-color@2/tsparticles.updater.color.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-updater-opacity@2/tsparticles.updater.opacity.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-updater-out-modes@2/tsparticles.updater.out-modes.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-updater-size@2/tsparticles.updater.size.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-preset-triangles@2/tsparticles.preset.triangles.min.js", + "https://cdn.jsdelivr.net/npm/tsparticles-preset-links@2/tsparticles.preset.links.min.js"]; + + scripts.forEach((script, i) => { + script = document.createElement("script"); + script.src = scripts[i]; + body.appendChild(script); + }); + } + + + + await sleep(100); + + } + } +}; + + diff --git a/MINDFulPluto/src/static/scripts/Toasts.js b/MINDFulPluto/src/static/scripts/Toasts.js new file mode 100644 index 0000000..3921f41 --- /dev/null +++ b/MINDFulPluto/src/static/scripts/Toasts.js @@ -0,0 +1,65 @@ +function add_toast_to_div(heading, message) { + let random_id_string = Math.floor(Math.random() * 10000).toString(36); + console.log(random_id_string) + const toastHTML = ` + + `; + + const toastContainer = document.getElementById("toast_container"); + toastContainer.innerHTML = toastHTML + toastContainer.innerHTML; + + let toast = new bootstrap.Toast(document.getElementById(random_id_string)); + toast.show(); + + jQuery(document).ready(function($) { + $(`#${random_id_string}`).on('shown.bs.toast', function() { + $(`#${random_id_string} > .progress > .progress-bar`).each(function(i) { + // Todo: Create time variable from Toast + let displayTime = $('.toast').attr('data-bs-delay'); + $(this).animate({ + width: $(this).attr('aria-valuenow') + '%' + }); + $(this).css({ + webkittransition: 'width '+displayTime+'ms ease-in-out', + moztransition: 'width '+displayTime+'ms ease-in-out', + otransition: 'width '+displayTime+'ms ease-in-out', + transition: 'width '+displayTime+'ms ease-in-out' + }); + // $(this).prop('Counter', 0).animate({ + // Counter: $(this).attr('aria-valuenow') + // }, { + // duration: 8000, + // step: function(now) { + // $(this).closest(".toast") + // .find(".progressbar-number") + // .text(Math.ceil(now)); + // } + // }); + }); + }); + }) + + setTimeout(function () { + let toast = new bootstrap.Toast(document.getElementById(random_id_string)); + toast.dispose(); + + setTimeout(function () { + toastContainer.removeChild(document.getElementById(random_id_string)); + }, 100); + + }, parseInt($('.toast').attr('data-bs-delay'), 10) + 400); + +} \ No newline at end of file diff --git a/MINDFulPluto/src/static/scripts/UpdateCommandCell.js b/MINDFulPluto/src/static/scripts/UpdateCommandCell.js new file mode 100644 index 0000000..5445b9b --- /dev/null +++ b/MINDFulPluto/src/static/scripts/UpdateCommandCell.js @@ -0,0 +1,8 @@ +function sendIntentCommand(command) { + const intentCommandTextField = document.getElementById('intentCommandTextField'); + + intentCommandTextField.value = command; + intentCommandTextField.dispatchEvent(new CustomEvent("input")); + + console.log("Sent intent command: " + command); +} \ No newline at end of file diff --git a/MINDFulPluto/src/static/scripts/UpdateIntentTable.js b/MINDFulPluto/src/static/scripts/UpdateIntentTable.js new file mode 100644 index 0000000..81f150e --- /dev/null +++ b/MINDFulPluto/src/static/scripts/UpdateIntentTable.js @@ -0,0 +1,261 @@ +function updateIntentTable(intent_names, intent_configs, intent_toplogies, intent_states) { + const buttonStates = { + "uncompiled": { + "remove": "", + "compile": "", + "uncompile": "disabled", + "install": "disabled", + "uninstall": "disabled" + }, + "compiled": { + "remove": "disabled", + "compile": "disabled", + "uncompile": "", + "install": "", + "uninstall": "disabled" + }, + "installed": { + "remove": "disabled", + "compile": "disabled", + "uncompile": "disabled", + "install": "disabled", + "uninstall": "" + } + } + + + + //find intent list + let intent_list = document.querySelector("#intent_selection_select"); + + //find out which option was selected in intent_list + let selected_value = intent_list.value; + + //clear intent list except first option + while (intent_list.options.length > 1) { + intent_list.remove(1); + } + + //add intents to intent list + intent_names.forEach((intent, i) => { + let option = document.createElement("option"); + option.value = intent; + option.innerHTML = intent; + //check if intent was selected + if (selected_value != undefined) { + if (selected_value == intent) { + option.selected = true; + } + } + intent_list.appendChild(option); + }); + console.log("updated intent list with selected intent: " + selected_value); + + //---------update intent-table--------- + + console.log(intent_states); + let intent_table = document.querySelector(".table > tbody"); + + //clear all except first one + while (intent_table.childElementCount > 0) { + intent_table.removeChild(intent_table.lastChild); + } + + //add new for each intent + intent_names.forEach((intent_name, index) => { + let new_row = document.createElement("tr"); + new_row.innerHTML = ` + ${index + 1} + ${intent_name} + ${intent_toplogies[index]} + ${intent_configs[index]} + ${intent_states[index]} + + + + + + + + `; + intent_table.appendChild(new_row); + }); + + +} + +function updateDomainListJS(domain_names) { + console.log(domain_names) + //find domain list + let domain_lists = document.querySelectorAll(".domain_selection_select"); + + //for each domain list + domain_lists.forEach((domain_list, j) => { + //find out which option was selected in domain_list + let selected_value = domain_list.value; + + + //clear domain list except first option + while (domain_list.options.length > 1) { + domain_list.remove(1); + } + + + //add domains to domain list + + domain_names.forEach((domain, i) => { + let option = document.createElement("option"); + option.value = domain; + option.innerHTML = domain; + //check if domain was selected + if (selected_value != undefined) { + if (selected_value == domain) { + option.selected = true; + } + } + + domain_list.appendChild(option); + + }); + }); + + //reset domain list to first option + domain_lists.forEach((domain_list, j) => { + domain_list.value = domain_list.options[0].value; + }); + + + add_toast_to_div('MINDFulPluto.jl', 'Topology loaded.') +} + +function updateNodeListJS(nodes, nodeNumber) { + console.log(nodes) + //find node list + let node_list = document.querySelector(`.node_selection_select_${nodeNumber}`); + + + //find out which option was selected in node_list + let selected_value = node_list.value; + + + //clear node list except first option + while (node_list.options.length > 1) { + node_list.remove(1); + } + + + //add nodes to node list + + nodes.forEach((node, i) => { + let option = document.createElement("option"); + option.value = node; + option.innerHTML = node; + //check if node was selected + if (selected_value != undefined) { + if (selected_value == node) { + option.selected = true; + } + } + + node_list.appendChild(option); + + }); +} + +function updateDomainDrawingList(domains) { + const domainDrawingList = document.querySelector("#domain_drawing_select"); + + while (domainDrawingList.options.length > 1) { + domainDrawingList.remove(1); + } + + domains.forEach((domain, i) => { + let option = document.createElement("option"); + option.value = domain; + option.innerHTML = domain; + domainDrawingList.appendChild(option); + }); +} + +function updateButtonAvailabilities() { + const domain1 = document.querySelector("#domain_selection_1"); + const domain2 = document.querySelector("#domain_selection_2"); + const node1 = document.querySelector("#node_selection_1"); + const node2 = document.querySelector("#node_selection_2"); + const topology = document.querySelector("#topology_select"); + + const intentSelection = document.querySelector("#intent_selection_select"); + const plottingType = document.querySelector("#plot_selection_select"); + const position = document.querySelector("#wanted_pos_select"); + const domainDrawing = document.querySelector("#domain_drawing_select"); + + //if all selected indexes are not 0, enable create_intent button + if (domain1.selectedIndex != 0 && domain2.selectedIndex != 0 && node1.selectedIndex != 0 && node2.selectedIndex != 0 && topology.selectedIndex != 0) { + document.querySelector("#create_intent").disabled = false; + } else { + document.querySelector("#create_intent").disabled = true; + } + + //if topology is selected, enable both domain buttons + if (topology.selectedIndex != 0) { + domain1.disabled = false; + domain2.disabled = false; + } else { + domain1.disabled = true; + domain2.disabled = true; + } + + //if domain1 is selected, enable node1 button + if (domain1.selectedIndex != 0) { + node1.disabled = false; + } else { + node1.disabled = true; + } + + //if domain2 is selected, enable node2 button + if (domain2.selectedIndex != 0) { + node2.disabled = false; + } else { + node2.disabled = true; + } + + //Drawing + + //if intentSelection, plottingType, position and domainDrawing are selected, enable draw_intent button + if (intentSelection.selectedIndex != 0 && plottingType.selectedIndex != 0 && position.selectedIndex != 0 && domainDrawing.selectedIndex != 0) { + document.querySelector("#draw_intent").disabled = false; + } else { + document.querySelector("#draw_intent").disabled = true; + } + + //if intentSelection is selected, enable plottingType + if (intentSelection.selectedIndex != 0) { + plottingType.disabled = false; + } else { + plottingType.disabled = true; + } + + //if plottingType is selected, enable domainDrawing + if (plottingType.selectedIndex != 0) { + domainDrawing.disabled = false; + } else { + domainDrawing.disabled = true; + } + + //if position is selected, enable remove button + if (position.selectedIndex != 0) { + document.querySelector("#remove_plot").disabled = false; + } else { + document.querySelector("#remove_plot").disabled = true; + } +} \ No newline at end of file diff --git a/Manifest.toml b/Manifest.toml new file mode 100644 index 0000000..1e70872 --- /dev/null +++ b/Manifest.toml @@ -0,0 +1,2012 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.1" +manifest_format = "2.0" +project_hash = "222b0e27afe33d3897c9ec4b74adb00311fe8574" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractLattices]] +git-tree-sha1 = "222ee9e50b98f51b5d78feb93dd928880df35f06" +uuid = "398f06c4-4d28-53ec-89ca-5b2656b7603d" +version = "0.3.0" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "c278dfab760520b8bb7e9511b968bf4ba38b7acc" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.2.3" + +[[deps.AbstractTrees]] +git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "0fb305e0253fd4e833d486914367a2ee2c2e78d0" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.0.1" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.Animations]] +deps = ["Colors"] +git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d" +uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" +version = "0.4.1" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.2.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "c5aeb516a84459e0318a02507d2261edad97eb75" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.7.1" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AttributeGraphs]] +deps = ["DocStringExtensions", "Graphs"] +git-tree-sha1 = "a92f0a56ce4faebcc8668d764a346be90bc5161f" +uuid = "d091dd56-f8c5-469d-b7f7-ff847498145f" +version = "0.3.0" + +[[deps.Automa]] +deps = ["PrecompileTools", "TranscodingStreams"] +git-tree-sha1 = "588e0d680ad1d7201d4c6a804dcb1cd9cba79fbb" +uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" +version = "1.0.3" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "f1f03a9fa24271160ed7e73051fba3c1a759b53f" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.4.0" + +[[deps.BitFlags]] +git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.8" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+1" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CRC32c]] +uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" + +[[deps.CRlibm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" +uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" +version = "1.0.1+0" + +[[deps.Cairo]] +deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] +git-tree-sha1 = "d0b3f8b4ad16cb0a2988c6788646a5e6a17b6b1b" +uuid = "159f3aea-2a34-519c-b102-8c37f9878175" +version = "1.0.5" + +[[deps.CairoMakie]] +deps = ["Base64", "Cairo", "Colors", "FFTW", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools", "SHA"] +git-tree-sha1 = "5e21a254d82c64b1a4ed9dbdc7e87c5d9cf4a686" +uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +version = "0.10.12" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.16.1+1" + +[[deps.Calculus]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" +uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" +version = "0.5.1" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "ad25e7d21ce10e01de973cdc68ad0f850a953c52" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.21.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "c0216e792f518b39b22212127d4a84dc31e4e386" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.3.5" + +[[deps.CodecBzip2]] +deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] +git-tree-sha1 = "9b1ca1aa6ce3f71b3d1840c538a8210a043625eb" +uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" +version = "0.8.2" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.4" + +[[deps.ColorBrewer]] +deps = ["Colors", "JSON", "Test"] +git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4" +uuid = "a2cac450-b92f-5266-8821-25eda20663c8" +version = "0.4.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.24.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "75bd5b6fc5089df449b5d35fa501c846c9b6549b" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.12.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.0+0" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "9c4708e3ed2b799e6124b5673a712dda0b596a9b" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.3.1" + +[[deps.Configurations]] +deps = ["ExproniconLite", "OrderedCollections", "TOML"] +git-tree-sha1 = "4358750bb58a3caefd5f37a4a0c5bfdbbf075252" +uuid = "5218b696-f38b-4ac9-8b61-a12ec717816d" +version = "0.17.6" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "c53fc348ca4d40d7b371e71fd52251839080cbc9" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.4" +weakdeps = ["IntervalSets", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "ac67408d9ddf207de5cfa9a97e114352430f01ed" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.16" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelaunayTriangulation]] +deps = ["DataStructures", "EnumX", "ExactPredicates", "Random", "SimpleGraphs"] +git-tree-sha1 = "d4e9dc4c6106b8d44e40cd4faf8261a678552c7c" +uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" +version = "0.8.12" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.Deno_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "cd6756e833c377e0ce9cd63fb97689a255f12323" +uuid = "04572ae6-984a-583e-9378-9577a1c2574d" +version = "1.33.4+0" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DiscreteEvents]] +deps = ["DataStructures", "Distributions", "Logging", "Random", "Unitful"] +git-tree-sha1 = "a88519499583312bd08da1c0304b6625eef7bf26" +uuid = "127e53a7-d08a-4bd9-afb0-daf0d2b65a85" +version = "0.3.5" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.11" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "7c302d7a5fec5214eb8a5a4c466dcf7a51fcf169" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.107" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.DualNumbers]] +deps = ["Calculus", "NaNMath", "SpecialFunctions"] +git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" +uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" +version = "0.6.8" + +[[deps.ECOS]] +deps = ["CEnum", "ECOS_jll", "MathOptInterface"] +git-tree-sha1 = "ea9f95d78d94af14e0f50973267c9c2209338079" +uuid = "e2685f51-7e38-5353-a97d-a921fd2c8199" +version = "1.1.2" + +[[deps.ECOS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "5f84034ddd642cf595e57d46ea2f085321c260e4" +uuid = "c2c64177-6a8e-5dca-99a7-64895ad7445f" +version = "200.0.800+0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.EnumX]] +git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.4" + +[[deps.ExactPredicates]] +deps = ["IntervalArithmetic", "Random", "StaticArrays"] +git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025" +uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" +version = "2.2.8" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.5.0+0" + +[[deps.ExpressionExplorer]] +git-tree-sha1 = "bce17cd0180a75eec637d6e3f8153011b8bdb25a" +uuid = "21656369-7473-754a-2065-74616d696c43" +version = "1.0.0" + +[[deps.ExproniconLite]] +git-tree-sha1 = "fbc390c2f896031db5484bc152a7e805ecdfb01f" +uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" +version = "0.10.5" + +[[deps.Extents]] +git-tree-sha1 = "2140cd04483da90b2da7f99b2add0750504fc39c" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.2" + +[[deps.EzXML]] +deps = ["Printf", "XML2_jll"] +git-tree-sha1 = "380053d61bb9064d6aa4a9777413b40429c79901" +uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615" +version = "1.2.0" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "ab3f7e1819dba9434a3a5126510c8fda3a4e7000" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "6.1.1+0" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.8.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "c5c28c245101bd59154f649e19b038d15901b5dc" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random"] +git-tree-sha1 = "5b93957f6dcd33fc343044af3d48c215be2562f1" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.9.3" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] +git-tree-sha1 = "73d1214fec245096717847c62d389a5d2ac86504" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.22.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType]] +deps = ["CEnum", "FreeType2_jll"] +git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" +uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" +version = "4.1.1" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.1+0" + +[[deps.FreeTypeAbstraction]] +deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] +git-tree-sha1 = "055626e1a35f6771fe99060e835b72ca61a52621" +uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" +version = "0.10.1" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.FuzzyCompletions]] +deps = ["REPL"] +git-tree-sha1 = "c8d37d615586bea181063613dccc555499feb298" +uuid = "fb4132e2-a121-4a70-b8a1-d5b831dcdcc2" +version = "0.5.3" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.6" + +[[deps.GeoInterface]] +deps = ["Extents"] +git-tree-sha1 = "d4f85701f569584f2cff7ba67a137d03f0cfb7d0" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.3.3" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "5694b56ccf9d15addedc35e9a4ba9c317721b788" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.10" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "e94c92c7bf4819685eb80186d51c43e71d4afa17" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.76.5+0" + +[[deps.GraphIO]] +deps = ["DelimitedFiles", "Graphs", "Requires", "SimpleTraits"] +git-tree-sha1 = "bc5b7609e9f4583f303a0ab2a7016ea318464da0" +uuid = "aa1b3936-2fda-51b9-ab35-c553d3a640a2" +version = "0.7.0" + + [deps.GraphIO.extensions] + GraphIODOTExt = "ParserCombinator" + GraphIOGEXFExt = "EzXML" + GraphIOGMLExt = "ParserCombinator" + GraphIOGraphMLExt = "EzXML" + GraphIOLGCompressedExt = "CodecZlib" + + [deps.GraphIO.weakdeps] + CodecZlib = "944b1d66-785c-5afd-91f1-9de20f533193" + EzXML = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615" + ParserCombinator = "fae87a5f-d1ad-5cf0-8f61-c941e1580b46" + +[[deps.GraphMakie]] +deps = ["DataStructures", "GeometryBasics", "Graphs", "LinearAlgebra", "Makie", "NetworkLayout", "PolynomialRoots", "SimpleTraits", "StaticArrays"] +git-tree-sha1 = "005289c1020e55641af09a38e95e098b7ba0ca18" +uuid = "1ecd5474-83a3-4783-bb4f-06765db800d2" +version = "0.5.6" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "899050ace26649433ef1af25bc17a815b3db52b7" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.9.0" + +[[deps.GridLayoutBase]] +deps = ["GeometryBasics", "InteractiveUtils", "Observables"] +git-tree-sha1 = "f57a64794b336d4990d90f80b147474b869b1bc4" +uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" +version = "0.9.2" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "ac7b73d562b8f4287c3b67b4c66a5395a19c1ae8" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.2" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[deps.HiGHS]] +deps = ["HiGHS_jll", "MathOptInterface", "PrecompileTools", "SparseArrays"] +git-tree-sha1 = "f869b0a17d1a4f13aac08af8d0a050bdb70bccfd" +uuid = "87dc4568-4c63-4d18-b0c0-bb2238e4078b" +version = "1.8.1" + +[[deps.HiGHS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "f596ee3668df8587158bcaef1ae47bf75bc0fe39" +uuid = "8fd58aa0-07eb-5a78-9b36-339c94fd15ea" +version = "1.6.0+1" + +[[deps.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.23" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.5" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "8b72179abc660bfab5e28472e019392b97d0985c" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.4" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.11" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.2" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.7" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.9" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3d09a9f60edf77f8a4d99f9e015e8fbf9989605d" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.7+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.4" + +[[deps.IntegerMathUtils]] +git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.2" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "5fdf2fe6724d8caabf43b557b84ce53f3b7e2f6b" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2024.0.2+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" +weakdeps = ["Unitful"] + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + +[[deps.IntervalArithmetic]] +deps = ["CRlibm_jll", "RoundingEmulator"] +git-tree-sha1 = "389ec5cd3bfbf4e747326515a20036a7e882bd44" +uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +version = "0.22.7" +weakdeps = ["DiffRules", "RecipesBase"] + + [deps.IntervalArithmetic.extensions] + IntervalArithmeticDiffRulesExt = "DiffRules" + IntervalArithmeticRecipesBaseExt = "RecipesBase" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.Isoband]] +deps = ["isoband_jll"] +git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "5ea6acdd53a51d897672edb694e3cc2912f3f8a7" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.46" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JSServe]] +deps = ["Base64", "CodecZlib", "Colors", "Dates", "Deno_jll", "HTTP", "Hyperscript", "LinearAlgebra", "Markdown", "MsgPack", "Observables", "RelocatableFolders", "SHA", "Sockets", "Tables", "ThreadPools", "URIs", "UUIDs", "WidgetsBase"] +git-tree-sha1 = "4bcf2a78f7c80c6f3d594267bb4e7ec03ac9c172" +uuid = "824d6782-a2ef-11e9-3a09-e5662e0c26f9" +version = "2.3.1" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.5" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "60b1194df0a3298f460063de985eae7b01bc011a" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.1+0" + +[[deps.JuMP]] +deps = ["LinearAlgebra", "MacroTools", "MathOptInterface", "MutableArithmetics", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays"] +git-tree-sha1 = "4e44cff1595c6c02cdbca4e87ce376e63c33a584" +uuid = "4076af6c-e467-56ae-b986-b466b2749572" +version = "1.20.0" + + [deps.JuMP.extensions] + JuMPDimensionalDataExt = "DimensionalData" + + [deps.JuMP.weakdeps] + DimensionalData = "0703355e-b756-11e9-17c0-8b28908087d0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "04663b9e1eb0d0eabf76a6d0752e0dac83d53b36" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.28" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "fee018a29b60733876eb557804b5b109dd3dd8a7" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.8" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.1+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "15.0.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.1+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.1" + +[[deps.LayeredLayouts]] +deps = ["Dates", "ECOS", "Graphs", "HiGHS", "IterTools", "JuMP", "Random"] +git-tree-sha1 = "4027b534d46d614e11a37ee33e46d9741e5a3367" +uuid = "f4a74d36-062a-4d48-97cd-1356bad1de4e" +version = "0.2.9" + +[[deps.LazilyInitializedFields]] +git-tree-sha1 = "8f7f3cabab0fd1800699663533b6d5cb3fc0e612" +uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" +version = "1.2.2" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.42.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.35.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LightXML]] +deps = ["Libdl", "XML2_jll"] +git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" +uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" +version = "0.9.1" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "7bbea35cec17305fc70a0e5b4641477dc0789d9d" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.2.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearAlgebraX]] +deps = ["LinearAlgebra", "Mods", "Primes", "SimplePolynomials"] +git-tree-sha1 = "d76cec8007ec123c2b681269d40f94b053473fcf" +uuid = "9b3f67b0-2d00-526e-9884-9e4938f8fb88" +version = "0.2.7" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.27" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.3" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "20ce1091ba18bcdae71ad9b71ee2367796ba6c48" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.4.4" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MINDFul]] +deps = ["AbstractTrees", "Distances", "DocStringExtensions", "Graphs", "IterTools", "MetaGraphs", "MetaGraphsNext", "NestedGraphs", "UUIDs", "Unitful"] +git-tree-sha1 = "d1d78e99eb0add724e61efa306805bcaaac0c9a5" +uuid = "437ce7a4-cd80-4539-9a29-b274cfe157d6" +version = "0.2.2" + +[[deps.MINDFulCompanion]] +deps = ["AttributeGraphs", "DocStringExtensions", "Graphs", "MINDFul", "MetaGraphs", "MetaGraphsNext", "NestedGraphs", "UUIDs", "Unitful", "WrappedMultiGraphs"] +git-tree-sha1 = "630accd766a9a01ffe25103597e62e6de86fdab7" +repo-rev = "main" +repo-url = "https://github.com/UniStuttgart-IKR/MINDFulCompanion.jl" +uuid = "51b1db7e-1a2e-4318-af53-61c13e101964" +version = "0.1.0" + +[[deps.MINDFulMakie]] +deps = ["AbstractTrees", "Colors", "DocStringExtensions", "GraphMakie", "Graphs", "LayeredLayouts", "MINDFul", "Makie", "MetaGraphs", "MetaGraphsNext", "NestedGraphMakie", "NestedGraphs", "NetworkLayout", "UUIDs"] +git-tree-sha1 = "9cefb28ade5a959bf66b96d4b1daf0eb13875078" +uuid = "23b02573-35f2-499b-a490-fd32d1f018b6" +version = "0.1.0" + +[[deps.MINDFulPluto]] +deps = ["GraphIO", "Graphs", "HypertextLiteral", "Logging", "MINDFul", "MINDFulMakie", "MetaGraphs", "NestedGraphs", "NestedGraphsIO", "Pluto", "PlutoUI", "PrecompileTools", "Revise", "Unitful", "WGLMakie"] +git-tree-sha1 = "0c3b025fc10b060f0e1017da2d117558fd66db80" +repo-rev = "main" +repo-url = "https://github.com/UniStuttgart-IKR/MINDFulPluto.jl" +uuid = "2169b6f5-785b-460d-ad6a-2192ac02d426" +version = "0.1.3" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "72dc3cf284559eb8f53aa593fe62cb33f83ed0c0" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2024.0.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.Makie]] +deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FixedPointNumbers", "Formatting", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Setfield", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "StableHashTraits", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun"] +git-tree-sha1 = "35fa3c150cd96fd77417a23965b7037b90d6ffc9" +uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" +version = "0.19.12" + +[[deps.MakieCore]] +deps = ["Observables", "REPL"] +git-tree-sha1 = "9b11acd07f21c4d035bd4156e789532e8ee2cc70" +uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" +version = "0.6.9" + +[[deps.Malt]] +deps = ["Distributed", "Logging", "RelocatableFolders", "Serialization", "Sockets"] +git-tree-sha1 = "18cf4151e390fce29ca846b92b06baf9bc6e002e" +uuid = "36869731-bdee-424d-aa32-cab38c994e3b" +version = "1.1.1" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MathOptInterface]] +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"] +git-tree-sha1 = "569a003f93d7c64068d3afaab908d21f67a22cd5" +uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +version = "1.25.3" + +[[deps.MathTeXEngine]] +deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] +git-tree-sha1 = "96ca8a313eb6437db5ffe946c457a401bbb8ce1d" +uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" +version = "0.5.7" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+1" + +[[deps.MetaGraphs]] +deps = ["Graphs", "JLD2", "Random"] +git-tree-sha1 = "1130dbe1d5276cb656f6e1094ce97466ed700e5a" +uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" +version = "0.7.2" + +[[deps.MetaGraphsNext]] +deps = ["Graphs", "JLD2", "SimpleTraits"] +git-tree-sha1 = "500e526a1f76b73ab7522f9580f86abef895de68" +uuid = "fa8bd995-216d-47f1-8a91-f3b68fbeb377" +version = "0.5.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.1.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.Mods]] +git-tree-sha1 = "924f962b524a71eef7a21dae1e6853817f9b658f" +uuid = "7475f97c-0381-53b1-977b-4c60186c8d62" +version = "2.2.4" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + +[[deps.MsgPack]] +deps = ["Serialization"] +git-tree-sha1 = "f5db02ae992c260e4826fe78c942954b48e1d9c2" +uuid = "99f44e22-a591-53d1-9472-aa23ef4bd671" +version = "1.2.1" + +[[deps.MultiKDE]] +deps = ["Distributions"] +git-tree-sha1 = "8a48220d6d724d2b2bf3aaa95384eade42905031" +uuid = "77543b7f-bd95-4024-91c1-46775346e0e7" +version = "0.1.1" + +[[deps.Multisets]] +git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" +uuid = "3b2b4ff1-bcff-5658-a3ee-dbcf1ce5ac09" +version = "0.4.4" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "302fd161eb1c439e4115b51ae456da4e9984f130" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.4.1" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.3" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NestedGraphMakie]] +deps = ["Colors", "DocStringExtensions", "GraphMakie", "Graphs", "Makie", "MultiKDE", "NestedGraphs", "NetworkLayout"] +git-tree-sha1 = "1d8d40cf44daa8d9f7d07465b1b6d4dea07ad880" +uuid = "6f6f4c20-e954-4c6d-a185-c2fbf890196e" +version = "0.1.2" + +[[deps.NestedGraphs]] +deps = ["AbstractTrees", "DocStringExtensions", "Graphs", "SimpleTraits"] +git-tree-sha1 = "516b6c63e1cbebbf40d4d4bdc7f01a78491ab3fc" +uuid = "03c36417-ddab-428a-818d-5359aee292ef" +version = "0.2.2" +weakdeps = ["AttributeGraphs", "MetaGraphs"] + + [deps.NestedGraphs.extensions] + NestedGraphsAttributeGraphsExt = "AttributeGraphs" + NestedGraphsMetaGraphsExt = "MetaGraphs" + +[[deps.NestedGraphsIO]] +deps = ["DocStringExtensions", "EzXML", "GraphIO", "Graphs", "MetaGraphs", "NestedGraphs"] +git-tree-sha1 = "b201d5df422f63d413d47428afaa8cfc02365782" +repo-rev = "main" +repo-url = "https://github.com/UniStuttgart-IKR/NestedGraphsIO.jl" +uuid = "4bcdce80-1129-4e34-b1b9-f101712b434d" +version = "0.1.0" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkLayout]] +deps = ["GeometryBasics", "LinearAlgebra", "Random", "Requires", "StaticArrays"] +git-tree-sha1 = "91bb2fedff8e43793650e7a677ccda6e6e6e166b" +uuid = "46757867-2c16-5918-afeb-47bfcb05e46a" +version = "0.4.6" +weakdeps = ["Graphs"] + + [deps.NetworkLayout.extensions] + NetworkLayoutGraphsExt = "Graphs" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Observables]] +git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.5" + +[[deps.OffsetArrays]] +git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.13.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+4" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.4+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "51901a49222b09e3743c65b8847687ae5fc78eb2" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.13+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Optim]] +deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "MathOptInterface", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "d024bfb56144d947d4fafcd9cb5cafbe3410b133" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.9.2" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.3" + +[[deps.Packing]] +deps = ["GeometryBasics"] +git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501" +uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" +version = "0.5.0" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4745216e94f71cb768d58330b059c9b76f32cb66" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.50.14+0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Permutations]] +deps = ["Combinatorics", "LinearAlgebra", "Random"] +git-tree-sha1 = "eb3f9df2457819bf0a9019bd93cc451697a0751e" +uuid = "2ae35dd2-176d-5d53-8349-f30d82d94d4f" +version = "0.4.20" + +[[deps.PikaParser]] +deps = ["DocStringExtensions"] +git-tree-sha1 = "d6ff87de27ff3082131f31a714d25ab6d0a88abf" +uuid = "3bbf5609-3e7b-44cd-8549-7c69f321e792" +version = "0.6.1" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.42.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "862942baf5663da528f66d24996eb6da85218e76" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.0" + +[[deps.Pluto]] +deps = ["Base64", "Configurations", "Dates", "Downloads", "ExpressionExplorer", "FileWatching", "FuzzyCompletions", "HTTP", "HypertextLiteral", "InteractiveUtils", "Logging", "LoggingExtras", "MIMEs", "Malt", "Markdown", "MsgPack", "Pkg", "PrecompileSignatures", "PrecompileTools", "REPL", "RegistryInstances", "RelocatableFolders", "Scratch", "Sockets", "TOML", "Tables", "URIs", "UUIDs"] +git-tree-sha1 = "449f468cbb80c3eec6e6d8443a0913d8bbad4d0d" +uuid = "c3e4b0f8-55cb-11ea-2926-15256bba5781" +version = "0.19.38" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "211cdf570992b0d977fda3745f72772e0d5423f2" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.56" + +[[deps.PolygonOps]] +git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +uuid = "647866c9-e3ac-4575-94e7-e3d426903924" +version = "0.1.2" + +[[deps.PolynomialRoots]] +git-tree-sha1 = "5f807b5345093487f733e520a1b7395ee9324825" +uuid = "3a141323-8675-5d76-9d11-e1df1406c778" +version = "1.0.0" + +[[deps.Polynomials]] +deps = ["LinearAlgebra", "RecipesBase", "Setfield", "SparseArrays"] +git-tree-sha1 = "a9c7a523d5ed375be3983db190f6a5874ae9286d" +uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" +version = "4.0.6" +weakdeps = ["ChainRulesCore", "FFTW", "MakieCore", "MutableArithmetics"] + + [deps.Polynomials.extensions] + PolynomialsChainRulesCoreExt = "ChainRulesCore" + PolynomialsFFTWExt = "FFTW" + PolynomialsMakieCoreExt = "MakieCore" + PolynomialsMutableArithmeticsExt = "MutableArithmetics" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PrecompileSignatures]] +git-tree-sha1 = "18ef344185f25ee9d51d80e179f8dad33dc48eb1" +uuid = "91cefc8d-f054-46dc-8f8c-26e11d7c5411" +version = "3.0.3" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.0" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.1" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "1d05623b5952aed1307bf8b43bec8b8d1ef94b6e" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.5" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "00099623ffee15972c16111bcf84c58a0051257c" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.9.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.9.4" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RegistryInstances]] +deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] +git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" +uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" +version = "0.1.0" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "3fe4e5b9cdbb9bbc851c57b149e516acc07f8f72" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.5.13" + +[[deps.RingLists]] +deps = ["Random"] +git-tree-sha1 = "f39da63aa6d2d88e0c1bd20ed6a3ff9ea7171ada" +uuid = "286e9d63-9694-5540-9e3c-4e6708fa07b2" +version = "0.2.8" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.1" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.4.0+0" + +[[deps.RoundingEmulator]] +git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" +uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" +version = "0.2.1" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.ShaderAbstractions]] +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8" +uuid = "65257c39-d410-5151-9873-9b3e5be5013e" +version = "0.4.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SignedDistanceFields]] +deps = ["Random", "Statistics", "Test"] +git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" +version = "0.4.0" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SimpleGraphs]] +deps = ["AbstractLattices", "Combinatorics", "DataStructures", "IterTools", "LightXML", "LinearAlgebra", "LinearAlgebraX", "Optim", "Primes", "Random", "RingLists", "SimplePartitions", "SimplePolynomials", "SimpleRandom", "SparseArrays", "Statistics"] +git-tree-sha1 = "f65caa24a622f985cc341de81d3f9744435d0d0f" +uuid = "55797a34-41de-5266-9ec1-32ac4eb504d3" +version = "0.8.6" + +[[deps.SimplePartitions]] +deps = ["AbstractLattices", "DataStructures", "Permutations"] +git-tree-sha1 = "e9330391d04241eafdc358713b48396619c83bcb" +uuid = "ec83eff0-a5b5-5643-ae32-5cbf6eedec9d" +version = "0.3.1" + +[[deps.SimplePolynomials]] +deps = ["Mods", "Multisets", "Polynomials", "Primes"] +git-tree-sha1 = "7063828369cafa93f3187b3d0159f05582011405" +uuid = "cc47b68c-3164-5771-a705-2bc0097375a0" +version = "0.2.17" + +[[deps.SimpleRandom]] +deps = ["Distributions", "LinearAlgebra", "Random"] +git-tree-sha1 = "3a6fb395e37afab81aeea85bae48a4db5cd7244a" +uuid = "a6525b86-64cd-54fa-8f65-62fc48bdc0e8" +version = "0.3.1" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.3.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StableHashTraits]] +deps = ["Compat", "PikaParser", "SHA", "Tables", "TupleTools"] +git-tree-sha1 = "10dc702932fe05a0e09b8e5955f00794ea1e8b12" +uuid = "c5dd0088-6c3f-4803-b00e-f31a60c170fa" +version = "1.1.8" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "7b0e9c14c624e435076d19aea1e5cbdec2b9ca37" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.2" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.2" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.1" + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + + [deps.StatsFuns.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.StructArrays]] +deps = ["Adapt", "ConstructionBase", "DataAPI", "GPUArraysCore", "StaticArraysCore", "Tables"] +git-tree-sha1 = "1b0b1205a56dc288b71b1961d48e351520702e24" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.17" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.11.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadPools]] +deps = ["Printf", "RecipesBase", "Statistics"] +git-tree-sha1 = "50cb5f85d5646bc1422aa0238aa5bfca99ca9ae7" +uuid = "b189fb0b-2eb5-4ed4-bc0c-d34c51242431" +version = "2.1.1" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "34cc045dd0aaa59b8bbe86c644679bc57f1d5bd0" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.8" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "54194d92959d8ebaa8e26227dbe3cdefcdcd594f" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.10.3" +weakdeps = ["Random", "Test"] + + [deps.TranscodingStreams.extensions] + TestExt = ["Test", "Random"] + +[[deps.Tricks]] +git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.8" + +[[deps.TriplotBase]] +git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +uuid = "981d1d27-644d-49a2-9326-4793e63143c3" +version = "0.1.0" + +[[deps.TupleTools]] +git-tree-sha1 = "41d61b1c545b06279871ef1a4b5fcb2cac2191cd" +uuid = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" +version = "1.5.0" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "3c793be6df9dd77a0cf49d80984ef9ff996948fa" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.19.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.WGLMakie]] +deps = ["Colors", "FileIO", "FreeTypeAbstraction", "GeometryBasics", "Hyperscript", "JSServe", "LinearAlgebra", "Makie", "Observables", "PNGFiles", "PrecompileTools", "RelocatableFolders", "ShaderAbstractions", "StaticArrays"] +git-tree-sha1 = "2328be9950072c7250d340798b25222779ce55bb" +uuid = "276b4fcb-3e11-5398-bf8b-a0c2d153d008" +version = "0.8.16" + +[[deps.WidgetsBase]] +deps = ["Observables"] +git-tree-sha1 = "30a1d631eb06e8c868c559599f915a62d55c2601" +uuid = "eead4739-05f7-45a1-878c-cee36b57321c" +version = "0.1.4" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + +[[deps.WrappedMultiGraphs]] +deps = ["DocStringExtensions", "Graphs", "LinearAlgebra"] +git-tree-sha1 = "88de3088e29d97e2cd3c1f4a6e71f3754e338c64" +uuid = "2815cbbd-0d7d-431b-a8da-1940906b5714" +version = "0.1.0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "801cbe47eae69adc50f36c3caec4758d2650741b" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.12.2+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.4+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.10+4" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.15.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.isoband_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" +version = "0.2.3+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+1" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "873b4f805771d3e4bafe63af759a26ea8ca84d14" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.42+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" diff --git a/Project.toml b/Project.toml new file mode 100644 index 0000000..0fe7ab1 --- /dev/null +++ b/Project.toml @@ -0,0 +1,33 @@ +[deps] +AbstractPlutoDingetjes = "6e696c72-6542-2067-7265-42206c756150" +AttributeGraphs = "d091dd56-f8c5-469d-b7f7-ff847498145f" +CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +DiscreteEvents = "127e53a7-d08a-4bd9-afb0-daf0d2b65a85" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +GraphIO = "aa1b3936-2fda-51b9-ab35-c553d3a640a2" +GraphMakie = "1ecd5474-83a3-4783-bb4f-06765db800d2" +Graphs = "86223c79-3864-5bf0-83f7-82e725a168b6" +HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" +MINDFul = "437ce7a4-cd80-4539-9a29-b274cfe157d6" +MINDFulCompanion = "51b1db7e-1a2e-4318-af53-61c13e101964" +MINDFulMakie = "23b02573-35f2-499b-a490-fd32d1f018b6" +MINDFulPluto = "2169b6f5-785b-460d-ad6a-2192ac02d426" +MetaGraphs = "626554b9-1ddb-594c-aa3c-2596fe9399a5" +NestedGraphMakie = "6f6f4c20-e954-4c6d-a185-c2fbf890196e" +NestedGraphs = "03c36417-ddab-428a-818d-5359aee292ef" +NestedGraphsIO = "4bcdce80-1129-4e34-b1b9-f101712b434d" +Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" +WGLMakie = "276b4fcb-3e11-5398-bf8b-a0c2d153d008" + +[compat] +MINDFulPluto = ">=0.1.0" +GraphMakie = "0.5.5" +MINDFul = "0.2" +NestedGraphMakie = "0.1" +julia = "1.9, 1.10" diff --git a/README.md b/README.md new file mode 100644 index 0000000..0c90a87 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# MINDFulNotebookExamples + +This is a repository containing some notebook examples for [MINDFul.jl](https://github.com/UniStuttgart-IKR/MINDFul.jl) + +See the github pages deployment of this repository: + +https://unistuttgart-ikr.github.io/MINDFulNotebookExamples.jl/ + +`Manifest.toml` is checked in since some still unregistered repositories are required: +- MINDFulCompanion + - still unregisted +- NestedGraphsIO https://github.com/UniStuttgart-IKR/NestedGraphsIO.jl#main + - will eventually be integrated in GraphIO.jl https://github.com/JuliaGraphs/GraphIO.jl/pull/55 + +You can `Pkg.instantiate()` to replicate the environment to a guaranteed working version. +With time, the `Manifest.toml` will not be needed, either because everything will be in the public registry or because of https://github.com/JuliaLang/Pkg.jl/issues/492. + +To run the notebooks +- clone this repository and retrieve the environemnt +- execute `Pkg.instantiate()` to replicate the environment +- start Pluto.jl from your general environment +- open the desired notebook + +## JuliaCon 2024 (proposal) +The work on the `plutodash.jl` notebook is relevant to an applied JuliaCon2024 talk. +Refinements will happen in the following months and prior to the conference. diff --git a/data/4nets.graphml b/data/4nets.graphml new file mode 100644 index 0000000..958ddad --- /dev/null +++ b/data/4nets.graphml @@ -0,0 +1,326 @@ + + + + + + + 320 + + + true + + + + + + + + 0.0 + 0.0 + 11 + + + 4.0 + 5.0 + 12 + + + 10.0 + -2.0 + 13 + + + 5.0 + -10.0 + 14 + + + + + + + + + + + + + + + + + + + + + 15.0 + 2.0 + 21 + + + 20.0 + 7.0 + 22 + + + 18.5 + -2.0 + 23 + + + 16.0 + -12.0 + 24 + + + 22.0 + -10.0 + 25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30.0 + 2.0 + 31 + + + 32.0 + -5.0 + 32 + + + 35.5 + -2.0 + 33 + + + 35.0 + -12.0 + 34 + + + + + + + + + + + + + + + + + + + + + 39.0 + -3.0 + 41 + + + 42.0 + -5.0 + 42 + + + 40.0 + -11.0 + 43 + + + + + + + + + + + + + + + + + + + + + + + + 27.0 + -20.0 + 51 + + + 24.0 + -25.0 + 52 + + + 28.0 + -23.0 + 53 + + + + + + + + + + + + + + + 34.0 + -23.0 + 61 + + + 35.0 + -26.0 + 62 + + + 40.0 + -24.0 + 63 + + + 40.0 + -20.0 + 63 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 21.0 + -16.0 + 51 + + + 22.0 + -20.0 + 52 + + + 15.0 + -17.0 + 53 + + + 16.0 + -22.0 + 54 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/nobel-germany-france-topzoo.graphml b/data/nobel-germany-france-topzoo.graphml new file mode 100644 index 0000000..01357c0 --- /dev/null +++ b/data/nobel-germany-france-topzoo.graphml @@ -0,0 +1,598 @@ + + + + + + 10 + + + + + 5 + + + 320 + + + true + + + + + + + + 8.66 + 50.14 + Frankfurt + 10 + + + 9.99 + 48.4 + Ulm + 10 + + + 9.12 + 48.73 + Stuttgart + 10 + + + 8.41 + 49.01 + Karlsruhe + 10 + + + 8.49 + 49.49 + Mannheim + 10 + + + 10.0 + 73.29863420512697 + + + 73.78923875460328 + + + 8.0 + 73.78923875460328 + + + 60.54772436363469 + + + 4.0 + 60.54772436363469 + + + 2.0 + 53.68849058591995 + + + 73.29863420512697 + + + 53.68849058591995 + + + + + + + 11.55 + 48.15 + Muenchen + 10 + + + 11.08 + 49.45 + Nuernberg + 10 + + + 148.5949428006042 + + + 6.0 + 148.5949428006042 + + + + + + + 7.0 + 51.44 + Essen + 10 + + + 7.48 + 51.51 + Dortmund + 10 + + + 6.78 + 51.22 + Duesseldorf + 10 + + + 7.01 + 50.92 + Koeln + 10 + + + 34.14303896179366 + + + 28.84561394790831 + + + 8.0 + 34.14303896179366 + + + 6.0 + 73.31881696624325 + + + 10.0 + 28.84561394790831 + + + 12.0 + 37.02761854643971 + + + 73.31881696624325 + + + 37.02761854643971 + + + + + + + 9.8 + 52.39 + Hannover + 10 + + + 10.08 + 53.55 + Hamburg + 10 + + + 7.21 + 53.6 + Norden + 10 + + + 8.8 + 53.08 + Bremen + 10 + + + 130.34153162994733 + + + 102.07547811577393 + + + 10.0 + 130.34153162994733 + + + 99.80427126712999 + + + 120.35574069858681 + + + 6.0 + 102.07547811577393 + + + 6.0 + 99.80427126712999 + + + 120.35574069858681 + + + + + + + 13.48 + 52.52 + Berlin + 10 + + + 12.38 + 51.34 + Leipzig + 10 + + + 151.3381958628939 + + + 14.0 + 151.3381958628939 + + + + + 262.4517079640682 + + + 249.74985488539141 + + + 186.6845930800721 + + + 10.0 + 212.14873577531685 + + + 14.0 + 262.4517079640682 + + + 10.0 + 189.88325955448033 + + + 12.0 + 145.33711284292391 + + + 18.0 + 293.7697710915307 + + + 254.52315503142052 + + + 233.11268283805643 + + + 8.0 + 249.74985488539141 + + + 8.0 + 254.52315503142052 + + + 6.0 + 118.74733626580577 + + + 118.74733626580577 + + + 189.88325955448033 + + + 6.0 + 163.63805711115788 + + + 229.46481449045197 + + + 163.63805711115788 + + + 6.0 + 186.6845930800721 + + + 233.11268283805643 + + + 145.33711284292391 + + + 212.14873577531685 + + + 293.7697710915307 + + + 6.0 + 229.46481449045197 + + + + + + + + + 44.83333 + -0.56667 + Bordeaux + + + 43.3 + -0.36667 + Pau + + + 47.91667 + 1.9 + Orleans + + + 45.83153 + 1.2578 + Limoges + + + 45.78333 + 3.08333 + Clermont-Ferrand + + + 47.31667 + 5.01667 + Dijon + + + 43.60426 + 1.44367 + Toulouse + + + 43.6 + 3.88333 + Montpellier + + + 47.25 + 6.03333 + Besancon + + + 43.7 + 5.75 + Cadarache + + + 43.3 + 5.4 + Marseille + + + 43.70313 + 7.26608 + Nice + + + 45.16667 + 5.71667 + Grenoble + + + 45.75 + 4.85 + Lyon + + + 48.85341 + 2.3488 + Paris + + + 42.3 + 9.15 + Corte + + + 47.21725 + -1.55336 + Nantes + + + 46.58333 + 0.33333 + Poiters + + + 48.58333 + 7.75 + Strasbourg + + + 48.68333 + 6.2 + Nancy + + + 49.25 + 4.03333 + Reims + + + 49.41794 + 2.82606 + Compiegne + + + 50.63333 + 3.06667 + Lille + + + 49.44313 + 1.09932 + Rouen + + + 49.18585 + -0.35912 + Caen + + + 48.08333 + -1.68333 + Rennes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/nobel-germany.graphml b/data/nobel-germany.graphml new file mode 100644 index 0000000..72d47ac --- /dev/null +++ b/data/nobel-germany.graphml @@ -0,0 +1,325 @@ + + + + + + + + + 5 + + + 320 + + + true + + + + + + + + 8.66 + 50.14 + Frankfurt + 10 + + + 9.99 + 48.4 + Ulm + 10 + + + 9.12 + 48.73 + Stuttgart + 10 + + + 8.41 + 49.01 + Karlsruhe + 10 + + + 8.49 + 49.49 + Mannheim + 10 + + + 10.0 + 73.29863420512697 + + + 73.78923875460328 + + + 8.0 + 73.78923875460328 + + + 60.54772436363469 + + + 4.0 + 60.54772436363469 + + + 2.0 + 53.68849058591995 + + + 73.29863420512697 + + + 53.68849058591995 + + + + + + + 11.55 + 48.15 + Muenchen + 10 + + + 11.08 + 49.45 + Nuernberg + 10 + + + 148.5949428006042 + + + 6.0 + 148.5949428006042 + + + + + + + 7.0 + 51.44 + Essen + 10 + + + 7.48 + 51.51 + Dortmund + 10 + + + 6.78 + 51.22 + Duesseldorf + 10 + + + 7.01 + 50.92 + Koeln + 10 + + + 34.14303896179366 + + + 28.84561394790831 + + + 8.0 + 34.14303896179366 + + + 6.0 + 73.31881696624325 + + + 10.0 + 28.84561394790831 + + + 12.0 + 37.02761854643971 + + + 73.31881696624325 + + + 37.02761854643971 + + + + + + + 9.8 + 52.39 + Hannover + 10 + + + 10.08 + 53.55 + Hamburg + 10 + + + 7.21 + 53.6 + Norden + 10 + + + 8.8 + 53.08 + Bremen + 10 + + + 130.34153162994733 + + + 102.07547811577393 + + + 10.0 + 130.34153162994733 + + + 99.80427126712999 + + + 120.35574069858681 + + + 6.0 + 102.07547811577393 + + + 6.0 + 99.80427126712999 + + + 120.35574069858681 + + + + + + + 13.48 + 52.52 + Berlin + 10 + + + 12.38 + 51.34 + Leipzig + 10 + + + 151.3381958628939 + + + 14.0 + 151.3381958628939 + + + + + 262.4517079640682 + + + 249.74985488539141 + + + 186.6845930800721 + + + 10.0 + 212.14873577531685 + + + 14.0 + 262.4517079640682 + + + 10.0 + 189.88325955448033 + + + 12.0 + 145.33711284292391 + + + 18.0 + 293.7697710915307 + + + 254.52315503142052 + + + 233.11268283805643 + + + 8.0 + 249.74985488539141 + + + 8.0 + 254.52315503142052 + + + 6.0 + 118.74733626580577 + + + 118.74733626580577 + + + 189.88325955448033 + + + 6.0 + 163.63805711115788 + + + 229.46481449045197 + + + 163.63805711115788 + + + 6.0 + 186.6845930800721 + + + 233.11268283805643 + + + 145.33711284292391 + + + 212.14873577531685 + + + 293.7697710915307 + + + 6.0 + 229.46481449045197 + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..f0c873f --- /dev/null +++ b/index.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + +

Notebooks

+ + + + diff --git a/intentDAGinMD.html b/intentDAGinMD.html new file mode 100644 index 0000000..8eab1e2 --- /dev/null +++ b/intentDAGinMD.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/intentDAGinMD.jl b/intentDAGinMD.jl new file mode 100644 index 0000000..6e45587 --- /dev/null +++ b/intentDAGinMD.jl @@ -0,0 +1,407 @@ +### A Pluto.jl notebook ### +# v0.19.26 + +using Markdown +using InteractiveUtils + +# ╔═╡ f5e6f716-e838-11ed-1bd2-8d3a022443c5 +import Pkg + +# ╔═╡ 2fbf420a-f944-4b33-b126-eb7010548795 +Pkg.activate(".") + +# ╔═╡ 179e6ac8-6fa2-406a-8020-da2828132fdf +using MINDFul, MINDFulCompanion + +# ╔═╡ 213c1c30-6f8a-4828-8e7a-45eb473822f5 +using GraphIO, NestedGraphsIO, NestedGraphs, Graphs, MetaGraphs, AttributeGraphs + +# ╔═╡ dcb30dbe-3583-436e-a46e-a32a2cf05387 +using CairoMakie, MINDFulMakie, PlutoUI + +# ╔═╡ 7573f72d-64e1-4d61-8d8e-2ca4c2bc3dee +using Random, Distributions, Unitful, UUIDs, StatsBase + +# ╔═╡ b528971a-f661-44ac-9066-403650f79001 +html""" + +""" + +# ╔═╡ ff58f7e6-d133-4393-a308-7b63707d460c +md"# Using Intent Directed Acyclic Graphs (DAGs) in Multi-Domain IP-Optical Networks + +This notebook contains a walkthrough of a design to adapt intent DAGs into multi-domain networks and an example. +The implementation can be found on the included packages. + +An intent DAG is an advanced technique that enables resource reuse via grooming in a centralized or non-centralized fashion. +Using hierarchical multi-step intent compilation (like intent trees or intent DAGs) and intent delegation fosters MD flexibility, promotes accountability, and respects confidentiality. +Intent DAGs can further increase interoperability and enable cross-domain grooming with border node optical bypass. + + +A related manuscript is at works and under review" + +# ╔═╡ 6d418df1-5d22-4b70-ae8d-bff52dcfdaa7 +const MINDF = MINDFul + +# ╔═╡ befbac6b-29dd-4457-8664-a6f2170c34fd +md"MINDFulCompanion.jl contains a heuristic grooming-enabled RMSA algorithm we are going to use here. The algorithm is inspired from: + +> V. Gkamas, K. Christodoulopoulos and E. Varvarigos, \"A Joint Multi-Layer Planning Algorithm for IP Over Flexible Optical Networks,\" in Journal of Lightwave Technology, vol. 33, no. 14, pp. 2965-2977, 15 July15, 2015, doi: 10.1109/JLT.2015.2424920. + +modified to use intent DAGs as described in: + +> F. Christou and A. Kirstädter, \"Grooming connectivity in-tents in ip-optical networks using directed acyclic graphs\", in (accepted) Photonic Networks; 24th ITG-Symposium, preprint in https://arxiv.org/abs/2304.09711, 2023. + +and further modified (paper currently in review process) for multi-domain operation. The algorithm is `MINDFulCompanion.jointrmsagenerilizeddijkstra!` +" + +# ╔═╡ 376bd565-f14d-4be6-9a4c-e7879ab1c1c4 +const MINDFC = MINDFulCompanion + +# ╔═╡ 04b0b43a-7aac-4ea1-9bd9-cbc7624e1269 +md"# Functions definition" + +# ╔═╡ 78370945-9c91-4f35-957c-2664d7c0196e +md"To get the IBNs with the topology" + +# ╔═╡ d9853453-888e-4069-9e02-035572e9533d +function ibn4nets() + globalnet = open("data/4nets.graphml") do io + loadgraph(io, "global-network", GraphIO.GraphML.GraphMLFormat(), NestedGraphs.NestedGraphFormat()) + end + simgraph = MINDFul.simgraph(globalnet; + distance_method = MINDF.euclidean_dist, + router_lcpool=MINDFC.defaultlinecards(), + router_lccpool=MINDFC.defaultlinecardchassis(), + router_lcccap=6, + transponderset=MINDFC.defaulttransmissionmodules()) + MINDFul.nestedGraph2IBNs!(simgraph) +end + +# ╔═╡ 916f6ff2-23aa-4fd1-a2aa-7d7ac6a35152 +md"Dummy time progression for event-based simulation" + +# ╔═╡ 12277464-e051-487c-bb69-060bfa7793bd +nexttime() = MINDF.COUNTER("time")u"hr" + +# ╔═╡ e711e8af-ed2c-41b4-862e-2a0ae318ad56 +md"This function generates demands following a truncated normal distribution" + +# ╔═╡ 68433c12-00b8-49c5-ad6a-4e59101cbab9 +function generatedemands_normal(vecnum, rng = Random.MersenneTwister(0); mu=200, sigma=50, low=50, high=750) + distr = truncated(Normal(mu, sigma), low, high) + [rand(rng, distr) for _ in 1:vecnum] +end + +# ╔═╡ 7d7aa111-93b5-4191-81a4-bfb056d09dc0 +md"This function gets all demands, translates them to connecivity intents, adds them in the intent framework, compiles them and installs them. The source IBN target is used for the intent delivery." + +# ╔═╡ d8b14d8b-e385-4900-919f-b314136714d6 +function generatedems(ibns, rng; mu = 200) + demdict = Dict{Tuple{Int,Int,Int,Int}, Float64}() + for ibn1 in ibns + nv1 = nv(MINDF.getgraph(ibn1)) + bds1 = MINDF.bordernodes(ibn1; subnetwork_view=false) + for ibn2 in ibns + nv2 = nv(MINDF.getgraph(ibn2)) + bds2 = MINDF.bordernodes(ibn2; subnetwork_view=false) + demvec = generatedemands_normal(nv1 * nv2, rng; mu) + for v1 in 1:nv1 + for v2 in 1:nv2 + getid(ibn1) == getid(ibn2) && v1 == v2 && continue + if v1 ∉ bds1 && v2 ∉ bds2 + demdict[(getid(ibn1), v1, getid(ibn2), v2)] = demvec[(v1-1) * nv2 + v2] + end + end + end + end + end + demdict +end + +# ╔═╡ 14c16d62-255b-4d28-901f-2b0bf791ec99 +md"This function gets a demands, translates them to a connecivity intent, adds it in the intent framework, compile it and installs it." + +# ╔═╡ 21f4504a-0d58-48fa-ae7b-c78b524d6d09 +function compileNinstall!(ibn::IBN, ds, ns, dt, nt, demval) + conint = ConnectivityIntent((ds,ns), (dt, nt), demval) + intentid = addintent!(ibn, conint) + deploy!(ibn, intentid, MINDF.docompile, MINDF.SimpleIBNModus(), MINDFulCompanion.jointrmsagenerilizeddijkstra!; time=nexttime()) + deploy!(ibn, intentid, MINDF.doinstall, MINDF.SimpleIBNModus(), MINDF.directinstall!; time=nexttime()); + return intentid +end + +# ╔═╡ 021dc7be-77b1-409c-8a5a-e5f9dbff994f +function compileNinstall!(ibns, demands) + for ((ds,ns,dt,nt), demval) in demands + compileNinstall!(ibns[ds], ds, ns, dt, nt, demval) + + # check consistency + if !all([let + fv = MINDF.getlink(ibn,e); + fv.spectrum_src == fv.spectrum_dst; + end for ibn in ibns for e in edges(ibn.ngr)]) + break + end + end +end + +# ╔═╡ c0c5b3bd-cdac-4152-889d-724c69b50eeb +md"# Simulation" + +# ╔═╡ 5321f7fb-042e-4ed4-94fd-01286b0f5c27 +md"Load the dummy multi-domain network" + +# ╔═╡ 4f76e4e3-ad89-4980-bb51-fa6d216a75a2 +myibns = ibn4nets() + +# ╔═╡ 0e8f6aa5-6185-4fb3-85ef-0757f91b3157 +md"Fix the seed for reproducibility" + +# ╔═╡ b64d5db9-d1c6-45af-9f41-7ce61d2d59a1 +rng = Random.MersenneTwister(0) + +# ╔═╡ 4524354a-1fd6-417c-b29b-15c9358adeef +md"Generate some demands" + +# ╔═╡ fb7176c7-4ffa-4898-a326-983a73f137c8 +demands = generatedems(myibns, rng; mu=100) + +# ╔═╡ e3043e7d-5434-4d88-b9c1-6368db6578c9 +md"## Handle a single intent" + +# ╔═╡ da736895-9d18-4ab7-aee4-186a9d530c6c +md"Let's assume we want to first handle the demand between the 3rd node of the 1st domain and the 6th node of the 3rd domain, i.e. :" + +# ╔═╡ d24ddeb7-04fa-452b-8679-36a9912f0127 +demkey1 = (1,3,3,6) + +# ╔═╡ c5637933-2678-47dd-9bd6-84887672f286 +demands[demkey1...] #[src_domain, src_node, dst_domain, dst_node] + +# ╔═╡ 896122d0-03c8-4626-9987-32996b370411 +intentid1 = compileNinstall!(myibns[1], demkey1..., demands[demkey1...]) + +# ╔═╡ 922ad6d6-3abf-48b6-83d2-d44887f81056 +md"The intent should be satisfied, as there is no way the resources were scarce" + +# ╔═╡ 0a89b939-9e8e-47da-bb78-e873c78e2009 +issatisfied(myibns[1], intentid1) + +# ╔═╡ b98499c3-4e0f-4ed6-a70c-e2681c93506b +md"We plot the intent using MINDFulMakie.jl" + +# ╔═╡ 5b099fdb-8df7-46c6-9b01-d3e3151569cf +let + fig = Figure() + ax = Axis(fig[1,1]) + ibnplot!(ax, myibns, intentidx=[intentid1]) + hidedecorations!(ax) + fig +end + +# ╔═╡ 50ce26be-8963-4e18-81b2-b2178fa0fd03 +md"The different node colors show the different domains. The domains are not controlled centralized and they have information only about the whereabouts of the border nodes. +Everything else is handled by the intent DAG (Directed Acyclic Graph) delegation scheme. + +The purple line is the path to handle the connectivity intent. The purple rings denote IP port allocation. We see that Optical-Electical-Optical conversion was not needed in the border nodes. This is because the intent DAG delegation imposes some specific intent constraints: +- `BorderTerminateConstraint` imposes the lightpath intent to end in the optical layer +- `BorderInitiateConstraint` imposes the lightpath intent to start in the optical layer" + +# ╔═╡ 609a8246-412d-4ff7-b9a8-f771a10a15d7 +md"### Intent implementation + +The intents are compiled with `MINDFulCompanion.jointrmsagenerilizeddijkstra!`, which uses intent DAGs. This means that the user intent is recursively broken down to lower-level intents. The overall structure forms a DAG. Let's have a look on the just compiled intent DAG." + +# ╔═╡ daf4e1ca-dab1-4d73-b443-be56eb4b90d6 +let + fig = Figure(resolution=(2200, 1000)) + a = Axis(fig[1, 1], yautolimitmargin = (0.6, 0.2), title="Installed intent DAG IBN[1]") + intentplot!(a, myibns[1], intentid1) + fig +end + +# ╔═╡ 035d24d7-d668-4260-b189-2463b78ad8c2 +md"The leafs of the DAG are low-level intents (except for the `RemoteIntent`): +- `NodeRouterPortIntent` allocates an IP router port +- `NodeTransmoduleIntent` allocates an transmission module +- `NodeSpectrumIntent` allocates spectrum slots in the optical fiber +- `NodeROADMINtent` configures the node ROADM for the crossing lightpath + +As you can see electrical activity exists only in node 3. + +The `DomainConnectivityIntent`, `LightpathIntent` and `SpectrumIntent` are higher-level intents. Let's have a look at the lightpath intent:" + +# ╔═╡ 7d85bbd8-e194-486e-ab80-b3b7ec6cf6d9 +getintentnode(myibns[1], UUID(0x3)) + +# ╔═╡ 6c7113c9-c33f-4e92-b177-c711b80cc904 +md"The lightpath is across the nodes `[3,5,6,10]`. The node `10` is the internal representation of the 1st node for the 2nd domain:" + +# ╔═╡ b28c6f16-cee0-448f-9e03-ed0f02a159a7 +MINDF.globalnode(myibns[1], 10) + +# ╔═╡ 78a32374-971b-4155-bf6a-9357ac358c39 +md"The lightpath contains the constraint $(getconstraints(getintent(myibns[1], UUID(0x3)))). This constraint makes the lightpath intent to end in the optical layer. The connection will be continued by the delegated intent UUID(0xf):" + +# ╔═╡ 326f6f01-588d-4fb8-a9d5-ef078c283cbf +getintentnode(myibns[1], UUID(0xf)) + +# ╔═╡ 9d7cd973-7537-4618-b729-af9e5302765c +md"This intent has a `BorderInitiateConstraint` together with all the lightpath requirements that are needed in order for the second domain to continue this connection further." + +# ╔═╡ a24cc446-294b-41d9-9b59-4c081a919a87 +getconstraints(getintent(myibns[1], UUID(0xf))) + +# ╔═╡ e88565d1-de15-46ad-b488-382dd311c90f +md"By alternating between `BorderTerminateConstraint` and `BorderInitaiteConstraint` multi-domain lightpath provisioning becomes possible. + +The remote intent informs us that the intent was delegated to the 2nd domain with an id of `0x1`" + +# ╔═╡ 8caee1a6-2b08-407c-957c-8a339c65aa07 +getintentnode(myibns[2], UUID(0x1)) + +# ╔═╡ f3d4d262-9fbc-4d15-a611-ff57154074f9 +md"The DAG of this intent in the second domain is uknown to the external domains. IBN[2] has complete confidentialy and liberty on how to compile this intent." + +# ╔═╡ 60957c65-faa0-48d9-b476-06bdafe44a20 +md"### Multilayer multigraph internals + +`MINDFulCompanion.jointrmsagenerilizeddijkstra!` works internally by translating the IP-optical network into a multilayer multigraph. For example IBN[1] will be represented as following:" + +# ╔═╡ 1b5c672d-f785-4e16-8a14-0b306d15b860 +function drawmult(ibns, ibnid) + fixedcoords(x) = (args...) -> x + fcfun = fixedcoords(MINDFulMakie.coordlayout(myibns[ibnid].ngr)) + mlgr = MINDFC.mlnodegraphtomlgraph(myibns[ibnid], 3.2) + mlverts = NestedGraphs.getmlvertices(mlnodegraphtomlgraph(myibns[ibnid].ngr)) + return mlgr, fcfun, mlverts +end + +# ╔═╡ 9c5fdea2-f5f9-4c93-92c4-a6d2de6d55f1 +let + f = Figure(resolution=(2000,1000)) + + mlgr, fcfun, mlverts = drawmult(myibns, 1) + a,p = netgraphplot(f[1,1], mlgr, multilayer=true, multilayer_vertices=mlverts, layout=fcfun, nlabels=repr.(vertices(mlgr)), + axis=(title="IBN[1], lightpath from 6=>19 (starts electrical, finishes optical)",)) + hidedecorations!(a) + + mlgr, fcfun, mlverts = drawmult(myibns, 2) + a,p = netgraphplot(f[1,2], mlgr, multilayer=true, multilayer_vertices=mlverts, layout=fcfun, nlabels=repr.(vertices(mlgr)), + axis=(title="IBN[2], lightpath from 15=>17 (lightpath segment)",)) + hidedecorations!(a) + + mlgr, fcfun, mlverts = drawmult(myibns, 3) + a,p = netgraphplot(f[2,2], mlgr, multilayer=true, multilayer_vertices=mlverts, layout=fcfun, nlabels=repr.(vertices(mlgr)), + axis=(title="IBN[3], lightpath from 16=>12 (starts optical, finishes electrical)",)) + hidedecorations!(a) + + f +end + +# ╔═╡ ba3d88a4-190d-4977-aca9-d24e66c05dd9 +md"## Handle all connectivity intents" + +# ╔═╡ 554131f0-ce84-40fb-94e1-1972e9680e6a +# ╠═╡ show_logs = false +compileNinstall!(myibns, demands) + +# ╔═╡ 6efedc71-ec6f-4d60-83f0-4ea6c5a03f7f +md"Intent DAGs are an efficient structure which can reuse low-level intents for new user intents. The previous lightpath intent with id 0x3 is now used by 3 more user intents ! +Have a look in the DAG:" + +# ╔═╡ f8f45109-976d-4bcc-a526-6ed88f51f24f +let + fig = Figure(resolution=(3000, 1000)) + a = Axis(fig[1, 1], yautolimitmargin = (0.6, 0.2), title="Installed intent DAG IBN[1]") + intentplot!(a, myibns[1], UUID(0x3)) + fig +end + +# ╔═╡ 34d16ab5-341c-4268-8eb1-809b727736cb +md"The intent (1,5,3,1) with UUID(0x356): +- starts from node 5 of the first (black) domain. There is one ring for one IP port allocaiton. +- goes to node 3 to be groomed into the lightpath. There are 2 rings for two IP ports, which are needed for the O-E-O conversion and the grooming. +- comes out in the 6th node of the 3rd (pink) domain where the light path ends. +- continues to the 1st intra-domain node of the pink domain." + +# ╔═╡ f4322d49-03c2-487e-aec3-3c6fea856aeb +let + fig = Figure() + ax = Axis(fig[1,1]) + ibnplot!(ax, myibns, intentidx=[UUID(0x1), UUID(0x356)]) + hidedecorations!(ax) + fig +end + +# ╔═╡ Cell order: +# ╟─b528971a-f661-44ac-9066-403650f79001 +# ╟─ff58f7e6-d133-4393-a308-7b63707d460c +# ╠═f5e6f716-e838-11ed-1bd2-8d3a022443c5 +# ╠═2fbf420a-f944-4b33-b126-eb7010548795 +# ╠═179e6ac8-6fa2-406a-8020-da2828132fdf +# ╠═213c1c30-6f8a-4828-8e7a-45eb473822f5 +# ╠═dcb30dbe-3583-436e-a46e-a32a2cf05387 +# ╠═7573f72d-64e1-4d61-8d8e-2ca4c2bc3dee +# ╠═6d418df1-5d22-4b70-ae8d-bff52dcfdaa7 +# ╟─befbac6b-29dd-4457-8664-a6f2170c34fd +# ╠═376bd565-f14d-4be6-9a4c-e7879ab1c1c4 +# ╟─04b0b43a-7aac-4ea1-9bd9-cbc7624e1269 +# ╟─78370945-9c91-4f35-957c-2664d7c0196e +# ╠═d9853453-888e-4069-9e02-035572e9533d +# ╟─916f6ff2-23aa-4fd1-a2aa-7d7ac6a35152 +# ╠═12277464-e051-487c-bb69-060bfa7793bd +# ╟─e711e8af-ed2c-41b4-862e-2a0ae318ad56 +# ╠═68433c12-00b8-49c5-ad6a-4e59101cbab9 +# ╟─7d7aa111-93b5-4191-81a4-bfb056d09dc0 +# ╠═d8b14d8b-e385-4900-919f-b314136714d6 +# ╟─14c16d62-255b-4d28-901f-2b0bf791ec99 +# ╠═21f4504a-0d58-48fa-ae7b-c78b524d6d09 +# ╠═021dc7be-77b1-409c-8a5a-e5f9dbff994f +# ╟─c0c5b3bd-cdac-4152-889d-724c69b50eeb +# ╟─5321f7fb-042e-4ed4-94fd-01286b0f5c27 +# ╠═4f76e4e3-ad89-4980-bb51-fa6d216a75a2 +# ╟─0e8f6aa5-6185-4fb3-85ef-0757f91b3157 +# ╠═b64d5db9-d1c6-45af-9f41-7ce61d2d59a1 +# ╟─4524354a-1fd6-417c-b29b-15c9358adeef +# ╠═fb7176c7-4ffa-4898-a326-983a73f137c8 +# ╟─e3043e7d-5434-4d88-b9c1-6368db6578c9 +# ╟─da736895-9d18-4ab7-aee4-186a9d530c6c +# ╠═d24ddeb7-04fa-452b-8679-36a9912f0127 +# ╠═c5637933-2678-47dd-9bd6-84887672f286 +# ╠═896122d0-03c8-4626-9987-32996b370411 +# ╟─922ad6d6-3abf-48b6-83d2-d44887f81056 +# ╠═0a89b939-9e8e-47da-bb78-e873c78e2009 +# ╟─b98499c3-4e0f-4ed6-a70c-e2681c93506b +# ╠═5b099fdb-8df7-46c6-9b01-d3e3151569cf +# ╟─50ce26be-8963-4e18-81b2-b2178fa0fd03 +# ╟─609a8246-412d-4ff7-b9a8-f771a10a15d7 +# ╠═daf4e1ca-dab1-4d73-b443-be56eb4b90d6 +# ╟─035d24d7-d668-4260-b189-2463b78ad8c2 +# ╠═7d85bbd8-e194-486e-ab80-b3b7ec6cf6d9 +# ╟─6c7113c9-c33f-4e92-b177-c711b80cc904 +# ╠═b28c6f16-cee0-448f-9e03-ed0f02a159a7 +# ╟─78a32374-971b-4155-bf6a-9357ac358c39 +# ╠═326f6f01-588d-4fb8-a9d5-ef078c283cbf +# ╟─9d7cd973-7537-4618-b729-af9e5302765c +# ╠═a24cc446-294b-41d9-9b59-4c081a919a87 +# ╟─e88565d1-de15-46ad-b488-382dd311c90f +# ╟─8caee1a6-2b08-407c-957c-8a339c65aa07 +# ╟─f3d4d262-9fbc-4d15-a611-ff57154074f9 +# ╟─60957c65-faa0-48d9-b476-06bdafe44a20 +# ╟─1b5c672d-f785-4e16-8a14-0b306d15b860 +# ╠═9c5fdea2-f5f9-4c93-92c4-a6d2de6d55f1 +# ╟─ba3d88a4-190d-4977-aca9-d24e66c05dd9 +# ╠═554131f0-ce84-40fb-94e1-1972e9680e6a +# ╟─6efedc71-ec6f-4d60-83f0-4ea6c5a03f7f +# ╠═f8f45109-976d-4bcc-a526-6ed88f51f24f +# ╟─34d16ab5-341c-4268-8eb1-809b727736cb +# ╠═f4322d49-03c2-487e-aec3-3c6fea856aeb diff --git a/intentDAGinMD.plutostate b/intentDAGinMD.plutostate new file mode 100644 index 0000000..eb1e161 Binary files /dev/null and b/intentDAGinMD.plutostate differ diff --git a/pluto_export.json b/pluto_export.json new file mode 100644 index 0000000..fbbf05b --- /dev/null +++ b/pluto_export.json @@ -0,0 +1 @@ +{"notebooks":{"simplenotebookexample.jl":{"id":"simplenotebookexample.jl","hash":"hCxtJ69Pip2BQTuLp4FNaoVrinIjoWuX9sj2Ae9USdM","html_path":"simplenotebookexample.html","statefile_path":"simplenotebookexample.plutostate","notebookfile_path":"simplenotebookexample.jl","current_hash":"hCxtJ69Pip2BQTuLp4FNaoVrinIjoWuX9sj2Ae9USdM","desired_hash":"hCxtJ69Pip2BQTuLp4FNaoVrinIjoWuX9sj2Ae9USdM","frontmatter":{"title":"simplenotebookexample"}},"simpleeventbased.jl":{"id":"simpleeventbased.jl","hash":"-_mnQs7FXdh4XylOCEWsKXnCXRB-Y2ofECx_6UpO_nQ","html_path":"simpleeventbased.html","statefile_path":"simpleeventbased.plutostate","notebookfile_path":"simpleeventbased.jl","current_hash":"-_mnQs7FXdh4XylOCEWsKXnCXRB-Y2ofECx_6UpO_nQ","desired_hash":"-_mnQs7FXdh4XylOCEWsKXnCXRB-Y2ofECx_6UpO_nQ","frontmatter":{"title":"simpleeventbased"}},"intentDAGinMD.jl":{"id":"intentDAGinMD.jl","hash":"GhmAMMjpBmUt_834O-vh7xuZkn2U3qXJJBX3Kgw69I0","html_path":"intentDAGinMD.html","statefile_path":"intentDAGinMD.plutostate","notebookfile_path":"intentDAGinMD.jl","current_hash":"GhmAMMjpBmUt_834O-vh7xuZkn2U3qXJJBX3Kgw69I0","desired_hash":"GhmAMMjpBmUt_834O-vh7xuZkn2U3qXJJBX3Kgw69I0","frontmatter":{"title":"intentDAGinMD"}},"plutodash.jl":{"id":"plutodash.jl","hash":"61vdvBZzpuVn7HAAuTBVOWviTjNnMiwAipSPQA3RTU4","html_path":"plutodash.html","statefile_path":"plutodash.plutostate","notebookfile_path":"plutodash.jl","current_hash":"61vdvBZzpuVn7HAAuTBVOWviTjNnMiwAipSPQA3RTU4","desired_hash":"61vdvBZzpuVn7HAAuTBVOWviTjNnMiwAipSPQA3RTU4","frontmatter":{"title":"plutodash"}}},"pluto_version":"0.19.38","julia_version":"1.10.1","format_version":"1","title":null,"description":null,"collections":null,"binder_url":"https://mybinder.org/v2/gh/fonsp/pluto-on-binder/v0.19.38","slider_server_url":null} \ No newline at end of file diff --git a/pluto_state_cache/0_19_38-_mnQs7FXdh4XylOCEWsKXnCXRB-Y2ofECx_6UpO_nQ.plutostate b/pluto_state_cache/0_19_38-_mnQs7FXdh4XylOCEWsKXnCXRB-Y2ofECx_6UpO_nQ.plutostate new file mode 100644 index 0000000..99f8f4f Binary files /dev/null and b/pluto_state_cache/0_19_38-_mnQs7FXdh4XylOCEWsKXnCXRB-Y2ofECx_6UpO_nQ.plutostate differ diff --git a/pluto_state_cache/0_19_3861vdvBZzpuVn7HAAuTBVOWviTjNnMiwAipSPQA3RTU4.plutostate b/pluto_state_cache/0_19_3861vdvBZzpuVn7HAAuTBVOWviTjNnMiwAipSPQA3RTU4.plutostate new file mode 100644 index 0000000..fc15779 Binary files /dev/null and b/pluto_state_cache/0_19_3861vdvBZzpuVn7HAAuTBVOWviTjNnMiwAipSPQA3RTU4.plutostate differ diff --git a/pluto_state_cache/0_19_38GhmAMMjpBmUt_834O-vh7xuZkn2U3qXJJBX3Kgw69I0.plutostate b/pluto_state_cache/0_19_38GhmAMMjpBmUt_834O-vh7xuZkn2U3qXJJBX3Kgw69I0.plutostate new file mode 100644 index 0000000..eb1e161 Binary files /dev/null and b/pluto_state_cache/0_19_38GhmAMMjpBmUt_834O-vh7xuZkn2U3qXJJBX3Kgw69I0.plutostate differ diff --git a/pluto_state_cache/0_19_38hCxtJ69Pip2BQTuLp4FNaoVrinIjoWuX9sj2Ae9USdM.plutostate b/pluto_state_cache/0_19_38hCxtJ69Pip2BQTuLp4FNaoVrinIjoWuX9sj2Ae9USdM.plutostate new file mode 100644 index 0000000..696e665 Binary files /dev/null and b/pluto_state_cache/0_19_38hCxtJ69Pip2BQTuLp4FNaoVrinIjoWuX9sj2Ae9USdM.plutostate differ diff --git a/plutodash.html b/plutodash.html new file mode 100644 index 0000000..d6b739e --- /dev/null +++ b/plutodash.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/plutodash.jl b/plutodash.jl new file mode 100644 index 0000000..1a6d4a7 --- /dev/null +++ b/plutodash.jl @@ -0,0 +1,105 @@ +### A Pluto.jl notebook ### +# v0.19.37 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end +end + +# ╔═╡ 5145f6b7-ddb7-45ac-a3c7-fb30dc364f15 +using Pkg + +# ╔═╡ 0c8710c0-bdd0-46a0-9e0a-76565e074430 +Pkg.activate(".") + +# ╔═╡ 247ea030-8bd4-11ee-1923-2914682ad01e +using Revise, WGLMakie, PlutoUI, HypertextLiteral, MINDFulPluto + +# ╔═╡ 1fbb319e-8a8e-40cc-acc2-58a5a07ac275 +begin + begin + MINDFulPluto.get_dashboard_main_div() + end +end + +# ╔═╡ 36ded27e-079a-4bed-9d94-abd6314ddca8 +MINDFulPluto.plot_intent() + +# ╔═╡ dcad27db-f258-4ac8-a17b-21397933a3a1 +MINDFulPluto.plot_intent() + +# ╔═╡ 0ed42b9e-dba7-40cb-b58d-7bd306dd384e +begin + #get javascript values + viewport_height_bind = @bind viewport_height html"""""" + viewport_width_bind = @bind viewport_width html"""""" + window_dpr_bind = @bind window_dpr html"""""" + + + @htl(""" + + $(embed_display(viewport_height_bind)) + $(embed_display(viewport_width_bind)) + $(embed_display(window_dpr_bind)) + + """) +end + +# ╔═╡ 01e839e5-8cb4-4402-a5a3-ff2fdc89c035 +begin + viewport_height, viewport_width, window_dpr + MINDFulPluto.viewport_settings["width"] = viewport_width + MINDFulPluto.viewport_settings["height"] = viewport_height + MINDFulPluto.viewport_settings["dpr"] = window_dpr +end + +# ╔═╡ 00af9143-eebf-4d20-9ab2-5038070efc66 +begin + #inputs for intent commands + intent_command_bind = @bind intent_command html"""""" + + @htl(""" + + $(embed_display(intent_command_bind)) + + """) +end + +# ╔═╡ 1921d610-5308-4c4f-8a2b-54a067024701 +MINDFulPluto.handle_command(intent_command) + +# ╔═╡ 4838aca7-d253-42a7-9eb1-d3a74040d4af +#MINDFulPluto.update_width_devving() + +# ╔═╡ 1f562bd9-17fe-49cb-83d0-11480eb4afca +MINDFulPluto.insert_scripts() + +# ╔═╡ daceb10a-f60c-4f4f-b2ac-ff8bf68f8c8a +MINDFulPluto.intent_list + +# ╔═╡ 77b3716e-aac5-47f0-8618-253afc079b4b +MINDFulPluto.draw_args + +# ╔═╡ Cell order: +# ╠═5145f6b7-ddb7-45ac-a3c7-fb30dc364f15 +# ╟─0c8710c0-bdd0-46a0-9e0a-76565e074430 +# ╠═247ea030-8bd4-11ee-1923-2914682ad01e +# ╟─1fbb319e-8a8e-40cc-acc2-58a5a07ac275 +# ╟─36ded27e-079a-4bed-9d94-abd6314ddca8 +# ╟─dcad27db-f258-4ac8-a17b-21397933a3a1 +# ╠═0ed42b9e-dba7-40cb-b58d-7bd306dd384e +# ╠═01e839e5-8cb4-4402-a5a3-ff2fdc89c035 +# ╠═00af9143-eebf-4d20-9ab2-5038070efc66 +# ╠═1921d610-5308-4c4f-8a2b-54a067024701 +# ╠═4838aca7-d253-42a7-9eb1-d3a74040d4af +# ╠═1f562bd9-17fe-49cb-83d0-11480eb4afca +# ╠═daceb10a-f60c-4f4f-b2ac-ff8bf68f8c8a +# ╠═77b3716e-aac5-47f0-8618-253afc079b4b diff --git a/plutodash.plutostate b/plutodash.plutostate new file mode 100644 index 0000000..fc15779 Binary files /dev/null and b/plutodash.plutostate differ diff --git a/simpleeventbased.html b/simpleeventbased.html new file mode 100644 index 0000000..d2b1bfd --- /dev/null +++ b/simpleeventbased.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/simpleeventbased.jl b/simpleeventbased.jl new file mode 100644 index 0000000..d277860 --- /dev/null +++ b/simpleeventbased.jl @@ -0,0 +1,236 @@ +### A Pluto.jl notebook ### +# v0.19.26 + +using Markdown +using InteractiveUtils + +# ╔═╡ bac63278-6578-42bc-b4a0-4e88cf860dce +import Pkg + +# ╔═╡ a91bcfcd-06ae-4ae9-a87a-add45f09a3c0 +Pkg.activate(".") + +# ╔═╡ 6473d54f-344f-4271-8f21-723033485437 +using MINDFul, GraphIO, NestedGraphsIO, NestedGraphs, Graphs + +# ╔═╡ 0f7cead6-1f2e-4044-a01c-9cf10326865c +using DiscreteEvents, Distributions, Random, Logging, Unitful + +# ╔═╡ 839bc204-f9cf-4d6f-be1c-291fdd038f22 +html""" + +""" + +# ╔═╡ 7448a4ee-c29a-42c8-ab7e-9b1086ac1b55 +md"# Doing event-based simulation with `MINDFul.jl` + +In this notebook, we demonstrate a simple way of using `MINDFul.jl` in an event-based simulation. +We will use [`DiscreteEvents.jl`](https://github.com/pbayer/DiscreteEvents.jl) as the event-based simulation library, although other choices can be made." + +# ╔═╡ 71540933-7a26-4715-b355-6d29b19d2d79 +const MINDF = MINDFul + +# ╔═╡ 4b661417-38f8-4dd7-9e61-2d633d4b9757 +import MetaGraphs as MG + +# ╔═╡ 3b689d28-2f0f-4c1f-bd87-0e370f5141d0 +md"# Defining default equipment" + +# ╔═╡ 20df7e4f-512a-4c0d-976d-391d2e776775 +defaultlinecards() = [MINDF.LineCardDummy(10, 100, 26.72), MINDF.LineCardDummy(2, 400, 29.36), MINDF.LineCardDummy(1, 1000, 31.99)] + +# ╔═╡ 4aca889e-b35f-4a5f-802e-14712bc03e76 +defaultlinecardchassis() = [MINDF.LineCardChassisDummy(Vector{MINDF.LineCardDummy}(), 4.7, 16)] + +# ╔═╡ 04135672-7551-49ce-824a-89f7ade8c85b +defaulttransmissionmodules() = [MINDF.TransmissionModuleView("DummyFlexibleTransponder", + MINDF.TransmissionModuleDummy([MINDF.TransmissionProps(5080.0u"km", 300, 8), + MINDF.TransmissionProps(4400.0u"km", 400, 8), + MINDF.TransmissionProps(2800.0u"km", 500, 8), + MINDF.TransmissionProps(1200.0u"km", 600, 8), + MINDF.TransmissionProps(700.0u"km", 700, 10), + MINDF.TransmissionProps(400.0u"km", 800, 10)],0,20)), + MINDF.TransmissionModuleView("DummyFlexiblePluggables", + MINDF.TransmissionModuleDummy([MINDF.TransmissionProps(5840.0u"km", 100, 4), + MINDF.TransmissionProps(2880.0u"km", 200, 6), + MINDF.TransmissionProps(1600.0u"km", 300, 6), + MINDF.TransmissionProps(480.0u"km", 400, 6)],0,8)) + ] + +# ╔═╡ 5272c7d0-727f-4be3-8d9a-225990b95442 +md"# Some helper functions" + +# ╔═╡ d72eb4d8-8859-485d-a7ec-f76af377f1f1 +# a function to add compile and intstall an intent +function addcompileinstall(ibn, conint; time) + intentidx = addintent!(ibn, conint) + deploy!(ibn, intentidx, MINDF.docompile, MINDF.SimpleIBNModus(), MINDF.shortestavailpath!; time) + deploy!(ibn, intentidx, MINDF.doinstall, MINDF.SimpleIBNModus(), MINDF.directinstall!; time) +end + +# ╔═╡ 00b5521c-b261-4891-988f-f08bd0d91fae +getfiberview(ibn::IBN, edg::Edge) = MG.get_prop(ibn.ngr, edg, :link) + +# ╔═╡ 6e3a5d21-e994-4e3a-a5cb-0892ebc145b2 +# Get edges as if the graph was undirected +undirectededges(g) = Iterators.filter((e -> e.src < e.dst) ,edges(g)) + +# ╔═╡ 014ccada-5ad0-46ea-a0b0-106915dda8ee +# Mean Time To Failure is set to one month +MTTF() = 24*30u"hr" + +# ╔═╡ 07cc0088-a0c0-4187-a5ad-84fc04c19392 +# Mean Time To Repair is set to one day +MTTR() = 24u"hr" + +# ╔═╡ bb63e586-5ce6-4d03-b564-0363bd9a2a00 +# Toogle repair times with failure times +function toggle_operation_N_event!(vd::Vector, clock, ibn, dev1, dev2, i = 2) + function clostog() + set_operation_status!(ibn, dev1, !dev1.operates; time=tau(clock)) + set_operation_status!(ibn, dev2, !dev2.operates; time=tau(clock)) + nextevent = ustrip(u"hr", vd[i]()) + distr = Exponential(nextevent) + event!(clock, clostog, after , distr) + i = 3 - i + end +end + +# ╔═╡ afd243a7-9d3c-4ecc-81f2-bbb5efd3c03e +# Loads events in a clock. +# Scans all edges in myibns and adds a toggling MTTF/MTTR event for each +function loadevents!(clock, myibns) + ldistrs = [MTTF, MTTR] + for ibn in myibns + for edg in undirectededges(ibn.ngr) + dev1 = getfiberview(ibn, edg) # outgoing edge + dev2 = getfiberview(ibn, reverse(edg)) # incoming edge + + # initialize as working + set_operation_status!(ibn, dev1, true; time=tau(clock), forcelog=true) + set_operation_status!(ibn, dev2, true; time=tau(clock), forcelog=true) + + # first event will be an failure according to MTTF + meanexp = ustrip(u"hr", ldistrs[1]()) + distr = Exponential(meanexp) + event!(clock, toggle_operation_N_event!(ldistrs, clock, ibn, dev1, dev2), after, distr) + end + end +end + +# ╔═╡ 7a9d9486-a8bc-4a86-8928-c5f8e42ba40f +function runsim!(myibns; seed=1) + Random.seed!(seed) + + # define clock needed for event based simulation + clock = DiscreteEvents.Clock(unit=Unitful.hr) + + # load the events in the simulation calendar + loadevents!(clock, myibns) + + # prepare a bunch of intents + conints = [ConnectivityIntent((myibns[1].id,2), (myibns[3].id,1), 50, [GoThroughConstraint((2,1))]), + ConnectivityIntent((myibns[1].id,2), (myibns[3].id,5), 50, [GoThroughConstraint((2,1))]), + ConnectivityIntent((myibns[1].id,2), (myibns[3].id,7), 50, [GoThroughConstraint((2,1))])] + + # install the intents at time 0 + let time=0u"hr" + with_logger(ConsoleLogger(stderr, Logging.Error)) do + for conint in conints + addcompileinstall(myibns[1], conint; time) + end + end + end + + # run simulation for a year + let year = 365 * 24u"hr" + run!(clock, year) + end + + return clock +end + + +# ╔═╡ e3b9a3bd-0ea2-4a1e-90e7-3b097c4be769 +md"### Prepare the simulation-able graph" + +# ╔═╡ 16934504-1472-4589-b5c5-46f0c0937a48 +myibns = +let + # read in the NestedGraph + globalnet = open(joinpath("data/4nets.graphml")) do io + loadgraph(io, "global-network", GraphIO.GraphML.GraphMLFormat(), NestedGraphs.NestedGraphFormat()) + end + + # convert it to a NestedGraph compliant with the simulation specifications + simgraph = MINDF.simgraph(globalnet; + distance_method = MINDF.euclidean_dist, + router_lcpool=defaultlinecards(), + router_lccpool=defaultlinecardchassis(), + router_lcccap=3, + transponderset=defaulttransmissionmodules()) + + # convert it to IBNs + myibns = MINDFul.nestedGraph2IBNs!(simgraph) +end + +# ╔═╡ f3df6af6-fde8-4c41-ad3a-dca5c4dde213 +md"### Do the simulation." + +# ╔═╡ 0b44c992-5282-41ed-bd0c-a83abdc8684e +runsim!(myibns) + +# ╔═╡ 250687bb-d00f-4caf-bc0e-61a1f6acbcc2 +md"The log now contains all status transitions for all edges of the graph. +`false` means the link failed and `true` that the link got repaired." + +# ╔═╡ 063a519c-cd88-43cd-b3fc-bfb9a04a77b4 +[e => getfiberview(myibns[1], e).logstate.logtime for e in edges(myibns[1].ngr)] + +# ╔═╡ c5ec705e-e689-4a88-99dc-fa9d1e44f2db +md"We can also see the log status of all the intents" + +# ╔═╡ 4818aaff-d9d8-49c2-b308-5fd44e4ada19 +[getid(idn) => idn.logstate.logtime for idn in MINDF.getallintentnodes(myibns[1]) if MINDF.getissuer(idn) == MINDF.NetworkProvider()] + +# ╔═╡ 23fa03d2-12f5-4185-b56e-eaa3c329286a +md"Based on these logs, we can start an evaluation of the intent system, like the intet compilation algorithms and the state-machine deployed !" + +# ╔═╡ Cell order: +# ╟─839bc204-f9cf-4d6f-be1c-291fdd038f22 +# ╟─7448a4ee-c29a-42c8-ab7e-9b1086ac1b55 +# ╠═bac63278-6578-42bc-b4a0-4e88cf860dce +# ╠═a91bcfcd-06ae-4ae9-a87a-add45f09a3c0 +# ╠═6473d54f-344f-4271-8f21-723033485437 +# ╠═71540933-7a26-4715-b355-6d29b19d2d79 +# ╠═0f7cead6-1f2e-4044-a01c-9cf10326865c +# ╠═4b661417-38f8-4dd7-9e61-2d633d4b9757 +# ╟─3b689d28-2f0f-4c1f-bd87-0e370f5141d0 +# ╠═20df7e4f-512a-4c0d-976d-391d2e776775 +# ╠═4aca889e-b35f-4a5f-802e-14712bc03e76 +# ╠═04135672-7551-49ce-824a-89f7ade8c85b +# ╟─5272c7d0-727f-4be3-8d9a-225990b95442 +# ╠═d72eb4d8-8859-485d-a7ec-f76af377f1f1 +# ╠═00b5521c-b261-4891-988f-f08bd0d91fae +# ╠═6e3a5d21-e994-4e3a-a5cb-0892ebc145b2 +# ╠═014ccada-5ad0-46ea-a0b0-106915dda8ee +# ╠═07cc0088-a0c0-4187-a5ad-84fc04c19392 +# ╠═7a9d9486-a8bc-4a86-8928-c5f8e42ba40f +# ╠═afd243a7-9d3c-4ecc-81f2-bbb5efd3c03e +# ╠═bb63e586-5ce6-4d03-b564-0363bd9a2a00 +# ╟─e3b9a3bd-0ea2-4a1e-90e7-3b097c4be769 +# ╠═16934504-1472-4589-b5c5-46f0c0937a48 +# ╟─f3df6af6-fde8-4c41-ad3a-dca5c4dde213 +# ╠═0b44c992-5282-41ed-bd0c-a83abdc8684e +# ╟─250687bb-d00f-4caf-bc0e-61a1f6acbcc2 +# ╠═063a519c-cd88-43cd-b3fc-bfb9a04a77b4 +# ╟─c5ec705e-e689-4a88-99dc-fa9d1e44f2db +# ╠═4818aaff-d9d8-49c2-b308-5fd44e4ada19 +# ╟─23fa03d2-12f5-4185-b56e-eaa3c329286a diff --git a/simpleeventbased.plutostate b/simpleeventbased.plutostate new file mode 100644 index 0000000..99f8f4f Binary files /dev/null and b/simpleeventbased.plutostate differ diff --git a/simplenotebookexample.html b/simplenotebookexample.html new file mode 100644 index 0000000..9309602 --- /dev/null +++ b/simplenotebookexample.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/simplenotebookexample.jl b/simplenotebookexample.jl new file mode 100644 index 0000000..ab575f1 --- /dev/null +++ b/simplenotebookexample.jl @@ -0,0 +1,357 @@ +### A Pluto.jl notebook ### +# v0.19.26 + +using Markdown +using InteractiveUtils + +# ╔═╡ 442e4738-9246-11ed-18bc-3d0b1c400eca +import Pkg + +# ╔═╡ 7f5da610-0fcc-4000-ae2d-55c404b95cc5 +Pkg.activate(".") + +# ╔═╡ 97de85e8-6efd-4153-943f-794a003797f4 +using MINDFul, GraphIO, NestedGraphsIO, NestedGraphs, Graphs, MetaGraphs + +# ╔═╡ 58f3950b-114f-4a08-b14d-49f78242ea5c +using MINDFulMakie, CairoMakie, Unitful + +# ╔═╡ 0949e348-477f-42eb-ad02-a4c54e5276f2 +using PlutoUI + +# ╔═╡ 33f1d64a-0c07-4cfd-a901-7e9a2b4adf4a +html""" + +""" + +# ╔═╡ 9a460ae7-a468-489e-a0ff-93507a68a793 +md"# Notebook example for `MINDFul.jl`" + +# ╔═╡ 294ead79-e37e-4619-b192-88e9643f00cd +md"First, activate the notebooks environment" + +# ╔═╡ 8fe8e74b-c5d0-4da0-8572-f43a8a6abbcd +md"Due to some unregistered and forked packages, this is currently more complicated than usual. In the future it will be addressed." + +# ╔═╡ b8deb081-9c6d-4f7c-b1e1-557d2bc58e52 +const MINDF = MINDFul + +# ╔═╡ a79e5108-5ecf-486b-ae6d-b1e029b199b3 +md"# Defining default equipment" + +# ╔═╡ b19d418c-7737-41a6-a870-b78321286d57 +defaultlinecards() = [MINDF.LineCardDummy(10, 100, 26.72), MINDF.LineCardDummy(2, 400, 29.36), MINDF.LineCardDummy(1, 1000, 31.99)] + +# ╔═╡ 07cf093a-a610-465d-b110-b9b6a2623f15 +defaultlinecardchassis() = [MINDF.LineCardChassisDummy(Vector{MINDF.LineCardDummy}(), 4.7, 16)] + +# ╔═╡ 91022a1b-a76d-4c9e-a1d6-b6ee05415730 +defaulttransmissionmodules() = [MINDF.TransmissionModuleView("DummyFlexibleTransponder", + MINDF.TransmissionModuleDummy([MINDF.TransmissionProps(5080.0u"km", 300, 8), + MINDF.TransmissionProps(4400.0u"km", 400, 8), + MINDF.TransmissionProps(2800.0u"km", 500, 8), + MINDF.TransmissionProps(1200.0u"km", 600, 8), + MINDF.TransmissionProps(700.0u"km", 700, 10), + MINDF.TransmissionProps(400.0u"km", 800, 10)],0,20)), + MINDF.TransmissionModuleView("DummyFlexiblePluggables", + MINDF.TransmissionModuleDummy([MINDF.TransmissionProps(5840.0u"km", 100, 4), + MINDF.TransmissionProps(2880.0u"km", 200, 6), + MINDF.TransmissionProps(1600.0u"km", 300, 6), + MINDF.TransmissionProps(480.0u"km", 400, 6)],0,8)) + ] + +# ╔═╡ 67f1f3c7-4002-4999-9620-033ecda299b9 +md"# Loading the graph and translating into an IBN struct" + +# ╔═╡ d496ab73-643a-4e13-b460-63222392c7ab +myibns = +let + # read in the NestedGraph + globalnet = open(joinpath("data/4nets.graphml")) do io + loadgraph(io, "global-network", GraphIO.GraphML.GraphMLFormat(), NestedGraphs.NestedGraphFormat()) + end + + # convert it to a NestedGraph compliant with the simulation specifications + simgraph = MINDF.simgraph(globalnet; + distance_method = MINDF.euclidean_dist, + router_lcpool=defaultlinecards(), + router_lccpool=defaultlinecardchassis(), + router_lcccap=3, + transponderset=defaulttransmissionmodules()) + + # convert it to IBNs + myibns = MINDFul.nestedGraph2IBNs!(simgraph) +end + +# ╔═╡ c4edef24-83f7-4813-9c6b-83d9844f08ed +let + f,a,p = ibnplot(myibns; axis=(title="Complete multi-domain network",)) + hidedecorations!(a) + f +end + +# ╔═╡ b445e9d2-3486-41f7-a7a7-f9e66447608b +md"There are 4 networks, each visualized with a different color. The 4 network domains operate in a decentralized fashion; that is they belong to different organizations." + +# ╔═╡ 778ceea9-0b17-49d4-8b59-09fb100d18c8 +let + f = Figure() + a,p = ibnplot(f[1,1], myibns[1]; axis=(title="myibns[1]",)) + hidedecorations!(a) + a,p = ibnplot(f[1,2], myibns[2]; axis=(title="myibns[2]",)) + hidedecorations!(a) + a,p = ibnplot(f[2,2], myibns[3]; axis=(title="myibns[3]",)) + hidedecorations!(a) + a,p = ibnplot(f[2,1], myibns[4]; axis=(title="myibns[4]",)) + hidedecorations!(a) + f +end + +# ╔═╡ 007a85c3-7bf1-4b50-91c4-31b3111be181 +md"Each IBN is composed of several subgraphs, visualized with different colors. The different subgraphs denote different domains inside the network. The different domains can be either SDN-separated domains or the neighboring border nodes belonging to a different network entity. + +Each plot above visualizes how the 4 different network operators see the global network. As you can see, there is no global knowledge, and a network operator can only know the border nodes of the neighboring networks. + +The scenario is well described in the following publication: + +> F. Christou, \"Decentralized Intent-driven Coordination of Multi-Domain IP-Optical Networks,\" 2022 18th International Conference on Network and Service Management (CNSM), 2022, pp. 359-363, doi: 10.23919/CNSM55787.2022.9964606." + +# ╔═╡ e2381f46-e0df-4fc2-982a-04a5e13eddb0 +md"## IBN" + +# ╔═╡ f3a5af7a-a012-4cdd-a777-a75ad46be332 +md"Let's take the first IBN framework instance" + +# ╔═╡ d2a8ace9-148b-4d39-a854-f3f663272b7e +myibns[1] + +# ╔═╡ ae04da87-98f9-45ad-bdbb-2b25adfb2645 +md"The fields of the IBN struct are +- `id`: the unique id for the IBN framework instance, that works also as the domain id +- `intents`: the registered intents +- `intentissuers`: who issued the corresponding intent in the `intents` field +- `controllers`: all SDN subdomains and the IBN framework instances of the neighboring domains +- `ngr`: The `NestedGraph` describing this domain +- `interprops`: storing the permissions of neighboring IBN domains + +At first and after initialization, there are no intents in the network." + +# ╔═╡ 1a83766b-da55-4ee2-8dad-db86ff0efc20 +md"## Intents +Intents define high-level objectives of the network operators. `MINDFul.jl` defines a handful of intents that focus on connectivity. + +We follow a tactic of further describing an intent given some *constraints*. +This paradigm is not new and is also used by frameworks like [ONOS](https://wiki.onosproject.org/display/ONOS/Intent+Framework). + +Following, we define a connectivity intent from the 1st node of IBN1 to the 9th node of IBN1 carrying 50 Gbps" + +# ╔═╡ d95a36e4-0c72-4eac-b7ac-58cd2fe46c91 +myintent = ConnectivityIntent((myibns[1].id, 1), (myibns[1].id, 9), 50) + +# ╔═╡ 4eec91ea-9485-4302-98cd-c07ad7c77f54 +md"We add this intent to the IBN framework" + +# ╔═╡ f9f75535-0066-401f-8325-4f3a2044a295 +idi = addintent!(myibns[1], myintent) + +# ╔═╡ a22395bf-d0e8-45b1-ad33-0698d0c013b9 +md"Now we will compile the intent. To do so, we need to specify the simulation time that this will happen. `MINDFul.jl` is developed to log all such state transitions. This functionality is especially useful for event-based simulations. Since, at the moment, we are not interested in holding an event-based simulation, we define the following short function to every time return a timestamp with a difference of 1 hour." + +# ╔═╡ 1ae38bb5-fe3c-466b-8842-05da76a71331 +nexttime() = MINDF.COUNTER("time")u"hr" + +# ╔═╡ 0f5c3eda-fe78-49fe-9ae9-63e11f9c0171 +md"!!! note + +`MINDFul.COUNTER` is a `const` that is used in some parts of the package to produce a sequence of unique automatically generated `id`s. `COUNTER` counts all the times you called it by passing in a specific argument. Here we pass in the string `\"time\"`." + +# ╔═╡ 903dd513-2b1a-4fd3-8794-8549ecf126ce +deploy!(myibns[1], idi, MINDF.docompile, MINDF.SimpleIBNModus(), MINDF.shortestavailpath!; time=nexttime()); + +# ╔═╡ 9a5308bc-ff2c-4589-b907-647d13850a2c +md"We can introspect the logs of the intent, yielding that at `1.0 hr` we compiled this intent" + +# ╔═╡ 04540e14-d6bb-4350-92fa-77045ed0ec0c +getintentnode(myibns[1], idi).logstate.logtime + +# ╔═╡ bb54227a-f2ea-41a4-a8b2-c04d56d28542 +md"We can inspect the compilation by displaying the intent tree. (Better use GLMakie or WGLMakie to have interactive control over the plot)" + +# ╔═╡ 4683e35d-69eb-4d43-b24e-da67eeb216bd +let + f = Figure(resolution=(2000,500)) + a = Axis(f[1, 1], yautolimitmargin = (0.6, 0.2), title="Compiled intent") + intentplot!(a, myibns[1], idi) + hidedecorations!(a) + f +end + +# ╔═╡ 45ce090a-6377-4824-9733-8e4f76912dc4 +md"The user intent is registered as the root in the intent tree. +Compilation forces the intent tree to expand vertically by adding children to each node. +The tree leaves are called low-level intents and are device-level intents. +This way, the abstract high-level intent is gradually concretized through the compilation process. + +After the intent is compiled, we can install it into the network" + +# ╔═╡ ad1aecd8-6ae1-4b2e-a7e2-ffa1c7463418 +deploy!(myibns[1], idi, MINDF.doinstall, MINDF.SimpleIBNModus(), MINDF.directinstall!; time=nexttime()); + +# ╔═╡ 3670dc7c-4af4-45e7-bdbb-dd9172949d7c +md"Now all nodes in the Intent Tree will be in the `installed` state" + +# ╔═╡ f2555f38-b7ab-44db-93c3-b07581139e68 +let + f = Figure(resolution=(3000,800)) + a = Axis(f[1, 1], yautolimitmargin = (0.3, 0.2), title="Compiled intent") + intentplot!(a, myibns[1], idi) + hidedecorations!(a) + f +end + +# ╔═╡ 95a6e312-4ea7-449d-9724-f2e6bc1be771 +let + f,a,_ = ibnplot(myibns, intentidx=[idi], axis=(title="Visualization of the installed intent",)) + hidedecorations!(a) + f +end + +# ╔═╡ 92e24a68-2cbd-40b5-9491-0caea27bb4cd +md"We can do the same with cross-domain intents expanding different domains." + +# ╔═╡ 74471fd5-fa91-4275-8870-81b74dfd09da +cidi = let + myintent = ConnectivityIntent((myibns[1].id, 1), (myibns[3].id, 6), 50) + idi = addintent!(myibns[1], myintent) + deploy!(myibns[1], idi, MINDF.docompile, MINDF.SimpleIBNModus(), MINDF.shortestavailpath!; time=nexttime()); + deploy!(myibns[1], idi, MINDF.doinstall, MINDF.SimpleIBNModus(), MINDF.directinstall!; time=nexttime()); + idi +end + +# ╔═╡ d4526365-257b-41b6-b7a4-8913c67a71a3 +let + f,a,_ = ibnplot(myibns, intentidx=[cidi], axis=(title="Visualization of the installed cross-domain intent",)) + hidedecorations!(a) + f +end + +# ╔═╡ c80799b9-9363-467b-aec2-3d495b1cec50 +md"# Extending intent compilation strategies" + +# ╔═╡ 3862b9d0-e085-4efc-9838-5bc9852b65c6 +md"The objective of `MINDFul.jl` is to provide the scientific networking community with a flexible tool for algorithmic research in multi-domain intent-driven coordination. +Following, we showcase how users can add such functionality. The interface at the moment is still rather rough and hacky; in the future, it will be more friendly and standardized. + +To keep things simpler, we will focus only on the intra-domain scenario, i.e., we will develop a mechanism to compile intents for a single domain. + +Previously we passed in `MINDF.shortestavailpath` to compile the connectivity intent. This intent compilation algorithm finds the shortest path that satisfies the intent requirements. Following, we will develop a technique to find the longest path. + +The [`MINDFul.compile!`](https://github.com/UniStuttgart-IKR/MINDFul.jl/blob/1733fb021e714a4dbfe06c0ec71a24ba006d137e/src/IBN/algorithms.jl#L2) is the core function responsible for intent compilation. +It works by passing in an `algmethod` function of how the compilation should be done. +This `algmethod` function should have several method implementations for: +- intra-domain +- inter-domain, where the connectivity intent source is inside the domain +- inter-domain, where the connectivity intent destination is inside the domain + +Now, as mentioned, we will only focus on an implementation for the intra-domain case. +We can use the `MINDF.shortestavailpath!` source code implementation as a guide. +" + +# ╔═╡ e036029f-6e96-4aa8-8a58-343ccf5be379 +function longestavailpath!(ibn::IBN, idagnode::IntentDAGNode{R}, ::MINDF.IntraIntent; time, k = 100) where {R<:ConnectivityIntent} + conint = getintent(idagnode) + source = MINDF.localnode(ibn, getsrc(conint); subnetwork_view=false) + dest = MINDF.localnode(ibn, getdst(conint); subnetwork_view=false) + + yenpaths = yen_k_shortest_paths(MINDF.getgraph(ibn), source, dest, MINDF.linklengthweights(ibn), k) + # call an internal function that picks the first available path + # use the first fil spectrum alocation algorithm as before (https://ieeexplore.ieee.org/document/6421472) + MINDF.deployfirstavailablepath!(ibn, idagnode, reverse(yenpaths.paths), reverse(yenpaths.dists); spectrumallocfun=MINDF.firstfit, time) + return getstate(idagnode) +end + +# ╔═╡ 34eddf5a-acc7-43ec-96b9-5790443aeeae +md"Let's create a new intent the same as before to test our new algorithm." + +# ╔═╡ 99d77b9b-1385-4d7a-8200-605cb93eddcd +idi3 = let + myintent = ConnectivityIntent((myibns[1].id, 1), (myibns[1].id, 9), 50) + idi = addintent!(myibns[1], myintent) + # use longestavailpath as a compilation method + deploy!(myibns[1], idi, MINDF.docompile, MINDF.SimpleIBNModus(), longestavailpath!; time=nexttime()); + deploy!(myibns[1], idi, MINDF.doinstall, MINDF.SimpleIBNModus(), MINDF.directinstall!; time=nexttime()); + idi +end + +# ╔═╡ 470604c9-896c-4925-bf76-14431fb3fcf0 +let + f,a,_ = ibnplot(myibns, intentidx=[idi3], axis=(title="Visualization of the installed intent with the self-written compilation algorithm",)) + hidedecorations!(a) + f +end + +# ╔═╡ 4c456452-a4d8-4ab4-b4d3-bf85d74a4f13 +md"We successfully defined a new compilation algorithm for a connectivity intent! + +We admit that the interface to define such might be a little bit cryptic and rough. +Future efforts will focus on facilitating the interface and making it more user friendly." + +# ╔═╡ Cell order: +# ╟─33f1d64a-0c07-4cfd-a901-7e9a2b4adf4a +# ╟─9a460ae7-a468-489e-a0ff-93507a68a793 +# ╟─294ead79-e37e-4619-b192-88e9643f00cd +# ╠═442e4738-9246-11ed-18bc-3d0b1c400eca +# ╠═7f5da610-0fcc-4000-ae2d-55c404b95cc5 +# ╟─8fe8e74b-c5d0-4da0-8572-f43a8a6abbcd +# ╠═97de85e8-6efd-4153-943f-794a003797f4 +# ╟─b8deb081-9c6d-4f7c-b1e1-557d2bc58e52 +# ╠═58f3950b-114f-4a08-b14d-49f78242ea5c +# ╠═0949e348-477f-42eb-ad02-a4c54e5276f2 +# ╟─a79e5108-5ecf-486b-ae6d-b1e029b199b3 +# ╠═b19d418c-7737-41a6-a870-b78321286d57 +# ╠═07cf093a-a610-465d-b110-b9b6a2623f15 +# ╠═91022a1b-a76d-4c9e-a1d6-b6ee05415730 +# ╟─67f1f3c7-4002-4999-9620-033ecda299b9 +# ╠═d496ab73-643a-4e13-b460-63222392c7ab +# ╠═c4edef24-83f7-4813-9c6b-83d9844f08ed +# ╟─b445e9d2-3486-41f7-a7a7-f9e66447608b +# ╠═778ceea9-0b17-49d4-8b59-09fb100d18c8 +# ╟─007a85c3-7bf1-4b50-91c4-31b3111be181 +# ╟─e2381f46-e0df-4fc2-982a-04a5e13eddb0 +# ╟─f3a5af7a-a012-4cdd-a777-a75ad46be332 +# ╠═d2a8ace9-148b-4d39-a854-f3f663272b7e +# ╟─ae04da87-98f9-45ad-bdbb-2b25adfb2645 +# ╟─1a83766b-da55-4ee2-8dad-db86ff0efc20 +# ╠═d95a36e4-0c72-4eac-b7ac-58cd2fe46c91 +# ╟─4eec91ea-9485-4302-98cd-c07ad7c77f54 +# ╠═f9f75535-0066-401f-8325-4f3a2044a295 +# ╟─a22395bf-d0e8-45b1-ad33-0698d0c013b9 +# ╠═1ae38bb5-fe3c-466b-8842-05da76a71331 +# ╟─0f5c3eda-fe78-49fe-9ae9-63e11f9c0171 +# ╠═903dd513-2b1a-4fd3-8794-8549ecf126ce +# ╟─9a5308bc-ff2c-4589-b907-647d13850a2c +# ╠═04540e14-d6bb-4350-92fa-77045ed0ec0c +# ╟─bb54227a-f2ea-41a4-a8b2-c04d56d28542 +# ╠═4683e35d-69eb-4d43-b24e-da67eeb216bd +# ╟─45ce090a-6377-4824-9733-8e4f76912dc4 +# ╠═ad1aecd8-6ae1-4b2e-a7e2-ffa1c7463418 +# ╟─3670dc7c-4af4-45e7-bdbb-dd9172949d7c +# ╠═f2555f38-b7ab-44db-93c3-b07581139e68 +# ╠═95a6e312-4ea7-449d-9724-f2e6bc1be771 +# ╟─92e24a68-2cbd-40b5-9491-0caea27bb4cd +# ╠═74471fd5-fa91-4275-8870-81b74dfd09da +# ╠═d4526365-257b-41b6-b7a4-8913c67a71a3 +# ╟─c80799b9-9363-467b-aec2-3d495b1cec50 +# ╟─3862b9d0-e085-4efc-9838-5bc9852b65c6 +# ╠═e036029f-6e96-4aa8-8a58-343ccf5be379 +# ╟─34eddf5a-acc7-43ec-96b9-5790443aeeae +# ╠═99d77b9b-1385-4d7a-8200-605cb93eddcd +# ╠═470604c9-896c-4925-bf76-14431fb3fcf0 +# ╟─4c456452-a4d8-4ab4-b4d3-bf85d74a4f13 diff --git a/simplenotebookexample.plutostate b/simplenotebookexample.plutostate new file mode 100644 index 0000000..696e665 Binary files /dev/null and b/simplenotebookexample.plutostate differ