Skip to content

Instantly share code, notes, and snippets.

@rmrao
Created May 8, 2020 21:59
Show Gist options
  • Save rmrao/a8171236f3e5490323232c7ba617c9fa to your computer and use it in GitHub Desktop.
Save rmrao/a8171236f3e5490323232c7ba617c9fa to your computer and use it in GitHub Desktop.
Various ways of extracting info from ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"from models.bert import SimpleBERT\n",
"from parsing import get_msa, parse_cf\n",
"from metrics import con_auc\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt \n",
"\n",
"%matplotlib notebook"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"msa, _, _ = get_msa('data/4rb6Y/4rb6Y.i90c75.a3m')\n",
"nat_contacts = parse_cf('data/4rb6Y/4rb6Y.cf')"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<All keys matched successfully>"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"checkpoint = torch.load('logs/simple-bert/2thzdl2c/_ckpt_epoch_2376.ckpt')\n",
"model = SimpleBERT(msa, nat_contacts, **checkpoint['hparams'])\n",
"model.load_state_dict(checkpoint['state_dict'])"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"plt.imshow(nat_contacts > 0.01)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def show_contacts(contacts, name):\n",
" auc = con_auc(contacts, nat_contacts)\n",
" plt.figure(figsize=(6,3))\n",
" plt.subplot(1,2,1); plt.title(\"native\"); plt.imshow(nat_contacts > 0.01)\n",
" plt.subplot(1,2,2); plt.title(f\"{name}: {auc:.3g}\" ); plt.imshow(contacts)\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 47,
"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 / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\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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\" width=\"600\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"attention_contacts = model.get_contacts(method='attn_mean')\n",
"show_contacts(attention_contacts, 'attention')"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"weight = model.multihead_attention.qkv.weight.data\n",
"q_weight, k_weight, v_weight = weight.chunk(3, dim=0)\n",
"attention_head_size = model.hidden_size // model.num_attention_heads\n",
"q_position_weights = q_weight[:, 20:].reshape(\n",
" model.num_attention_heads, attention_head_size, -1)\n",
"k_position_weights = k_weight[:, 20:].reshape(\n",
" model.num_attention_heads, attention_head_size, -1)\n",
"contacts = torch.einsum('hri,hrj->hij', q_position_weights, k_position_weights)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Contacts From Weights\n",
"\n",
"Q is `[H x R x L]`\n",
"\n",
"K is `[H x R x L]`\n",
"\n",
"Contacts = `einsum('hri,hrj->hij', Q, K)`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Contacts - APC Only"
]
},
{
"cell_type": "code",
"execution_count": 49,
"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 / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\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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\" width=\"600\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"show_contacts(model.apc(contacts.mean(0)).cpu().numpy(), 'weights_nonsym')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Contacts - Symmetrize + APC"
]
},
{
"cell_type": "code",
"execution_count": 50,
"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 / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\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,iVBORw0KGgoAAAANSUhEUgAAAlgAAAEsCAYAAAAfPc2WAAAgAElEQVR4nOydeXxV5bW/N2NQrFQUB8RMQMKchDnMYMhJr6JFEaUOKIqgZRIVAYEQMkBGhypOVaotBevYai0KVr23Xq16+XnrUGtvaytK7+3g0Eksyvr9kfdZJ+dNAidwMpyctT6f94+zz97vfod9WE/4rr1WIGZmZmZmZmZmZjG1oLUHYGZmZmZmZmbW3swAy8zMzMzMzMwsxmaAZWZmZmZmZmYWYzPAMjMzMzMzMzOLsRlgmZmZmZmZmZnF2AywzMzMzMzMzMxibAZYZmZmZmZmZmYxNgMsMzMzMzMzM7MYmwGWmZmZmZmZmVmMzQDLzMzMzMzMzCzGZoBlZmZmZmZmZhZjM8AyMzMzMzMzM4uxGWCZmZmZmZmZmcXYDLDMzMzMzMzMzGJsBlhmZmZmZmZmZjE2AywzMzMzMzMzsxibAZaZmZmZmZmZWYzNAMvMzMzMzMzMLMZmgGVmZmZmZmZmFmMzwDIzMzMzMzMzi7EZYJmZmZmZmZmZxdgMsMzMzMzMzMzMYmwGWGZmZmZmZmZmMTYDLDMzMzMzMzOzGJsBlllc29atW+Wmm25q8LsgCKSwsLBlB2RmZmZmZiYGWGZxbmeccYakpKQ0+N1LL70ke/bsadkBmZm1ISssLJQgOLx/5rds2SJBEMirr756yHNvv/122bJly2Hdp73brbfeKpmZmdK1a1dJTU2V9evXy7/+9a9DXsfeNda2bdsWcf6BAwfkvvvuk1GjRsnRRx8tX/nKVyQnJ0cef/zxiPP27t0rc+fOlV69eklSUpIMHTpUvv3tb8d0zma1ZoBlFtd2MMAyM0t027Nnj7z00kuHdW1TAGvw4MEyefLkw7pPe7aSkhLp0KGDrFq1Sp577jmpqKiQrl27yvz58w95LXvntyFDhshRRx0lH3/8ccT5CxYskKSkJFm5cqXs2rVLduzYIZWVlfL9739fz/nkk08kPT1d+vTpI1u2bJEdO3bI3LlzJQgCqa6ujvn8E90MsMxa1Pir7M0335QLLrhAjj32WDnxxBPlsssuk08++UTPu+2222TixInSq1cvOfroo2XIkCFSXl4e8Zff5MmTG/zLDqsrEb7++usSBEGDf6k99dRTEgSB/PCHP9Rj7777rsyZM0d69eolXbt2lQEDBshtt93WDCtiZtY2zQDryOzPf/6zdOvWTa688sqI46WlpdKhQwd56623mtzne++9Jx06dJCLLroo4vhjjz0mQRDIgw8+eNDrN27cKEEQyGuvvRZxPD8/X7p3714P2syOzAywzFrUAKzMzExZt26d7Ny5U2pqaiQpKUkuu+wyPe+aa66RO+64Q3bs2CE//elP5aabbpITTjgh4py33npLxo8fLyeffHLEX3iYH4OVk5Mj48ePrzem2bNny4knnij79+/Xfnv06CFDhw6VBx54QJ555hm59tprpWPHjrJ+/fpmWBWzRLQ333xTgiCQH/zgB3rstddekyAIZNCgQRHnzpgxQ4YPHx5xbPv27TJ27Fg5+uijpXv37pKfny+7d++OOKchiXDfvn2yfPlyOemkk+Soo46SiRMnymuvvSYpKSkyd+5cPQ/A+ulPfyoLFy6U448/Xnr27CkzZ86UDz/8UM9LSUmp90cO/6v85ZdfSnFxsWRkZEi3bt30d3XzzTc3aa02b94sw4YNk+7du8sxxxwjmZmZsmrVKhGphY5OnTpJWVlZveteeOGFiDVmPf77v/9bZs2aJccee6wcd9xxcs0118j+/fvlnXfekVAoJMccc4ykpKRIeXl5k8ZZ1773ve9JEAT1/gdx7969EgSBlJaWNrnPtWvXShAE8vzzz0ccnzJliqSmph7y+jPPPFNOOumkesdvvfXWBmVHsyMzAyyzFjX+gauoqIg4fvXVV0u3bt3kwIED9a758ssvZf/+/fLAAw9Ip06d5KOPPtLvDiYR+oDFPyK/+tWv9NhHH30kSUlJcu211+qxUCgkffr0kU8//TSiv0WLFkm3bt0i7m9mdiR2yimnRPwPx6ZNm+Soo46SIAgUYvbv3y/HHnusrFixQs/jf0HmzZsnTz75pDz66KOSm5sr3bt3j/ifkYYAa86cOdKxY0dZuXKlPPPMM3LzzTfLaaedJj169GgQsNLT02Xx4sXy9NNPy7e//W057rjjZOrUqXre7t27JT09XXJycvSPHEBv48aN0qlTJyksLJRnn31WduzYITfffHOT/lDZtm2bBEEgixcvlmeeeUZ27dold955pyxZskTPmTlzpiQnJ8sXX3wRce15550nvXv31j+e6v6BV1xcLDt37pQVK1ZIEASyaNEiGTBggNx6662yc+dOueyyyyQIAnnkkUci+uR/zg9lK1eulCAI5O9//3u970444QSZM2dO1GsgUvvv4GmnnSb9+vWLOL5//35JSkqSmTNnSnV1tSQnJ0vHjh0lLS1NKisrI/5Nzc/Pl+Tk5Hp933XXXRIEgUKrWWzMAMusRY1/4N55552I43feeacEQSD/+7//KyK1/2jPmDFDevbsWe+v45dfflmvawpg/eUvf5GkpKSIf0Ruv/12lSxFRD777DPp3LmzLF68WPbv3x/RkBKfeuqpGK2GWaLbRRddJOnp6fo5Ly9P5s+fL8cdd5zcf//9IiLy4osvShAE8swzz4iIyPvvv6/PaF3729/+JieffLLMnj1bj/mA9dZbb0kQBHLDDTdEXAvENARYV199dcS5FRUVEgSB/OEPf9BjjUmEZ555pmRnZ0e5Gg3bokWL5Ktf/epBz3nuueckCAJ57LHH9NiHH34onTt3lqKiIj3GevjxRtnZ2RIEgTz66KN6bP/+/dKrVy8555xzIs6dNm2adOrU6ZDjnj9/viQlJTX4XUZGhuTn5x+yj7r2k5/8RIIgkI0bN0Yc/8Mf/iBBEMixxx4rffr0kfvvv1+effZZWbhwoQRBIKtXr9Zzly1bJh07dpTf//73EX1cfPHFEgRBPTnT7MjMAMusRY1/4P70pz9FHOcf8/fee09+//vfS/fu3WX48OHy3e9+V/7jP/5DXn31VYWh5557Tq9rCmCJ1P5Fe+qpp+pfuqNGjZLRo0fr9x988MFB39wJgkAeeOCBmKyFmRnP/W9/+1v57LPPpFu3bvLII4/IOeeco3E2RUVFkpSUJP/85z9FROSee+7R2Cj/j4Dzzz9fTjzxRO3fB6zNmzdLEATyX//1XxHj2L9/v3Tu3LlBwNqxY0fEuTt27Kj3h05jgLVhwwbp0KGDXHXVVbJjx456/yscjT3wwAMSBIFccMEF8vjjj9f7twPLysqSvLw8/bx27Vrp0qVLBAiyHnX/F1uk9n/1OnToIJ999lnE8dzcXBkxYkSTxyxSC1jdunVr8LuMjAwJhUJN6m/WrFnSuXPniPmI1IIk/zb5cuTXv/516datm/ztb38TEZG3335bkpKSZMKECfLmm2/Kn//8Z7ntttuka9euEgSBLFy4sEljMju4GWCZtahFA1i33HKLBEEgv/vd7yLOwbEcCWDxv1A/+clP9K/5O+64Q7//xz/+IZ06dZJLL71UXn311Qbbn//85yNaAzMzbM+ePRIEgdx9992yc+dO6dSpk3z88ceyefNmOeWUU0REZOLEiTJt2jS9pqSk5KB/AHTs2FHP9QGruLhYgiCQDz74oN5YTjrppAYByw9y53+L6v4OGwOs/fv3S3V1teTk5EiHDh2kc+fOMm3atKgC5+vafffdJ7m5udKpUyfp0KGDjB49Wv9HD7v33nulQ4cO8s4778i//vUvOfnkk+vJcI39+zN37lzp3r17vftOnjxZBg8e3KSxYkiE//jHP+p911SJ8E9/+pN07dpVzj777Hrf/fOf/5QOHTrIscceW+87pL+f//zneuypp56S0047TZ+X0047Tb71rW9JEARSXFwc9ZjMDm0GWGYtatEAFrFSdf9SO3DggIwePbreP+znnHNOxF/sda0hwPriiy/k1FNPldmzZ8t1110n3bp1i3h7UaRWpsnKypLPP//8yCZrZhaFZWRkyOzZs2XFihUyZswYERH51a9+pf9L1KVLl4gAbuT0hx9+uNE/ArBY/A/WkQBWXfv444/loYcekv79+0vPnj0bBI9D2d///nd56qmnZNSoUdK1a9eIP8I+++wzOeGEE2Tx4sWydetWCYJAfvazn0Vc35KAxRjq/k+fSFjSa0qQe01NjQRBIE888USD32dkZDQIWDwr/h4eOHBA3n33XXn77bfliy++kO9///sSBIG88MILUY/J7NBmgGXWohYNYP3yl7+Url27ypQpU+Spp56SRx99VKZPny79+/ev9w87/W3evFl+/vOfR/xD0hBgiYisWrVKkpKSpFevXvKNb3yj3vdvvfWWHHfccTJ69GjZsmWLPPfcc/KjH/1IampqIoJ7zcxiYVdffbWccMIJkpOTI2vWrNHjycnJkp+fL0EQyCuvvKLH33vvPencuXNUb7j5gMWbi3UD5kUOHoMVDWANHz48Qmo/mN18880SBMFhpSnAHn/8cQmCQH784x9HHF+9erUce+yxMmLEiAZjv1oSsP7yl79It27d6sluGzdubHKahsGDB0vv3r3rBfFjq1atkiAI5MUXX4w4ftZZZ8kxxxyj8nJD9vnnn8uYMWOOOFbOrL4ZYJm1qEUDWCIiTzzxhGRlZUm3bt3k1FNPleuvv16DPOv+w/7RRx/JrFmz5Ktf/ap06NAhwpk0Bljvvvuu/vf4zp07Gxzne++9J/PmzZNTTz1VunTpIr169ZJx48ZJSUnJEa+BmVlde+SRR/R5rPs/CLzFdtxxx8mXX34ZcU1ZWZl07txZFixYII899pg8//zz8uCDD8q1114r69at0/Mae4uwU6dOsmrVKtm5c2fEW4R106A0BbDmzp0rSUlJsn37dnnllVfkF7/4hYjUBrmvXLlSHn74YXnhhRfkgQcekNTUVElJSYkqm7mIyBVXXCGLFy+W7du3ywsvvCAPPvigZGdnS48ePeSPf/xjxLkffPCBdO7cWYKg4Zx3sQCsaIPcRcKJRlevXi3PP/+8VFZWSlJSUr1Eo/fff7906tRJX2yoay+//HK9YHXf/vKXv0hycrL07t1b7r33Xnn66adl/vz5EgSBVFVVRZy7aNEiefjhh+W5556Te++9V7KysuT444/XF33MYmcGWGZmZmataB9//LF07NhRunfvHgEdSEz+W2zY448/LlOnTpVjjz1WkpKSJCUlRWbNmiW7du3Scw6WB+vEE0+Ubt26ydixY+Wll16SHj16yDXXXKPnNQWwfve730l+fr585StfkSAI58Gqrq6WcePGyQknnCBdu3aV5ORkufzyy+vFVx7M7r//fpk6daqcdNJJ0rVrV+ndu7fMnj1bIc63KVOmSM+ePRv8X5tYAFa0aRqwW265RTIyMnT+hYWF9eCStW6o3ND8+fOlQ4cO8pvf/Oag93n//fflggsukOOOO066du0qw4YNk/vuu6/eeWeffbaccsop0qVLFzn55JPl0ksvbdJ+mEVvBlhmZmZmCW6kgti6dWtrD+WI7P/+7/+kW7ducv3117f2UMzMDLDMzMzMEsmeeeYZKSoqkieffFKeffZZqampkRNPPFH69+9fL01BvNiePXvkhRdekDPPPFOOPvroBt+SNDNraTPAMjMzM0sge/nll2X8+PFy3HHHSefOneXkk0+WuXPnyt69e1t8LH4eL7/5sWeNWWFhoXTo0EHS0tIiko2ambWmGWCZmZmZmbW4vffee4dM6tvQSypmZvFiCQVYt99+u6SmpkpSUpIMHz5c/v3f/721h2RmZtbMZr/7tmmff/55o3m8aHWLSpuZxZslDGBt375dunTpIvfcc4+8/fbbsnTpUunevXu9mkxmZmbtx+x3b2Zm1lqWMIA1evToegnfBgwYICtXrmylEZmZmTW32e/ezMystSwhAOvz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\" width=\"600\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"c = contacts.mean(0)\n",
"c = c + c.transpose(0, 1)\n",
"c = model.apc(c)\n",
"show_contacts(c.cpu().numpy(), 'weights_sym')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Contacts - Softmax over K, Symmetrize, APC"
]
},
{
"cell_type": "code",
"execution_count": 51,
"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 / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\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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6quv8OWXX+K+++5DUlISPvzwQ/3uVBIhA9Z3v/tdeJ6HP//5z7rtww8/RHJyMq699lrdlp+fjy5duuDYsWMx7a1cuRIpKSkx5zerfuvYsSOWLFmin3fu3InGjRvD8zyFmC+//BItWrTA9ddfr/tt27YN9erVw1VXXYUnnngCjz76KEaPHo2mTZvitdde0/3KA6xZs2ahfv36WL9+Pfbt24dbb70V55xzDlq2bFkuYPXo0QOrVq3CL3/5S/zgBz9Aq1atkJmZqfsdOnQIPXr0wNChQ/UPBQG9HTt2ICkpCZs2bcIzzzyDvXv34tZbb60Q7O/Zswee52HVqlXYt28fnn76aezatQurV6/Wff70pz+hefPmOPfcc3HffffhF7/4BWbNmgXP81BQUAAA+Mc//oGDBw/C8zxMmzZN+/qPf/wD27dvh+d5uO2222K2A2WA1aZNG/Tp0wc//OEP8ctf/hKTJ0/WwHjeeedhz549ePLJJzFq1CgkJyfHAOhzzz2Ha6+9Fg8//DCee+45PPbYY7j44ovRuHHjGGno888/x5AhQ9CjRw989NFHAMpkpfr162Pfvn1xjxcQC1jHjx/HzJkz0bx5cwf+TmVHjhxBSkoKcnNz8fjjj+PZZ5/F7t27ceWVV2r/vvOd76BevXp44403Yo697bbb4HmePosCWKmpqZg/fz727t2LXbt2oVmzZsjMzERubi7WrVuHffv2oaCgAElJSVi1alVMm/Isn+5Xxr1798LzPPziF79wvps2bRo6dux42mufOnUqOnXqhAMHDuDTTz/FH//4R+Tk5KBr164x/4eOGjUKI0aMcI6XP57uvPNO57sTJ07g+PHj+OMf/4ipU6eiffv2ePfdd0/bp6o2AyyzKjV5wVkv37VrFzzPw9///ncAZQFnypQpaN26tfNX8W9/+1s9riKA9e9//xvJyckxf7XLf2KSJPn555+jQYMGWLVqFb788ssYFynxySefTNBomCXC5syZgx49eujnnJwcLF68GK1atcK9994LICJtSJB999139T5H26effooOHTpg+vTpuo0B67XXXoPnebjhhhtijhWIKQ+w5FcIscLCQniehw8++EC3BUmEkydPxpAhQ+IcjfJt5cqVOOuss065z8yZM5GcnOwEqgsuuABNmjSJkfDLk89OJRGKnB/9y9K///1vJCUloXHjxjEwJXL+d7/73cC+njhxAv/973/Rq1cvXHPNNTHfvfnmm2jRogUuvvhiPP3006hfv74jVcVjco3//ve/MW7cOHTu3BmvvPJKhdp4+OGH4XneKY/75JNP0Lx5c6xZsyZme//+/WMgXABrypQpMfutXbsWnufFwDIAXHzxxWjdunXMts2bNyMpKQnPPvvsKfu9e/dueJ5Xbu7hkiVL0KhRo1MeDwD//e9/sXjx4pj/uwcNGuRMgujVqxfy8/Od499//314noft27c73yUnJ2ubvXv3xuuvv37a/lSHGWCZValJsPrnP/8Zs10C0ZEjR/DXv/4VTZs2xbBhw/A///M/eP755/HSSy8pDEX/B14RwAKAyy+/HJ07d1Zdf8SIEUhLS9Pv5afxU/l9992XkLEwS4zJs/P222/j888/R0pKCh555BFceumlmDNnDoCywJKcnIz/+7//AwB8//vf19woBukZM2agffv22j4D1u233w7P8/D73/8+ph9ffvklGjRoUC5g7d27N2Zf+YUg+o+FIMC6+eabUa9ePSxfvhx79+51flmNx+677z54noeZM2fi8ccfd94/AGjfvj0uvPBCZ/uDDz4Iz/Nifrk5E8Aq71ePjh07YvTo0THbvvjiC3ieF/Or8pdffolt27ahX79+aNiwYcz7OHHixMA+p6SkICMj47R5POWZ53m48MIL0bt3bwwaNOiMZiT/5S9/QaNGjZCWloYf/ehHeOutt8rdb/Xq1WjZsiU+++wzAGWyoud5eOSRR3QfASz+RefOO++E53n45S9/GbN9w4YN8DzvjGRCAazo51NsyZIlSE5OPm0bCxcuROvWrXHLLbfgueeew4MPPojzzz8f3bt3j0ly79WrV7n3UACrPJny97//PQ4ePIj7778fw4cPx9lnn10jZxIaYJlVqcUDWN/5znfgeZ4z00SC4tcBLPkV6qmnntJfIu644w79/j//+Q+SkpIwf/58vPTSS+X6v/71r681BmaJtaNHj8LzPNx1113Yv38/kpKS8NFHH+H222/XoJ6eno6srCw9ZuvWraeE6Pr16+u+DFhbtmyB53n429/+5vTl7LPPLhewOMldgmX0sxwEWF9++SVKSkowdOhQ1KtXDw0aNEBWVlZcifPRdvfdd2P06NFISkpCvXr1kJaWFiObJSUlYeHChc5xzz//PDzPw/3336/bzgSw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O52g2HRSV1eXTJ48WXbt2mUBl01NTfZ7d3d32ga71tXVSW5urvzrX/+64nHp+AyCgl2vNPYa7PrGG2/YMcePH49UsGvU5n0mznkRzvtUaaTO+zBFwEpCul173759cvLkSXn88cdl7Nixcvr06VQ3LVCbNm2SnJwcef311/tsBf7nP/8pIiJ/+ctfZNeuXfK73/1O/vrXv8qvfvUrueWWW2TevHny73//O8Wt79WTTz4pr7/+urz//vty/PhxqayslKysLBv3xsZGycnJkQMHDkhnZ6esXbs27bZri4hcvnxZpk6dKk899VSf79P5GXzyySfS0dEhHR0d4nmetLW1SUdHh6UoSGbsV61aJXPnzpX29nZpb2+XOXPmRGq7dtTmfSbMeRHO+1SK8z5cEbCS1AsvvCD5+flyww03yPz589Pq/zT6U39J7jzPk1deeUVERP72t79JUVGRjBs3Tm644QYpKCiQrVu3yoULF1Lb8ARpjpVRo0bJpEmT5N5775U//vGP9rsmvcvNzZXRo0dLUVFRnx1T6aJf//rX4nme/OlPf+rzfTo/g8OHD/f7/tTW1opIcmN/4cIFqa6ulqysLMnKypLq6urIJRyM0rzPhDkvwnmfSnHehysCFkVRFEVRVMgiYFEURVEURYUsAhZFURRFUVTIImBRFEVRFEWFLAIWRVEURVFUyCJgURRFURRFhSwCFkVRFEVRVMgiYFEURVEURYUsAhZFURRFUVTIImBRFEVRFEWFLAIWRVEURVFUyCJgURRFURRFhSwCFkVRFEVRVMgiYFEURVEURYUsAhZFURRFUVTIImBRFEVRFEWFLAIWRVEURVFUyCJgURRFURRFhSwCFkVRFEVRVMgiYFEURVEURYUsAhZFURRFUVTIImBRFEVRFEWFrP8HSAZG/J86Ve8AAAAASUVORK5CYII=\" width=\"600\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"c = contacts.softmax(2).mean(0)\n",
"c = c + c.transpose(0, 1)\n",
"c = model.apc(c)\n",
"show_contacts(c.cpu().numpy(), 'weights_softmax_k_sym')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Contacts - Softmax over Q, Symmetrize, APC"
]
},
{
"cell_type": "code",
"execution_count": 52,
"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 / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\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,iVBORw0KGgoAAAANSUhEUgAAAlgAAAEsCAYAAAAfPc2WAAAgAElEQVR4nOydeZRV1ZX/L2MVoCDIDFZBMQsyiUgxU/WqChWMOILSOAAyCDghQlRKZKqBVxp/kdgax5ZW2ygmMYaIE0kbnJplgtpGjSbi0G0nAtFEDMr39wd373ff99SFV/BquFV7r7XX4t13h3POvZfzqbf3+W4PZmZmZmZmZmZmaTWvthtgZmZmZmZmZlbfzADLzMzMzMzMzCzNZoBlZmZmZmZmZpZmM8AyMzMzMzMzM0uzGWCZmZmZmZmZmaXZDLDMzMzMzMzMzNJsBlhmZmZmZmZmZmk2AywzMzMzMzMzszSbAZaZmZmZmZmZWZrNAMvMzMzMzMzMLM1mgGVmZmZmZmZmlmYzwDIzMzMzMzMzS7MZYJmZmZmZmZmZpdkMsMzMzMzMzMzM0mwGWGZmZmZmZmZmaTYDLDMzMzMzMzOzNJsBlpmZmZmZmZlZms0Ay8zMzMzMzMwszWaAZWZmZmZmZmaWZjPAMjMzMzMzMzNLsxlgmZmZmZmZmZml2QywzMzMzMzMzMzSbAZYZmZmZmZmZmZpNgMsMzMzMzMzM7M0mwGWWaRt06ZNuPXWWyv9zvM8FBcX12yDzMzMzMzMYIBlFnE744wzkJ2dXel327dvx65du2q2QWb1yoqLi+F5R/bf5H333QfP8/Daa68ddt877rgD99133xFdp6Ztx44dGD9+PFq3bg3P83DrrbfirbfeQnFxMT788MPabp5ZGu32229Hv3790Lx5c/To0QM333wz/vnPf6Z07HvvvYeZM2fihBNOQGZmJnJycnD11VfjL3/5yyGPu+iii+B5Hs444wznu+zsbHie5/i8efOOqH/VbQZYZpG2QwGWmdnR2q5du7B9+/YjOrYqgDVw4EBMmDDhiK5T0zZ06FD06dMHTz/9NLZv347PPvsMjz32GDzPwwsvvFDbzTNLk61ZswaNGjXCihUr8MILL6CsrAzNmzfH3LlzD3vs559/juOPPx49e/bE/fffj+effx7xeBzHHHMMhg4diu+++67S45566im0atUKrVu3DgWsMWPGYPv27Un+wQcfHHV/q8MMsMxq1OQXgTfffBPTp09H69at0bFjR1x66aXYs2eP7vfDH/4Q48aNQ4cOHdCyZUsMGjQIpaWlSX89TZgwodK/ZsSCIcI33ngDnufhxz/+sdOmp59+Gp7n4ac//alue/fddzFjxgx06NABzZs3R//+/fHDH/6wGkbErL5afQWspk2bYsGCBUnbDLDql/3lL39BZmYmLr/88qTta9euRaNGjfDWW28d8vi7774bnufh2WefTdq+bt06eJ6HHTt2OMfs2bMH3bp1Q0VFBbKzs0MBq7LtddUMsMxq1ASw+vXrh5UrV2Lr1q2oqKhARkYGLr30Ut3v6quvxo9+9CNs2bIFzz//PG699Va0b98+aZ+33noLY8aMQefOnZP+mhHjHKxhw4ZhzJgxTpvOP/98dOzYEfv379fztmnTBieddBIefPBBPPPMM7j22mvRuHFj3HzzzdUwKmZHYm+++SY8z8N//Md/6LbXX38dnufhxBNPTNp36tSpGD58eNK2Rx55BKNGjULLli3RqlUrFBYWOv/xVxYi3LdvH6655hp06tQJLVq0wLhx4/D6668jOzsbF198se4ngPX8889j/vz5OP7449GuXTtMmzYNn3zyie5XWdhDfpX97rvvsHr1avTt2xeZmZn6XN52221VGquNGzdi8ODBaNWqFY455hj069cPK1asSNpn586dOPPMM3HcccchIyMDQ4YMwf333+/0h/1Q24GDfwgNHDgQv/3tb5Gbm4vMzExkZ2fj3nvvBXDwV4thw4ahRYsWGDRoEH75y18mteu9997DJZdcgt69e6NFixbo2rUrpkyZgt///vdJ+82bNw8ZGRl4/fXXddt3332HvLw8dOzYEZ9++mnK47V3717MmTMH7dq1Q6tWrVBUVIQ//OEPR5TXeaix//DDD9GkSROsW7fOOW7btm1Jz7c8i7/73e9w7rnnonXr1mjbti2uvvpq7N+/H++88w6KiopwzDHHIDs7G6WlpVVqZ9AeeugheJ7n/Hr76aefwvM8rF279pDH33///ZX+cbFx40Z4noe3337bOWb27NkYMWIEvv32WwMsM7MjMflPoqysLGn7woULkZmZiQMHDjjHfPfdd9i/fz8efPBBNGnSBF988YV+d6gQIf9nePvtt8PzPPzhD3/QbV988QUyMjJw7bXX6raioiJ0794de/fuTTrfokWLkJmZmXR9s9q1Ll26JP2VXVJSghYtWsDzPIWY/fv3o3Xr1li2bJnuJ3+JX3bZZXjqqafwxBNPIDc3F61atUr667wywJoxYwYaN26M5cuX45lnnsFtt92GE044AW3atKkUsHJycrB48WL86le/wo9//GO0bdsWkyZN0v127NiBnJwcDBs2TP9IENBbv349mjRpguLiYjz33HPYsmULbrvttiqB/sMPPwzP87B48WI888wzePbZZ3HnnXdiyZIlus8777yDY489Fr169cKDDz6IX/ziF5gxYwY8z9OJ+vPPP8f27dvheR7OPfdcbevnn3+uv0zccccdSduBg4B1/PHHo1+/frjnnnvwq1/9ClOmTIHneVi1ahVOOukkPPzww3j66acxatQoZGRkJAHotm3bcO211+InP/kJtm3bhs2bN+Oss85CixYt8M477+h+X3/9NYYOHYqcnBzs3r0bALBy5Uo0btwYzzzzTMrjdeDAAUyaNAkZGRlYu3YtnnnmGRQXFyMnJ6fKgJXK2E+bNg1ZWVn49ttvk44977zz0LVrV/3DL/jH6erVq7F161YsW7YMnudh0aJF6N+/P26//XZs3boVl156KTzPw+OPP550TvnV/3C2fPlyeJ6Hr776yvmuffv2mDFjxiGP37NnD7KysjB+/Hi8+eab+PLLL7Ft2zZkZWVh6tSpzv5bt25Fs2bN8MYbbwAIB6ns7Gwce+yxOOaYY9C0aVMMGDAAGzZscMaurpgBllmNmvwnEfyPEQDuvPNOeJ6H//mf/wFwcNKZOnUq2rVr5/xl/PLLL+txVQGsv/71r8jIyEj6y/2OO+7QkCVw8D/ppk2bYvHixdi/f3+SSyjx6aefTtNomB2tzZw5Ezk5Ofo5Foth7ty5aNu2LR544AEAwEsvvQTP83SS/eijj/QeB+3LL79E586dcf755+s2Bqy33noLnufh+uuvTzpWJtLKAGvhwoVJ+5aVlcHzPHz22We6LSxEOGXKFAwdOjTF0ajcFi1ahOOOO+6Q+0yfPh0ZGRn46KOPkrafdtppaNmyZVL43vM8XHHFFUn7HSpEKJN68Jelv/71r2jSpAlatGiRBFMSyr/99ttD2/rtt9/in//8J/r06YOrr7466bv33nsPrVu3xllnnYVnn30WjRs3xo033njIvrP98pe/hOd5+MEPfpC0fe3atVUGrFTG/oUXXoDnedi8ebNu++STT9C0aVOsWrVKt8mzGI/Hk44fOnQoPM/DE088odv279+PDh064Oyzz07aNy8vD02aNDlsu+fO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\" width=\"600\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"c = contacts.softmax(1).mean(0)\n",
"c = c + c.transpose(0, 1)\n",
"c = model.apc(c)\n",
"show_contacts(c.cpu().numpy(), 'weights_softmax_q_sym')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Contacts - Softmax over Q + Softmax over K, Symetrize, APC"
]
},
{
"cell_type": "code",
"execution_count": 53,
"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 / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\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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\" width=\"600\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"c = contacts.softmax(1) + contacts.softmax(2)\n",
"c = c.mean(0)\n",
"c = c + c.transpose(0, 1)\n",
"c = model.apc(c)\n",
"show_contacts(c.cpu().numpy(), 'weights_softmax_qk_sym')"
]
}
],
"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.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment