Skip to content

Instantly share code, notes, and snippets.

@pushpendre
Created July 4, 2021 19:49
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save pushpendre/359706010c20bc1d18123510749f5da5 to your computer and use it in GitHub Desktop.
Save pushpendre/359706010c20bc1d18123510749f5da5 to your computer and use it in GitHub Desktop.
PID Controller for controlling the number of servers in a data-center. This notebook accompanies the video https://youtu.be/pKuVUmpYkLk
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### PID Controller for controlling the num of servers in a data-center\n",
"\n",
"* This notebook accompanies the video https://youtu.be/pKuVUmpYkLk"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"import numpy as np\n",
"from bisect import bisect_left, bisect_right\n",
"from pdb import set_trace as st\n",
"from dataclasses import dataclass\n",
"from typing import Optional, List\n",
"from collections import defaultdict, deque\n",
"from itertools import islice\n",
"SPD = 24 * 3600 # Seconds per day\n",
"\n",
"class Env:\n",
" def __init__(self):\n",
" self.resolution = 1\n",
" self.current_time = 0\n",
" \n",
" def time(self):\n",
" self.current_time += 1\n",
" return self.current_time - 1\n",
" \n",
" def time_series(self):\n",
" while True:\n",
" yield self.time()\n",
" \n",
" def reset(self):\n",
" self.current_time = 0 \n",
"\n",
"@dataclass\n",
"class Task:\n",
" creation_time: float\n",
" end_time: Optional[float]\n",
" proc_time_needed: float\n",
" proc_time_remaining: float\n",
" server: Optional[int] = None\n",
" thread: Optional[int] = None\n",
"\n",
"def mean_load(t):\n",
" return int(550 - 450 * np.cos((t % SPD)/SPD * 2 * np.pi))"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4XuzdCdic470w8H82iYilhNqJBBFijYg1KrEkKEc5qj2tqrVUKbWEWGpJLK22Dp9WUd3sp3Xaip2KPYLatyT2pUkQZJPt/a5neqRiZvLOzDvvzDzP/Oa6zvV9zdzr73+7r/f+z7N0aGlpaQkfAgQIECBAgAABAgQIECBAgAABAgQyKdBBAjCTcTUpAgQIECBAgAABAgQIECBAgAABAjkBCUALgQABAgQIECBAgAABAgQIECBAgECGBSQAMxxcUyNAgAABAgQIECBAgAABAgQIECAgAWgNECBAgAABAgQIECBAgAABAgQIEMiwgARghoNragQIECBAgAABAgQIECBAgAABAgQkAK0BAgQIECBAgAABAgQIECBAgAABAhkWkADMcHBNjQABAgQIECBAgAABAgQIECBAgIAEoDVAgAABAgQIECBAgAABAgQIECBAIMMCEoAZDq6pESBAgAABAgQIECBAgAABAgQIEJAAtAYIECBAgAABAgQIECBAgAABAgQIZFhAAjDDwTU1AgQIECBAgAABAgQIECBAgAABAhKA1gABAgQIECBAgAABAgQIECBAgACBDAtIAGY4uKZGgAABAgQIECBAgAABAgQIECBAQALQGiBAgAABAgQIECBAgAABAgQIECCQYQEJwAwH19QIECBAgAABAgQIECBAgAABAgQISABaAwQIECBAgAABAgQIECBAgAABAgQyLCABmOHgmhoBAgQIECBAgAABAgQIECBAgAABCUBrgAABAgQIECBAgAABAgQIECBAgECGBSQAMxxcUyNAgAABAgQIECBAgAABAgQIECAgAWgNECBAgAABAgQIECBAgAABAgQIEMiwgARghoNragQIECBAgAABAgQIECBAgAABAgQkAK0BAgQIECBAgAABAgQIECBAgAABAhkWkADMcHBNjQABAgQIECBAgAABAgQIECBAgIAEoDVAgAABAgQIECBAgAABAgQIECBAIMMCEoAZDq6pESBAgAABAgQIECBAgAABAgQIEJAAtAYIECBAgAABAgQIECBAgAABAgQIZFhAAjDDwTU1AgQIECBAgAABAgQIECBAgAABAhKA1gABAgQIECBAgAABAgQIECBAgACBDAtIAGY4uKZGgAABAgQIECBAgAABAgQIECBAQALQGiBAgAABAgQIECBAgAABAgQIECCQYQEJwAwH19QIECBAgAABAgQIECBAgAABAgQISABaAwQIECBAgAABAgQIECBAgAABAgQyLCABmOHgmhoBAgQIECBAgAABAgQIECBAgAABCUBrgAABAgQIECBAgAABAgQIECBAgECGBSQAMxxcUyNAgAABAgQIECBAgAABAgQIECAgAWgNECBAgAABAgQIECBAgAABAgQIEMiwgARghoNragQIECBAgAABAgQIECBAgAABAgQkAK0BAgQIECBAgAABAgQIECBAgAABAhkWkADMcHBNjQABAgQIECBAgAABAgQIECBAgIAEoDVAgAABAgQIECBAgAABAgQIECBAIMMCEoAZDq6pESBAgAABAgQIECBAgAABAgQIEJAAtAYIECBAgAABAgQIECBAgAABAgQIZFhAAjDDwTU1AgQIECBAgAABAgQIECBAgAABAhKA1gABAgQIECBAgAABAgQIECBAgACBDAtIAGY4uKZGgAABAgQIECBAgAABAgQIECBAQALQGiBAgAABAgQIECBAgAABAgQIECCQYQEJwAwH19QIECBAgAABAgQIECBAgAABAgQISABaAwQIECBAgAABAgQIECBAgAABAgQyLCABmOHgmhoBAgQIECBAgAABAgQIECBAgAABCUBrgAABAgQIECBAgAABAgQIECBAgECGBSQAMxxcUyNAgAABAgQIECBAgAABAgQIECAgAWgNECBAgAABAgQIECBAgAABAgQIEMiwgARghoNragQIECBAgAABAgQIECBAgAABAgQkAK0BAgQIECBAgAABAgQIECBAgAABAhkWkADMcHBNjQABAgQIECBAgAABAgQIECBAgIAEoDVAgAABAgQIECBAgAABAgQIECBAIMMCEoAZDq6pESBAgAABAgQIECBAgAABAgQIEJAAtAYIECBAgAABAgQIECBAgAABAgQIZFhAAjDDwTU1AgQIECBAgAABAgQIECBAgAABAhKA1gABAgQIECBAgAABAgQIECBAgACBDAtIAGY4uKZGgAABAgQIECBAgAABAgQIECBAQALQGiBAgAABAgQIECBAgAABAgQIECCQYQEJwAwH19QIECBAgAABAgQIECBAgAABAgQISABaAwQIECBAgAABAgQIECBAgAABAgQyLCABmOHgmhoBAgQIECBAgAABAgQIECBAgAABCUBrgAABAgQIECBAgAABAgQIECBAgECGBSQAMxxcUyNAgAABAgQIECBAgAABAgQIECAgAWgNECBAgAABAgQIECBAgAABAgQIEMiwgARghoNragQIECBAgAABAgQIECBAgAABAgQkAK0BAgQIECBAgAABAgQIECBAgAABAhkWkADMcHBNjQABAgQIECBAgAABAgQIECBAgIAEoDVAgAABAgQIECBAgAABAgQIECBAIMMCEoAZDq6pESBAgAABAgQIECBAgAABAgQIEJAAtAYIECBAgAABAgQIECBAgAABAgQIZFhAAjDDwTU1AgQIECBAgAABAgQIECBAgAABAhKA1gABAgQIECBAgAABAgQIECBAgACBDAtIAGY4uKZGgAABAgQIECBAgAABAgQIECBAQALQGiBAgAABAgQIECBAgAABAgQIECCQYQEJwAwH19QIECBAgAABAgQIECBAgAABAgQISABaAwQIECBAgAABAgQIECBAgAABAgQyLCABmOHgmhoBAgQIECBAgAABAgQIECBAgAABCUBrgAABAgQIECBAgAABAgQIECBAgECGBSQAMxxcUyNAgAABAgQIECBAgAABAgQIECAgAWgNECBAgAABAgQIECBAgAABAgQIEMiwgARghoNragQIECBAgAABAgQIECBAgAABAgQkAK0BAgQIECBAgAABAgQIECBAgAABAhkWkADMcHBNjQABAgQIECBAgAABAgQIECBAgIAEoDVAgAABAgQIECBAgAABAgQIECBAIMMCEoAZDq6pESBAgAABAgQIECBAgAABAgQIEJAAtAYIECBAgAABAgQIECBAgAABAgQIZFhAAjDDwTU1AgQIECBAgAABAgQIECBAgAABAhKA1gABAgQIECBAgAABAgQIECBAgACBDAtIAGY4uKZGgAABAgQIECBAgAABAgQIECBAQALQGiBAgAABAgQIECBAgAABAgQIECCQYQEJwAwH19QIECBAgAABAgQIECBAgAABAgQISABaAwQIECBAgAABAgQIECBAgAABAgQyLCABmOHgmhoBAgQIECBAgAABAgQIECBAgAABCUBrgAABAgQIECBAgAABAgQIECBAgECGBSQAMxxcUyNAgAABAgQIECBAgAABAgQIECAgAWgNECBAgAABAgQIECBAgAABAgQIEMiwgARghoNragQIECBAgAABAgQIECBAgAABAgQkAK0BAgQIECBAgAABAgQIECBAgAABAhkWkADMcHBNjQABAgQIECBAgAABAgQIECBAgIAEoDVAgAABAgQIECBAgAABAgQIECBAIMMCEoAZDq6pESBAgAABAgQIECBAgAABAgQIEJAAtAYIECBAgAABAgQIECBAgAABAgQIZFhAAjDDwTU1AgQIECBAgAABAgQIECBAgAABAhKA1gABAgQIECBAgAABAgQIECBAgACBDAtIAGY4uKZGgAABAgQIECBAgAABAgQIECBAQALQGiBAgAABAgQIECBAgAABAgQIECCQYQEJwAwH19QIECBAgAABAgQIECBAgAABAgQISABaAwQIECBAgAABAgQIECBAgAABAgQyLCABmOHgNvLUZs+eHc8880xuiCuuuGJ07ty5kYdrbAQIECBAgAABAgQIECBAIJUC8+bNiylTpuTG3r9//+jWrVsq52HQbROQAGybn9oVCjz22GMxcODACmurRoAAAQIECBAgQIAAAQIECJQrMG7cuNhyyy3LraZ8BgQkADMQxDROQQIwjVEzZgIECBAgQIAAAQIECBBIs4AEYJqj17axSwC2zU/tCgVee+216NWrV652sgGtssoqFbakGgECBAgQIECAAAECBAgQIFBM4N133114B96rr74aa6+9NqwmFJAAbMKgN8KU33rrrVhjjTVyQ3nzzTdj9dVXb4RhGQMBAgQIECBAgAABAgQIEMiUgPN3psJZ8WQkACumU7EtAjagtuipS4AAAQIECBAgQIAAAQIEShNw/i7NKeulJACzHuEGnZ8NqEEDY1gECBAgQIAAAQIECBAgkCkB5+9MhbPiyUgAVkynYlsEbEBt0VOXAAECBAgQIECAAAECBAiUJuD8XZpT1ktJAGY9wg06PxtQgwbGsAgQIECAAAECBAgQIEAgUwLO35kKZ8WTkQCsmE7FtgjYgNqipy4BAgQIECBAgAABAgQIEChNwPm7NKesl5IAzHqEG3R+NqAGDYxhESBAgAABAgQIECBAgECmBJy/MxXOiicjAVgxnYptEbABtUVPXQIECBAgQIAAAQIECBAgUJqA83dpTlkvJQGY9Qg36PxsQA0aGMMiQIAAAQIECBAgQIAAgUwJOH9nKpwVT0YCsGI6FdsiYANqi566BAgQIECAAAECBAgQIECgNAHn79Kcsl5KAjDrEW7Q+dmAGjQwhkWAAAECBAgQIECAAAECmRJw/s5UOCuejARgxXQqtkXABtQWPXUJECBAgAABAgQIECBAgEBpAs7fpTllvZQEYNYj3KDzswE1aGAMiwABAgQIECBAgAABAgQyJeD8nalwVjwZCcCK6VRsi4ANqC166hIgQIAAAQIECBAgQIAAgdIEnL9Lc8p6KQnArEe4QednA2rQwBgWAQIECBAgQIAAAQIECGRKwPk7U+GseDISgBXTqdgWARtQW/TUJUCAAAECBAgQIECAAAECpQk4f5fmlPVSEoBZj3CDzs8G1KCBMSwCBAgQIECAAAECBAgQyJSA83emwlnxZCQAK6ZTsS0CNqC26KlLgAABAgQIECBAgAABAgRKE3D+Ls0p66UkALMe4Qadnw2oQQNjWAQIECBAgAABAgQIECCQKQHn70yFs+LJSABWTKdiWwRsQG3RU5cAAQIECBAgQIAAAQIECJQm4PxdmlPWS0kAZj3CDTo/G1CDBsawCBAgQIAAAQIECBAgQCBTAs7fmQpnxZORAKyYTsW2CNiA2qKnLgECBAgQIECAAAECBAgQKE3A+bs0p6yXkgAsIcKTJ0+OcePG5f7vsccey/3f+++/n6t54IEHxtVXX11CK/8ucuutt8bll1+ea2fKlCmx4oorxpZbbhmHHXZYDBs2rKS25s2bF1dccUX88Y9/jBdffDGmT58eq666agwdOjR+8IMfxIYbblhSO1OnTo2LL744br755njttddyddZee+3Ye++945hjjokVVlihpHbKLWQDKldMeQIECBAgQIAAAQIECBAgUL6A83f5ZlmsIQFYQlQ7dOhQtFQ5CcAFCxbkknxXXnll0fYOOeSQ+NWvfhUdO3YsWiZJ2g0fPjyXQCz06dq1a1xyySWRtLW4z6OPPppL9L333nsFi62yyiq5xODAgQNLUCqviA2oPC+lCRAgQIAAAQIECBAgQIBAJQLO35WoZa+OBGAJMf18AnDNNdeMvn37xh133JGrWU4CcMSIEXHeeefl6m222WZx4oknRu/evWPixIlxwQUXxJNPPpn7Lik3atSogiObP39+7LjjjvHAAw/kvt9nn33i0EMPjeWXXz6ShN4555wTyRWLSQLxb3/7W9ErCt98883YYostclcgdu7cOY477rjYY489cm0m9S666KJIrjJcaaWV4vHHH4/VV1+9BKnSi9iASrdSkgABAgQIECBAgAABAgQIVCrg/F2pXLbqSQCWEM8zzjgjd4tu8n9f/vKXc7fK9urVq6wE4Msvv5y7LTdJqg0YMCDGjh0bSy655MLeZ86cGYMHD47x48fnEnIvvPBC9OnTJ290V111VRx88MG5fz/yyCPj0ksvXaTMhAkTcom9jz/+OFc/aSdp74ufb3/72/H73/8+98833HBD7LfffosUSf5t//33L2uOJVAuLGIDKkdLWQIECBAgQIAAAQIECBAgUJmA83dlblmrJQFYQUQrSQAmybrLLrss19vDDz8cgwYNyuv5kUceia233jr374WSe8m/9+vXL5fUS674S67i6969e147yVWGyVWExZJ7yS2/q622WiS3JO+6665x2223FVTYbbfd4vbbb89dTfj222/HyiuvXIFW4So2oKpRaogAAQIECBAgQIAAAQIECBQVcP62OBIBCcAK1kG5CcCWlpbcLbTvvPNO7vbhJIFX7JN8/9JLL+USdEmC7/O3HydXEa6//vq5qkccccTChOIX20oSfMnz+5LPAQccENdcc80iRZIXkBx++OG5f7vuuusWXun3xXaS75L6ySd5LmHy/MJqfWxA1ZLUDgECBAgQIECAAAECBAgQKC7g/G11JAISgBWsg3ITgJMmTco96y/5JIm3X/7yl0V7Tb5PEnTJJ6n32a3Gyf/+/O2/1157bXz9618v2k6SKEwShskzC19//fVFyn3+9t9333236JV9yXfJm4WTT1Lnt7/9bQVahavYgKpGqSECBAgQIECAAAECBAgQIFBUwPnb4pAArHANlJsATF6qseeee+Z6+9nPfhbHHnts0Z6T75MXciSfW265Jfe2388+P/rRj+KnP/1p7n8mLwzZdNNNi7az1157xV/+8pfcFYSffPJJLLXUUgvLJs8gTF7sseyyy8a0adMWq5CUSZ4nmDz/cNy4cRWK5VezAVWNUkNlCiRX5E6cMj2W6NQp1lwh/xb6MptTnAABAgQIECBAgAABAg0t4Pzd0OGp2eBcAVgBdbkJwOSKv+9973u5nm688cbYd999i/Z60003LXwhR1Lvs1t1kwrJFX/XX399rm7y9t6ePXsWbef73//+wheEvPjiiwtvHU4qJM/y++c//5l7Kcmzzz67WIGNNtoonnvuuVyd5IrAUj/JBrO4T9LWwIEDc0WSW52r/ZbhUsepXLYExr36Qdz/ypSYM39B0Yn96r5JC79bskun+PY2axUt27Vzp9ip70qx6RrLZQvKbAgQIECAAAECBAgQaBoBCcCmCfViJyoBWME6KDcBeOGFF8aJJ56Y6+nWW2+N5OUaxT7J959d9feTn/wkjj/++IVFd9999xgzZkzuf8+aNSu6detWtJ2TTjopLrjggtz3yZuFkzcDf/ZJrgZM3jq81VZbRfLikcV9kjLJlX89evTIXUlY6ufzzy5srY4EYGtCvv+iwOy582Pegpa4/L6Jcf+EqbFgQUs89dZH7Qq1yerLRqeOHWLnfivHt7deKzp36hBJgtCHAAECBAgQIECAAAECjSwgAdjI0and2CQAK7AuNwF49tlnx+mnn57r6e67746ddtqpaK/33HNPDBkyJPd9Um/kyJELyyb/nnyffObPn597O2+xT9JfUj/53H///bHddtstLNqpU6fcG4C33377GDt27GIFdthhh1z9pM68efNK1pIALJlKwRIE5i9oiWff/ihe/ucnccJNT5dQo3ZFfvH1TaP3ij1iw1WXWeSlPbUbgZ4IECBAgAABAgQIECBQXEAC0OpIBCQAK1gH5SYAm/EKQLcAV7CwVMkTeP6dj+O2Z9+Ni++ZkAqdY4euG3tsvGr0WalHKsZrkAQIECBAgAABAgQIZF9AAjD7MS5lhhKApSh9oUy5CcBmfAZga6w2oNaEmvf75PbeX943MX49dlLMmDO/YoghfVeKZbt3yas/bebcuOfFybl/323DlaN71/zbeN/7aHY8NPH9ivv+8jJd47vb9oqDtu0VS3QufqVuxR2oSIAAAQIECBAgQIAAgRIFnL9LhMp4MQnACgJcbgLQW4DzkW1AFSy8DFdJnuH3j7emxcFXPxYfzpxb0UzP3nuj6Na5Y/To2jm26d2zYPKvnIbfn/5pPDzp/Zg1Z358MntenPW358upvrDs6l9aMn75X1u4RbgiPZUIECBAgAABAgQIEGirgPN3WwWzUV8CsII4lpsAnDRpUvTu3TvXU/JW3+SKwGKf5PvLL78893VSr1evXguLXnXVVXHwwQfn/ve1116beytwsc/6668fL7/8cqy55prx+uuvL1Ls29/+dvz+97/P/VvyNt7kDb+FPsl3q666au6rpM5v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IkAAkMMCAQQQQAABBBBAAAEEEEAAAQQQQACBGAsQAIxx59I0BBBAAAEEEEAAAQQQQAABBBBAAAEECAByDCCAAAIIIIAAAggggAACCCCAAAIIIBBjAQKAMe5cmoYAAggggAACCCCAAAIIIIAAAggggAABQI4BBBBAAAEEEEAAAQQQQAABBBBAAAEEYixAADDGnUvTEEAAAQQQQAABBBBAAAEEEEAAAQQQIADIMYAAAggggAACCCCAAAIIIIAAAggggECMBQgAxrhzaRoCCCCAAAIIIIAAAggggAACCCCAAAIEADkGEEAAAQQQQAABBBBAAAEEEEAAAQQQiLEAAcAYdy5NQwABBBBAAAEEEEAAAQQQQAABBBBAgAAgxwACCCCAAAIIIIAAAggggAACCCCAAAIxFiAAGOPOpWkIpAtce+21dtttt5X8afz48XbwwQeXiTRu3Dh7+OGHbfr06bZs2TJr1KiR7bfffnbuueda3759swLetGmTjRo1yp5++mmbPXu2/fLLL9a0aVPr3bu3XXrppdauXbus8lm+fLnde++99t///te++uorZ5/dd9/djjvuOLvsssts++23zyqfTz/91O677z5788037dtvv7V69epZ69at7fTTT7ezzz7bqlevnlU+bJQMgcWLF9ujjz5qr7zyii1atMh+/vln5zzQsXfIIYfYySefbHvttZcnBudQMo4TWpkpsGHDBnvyySftueees08++cRWrFhhNWrUsJ122skOPPBAO+ecc5z/Ly9xDpUnxOdREli6dKlNmzbN+Z++W+l/P/74o9OEP/7xj/bEE0/k1BzOD28uP2xy6gw2zruAH+fP2rVr7dVXX7U33njDPvjgA5s3b54zNtlmm22sVatWdvjhh9v5559vTZo0yao9ym/EiBHOvW7+/Pn266+/2i677GJHHnmkM87ZbbfdsspH3zE1ztH3za+//tpq1aplLVq0cL5nXnTRRVa3bt2s8nn//fft/vvvt3fffdd++OEH23bbbW2fffaxP/3pT3bqqadmlYc2Gj16tD3++OPO/funn36yxo0bW/fu3Z26HHDAAVnnw4bhEyAAGL4+oUYI+C4wc+ZMJ3CnYFwqlRUALCoqcoJ8Cnx4JQXLHnroIatatarnNgra9evXz/mC65Z0c9NNU3mVlaZOneoE+r7//nvXzXbccUcnMNilS5cy83nkkUfs4osvNg1M3ZL21423YcOGvvcBGUZPQIHi/v3725o1azwrr+Dz3XffnfE55xDnUPSOeP9qrIGMBj+fffZZmZlecsklds8991iVKlU4h/6/APch/47DMObkdqyn6plLAJB7jPc9xi+bMB4/Sa9TZc8fBbMOOuggJ+BXVlIwUBMgTjnllDK3U/BQ45wvv/zSdTvlowkQRx11VJn5vPTSS3bGGWfY6tWrXbdTYFLjk5YtW5aZz0033WSDBw82nQNuSffl559/3mrXru2Zz7p16+zEE0+0sWPHum6jcd+gQYPsxhtvTPrhGNn2EwCMbNdRcQSyE9BNoGvXrk4QbocddjD9eqZUVgBQQY/hw4c723Xo0MGuueYa51co/bKlWYQzZsxwPtN2Q4cOda3I5s2bnRmGkyZNcj7/3e9+58z4aNCggSmgN2TIEKcuupG8/PLLnjMK9StYp06dnBmImp135ZVXltxItd9dd93lBDbVtg8//NB23nln1/roRnb00Uc7N0X9inXDDTfY/vvv78xKUWBwzJgxzn7dunWzd955x6pVq5YdMFvFUkDH58CBA5226YuXjl0F0evXr+/M1tA58J///Mc5hnQMlk6cQ5xDsTwxsmjUxo0bnftGKvi39957O9ftPffc05lBq3vCnXfeWRJYHzZsmF133XWcQ9yHsji6or9JegBj1113dZ5AeP31152G5RIA5B7jfY/xwyb6R1o8W1DZ80f3H81iU1IgUIG5zp07O08RaZyhsYDGBBoraBygwJzXE0+6n2nfuXPnOvnpe+Lvf/97q1OnjjPG0r1NgUbN3Hvvvfds3333de0UfZ9UXRR401NJOn71hIn+/a9//cupT+q7qGYsbr311q75aFKGZi4qacx2/fXXW/v27Z2nnfRDm+qkpFmAzzzzjOcBos9VrpLqoR+69eTWrFmznDGfxoJKKk+TRUjREyAAGL0+o8YI5CSg2UlXXHGF8yXz+OOPd25ISl4BQN3I9Fiugmq6sU2cONG5maWSprr37NnTmTavgNwXX3zh+ovUY489ZmeddZaz24UXXmgjR47cot761UyBPf3apV+0lI/b47dnnnmm/fOf/3T2ffbZZ+2kk07aIh/9LfULndeXZw1I1f4FCxY4U/w/F5tgWwAAHV5JREFU+ugj5+aYnjSlXVPmlTTlXVPlSckUeOutt5xH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gAACCCCAAAIIIIAAAggggAACCCDguwABQN9JyRABBBBAAAEEEEAAAQQQQAABBBBAAIHwCBAADE9fUBMEEEAAAQQQQAABBBBAAAEEEEAAAQR8FyAA6DspGSKAAAIIIIAAAggggAACCCCAAAIIIBAeAQKA4ekLaoIAAggggAACCCCAAAIIIIAAAggggIDvAgQAfSclQwQQQAABBBBAAAEEEEAAAQQQQAABBMIjQAAwPH1BTRBAAAEEEEAAAQQQQAABBBBAAAEEEPBdgACg76RkiAACCCCAAAIIIIAAAggggAACCCCAQHgECACGpy+oCQIIIIAAAggggAACCCCAAAIIIIAAAr4LEAD0nZQMEUAAAQQQQAABBBBAAAEEEEAAAQQQCI8AAcDw9AU1QQABBBBAAAEEEEAAAQQQQAABBBBAwHcBAoC+k5IhAggggAACCCCAAAIIIIAAAggggAAC4REgABievqAmCCCAAAIIIIAAAggggAACCCCAAAII+C5AANB3UjJEAAEEEEAAAQQQQAABBBBAAAEEEEAgPAIEAMPTF9QEAQQQQAABBBBAAAEEEEAAAQQQQAAB3wUIAPpOSoYIIIAAAggggAACCCCAAAIIIIAAAgiER4AAYHj6gpoggAACCCCAAAIIIIAAAggggAACCCDguwABQN9JyRABBBBAAAEEEEAAAQQQQAABBBBAAIHwCBAADE9fUBMEEEAAAQQQQAABBBBAAAEEEEAAAQR8FyAA6DspGSKAAAIIIIAAAggggAACCCCAAAIIIBAeAQKA4ekLaoIAAggggAACCCCAAAIIIIAAAggggIDvAgQAfSclQwQQQAABBBBAAAEEEEAAAQQQQAABBMIjQAAwPH1BTRBAAAEEEEAAAQQQQAABBBBAAAEEEPBdgACg76RkiAACCCCAAAIIIIAAAggggAACCCCAQHgECACGpy+oCQIIIIAAAggggAACCCCAAAIIIIAAAr4LEAD0nZQMEUAAAQQQQAABBBBAAAEEEEAAAQQQCI8AAcDw9AU1QQABBBBAAAEEEEAAAQQQQAABBBBAwHcBAoC+k5IhAggggAACCCCAAAIIIIAAAggggAAC4REgABievqAmCCCAAAIIIIAAAggggAACCCCAAAII+C5AANB3UjJEAAEEEEAAAQQQQAABBBBAAAEEEEAgPAIEAMPTF9QEAQQQQAABBBBAAAEEEEAAAQQQQAAB3wUIAPpOSoYIIIAAAggggAACCCCAAAIIIIAAAgiER4AAYHj6gpoggAACCCCAAAIIIIAAAggggAACCCDguwABQN9JyRABBBBAAAEEEEAAAQQQQAABBBBAAIHwCBAADE9fUBMEEEAAAQQQQAABBBBAAAEEEEAAAQR8FyAA6DspGSKAAAIIIIAAAggggAACCCCAAAIIIBAeAQKA4ekLaoIAAggggAACCCCAAAIIIIAAAggggIDvAgQAfSclQwQQQAABBBBAAAEEEEAAAQQQQAABBMIjQAAwPH1BTRBAAAEEEEAAAQQQQAABBBBAAAEEEPBdgACg76RkiAACCCCAAAIIIIAAAggggAACCCCAQHgE/h/r8i3nwsJxrQAAAABJRU5ErkJggg==\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x112a26d68>]"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"plt.plot(*zip(*((t, mean_load(t)) \n",
" for t \n",
" in islice(env.time_series(), SPD))))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 103 Plant(server=1, done=91, waiting=12, avg_freq=7.016732207571905)\n",
" 112 Plant(server=1, done=15146, waiting=909, avg_freq=0.10960345470089262)\n",
" 239 9.575596254633485 --> 2 <-- 9.575596254633485\n",
" 91 Plant(server=2, done=31042, waiting=1051, avg_freq=0.09037971228522423)\n",
" 479 2.2099856484879785 --> 1 <-- 2.2099856484879785\n",
" 109 Plant(server=2, done=47967, waiting=3, avg_freq=12.815583749839622)\n",
" 87 Plant(server=1, done=63544, waiting=337, avg_freq=0.2787409827292111)\n",
" 719 4.299246138049638 --> 1 <-- 4.299246138049638\n",
" 108 Plant(server=1, done=78607, waiting=1326, avg_freq=0.07508268480664372)\n",
" 959 9.932166576791808 --> 3 <-- 9.932166576791808\n",
" 101 Plant(server=1, done=93668, waiting=2337, avg_freq=0.04249641620569293)\n",
" 95 Plant(server=3, done=111959, waiting=2, avg_freq=13.448735019976237)\n",
"1199 1.9771975451633614 --> 2 <-- 1.9771975451633614\n",
" 107 Plant(server=3, done=127930, waiting=2, avg_freq=12.137964186997547)\n",
"1439 -2.741175486611466 --> 1 <-- -0.7411754866114659\n",
" 119 Plant(server=2, done=144171, waiting=3, avg_freq=12.218495448012229)\n",
" 95 Plant(server=1, done=159835, waiting=473, avg_freq=0.21537843873633758)\n",
"1679 4.839691503059641 --> 3 <-- 4.839691503059641\n",
" 103 Plant(server=3, done=176464, waiting=340, avg_freq=0.2727638659378863)\n",
"1919 1.590323108843443 --> 2 <-- 1.590323108843443\n",
" 113 Plant(server=3, done=193310, waiting=2, avg_freq=12.219480672074749)\n",
" 87 Plant(server=2, done=209855, waiting=0, avg_freq=13.062950982832271)\n",
"2159 -2.6718532181492254 --> 2 <-- -0.6718532181492254\n",
" 112 Plant(server=2, done=226788, waiting=0, avg_freq=12.037143184686112)\n",
"2399 -2.5746098794476127 --> 2 <-- -0.5746098794476127\n",
" 105 Plant(server=2, done=243749, waiting=1, avg_freq=12.167125803488819)\n",
" 82 Plant(server=2, done=260741, waiting=2, avg_freq=12.95870170764119)\n",
"2639 -2.542308345473082 --> 2 <-- -0.5423083454730819\n",
" 97 Plant(server=2, done=278043, waiting=2, avg_freq=12.918660287083252)\n",
"2879 -2.5332057333313 --> 2 <-- -0.5332057333312998\n",
" 129 Plant(server=2, done=295310, waiting=8, avg_freq=12.365286443559482)\n",
" 112 Plant(server=2, done=312912, waiting=6, avg_freq=12.853470437018006)\n",
"3119 -2.500091489435925 --> 2 <-- -0.500091489435925\n",
" 114 Plant(server=2, done=330835, waiting=6, avg_freq=12.49024199843605)\n",
"3359 -2.4921094562449535 --> 2 <-- -0.4921094562449535\n",
" 117 Plant(server=2, done=348694, waiting=4, avg_freq=12.295973884654728)\n",
" 120 Plant(server=2, done=366712, waiting=7, avg_freq=12.336327237310178)\n",
"3599 -2.4952656067203884 --> 2 <-- -0.49526560672038844\n",
" 112 Plant(server=2, done=385218, waiting=2, avg_freq=12.802118971412535)\n",
"3839 -2.455881125279659 --> 2 <-- -0.45588112527965885\n",
" 98 Plant(server=2, done=403671, waiting=0, avg_freq=13.153456998315031)\n",
" 104 Plant(server=2, done=422377, waiting=3, avg_freq=12.959912136188882)\n",
"4079 -2.43675314466507 --> 2 <-- -0.4367531446650701\n",
" 118 Plant(server=2, done=441458, waiting=8, avg_freq=12.951969778739269)\n",
"4319 -2.3929880807496735 --> 2 <-- -0.3929880807496735\n",
" 127 Plant(server=2, done=460692, waiting=2, avg_freq=12.17200438990416)\n",
" 128 Plant(server=2, done=480123, waiting=4, avg_freq=12.202380952378839)\n",
"4559 -2.372930215034802 --> 2 <-- -0.37293021503480217\n",
" 128 Plant(server=2, done=500095, waiting=2, avg_freq=12.069131988027456)\n",
"4799 -2.2668431476989737 --> 2 <-- -0.26684314769897366\n",
" 131 Plant(server=2, done=520350, waiting=3, avg_freq=12.094086277495052)\n",
" 110 Plant(server=2, done=540618, waiting=2, avg_freq=12.69085861591323)\n",
"5039 -2.2584635889014097 --> 2 <-- -0.25846358890140975\n",
" 131 Plant(server=2, done=561430, waiting=8, avg_freq=12.085153853306288)\n",
"5279 -2.1896619102830455 --> 2 <-- -0.18966191028304547\n",
" 127 Plant(server=2, done=582483, waiting=2, avg_freq=12.601431980905389)\n",
" 143 Plant(server=2, done=603921, waiting=4, avg_freq=12.078601045608204)\n",
"5519 -2.131138578348398 --> 2 <-- -0.13113857834839804\n",
" 135 Plant(server=2, done=625593, waiting=5, avg_freq=12.022630834510197)\n",
"5759 -2.085597599694286 --> 2 <-- -0.08559759969428615\n",
" 139 Plant(server=2, done=647671, waiting=2, avg_freq=11.627906976744692)\n",
" 148 Plant(server=2, done=669820, waiting=4, avg_freq=11.611628098491192)\n",
"5999 -1.9906966128141057 --> 2 <-- 0\n",
" 145 Plant(server=2, done=692468, waiting=7, avg_freq=12.110433604329522)\n",
"6239 -1.8841619842625872 --> 2 <-- 0\n",
" 148 Plant(server=2, done=715494, waiting=6, avg_freq=11.456111242781358)\n",
" 149 Plant(server=2, done=738759, waiting=5, avg_freq=11.562967041612016)\n",
"6479 -1.773510995413668 --> 2 <-- 0\n",
" 147 Plant(server=2, done=762300, waiting=6, avg_freq=12.174336498668996)\n",
"6719 -1.575477990396135 --> 2 <-- 0\n",
" 139 Plant(server=2, done=786642, waiting=5, avg_freq=12.50411319513377)\n",
" 146 Plant(server=2, done=811424, waiting=3, avg_freq=11.677842236119115)\n",
"6959 -1.3203453811362087 --> 2 <-- 0\n",
" 170 Plant(server=2, done=836449, waiting=7, avg_freq=11.224708658041733)\n",
"7199 -1.1148165037360178 --> 2 <-- 0\n",
" 144 Plant(server=2, done=861990, waiting=3, avg_freq=12.249272699429302)\n",
" 164 Plant(server=2, done=887830, waiting=7, avg_freq=11.239852910570033)\n",
"7439 -0.8077072957927253 --> 2 <-- 0\n",
" 163 Plant(server=2, done=914205, waiting=1, avg_freq=10.663736831906402)\n",
"7679 -0.6582569801996719 --> 2 <-- 0\n",
" 148 Plant(server=2, done=940469, waiting=4, avg_freq=11.825156612944575)\n",
" 156 Plant(server=2, done=967355, waiting=0, avg_freq=9.701577215477524)\n",
"7919 -0.37842596208303897 --> 2 <-- 0\n",
" 170 Plant(server=2, done=994678, waiting=6, avg_freq=10.953040412937533)\n",
"8159 0.7091042967294611 --> 2 <-- 0.7091042967294611\n",
" 159 Plant(server=2, done=1022816, waiting=11, avg_freq=8.162129573806945)\n",
" 196 Plant(server=2, done=1051220, waiting=26, avg_freq=5.835751312221598)\n",
"8399 1.1467815870283082 --> 2 <-- 1.1467815870283082\n",
" 193 Plant(server=2, done=1079977, waiting=23, avg_freq=8.718562874247699)\n",
"8639 3.909083117217897 --> 3 <-- 3.909083117217897\n",
" 191 Plant(server=2, done=1109628, waiting=63, avg_freq=2.664055412353511)\n",
" 186 Plant(server=3, done=1139556, waiting=1, avg_freq=12.105296867988054)\n",
"8879 -0.21086095224444398 --> 2 <-- 0\n",
" 171 Plant(server=3, done=1169953, waiting=3, avg_freq=13.02843183822943)\n",
"9119 3.513503126031352 --> 3 <-- 3.513503126031352\n",
" 183 Plant(server=2, done=1200045, waiting=751, avg_freq=0.2621101615405372)\n",
" 217 Plant(server=3, done=1232233, waiting=15, avg_freq=12.139791538945733)\n",
"9359 1.99569723510691 --> 3 <-- 1.99569723510691\n",
" 197 Plant(server=3, done=1264412, waiting=8, avg_freq=12.318440889874264)\n",
"9599 -2.2737528988321616 --> 3 <-- -0.2737528988321616\n",
" 206 Plant(server=3, done=1296899, waiting=6, avg_freq=12.20964860036598)\n",
" 211 Plant(server=3, done=1329742, waiting=9, avg_freq=12.339087619393283)\n",
"9839 -2.266419540699471 --> 3 <-- -0.26641954069947094\n",
" 212 Plant(server=3, done=1363154, waiting=8, avg_freq=11.973342369826662)\n",
"10079 -2.1392455462475715 --> 3 <-- -0.13924554624757146\n",
" 219 Plant(server=3, done=1397403, waiting=11, avg_freq=12.27028877982798)\n",
" 219 Plant(server=3, done=1432202, waiting=8, avg_freq=11.96002402927935)\n",
"10319 -2.0830786284381606 --> 3 <-- -0.0830786284381606\n",
" 220 Plant(server=3, done=1467527, waiting=6, avg_freq=11.381113503539844)\n",
"10559 -1.950868810632189 --> 3 <-- 0\n",
" 225 Plant(server=3, done=1503137, waiting=5, avg_freq=11.867254778398912)\n",
" 222 Plant(server=3, done=1539523, waiting=4, avg_freq=12.243370402067505)\n",
"10799 -1.8404629471085783 --> 3 <-- 0\n",
" 208 Plant(server=3, done=1576399, waiting=4, avg_freq=13.012398078858268)\n",
"11039 -1.7016498324367002 --> 3 <-- 0\n",
" 226 Plant(server=3, done=1613894, waiting=7, avg_freq=11.99696279422648)\n",
" 239 Plant(server=3, done=1652380, waiting=7, avg_freq=11.79406870901165)\n",
"11279 -1.3972886896815906 --> 3 <-- 0\n",
" 243 Plant(server=3, done=1691573, waiting=10, avg_freq=10.780129361546797)\n",
"11519 -1.1318285997422886 --> 3 <-- 0\n",
" 222 Plant(server=3, done=1731067, waiting=10, avg_freq=12.240264547659466)\n",
" 265 Plant(server=3, done=1771296, waiting=13, avg_freq=11.179628232993506)\n",
"11759 -0.7059993471764827 --> 3 <-- 0\n",
" 292 Plant(server=3, done=1812332, waiting=21, avg_freq=7.663982277053031)\n",
"11999 -0.2733819091123625 --> 3 <-- 0\n",
" 258 Plant(server=3, done=1853961, waiting=6, avg_freq=11.174144748158069)\n",
" 242 Plant(server=3, done=1895654, waiting=9, avg_freq=10.185185185185157)\n",
"12239 0.18526731692389392 --> 3 <-- 0.18526731692389392\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" 258 Plant(server=3, done=1938265, waiting=19, avg_freq=9.83955648565924)\n",
"12479 0.9077380310255944 --> 3 <-- 0.9077380310255944\n",
" 285 Plant(server=3, done=1981539, waiting=34, avg_freq=6.127230131555259)\n",
" 258 Plant(server=3, done=2025533, waiting=6, avg_freq=9.340751981114243)\n",
"12719 2.557735487227936 --> 3 <-- 2.557735487227936\n",
" 259 Plant(server=3, done=2069829, waiting=13, avg_freq=9.532209369374742)\n",
"12959 7.566965097298043 --> 5 <-- 7.566965097298043\n",
" 282 Plant(server=3, done=2115000, waiting=469, avg_freq=0.5667795585483608)\n",
" 282 Plant(server=5, done=2161128, waiting=5, avg_freq=12.775739357231805)\n",
"13199 1.4417024942326309 --> 4 <-- 1.4417024942326309\n",
" 277 Plant(server=5, done=2207630, waiting=1, avg_freq=12.513300702296998)\n",
"13439 -2.3009491796099217 --> 4 <-- -0.30094917960992174\n",
" 298 Plant(server=4, done=2255188, waiting=12, avg_freq=12.135526958783336)\n",
" 302 Plant(server=4, done=2303100, waiting=7, avg_freq=11.85988061577216)\n",
"13679 -2.0562925060477193 --> 4 <-- -0.05629250604771929\n",
" 281 Plant(server=4, done=2351668, waiting=12, avg_freq=12.708005629601562)\n",
"13919 -1.875387165634325 --> 4 <-- 0\n",
" 321 Plant(server=4, done=2401491, waiting=14, avg_freq=11.64009282131863)\n",
" 310 Plant(server=4, done=2451691, waiting=4, avg_freq=11.719185981621779)\n",
"14159 -1.8253591607154107 --> 4 <-- 0\n",
" 356 Plant(server=4, done=2501948, waiting=25, avg_freq=10.954777309901376)\n",
"14399 -1.677194041138334 --> 4 <-- 0\n",
" 327 Plant(server=4, done=2553421, waiting=10, avg_freq=11.435428652100839)\n",
" 356 Plant(server=4, done=2605527, waiting=21, avg_freq=9.865067466262454)\n",
"14639 -1.4830830523829 --> 4 <-- 0\n",
" 342 Plant(server=4, done=2658805, waiting=25, avg_freq=10.946871620081088)\n",
"14879 -0.9649814186066149 --> 4 <-- 0\n",
" 349 Plant(server=4, done=2713187, waiting=20, avg_freq=10.727093846202667)\n",
" 362 Plant(server=4, done=2767516, waiting=15, avg_freq=10.125760170039806)\n",
"15119 -0.8372483560549677 --> 4 <-- 0\n",
" 315 Plant(server=4, done=2822843, waiting=14, avg_freq=7.8002420764741744)\n",
"15359 -0.46779821247556275 --> 4 <-- 0\n",
" 380 Plant(server=4, done=2878652, waiting=36, avg_freq=8.4489462819732)\n",
" 326 Plant(server=4, done=2935438, waiting=17, avg_freq=12.2499399512755)\n",
"15599 0.29952791726273914 --> 4 <-- 0.29952791726273914\n",
" 380 Plant(server=4, done=2992873, waiting=33, avg_freq=8.020560996145134)\n",
"15839 1.1568634828880362 --> 4 <-- 1.1568634828880362\n",
" 365 Plant(server=4, done=3051335, waiting=48, avg_freq=5.6603773584886685)\n",
" 368 Plant(server=4, done=3110199, waiting=35, avg_freq=6.790643189226669)\n",
"16079 2.028084901666735 --> 4 <-- 2.028084901666735\n",
" 414 Plant(server=4, done=3169744, waiting=198, avg_freq=2.0529508438399517)\n",
"16319 7.439425246657725 --> 6 <-- 7.439425246657725\n",
" 361 Plant(server=4, done=3229983, waiting=223, avg_freq=1.4858667165860484)\n",
" 391 Plant(server=6, done=3291575, waiting=6, avg_freq=12.35476746787885)\n",
"16559 0.7952847069354952 --> 5 <-- 0.7952847069354952\n",
" 397 Plant(server=5, done=3354008, waiting=9, avg_freq=11.878360725440855)\n",
"16799 -2.0849420936575553 --> 5 <-- -0.08494209365755534\n",
" 407 Plant(server=5, done=3417186, waiting=16, avg_freq=11.751439254523339)\n",
" 413 Plant(server=5, done=3480750, waiting=18, avg_freq=11.91537410112813)\n",
"17039 -1.8341212019627393 --> 5 <-- 0\n",
" 416 Plant(server=5, done=3544906, waiting=22, avg_freq=11.668779532079654)\n",
"17279 -1.706927808772098 --> 5 <-- 0\n",
" 421 Plant(server=5, done=3610063, waiting=29, avg_freq=11.536297129974015)\n",
" 361 Plant(server=5, done=3676232, waiting=19, avg_freq=11.967241478717241)\n",
"17519 -1.498254239115874 --> 5 <-- 0\n",
" 401 Plant(server=5, done=3742929, waiting=14, avg_freq=11.76437634798077)\n",
"17759 -1.2446912925358582 --> 5 <-- 0\n",
" 434 Plant(server=5, done=3810492, waiting=21, avg_freq=11.262454950176709)\n",
" 436 Plant(server=5, done=3879236, waiting=14, avg_freq=10.756713586884873)\n",
"17999 -0.8691764982255255 --> 5 <-- 0\n",
" 418 Plant(server=5, done=3948499, waiting=15, avg_freq=11.644366103130086)\n",
"18239 -0.5904351105953457 --> 5 <-- 0\n",
" 450 Plant(server=5, done=4018752, waiting=42, avg_freq=11.386522075905997)\n",
" 460 Plant(server=5, done=4089281, waiting=52, avg_freq=6.393165333569128)\n",
"18479 -0.035782572684314416 --> 5 <-- 0\n",
" 430 Plant(server=5, done=4161442, waiting=19, avg_freq=11.193288990349728)\n",
"18719 0.5469191342431401 --> 5 <-- 0.5469191342431401\n",
" 452 Plant(server=5, done=4233836, waiting=28, avg_freq=8.761480229013117)\n",
" 474 Plant(server=5, done=4307274, waiting=46, avg_freq=8.207666423330128)\n",
"18959 1.781263758418839 --> 5 <-- 1.781263758418839\n",
" 463 Plant(server=5, done=4381236, waiting=44, avg_freq=6.502658275537656)\n",
"19199 4.663176676983682 --> 6 <-- 4.663176676983682\n",
" 463 Plant(server=5, done=4456204, waiting=91, avg_freq=4.370661816565395)\n",
" 491 Plant(server=6, done=4532226, waiting=18, avg_freq=11.592864433941044)\n",
"19439 1.3480804190897442 --> 6 <-- 1.3480804190897442\n",
" 507 Plant(server=6, done=4609046, waiting=26, avg_freq=11.631274131261225)\n",
"19679 -1.7920613384958628 --> 5 <-- 0\n",
" 466 Plant(server=6, done=4686852, waiting=16, avg_freq=11.772953633379927)\n",
" 505 Plant(server=5, done=4763883, waiting=914, avg_freq=0.5213029607252689)\n",
"19919 4.573658260745135 --> 7 <-- 4.573658260745135\n",
" 504 Plant(server=6, done=4840831, waiting=3038, avg_freq=0.16423937177944167)\n",
"20159 3.0724515163532353 --> 7 <-- 3.0724515163532353\n",
" 494 Plant(server=7, done=4923203, waiting=17, avg_freq=12.170877175930173)\n",
" 536 Plant(server=7, done=5003731, waiting=15, avg_freq=12.036203383375598)\n",
"20399 -2.315953370665052 --> 6 <-- -0.3159533706650519\n",
" 491 Plant(server=7, done=5085221, waiting=9, avg_freq=12.651360082841434)\n",
"20639 -1.6763424190294685 --> 6 <-- 0\n",
" 518 Plant(server=6, done=5167716, waiting=24, avg_freq=11.511878569662104)\n",
" 566 Plant(server=6, done=5250635, waiting=55, avg_freq=9.803186504247781)\n",
"20879 -0.8408868141015264 --> 6 <-- 0\n",
" 516 Plant(server=6, done=5334978, waiting=20, avg_freq=11.126535419790594)\n",
"21119 -0.2801865284293491 --> 6 <-- 0\n",
" 548 Plant(server=6, done=5420487, waiting=29, avg_freq=10.202327047639116)\n",
" 560 Plant(server=6, done=5506389, waiting=44, avg_freq=9.049697783743413)\n",
"21359 0.0029691952994324923 --> 6 <-- 0.0029691952994324923\n",
" 577 Plant(server=6, done=5593019, waiting=68, avg_freq=6.341213223301859)\n",
"21599 0.970024208048314 --> 6 <-- 0.970024208048314\n",
" 555 Plant(server=6, done=5680931, waiting=37, avg_freq=8.523960076862767)\n",
" 509 Plant(server=6, done=5769292, waiting=28, avg_freq=9.095229511144211)\n",
"21839 2.079946310301834 --> 7 <-- 2.079946310301834\n",
" 557 Plant(server=7, done=5858954, waiting=28, avg_freq=11.535688536385727)\n",
"22079 0.6213139967010655 --> 7 <-- 0.6213139967010655\n",
" 540 Plant(server=7, done=5949126, waiting=12, avg_freq=12.069554814972365)\n",
" 552 Plant(server=7, done=6040251, waiting=17, avg_freq=11.843417553145681)\n",
"22319 -1.8370756180005487 --> 6 <-- 0\n",
" 581 Plant(server=6, done=6131538, waiting=134, avg_freq=3.7561624540231526)\n",
"22559 5.936138329910393 --> 8 <-- 5.936138329910393\n",
" 541 Plant(server=6, done=6221868, waiting=2191, avg_freq=0.25849956353169595)\n",
" 590 Plant(server=8, done=6317537, waiting=22, avg_freq=12.165753197122744)\n",
"22799 1.8583655044502836 --> 8 <-- 1.8583655044502836\n",
" 601 Plant(server=8, done=6411401, waiting=20, avg_freq=12.131786923903684)\n",
"23039 -2.2406077444945987 --> 7 <-- -0.24060774449459865\n",
" 587 Plant(server=8, done=6506205, waiting=16, avg_freq=12.20858895702397)\n",
" 656 Plant(server=7, done=6602254, waiting=49, avg_freq=10.246808510631954)\n",
"23279 -1.5053694646548577 --> 7 <-- 0\n",
" 575 Plant(server=7, done=6699114, waiting=24, avg_freq=11.764249859454418)\n",
"23519 -0.9101811989487653 --> 7 <-- 0\n",
" 585 Plant(server=7, done=6796933, waiting=18, avg_freq=11.914264021613077)\n",
" 662 Plant(server=7, done=6895585, waiting=56, avg_freq=8.238090151680122)\n",
"23759 -0.6076145413230873 --> 7 <-- 0\n",
" 620 Plant(server=7, done=6994577, waiting=49, avg_freq=11.154349658358358)\n",
"23999 -0.27093920276374567 --> 7 <-- 0\n",
" 625 Plant(server=7, done=7094913, waiting=40, avg_freq=10.989395583246298)\n",
" 612 Plant(server=7, done=7196102, waiting=31, avg_freq=11.084649598992808)\n",
"24239 0.22801001658492917 --> 7 <-- 0.22801001658492917\n",
" 673 Plant(server=7, done=7297325, waiting=65, avg_freq=8.572157953419602)\n",
"24479 0.7423407609025713 --> 7 <-- 0.7423407609025713\n",
" 637 Plant(server=7, done=7399765, waiting=38, avg_freq=10.59814408859598)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" 687 Plant(server=7, done=7503040, waiting=96, avg_freq=5.487944307524704)\n",
"24719 1.6172100213141174 --> 8 <-- 1.6172100213141174\n",
" 735 Plant(server=7, done=7606589, waiting=116, avg_freq=6.999303285264639)\n",
"24959 -0.1663075053568251 --> 7 <-- 0\n",
" 609 Plant(server=8, done=7711685, waiting=16, avg_freq=12.111172464548526)\n",
" 648 Plant(server=7, done=7817298, waiting=461, avg_freq=1.2743334255924172)\n",
"25199 5.428722473745521 --> 9 <-- 5.428722473745521\n",
" 639 Plant(server=7, done=7922691, waiting=1768, avg_freq=0.3673819799138777)\n",
"25439 3.9001344366971633 --> 9 <-- 3.9001344366971633\n",
" 683 Plant(server=9, done=8031265, waiting=19, avg_freq=11.958199528026517)\n",
" 670 Plant(server=9, done=8139821, waiting=22, avg_freq=12.202134924309524)\n",
"25679 -2.1988135079088384 --> 8 <-- -0.19881350790883845\n",
" 684 Plant(server=8, done=8248816, waiting=36, avg_freq=11.976257594551731)\n",
"25919 -1.5520542178212589 --> 8 <-- 0\n",
" 691 Plant(server=8, done=8358945, waiting=35, avg_freq=10.858259526583435)\n",
" 671 Plant(server=8, done=8469416, waiting=14, avg_freq=11.643904566950384)\n",
"26159 -1.1529272994700188 --> 8 <-- 0\n",
" 697 Plant(server=8, done=8580763, waiting=39, avg_freq=11.276798552412519)\n",
"26399 -0.8595788833982831 --> 8 <-- 0\n",
" 701 Plant(server=8, done=8692730, waiting=38, avg_freq=11.635990466076965)\n",
" 696 Plant(server=8, done=8806098, waiting=37, avg_freq=11.70364003039325)\n",
"26639 -0.6373955604587472 --> 8 <-- 0\n",
" 725 Plant(server=8, done=8919308, waiting=28, avg_freq=9.894944280214514)\n",
"26879 -0.2521411274978417 --> 8 <-- 0\n",
" 748 Plant(server=8, done=9034092, waiting=50, avg_freq=9.806599650340345)\n",
" 719 Plant(server=8, done=9148870, waiting=47, avg_freq=10.808305801798172)\n",
"27119 -0.1968249042333373 --> 8 <-- 0\n",
" 704 Plant(server=8, done=9265055, waiting=23, avg_freq=11.14189075436467)\n",
"27359 0.5912594550024093 --> 8 <-- 0.5912594550024093\n",
" 730 Plant(server=8, done=9381507, waiting=55, avg_freq=9.757201426978348)\n",
" 790 Plant(server=8, done=9498636, waiting=94, avg_freq=7.633666853098359)\n",
"27599 1.0579730888345416 --> 9 <-- 1.0579730888345416\n",
" 712 Plant(server=9, done=9616849, waiting=31, avg_freq=12.18230774280498)\n",
"27839 -0.7248285069387277 --> 8 <-- 0\n",
" 755 Plant(server=9, done=9735646, waiting=27, avg_freq=11.431282231758043)\n",
" 736 Plant(server=8, done=9854704, waiting=88, avg_freq=6.1182758030789985)\n",
"28079 1.7765520470261988 --> 9 <-- 1.7765520470261988\n",
" 792 Plant(server=8, done=9975173, waiting=537, avg_freq=1.4244262727516783)\n",
"28319 2.527726430970084 --> 9 <-- 2.527726430970084\n",
" 769 Plant(server=9, done=10096797, waiting=39, avg_freq=11.003788426489566)\n",
" 800 Plant(server=9, done=10219324, waiting=61, avg_freq=10.391056899500391)\n",
"28559 -1.4122052851650406 --> 9 <-- 0\n",
" 808 Plant(server=9, done=10342485, waiting=55, avg_freq=11.190721874198807)\n",
"28799 -1.2950627914899633 --> 9 <-- 0\n",
" 737 Plant(server=9, done=10466213, waiting=35, avg_freq=11.825459878968141)\n",
" 763 Plant(server=9, done=10589966, waiting=34, avg_freq=11.543134872394825)\n",
"29039 -1.2668280150567208 --> 9 <-- 0\n",
" 767 Plant(server=9, done=10715266, waiting=35, avg_freq=11.54656180500837)\n",
"29279 -0.9943999564409812 --> 9 <-- 0\n",
" 798 Plant(server=9, done=10840815, waiting=57, avg_freq=11.087972083060716)\n",
" 807 Plant(server=9, done=10967330, waiting=42, avg_freq=10.758092340279477)\n",
"29519 -0.8599016510554025 --> 9 <-- 0\n",
" 818 Plant(server=9, done=11094605, waiting=40, avg_freq=9.380443481904333)\n",
"29759 -0.6255852404620744 --> 9 <-- 0\n",
" 785 Plant(server=9, done=11222362, waiting=44, avg_freq=11.40603195394841)\n",
" 841 Plant(server=9, done=11350613, waiting=68, avg_freq=9.988708416590564)\n",
"29999 -0.5092571069261648 --> 9 <-- 0\n",
" 820 Plant(server=9, done=11479596, waiting=55, avg_freq=9.224041724538662)\n",
"30239 0.04635841369930582 --> 9 <-- 0.04635841369930582\n",
" 832 Plant(server=9, done=11609928, waiting=70, avg_freq=8.008027703434784)\n",
" 826 Plant(server=9, done=11740528, waiting=49, avg_freq=9.909866253148323)\n",
"30479 0.3401078413057887 --> 9 <-- 0.3401078413057887\n",
" 847 Plant(server=9, done=11872136, waiting=59, avg_freq=10.17540819230997)\n",
"30719 1.023628649911692 --> 9 <-- 1.023628649911692\n",
" 820 Plant(server=9, done=12004154, waiting=46, avg_freq=9.132873928787927)\n",
" 827 Plant(server=9, done=12136396, waiting=63, avg_freq=10.359270986550246)\n",
"30959 1.1488376434737255 --> 9 <-- 1.1488376434737255\n",
" 838 Plant(server=9, done=12268952, waiting=79, avg_freq=7.601758874030251)\n",
"31199 1.9557561407482766 --> 10 <-- 1.9557561407482766\n",
" 838 Plant(server=9, done=12402703, waiting=77, avg_freq=7.197762602515511)\n",
" 846 Plant(server=10, done=12537073, waiting=46, avg_freq=11.213983558127875)\n",
"31439 -0.20406834661491605 --> 9 <-- 0\n",
" 812 Plant(server=9, done=12672309, waiting=42, avg_freq=9.295944685280237)\n",
"31679 3.2072789548453957 --> 10 <-- 3.2072789548453957\n",
" 846 Plant(server=9, done=12807446, waiting=396, avg_freq=2.0042204030103794)\n",
" 842 Plant(server=10, done=12944729, waiting=44, avg_freq=12.111928973586519)\n",
"31919 2.1910299450129513 --> 10 <-- 2.1910299450129513\n",
" 880 Plant(server=10, done=13081988, waiting=31, avg_freq=11.228308948597293)\n",
"32159 -1.3093262495764764 --> 10 <-- 0\n",
" 824 Plant(server=10, done=13219547, waiting=48, avg_freq=12.049708542424575)\n",
" 867 Plant(server=10, done=13357933, waiting=36, avg_freq=11.008287995100702)\n",
"32399 -1.2315247877513829 --> 10 <-- 0\n",
" 901 Plant(server=10, done=13496814, waiting=47, avg_freq=10.860338542946256)\n",
"32639 -1.10227972942614 --> 10 <-- 0\n",
" 891 Plant(server=10, done=13636977, waiting=56, avg_freq=10.7548076330618)\n",
" 893 Plant(server=10, done=13777057, waiting=35, avg_freq=10.310854025588817)\n",
"32879 -1.0058025449994452 --> 10 <-- 0\n",
" 861 Plant(server=10, done=13917460, waiting=27, avg_freq=10.41851654531865)\n",
"33119 -0.8863410931781264 --> 10 <-- 0\n",
" 909 Plant(server=10, done=14058698, waiting=41, avg_freq=9.52822358989966)\n",
" 914 Plant(server=10, done=14200617, waiting=57, avg_freq=10.587884213694045)\n",
"33359 -0.6654664450953139 --> 10 <-- 0\n",
" 879 Plant(server=10, done=14342830, waiting=41, avg_freq=10.757751376414456)\n",
"33599 -0.551648414355243 --> 10 <-- 0\n",
" 911 Plant(server=10, done=14485563, waiting=40, avg_freq=9.856996372498369)\n",
" 897 Plant(server=10, done=14629088, waiting=57, avg_freq=10.237584933206186)\n",
"33839 -0.27857735945157897 --> 10 <-- 0\n",
" 876 Plant(server=10, done=14772372, waiting=33, avg_freq=11.048978490681362)\n",
"34079 -0.20171748651408486 --> 10 <-- 0\n",
" 922 Plant(server=10, done=14917005, waiting=51, avg_freq=10.304225416322652)\n",
" 958 Plant(server=10, done=15061919, waiting=90, avg_freq=9.075263652911838)\n",
"34319 0.07879491403984522 --> 10 <-- 0.07879491403984522\n",
" 932 Plant(server=10, done=15207466, waiting=59, avg_freq=8.174117689352787)\n",
"34559 0.49034760399758537 --> 10 <-- 0.49034760399758537\n",
" 906 Plant(server=10, done=15353552, waiting=60, avg_freq=10.378933263710008)\n",
" 912 Plant(server=10, done=15500086, waiting=55, avg_freq=9.345699143946755)\n",
"34799 0.663872857348863 --> 10 <-- 0.663872857348863\n",
" 934 Plant(server=10, done=15646852, waiting=77, avg_freq=10.034575657436575)\n",
"35039 1.0293069520260014 --> 10 <-- 1.0293069520260014\n",
" 902 Plant(server=10, done=15794344, waiting=64, avg_freq=7.853314047479262)\n",
" 899 Plant(server=10, done=15942304, waiting=48, avg_freq=10.058174305445057)\n",
"35279 1.5027814655642113 --> 10 <-- 1.5027814655642113\n",
" 931 Plant(server=10, done=16090273, waiting=77, avg_freq=9.739407869182667)\n",
"35519 1.950695641597693 --> 11 <-- 1.950695641597693\n",
" 900 Plant(server=10, done=16238846, waiting=42, avg_freq=9.689841798499605)\n",
" 937 Plant(server=11, done=16388015, waiting=38, avg_freq=11.547686753570561)\n",
"35759 -0.26019634972419836 --> 10 <-- 0\n",
" 994 Plant(server=11, done=16537324, waiting=55, avg_freq=11.069761946978184)\n",
"35999 1.5327813512688246 --> 11 <-- 1.5327813512688246\n",
" 984 Plant(server=10, done=16687070, waiting=190, avg_freq=4.7069556673837205)\n",
" 997 Plant(server=11, done=16837315, waiting=55, avg_freq=10.63421462599512)\n",
"36239 0.8375218495244816 --> 11 <-- 0.8375218495244816\n",
" 909 Plant(server=11, done=16988558, waiting=42, avg_freq=12.223071046617768)\n",
"36479 -1.4040252883493751 --> 10 <-- 0\n",
" 966 Plant(server=11, done=17139932, waiting=52, avg_freq=10.890440102599213)\n",
" 973 Plant(server=10, done=17290777, waiting=665, avg_freq=1.3997483697874165)\n",
"36719 3.967716356841304 --> 12 <-- 3.967716356841304\n",
" 959 Plant(server=11, done=17442203, waiting=1435, avg_freq=0.6460395468494877)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"36959 2.5403066497395046 --> 11 <-- 2.5403066497395046\n",
" 923 Plant(server=12, done=17595359, waiting=31, avg_freq=12.653526805847802)\n",
"1024 Plant(server=11, done=17747825, waiting=74, avg_freq=9.390962671905429)\n",
"37199 -1.5778376783556383 --> 11 <-- 0\n",
" 936 Plant(server=11, done=17901653, waiting=27, avg_freq=9.591797911447093)\n",
"37439 -1.0638031835757609 --> 11 <-- 0\n",
" 935 Plant(server=11, done=18055412, waiting=30, avg_freq=10.021900093842397)\n",
" 971 Plant(server=11, done=18209632, waiting=54, avg_freq=11.268561532443849)\n",
"37679 -1.0236147583070674 --> 11 <-- 0\n",
" 925 Plant(server=11, done=18364309, waiting=38, avg_freq=11.68040475928658)\n",
"37919 -0.9208296566418948 --> 11 <-- 0\n",
"1003 Plant(server=11, done=18519140, waiting=39, avg_freq=10.577785556420697)\n",
" 963 Plant(server=11, done=18673918, waiting=46, avg_freq=11.02426703980551)\n",
"38159 -1.0425429258994412 --> 11 <-- 0\n",
"1044 Plant(server=11, done=18828283, waiting=74, avg_freq=9.440290889247828)\n",
"38399 -0.9057174370943158 --> 11 <-- 0\n",
" 988 Plant(server=11, done=18983716, waiting=42, avg_freq=10.175559812850066)\n",
" 962 Plant(server=11, done=19138540, waiting=57, avg_freq=11.640692226800633)\n",
"38639 -0.8977272114730751 --> 11 <-- 0\n",
"1019 Plant(server=11, done=19294511, waiting=65, avg_freq=9.431683110935133)\n",
"38879 -0.7580968098556203 --> 11 <-- 0\n",
" 969 Plant(server=11, done=19450585, waiting=38, avg_freq=10.909740600542674)\n",
" 957 Plant(server=11, done=19606892, waiting=49, avg_freq=11.41850754624877)\n",
"39119 -0.7058599016727386 --> 11 <-- 0\n",
"1035 Plant(server=11, done=19763992, waiting=79, avg_freq=10.81337286845385)\n",
"39359 -0.5951815310075704 --> 11 <-- 0\n",
"1022 Plant(server=11, done=19920870, waiting=63, avg_freq=9.04835618458408)\n",
"1022 Plant(server=11, done=20077777, waiting=72, avg_freq=9.872154097988682)\n",
"39599 -0.5635684121260567 --> 11 <-- 0\n",
" 960 Plant(server=11, done=20234720, waiting=46, avg_freq=9.99381093943283)\n",
"39839 -0.5429068068602846 --> 11 <-- 0\n",
"1016 Plant(server=11, done=20392151, waiting=58, avg_freq=9.31172559687122)\n",
" 926 Plant(server=11, done=20550299, waiting=36, avg_freq=11.945826222723596)\n",
"40079 -0.3808157572133228 --> 11 <-- 0\n",
" 994 Plant(server=11, done=20707828, waiting=61, avg_freq=11.26462179801056)\n",
"40319 -0.42970581323605617 --> 11 <-- 0\n",
" 978 Plant(server=11, done=20865548, waiting=41, avg_freq=10.727404726570924)\n",
" 947 Plant(server=11, done=21023567, waiting=45, avg_freq=11.340878660596555)\n",
"40559 -0.27017643260495583 --> 11 <-- 0\n",
" 943 Plant(server=11, done=21182557, waiting=22, avg_freq=9.64717781149159)\n",
"40799 -0.1034568897254141 --> 11 <-- 0\n",
" 974 Plant(server=11, done=21341876, waiting=45, avg_freq=10.492059634628173)\n",
"1032 Plant(server=11, done=21500775, waiting=72, avg_freq=8.752465483233086)\n",
"41039 -0.17982151249156664 --> 11 <-- 0\n",
"1053 Plant(server=11, done=21659643, waiting=86, avg_freq=7.915210103439321)\n",
"41279 0.02680360818274507 --> 11 <-- 0.02680360818274507\n",
"1019 Plant(server=11, done=21819053, waiting=62, avg_freq=9.667890942290798)\n",
"1028 Plant(server=11, done=21979083, waiting=71, avg_freq=9.3261046658666)\n",
"41519 0.10505505419997822 --> 11 <-- 0.10505505419997822\n",
" 966 Plant(server=11, done=22138323, waiting=50, avg_freq=11.520310909617185)\n",
"41759 0.19380024881247776 --> 11 <-- 0.19380024881247776\n",
" 989 Plant(server=11, done=22298224, waiting=56, avg_freq=8.796929456891581)\n",
"1040 Plant(server=11, done=22457124, waiting=81, avg_freq=10.446542592159814)\n",
"41999 -0.07864176995761388 --> 11 <-- 0\n",
" 956 Plant(server=11, done=22617083, waiting=39, avg_freq=11.885338636896812)\n",
"42239 0.3038824836292939 --> 11 <-- 0.3038824836292939\n",
"1045 Plant(server=11, done=22777186, waiting=92, avg_freq=8.081953273704546)\n",
"1006 Plant(server=11, done=22937150, waiting=55, avg_freq=8.95530415764083)\n",
"42479 0.18008037058149393 --> 11 <-- 0.18008037058149393\n",
" 996 Plant(server=11, done=23097254, waiting=73, avg_freq=7.198910435187914)\n",
"42719 0.26246169433886046 --> 11 <-- 0.26246169433886046\n",
"1004 Plant(server=11, done=23257371, waiting=82, avg_freq=9.787400803375846)\n",
" 977 Plant(server=11, done=23417046, waiting=46, avg_freq=11.271960012194178)\n",
"42959 0.0966355857369282 --> 11 <-- 0.0966355857369282\n",
" 997 Plant(server=11, done=23576658, waiting=75, avg_freq=10.769612229276708)\n",
"43199 0.23626424628930714 --> 11 <-- 0.23626424628930714\n",
"1000 Plant(server=11, done=23736485, waiting=70, avg_freq=11.480001836798353)\n",
"1018 Plant(server=11, done=23896103, waiting=77, avg_freq=9.043752206629286)\n",
"43439 0.07635184853910396 --> 11 <-- 0.07635184853910396\n",
" 956 Plant(server=11, done=24055528, waiting=42, avg_freq=11.695153359881077)\n",
"43679 0.12024419117184149 --> 11 <-- 0.12024419117184149\n",
"1009 Plant(server=11, done=24215699, waiting=54, avg_freq=9.265442403998575)\n",
"1011 Plant(server=11, done=24375377, waiting=94, avg_freq=9.138643931344115)\n",
"43919 0.15084115517300126 --> 11 <-- 0.15084115517300126\n",
" 994 Plant(server=11, done=24535644, waiting=60, avg_freq=10.385155153618644)\n",
"44159 0.04817319141295172 --> 11 <-- 0.04817319141295172\n",
" 981 Plant(server=11, done=24694897, waiting=46, avg_freq=10.928842068356499)\n",
"1007 Plant(server=11, done=24854485, waiting=86, avg_freq=9.628929239914074)\n",
"44399 0.07620470864514171 --> 11 <-- 0.07620470864514171\n",
"1080 Plant(server=11, done=25013988, waiting=114, avg_freq=9.321004949979509)\n",
"44639 0.19026537617342265 --> 11 <-- 0.19026537617342265\n",
" 949 Plant(server=11, done=25174026, waiting=31, avg_freq=10.573873940712883)\n",
"1045 Plant(server=11, done=25333195, waiting=100, avg_freq=7.40146245766028)\n",
"44879 0.010163160127355304 --> 11 <-- 0.010163160127355304\n",
" 947 Plant(server=11, done=25492330, waiting=41, avg_freq=11.82364253664728)\n",
"45119 -0.010517641451868849 --> 11 <-- 0\n",
" 957 Plant(server=11, done=25652081, waiting=37, avg_freq=10.751177767206483)\n",
" 946 Plant(server=11, done=25811020, waiting=50, avg_freq=11.66625588302756)\n",
"45359 -0.2112972709971808 --> 11 <-- 0\n",
"1002 Plant(server=11, done=25970334, waiting=67, avg_freq=9.824464299840361)\n",
"45599 -0.14342321432689728 --> 11 <-- 0\n",
" 972 Plant(server=11, done=26128794, waiting=46, avg_freq=10.410551035783154)\n",
"1019 Plant(server=11, done=26287788, waiting=72, avg_freq=8.555706967036654)\n",
"45839 -0.13183932290359285 --> 11 <-- 0\n",
" 986 Plant(server=11, done=26446358, waiting=46, avg_freq=10.718959903971287)\n",
"46079 -0.16268330585558052 --> 11 <-- 0\n",
"1000 Plant(server=11, done=26605663, waiting=63, avg_freq=10.151035097956015)\n",
"1023 Plant(server=11, done=26763985, waiting=71, avg_freq=9.586677523182823)\n",
"46319 -0.2513645785745126 --> 11 <-- 0\n",
"1024 Plant(server=11, done=26922438, waiting=77, avg_freq=9.96214988648068)\n",
"46559 -0.34883511709384185 --> 11 <-- 0\n",
" 954 Plant(server=11, done=27079734, waiting=43, avg_freq=11.220739021089162)\n",
"1019 Plant(server=11, done=27237813, waiting=77, avg_freq=9.850098501024807)\n",
"46799 -0.3826842880185406 --> 11 <-- 0\n",
" 945 Plant(server=11, done=27395272, waiting=39, avg_freq=11.23261686831656)\n",
"47039 -0.5131234476340041 --> 11 <-- 0\n",
" 967 Plant(server=11, done=27552560, waiting=28, avg_freq=10.07200147693312)\n",
" 962 Plant(server=11, done=27710098, waiting=41, avg_freq=10.73586061986708)\n",
"47279 -0.37513373615317985 --> 11 <-- 0\n",
" 957 Plant(server=11, done=27866915, waiting=48, avg_freq=10.883945346835745)\n",
"47519 -0.6121188504984214 --> 11 <-- 0\n",
" 948 Plant(server=11, done=28023909, waiting=62, avg_freq=12.276645472616421)\n",
"1001 Plant(server=11, done=28181100, waiting=50, avg_freq=10.654556569623656)\n",
"47759 -0.6874981800299367 --> 11 <-- 0\n",
" 996 Plant(server=11, done=28336617, waiting=57, avg_freq=11.069942945441493)\n",
"47999 -0.688809946612516 --> 11 <-- 0\n",
" 896 Plant(server=11, done=28492765, waiting=38, avg_freq=12.221495750139542)\n",
" 972 Plant(server=11, done=28648139, waiting=42, avg_freq=9.987965067839742)\n",
"48239 -0.8793781688773618 --> 11 <-- 0\n",
"1001 Plant(server=11, done=28803224, waiting=72, avg_freq=10.50657067270944)\n",
"48479 -0.927835500065796 --> 11 <-- 0\n",
" 962 Plant(server=11, done=28958172, waiting=32, avg_freq=10.852608778611286)\n",
" 968 Plant(server=11, done=29112882, waiting=41, avg_freq=11.537679790529955)\n",
"48719 -1.007771387742172 --> 11 <-- 0\n",
" 975 Plant(server=11, done=29267122, waiting=48, avg_freq=11.298705869919376)\n",
"48959 -1.0733742653424312 --> 11 <-- 0\n",
" 966 Plant(server=11, done=29420880, waiting=52, avg_freq=11.138929457294768)\n",
" 982 Plant(server=11, done=29574552, waiting=40, avg_freq=10.810688814648362)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"49199 -1.1831713725531188 --> 11 <-- 0\n",
" 988 Plant(server=11, done=29727396, waiting=63, avg_freq=10.725544972075467)\n",
"49439 -1.1986584436145298 --> 11 <-- 0\n",
" 959 Plant(server=11, done=29880233, waiting=43, avg_freq=10.820743160480278)\n",
" 902 Plant(server=11, done=30032358, waiting=43, avg_freq=12.054600248184865)\n",
"49679 -1.258895818891574 --> 11 <-- 0\n",
" 973 Plant(server=11, done=30184713, waiting=52, avg_freq=10.801151819351372)\n",
"49919 -1.3106547100708126 --> 11 <-- 0\n",
" 963 Plant(server=11, done=30336268, waiting=52, avg_freq=11.532185391754041)\n",
" 931 Plant(server=11, done=30486898, waiting=37, avg_freq=11.922503725785718)\n",
"50159 -1.4144378250327285 --> 11 <-- 0\n",
" 986 Plant(server=11, done=30638429, waiting=38, avg_freq=10.65622914286828)\n",
"50399 -1.4174077283700095 --> 11 <-- 0\n",
" 924 Plant(server=11, done=30789216, waiting=37, avg_freq=11.715971901623718)\n",
" 974 Plant(server=11, done=30939444, waiting=51, avg_freq=11.361982829694517)\n",
"50639 -1.4767223440761839 --> 11 <-- 0\n",
" 889 Plant(server=11, done=31089739, waiting=21, avg_freq=11.528586945794235)\n",
"50879 -1.608741043572767 --> 11 <-- 0\n",
" 898 Plant(server=11, done=31238451, waiting=39, avg_freq=12.231009748027127)\n",
" 976 Plant(server=11, done=31387064, waiting=52, avg_freq=11.232555043138287)\n",
"51119 -1.6326763791576318 --> 11 <-- 0\n",
" 987 Plant(server=11, done=31535434, waiting=49, avg_freq=10.472093286548397)\n",
"51359 -1.6739147450748126 --> 11 <-- 0\n",
" 878 Plant(server=11, done=31683023, waiting=33, avg_freq=12.366354939866044)\n",
" 902 Plant(server=11, done=31829940, waiting=31, avg_freq=11.890913790886914)\n",
"51599 -1.7667282730210994 --> 11 <-- 0\n",
" 913 Plant(server=11, done=31976027, waiting=43, avg_freq=11.779062299309146)\n",
"51839 -1.7765625861980758 --> 11 <-- 0\n",
" 954 Plant(server=11, done=32122309, waiting=48, avg_freq=11.249230769251923)\n",
" 913 Plant(server=11, done=32267914, waiting=28, avg_freq=11.927699788975215)\n",
"52079 -1.8343667752603594 --> 11 <-- 0\n",
" 933 Plant(server=11, done=32412540, waiting=38, avg_freq=11.7411003236445)\n",
"52319 -1.8616641779189491 --> 11 <-- 0\n",
" 931 Plant(server=11, done=32557445, waiting=38, avg_freq=11.878169920916868)\n",
" 904 Plant(server=11, done=32702057, waiting=26, avg_freq=11.85885202103037)\n",
"52559 -1.8850450368330331 --> 11 <-- 0\n",
" 912 Plant(server=11, done=32845310, waiting=25, avg_freq=11.300288169956408)\n",
"52799 -1.9458119926646522 --> 11 <-- 0\n",
" 888 Plant(server=11, done=32988069, waiting=31, avg_freq=12.069989739207337)\n",
" 876 Plant(server=11, done=33130898, waiting=34, avg_freq=12.270361087386002)\n",
"53039 -1.9304233312332648 --> 11 <-- 0\n",
" 815 Plant(server=11, done=33273308, waiting=12, avg_freq=12.504758011135234)\n",
"53279 -2.0159656571695272 --> 11 <-- -0.015965657169527248\n",
" 880 Plant(server=11, done=33414302, waiting=28, avg_freq=12.043924902606026)\n",
" 874 Plant(server=11, done=33555383, waiting=29, avg_freq=11.896232409110846)\n",
"53519 -2.003524477112519 --> 11 <-- -0.003524477112518909\n",
" 891 Plant(server=11, done=33696331, waiting=30, avg_freq=11.84238954308624)\n",
"53759 -2.0549254245201127 --> 11 <-- -0.05492542452011273\n",
" 903 Plant(server=11, done=33835487, waiting=34, avg_freq=11.579938717851881)\n",
" 886 Plant(server=11, done=33974629, waiting=44, avg_freq=11.946775057363562)\n",
"53999 -2.0952027091794267 --> 11 <-- -0.09520270917942675\n",
" 923 Plant(server=11, done=34113543, waiting=44, avg_freq=11.626033723553167)\n",
"54239 -2.1074764082679125 --> 11 <-- -0.1074764082679125\n",
" 856 Plant(server=11, done=34250946, waiting=31, avg_freq=12.231808377838101)\n",
" 825 Plant(server=11, done=34389119, waiting=29, avg_freq=12.585627741190086)\n",
"54479 -2.115655719459449 --> 11 <-- -0.11565571945944919\n",
" 854 Plant(server=11, done=34526454, waiting=18, avg_freq=12.15502640234197)\n",
"54719 -2.1225636605308154 --> 11 <-- -0.12256366053081535\n",
" 884 Plant(server=11, done=34663468, waiting=21, avg_freq=11.868732653675652)\n",
" 801 Plant(server=11, done=34799770, waiting=22, avg_freq=12.684197915459169)\n",
"54959 -2.1668432443144567 --> 11 <-- -0.16684324431445674\n",
" 843 Plant(server=11, done=34934851, waiting=17, avg_freq=12.024133848746795)\n",
"55199 -2.208808795257772 --> 11 <-- -0.20880879525777196\n",
" 826 Plant(server=11, done=35068979, waiting=19, avg_freq=12.358408578760502)\n",
" 796 Plant(server=11, done=35202923, waiting=30, avg_freq=12.774029709199276)\n",
"55439 -2.213195357194608 --> 11 <-- -0.21319535719460792\n",
" 840 Plant(server=11, done=35336202, waiting=35, avg_freq=12.084108887874628)\n",
"55679 -2.242066261417774 --> 11 <-- -0.242066261417774\n",
" 851 Plant(server=11, done=35468444, waiting=27, avg_freq=12.106218526794729)\n",
" 805 Plant(server=11, done=35600358, waiting=29, avg_freq=12.328274041655794)\n",
"55919 -2.2522318046849614 --> 11 <-- -0.2522318046849614\n",
" 825 Plant(server=11, done=35731555, waiting=24, avg_freq=12.065252662317386)\n",
"56159 -2.2570557807909526 --> 11 <-- -0.2570557807909526\n",
" 816 Plant(server=11, done=35862956, waiting=21, avg_freq=12.153788727163663)\n",
" 815 Plant(server=11, done=35992717, waiting=24, avg_freq=12.270496273411142)\n",
"56399 -2.303821197219726 --> 11 <-- -0.303821197219726\n",
" 818 Plant(server=11, done=36122163, waiting=26, avg_freq=12.217702768373453)\n",
"56639 -2.3093176331217133 --> 11 <-- -0.30931763312171334\n",
" 794 Plant(server=11, done=36250179, waiting=26, avg_freq=12.160315773516938)\n",
" 798 Plant(server=11, done=36377396, waiting=18, avg_freq=12.183004937434358)\n",
"56879 -2.324482050821776 --> 11 <-- -0.32448205082177584\n",
" 800 Plant(server=11, done=36505012, waiting=23, avg_freq=12.089203669519689)\n",
"57119 -2.332029918552749 --> 11 <-- -0.3320299185527489\n",
" 806 Plant(server=11, done=36631687, waiting=13, avg_freq=12.25753262713004)\n",
" 779 Plant(server=11, done=36756565, waiting=28, avg_freq=12.446617663412772)\n",
"57359 -2.359362220630056 --> 11 <-- -0.35936222063005596\n",
" 826 Plant(server=11, done=36882017, waiting=32, avg_freq=12.211179734779328)\n",
"57599 -2.35737557788442 --> 11 <-- -0.3573755778844201\n",
" 794 Plant(server=11, done=37005991, waiting=17, avg_freq=12.250446548551169)\n",
" 823 Plant(server=11, done=37130351, waiting=17, avg_freq=12.22765673635521)\n",
"57839 -2.362902212142568 --> 11 <-- -0.362902212142568\n",
" 768 Plant(server=11, done=37252712, waiting=18, avg_freq=12.480015661225242)\n",
"58079 -2.3753928818108316 --> 11 <-- -0.37539288181083164\n",
" 768 Plant(server=11, done=37374744, waiting=27, avg_freq=12.22961463053124)\n",
" 738 Plant(server=11, done=37496111, waiting=20, avg_freq=12.383698073699593)\n",
"58319 -2.3983938663883064 --> 11 <-- -0.39839386638830643\n",
" 744 Plant(server=11, done=37616221, waiting=23, avg_freq=12.346490867556174)\n",
"58559 -2.4270993357718926 --> 11 <-- -0.42709933577189263\n",
" 778 Plant(server=11, done=37735754, waiting=30, avg_freq=12.329174093897056)\n",
" 726 Plant(server=11, done=37854936, waiting=21, avg_freq=12.522784041055706)\n",
"58799 -2.424125733119369 --> 11 <-- -0.42412573311936885\n",
" 748 Plant(server=11, done=37973433, waiting=32, avg_freq=12.20703933748736)\n",
"59039 -2.414009194682636 --> 11 <-- -0.41400919468263586\n",
" 749 Plant(server=11, done=38091159, waiting=18, avg_freq=12.342352961039884)\n",
" 782 Plant(server=11, done=38207845, waiting=25, avg_freq=12.395287066679593)\n",
"59279 -2.4640250553087375 --> 11 <-- -0.4640250553087375\n",
" 717 Plant(server=11, done=38323490, waiting=15, avg_freq=12.310154600612613)\n",
"59519 -2.4537157609270808 --> 10 <-- -0.45371576092708077\n",
" 751 Plant(server=11, done=38438685, waiting=23, avg_freq=12.411623364278658)\n",
" 696 Plant(server=10, done=38553273, waiting=13, avg_freq=12.280188078072447)\n",
"59759 -2.4075163352161835 --> 10 <-- -0.40751633521618347\n",
" 699 Plant(server=10, done=38667026, waiting=19, avg_freq=12.505077980104303)\n",
"59999 -2.361334643593322 --> 10 <-- -0.361334643593322\n",
" 630 Plant(server=10, done=38779515, waiting=14, avg_freq=12.87592952129696)\n",
" 695 Plant(server=10, done=38892280, waiting=19, avg_freq=12.436304030255565)\n",
"60239 -2.37642346099839 --> 10 <-- -0.3764234609983901\n",
" 680 Plant(server=10, done=39003272, waiting=20, avg_freq=12.470351469846296)\n",
"60479 -2.3867954256821142 --> 10 <-- -0.3867954256821142\n",
" 702 Plant(server=10, done=39113998, waiting=22, avg_freq=12.401454336004955)\n",
" 687 Plant(server=10, done=39223939, waiting=12, avg_freq=12.301715765660418)\n",
"60719 -2.410617410814039 --> 10 <-- -0.410617410814039\n",
" 702 Plant(server=10, done=39332600, waiting=8, avg_freq=12.272045401173772)\n",
"60959 -2.403934982591663 --> 10 <-- -0.40393498259166316\n",
" 681 Plant(server=10, done=39440872, waiting=9, avg_freq=12.299494516359427)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" 664 Plant(server=10, done=39549165, waiting=15, avg_freq=12.321540561534823)\n",
"61199 -2.3996937205188567 --> 10 <-- -0.39969372051885665\n",
" 656 Plant(server=10, done=39656044, waiting=19, avg_freq=12.601448311238775)\n",
"61439 -2.4279957368984073 --> 10 <-- -0.4279957368984073\n",
" 676 Plant(server=10, done=39762067, waiting=22, avg_freq=12.302284710039986)\n",
" 652 Plant(server=10, done=39866276, waiting=19, avg_freq=12.321917162014415)\n",
"61679 -2.4722839237660508 --> 10 <-- -0.4722839237660508\n",
" 610 Plant(server=10, done=39970760, waiting=16, avg_freq=12.643162351492599)\n",
"61919 -2.4538917196002643 --> 10 <-- -0.4538917196002643\n",
" 649 Plant(server=10, done=40074230, waiting=18, avg_freq=12.205307315628588)\n",
" 601 Plant(server=10, done=40177174, waiting=17, avg_freq=12.968534027230545)\n",
"62159 -2.46821873774866 --> 10 <-- -0.4682187377486602\n",
" 679 Plant(server=10, done=40278867, waiting=30, avg_freq=12.371013133228127)\n",
"62399 -2.4921451433836554 --> 10 <-- -0.49214514338365545\n",
" 636 Plant(server=10, done=40379531, waiting=14, avg_freq=12.273535677286462)\n",
" 585 Plant(server=10, done=40479864, waiting=9, avg_freq=12.763687105019521)\n",
"62639 -2.4800955605264687 --> 10 <-- -0.48009556052646873\n",
" 591 Plant(server=10, done=40579713, waiting=14, avg_freq=12.773533734985898)\n",
"62879 -2.4836390693273276 --> 10 <-- -0.4836390693273276\n",
" 676 Plant(server=10, done=40678836, waiting=14, avg_freq=12.292612381022964)\n",
" 627 Plant(server=10, done=40776282, waiting=8, avg_freq=12.299400226977685)\n",
"63119 -2.5338939229765596 --> 10 <-- -0.5338939229765596\n",
" 597 Plant(server=10, done=40873119, waiting=16, avg_freq=12.529398297502611)\n",
"63359 -2.5058007331497807 --> 10 <-- -0.5058007331497807\n",
" 640 Plant(server=10, done=40969495, waiting=22, avg_freq=12.410868345037104)\n",
" 574 Plant(server=10, done=41064687, waiting=14, avg_freq=12.61688228514524)\n",
"63599 -2.5340041082446905 --> 10 <-- -0.5340041082446905\n",
" 576 Plant(server=10, done=41159212, waiting=13, avg_freq=12.687827480234358)\n",
"63839 -2.5450810064220053 --> 10 <-- -0.5450810064220053\n",
" 546 Plant(server=10, done=41252222, waiting=13, avg_freq=13.029242913515235)\n",
" 573 Plant(server=10, done=41344936, waiting=14, avg_freq=12.392160237535865)\n",
"64079 -2.5455962219447645 --> 10 <-- -0.5455962219447645\n",
" 594 Plant(server=10, done=41436589, waiting=6, avg_freq=12.378656590023828)\n",
"64319 -2.5509002140101145 --> 10 <-- -0.5509002140101145\n",
" 571 Plant(server=10, done=41527584, waiting=8, avg_freq=12.42358942788229)\n",
" 601 Plant(server=10, done=41617849, waiting=12, avg_freq=12.445274129387577)\n",
"64559 -2.5685259779480103 --> 10 <-- -0.5685259779480103\n",
" 525 Plant(server=10, done=41707024, waiting=1, avg_freq=12.845735447318125)\n",
"64799 -2.5788538190431427 --> 10 <-- -0.5788538190431427\n",
" 559 Plant(server=10, done=41795523, waiting=9, avg_freq=12.361772903036703)\n",
" 554 Plant(server=10, done=41883183, waiting=18, avg_freq=12.446518864271116)\n",
"65039 -2.6103017019303194 --> 9 <-- -0.6103017019303194\n",
" 482 Plant(server=10, done=41969490, waiting=5, avg_freq=13.386980602601538)\n",
"65279 -2.5833030791052147 --> 9 <-- -0.5833030791052147\n",
" 509 Plant(server=9, done=42054930, waiting=12, avg_freq=12.841168690642897)\n",
" 558 Plant(server=9, done=42140305, waiting=12, avg_freq=12.349425716713313)\n",
"65519 -2.536673554161917 --> 9 <-- -0.5366735541619172\n",
" 496 Plant(server=9, done=42224170, waiting=9, avg_freq=12.950032189387002)\n",
"65759 -2.549054326326337 --> 9 <-- -0.549054326326337\n",
" 520 Plant(server=9, done=42307679, waiting=8, avg_freq=12.373695148439673)\n",
" 495 Plant(server=9, done=42390053, waiting=9, avg_freq=12.520134719582112)\n",
"65999 -2.5716969346982728 --> 9 <-- -0.5716969346982728\n",
" 464 Plant(server=9, done=42472191, waiting=4, avg_freq=13.1551688419525)\n",
"66239 -2.554980979010639 --> 9 <-- -0.5549809790106388\n",
" 499 Plant(server=9, done=42553174, waiting=9, avg_freq=12.506851362760113)\n",
" 476 Plant(server=9, done=42633358, waiting=7, avg_freq=12.887667254386063)\n",
"66479 -2.5745327794858808 --> 9 <-- -0.5745327794858808\n",
" 492 Plant(server=9, done=42712866, waiting=4, avg_freq=12.402006503508758)\n",
"66719 -2.5749258514422024 --> 9 <-- -0.5749258514422024\n",
" 494 Plant(server=9, done=42791181, waiting=9, avg_freq=12.471190781039711)\n",
" 488 Plant(server=9, done=42868522, waiting=5, avg_freq=12.445132971890484)\n",
"66959 -2.59736258109793 --> 9 <-- -0.5973625810979302\n",
" 442 Plant(server=9, done=42945261, waiting=6, avg_freq=12.935944025653091)\n",
"67199 -2.6086835304248863 --> 9 <-- -0.6086835304248863\n",
" 475 Plant(server=9, done=43021282, waiting=3, avg_freq=12.37194641442167)\n",
" 461 Plant(server=9, done=43096182, waiting=8, avg_freq=12.769572246716201)\n",
"67439 -2.645033714078138 --> 9 <-- -0.6450337140781381\n",
" 502 Plant(server=9, done=43170476, waiting=8, avg_freq=12.428891105600423)\n",
"67679 -2.6218255991410833 --> 9 <-- -0.6218255991410833\n",
" 446 Plant(server=9, done=43243753, waiting=2, avg_freq=12.613410046419038)\n",
" 442 Plant(server=9, done=43315857, waiting=11, avg_freq=12.932641298471738)\n",
"67919 -2.6559262321112596 --> 9 <-- -0.6559262321112596\n",
" 465 Plant(server=9, done=43387377, waiting=5, avg_freq=12.689922039468527)\n",
"68159 -2.669346388277791 --> 9 <-- -0.6693463882777908\n",
" 464 Plant(server=9, done=43458189, waiting=9, avg_freq=12.579154543902275)\n",
" 441 Plant(server=9, done=43528115, waiting=7, avg_freq=12.313253692528738)\n",
"68399 -2.678130815951269 --> 9 <-- -0.6781308159512691\n",
" 446 Plant(server=9, done=43597592, waiting=5, avg_freq=12.407519359804311)\n",
"68639 -2.6585532813542496 --> 9 <-- -0.6585532813542496\n",
" 415 Plant(server=9, done=43666359, waiting=12, avg_freq=12.889724614752975)\n",
" 452 Plant(server=9, done=43734374, waiting=8, avg_freq=12.511543388287324)\n",
"68879 -2.657573776387252 --> 9 <-- -0.657573776387252\n",
" 445 Plant(server=9, done=43801681, waiting=16, avg_freq=12.587200485294767)\n",
"69119 -2.7074509342654536 --> 8 <-- -0.7074509342654536\n",
" 399 Plant(server=9, done=43867673, waiting=5, avg_freq=12.80049953159646)\n",
" 429 Plant(server=8, done=43933098, waiting=4, avg_freq=12.505017445281544)\n",
"69359 -2.6735213085645833 --> 8 <-- -0.6735213085645833\n",
" 413 Plant(server=8, done=43997425, waiting=12, avg_freq=12.441052370302588)\n",
"69599 -2.6510812515857465 --> 8 <-- -0.6510812515857465\n",
" 393 Plant(server=8, done=44061002, waiting=5, avg_freq=12.445003142663445)\n",
" 344 Plant(server=8, done=44123777, waiting=7, avg_freq=13.21705033295557)\n",
"69839 -2.6391636182552394 --> 8 <-- -0.6391636182552394\n",
" 372 Plant(server=8, done=44186438, waiting=6, avg_freq=12.78569062600331)\n",
"70079 -2.6496985792690912 --> 8 <-- -0.6496985792690912\n",
" 378 Plant(server=8, done=44248019, waiting=4, avg_freq=12.530421627225339)\n",
" 372 Plant(server=8, done=44308110, waiting=4, avg_freq=12.57356875325436)\n",
"70319 -2.7055939985574926 --> 8 <-- -0.7055939985574926\n",
" 363 Plant(server=8, done=44367927, waiting=3, avg_freq=12.860064473598799)\n",
"70559 -2.7584461153653237 --> 8 <-- -0.7584461153653237\n",
" 382 Plant(server=8, done=44426506, waiting=4, avg_freq=12.460847065224737)\n",
" 385 Plant(server=8, done=44484479, waiting=3, avg_freq=12.523351553303268)\n",
"70799 -2.7205747423350704 --> 8 <-- -0.7205747423350704\n",
" 368 Plant(server=8, done=44541476, waiting=4, avg_freq=12.476846188764641)\n",
"71039 -2.7290881148094592 --> 8 <-- -0.7290881148094592\n",
" 329 Plant(server=8, done=44598227, waiting=7, avg_freq=13.284522776176415)\n",
" 347 Plant(server=8, done=44653999, waiting=7, avg_freq=12.765489160414557)\n",
"71279 -2.740912180114978 --> 8 <-- -0.7409121801149778\n",
" 352 Plant(server=8, done=44709569, waiting=0, avg_freq=12.594088489076286)\n",
"71519 -2.709097532191193 --> 8 <-- -0.7090975321911932\n",
" 338 Plant(server=8, done=44764503, waiting=2, avg_freq=12.538952366830943)\n",
" 330 Plant(server=8, done=44818151, waiting=5, avg_freq=12.645767075663901)\n",
"71759 -2.7445510874672983 --> 8 <-- -0.7445510874672983\n",
" 323 Plant(server=8, done=44870707, waiting=2, avg_freq=12.29263189358375)\n",
"71999 -2.786727089331028 --> 8 <-- -0.7867270893310279\n",
" 311 Plant(server=8, done=44922999, waiting=3, avg_freq=13.350312191861478)\n",
" 284 Plant(server=8, done=44974423, waiting=2, avg_freq=13.163848780219556)\n",
"72239 -2.7811864910145236 --> 8 <-- -0.7811864910145236\n",
" 281 Plant(server=8, done=45025176, waiting=0, avg_freq=13.184329482692196)\n",
"72479 -2.806803298816324 --> 8 <-- -0.8068032988163241\n",
" 298 Plant(server=8, done=45074828, waiting=2, avg_freq=12.707362915852075)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" 323 Plant(server=8, done=45124184, waiting=3, avg_freq=12.337740626064543)\n",
"72719 -2.7831246139643913 --> 7 <-- -0.7831246139643913\n",
" 315 Plant(server=7, done=45172812, waiting=6, avg_freq=12.606445149430042)\n",
"72959 -2.753340396088655 --> 7 <-- -0.7533403960886549\n",
" 324 Plant(server=7, done=45220823, waiting=8, avg_freq=12.624978817216135)\n",
" 274 Plant(server=7, done=45267837, waiting=1, avg_freq=12.925917784122756)\n",
"73199 -2.751575022709594 --> 7 <-- -0.7515750227095941\n",
" 316 Plant(server=7, done=45314428, waiting=9, avg_freq=12.869611684994773)\n",
"73439 -2.7352247827407763 --> 7 <-- -0.7352247827407763\n",
" 289 Plant(server=7, done=45360552, waiting=4, avg_freq=12.716969345431346)\n",
" 312 Plant(server=7, done=45406016, waiting=0, avg_freq=12.417145382177521)\n",
"73679 -2.7548959131622834 --> 7 <-- -0.7548959131622834\n",
" 257 Plant(server=7, done=45450601, waiting=2, avg_freq=13.20242123819924)\n",
"73919 -2.733767463108735 --> 7 <-- -0.7337674631087352\n",
" 274 Plant(server=7, done=45494773, waiting=1, avg_freq=12.534562212033682)\n",
" 267 Plant(server=7, done=45538012, waiting=2, avg_freq=12.362193828134778)\n",
"74159 -2.7929777630866313 --> 7 <-- -0.7929777630866313\n",
" 239 Plant(server=7, done=45580611, waiting=1, avg_freq=13.401695517464354)\n",
"74399 -2.7795476196228273 --> 7 <-- -0.7795476196228273\n",
" 291 Plant(server=7, done=45622606, waiting=3, avg_freq=12.518054887020226)\n",
" 292 Plant(server=7, done=45663863, waiting=2, avg_freq=12.711654004651983)\n",
"74639 -2.840391284193778 --> 7 <-- -0.8403912841937782\n",
" 237 Plant(server=7, done=45704343, waiting=0, avg_freq=12.813342146695037)\n",
"74879 -2.7798653396544113 --> 7 <-- -0.7798653396544113\n",
" 240 Plant(server=7, done=45744424, waiting=2, avg_freq=13.120998888807623)\n",
" 218 Plant(server=7, done=45784292, waiting=4, avg_freq=13.476347634930459)\n",
"75119 -2.7809707780959125 --> 7 <-- -0.7809707780959125\n",
" 245 Plant(server=7, done=45823155, waiting=0, avg_freq=12.523383911807876)\n",
"75359 -2.807779430802376 --> 7 <-- -0.807779430802376\n",
" 209 Plant(server=7, done=45861314, waiting=0, avg_freq=13.545179173626597)\n",
" 219 Plant(server=7, done=45898661, waiting=1, avg_freq=13.391574228366569)\n",
"75599 -2.8595008913969147 --> 7 <-- -0.8595008913969147\n",
" 239 Plant(server=7, done=45935572, waiting=0, avg_freq=12.482965385722288)\n",
"75839 -2.8200060972043364 --> 7 <-- -0.8200060972043364\n",
" 225 Plant(server=7, done=45971885, waiting=2, avg_freq=12.774857271823604)\n",
" 233 Plant(server=7, done=46007745, waiting=5, avg_freq=12.600749233757455)\n",
"76079 -2.8151705513813954 --> 6 <-- -0.8151705513813954\n",
" 212 Plant(server=6, done=46042951, waiting=4, avg_freq=12.563102340417798)\n",
"76319 -2.794103914687962 --> 6 <-- -0.794103914687962\n",
" 218 Plant(server=6, done=46077840, waiting=3, avg_freq=12.631455261066526)\n",
" 217 Plant(server=6, done=46112019, waiting=1, avg_freq=12.512542052787163)\n",
"76559 -2.82576635801201 --> 6 <-- -0.82576635801201\n",
" 216 Plant(server=6, done=46145607, waiting=1, avg_freq=12.494743797639671)\n",
"76799 -2.786851447363101 --> 6 <-- -0.7868514473631012\n",
" 178 Plant(server=6, done=46178695, waiting=0, avg_freq=13.716962194507197)\n",
" 201 Plant(server=6, done=46211278, waiting=2, avg_freq=12.559360159788074)\n",
"77039 -2.810393431387729 --> 6 <-- -0.810393431387729\n",
" 202 Plant(server=6, done=46243286, waiting=0, avg_freq=12.326464545798988)\n",
"77279 -2.7916591356229272 --> 6 <-- -0.7916591356229272\n",
" 189 Plant(server=6, done=46274723, waiting=0, avg_freq=12.495994873278125)\n",
" 186 Plant(server=6, done=46305514, waiting=1, avg_freq=12.811102955999996)\n",
"77519 -2.856189178019972 --> 6 <-- -0.8561891780199722\n",
" 189 Plant(server=6, done=46335915, waiting=0, avg_freq=12.87290559872994)\n",
"77759 -2.8900410845861155 --> 6 <-- -0.8900410845861155\n",
" 192 Plant(server=6, done=46365960, waiting=1, avg_freq=12.480604465894409)\n",
" 201 Plant(server=6, done=46395245, waiting=2, avg_freq=12.725492938041196)\n",
"77999 -2.8199494903909526 --> 6 <-- -0.8199494903909526\n",
" 174 Plant(server=6, done=46424035, waiting=3, avg_freq=13.265154883531602)\n",
"78239 -2.857882615160128 --> 6 <-- -0.8578826151601282\n",
" 162 Plant(server=6, done=46452698, waiting=0, avg_freq=13.248024087342063)\n",
" 174 Plant(server=6, done=46480525, waiting=1, avg_freq=12.757533543505447)\n",
"78479 -2.8887355183532795 --> 6 <-- -0.8887355183532795\n",
" 164 Plant(server=6, done=46507976, waiting=0, avg_freq=13.270215737726952)\n",
"78719 -2.818390383604905 --> 6 <-- -0.8183903836049051\n",
" 162 Plant(server=6, done=46535361, waiting=0, avg_freq=12.745618693563053)\n",
" 151 Plant(server=6, done=46562086, waiting=0, avg_freq=13.905275577047295)\n",
"78959 -2.8387678540161643 --> 6 <-- -0.8387678540161643\n",
" 172 Plant(server=6, done=46588180, waiting=0, avg_freq=12.427124884996399)\n",
"79199 -2.9181974554161245 --> 5 <-- -0.9181974554161245\n",
" 151 Plant(server=6, done=46613889, waiting=0, avg_freq=12.962812930351614)\n",
" 163 Plant(server=5, done=46639040, waiting=2, avg_freq=12.457351424261303)\n",
"79439 -2.874451983613183 --> 5 <-- -0.874451983613183\n",
" 189 Plant(server=5, done=46664045, waiting=2, avg_freq=13.084585514075984)\n",
"79679 -2.867515113152655 --> 5 <-- -0.8675151131526548\n",
" 172 Plant(server=5, done=46688671, waiting=0, avg_freq=13.151064197952959)\n",
" 172 Plant(server=5, done=46712791, waiting=2, avg_freq=12.91100017212804)\n",
"79919 -2.863348970256638 --> 5 <-- -0.8633489702566379\n",
" 125 Plant(server=5, done=46736345, waiting=0, avg_freq=13.657902071701933)\n",
"80159 -2.8401821794628295 --> 5 <-- -0.8401821794628295\n",
" 132 Plant(server=5, done=46759913, waiting=1, avg_freq=12.967268824913221)\n",
" 166 Plant(server=5, done=46783187, waiting=0, avg_freq=12.782694198584029)\n",
"80399 -2.839870644103429 --> 5 <-- -0.8398706441034292\n",
" 144 Plant(server=5, done=46805943, waiting=2, avg_freq=12.218370883904337)\n",
"80639 -2.8370209066142005 --> 5 <-- -0.8370209066142005\n",
" 142 Plant(server=5, done=46828250, waiting=0, avg_freq=12.455997833709143)\n",
" 162 Plant(server=5, done=46850170, waiting=1, avg_freq=12.396317564400327)\n",
"80879 -2.885038897981968 --> 5 <-- -0.8850388979819681\n",
" 136 Plant(server=5, done=46872036, waiting=0, avg_freq=12.080778939787699)\n",
"81119 -2.888272084189698 --> 5 <-- -0.888272084189698\n",
" 135 Plant(server=5, done=46893404, waiting=3, avg_freq=13.096537354880132)\n",
" 141 Plant(server=5, done=46914233, waiting=1, avg_freq=12.654531295538401)\n",
"81359 -2.8820196784376937 --> 5 <-- -0.8820196784376937\n",
" 143 Plant(server=5, done=46934798, waiting=0, avg_freq=11.99625117155995)\n",
"81599 -2.8749247331307592 --> 5 <-- -0.8749247331307592\n",
" 117 Plant(server=5, done=46955236, waiting=1, avg_freq=13.443421191829778)\n",
" 106 Plant(server=5, done=46975293, waiting=0, avg_freq=13.787778512895274)\n",
"81839 -2.922044925383206 --> 5 <-- -0.9220449253832061\n",
" 121 Plant(server=5, done=46995245, waiting=0, avg_freq=12.506354855045648)\n",
"82079 -2.841553167427408 --> 5 <-- -0.8415531674274082\n",
" 130 Plant(server=5, done=47014942, waiting=0, avg_freq=12.638557961343363)\n",
" 102 Plant(server=5, done=47034144, waiting=0, avg_freq=13.474062429950635)\n",
"82319 -2.8669158308259823 --> 4 <-- -0.8669158308259823\n",
" 116 Plant(server=5, done=47053470, waiting=0, avg_freq=12.94569391104538)\n",
"82559 -2.910175672256567 --> 4 <-- -0.910175672256567\n",
" 112 Plant(server=4, done=47072121, waiting=0, avg_freq=13.504155124647026)\n",
" 120 Plant(server=4, done=47090754, waiting=2, avg_freq=12.71650953743879)\n",
"82799 -2.9261639694357258 --> 4 <-- -0.9261639694357258\n",
" 123 Plant(server=4, done=47109189, waiting=0, avg_freq=12.6934639795949)\n",
"83039 -2.851655972781698 --> 4 <-- -0.8516559727816979\n",
" 117 Plant(server=4, done=47127574, waiting=0, avg_freq=12.673844773320534)\n",
" 132 Plant(server=4, done=47145535, waiting=0, avg_freq=12.570145903392191)\n",
"83279 -2.8597662344339336 --> 4 <-- -0.8597662344339336\n",
" 106 Plant(server=4, done=47163181, waiting=0, avg_freq=12.939654158417067)\n",
"83519 -2.8175428860232032 --> 4 <-- -0.8175428860232032\n",
" 113 Plant(server=4, done=47180567, waiting=1, avg_freq=12.193757690959405)\n",
" 95 Plant(server=4, done=47198083, waiting=0, avg_freq=13.89782524764966)\n",
"83759 -2.904219397090011 --> 4 <-- -0.904219397090011\n",
" 110 Plant(server=4, done=47214981, waiting=1, avg_freq=12.47231612061495)\n",
"83999 -2.8533386010545616 --> 4 <-- -0.8533386010545616\n",
" 121 Plant(server=4, done=47232255, waiting=0, avg_freq=12.455934195093597)\n",
" 105 Plant(server=4, done=47249168, waiting=1, avg_freq=12.200790146451073)\n",
"84239 -2.88334329573523 --> 4 <-- -0.8833432957352301\n",
" 96 Plant(server=4, done=47265920, waiting=0, avg_freq=13.367281986126935)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"84479 -2.942941107901366 --> 4 <-- -0.9429411079013659\n",
" 113 Plant(server=4, done=47282494, waiting=2, avg_freq=13.055485814664259)\n",
" 115 Plant(server=4, done=47299162, waiting=0, avg_freq=12.450139006361006)\n",
"84719 -2.869720239314999 --> 4 <-- -0.869720239314999\n",
" 109 Plant(server=4, done=47315729, waiting=0, avg_freq=12.881440720361493)\n",
"84959 -2.908296743248788 --> 4 <-- -0.9082967432487878\n",
" 99 Plant(server=4, done=47332227, waiting=1, avg_freq=13.25536062381978)\n",
" 92 Plant(server=4, done=47348345, waiting=0, avg_freq=13.23375262064984)\n",
"85199 -2.87542691991699 --> 3 <-- -0.8754269199169902\n",
" 96 Plant(server=3, done=47364567, waiting=2, avg_freq=13.319266781113013)\n",
"85439 -2.8340505135795877 --> 3 <-- -0.8340505135795877\n",
" 105 Plant(server=3, done=47380683, waiting=0, avg_freq=12.229083424092163)\n",
" 90 Plant(server=3, done=47396438, waiting=0, avg_freq=13.437248051659779)\n",
"85679 -2.800640398038458 --> 3 <-- -0.8006403980384582\n",
" 92 Plant(server=3, done=47412432, waiting=0, avg_freq=13.029315960709482)\n",
"85919 -2.8594718597967015 --> 3 <-- -0.8594718597967015\n",
" 78 Plant(server=3, done=47428477, waiting=1, avg_freq=12.416190712571437)\n",
" 87 Plant(server=3, done=47444384, waiting=0, avg_freq=13.297872340315395)\n",
"86159 -2.815268692600656 --> 3 <-- -0.815268692600656\n",
" 91 Plant(server=3, done=47460359, waiting=1, avg_freq=12.518778167003845)\n",
"86399 -2.781361271926008 --> 3 <-- -0.7813612719260079\n"
]
}
],
"source": [
"def load(t) -> List[Task]:\n",
" \"\"\" The generation times of tasks between [t, t+1] and the \"size\" of each task in terms\n",
" of how many ms it takes to do one task.\n",
" \"\"\"\n",
" ml = mean_load(t)\n",
" a=np.random.exponential(scale=1/ml, size=(ml)*2).cumsum()\n",
" a=np.round(t + a[:bisect_left(a, 1.0)], 3)\n",
" b=np.round(np.random.uniform(0.070, 0.100, len(a)), 3)\n",
" return [Task(e1, None, e2, e2) for e1, e2 in zip(a,b)]\n",
"\n",
"class EmptyQ(Exception):\n",
" pass\n",
"\n",
"class Plant:\n",
" def __init__(self):\n",
" self.active_servers = 1\n",
" self.thread_per_server = 8\n",
" self.wait_q = deque()\n",
" self.log = deque([], 10000)\n",
" self.done = 0\n",
" self.requests = defaultdict(int)\n",
" return\n",
" \n",
" def __repr__(self):\n",
" return (f'Plant(server={self.active_servers}, '\n",
" f'done={self.done}, waiting={len(self.wait_q)}, '\n",
" f'avg_freq={1 / self.local_average_waiting_time()}'\n",
" ')')\n",
" \n",
" def request_server(self, t, n):\n",
" \"\"\" At time `t` request to add `n` servers to the plant.\n",
" \"\"\"\n",
" if n == self.active_servers:\n",
" pass\n",
" elif n > self.active_servers:\n",
" for _ in range(self.active_servers, n):\n",
" self.requests[t + int(np.random.uniform(60, 120))] += 1\n",
" else:\n",
" for _ in range(n, self.active_servers):\n",
" self.requests[t + int(np.random.uniform(60, 120))] -= 1\n",
" return\n",
" \n",
" def local_average_waiting_time(self):\n",
" t = int(self.log[-1].creation_time)\n",
" return np.mean([(e.end_time - e.creation_time) \n",
" for e \n",
" in islice(self.log, max(0, len(self.log) - mean_load(t)), len(self.log))])\n",
" \n",
" def process(self, t, tasks):\n",
" \"\"\" Run the plant from [t, t+1]\n",
" \"\"\"\n",
" self.wait_q.extend(tasks)\n",
" self.active_servers += self.requests.get(t, 0)\n",
" offset = {}\n",
" for server in range(self.active_servers): \n",
" for thread in range(self.thread_per_server):\n",
" offset[server, thread] = 0\n",
" try:\n",
" some_thread_is_empty = True\n",
" while self.wait_q and some_thread_is_empty:\n",
" some_thread_is_empty = False\n",
" for server in range(self.active_servers): \n",
" for thread in range(self.thread_per_server):\n",
" # st()\n",
" if offset[server, thread] < 1:\n",
" some_thread_is_empty = True\n",
" try:\n",
" task = self.wait_q.popleft()\n",
" except IndexError:\n",
" raise EmptyQ\n",
" offset[server, thread] = max(\n",
" offset[server, thread], task.creation_time - t)\n",
" if offset[server, thread] <= 1 - task.proc_time_remaining:\n",
" offset[server, thread] += task.proc_time_remaining\n",
" task.proc_time_remaining = 0\n",
" task.end_time = t + offset[server, thread]\n",
" task.server = server\n",
" task.thread = thread\n",
" self.log.append(task)\n",
" self.done += 1\n",
" else:\n",
" task.proc_time_remaining -= (1 - offset[server, thread])\n",
" offset[server, thread] = 1\n",
" self.wait_q.appendleft(task)\n",
" else:\n",
" pass\n",
" #if not some_thread_is_empty:\n",
" # st()\n",
" except EmptyQ:\n",
" pass\n",
" return\n",
"\n",
"def pid_factory(a, b, c):\n",
" xp, ix = None, 0\n",
" def f(x):\n",
" nonlocal xp, ix\n",
" xp = x if xp is None else xp\n",
" ix += x\n",
" return a * x + b * (x - xp) + c * ix\n",
" return f\n",
"\n",
"def shrinkage(err):\n",
" if -2 <= err <= 0:\n",
" return 0\n",
" elif err < -2:\n",
" return err + 2\n",
" else:\n",
" return err\n",
" \n",
"env = Env()\n",
"plant = Plant()\n",
"pid_controller = pid_factory(.5 * 100/550, .5 * 100/550, .5 * 100/550)\n",
"error_sum = 0\n",
"subsample = 240\n",
"for t in range(0, SPD): # range(SPD//2 - 20, SPD//2+20):\n",
" tasks = load(t)\n",
" plant.process(t, tasks)\n",
" if t % 160 == 0:\n",
" print(f'{len(tasks):4}', plant)\n",
" error = (10.0 - 1 / plant.local_average_waiting_time())\n",
" error_sum += error\n",
" if t % subsample == subsample - 1:\n",
" C = max(1, int(np.round(pid_controller(shrinkage(error_sum / subsample)))))\n",
" plant.request_server(t, C)\n",
" print(f'{t:4}', error_sum / subsample, '-->', C,'<--', shrinkage(error_sum / subsample))\n",
" error_sum = 0"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment