Skip to content

Instantly share code, notes, and snippets.

@kif
Created December 11, 2018 07:38
Show Gist options
  • Select an option

  • Save kif/578d1b878fa93208315bfd4d217466b9 to your computer and use it in GitHub Desktop.

Select an option

Save kif/578d1b878fa93208315bfd4d217466b9 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Atomic add based histograms ... on GPU\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy\n",
"shape = 1024,1024\n",
"bins = 1024\n",
"position = numpy.random.random(shape).astype(\"float32\").ravel()\n",
"weights = (2**(20*numpy.random.random(shape))-1).astype(\"float32\")\n",
"weights64 = weights.astype(\"float64\").ravel()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.3939335e-06 1048567.44\n"
]
}
],
"source": [
"print(weights.min(), weights.max())\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"hn, bin_pos, = numpy.histogram(position, bins=bins, range=(0,1),weights=weights64)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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,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bt06CAQCcPjwYcN6ffr0gd///vcAEIWc73//+6Ztn3feeTBp0iT/P0QKKxwOQygUgrPOOgu+9KUvwVlnnQXDhw+PvU/n17l4APTqXP7qV7+Cxx57zPB+cXExBAIB2LFjh9cfo9OJADCFRADonR5//HEIBoNQXl4ee40gxbkOHjwI559/Pmzbti32GgGgt/ryl78MN954o+G1J598Em644QYAIEBxq9mzZ8PFF18Ms2fPhu3bt8OMGTPg3HPPJcD2QASA7VMEgCkkmgL2Rv369YOLL74Y9u3bZ3idpimda8GCBRAIBKBLly6xFggE4KyzzoIuXbrAihUr6Ny6VPfu3eHRRx81vDZp0iS48MILAYCmKN3q4osvhokTJxpeGzp0aCyejM6vc9EUcPsUAWCKKT09Hfr37x/7PxwOw0UXXURJIBqKRCLQr18/uPDCC012AwDxRIVPPvkk9tquXbuEiQo463rq1KlwzjnndOrC5Q0NDVBYWGho1113Hfz5z3+GwsJCOrce6P777zclgTz99NOxUUEWWD9q1KjY+/X19cLA+oKCgtgyy5Yt6/RJCgAA5557rmmUbvjw4dCjRw8AoPPrRrIkELfnkiWBnD59OrbMwIEDKQnEIxEAppjmzJkDaWlpMH36dNixYwc89thj0K1bN5OfGsmsv//97/CNb3wDsrOzobKyMtZOnToVW+bxxx+H7t27w6pVq6CgoABuvPFGw7Qbsyq5/fbbYevWrbB06VI477zzyKpEIDwFDEDn1q02bNgAX/rSl2DYsGFQUlICs2bNgq9+9auxJAWAqLVGt27d4PPPP4ft27fDvffeK7TWuOaaayA/Px/Wrl0LPXr06JQ2JbwefvhhuOiii2I2MPPnz4dvfetbsRAFADq/dtTY2AhbtmyBLVu2QCAQgDFjxsCWLVvgwIEDAODNuayrq4Nvf/vb8OCDD0JRURHMmTMHvvrVr5INjEciAExBTZgwAbp37w5du3aF9PR0yMvLS/YhtQsFAgFhmzZtWmwZZlb8zW9+E7761a/Cb3/7W6isrDRsZ//+/XDnnXfCV77yFfjWt74F//rXv8isWCAeAOncutfChQuhZ8+ekJaWBj/4wQ8MWcAAcXPdb3/725CWlga33XZbLKuV6fjx43D//ffD1772NTjnnHPgr3/9a6c0KubV0NAATz31FHTv3j1mBP3CCy8YLEbo/OorKytLeL19+OGHAcC7c4mNoC+66CJ47bXXEvURO7wIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZCABJJBKJRCKROpkIAEkkEolEIpE6mQgASSQSiUQikTqZ/j8j7bTYLOqqfAAAAABJRU5ErkJggg==\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.3 ms ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
]
}
],
"source": [
"%matplotlib notebook\n",
"from matplotlib.pylab import subplots\n",
"fix, ax = subplots()\n",
"ax.plot(hn)\n",
"%timeit numpy.histogram(position, bins=bins, range=(0,1),weights=weights64)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Choose platform:\n",
"[0] <pyopencl.Platform 'NVIDIA CUDA' at 0x55a2520b1650>\n",
"[1] <pyopencl.Platform 'Experimental OpenCL 2.1 CPU Only Platform' at 0x55a2520b2990>\n",
"Choice [0]:\n",
"Choose device(s):\n",
"[0] <pyopencl.Device 'GeForce GTX TITAN' on 'NVIDIA CUDA' at 0x55a2520b1720>\n",
"[1] <pyopencl.Device 'Quadro M2000' on 'NVIDIA CUDA' at 0x55a2520b17b0>\n",
"Choice, comma-separated [0]:\n",
"Set the environment variable PYOPENCL_CTX=':' to avoid being asked again.\n"
]
}
],
"source": [
"import pyopencl\n",
"from pyopencl import array\n",
"ctx = pyopencl.create_some_context(interactive=True)\n",
"queue = pyopencl.CommandQueue(ctx, properties=pyopencl.command_queue_properties.PROFILING_ENABLE)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"%load_ext pyopencl.ipython_ext"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"%%cl_kernel\n",
"\n",
"#pragma OPENCL EXTENSION cl_khr_int64_base_atomics: enable\n",
"\n",
"inline void atomicAdd_g_f(volatile __global float *addr, float val)\n",
"{\n",
" union {\n",
" unsigned int u32;\n",
" float f32;\n",
" } next, expected, current;\n",
" current.f32 = *addr;\n",
" do {\n",
" expected.f32 = current.f32;\n",
" next.f32 = expected.f32 + val;\n",
" current.u32 = atomic_cmpxchg( (volatile __global unsigned int *)addr, \n",
" expected.u32, next.u32);\n",
" } while( current.u32 != expected.u32 );\n",
"}\n",
"\n",
"static inline float2 kahan_sum(float2 acc, float value)\n",
"{\n",
" if (value)\n",
" {\n",
" float sum = acc.s0;\n",
" float err = acc.s1;\n",
" if (fabs(value) > fabs(sum))\n",
" {\n",
" float tmp = sum;\n",
" sum = value;\n",
" value = tmp;\n",
" }\n",
"\n",
" float cor = value + err;\n",
" float target = sum + cor;\n",
" err = cor - (target - sum);\n",
" return (float2)(target, err);\n",
" }\n",
" else\n",
" {\n",
" return acc;\n",
" }\n",
"}\n",
"\n",
"\n",
"inline void atomicAdd_g_kahan(volatile global float2 *addr, float val)\n",
"{\n",
" union {\n",
" unsigned long u64;\n",
" float2 f64;\n",
" } next, expected, current;\n",
" current.f64 = *addr;\n",
" do {\n",
" expected.f64 = current.f64;\n",
" next.f64 = kahan_sum(expected.f64, val);\n",
" current.u64 = atomic_cmpxchg( (volatile __global unsigned long *)addr, \n",
" expected.u64, next.u64);\n",
" } while( current.u64 != expected.u64 );\n",
"}\n",
"\n",
"\n",
"kernel void histogram(global float* position, \n",
" global float* weight,\n",
" global float* histo,\n",
" int size,\n",
" int nbins,\n",
" float mini,\n",
" float maxi)\n",
"{\n",
" int id = get_global_id(0);\n",
" if (id<size)\n",
" {\n",
" int target = (int) (nbins * (position[id] - mini) / (maxi-mini));\n",
" atomicAdd_g_f(&histo[target], weight[id]);\n",
" }\n",
" return;\n",
"}\n",
"kernel void histogram2(global float* position, \n",
" global float* weight,\n",
" global float2* histo2,\n",
" int size,\n",
" int nbins,\n",
" float mini,\n",
" float maxi)\n",
"{\n",
" int id = get_global_id(0);\n",
" if (id<size)\n",
" {\n",
" int target = (int) (nbins * (position[id] - mini) / (maxi-mini));\n",
" atomicAdd_g_kahan(&histo2[target], weight[id]);\n",
" }\n",
" return;\n",
"}\n",
"\n",
"kernel void bad_histogram(global float* position, \n",
" global float* weight,\n",
" global float* histo,\n",
" int size,\n",
" int nbins,\n",
" float mini,\n",
" float maxi)\n",
"{\n",
" int id = get_global_id(0);\n",
" if (id<size)\n",
" {\n",
" int target = (int) (nbins * (position[id] - mini) / (maxi-mini));\n",
" histo[target]+= weight[id];\n",
" }\n",
" return;\n",
"}\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"position_d = array.to_device(queue, position)\n",
"weights_d = array.to_device(queue, weights)\n",
"histo_d = array.empty(queue, bins, \"float32\")\n",
"histo2_d = array.empty(queue, (bins,2), \"float32\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.079712 ms\n",
"mean error 2176504.147460074\n"
]
}
],
"source": [
"#Without atomic add !\n",
"histo_d.fill(0)\n",
"size = numpy.prod(shape)\n",
"ev = bad_histogram(queue, (size,), None,\n",
" position_d.data,\n",
" weights_d.data,\n",
" histo_d.data,\n",
" numpy.int32(size),\n",
" numpy.int32(bins),\n",
" numpy.float32(0.0),\n",
" numpy.float32(1.0))\n",
"ev.wait()\n",
"print(1e-6*(ev.profile.end - ev.profile.start), \"ms\")\n",
"delta = hn - histo_d.get()\n",
"print(\"mean error\", numpy.sqrt(numpy.dot(delta, delta))/bins)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.758592 ms\n",
"mean error 1.5002070427569187\n"
]
}
],
"source": [
"#With atomic add (but summed in 32 bits)\n",
"histo_d.fill(0)\n",
"size = numpy.prod(shape)\n",
"ev = histogram(queue, (size,), None,\n",
" position_d.data,\n",
" weights_d.data,\n",
" histo_d.data,\n",
" numpy.int32(size),\n",
" numpy.int32(bins),\n",
" numpy.float32(0.0),\n",
" numpy.float32(1.0))\n",
"ev.wait()\n",
"print(1e-6*(ev.profile.end - ev.profile.start), \"ms\")\n",
"delta = hn - histo_d.get()\n",
"print(\"mean error\", numpy.sqrt(numpy.dot(delta, delta))/bins)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.721504 ms\n",
"mean error 0.004567437879290133\n"
]
}
],
"source": [
"#With atomic add implemented with compendated arithmetics\n",
"histo2_d.fill(0)\n",
"size = numpy.prod(shape)\n",
"ev = histogram2(queue, (size,), None,\n",
" position_d.data,\n",
" weights_d.data,\n",
" histo2_d.data,\n",
" numpy.int32(size),\n",
" numpy.int32(bins),\n",
" numpy.float32(0.0),\n",
" numpy.float32(1.0))\n",
"ev.wait()\n",
"ev.wait()\n",
"print(1e-6*(ev.profile.end - ev.profile.start), \"ms\")\n",
"res = histo2_d.get()\n",
"hk = res[:,0].astype(\"float64\") + res[:,1].astype(\"float64\")\n",
"delta = hn - hk\n",
"print(\"mean error\", numpy.sqrt(numpy.dot(delta, delta))/bins)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOydd5gUVdq3G1FG1NdFZd01vN+YIwZWl111lVVflzWHXXXRVXRVdMWEaUiSRBSJSlJRRCQjgkgYhjjkPOQMA8wQhmGYnMPz/TGc7uecPqe6qquna3rmd1/XuS7orqk6XX266q4TnsdHAAAAAACgXuHzugIAAAAAACC6QAABAAAAAOoZEEAAAAAAgHoGBBAAAAAAoJ4BAQQAAAAAqGdAAAEAAAAA6hkQQAAAAACAegYEEAAAAACgngEBBAAAAACoZ0AAAQAAAADqGRBAAAAAAIB6BgQQAAAAAKCeAQEEAAAAAKhnQAABAAAAAOoZEEAAAAAAgHoGBBAAAAAAoJ4BAQQAAAAAqGdAAAEAAAAA6hkQQAAAAACAegYEEAAAAACgngEBBAAAAACoZ0AAAQAAAADqGRBAAAAAAIB6BgQQAAAAAKCeAQEEAAAAAKhnQAABAAAAAOoZEEAAAAAAgHoGBBAAAAAAoJ4BAQQAAAAAqGdAAAEAAAAA6hkQQAAAAACAegYEEAAAAACgngEBBAAAAACoZ0AAAQAAAADqGRBAAKJIfHw8tWnTxutq1HvatGlD8fHxNbb/77//nnw+H6WmptbYMcLB5/NRt27dvK4GAKAWAAEEIEzETX7NmjXa91u2bEnXX3+99Fo4Ajhz5kzctCNMbRbAsWPH0sCBAyNfKaqdApiRkUEJCQnUrFkzOvPMMykuLo4uv/xyeuGFF2jJkiXStuK8ihIXF0dXXnkltWvXjo4ePRq0nem3+eCDD9bo9w9ALAABBCBMwhHAkpISKisrc3Scdu3akc+Hn2okqc0CWJNyUtsEcNWqVdS0aVOKi4ujNm3a0JAhQ2jEiBHUqVMnuu6668jn81FycrJ/e3Fee/bsST/++CONGDGC2rRpQ6eccgpdeumlVFhYKG0HAQTADO4qAIRJOAIYDl4LYEFBgWfHrikggN5z4sQJuuCCC+j3v/89bd++Pej9qqoqGjduHK1evdr/muk39+6775LP56Nx48ZZbieAAAIAAQQgbCIxBFxWVkbdu3enK664guLi4ujcc8+lO+64g5KSkoioWlT4kJcogoKCAnr33Xfp4osvpkaNGtFVV11Fffv2paqqKum4RUVF9Oabb9J5551HZ511Fj388MOUnp4eJATdunUjn89HW7dupdatW1OTJk3o5ptvJiKijRs3Ups2bejSSy+luLg4+t3vfkcvvvgiHT9+XDqW2MfOnTvp2WefpbPPPpuaNm1KXbp0oaqqKjp48CA98sgj9D//8z/0u9/9jvr162f7nP/444/0xz/+kRo3bkxNmjShO++8k+bMmeN/f9q0afTAAw/QBRdcQI0aNaLLLruMevbsSRUVFdJ+dAJYWVlJgwYNombNmlFcXBw1bdqUWrVq5f9+U1NTyefz0ffffx9UL/U86gTQTt1atmwZ9F3zepaUlFDXrl3p8ssvp0aNGtHFF19MH3zwAZWUlEj1KSkpoXfeeYeaNm3q/77T0tJsC2BGRgb95z//ofPPP5/i4uLoxhtvpFGjRknbiPPRt29f+vrrr+myyy6jRo0a0a233ipJm4nevXuTz+ejCRMmhNxWYPrNzZgxg3w+H33yySeW2wkggABAAAEIG3GTmTdvHmVmZgaV22+/PaQAdurUiRo0aECvvPIKjRgxgvr370+tW7emzz77jIiIli9fTvfddx/5fD768ccf/YWouofknnvuoQYNGtDLL79MQ4YMoYcffph8Ph+988470nGfeuop8vl89Nxzz9HQoUPpqaeeoptuuskogNdddx09+uijNGzYMBo6dCgREfXr14/uvPNO6tmzJ33zzTf09ttvU+PGjalFixaScIp93HzzzdS6dWsaNmwYPfjgg+Tz+WjAgAF09dVX03//+18aNmwY3XHHHUHDfCa6d+9OPp+Pbr/9durbty998cUX9Mwzz1BCQoJ/m8cee4yeeuop6tu3Lw0fPpyefPJJ8vl89P7770v70gngCy+8QD6fj+6//34aNGgQ9evXjx599FEaPHgwEbkXQDt1S0pKoptvvpmaNm3q/66nTp1KRNWC+re//Y3OOOMMeuedd+jrr7+mN954g0499VR69NFHpfr8+9//Jp/PR8888wwNGTKEnnjiCbrxxhttCWBRURFde+21dNppp1H79u3pyy+/pDvvvJN8Ph8NGjTIv504H82bN6crrriC+vTpQ59//jk1bdqULr744pBTHW677TZq3LixoykRJrH74osvyOfz0VdffWW5nQACCAAEEICwUSek60ooAbzpppvowQcftDyOaQh42rRp5PP5qFevXtLr//znP6lBgwa0Z88eIiJat26dVgqF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U+vWremWW24JKYBO6vb555+Tz+ej9u3b07hx42j69OlEVP19P/DAA9SgQQP617/+RYMHD6ZBgwbRa6+9Rueee67UDlu3bk0+n4+effZZGjp0aFhhYBo1akTvvfceDR482B+fUBcGJlwBJKruqTvvvPPo9NNPpxdeeIGGDh1K33zzDX300Ud0zTXXkM/noz59+gSd11ACSEQ0evRoatCgAd1www3Uq1cvGj58OLVt25ZOPfVUuvHGG7WrsgGoT0AAawBVAEWQ0jPPPFMqp556Kj311FNERHTkyBG68sor6YMPPqD169dTcnIytWzZku69996QQz7AGyIhgL169aIWLVpQkyZNqHHjxnTNNdfQJ598Ig37V1RU0Jtvvkm//e1vqUGDBtJwcH5+PrVv354uvPBCOu200+jKK6/UBoIuLCykdu3a0bnnnktnnXUWPfbYY7Rz586gSfxWApienk6PP/44NWnShH7zm9/Qk08+SYcPH46aABIRjRw5kpo3b05xcXF0zjnnUMuWLWnu3Ln+95ctW+afW3bhhRfShx9+SHPmzLElgBUVFdS3b1+65pprqFGjRvTb3/6W7r//flq3bp1/m6KiInrppZfoN7/5Df3P//wPPfXUU3Ts2DFbi0Ds1q2goICeeeYZ/+IgXs+ysjLq06cPXX/99f5zcMstt1CPHj0oNzfXv11xcTG99dZbdN5559GZZ54ZViDoF198kZo2bUqNGjWiG264IWjuYyQEkKj62vfBBx/QddddR40bN6a4uDi67LLL6Pnnnw+aw+dEAImIZs+eTXfffTedffbZdNppp9Gll15K7777Lh6sASAIYI2gCuCECROoYcOGtGPHDtq9e7dUjhw5QkREXbp0oVtvvVXaj7hgr1ixIqr1B/UDMVTI470BAACoH0AAawBVAEVPi2lFGlF1LssWLVpIr4neFRHgFYBw0Q13tWnThk455RRtyBcAAAB1GwhghMjPz6eUlBR/r8qAAQMoJSWFDhw4QEREzz77LF1yySU0ZcoU2rdvH61atYp69+5NM2bMICKi+fPnU4MGDahHjx60a9cuWrduHbVq1Yri4+MxVwW4pnv37vTwww/TgAED6Msvv6T777+ffD45WwcAAID6AwQwQixcuJB8vuDgrGK+V1lZGXXt2pUuueQSOu200+iCCy6gxx9/nDZt2uTfx/jx46l5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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Histogram calculated on GPU')"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fix, ax = subplots()\n",
"ax.plot(histo_d.get())\n",
"ax.set_title(\"Histogram calculated on GPU\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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,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Ctx8881w0UUXWc73qquusqxnAoDXX3+99hrgadZIJGIbZQRIwFuPHj1sn6muwYYNGyASicDgwYMd97Ft2zZo0aIFRCIRuPrqq+Evf/kLrFixQvu9WCxWwxEDIIvFchTlA1hZWQk//elP4YorroCTJ0/Gl/fu3RsikQiMHTsW0tLSbCZH6ebm5sKHH34IDz30EDRt2hSaN28O69ati3/uBwCvvPJKEgDvueceyz7Hjh0LkUgEnnjiCRgzZgzMmzcP0tLS4IEHHoBoNGrZ1gQAr7vuOrj55pvJ75+WlgY7duyw7O/VV1+17QMHcFD7dwOAqmn2U6dOwcSJE+H555+Hyy+/HCKRCLzzzjva78ZisRqGGABZLJajVEEgIvVK796948smT54MkUjENjVsopycHLjkkkvgmWeeiS+jpoCvuOIKoyng2267zRZ0AQDw//7f/7Pss3379tCyZUvbPu+66y5PANi2bVto0aKFbX+UvACgagp44sSJ5BSwk58lQE0k9GOPPQZNmjQJNa8ji8VKDjEAslgsR6kAEACgdevWcPnll8eh4cSJE3DppZdCmzZtoKKiwra+CEY4ffq0DTSqqqrg8ssvhyeffDK+zE8QyJNPPgmXX365JcBj1qxZEIlELPv81a9+BS1btrQAVWZmJlxwwQWeADAlJQUikQgMGzbM9tmZM2fg1KlTlv25BUBxDb788sv4snPnzsHdd99NBoFQ+zhy5IhtWadOneDCCy+Mb89isRquGABZLJajdAA4ZcoUWyqY8ePHw4UXXgg33XQT9OrVC4YNGwZvvfUW3HrrrXHYWb9+PXz729+GV155BQYOHAiffvopPPTQQxCJRGDq1KnxfckAKGDv4osvhlgspk0DI3ID3n///TB06FD45z//Cd/73vegVatWln2OHDkSIpEItGvXDoYNGwadO3eG5s2bw4033ugJAKuqqqBt27ZwwQUXwO9+9zsYNGgQDBgwAF555RX49re/bbmOXgBQpIFp2rQpvPHGGzBo0CBo06aNMg0MtY/bb78d2rZtC++99x6MGDEC3njjDWjWrBk8/vjj2u/GYrEahhgAWSyWo3QAWFVVBa1atYJWrVpBZWVlfHl6ejo88sgjcNlll8HFF18MrVq1gueffx7WrFkDADUjUK+++ir88Ic/hH//93+Hyy67DO68807LyB4AHbCRn58P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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Residual errors')"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fix, ax = subplots()\n",
"ax.plot(hn - hk)\n",
"ax.set_title(\"Residual errors\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusion:\n",
"\n",
"1. Atomic_add are MANDATORY for performing histograms in parallel (also true for parallel cython !)\n",
"2. Atomic_add have to be implemented using atomic echange for single precision floats\n",
"3. This notebook gives an implementation of atomic_add using compensated arithmetics, providing a few more digits precision."
]
}
],
"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.5.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment