Show More
This diff has been collapsed as it changes many lines, (1164 lines changed) Show them Hide them | |||
@@ -3,28 +3,30 b'' | |||
|
3 | 3 | "name": "00_notebook_tour" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "markdown", |
|
12 | "metadata": {}, | |
|
11 | 13 | "source": [ |
|
12 | "# A brief tour of the IPython notebook", | |
|
13 | "", | |
|
14 | "This document will give you a brief tour of the capabilities of the IPython notebook. ", | |
|
15 | "You can view its contents by scrolling around, or execute each cell by typing `Shift-Enter`.", | |
|
16 | "After you conclude this brief high-level tour, you should read the accompanying notebook ", | |
|
17 | "titled `01_notebook_introduction`, which takes a more step-by-step approach to the features of the", | |
|
18 | "system. ", | |
|
19 | "", | |
|
20 | "The rest of the notebooks in this directory illustrate various other aspects and ", | |
|
21 | "capabilities of the IPython notebook; some of them may require additional libraries to be executed.", | |
|
22 | "", | |
|
23 | "**NOTE:** This notebook *must* be run from its own directory, so you must ``cd``", | |
|
24 | "to this directory and then start the notebook, but do *not* use the ``--notebook-dir``", | |
|
25 | "option to run it from another location.", | |
|
26 | "", | |
|
27 | "The first thing you need to know is that you are still controlling the same old IPython you're used to,", | |
|
14 | "# A brief tour of the IPython notebook\n", | |
|
15 | "\n", | |
|
16 | "This document will give you a brief tour of the capabilities of the IPython notebook. \n", | |
|
17 | "You can view its contents by scrolling around, or execute each cell by typing `Shift-Enter`.\n", | |
|
18 | "After you conclude this brief high-level tour, you should read the accompanying notebook \n", | |
|
19 | "titled `01_notebook_introduction`, which takes a more step-by-step approach to the features of the\n", | |
|
20 | "system. \n", | |
|
21 | "\n", | |
|
22 | "The rest of the notebooks in this directory illustrate various other aspects and \n", | |
|
23 | "capabilities of the IPython notebook; some of them may require additional libraries to be executed.\n", | |
|
24 | "\n", | |
|
25 | "**NOTE:** This notebook *must* be run from its own directory, so you must ``cd``\n", | |
|
26 | "to this directory and then start the notebook, but do *not* use the ``--notebook-dir``\n", | |
|
27 | "option to run it from another location.\n", | |
|
28 | "\n", | |
|
29 | "The first thing you need to know is that you are still controlling the same old IPython you're used to,\n", | |
|
28 | 30 | "so things like shell aliases and magic commands still work:" |
|
29 | 31 | ] |
|
30 | 32 | }, |
@@ -35,12 +37,13 b'' | |||
|
35 | 37 | "pwd" |
|
36 | 38 | ], |
|
37 | 39 | "language": "python", |
|
40 | "metadata": {}, | |
|
38 | 41 | "outputs": [ |
|
39 | 42 | { |
|
40 | 43 | "output_type": "pyout", |
|
41 | 44 | "prompt_number": 1, |
|
42 | 45 | "text": [ |
|
43 |
"u'/ |
|
|
46 | "u'/Users/minrk/dev/ip/mine/docs/examples/notebooks'" | |
|
44 | 47 | ] |
|
45 | 48 | } |
|
46 | 49 | ], |
@@ -53,16 +56,18 b'' | |||
|
53 | 56 | "ls" |
|
54 | 57 | ], |
|
55 | 58 | "language": "python", |
|
59 | "metadata": {}, | |
|
56 | 60 | "outputs": [ |
|
57 | 61 | { |
|
58 | 62 | "output_type": "stream", |
|
59 | 63 | "stream": "stdout", |
|
60 | 64 | "text": [ |
|
61 | "00_notebook_tour.ipynb python-logo.svg", | |
|
62 |
"01_notebook_introduction.ipynb |
|
|
63 | "animation.m4v sympy_quantum_computing.ipynb", | |
|
64 | "display_protocol.ipynb trapezoid_rule.ipynb", | |
|
65 | "formatting.ipynb" | |
|
65 | "00_notebook_tour.ipynb callbacks.ipynb python-logo.svg\r\n", | |
|
66 | "01_notebook_introduction.ipynb cython_extension.ipynb rmagic_extension.ipynb\r\n", | |
|
67 | "Animations_and_Progress.ipynb display_protocol.ipynb sympy.ipynb\r\n", | |
|
68 | "Capturing Output.ipynb formatting.ipynb sympy_quantum_computing.ipynb\r\n", | |
|
69 | "Script Magics.ipynb octavemagic_extension.ipynb trapezoid_rule.ipynb\r\n", | |
|
70 | "animation.m4v progbar.ipynb\r\n" | |
|
66 | 71 | ] |
|
67 | 72 | } |
|
68 | 73 | ], |
@@ -72,50 +77,83 b'' | |||
|
72 | 77 | "cell_type": "code", |
|
73 | 78 | "collapsed": false, |
|
74 | 79 | "input": [ |
|
75 | "message = 'The IPython notebook is great!'", | |
|
76 | "# note: the echo command does not run on Windows, it's a unix command.", | |
|
80 | "message = 'The IPython notebook is great!'\n", | |
|
81 | "# note: the echo command does not run on Windows, it's a unix command.\n", | |
|
77 | 82 | "!echo $message" |
|
78 | 83 | ], |
|
79 | 84 | "language": "python", |
|
85 | "metadata": {}, | |
|
80 | 86 | "outputs": [ |
|
81 | 87 | { |
|
82 | 88 | "output_type": "stream", |
|
83 | 89 | "stream": "stdout", |
|
84 | 90 | "text": [ |
|
85 | "The IPython notebook is great!" | |
|
91 | "The IPython notebook is great!\r\n" | |
|
86 | 92 | ] |
|
87 | 93 | } |
|
88 | 94 | ], |
|
89 | 95 | "prompt_number": 3 |
|
90 | 96 | }, |
|
91 | 97 | { |
|
98 | "cell_type": "heading", | |
|
99 | "level": 2, | |
|
100 | "metadata": {}, | |
|
101 | "source": [ | |
|
102 | "Plots with matplotlib" | |
|
103 | ] | |
|
104 | }, | |
|
105 | { | |
|
92 | 106 | "cell_type": "markdown", |
|
107 | "metadata": {}, | |
|
93 | 108 | "source": [ |
|
94 | "Plots with matplotlib: do *not* execute the next below if you do not have matplotlib installed or didn't start up ", | |
|
95 | "this notebook with the `--pylab` option, as the code will not work." | |
|
109 | "IPython adds an 'inline' matplotlib backend,\n", | |
|
110 | "which embeds any matplotlib figures into the notebook." | |
|
96 | 111 | ] |
|
97 | 112 | }, |
|
98 | 113 | { |
|
99 | 114 | "cell_type": "code", |
|
100 | 115 | "collapsed": false, |
|
101 | 116 | "input": [ |
|
102 | "x = linspace(0, 3*pi, 500)", | |
|
103 | "plot(x, sin(x**2))", | |
|
117 | "%pylab inline" | |
|
118 | ], | |
|
119 | "language": "python", | |
|
120 | "metadata": {}, | |
|
121 | "outputs": [ | |
|
122 | { | |
|
123 | "output_type": "stream", | |
|
124 | "stream": "stdout", | |
|
125 | "text": [ | |
|
126 | "\n", | |
|
127 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", | |
|
128 | "For more information, type 'help(pylab)'.\n" | |
|
129 | ] | |
|
130 | } | |
|
131 | ], | |
|
132 | "prompt_number": 4 | |
|
133 | }, | |
|
134 | { | |
|
135 | "cell_type": "code", | |
|
136 | "collapsed": false, | |
|
137 | "input": [ | |
|
138 | "x = linspace(0, 3*pi, 500)\n", | |
|
139 | "plot(x, sin(x**2))\n", | |
|
104 | 140 | "title('A simple chirp');" |
|
105 | 141 | ], |
|
106 | 142 | "language": "python", |
|
143 | "metadata": {}, | |
|
107 | 144 | "outputs": [ |
|
108 | 145 | { |
|
109 | 146 | "output_type": "display_data", |
|
110 | "png": "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\n" | |
|
147 | "png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEICAYAAACzliQjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztfXt0VdWd/+fmwSvhlUDeAcSECREFFWtLi8YKWlBTrS8c\nq1StZVppO21XZ3XNrJnqmqmF6XSpa9EquqYVOlZp+6tCUfHZKK2ltIpohcqjonnwCOQBeSc35/fH\n7s49OTmP/Tzn3GR/1sqCJGc/7s09n/05n+93f3fCsiwLBgYGBgZjAhlRT8DAwMDAIDwY0jcwMDAY\nQzCkb2BgYDCGYEjfwMDAYAzBkL6BgYHBGIIhfQMDA4MxBEP6BmmPJ554AldeeaWWvr/whS/g3//9\n35X2ee+99+K2227z/P2CBQvw+uuvKx3TwIDCkL5B5KipqUFeXh76+vqE2t9666144YUXFM+KIJFI\nIJFIKO/TD3/5y19wySWXKB3TwIDCkL5BpDhy5Ah2796NgoICbNu2LerpuEL1/kWZ/pLJpMKZGIxF\nGNI3iBSbN2/GsmXLcNttt2HTpk2+1z7++OM4++yzMWXKFMydOxc///nPh36+dOnSoesyMjLw8MMP\no7KyElOmTMF//Md/4PDhw/jEJz6BadOmYdWqVejv7wcA1NXVoaysDN///vcxc+ZMnHXWWUP9umH7\n9u1YtGgRpk+fjk9+8pN49913Pa997733sHz5cuTn56OoqAjf//73ARCl39fXh9WrV2PKlClYsGAB\n3nzzzaF2c+bMwauvvgqAWEE33HADbrvtNkydOhWPP/740M9WrVqFKVOm4MILL8Q777wT8E4bGBAY\n0jeIFJs3b8bNN9+Mm266CS+88AJOnDjhel1nZye+/vWvY8eOHTh9+jT+8Ic/YNGiRZ79vvjii9iz\nZw927dqF9evX4+6778aTTz6Jjz76CO+++y6efPLJoWuPHz+OU6dOoampCZs2bcKXvvQlHDx4cESf\ne/bswV133YXHHnsMLS0tWLNmDWpra11tqTNnzmDZsmVYuXIljh49ikOHDuHyyy8HQJT+tm3bcMst\nt6C9vR21tbVYu3btUFun/bNt2zbceOONaG9vx6233jr0s5tuugmtra34x3/8R1x77bUYGBjweacN\nDAgM6RtEht/97ndobGxEbW0tKisrUV1d7auyMzIy8O6776K7uxuFhYWorq72vPZf/uVfkJubi+rq\napx77rlYsWIF5syZgylTpmDFihXYs2fPsOv/8z//E9nZ2bjkkktw1VVXYcuWLUO/oyT86KOPYs2a\nNbjooouQSCRw++23Y/z48di1a9eI8bdv346SkhJ84xvfwLhx45Cbm4uPfexjQ79funQpPvOZzyCR\nSODzn/889u7d6/lalixZgtraWgDAhAkTAACLFy/G5z73OWRmZuKb3/wmenp6XOdhYOCEIX2DyLBp\n0yZcccUVmDx5MgDgxhtv9LR4cnJysGXLFjzyyCMoKSnB1Vdfjffff9+z78LCwqH/T5w4cdj3EyZM\nQEdHx9D306dPx8SJE4e+nz17No4ePTqizw8//BA//OEPMX369KGvhoYG12vr6+sxd+5cpvlNmjQJ\nPT09GBwcdL22rKzM92eJRAJlZWWu8zAwcMKQvkEk6O7uxi9+8Qu8+uqrKC4uRnFxMX74wx9i7969\nnv70FVdcgRdffBHHjh1DVVUV7r77bqGxnfZJa2srurq6hr7/8MMPUVJSMqLdrFmz8G//9m9obW0d\n+uro6MDNN9/seu3f/vY3pvF55wuQRYVicHAQDQ0NrnM2MHDCkL5BJHjmmWeQlZWF/fv3Y+/evdi7\ndy/279+PpUuXYvPmzSOuP3HiBLZu3YrOzk5kZ2cjJycHmZmZzOPZM2bcsme++93vor+/Hzt37sSz\nzz6LG2+8cehaev3dd9+NRx55BLt374ZlWejs7MSzzz477KmB4uqrr8bRo0fx0EMPobe3F2fOnMHu\n3bs9x+fFm2++iaeffhoDAwN48MEHMWHCBHz84x+X7tdg9MOQvkEk2Lx5M+68806UlZWhoKAABQUF\nKCwsxNq1a/Hzn/98hNUxODiIBx54AKWlpcjPz8fOnTvx8MMPAxiZS++mjJ2/t39fVFSE6dOno6Sk\nBLfddhs2btyIefPmjbj2wgsvxGOPPYa1a9ciLy8PlZWVrgsUAOTm5uKll17Cb37zGxQXF2PevHmo\nq6tzHd9rzn7Xfvazn8WWLVuQl5eHJ554Ar/+9a+5FkGDsYuEOUTFYCyjrq4Ot9122zC7JO647777\ncOjQIfzsZz+LeioGaQgppX/nnXeisLAQ5557ruc1X/va11BZWYmFCxeOyJgwMDDgh9FpBjKQIv07\n7rgDO3bs8Pz9c889h0OHDuHgwYN49NFH8eUvf1lmOAMDLVBdZkE3dJSGMBg7kLZ3jhw5gmuuucZ1\nZ+I//dM/4bLLLhvKbqiqqsJrr702LF3NwMDAwCA8aA3kNjY2ory8fOj7srIyNDQ06BzSwMDAwMAH\nWboHcD5I+GUpGBgYGBjwg8ew0ar0S0tLh2VFNDQ0oLS01PN6mhMdp68f/MDC0qUW+vpSP/vmNy3c\nequ+Mb/73e9qfU0tLRZycy10dFgoLrZw6FD47+tVV1lYv97C7Nn63ouDBy2UlFiYNYv8X9Xcf/1r\nC+PHW7jsMvm+kkkLU6ZYyMmx0Nkp/l78939bACz8+Mdi83jzTdJ+9Wr+tq2tpO2XvsTfFrAwYwZf\nmy1bLADfxV//yt7m+uvJWKzXb9xIrt+xg+36f/1XCxUV6j5jfO8hH7SSfm1t7VAe865duzBt2rS0\n8vObm4F164Cf/ATIzk79/L77gFdeAXwKLMYar7wCfOpTQE4OcOmlwM6d4c9h717g+uuB1lbg1Ck9\nY+zZA1x8MTB/PvDXv6rr99Ah4JprgH371PSVlwcUFgJNTeL9NDYCRUWkP9H2gNjfgjq2b7/N147W\nh8vN5Wu3fz/5l+f9GjeO/Hv6NNv19DrW65ubgfp6wKOSRqwgRfq33HILlixZgvfffx/l5eX4yU9+\ngo0bN2Ljxo0AgJUrV2Lu3LmoqKjAmjVr8OMf/1jJpMPC974HrFoFVFQM/3luLnDPPcCDD0YzL1m8\n8QZAz+j41KeA3/0u3PFbWoD2duCss4BFiwg560B9PTBrFlBVpZb0Dx8mi2VXF3ktMmhqInMsKACO\nHxfv5+RJ4BOfAFyKgzKhsRGorhYj/fp6oLwcaGvja9feDmRlkbnz4MABICMjtVCxoLmZ/OtTrmkY\nzpwZ/i9L/729qXHiDClP316e1gsbNmyQGSIynDoFPP64N1ncdRe5SX70I+DvhQ+VoaamRm2HDrzz\nDvCtb5H/X3gh8NOfah1uBPbtI+9dRgYwbx4h0WXL3K+VeS8oGU2cyK9C/XD4MHDttUBZGSHtvDzx\nvk6eBGbMIKrXo6r0EPzei+ZmYOlS4P/9P7F5NDYC550H2Mr6M6O+HliwAHjrLb52bW3k79PQAPT0\nsN9Hra1AWVkNl9I/fpwsrK2tbNeLKP1EAvjoI/LUFmeYMgweePxx8ghfVOT+++JiYOFC4MUX1Y+t\nk/Qti1grtBQ9tT7CfCz96CNg9mzy/1mzyPdekCX9WbOAkhLg2DHhbkagqQkoLSVkzatSnaCkX1go\nR/onTwKVlUQ9i6CpiXyeRZT+0aPkc8Sr9NvagOnT+d/Hzk7g/PP5Sf+ss0hbFpw5QxYJHqU/a5b8\n5yEMGNJ3weAg8PDDxMLxw003Ab/4RThzUgVqIdDFbOpUYMqUlC8bBigZA0Tp6aqA8NFHpP/CQjnr\nxIlTp4D8fGDmTHWkX1AQTPp+aG4mNqQo6Tc3pxYN3rNYzpwh7/HgILE4WNHWBkybxv8+dnSQpyzW\n15pMEhtu9mx20j99mozBo/RnzQK6u9mujxKG9F3w+uskyHnxxf7Xfe5zwPbtgOB53pHg4EFiqdgz\nZKuqUsGxMEBtFyBY6cugoYHcuLKEaodlEQLJz1er9GXmaFmEdM4+mxChQEIHOjoIAU+bxm6B2NtO\nnkwEBM+i095Oxpsxg88L7+gg75etGrYvurqA8ePJ/HiUfmkpm9K3LLKAlZYa0k9bPPkkcOutw4nR\nDUVF5Eb705/CmZcKHDpE5mxHRQXgUfpdC8IgfcsihFpQwGadsOLMGZIJMn48P1m5wU76ok8jlPym\nTiXzYiU2O86cIQkKM2bwWzwdHaTt1Kl8Fk9bG2kzfTpfu44O8nTASvrd3cCkSUTI8Sj90lI2pd/b\nSz4TOTmG9NMSfX0kGLZqFdv1NTXA3yvmpgUOHRqZjTR7NvDhh+HNgdouALmxGhvF1KkfTp8mgUF6\nM1oWIQtZUGsHUGvv5OeLp67SOSUSRDnzeusAIf3Jk0lQWoT0J08mY/MofWrvTJrER5adnWSRZCXw\n7m4SzOchfR6lT4PQEyca0k9LvPQSsTuo5xyEdCP9w4ejJ/1jx0ggHCA3yrhx7N4pK+zknEioU/vU\n2gHU2Tv5+YQ0WYOGTnR0kLgMwG+x2PuYPJmPGCnoUwLv2JT0J05kV+108eaxd0RIn0fpG9JPc2zd\nSjYNsWLpUmDXLr4AVpT44ANgzpzhP5szJzzSHxwkRDdzZupnM2eqz2+2kz4gnwdv75emaKqY9+nT\nhPhkSZ9ucOJV2xRU6YuQvqy9M2kSO4H39pLc/qlT+Tx9nUq/u9uQftpicJAEZq+5hr3NtGkkMJou\nvr49c4YiTKXf1kZuPrpDEgiH9PPy+AOUQf1OnSr/hELJVhXp8xIvkFLPubnypM+z4HR1kfF4SL+j\ng78Nr6dvWeTvWlJilP6ox5495DHZaX8E4eMfTw/S7+sjKptaKxQlJcT64E3VE8GJE0R12xEG6Yt6\n3U60tKSU/pQpakg/N5f0FZXS7+4mi3BWFiFGVjJ1jp+by7dgUNuFl/Rzc/lJn2ec/n7yb14e2+sx\npJ/G2L4duPpq/nYXXii2kzFsNDWRjCPnUaqZmcSfVpnL7oXm5uHWDqA2pZKCeuUUqkj/9GmiaAGi\nzmVIf3CQkERODiGyjg7xdEsZpU+fNgBCjKJKn5f0qC3CE8jt7EyRPus8ee2d3l6SBTV+PJtt29ND\n+jekn4b4zW/4rB2KdCF9e6qkE8XFZGelbkSp9EU3Ltlx+nSKIGXUOUAIaNIkUo4iK0s+3RIg//Iq\ndXt7GXtHhPTDUvo89o4I6Ruln4ZoaiK56kuW8LetriZpiDIEEAbq68lmJTeUlIRD+m5Kf+ZM9Uq/\ntZXkf1OoUvp2VUzVuWgJC3tfgPgiYlf6PGRob0/nwUv6fX1kx+v48fykZ1fIvJ4+jQlRK8YPvNk7\nPT2G9McEXnwRWL58eAllVmRnk4JTKot66YA9VdKJ4mK50r6saG4mVpIdeXny1SqdaG9P2TCAmO3h\nhjNnUumRmZnkRhdR57Qve1lh0WCuk/RFUi5FSb+zk7RNJMJR+p2dZI4Aezte0u/tJSSelUUW9GQy\nuH9D+mmIl1/2rvTIgnSweI4f9y8gF4bSb2sbWZWSd0cmC+zeO6BH6QNyFo+zL9EYgazSd9o7PO2p\n8gbCIX17NU7WdqKefiLBpvaN0k9DWBY5WESG9BctIiWL44xjx7zLvoZJ+tOmDf/Z9Olq0intaG9P\nKXJAbSBXBVEDw20V2lcU9g5NnaTteZR+VxdpA4RD+pSQeeZKPX1Wu8Y+hiH9UYp9+8iH4qyzxPuo\nrlZzkpJOHD/uTfoqSgqwICzS16n07YuJTNpmXDx9u3rmtXfsbWVIn7Wdk/R57B1R0u/p8b/eZO+k\nIV5+Gbj8crk+KOmrriGjEseOeds7KkoKsCDdlb5Oeyc3NxrSp6QIhEv6tK2MvcOq9Gm5D5aKuHbS\nnzDBKP1RCVk/HyA+dU4O3xFuYcNP6Y820ncqfRUbqWi/quwdZyCXt/AYhd1XTyfSp+PyZO/wEjKQ\nsqB4s3EAY++MSvT3k4PBP/1p+b7ibPEkk6lSw24Ii/RbW0eSfm4uubFUnkvgzN6h6ZWycNo7sp6+\nk/R5CRsY6cmnA+lblrynz6rc7Uq/vz84xZbX06fZOxMmBFtBccCYJ/033yQFx5xphCKorgbee0++\nHx04dYqQoFdKan4+SZvUfWyim9KXKQnshp4eQir0xgVSZCbz+uw1aih4Sw/YYSdrQJz07aQtkrIp\nkhFjb0vH5iH9/n6S8pqZKW7v8Cr3RIJ8/oNy+0UDuXRRiTvGPOm//jpwySVq+oqz0vezdgByM+Tk\nqNm16oXBwdRpSU6otHiotWM/BIfm1IuQKkVnJyGBrKzUz0SJGkhlldj7ErEHnKQvo/R51aqo0reP\nyUreAD8hA+RpgKeNCOlPnEjuoaAnj8HBcM+jdsOYJ/2dO0l5ZBWIO+l7BXEpdFs8HR2ElOykSaGS\n9J1BXAqZSpbASGUOiJUtsPdHiQ+QU/r27BtZ0ucpE66C9KlNw5IEIWLv0JOtAH2kz6r0d+4kZ3BE\niTFN+oODwO9/r470580jZ9DGEX45+hS6Sd/N2qGQJWQ7nL47hayvb89Jp5BR+s7+RJ9EZJW+nbjD\nUvr2dhkZbCoZSO2WBfiUPiV9loWC10Kii0pWFqlU67d49feL7fpXiTFN+u+9R7zsIAXMiqIicsPp\ntEhEEQel70f6ssXL7HD67hSyC4vTjgHklb4Ke8fuq6ejvQMQ0mT15+Nm71AiTyQI8fup/YEBQ/qR\nYudOdX4+QP7oFRXkSMK4YSwpfXt9Fjt0KX1R0nfz9GWVPrVneHxje/usLKJUWc9WcCN9FpvGSfrj\nx/Pn0LO2sSt9EdIPWgTt6j3oSaK/393eDBNjnvRVWTsUFRXk8PG4wa2ksRNRk76qc3K9SF+Fp28n\nKkDMQ/fqT4T0k0lC0JTUaOEz3gwcStwAn9q3t83MZLdpnGOK7JZlfTpwevpB8+PdC2BX70G+vlH6\nEcKySObOWCF957m0btBN+m45+hTpqvRV2zui1ow9U4knG8beBwUP6duDyDxj2y0XnnYiKZtOT1+H\nvUPVe9CiZ5R+hPjgA0L8c+eq7TeupO88VMQNYSh9e417O1SSvi5PX3Ug12nviOzodBI2wJ+B40b6\nrO1lFLv9nGRdxdAAfnuHd2HhsXeM0o8Q1NqxKyQVMKTvjbACubqUvo5Arqy940b6LD60Xx+i9g7A\nnkZpJ2JA3N4R8fR57B2WedmJPGjzl1H6EUKHnw8Y0vdD1IHcuCl9lfaOHbz2jipPn2dsO7EC7AQu\nau/wxAFk7B2j9GMMXaRfUkLITUWdF1UYGCBBUi/CpYia9HUHcmVUOeAdyFWZvSNi79hJF5D39Hme\nFOzpojxjq1D6IlaSzpRNwGTvxBbHj5NslgUL1PedkQHMng18+KH6vkXR2krKEmRm+l+n4wQrO8JS\n+l6evowqB+IZyHWSLqDG0w9b6YuSvo6UTR4SB/jsHaP0I8LOncAnPxlMgqKYMydepH/qFFtBualT\nyQKh60yAtrbhlS/tCMPe0UH6svaOnWxFzttV4em72TuigVzWNEoZpU/HExmLhcTtpM9SoI3H3jFK\nPyLosnYoZs8GjhzR1z8vWPx8gNxMmZn6aoJ7lUcAwgnkypK+VyC3q4t/oaREYld9lGx5+lLh6TtV\nN6/Sdyp23k1WtJ2OHbmWNZzEeZV+dnbwRjWTvZMG0E36c+akJ+kDakscO+E8NMQO1Upfl73jJFha\nHpj3LAC3BSQjI3gbv1s/MqRvWXKkb1fePGOH5enTcWiWHm82Dsvfw2TvxBynTwMHDgCLF+sbI26e\nPg/p6/T1nccD2qEykGs/ScoOHfYOQEiX9/AMtwAsIO/HA3ykPzBAFhu71clL+nby5tklK5K909/P\nZ9U4FxdWe8e+2UqlvWOUfgR44w1C+PYPgmrETemfPBkPpd/R4U/6HR1q4gl+9o6MdeVF+hMm8Pfr\n9MIpZP14Oh8e0raTL+8cRBW7TDseq0ZkHBFP32TvxBi6rR0gfQO5gD7Styxv2wUgN8K4cXJKnCJM\nTx8QOybPjWxF+nKWMwDEDyURmYNbOQVdnr6IPx8G6TvtHaP0YwaVJ2V5obCQEGdcDkmOg6dPT53y\ny5hSFczV6emrsne8SF8kCOt8alVB+jztw1L6ySSxojIyUm147R0REue1d4ynHyP09AB79gCf+ITe\ncTIygFmz4qP240D6ftYOhapgrk5P3+mfA2L2jiql72XPRKX0RT19XgXOOpZzHF4SpwejsM7LePox\nw5/+BMyf720xqESc0jbjQPp+QVwKFcFcaiPFPZDr5+nzKH2nkgXC9fRVKX3e/HnWsUSUvk57xyj9\nkBGGn08xaxZQXx/OWEFIJ9KXVfq9veSmcruxdJH+aFP6LGe9UoTp6dszdwC22v1hkD6PvWOUfsgI\nk/TLyoDGxnDGCsKpU0BeHtu1Ou2doCcsFZ6+X7CY52QnN4QRyBVR+jpIP46evj1zh84ziJB1kz49\nZcxk78QQySTwhz8An/pUOOOVlgINDeGMFQS/OvZOpLvS97J2ABJr4U2JtCOMQK6I0lcdyGXNmR8c\nHKlcw/T0WQjc+f6w2jWsefrJJElOoJu/TPZOjPDOO0BxcfDpUaoQF6Xf20s+mG4BSDekO+l7BXEp\nVNbKoVCdpy9TQoHOR8bT590oJXJql6wCZ20jO05QINep3E32TowQprUDENKPg9JvbydEznpYzPTp\npOiaaoQVyPWzdwBx0h8cHFlygCLqPH3VSp/Hl3cbW6RtWKTPm43DUlbB+aQz6pX+jh07UFVVhcrK\nSqxfv37E7+vq6jB16lScf/75OP/88/Ff//VfskMKIWzSj4u941fO2A1Revq5uXL17gF/ewcQJ31a\nNiHD5Y4ROeZQZZ6+Dk+ftWSxaDzALdWTN3tH10LBQ/p2K4heH3dPX2r4ZDKJtWvX4uWXX0ZpaSku\nuugi1NbWYv78+cOuu/TSS7Ft2zapicrAsgjp/8//hDdmXh5RbEEkpBtxIX0WpZ+TAzQ3y42jk/Td\n/HxATOk7q1OK9qUrkCuj9HkPNgHYyTiMpwPeAmrO/v2eJNJe6e/evRsVFRWYM2cOsrOzsWrVKmzd\nunXEdZauAu2MOHSIfFhmzw5vzEQiHr6+Xw17N0ydStqo/pOxkr6s0tfl6XsFcQHxQK4Kq8iNeMPy\n9GUWHGdbVqvGTph0d3cy6d1GVOmzBnKd/QdV5YyD0pci/cbGRpSXlw99X1ZWhkYHyyUSCbzxxhtY\nuHAhVq5ciX379skMKYSwrR2KOFg8vEp/3Dh1NXDsYNmRq4L0dXn6XkFcQG2efjrZOyqVPkv6pZNg\nAf6TqlhSMHkCuW72Ttzz9KXWnARDdPCCCy5AfX09Jk2ahOeffx7XXnstDhw44HrtvffeO/T/mpoa\n1NTUyExvCK+/Hg3px0Hp00AuD6ZNI8FclbaUXy19ikmT4uvp+yn9CRP4g9+qlL6OQC6P0neOzbqx\nyy2rhtfTp+36+93fS9qGh5Sd9X1ElD5Pto8I6urqUFdXJ9xeavjS0lLU27ad1tfXo6ysbNg1k23y\nbsWKFfjKV76ClpYW5LnsFrKTvkrs3Al8+9tauvZFHDJ4eJU+oPYUKwpWe0f2CcOPnIH42Ds9Pe62\n2/jx5KmIFbqUvohFQ9uypnvKBmVZ2vGOw/tkINu/CJyC+L777uNqL2XvLF68GAcPHsSRI0fQ19eH\nLVu2oLa2dtg1x48fH/L0d+/eDcuyXAlfF5qaCPE5YsuhIB3tHYCQvqoDTSjCsnf8bBhAXyBXxN5R\n5elHlafvZu+wKHbAvfZOHEif98nAzd7RrfRlITV8VlYWNmzYgCuvvBLJZBJ33XUX5s+fj40bNwIA\n1qxZg1/96ld4+OGHkZWVhUmTJuGpp55SMnFW7NxJduG6pdrpRlkZ8Mor4Y9rR1sbUFLC10YH6YcV\nyO3u9j87YOJE9Z5+lKWVo7Z3ROv2uJExi73jtsioJn2Z64MCuWnv6QPEslmxYsWwn61Zs2bo//fc\ncw/uuece2WGEEVUQF4iPvcOTvQOoPa+WgsXTV0X6upR+GIHcKAquOf8uMpuzdNo7zuwdlnYinjtP\nCqbI9VEr/VG/IzdK0jf2TgphKn0dpO9VNgFQm6cfdsE1r2CsjNIXsXdEPX2WAme6lbudxNNB6Y9q\n0m9tBT74ALjggmjGLywEWlrYbgJdEMneUXlIOQWLpy9b+hiIhvTTOU9fhrhlPH3e8gVubeh4KgOz\nbiSeTHrvW5GNGUSBUU36r70GLFkS3cqamQkUFQFHj0YzPhCP7B3LYivDEOdAbpDSV5mnH6a9I6v0\nRdpaFiFSnoApIB7I5RnHOUYi4a/eee0jo/Q147e/BS67LNo5RG3xxMHe6enxPtjEjokTU1VBReGX\nZQPES+l7efphBnJ12Dus5G3f5hOXlE3eMXg3Zxmlrxmvvho96RcXA8eORTe+COmrtndY6w8lEvIW\nT1SevkhpZV1KPzubLJwsi6cs6fN67DLtosjeoW281PuYq70TZzQ3k+MKo/LzKYqLo7N3+vsJgfDu\nrFVt7/AUnZPdoJUugVw/T59VpSeTpOSzUzkmEuJ17QG+zVkinr6IYqfjhb05C+C3d4zSjwh1dSRr\nJ+o3uKgoOqXf3k7SNVlr6VNEpfQB+VIM6RTIlVX6lHTd/r4ypE/V6uCgf1s35a1LsdN2YW/OCmrD\nuznLKH2NiIO1A0QbyBXJ3AH0KP2gIC6FbDBXVyDXS5kD6vP0ZTZWUciQfiIhrrxZz60VaRdHT98o\n/Rjht78FPv3pqGcRracv4ucD6gO5vPaOTqUvYsUA6pW+33GJvErfDTKkT9uzePOiSt+LWP1KeqtI\n2aTZNawpmEFjGE8/JmhqIp7+eedFPZNo7R1R0o/S3lFB+n7ZOyKnXAH+pE9vdJ6sI91Kn3Vx8yJ9\n3eTt9nSRmRm8m1UkkGtX1rSCptffyo2UeewdP6VPU1XpOQBRYVSS/m9/C1x6aTT1dpyIMpAro/RH\nayBXB+knEmrKJwB8Sl+XvQOwZ+G4kXeQxeFm79AxVVovIm3c7Be/3Hse+4guELwxNtWIAS2qxyuv\nxMPaAYAvVw5GAAAgAElEQVSCAuDkSbncc1GI1N0B0jeQm0y6547bIWPvBC0mPP36HZcok2NPEQbp\nuylv2paXiIHgzB8V2TtBbXTaO3Hw84FRSPqWBbzwAnDllVHPhCA7m6jtkyfDH1tU6U+aRAjD71Gb\nB2HZO1SN+ykpHUof4Avm0tOZ/GrvsBxXGQel76XYg+rhuI2pmsBF2shuzuJJ74wKo470//IXcgNW\nVEQ9kxSi8vVFs3cSCbUWT9C5tXbIkH6QtQPoJX2eAKxzRypFRgYhDtEdsbzzESVuwF/p8yp2QJzA\neQquBY2jU+k7F4ioMOpIn6r8qH0zO6Ly9UWVPqDW4gnL0w8K4gKp3aq8TzFBpM+zmPgpdIDd4nEr\neEahQukHtfcjb14ipmPytlMdB3AjZlUpm0bpa8KOHfGxdiiiUvoypK8ybTMse4dF6ScSalMsKXiU\nvpefT8EazI3a3pHx9EXtHd7sHd5sHDdi9gvk8mzOMkpfAzo7gT/+MT5BXIqoNmjJkr4qeycs0g/a\nmEWhg/R5+vTb6AWwK/2gQC5rieOwPX3V9o7KHbY6N2cZpa8BdXXAhRcG120PG1Ft0BLN3gGis3dk\nsndYlD4gXiBNVSA3yN5RofRlyiPTOejy9EXtHVXZOzwpmEFjuJG+1+Yvo/Q14IUXgM98JupZjIRR\n+vGxdwCxYC4L6avYVMXTl18gV6ZoGm0vqvRZPP24Zu/Ibs7y2/xllL4GxNHPB6JT+qLZO8DoDeQC\n4scb+pE+z6YqlZ6+jL0zOOitPtMpe0f35ixVdpBR+opx6BAhqYULo57JSKSr0h+NgVyAX+lbFps6\nV+nph2HvUNJ2y3ST9fRFNmfFZUeu2/W8dpDb9UbpK8bWrUBtbTxKLzgRhdJPJgl5isY3orR3RJU+\nTyCXh/T9ShhTqLR3ZDNvAPaUS7/2ImUYWNr62Tu87cIgfb/grJt697reKH3F2LoV+Oxno56FOyZP\nJiTc0RHemKdPk3FFF8EoA7ky9g5rIJe3ZIKfMgfU1cwB+A4ml1H6sqSvspwCbada6Yt49LqeDIzS\nV4iTJ4G9e4HLL496Ju5IJMLP1ZfJ3AGis3fCIH1epc9C+qrz9GUDuaKlkSl0K30Re0c0e4fXo+c9\nRIX1ySAOZZWBUUL627cDy5YF35hRorAQOHEivPFk/HyAKP0o7B3ZlE2WQK4u0uexd4KCwrI7clXY\nO0HtdWzOUllSQaSNzsCvKbimEFu3AtdeG/Us/FFQEC7py2TuAOqUvmXFT+nH3d7hIf0o7Z102Zyl\nKzDrdb3XPgCj9BWhs5McjbhyZdQz8UdBAXD8eHjjySp9VaTf10cOjWD9sMuQvq5Armp7R2UgV5e9\nE8XmrLAKrvHumg0K5LIuREbpK8JvfgMsWQLk50c9E3+MVXuHp8ImkCLPoEO53RCl0uexd1R5+rrt\nnbA3Z4lk/fhZSbSEte6Ca27XG6WvEU89BaxaFfUsghG2vRMXpc9j7QAk20ikNg4QbSCX197x6491\nN23U9o6opx+WvZNMpnbIsrbRmeJplL4CtLWRoxHj7ucD0dg7Mtk7qpQ+L+kD4hZP1IFclfaOTN0c\n1j6i8vRV2zs81ktQG1VlG4zS14SnnyYVNWXILSykm70TldIHxEmf1dMfTfaOTO0dL9Km7aMouKYy\nZdNLWavekcu6OcsofQV48knglluingUb0i17Z/x44quzEpkXRElfJG0znewd3YHcKLN3WDZnhZGy\nKfJEwbPD1m9ORulrQH098Oc/A1dfHfVM2JBu2TuJhBqLJ2x7J12yd3Tn6eu2d5JJEijNzORvK0LG\nlkXGlC2GJtJG1eYso/Ql8dOfkgAui4cbB+TlEbvE7/FVJWRJHxi9pB+1vROXPH0ve4a295sDJUev\nYm2qC655jRc16fNszjJKXwLJJPC//wt88YtRz4QdmZkkrfTkyXDGU0X6svWC4kj6Uds7KsswRJWy\nqaOtn72jisABvYeo0Ou9au8YpS+IV14BZswALrgg6pnwIUyLRzZ7B0g/pd/VlT5lGHQXXNO9Ocuv\neJiIN0/b6VbtQW1UFGgztXc04LHH0kvlU4QZzE1ne0e0vHLU9k7Ynn6UgVyZtiL2jkhuv2jKplsg\nlyd7xyh9xfjgA1J24dZbo54JP8JK2xwcJGQ9ZYpcP+mm9NPF3lHp6Udl7wTFA4JSL8Oyd1SlbKrY\nnGWUviAeeICofFlCiwJh2TsdHYQ4ZVVFbm50pK8zZTPqQG4Yefoqsnf85iCT4x9ne0fn5qy4KP0Y\nTIEdp04B//d/wF/+EvVMxBCWvaPC2gHSS+kPDJAvLxKzQ0Tp+5E0EF3BNR318Gn7oAwc1fZOEBnz\nHqYeVfaOn9LPzXXvJ0ykldJ/+GFyOlZJSdQzEUNY9s5YJH1agsHvSEMKEdIPeoJQWXsnzB25Mp6+\naCBX5PAVvziASktIpOBaulXZjMEU2NDWBjz0ELBzZ9QzEUdY9o6KzB0gWtJvaeFrw2rtAPrq6ff2\nkk1EQQtPnLJ3vF6XTk8/3ewdv0CuV/aO2ZGrAD/4ATn4vKoq6pmIYyzaO7yllQFxpc9K+joCuVlZ\nhOy9yMHZXzrYO6JKX4e9I5K9o9vesSy+JwOj9Dlw5AjwyCPAnj1Rz0QOYZG+bN0dClVKn9fH1E36\nEyaQ61lUOcBG+rTfnp5gNafC07cs/34yM0kWVzLpXioB0Ju9I2rviGy0oiUhnH9LL2WtanPWwAB5\nb912CRulL4mvfx34xjeAWbOinokcqL1jWXrHiZPSDytPn4f0s7LIzcpaEoOH9Fm9eFlPn9aK9yL0\nRCLY4onK0/dT4H7+vNtcEwn+Wjcinj4PiZvaO5LYsgV4/33g29+OeibymDSJfHBVlCz2gyrSjzJl\nk5f0WXfjUvBYPCzZOwB7MFeF0vfL0aeQ2WDFQtxhZ+/4LTJeJKvK0+ddVIzSF8SRI8BXvwo88QTb\nTZcOCMPiSXelL5Knz6P0Ab7TuXjtHZb+VJB+0D3Bkmuvy9MXSfcUsXcA/aTvl3c/JpX+jh07UFVV\nhcrKSqxfv971mq997WuorKzEwoULsYfRmG9vB665BvjXfwUuvFB2lvFBYaH+DB6V2TvpUnCNl/Sp\nr88ClfZOkBcPyAdhWfuRCcbqWDBEduTSdlEofd4yD6NC6SeTSaxduxY7duzAvn378OSTT2L//v3D\nrnnuuedw6NAhHDx4EI8++ii+/OUvB/bb2krq5NfUED9/NMEo/WCEQfq89g4L6bPYOzT45+XF035U\nKH0ZT58Sl1f8KeyCa0ExBBWkz1uz30u5ewWKR4XS3717NyoqKjBnzhxkZ2dj1apV2Lp167Brtm3b\nhtWrVwMALr74YrS1teG4j9T905+AT34SWLwYePBBtuyKdEIYpB+X7B1647PskrVD1NPnVfpR2Dss\nZJ2dTchncND7Gr9iaxQy9k5Ghn+Wi47Mn6iVPm82jkj/aa/0GxsbUV5ePvR9WVkZGhsbA69paGhw\n7a+2NmXpPPCAvxpKV4Rl76gkfdFsIxGVD8jtyGUFj9IPyrahYLF3WILCiUQwYasI5PoFY4Pai27O\n8sptD2rnNx4vyfIuEiL2TpyVvtQUEowy3HKwhle7jIx7ceedwKFDQF1dDWpqamSmF0sUFAB//ave\nMVSR/rhxRPGxkp4TYZN+Otg7LEqf9tXb6/2adNs7QIr03f6GovEASnxuFKAje4fXflFB4rqrbNbV\n1aGurk64vRTpl5aWor6+fuj7+vp6lJWV+V7T0NCA0tJS1/6eeeZememkBQoKgNde0zuGKtIHUmmb\nUZA+6+YpQCyQy2LvWBZ7yiarvcO6gIhaMxQy9g5tL6r0RdpFnbIpkncfhdKvqRkuiO+77z6u9lL2\nzuLFi3Hw4EEcOXIEfX192LJlC2pra4ddU1tbi82bNwMAdu3ahWnTpqGwsFBm2LRGQQHQ3Kyvf8si\nnr6K7B1AztcXJf3MTHLjsJYqBvQpfXpjZzDcKarsHSDYmmFN2VSh9L3aigRyRQKyQDikryrvPu71\n9KXWnaysLGzYsAFXXnklkskk7rrrLsyfPx8bN24EAKxZswYrV67Ec889h4qKCuTk5OCnP/2pkomn\nK3QHcjs7yc2q6sMlk7YpSvpASu2zPmF0dQHTp7P3z0r6rNYOoMfe8QJLIFeVveMGP8VOg6FuJSD8\nyFvk5CxALemryLsf9bV3VqxYgRUrVgz72Zo1a4Z9v2HDBtlhRg10k76qzB2KKJQ+kCL9vDy263XZ\nO6zKnLVPVaTPGsjVZe/4kbC9rfNvIprqKar03RZs3mwcWsdocHD4E5/fImF25BoMIS+PEDNr3Rde\nqPTzATnSF6mwScEbzNVl7/AofRZ7R5WnH7W9I5r5w7I3gHc8lcrd7Xpa38dJ5CLZQXFQ+ob0Q0Zm\nJpCfD5w8qaf/OJG+CqXPCl1lGFTbOzx1fOJs7wQpfS/VHmQLAcQWcmsXRiDXi5Td2pjaOwbM0Gnx\njFXSF9mcpUPpx83eiVLpuxEry2LBQ+AibUTHcBL5mK29Y8CPdCJ9mUqbYSt9HZuzdNg7qkhf545c\n2l7W03dC1BaKmvTdiJx3c5ZR+mMYuklfVbomEF32Tk4OX6VNnYFc1dk7LP3JqnQ6nzh6+iJKX3X2\nDk8g16sN7+Yso/THMHSS/mjL3mFFXAK5YXn6UQdydXj6tJ1ueyczM3Xalh1+StyNyHkXFaP0xzDS\nyd6RJX3eoxIp4kL6PCUowrR3ZAuuDQ76By5pe9X2joynryp7x+u0LT8l7jaGOTnLgBljhfQ7OsIj\nfd6Ts6K0d8IK5PrZO5RE/cpcBOXNB50JwEvedEzdSt+rTZCnz2rvjOoqmwZiGCukPxbtnXTJ0w9S\n3CztdXj6YQRyvdqouj7uVTYN6UcAnfV34kT6YSp9naSvckeuyjx9mR25sidvBbX38/SjTtmkbVg3\nW/FeH/faO4b0I0A6Ze/k5kZbe4cFlpVe2TthFVzzs3d0k77IjlwgnOwdgN/T57nebYFwK+MQFWIw\nhbGHsZK9I6v0WVM26c3Io6LSPU+fNZArmnJJ2/sVQBPZnBUnpc9r78hszqIqPw4nARrSjwC5uSRl\njCcPnRVxsndk8/RZlT7vxixATxmGMOvpyxZci6vSFwkAhxXIldmcFRc/HzCkHwkSCT2+vmXp2ZwV\nd0+f19oB9JRhCLP2ThzsHdUBWUAsFhBlIJd1c1bQ6w4ThvQjwsyZ6i2e7m7iGYqccuUFmXNyw/L0\nRUh/NNg7OpW6bHsv8hb19MMK5Pp5+qz2jldOv1H6Yxw6fP22Nr6DRFiQnU0+rCxWiB2WFW/Sj3sg\nV3ftnTDsnTA9fd6nA141zrs5i3WBiAKG9COCDtJvbVXr51OIWDw9PakFQwQ8pM+7MQuItgyDito7\nKvL0ZUhfpnBaHLJ3VAVyWTdnGaVvkDZKHxBL25Tx84FwlH5vL0mj80M62ztxTdlMx81ZPE8GVOnb\nLVGj9A1GvdKPO+knEsHECvDV3jH2Tgo6Cq7pzt5RtTkrI4N82Q+DMUrfIK2Uvgjpy/j5AF+evgjp\nA2wWD8+OXOpj+z09qErZlM3Tj6vSDyuQy1NLh17PW6DN3r9R+gZG6QeAJ0+f99QsClbSZ1X6iUSw\nxaMyZTPu9s5oKrjGszkLGLlIGKVvYJR+AHjtHd5ALqA28EoRZPGMBntHpixzXJS+zs1Zbv0bpW9g\nlH4A6A3iVQbADt32Dg/pBy0kqmrvRJmnT9W6SFlmmawfXtLnzfjhIXE6J9a8fqP0DTBzJtmRG5Q9\nwgOdSp83e0dW6QPsal+U9HUo/SB7J8zSyrrsHZmyzDLHJfIEci1LLYnz2jtG6RuMwPjxhBTb2tT1\nqUvpixyOLqv0Af2kr0PpB9k7YR+XqMPeYW0bpac/MECORfSqasm7gUrE3nEqfUP6Bsrr76gutkYR\nhacPsJO+yOYsIN72ThDps8xL9hAV0VIKfmPr8PTdFhiRnb+qNmcBIxcJU3DNAIB6X7+1NT6BXFVK\nnyVtM93sHVnSHxwkOeBBpK3L3mEtyyzq6TvJOJkk8QMv1c5L4CJtRMo2GKVvMAKqSX+sKv10sXfo\nLk0WxedH+jRdM6g2O1XqbsXyZMo4sCwYfk8JvFU2VRO4Vxu/YCvP5izAKH0DDxil7w/WXP04kb7f\n0wMlWpaDNPz8eNanhYwM76P7dJO+Sk8/LNIXUfqsi4RR+gYA1JJ+MkmIdsoUNf3ZEXelL7o5K8je\n4VHm9j5lyRrwt2ZU9MNK+ryZNPa2qjx9kXLMQaTPG8iVXSSM0jcAoJb029sJ4es4g1MkZTPs7B0d\ngVyeujsUfvaOCFmLWjMUsmpdddt0Vfq89o6zf6P0DQCoJX1dfj4glrI5Gjx9XmsHCLZ3WPvLyCAp\nh25Km2deXjZRXD19tzHD9PR12TtG6RsAUEv6uvx8INrsnSg3Z4mSvpe9w1O8DfAO5oZp74w1pa9q\nc5Zb7R2j9A3SRulH6enrTNnUofRV2Tu0L1nS9yJfWdJn2ZHLWxoBiJ70dW3OMkrfAEB6Kf2ODr5z\ncsNU+roCuTrsnShIPwp7R+Zg9DBIXySQK7M5yyh9AwBAXh4JwLIUFQuCTqWflUU+sCzHC1KoUPo8\nKZs6ArlR2zsyKp1Cxt7xyvNn2ZwlupvX7QlBR/aOKk/fKH0DLmRkAPn5wMmT8n3pVPoAfwZPOnj6\nUdg7PPPUae+wqHWa5+9UuLqVflSB3CBPX2aRMErfYAiqLB6dSh/g8/Uti5B+3LN3wg7kdnfz7+51\n6yus7B3a3knCMpuzwlLtOjx9HnvHrcqmUfoGANSRvq4KmxQ8aZt9fUQlBhFDEFhI37LipfT9FpKe\nnvgo/TBIPyxPPyuLbE7kOYhctlRy0PVu9fSN0jcAoFbp67Z3WElfhbUDsJF+by+5mTIz+ftnIX0e\nDx7wt3dUKf2wPH1AnPRFPX0R0k8k3HfABi0UYW7OMkrfYAiqyivrVvo8pK8iiAuwkb6oygeiydMP\nm/SjtHdElL7I5izAnWRVFlwztXcMlMEofW+w5OnLkH7c7R0V2TtR2jtOkqQlof0Ur0jtHbd2ussw\nWJb/azG1dww8kS6ePk/2Troo/bBr76gM5MraOyxECoiTPvW07ceBUlINOluX195xa6d7cxY9mcvr\ntRilb+AJVaTf0kLSP3UhCqXPkqcvujELSG97J+rsnSACSyRGqn3W/P6wSF/nmbdG6Rt4QgXpW1Y4\nefpx9fRFNmYBwUq/u1ttIDcds3fcArKsTwnOtqxHNKog/aCxeMsqOLNxeJ8kjNI3GIIK0j99mpCJ\nbIqkH3hSNsPM3tEZyO3u5l+8/PocLdk7LIrdrS1LuygDuTx5935BX8B9kTBK3wCAGtI/dYqUdNCJ\nuCp9mbGClL6IdZQO2TuDg+LEDfDFA3jUN6DW3uFJDR0cJF9eqb9uZRXGnNJvaWnB8uXLMW/ePFxx\nxRVoa2tzvW7OnDk477zzcP755+NjH/uY8ERHK3JzSRYASzVJL+j28wF+T18F6VOVmkx6XyND+tnZ\n5EZ3ersUXV381pFKe0dX9g4lbdZjG0WyadzGFvX0w8jeCQoy8+4DGJW1d9atW4fly5fjwIEDuPzy\ny7Fu3TrX6xKJBOrq6rBnzx7s3r1beKKjFYmEfK5+3JT+mTNqjm1MJILVvswCk0gE2zG8pB+GvSOb\nvUMPVmeBjNKP0tPnJeUgJe52fZC9M+qU/rZt27B69WoAwOrVq/HMM894Xmvx1OQdg5C1eE6dCkfp\ns6Zsnj6t7qzeINLv7JSLH/hZPCJKPx2yd/r61Dwp8LZl9fTdSF+10ufNrjFKH8Dx48dRWFgIACgs\nLMTx48ddr0skEli2bBkWL16Mxx57THS4UQ1Z0o+bvaNK6QNspC9jJQWRPq+nnw7ZO6rsIZa2vJ5+\nZmZq4xPPeKrsHVXXx1np+649y5cvx7Fjx0b8/Hvf+96w7xOJBBIeZtjvf/97FBcXo7m5GcuXL0dV\nVRWWLl3qeu2999479P+amhrU1NQETH90QIXS123vTJlCFDwLTp8mi4QKBOXqy5K+nx0jqvTjnr0T\nJunzKn0gRbA0qNrXF/x5CoPEncqdJ1CsUunX1dWhrq5OuL3vNF566SXP3xUWFuLYsWMoKirC0aNH\nUVBQ4HpdcXExAGDmzJm47rrrsHv3bibSH0tQofTPOkvdfNwwdSo58IUFYds7f/+ICUG1vUOJ2rJG\nBgWjyt6JivRFPH3arr8/9V719gY/yYat9Fn2AejakesUxPfddx9Xe2F7p7a2Fps2bQIAbNq0Cdde\ne+2Ia7q6unDm755AZ2cnXnzxRZx77rmiQ45apIPSnzqV1PdhQbrZOyoDuZmZ5MvpSwNi2Ts6UjZV\nkD4Lgckqfft4OuwdnsCsm0cfldKXhTDpf+c738FLL72EefPm4dVXX8V3vvMdAEBTUxOuuuoqAMCx\nY8ewdOlSLFq0CBdffDGuvvpqXHHFFWpmPoqQDp7+xInkQ++WQuiESntHZ/YOQNSkSqVP+3RbSETs\nHbf3O12yd0Q8fbcxdZC+bClmlgPeefL6w4Tw2pOXl4eXX355xM9LSkrw7LPPAgDmzp2Lt99+W3x2\nYwQFBYBHHJwJYWTvJBIpi2fmTP9rVds7fnsYdGfviJ7IJXviFaAue8eNtGWUvs4duYC7LcRynq9O\neyczM7WBKyMj+LW4LSo6d8zzwOzIjQGKi4GjR8Xbt7Tot3cAdl8/newd1YFcwDuDJ6rsHR32jgjp\nsyr98ePDsXecY/i9J/SgFqreeZU+62sPA4b0YwBZ0g9D6QPspB+mvaMzZVO0mJtKeyeds3ecip3V\n4nAuVGGRPs8YRukbSCE/n6hjr009fkgmCcnqrKVPwUL6/f3kS7QImhNRkf7AAPkSuVHd7B3LGnvZ\nO6KevvN1i5zUxZqCSfeN8pK+UfoGUsjIAAoLxdR+WxuxUkTOiOXFtGnBGTzU2mGp68KCqPL0afVO\nkdfhZu8MDJC/M08Gx2i0d0Qqe7IEnt1q9/uRbEYG+aKbwHgXFl6lz/qehQFD+jFBSYkY6Z88GY61\nA7ApfZXWDhBdIFfUzwfcFxJea8erH4DviSHq7B0nebOQvqjSt7dhrddD58dL+ixK39g7Br4Q9fWb\nm0n2TxhgJX1VQVyAELpfzR/ZlE1dpO9U1yKncHnNTVbpy2bv9Payb7ISJX3elE1nGxbStweMVSt9\nY+8YBEKU9E+ciBfpq8zcAfxr/liWXntHlPTd7B3ezB2vuVEiYbWJ3CwinkXD7eQs1pRRUaUvEsgV\nUfr2NqqVvgnkGgSipARoauJv19wcnDevClEo/cmTvWv+9PaSm0tmp6Of0ld5IpeIveM2Nx7Cpn04\n5yL7pMD61OL02XXaOyJK30niRukbhIp0UfpBgVzVnv6UKd5KX8UJXV7ZQXG1d3hJ320B4uljwoTh\nZDowkMpZD4KM0ucNAIsofftCoVPpW1a8qmwa0o8JZDz9OCn9MO0dFaSfk+MeKJYhfZ32ThSkb2/P\nUwLCaQ2xtnUqfZbAs0gcQMbe4VH6tO6Oqow2WRjSjwmKi8Xsnbh5+qrtHb+SzrKZO4A36ct4+m5K\nX8TeoYFGe2153icGStr2c4x4snecpC9TAkJnINep9FnGCkvpx8nPBwzpxwaiKZthKv1p08JP2UxH\npT9hwkjLSMTecTvOkVfpZ2SI1bKhcD618Ch9UU9fJJDrXChYxtKt9Hkyg8KEIf2YYOZMoLXVvSSv\nH06cGLv2jooD2P1IXzSQm5Mz0osXsXeAkb4+D+lSyCwczqcWnsXLTemztA1L6fMGcp1PBqz19OMU\nxAUM6ccGmZmEvF0OKvPFaM/Tp6TvdsyyKqXvtg9ARum7bSgTsXeAkYSt4rB2GU8/DHsnLKUvY+/w\nKH1j7xh4gtfiGRwkxdZmzNA3JzuiyN7JyiI3p1uGTVztHbeMIBF7Bxip9KMmfZlAbpg7cnXbOzy1\nd4zSN/AEbwZPaysh2LA+UBMmpAqHeUG10ge80zbjGsj1In0V9o6I7eTsI0ylL+rpU3IdHAw+1QoY\nrtotK3qlbwK5BkzgJf0w/XyABBaDiq7pOMXLa4OWbqUv4+k7SV+lvSOb+imTvcMbyJVV+pSMg9Id\n7aqdFrcLKkJolL5B5OBN2wzTz6fIyyOWkhdaWoDp09WO6RXMVUn6zpiBak9flb0jMi8ncfNk77iR\nfpgpm6xztbdhXdR07silSt+yjNI38AFvKYawlT5AVHxLi/fvW1vVn+LlZe+oyN6hKtJZX0a1py+q\n9N08fVmlz9OHjL0j6unzKnBnG9HFRaXSt5duNkrfwBPl5UBDA/v1x4+TOvxhIj/fW+kPDhLrR/WB\nLl72jqr0UDeLR8bTd7N3RJ9KVNg7Mk8L1EunVkVY9o5dtbMevGJvo2Nx4VH6QCpt0+TpG3hi1izg\no4/Yr29qAkpL9c3HDX6kf/o0ITaZAmhu8LJ3Tp8mGUWycCN91UpfNOisw97hXTjs7cMK5FIyZg2A\nOwk8aqUPpNI2jb1j4AlK+m456W5oaiKWUJjwI30d1g7gXYpBVaZQbq476YsGct08fVGlr8Pe4V04\n7Bu0wg7ksr5eUaWvy9MHUqRv7B0DT9BjD4Ny4SniRvo6griAt9Jvb1dn7zg3aJ05I54O6qX040L6\nMkqfJ5Ar4+nTdjxlnHk9fZ3ZO0BqsTRK38AXPBZPHElfl9L3sndUkP7kye6kL7rJTKWn77SeROwd\nZ019EaUvYu846/aIKH1We0dE6cvaOyy7hHt6jNI3CAAP6Tc2xov0ddk7XoFcVaTvZh/JkL5Ke8dJ\n+qJKX+Zpwan0We2dSZPENoXZx2PNegpb6bM8gdDXYZS+gS9mzQLq64Ov6+4mZBDWoegUcbJ3VCp9\nZ/8ypE8PHrGXRI4L6dPccR7laVfsPPaO3ZqyLPYsFns7nUpfxtNnmRe1d4zSN/BFeTmb0j96lKj8\nsIj24UgAAA5BSURBVA9mGI32jlPpWxaxe0RJP5EghGC3eKK0d+x2E100eD43TnuHR+nTcekTQgYD\n49jbsSp9GjQdHBRPDeUhfZZ50ffNpGwa+IJV6Ufh5wPxsXeSSUIMspuzaP/2RaWri9ykMqmnzowg\n0ZRNFUrf3odsyifP4kUVu2XxjetU+iykn0ik7BoRe4flfeW1d+yeviF9A0+wevpRkn5Li3taqS57\nx03pd3QQEmVRjiz92xcVGWuHwrlQiSr93NzhQWZRpU/7kN3cxTN+ZiZR4L294qTPM18aQxBR+qyk\nzxNgpoulyHuuE4b0Y4ZZs4APPwy+LirSHz+efPjdatDrsnfcSjqrrObpVPoqSN++UFG7SJW9E7bS\nt7fnXbwogfM8lYkofYCf9HmVvnO/Aou909trSN8gAGVlpKaOX/liIDrSB7wtHl32Tl4e6duOtjY1\nu3EBfUqfkn5vL7GKROwiJ+mLxBrsfcjaQ7ykT/15nsXGGQtgnS+No7CSvj2VlWUxpf3TXcZBf0+j\n9A2YkJUFzJ4NfPCB/3UNDdGRvlelTV32zvTpIy0llU8VOpS+3d6RqQbqJH2RudnjC7L2UGcnX3uq\nvnnGzc5O1dHnKVRHFwtW0qeptZbFRsz0tbA+fVBPX/QsBV0wpB9DVFQAhw75X/O3vwFz54YzHye8\nlL4ue2fCBOIP27NhVI6lQ+nb7Z2oSV9W6TsXDV57h1fp0+wnHoIF+O0dukj09bE9idHXwkridqUv\nUmFVFwzpxxCspH/22eHMx4kZM4CTJ4f/zLL0kT5A+rWXdFZpJelS+rRP2d29lHAHBgihyXjyYXv6\nIkqftuvq4lukKCmzzpGmsrKOYZ8TC4kbT9+AGUGkf+YM+WCHXVaZoqho5AHuHR0kk0ZFCqUbnL6+\naqVvP/BdRZDYbu+0t4uXm7YTLs1Y4t2bEaWnL6L0aTsRpc9D+rwLC++cjKdvwIyKCuDgQe/fU2sn\n7I1ZFG6kr7u2v1Ppq4wf6FhQ7PaOTNDZTriiReDsnryoPSTj6cuSPm/KJl0cWefGq/R5PX1D+gaB\nCFL6hw9H5+cD7mf5HjtGFgNdoMFcCpVK3xkoVmEd2e0dGaVPT/bq7RW3iewLR3s7/wIk6+mL2Dv0\nCUEkkKtL6dsDubyeviF9A1/Mnk2KqTmP8KOI0s8HoiF9nZ7+xInDA8UqFhS7vSObXjp1KulLlPQp\nWQ0OillXdNGgR//xBCVFlT5vpgyQWmB0kT716Ds7jb1joBjjxpEaPIcPu/8+aqUfhb0zYwY5CJ5C\ndXqofVFR0bcqpQ+Qtq2t4qSfkZEquiZK+h0dKWuHx1aUUfrd3fw7cru62O2d8eNJzv2ZM2xjJBLk\nfWxt5QvkmpRNAyacdx7wzjvuvxuLSr+wkCwsFM3NaiuM2klfxVMEJWpAXulPny5H+kDKohGxd6jS\nF6l1JOPpd3XxzZfX3kkkSJtTp/gyhFhJ3+7pm5RNg0AsWgS8/bb776JW+vn5KRKgOHpUL+kXFQ0n\n/WPHyOKjCk6lL0v6M2em9jLIKn0VpE8zlESUPl0wRPYb5OaSeYvaOzwLpt3eYQ1485L+pEnk82E8\nfQPl8CL97m7i90dJ+hkZI2sEffghiUXogt1SGhggN2pBgbr+aSE5gBCsrL1j38sQB6VPN9TJKH3e\nzB0glRnFS/rUUuJZMO32DuviREmfp0RES4vx9A00wIv09+0D5s2L/lCGOXOGk/6RI+GRfnMzIROZ\n0sdO2EtLqFD6lPQti5C+Ck9fZl6U9EWV/pkzZHxeS40uWLznGdPFQqe9Q9vw2juspE/LPBjSN2BC\neTkJAjkDpu+8A5x7bjRzsmPOHEL0AMkKqa8Pj/SPHlVr7QCEzJqbyQ3a3y9+KDoFDXh2dRHykrV3\n2tpIIT7RpxsZpZ+Xlxp/xgz+ti0tZAGcOZOvXVMT+WyJpGzqtHeOHmV7D+nToyF9AyYkEkTt7907\n/Odvv02CvFHDTvrHjpGbQOcHe/r01MYYHUHj8nJSxK6hgVQ6VbHxjWYcyVZEpWpZJkOKPsmIKP2s\nLPL3PXCAn/Tp3Jub+drm55PY1bRp7H8Lut+C195pbOSLG3z4IdsClp9PFsr+fvbTxsKAIf0YY/Fi\n4I9/HP6zN94AliyJZj52nH02IQGAZBPNmaN3vEQiFUfQofTLy8nTSn09IX0VmDGD3PTHjqkhfVml\n39IipvQBMu577/GpdWC40ucl/b/9jW+uRUXkAKKMDHb7MyeHbIRk/TxNmsRH+k1N/GmuumFIP8a4\n7DLg1VdT33d2Ek//wgujmxOFPaX03XfDsZzmzSMLzYEDZNeyStBjKuvryQKgAjNmkL/XtGlyx+VR\n6+nECXGln59PyG3cOLH0QUr6Ikr/5EliD/HEI0RJ//BhvgyjoiLyxMr65FhURBZOFtKfOpVsaFMl\nIlRBmPR/+ctf4pxzzkFmZibeeustz+t27NiBqqoqVFZWYv369aLDjSnU1dUBAJYuBd58M7XJ57XX\nCOHHwR+srCSKu6ODWE4LF+oZh74XACH9998nRFpdrXYceiC9StIvLwd+/3v5m57WYmpoqJNS+rt3\nkyc0EdVZUEDedxFP/8QJknXEE3jPyyNeuFcsxP65sM+xu5svtkSfUFlJ/6yzyL8spJ+RQd53nbEu\nEQiT/rnnnounn34al1xyiec1yWQSa9euxY4dO7Bv3z48+eST2L9/v+iQYwb0A52bS9T+00+Tn//6\n18B110U3LzuysoD584E9ewjpL1qkZxwn6R84AOzfr5708/JIiYH33lNH+uedBzz/PFBaKtdPZSV5\n3WfO1AlvSJs5U25TX0EBUa289g4VKLz5/fR1eil9N9IfN4604/lsUBLXQfrAKCP9qqoqzJs3z/ea\n3bt3o6KiAnPmzEF2djZWrVqFrVu3ig45JvGFLwAPPURU9dNPAzfdFPWMUli5EtiwgajQMCynxYuB\nF18k74XqfQqJBPDxjwO//CVw8cVq+jzvPBIklLWiJk4khDtunPhB8PQ1iS4a1JoRjU00NPBdT+d5\n6aV87YqKiBhhBS/p08/dmCR9FjQ2NqLcJpvKysrQ2Nioc8hRh+uuI9kWCxYAX/qSvGpUiVtvBX7x\nC7IQ8W7aEcHixcQmuPtuPfsUbrqJPO5fcIGa/miW1Ve/Kt9XZibwsY+Jt6cpjKKbzlavBrZvF4vd\nfPQR8NJLfG0mTgS2bAHuuYevXVkZ3xznziXvDeumt7PPJvcj65NLUVG0JVNcYflg2bJl1oIFC0Z8\nbdu2beiampoa680333Rt/6tf/cr64he/OPT9z372M2vt2rWu1wIwX+bLfJkv8yXwxQPf0MpLvMuz\nA6Wlpaivrx/6vr6+HmUeUS3Lfuq1gYGBgYEWKLF3vAh78eLFOHjwII4cOYK+vj5s2bIFtbW1KoY0\nMDAwMBCAMOk//fTTKC8vx65du3DVVVdhxYoVAICmpiZcddVVAICsrCxs2LABV155Jaqrq3HzzTdj\nPk+UxcDAwMBALbjMIA14/vnnrX/4h3+wKioqrHXr1kU9ncjw0UcfWTU1NVZ1dbV1zjnnWA899FDU\nU4oUAwMD1qJFi6yrr7466qlEjtbWVuv666+3qqqqrPnz51t/+MMfop5SZLj//vut6upqa8GCBdYt\nt9xi9fT0RD2l0HDHHXdYBQUF1oIFC4Z+durUKWvZsmVWZWWltXz5cqu1tTWwn0h35Jo8/hSys7Px\nwAMP4L333sOuXbvwox/9aMy+FwDw0EMPobq6Gok47V+PCF//+texcuVK7N+/H++8886YfVo+cuQI\nHnvsMbz11lt49913kUwm8dRTT0U9rdBwxx13YMeOHcN+tm7dOixfvhwHDhzA5ZdfjnXr1gX2Eynp\nmzz+FIqKirDo7zuccnNzMX/+fDQ1NUU8q2jQ0NCA5557Dl/84hfHfIC/vb0dO3fuxJ133gmAWKZT\nZYrzpzGmTJmC7OxsdHV1YWBgAF1dXSiNUw6zZixduhTTHTm327Ztw+rVqwEAq1evxjPPPBPYT6Sk\nb/L43XHkyBHs2bMHF6vaJZRm+MY3voEf/OAHyBDdiTSK8MEHH2DmzJm44447cMEFF+Duu+9Gl/3I\nsjGEvLw8fOtb38KsWbNQUlKCadOmYdmyZVFPK1IcP34chX8vyFRYWIjj9uPlPBDpXWUe3Ueio6MD\nN9xwAx566CHkyhZ1T0Ns374dBQUFOP/888e8ygeAgYEBvPXWW/jKV76Ct956Czk5OUyP8KMRhw8f\nxoMPPogjR46gqakJHR0deOKJJ6KeVmyQSCSYODVS0ufJ4x8L6O/vx/XXX4/Pf/7zuPbaa6OeTiR4\n4403sG3bNpx11lm45ZZb8Oqrr+L222+PelqRoaysDGVlZbjooosAADfccINvgcPRjD//+c9YsmQJ\n8vPzkZWVhc997nN44403op5WpCgsLMSxv58udPToURQwVOSLlPRNHn8KlmXhrrvuQnV1Nf75n/85\n6ulEhvvvvx/19fX44IMP8NRTT+HTn/40Nm/eHPW0IkNRURHKy8tx4O+HF7z88ss455xzIp5VNKiq\nqsKuXbvQ3d0Ny7Lw8ssvo1p15b00Q21tLTZt2gQA2LRpE5tY1JVexIrnnnvOmjdvnnX22Wdb999/\nf9TTiQw7d+60EomEtXDhQmvRokXWokWLrOeffz7qaUWKuro665prrol6GpHj7bffthYvXmydd955\n1nXXXWe1tbVFPaXIsH79+qGUzdtvv93q6+uLekqhYdWqVVZxcbGVnZ1tlZWVWT/5yU+sU6dOWZdf\nfjlXymbCsoxxamBgYDBWYNIjDAwMDMYQDOkbGBgYjCEY0jcwMDAYQzCkb2BgYDCGYEjfwMDAYAzB\nkL6BgYHBGML/B3suibfww4xPAAAAAElFTkSuQmCC\n" | |
|
111 | 148 | } |
|
112 | 149 | ], |
|
113 |
"prompt_number": |
|
|
150 | "prompt_number": 5 | |
|
114 | 151 | }, |
|
115 | 152 | { |
|
116 | 153 | "cell_type": "markdown", |
|
154 | "metadata": {}, | |
|
117 | 155 | "source": [ |
|
118 | "You can paste blocks of input with prompt markers, such as those from", | |
|
156 | "You can paste blocks of input with prompt markers, such as those from\n", | |
|
119 | 157 | "[the official Python tutorial](http://docs.python.org/tutorial/interpreter.html#interactive-mode)" |
|
120 | 158 | ] |
|
121 | 159 | }, |
@@ -123,24 +161,26 b'' | |||
|
123 | 161 | "cell_type": "code", |
|
124 | 162 | "collapsed": false, |
|
125 | 163 | "input": [ |
|
126 | ">>> the_world_is_flat = 1", | |
|
127 | ">>> if the_world_is_flat:", | |
|
164 | ">>> the_world_is_flat = 1\n", | |
|
165 | ">>> if the_world_is_flat:\n", | |
|
128 | 166 | "... print \"Be careful not to fall off!\"" |
|
129 | 167 | ], |
|
130 | 168 | "language": "python", |
|
169 | "metadata": {}, | |
|
131 | 170 | "outputs": [ |
|
132 | 171 | { |
|
133 | 172 | "output_type": "stream", |
|
134 | 173 | "stream": "stdout", |
|
135 | 174 | "text": [ |
|
136 | "Be careful not to fall off!" | |
|
175 | "Be careful not to fall off!\n" | |
|
137 | 176 | ] |
|
138 | 177 | } |
|
139 | 178 | ], |
|
140 |
"prompt_number": |
|
|
179 | "prompt_number": 6 | |
|
141 | 180 | }, |
|
142 | 181 | { |
|
143 | 182 | "cell_type": "markdown", |
|
183 | "metadata": {}, | |
|
144 | 184 | "source": [ |
|
145 | 185 | "Errors are shown in informative ways:" |
|
146 | 186 | ] |
@@ -152,62 +192,67 b'' | |||
|
152 | 192 | "%run non_existent_file" |
|
153 | 193 | ], |
|
154 | 194 | "language": "python", |
|
195 | "metadata": {}, | |
|
155 | 196 | "outputs": [ |
|
156 | 197 | { |
|
157 | 198 | "output_type": "stream", |
|
158 | 199 | "stream": "stderr", |
|
159 | 200 | "text": [ |
|
160 | "ERROR: File `non_existent_file.py` not found." | |
|
201 | "ERROR: File `u'non_existent_file.py'` not found." | |
|
161 | 202 | ] |
|
162 | 203 | } |
|
163 | 204 | ], |
|
164 |
"prompt_number": |
|
|
205 | "prompt_number": 7 | |
|
165 | 206 | }, |
|
166 | 207 | { |
|
167 | 208 | "cell_type": "code", |
|
168 | 209 | "collapsed": false, |
|
169 | 210 | "input": [ |
|
170 | "x = 1", | |
|
171 | "y = 4", | |
|
211 | "x = 1\n", | |
|
212 | "y = 4\n", | |
|
172 | 213 | "z = y/(1-x)" |
|
173 | 214 | ], |
|
174 | 215 | "language": "python", |
|
216 | "metadata": {}, | |
|
175 | 217 | "outputs": [ |
|
176 | 218 | { |
|
177 | 219 | "ename": "ZeroDivisionError", |
|
178 | 220 | "evalue": "integer division or modulo by zero", |
|
179 | 221 | "output_type": "pyerr", |
|
180 | 222 | "traceback": [ |
|
181 |
"\u001b[ |
|
|
182 | "\u001b[0;32m/home/fperez/ipython/ipython/docs/examples/notebooks/<ipython-input-7-dc39888fd1d2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mz\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", | |
|
183 |
"\u001b[ |
|
|
223 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", | |
|
224 | "\u001b[1;32m<ipython-input-8-dc39888fd1d2>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mz\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", | |
|
225 | "\u001b[1;31mZeroDivisionError\u001b[0m: integer division or modulo by zero" | |
|
184 | 226 | ] |
|
185 | 227 | } |
|
186 | 228 | ], |
|
187 |
"prompt_number": |
|
|
229 | "prompt_number": 8 | |
|
188 | 230 | }, |
|
189 | 231 | { |
|
190 | 232 | "cell_type": "markdown", |
|
233 | "metadata": {}, | |
|
191 | 234 | "source": [ |
|
192 | "When IPython needs to display additional information (such as providing details on an object via `x?`", | |
|
235 | "When IPython needs to display additional information (such as providing details on an object via `x?`\n", | |
|
193 | 236 | "it will automatically invoke a pager at the bottom of the screen:" |
|
194 | 237 | ] |
|
195 | 238 | }, |
|
196 | 239 | { |
|
197 | 240 | "cell_type": "code", |
|
198 |
"collapsed": |
|
|
241 | "collapsed": false, | |
|
199 | 242 | "input": [ |
|
200 | 243 | "magic" |
|
201 | 244 | ], |
|
202 | 245 | "language": "python", |
|
246 | "metadata": {}, | |
|
203 | 247 | "outputs": [], |
|
204 | "prompt_number": 8 | |
|
248 | "prompt_number": 18 | |
|
205 | 249 | }, |
|
206 | 250 | { |
|
207 | 251 | "cell_type": "markdown", |
|
252 | "metadata": {}, | |
|
208 | 253 | "source": [ |
|
209 | "## Non-blocking output of kernel", | |
|
210 | "", | |
|
254 | "## Non-blocking output of kernel\n", | |
|
255 | "\n", | |
|
211 | 256 | "If you execute the next cell, you will see the output arriving as it is generated, not all at the end." |
|
212 | 257 | ] |
|
213 | 258 | }, |
@@ -215,12 +260,13 b'' | |||
|
215 | 260 | "cell_type": "code", |
|
216 | 261 | "collapsed": false, |
|
217 | 262 | "input": [ |
|
218 | "import time, sys", | |
|
219 | "for i in range(8):", | |
|
220 | " print i,", | |
|
263 | "import time, sys\n", | |
|
264 | "for i in range(8):\n", | |
|
265 | " print i,\n", | |
|
221 | 266 | " time.sleep(0.5)" |
|
222 | 267 | ], |
|
223 | 268 | "language": "python", |
|
269 | "metadata": {}, | |
|
224 | 270 | "outputs": [ |
|
225 | 271 | { |
|
226 | 272 | "output_type": "stream", |
@@ -275,74 +321,81 b'' | |||
|
275 | 321 | "output_type": "stream", |
|
276 | 322 | "stream": "stdout", |
|
277 | 323 | "text": [ |
|
278 | "7" | |
|
324 | "7\n" | |
|
279 | 325 | ] |
|
280 | 326 | } |
|
281 | 327 | ], |
|
282 | "prompt_number": 9 | |
|
328 | "prompt_number": 19 | |
|
283 | 329 | }, |
|
284 | 330 | { |
|
285 | 331 | "cell_type": "markdown", |
|
332 | "metadata": {}, | |
|
286 | 333 | "source": [ |
|
287 | "## Clean crash and restart", | |
|
288 | "", | |
|
289 | "We call the low-level system libc.time routine with the wrong argument via", | |
|
334 | "## Clean crash and restart\n", | |
|
335 | "\n", | |
|
336 | "We call the low-level system libc.time routine with the wrong argument via\n", | |
|
290 | 337 | "ctypes to segfault the Python interpreter:" |
|
291 | 338 | ] |
|
292 | 339 | }, |
|
293 | 340 | { |
|
294 | 341 | "cell_type": "code", |
|
295 |
"collapsed": |
|
|
342 | "collapsed": false, | |
|
296 | 343 | "input": [ |
|
297 |
" |
|
|
298 | "# This will crash a linux system; equivalent calls can be made on Windows or Mac", | |
|
299 | "libc = CDLL(\"libc.so.6\") ", | |
|
344 | "import sys\n", | |
|
345 | "from ctypes import CDLL\n", | |
|
346 | "# This will crash a Linux or Mac system; equivalent calls can be made on Windows\n", | |
|
347 | "dll = 'dylib' if sys.platform == 'darwin' else '.so.6'\n", | |
|
348 | "libc = CDLL(\"libc.%s\" % dll) \n", | |
|
300 | 349 | "libc.time(-1) # BOOM!!" |
|
301 | 350 | ], |
|
302 | 351 | "language": "python", |
|
352 | "metadata": {}, | |
|
303 | 353 | "outputs": [], |
|
304 | 354 | "prompt_number": "*" |
|
305 | 355 | }, |
|
306 | 356 | { |
|
307 | 357 | "cell_type": "markdown", |
|
358 | "metadata": {}, | |
|
308 | 359 | "source": [ |
|
309 | "## Markdown cells can contain formatted text and code", | |
|
310 | "", | |
|
311 | "You can *italicize*, **boldface**", | |
|
312 | "", | |
|
313 | "* build", | |
|
314 | "* lists", | |
|
315 | "", | |
|
316 | "and embed code meant for illustration instead of execution in Python:", | |
|
317 | "", | |
|
318 | " def f(x):", | |
|
319 | " \"\"\"a docstring\"\"\"", | |
|
320 | " return x**2", | |
|
321 | "", | |
|
322 | "or other languages:", | |
|
323 | "", | |
|
324 | " if (i=0; i<n; i++) {", | |
|
325 | " printf(\"hello %d\\n\", i);", | |
|
326 | " x += 4;", | |
|
360 | "## Markdown cells can contain formatted text and code\n", | |
|
361 | "\n", | |
|
362 | "You can *italicize*, **boldface**\n", | |
|
363 | "\n", | |
|
364 | "* build\n", | |
|
365 | "* lists\n", | |
|
366 | "\n", | |
|
367 | "and embed code meant for illustration instead of execution in Python:\n", | |
|
368 | "\n", | |
|
369 | " def f(x):\n", | |
|
370 | " \"\"\"a docstring\"\"\"\n", | |
|
371 | " return x**2\n", | |
|
372 | "\n", | |
|
373 | "or other languages:\n", | |
|
374 | "\n", | |
|
375 | " if (i=0; i<n; i++) {\n", | |
|
376 | " printf(\"hello %d\\n\", i);\n", | |
|
377 | " x += 4;\n", | |
|
327 | 378 | " }" |
|
328 | 379 | ] |
|
329 | 380 | }, |
|
330 | 381 | { |
|
331 | 382 | "cell_type": "markdown", |
|
383 | "metadata": {}, | |
|
332 | 384 | "source": [ |
|
333 | "Courtesy of MathJax, you can include mathematical expressions both inline: ", | |
|
334 | "$e^{i\\pi} + 1 = 0$ and displayed:", | |
|
335 | "", | |
|
385 | "Courtesy of MathJax, you can include mathematical expressions both inline: \n", | |
|
386 | "$e^{i\\pi} + 1 = 0$ and displayed:\n", | |
|
387 | "\n", | |
|
336 | 388 | "$$e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$$" |
|
337 | 389 | ] |
|
338 | 390 | }, |
|
339 | 391 | { |
|
340 | 392 | "cell_type": "markdown", |
|
393 | "metadata": {}, | |
|
341 | 394 | "source": [ |
|
342 | "## Rich displays: include anyting a browser can show", | |
|
343 | "", | |
|
344 | "Note that we have an actual protocol for this, see the `display_protocol` notebook for further details.", | |
|
345 | "", | |
|
395 | "## Rich displays: include anyting a browser can show\n", | |
|
396 | "\n", | |
|
397 | "Note that we have an actual protocol for this, see the `display_protocol` notebook for further details.\n", | |
|
398 | "\n", | |
|
346 | 399 | "### Images" |
|
347 | 400 | ] |
|
348 | 401 | }, |
@@ -350,17 +403,18 b'' | |||
|
350 | 403 | "cell_type": "code", |
|
351 | 404 | "collapsed": false, |
|
352 | 405 | "input": [ |
|
353 | "from IPython.core.display import Image", | |
|
406 | "from IPython.core.display import Image\n", | |
|
354 | 407 | "Image(filename='../../source/_static/logo.png')" |
|
355 | 408 | ], |
|
356 | 409 | "language": "python", |
|
410 | "metadata": {}, | |
|
357 | 411 | "outputs": [ |
|
358 | 412 | { |
|
359 | 413 | "output_type": "pyout", |
|
360 | 414 | "png": "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\n", |
|
361 | 415 | "prompt_number": 1, |
|
362 | 416 | "text": [ |
|
363 |
" |
|
|
417 | "<IPython.core.display.Image at 0x1060e77d0>" | |
|
364 | 418 | ] |
|
365 | 419 | } |
|
366 | 420 | ], |
@@ -368,6 +422,7 b'' | |||
|
368 | 422 | }, |
|
369 | 423 | { |
|
370 | 424 | "cell_type": "markdown", |
|
425 | "metadata": {}, | |
|
371 | 426 | "source": [ |
|
372 | 427 | "An image can also be displayed from raw data or a url" |
|
373 | 428 | ] |
@@ -379,15 +434,14 b'' | |||
|
379 | 434 | "Image('http://python.org/images/python-logo.gif')" |
|
380 | 435 | ], |
|
381 | 436 | "language": "python", |
|
437 | "metadata": {}, | |
|
382 | 438 | "outputs": [ |
|
383 | 439 | { |
|
384 | "html": [ | |
|
385 | "<img src=\"http://python.org/images/python-logo.gif\" />" | |
|
386 | ], | |
|
387 | 440 | "output_type": "pyout", |
|
441 | "png": "R0lGODlh0wBHAPcAAP/////78vf3///35fb19fPy8u/v7//tyPHs2uvq6urq6vXoxv/tYObm5vHl\nw//krP/rXvXmpvXjmP/mWf/gl9zh5/bfoP/jVN7e3vfekvjhbt3d3friYv/gUtfe483f7vbYl/XZ\njfXagv/We//Wg//bTNbW1vfUe//YSf/TdvjVaPfShPnWW/vVT//VRP/PasbU4P/QQP/NV/fNdMLR\n3vvOR/jNV//MO8zMzPjHYvvIQPzFOf/FMsXFxfnCRLDH2fnAScLCwvvAN/q+QP2+Lv+8Kb29vf+4\nLf+1Mf+1IZu/3Zu92qG6z5260bW1taysrJCvyYKv1KioqIKt0aOjo3+oyqGgoICmxn6lxoCjwH2h\nv3+euJmZmXKgxZGRkXCWtZCPj2SVvWSRtVqRv2SOsoaGhlKNvX5+fkmIu0SJwFCFsEmFtkOFuziF\nw0ODtjiCvkl/rFB8oUN/snV1dTh/ukJ9rjh8tUN5pzd5r2xsbDd2q0JzpTxynjdzpWZmZjZtnDdq\nlP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUUAIEALAAAAADTAEcA\nAAj/AAMJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX\nMGPKnEmzps2bOHPq3Mmzp8+fQIMKjYiDSx4cQ2fSwBJmjRs5UOWoEaPFQ1KEZfz4QXrVZRM2b8La\nGYunrJ6zesh0LZh161qWTcLSmTuWLNo+ePe8FdiW616UaN6k+SBgCtmyZfEq/hLUL8G+N6VIlhxI\nioFACqTEBKsEAAACdhDfVdyHj88GVub4OQgZp2aBUoJsCPL6Zdgonj+ExjMa75/fPnFoXW2wdeSB\nUjIbqO0y7JspS9wgTqz4N/CewrWy1uq4Zu3vMeke/0ZM2vp1ntmJs+WeEzzs8HVFn61u/k/w4dvd\nukbOP6cY+tYBshEORjzxBA4NKGQCBkThVxx7EzWAg4FGmPAQgQYi2BMNY4DlXHzTlRcgIIAYwAAD\nE6SoQURGnDHci1wkWJATqnVHkIOBPPHii08M1JcBGFjholZ5WCGjQRhwsaMfcxiRUANODLljjDpV\n4dyH41Hn24gkGgABBBNcICYLDvWgmlZzlFGGlGccyReEB+Go45J+9PimHz0oSWebBvWQx3Bq/qkV\nlTMKmiYXZQjqB583NdHGo2/MRZd8eoj4G4ldpijmBSWUIAJDRhD5BIMD4SBoGevpF6d2BKWXH5FW\nIP+FwZx+oEqQCYIaOZARgnJBUANtleFYA3r64etNaUAqaV2h9daHeZh2uSmnndbAUFs9HJRetj7C\naRCOArn6oFa6EuTEcBYK1MCZThiEq1bthgvuY/PK9EMbV74BInkA/hGttNR26oILDixkXKpn0Kvq\nt6yWWm8gbTl5kKB25ogmQnPmIaO4fT4MUxeQijVeb/X9G8cCHXQg8MAxhGCwt+YORyrEMN/YsLw3\nd7swQWCQOxC7CDUwnMQcM6weTWbIJZ5d8/X7LyA0qNBpCQO7EEMMNry8s8NaSUzz1gPNW7TONgo0\np60mDFe2QEOCgfPRBXn8koci78bvlpf+uwUCU1f/HcMNN+ig9dqBDFfxwXHnPPada58tUA9yB6Jn\nwoEsHnbOMklKx75aPssliXHQgEALK/8N+A07DJ7QcMd+TbjYDyM+kOMWY04QrW+vbjtMWNqdWBYw\nGCD88MQbsIAKKCTP8uk8NK86QoCSrTvclstutla24p6Q9pYLFHlLy+57RwUScHDi+SdqGjDVVjPf\nPA/Pr1qr9NArHnvN188fCOS7509594Xrn0vcsLks4aECGkDf+VI0gZSpjH3tA9z7eCCE+BntcPjz\nnv1sZ73a2So96TpIz/QHwO+xZAycw0MWIqDA9KXIgSuzmukmWAQfWLBVw4mX66ZXkOplkHYB9IPX\n/wwyJDuVUIAtucLIzlIB8ylQfQHzmwRpWIQZ3HAg59JKCCPGQxxy8IfY01nrCiI0LeaufnCTCQzi\ngxY9FGACTwyTmPoWwRtMkAdFyCMCriiQM1HuTmNMHPXuBzYP7opIbppdGM8oP5zUYTp4wEsB4rgp\nOprOju/LYx6HcC2tVCxmWuGWQKiAroPwD25p00oCxtW4RQISSYLyyxHTKBMomOUuk1ygHKfGvktS\nMY9JAEEn0eQEUiWAVl4oSAIElYcnrDIQCTBCWzB3pk8yDmOuDAQGevXMyhXRi7TUYDhjIobe5JKB\nMISgLzOpySQAoSFtOROaXnSGbg7kXXTakbuGM/+HWNHPIEAUiAnOlAc1SYkKPZSbCV3CBDjc4aF3\nCMSXXpgygdXgojrIqEaFwNGOWhGe3MGBF3bUzIQkaUlecEICHmaCkXrynwUJqECOqSiteMFGswwK\nFPumAo/0pQBAxYFQCUeQBAwVA0AFauSEOrOMmGCo9vzLQqZlSfe9r4IU6WBFFirVl8yxqlNsXh6x\nOhGtTmSl+utqTipautPZUQYUGIEmK2JWiWQnkGqtCR3r+L4BeCYFSSACXTNIET0NMa81aYHyZBhW\nHgTAMyRIAlklUleIhMoPeYgqYmeSASliMpMvOMADjpCEFQy2kBE5aSg3mxMWrJOdSYhtEnJgkcrS\nJsQET+CClOZAVNbCxAI1+CwegRlbJAjTInrqrUKKxSRn+pYnCzgBEIRABE0OYQYFcyoVQiiRHpSB\nCk7g7nPHS97ymve86E2vetfLXoYQIKnwja9829ve98oXqMUT3n2TSt/yEsC+Sc2vgPN73/6yFsD4\nLV4CFszgBieAwPE1cF7/C18FM7gBGM5wAxpcvPlKuKsILkB+HUxiCMP3wxMO8YBXrF8PozjFFN6v\njJP63/++2L81zrGOd3zjHvv4x0AOspCHTOQiG/nISE6ykpfc44AAADs=\n", | |
|
388 | 442 | "prompt_number": 2, |
|
389 | 443 | "text": [ |
|
390 |
" |
|
|
444 | "<IPython.core.display.Image at 0x1060e7410>" | |
|
391 | 445 | ] |
|
392 | 446 | } |
|
393 | 447 | ], |
@@ -395,6 +449,7 b'' | |||
|
395 | 449 | }, |
|
396 | 450 | { |
|
397 | 451 | "cell_type": "markdown", |
|
452 | "metadata": {}, | |
|
398 | 453 | "source": [ |
|
399 | 454 | "SVG images are also supported out of the box (since modern browsers do a good job of rendering them):" |
|
400 | 455 | ] |
@@ -403,79 +458,80 b'' | |||
|
403 | 458 | "cell_type": "code", |
|
404 | 459 | "collapsed": false, |
|
405 | 460 | "input": [ |
|
406 | "from IPython.core.display import SVG", | |
|
461 | "from IPython.core.display import SVG\n", | |
|
407 | 462 | "SVG(filename='python-logo.svg')" |
|
408 | 463 | ], |
|
409 | 464 | "language": "python", |
|
465 | "metadata": {}, | |
|
410 | 466 | "outputs": [ |
|
411 | 467 | { |
|
412 | 468 | "output_type": "pyout", |
|
413 | 469 | "prompt_number": 3, |
|
414 | 470 | "svg": [ |
|
415 | "<svg height=\"115.02pt\" id=\"svg2\" inkscape:version=\"0.43\" sodipodi:docbase=\"/home/sdeibel\" sodipodi:docname=\"logo-python-generic.svg\" sodipodi:version=\"0.32\" version=\"1.0\" width=\"388.84pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://web.resource.org/cc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">", | |
|
416 | " <metadata id=\"metadata2193\">", | |
|
417 | " <rdf:RDF>", | |
|
418 | " <cc:Work rdf:about=\"\">", | |
|
419 | " <dc:format>image/svg+xml</dc:format>", | |
|
420 | " <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>", | |
|
421 | " </cc:Work>", | |
|
422 | " </rdf:RDF>", | |
|
423 | " </metadata>", | |
|
424 | " <sodipodi:namedview bordercolor=\"#666666\" borderopacity=\"1.0\" id=\"base\" inkscape:current-layer=\"svg2\" inkscape:cx=\"243.02499\" inkscape:cy=\"71.887497\" inkscape:pageopacity=\"0.0\" inkscape:pageshadow=\"2\" inkscape:window-height=\"543\" inkscape:window-width=\"791\" inkscape:window-x=\"0\" inkscape:window-y=\"0\" inkscape:zoom=\"1.4340089\" pagecolor=\"#ffffff\"/>", | |
|
425 | " <defs id=\"defs4\">", | |
|
426 | " <linearGradient id=\"linearGradient2795\">", | |
|
427 | " <stop id=\"stop2797\" offset=\"0\" style=\"stop-color:#b8b8b8;stop-opacity:0.49803922\"/>", | |
|
428 | " <stop id=\"stop2799\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>", | |
|
429 | " </linearGradient>", | |
|
430 | " <linearGradient id=\"linearGradient2787\">", | |
|
431 | " <stop id=\"stop2789\" offset=\"0\" style=\"stop-color:#7f7f7f;stop-opacity:0.5\"/>", | |
|
432 | " <stop id=\"stop2791\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>", | |
|
433 | " </linearGradient>", | |
|
434 | " <linearGradient id=\"linearGradient3676\">", | |
|
435 | " <stop id=\"stop3678\" offset=\"0\" style=\"stop-color:#b2b2b2;stop-opacity:0.5\"/>", | |
|
436 | " <stop id=\"stop3680\" offset=\"1\" style=\"stop-color:#b3b3b3;stop-opacity:0\"/>", | |
|
437 | " </linearGradient>", | |
|
438 | " <linearGradient id=\"linearGradient3236\">", | |
|
439 | " <stop id=\"stop3244\" offset=\"0\" style=\"stop-color:#f4f4f4;stop-opacity:1\"/>", | |
|
440 | " <stop id=\"stop3240\" offset=\"1\" style=\"stop-color:#ffffff;stop-opacity:1\"/>", | |
|
441 | " </linearGradient>", | |
|
442 | " <linearGradient id=\"linearGradient4671\">", | |
|
443 | " <stop id=\"stop4673\" offset=\"0\" style=\"stop-color:#ffd43b;stop-opacity:1\"/>", | |
|
444 | " <stop id=\"stop4675\" offset=\"1\" style=\"stop-color:#ffe873;stop-opacity:1\"/>", | |
|
445 | " </linearGradient>", | |
|
446 | " <linearGradient id=\"linearGradient4689\">", | |
|
447 | " <stop id=\"stop4691\" offset=\"0\" style=\"stop-color:#5a9fd4;stop-opacity:1\"/>", | |
|
448 | " <stop id=\"stop4693\" offset=\"1\" style=\"stop-color:#306998;stop-opacity:1\"/>", | |
|
449 | " </linearGradient>", | |
|
450 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2987\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>", | |
|
451 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2990\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>", | |
|
452 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2587\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>", | |
|
453 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2589\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>", | |
|
454 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2248\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>", | |
|
455 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2250\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>", | |
|
456 | " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2255\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>", | |
|
457 | " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2258\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"76.176224\" y2=\"76.313133\"/>", | |
|
458 | " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(1,0,0,0.177966,0,108.7434)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient2801\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>", | |
|
459 | " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1475\" x1=\"150.96111\" x2=\"112.03144\" xlink:href=\"#linearGradient4671\" y1=\"192.35176\" y2=\"137.27299\"/>", | |
|
460 | " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1478\" x1=\"26.648937\" x2=\"135.66525\" xlink:href=\"#linearGradient4689\" y1=\"20.603781\" y2=\"114.39767\"/>", | |
|
461 | " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient1480\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>", | |
|
462 | " </defs>", | |
|
463 | " <g id=\"g2303\">", | |
|
464 | " <path d=\"M 184.61344,61.929363 C 184.61344,47.367213 180.46118,39.891193 172.15666,39.481813 C 168.85239,39.325863 165.62611,39.852203 162.48754,41.070593 C 159.98254,41.967323 158.2963,42.854313 157.40931,43.751043 L 157.40931,78.509163 C 162.72147,81.842673 167.43907,83.392453 171.55234,83.148783 C 180.25649,82.573703 184.61344,75.507063 184.61344,61.929363 z M 194.85763,62.533683 C 194.85763,69.931723 193.12265,76.072393 189.63319,80.955683 C 185.7441,86.482283 180.35396,89.328433 173.46277,89.484393 C 168.26757,89.650093 162.91642,88.022323 157.40931,84.610843 L 157.40931,116.20116 L 148.50047,113.02361 L 148.50047,42.903043 C 149.96253,41.109583 151.84372,39.569543 154.12454,38.263433 C 159.42696,35.173603 165.86978,33.584823 173.45302,33.506853 L 173.57973,33.633563 C 180.50991,33.545833 185.85132,36.391993 189.60395,42.162263 C 193.10315,47.454933 194.85763,54.238913 194.85763,62.533683 z \" id=\"path46\" style=\"fill:#646464;fill-opacity:1\"/>", | |
|
465 | " <path d=\"M 249.30487,83.265743 C 249.30487,93.188283 248.31067,100.05998 246.32227,103.88084 C 244.32411,107.7017 240.52275,110.75254 234.90842,113.02361 C 230.35653,114.81707 225.43425,115.79178 220.15133,115.95748 L 218.67952,110.34316 C 224.05016,109.61213 227.83204,108.88109 230.02513,108.15006 C 234.34309,106.688 237.30621,104.44617 238.93397,101.44406 C 240.24008,98.997543 240.88339,94.328693 240.88339,87.418003 L 240.88339,85.098203 C 234.79146,87.866373 228.40711,89.240713 221.73036,89.240713 C 217.34417,89.240713 213.47457,87.866373 210.14107,85.098203 C 206.39818,82.086343 204.52674,78.265483 204.52674,73.635623 L 204.52674,36.557693 L 213.43558,33.506853 L 213.43558,70.828453 C 213.43558,74.815013 214.7222,77.885353 217.29543,80.039463 C 219.86866,82.193563 223.20217,83.226753 227.2862,83.148783 C 231.37023,83.061053 235.74667,81.482023 240.39603,78.392203 L 240.39603,34.851953 L 249.30487,34.851953 L 249.30487,83.265743 z \" id=\"path48\" style=\"fill:#646464;fill-opacity:1\"/>", | |
|
466 | " <path d=\"M 284.08249,88.997033 C 283.02006,89.084753 282.04535,89.123743 281.14862,89.123743 C 276.10937,89.123743 272.18129,87.924853 269.37413,85.517323 C 266.57671,83.109793 265.17314,79.786033 265.17314,75.546053 L 265.17314,40.456523 L 259.07146,40.456523 L 259.07146,34.851953 L 265.17314,34.851953 L 265.17314,19.968143 L 274.07223,16.800333 L 274.07223,34.851953 L 284.08249,34.851953 L 284.08249,40.456523 L 274.07223,40.456523 L 274.07223,75.302373 C 274.07223,78.645623 274.96896,81.014163 276.76243,82.398253 C 278.30247,83.538663 280.74899,84.191723 284.08249,84.357423 L 284.08249,88.997033 z \" id=\"path50\" style=\"fill:#646464;fill-opacity:1\"/>", | |
|
467 | " <path d=\"M 338.02288,88.266003 L 329.11404,88.266003 L 329.11404,53.878273 C 329.11404,50.379063 328.29528,47.367213 326.66753,44.852463 C 324.78634,42.006313 322.17411,40.583233 318.82112,40.583233 C 314.73708,40.583233 309.6296,42.737343 303.4987,47.045563 L 303.4987,88.266003 L 294.58985,88.266003 L 294.58985,6.0687929 L 303.4987,3.2616329 L 303.4987,40.700203 C 309.191,36.557693 315.40963,34.481563 322.16436,34.481563 C 326.88196,34.481563 330.70282,36.070333 333.62694,39.238143 C 336.56082,42.405943 338.02288,46.353513 338.02288,51.071103 L 338.02288,88.266003 L 338.02288,88.266003 z \" id=\"path52\" style=\"fill:#646464;fill-opacity:1\"/>", | |
|
468 | " <path d=\"M 385.37424,60.525783 C 385.37424,54.930953 384.31182,50.310833 382.19669,46.655673 C 379.68195,42.201253 375.77337,39.852203 370.49044,39.608523 C 360.72386,40.173863 355.85032,47.172273 355.85032,60.584263 C 355.85032,66.734683 356.86401,71.871393 358.91089,75.994413 C 361.52312,81.248093 365.44145,83.840823 370.66589,83.753103 C 380.47146,83.675123 385.37424,75.935933 385.37424,60.525783 z M 395.13109,60.584263 C 395.13109,68.547643 393.09395,75.175663 389.02941,80.468333 C 384.5555,86.394563 378.37584,89.367423 370.49044,89.367423 C 362.67328,89.367423 356.58135,86.394563 352.18541,80.468333 C 348.19885,75.175663 346.21044,68.547643 346.21044,60.584263 C 346.21044,53.098503 348.36455,46.801883 352.67276,41.674913 C 357.22466,36.236033 363.20937,33.506853 370.6074,33.506853 C 378.00545,33.506853 384.02914,36.236033 388.66877,41.674913 C 392.97697,46.801883 395.13109,53.098503 395.13109,60.584263 z \" id=\"path54\" style=\"fill:#646464;fill-opacity:1\"/>", | |
|
469 | " <path d=\"M 446.20583,88.266003 L 437.29699,88.266003 L 437.29699,51.928853 C 437.29699,47.942293 436.0981,44.832973 433.70032,42.591133 C 431.30253,40.359053 428.10549,39.277123 424.11893,39.364853 C 419.8887,39.442833 415.86314,40.826913 412.04229,43.507363 L 412.04229,88.266003 L 403.13345,88.266003 L 403.13345,42.405943 C 408.26042,38.672813 412.97801,36.236033 417.28621,35.095623 C 421.35076,34.033193 424.93769,33.506853 428.02752,33.506853 C 430.14264,33.506853 432.13104,33.711543 434.00248,34.120913 C 437.50169,34.929923 440.34783,36.430973 442.54093,38.633823 C 444.98744,41.070593 446.20583,43.994723 446.20583,47.415943 L 446.20583,88.266003 z \" id=\"path56\" style=\"fill:#646464;fill-opacity:1\"/>", | |
|
470 | " <path d=\"M 60.510156,6.3979729 C 55.926503,6.4192712 51.549217,6.8101906 47.697656,7.4917229 C 36.35144,9.4962267 34.291407,13.691825 34.291406,21.429223 L 34.291406,31.647973 L 61.103906,31.647973 L 61.103906,35.054223 L 34.291406,35.054223 L 24.228906,35.054223 C 16.436447,35.054223 9.6131468,39.73794 7.4789058,48.647973 C 5.0170858,58.860939 4.9078907,65.233996 7.4789058,75.897973 C 9.3848341,83.835825 13.936449,89.491721 21.728906,89.491723 L 30.947656,89.491723 L 30.947656,77.241723 C 30.947656,68.391821 38.6048,60.585475 47.697656,60.585473 L 74.478906,60.585473 C 81.933857,60.585473 87.885159,54.447309 87.885156,46.960473 L 87.885156,21.429223 C 87.885156,14.162884 81.755176,8.7044455 74.478906,7.4917229 C 69.872919,6.7249976 65.093809,6.3766746 60.510156,6.3979729 z M 46.010156,14.616723 C 48.779703,14.616723 51.041406,16.915369 51.041406,19.741723 C 51.041404,22.558059 48.779703,24.835473 46.010156,24.835473 C 43.23068,24.835472 40.978906,22.558058 40.978906,19.741723 C 40.978905,16.91537 43.23068,14.616723 46.010156,14.616723 z \" id=\"path1948\" style=\"fill:url(#linearGradient1478);fill-opacity:1\"/>", | |
|
471 | " <path d=\"M 91.228906,35.054223 L 91.228906,46.960473 C 91.228906,56.191228 83.403011,63.960472 74.478906,63.960473 L 47.697656,63.960473 C 40.361823,63.960473 34.291407,70.238956 34.291406,77.585473 L 34.291406,103.11672 C 34.291406,110.38306 40.609994,114.65704 47.697656,116.74172 C 56.184987,119.23733 64.323893,119.68835 74.478906,116.74172 C 81.229061,114.78733 87.885159,110.85411 87.885156,103.11672 L 87.885156,92.897973 L 61.103906,92.897973 L 61.103906,89.491723 L 87.885156,89.491723 L 101.29141,89.491723 C 109.08387,89.491723 111.98766,84.056315 114.69765,75.897973 C 117.49698,67.499087 117.37787,59.422197 114.69765,48.647973 C 112.77187,40.890532 109.09378,35.054223 101.29141,35.054223 L 91.228906,35.054223 z M 76.166406,99.710473 C 78.945884,99.710476 81.197656,101.98789 81.197656,104.80422 C 81.197654,107.63057 78.945881,109.92922 76.166406,109.92922 C 73.396856,109.92922 71.135156,107.63057 71.135156,104.80422 C 71.135158,101.98789 73.396853,99.710473 76.166406,99.710473 z \" id=\"path1950\" style=\"fill:url(#linearGradient1475);fill-opacity:1\"/>", | |
|
472 | " <path d=\"M 463.5544,26.909383 L 465.11635,26.909383 L 465.11635,17.113143 L 468.81648,17.113143 L 468.81648,15.945483 L 459.85427,15.945483 L 459.85427,17.113143 L 463.5544,17.113143 L 463.5544,26.909383 M 470.20142,26.909383 L 471.53589,26.909383 L 471.53589,17.962353 L 474.4323,26.908259 L 475.91799,26.908259 L 478.93615,17.992683 L 478.93615,26.909383 L 480.39194,26.909383 L 480.39194,15.945483 L 478.46605,15.945483 L 475.16774,25.33834 L 472.35477,15.945483 L 470.20142,15.945483 L 470.20142,26.909383\" id=\"text3004\" style=\"font-size:15.16445827px;font-style:normal;font-weight:normal;line-height:125%;fill:#646464;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans\"/>", | |
|
473 | " <path d=\"M 110.46717 132.28575 A 48.948284 8.6066771 0 1 1 12.570599,132.28575 A 48.948284 8.6066771 0 1 1 110.46717 132.28575 z\" id=\"path1894\" style=\"opacity:0.44382019;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" transform=\"matrix(0.73406,0,0,0.809524,16.24958,27.00935)\"/>", | |
|
474 | " </g>", | |
|
471 | "<svg height=\"115.02pt\" id=\"svg2\" inkscape:version=\"0.43\" sodipodi:docbase=\"/home/sdeibel\" sodipodi:docname=\"logo-python-generic.svg\" sodipodi:version=\"0.32\" version=\"1.0\" width=\"388.84pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://web.resource.org/cc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", | |
|
472 | " <metadata id=\"metadata2193\">\n", | |
|
473 | " <rdf:RDF>\n", | |
|
474 | " <cc:Work rdf:about=\"\">\n", | |
|
475 | " <dc:format>image/svg+xml</dc:format>\n", | |
|
476 | " <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n", | |
|
477 | " </cc:Work>\n", | |
|
478 | " </rdf:RDF>\n", | |
|
479 | " </metadata>\n", | |
|
480 | " <sodipodi:namedview bordercolor=\"#666666\" borderopacity=\"1.0\" id=\"base\" inkscape:current-layer=\"svg2\" inkscape:cx=\"243.02499\" inkscape:cy=\"71.887497\" inkscape:pageopacity=\"0.0\" inkscape:pageshadow=\"2\" inkscape:window-height=\"543\" inkscape:window-width=\"791\" inkscape:window-x=\"0\" inkscape:window-y=\"0\" inkscape:zoom=\"1.4340089\" pagecolor=\"#ffffff\"/>\n", | |
|
481 | " <defs id=\"defs4\">\n", | |
|
482 | " <linearGradient id=\"linearGradient2795\">\n", | |
|
483 | " <stop id=\"stop2797\" offset=\"0\" style=\"stop-color:#b8b8b8;stop-opacity:0.49803922\"/>\n", | |
|
484 | " <stop id=\"stop2799\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>\n", | |
|
485 | " </linearGradient>\n", | |
|
486 | " <linearGradient id=\"linearGradient2787\">\n", | |
|
487 | " <stop id=\"stop2789\" offset=\"0\" style=\"stop-color:#7f7f7f;stop-opacity:0.5\"/>\n", | |
|
488 | " <stop id=\"stop2791\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>\n", | |
|
489 | " </linearGradient>\n", | |
|
490 | " <linearGradient id=\"linearGradient3676\">\n", | |
|
491 | " <stop id=\"stop3678\" offset=\"0\" style=\"stop-color:#b2b2b2;stop-opacity:0.5\"/>\n", | |
|
492 | " <stop id=\"stop3680\" offset=\"1\" style=\"stop-color:#b3b3b3;stop-opacity:0\"/>\n", | |
|
493 | " </linearGradient>\n", | |
|
494 | " <linearGradient id=\"linearGradient3236\">\n", | |
|
495 | " <stop id=\"stop3244\" offset=\"0\" style=\"stop-color:#f4f4f4;stop-opacity:1\"/>\n", | |
|
496 | " <stop id=\"stop3240\" offset=\"1\" style=\"stop-color:#ffffff;stop-opacity:1\"/>\n", | |
|
497 | " </linearGradient>\n", | |
|
498 | " <linearGradient id=\"linearGradient4671\">\n", | |
|
499 | " <stop id=\"stop4673\" offset=\"0\" style=\"stop-color:#ffd43b;stop-opacity:1\"/>\n", | |
|
500 | " <stop id=\"stop4675\" offset=\"1\" style=\"stop-color:#ffe873;stop-opacity:1\"/>\n", | |
|
501 | " </linearGradient>\n", | |
|
502 | " <linearGradient id=\"linearGradient4689\">\n", | |
|
503 | " <stop id=\"stop4691\" offset=\"0\" style=\"stop-color:#5a9fd4;stop-opacity:1\"/>\n", | |
|
504 | " <stop id=\"stop4693\" offset=\"1\" style=\"stop-color:#306998;stop-opacity:1\"/>\n", | |
|
505 | " </linearGradient>\n", | |
|
506 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2987\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>\n", | |
|
507 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2990\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>\n", | |
|
508 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2587\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>\n", | |
|
509 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2589\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>\n", | |
|
510 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2248\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>\n", | |
|
511 | " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2250\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>\n", | |
|
512 | " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2255\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>\n", | |
|
513 | " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2258\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"76.176224\" y2=\"76.313133\"/>\n", | |
|
514 | " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(1,0,0,0.177966,0,108.7434)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient2801\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>\n", | |
|
515 | " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1475\" x1=\"150.96111\" x2=\"112.03144\" xlink:href=\"#linearGradient4671\" y1=\"192.35176\" y2=\"137.27299\"/>\n", | |
|
516 | " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1478\" x1=\"26.648937\" x2=\"135.66525\" xlink:href=\"#linearGradient4689\" y1=\"20.603781\" y2=\"114.39767\"/>\n", | |
|
517 | " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient1480\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>\n", | |
|
518 | " </defs>\n", | |
|
519 | " <g id=\"g2303\">\n", | |
|
520 | " <path d=\"M 184.61344,61.929363 C 184.61344,47.367213 180.46118,39.891193 172.15666,39.481813 C 168.85239,39.325863 165.62611,39.852203 162.48754,41.070593 C 159.98254,41.967323 158.2963,42.854313 157.40931,43.751043 L 157.40931,78.509163 C 162.72147,81.842673 167.43907,83.392453 171.55234,83.148783 C 180.25649,82.573703 184.61344,75.507063 184.61344,61.929363 z M 194.85763,62.533683 C 194.85763,69.931723 193.12265,76.072393 189.63319,80.955683 C 185.7441,86.482283 180.35396,89.328433 173.46277,89.484393 C 168.26757,89.650093 162.91642,88.022323 157.40931,84.610843 L 157.40931,116.20116 L 148.50047,113.02361 L 148.50047,42.903043 C 149.96253,41.109583 151.84372,39.569543 154.12454,38.263433 C 159.42696,35.173603 165.86978,33.584823 173.45302,33.506853 L 173.57973,33.633563 C 180.50991,33.545833 185.85132,36.391993 189.60395,42.162263 C 193.10315,47.454933 194.85763,54.238913 194.85763,62.533683 z \" id=\"path46\" style=\"fill:#646464;fill-opacity:1\"/>\n", | |
|
521 | " <path d=\"M 249.30487,83.265743 C 249.30487,93.188283 248.31067,100.05998 246.32227,103.88084 C 244.32411,107.7017 240.52275,110.75254 234.90842,113.02361 C 230.35653,114.81707 225.43425,115.79178 220.15133,115.95748 L 218.67952,110.34316 C 224.05016,109.61213 227.83204,108.88109 230.02513,108.15006 C 234.34309,106.688 237.30621,104.44617 238.93397,101.44406 C 240.24008,98.997543 240.88339,94.328693 240.88339,87.418003 L 240.88339,85.098203 C 234.79146,87.866373 228.40711,89.240713 221.73036,89.240713 C 217.34417,89.240713 213.47457,87.866373 210.14107,85.098203 C 206.39818,82.086343 204.52674,78.265483 204.52674,73.635623 L 204.52674,36.557693 L 213.43558,33.506853 L 213.43558,70.828453 C 213.43558,74.815013 214.7222,77.885353 217.29543,80.039463 C 219.86866,82.193563 223.20217,83.226753 227.2862,83.148783 C 231.37023,83.061053 235.74667,81.482023 240.39603,78.392203 L 240.39603,34.851953 L 249.30487,34.851953 L 249.30487,83.265743 z \" id=\"path48\" style=\"fill:#646464;fill-opacity:1\"/>\n", | |
|
522 | " <path d=\"M 284.08249,88.997033 C 283.02006,89.084753 282.04535,89.123743 281.14862,89.123743 C 276.10937,89.123743 272.18129,87.924853 269.37413,85.517323 C 266.57671,83.109793 265.17314,79.786033 265.17314,75.546053 L 265.17314,40.456523 L 259.07146,40.456523 L 259.07146,34.851953 L 265.17314,34.851953 L 265.17314,19.968143 L 274.07223,16.800333 L 274.07223,34.851953 L 284.08249,34.851953 L 284.08249,40.456523 L 274.07223,40.456523 L 274.07223,75.302373 C 274.07223,78.645623 274.96896,81.014163 276.76243,82.398253 C 278.30247,83.538663 280.74899,84.191723 284.08249,84.357423 L 284.08249,88.997033 z \" id=\"path50\" style=\"fill:#646464;fill-opacity:1\"/>\n", | |
|
523 | " <path d=\"M 338.02288,88.266003 L 329.11404,88.266003 L 329.11404,53.878273 C 329.11404,50.379063 328.29528,47.367213 326.66753,44.852463 C 324.78634,42.006313 322.17411,40.583233 318.82112,40.583233 C 314.73708,40.583233 309.6296,42.737343 303.4987,47.045563 L 303.4987,88.266003 L 294.58985,88.266003 L 294.58985,6.0687929 L 303.4987,3.2616329 L 303.4987,40.700203 C 309.191,36.557693 315.40963,34.481563 322.16436,34.481563 C 326.88196,34.481563 330.70282,36.070333 333.62694,39.238143 C 336.56082,42.405943 338.02288,46.353513 338.02288,51.071103 L 338.02288,88.266003 L 338.02288,88.266003 z \" id=\"path52\" style=\"fill:#646464;fill-opacity:1\"/>\n", | |
|
524 | " <path d=\"M 385.37424,60.525783 C 385.37424,54.930953 384.31182,50.310833 382.19669,46.655673 C 379.68195,42.201253 375.77337,39.852203 370.49044,39.608523 C 360.72386,40.173863 355.85032,47.172273 355.85032,60.584263 C 355.85032,66.734683 356.86401,71.871393 358.91089,75.994413 C 361.52312,81.248093 365.44145,83.840823 370.66589,83.753103 C 380.47146,83.675123 385.37424,75.935933 385.37424,60.525783 z M 395.13109,60.584263 C 395.13109,68.547643 393.09395,75.175663 389.02941,80.468333 C 384.5555,86.394563 378.37584,89.367423 370.49044,89.367423 C 362.67328,89.367423 356.58135,86.394563 352.18541,80.468333 C 348.19885,75.175663 346.21044,68.547643 346.21044,60.584263 C 346.21044,53.098503 348.36455,46.801883 352.67276,41.674913 C 357.22466,36.236033 363.20937,33.506853 370.6074,33.506853 C 378.00545,33.506853 384.02914,36.236033 388.66877,41.674913 C 392.97697,46.801883 395.13109,53.098503 395.13109,60.584263 z \" id=\"path54\" style=\"fill:#646464;fill-opacity:1\"/>\n", | |
|
525 | " <path d=\"M 446.20583,88.266003 L 437.29699,88.266003 L 437.29699,51.928853 C 437.29699,47.942293 436.0981,44.832973 433.70032,42.591133 C 431.30253,40.359053 428.10549,39.277123 424.11893,39.364853 C 419.8887,39.442833 415.86314,40.826913 412.04229,43.507363 L 412.04229,88.266003 L 403.13345,88.266003 L 403.13345,42.405943 C 408.26042,38.672813 412.97801,36.236033 417.28621,35.095623 C 421.35076,34.033193 424.93769,33.506853 428.02752,33.506853 C 430.14264,33.506853 432.13104,33.711543 434.00248,34.120913 C 437.50169,34.929923 440.34783,36.430973 442.54093,38.633823 C 444.98744,41.070593 446.20583,43.994723 446.20583,47.415943 L 446.20583,88.266003 z \" id=\"path56\" style=\"fill:#646464;fill-opacity:1\"/>\n", | |
|
526 | " <path d=\"M 60.510156,6.3979729 C 55.926503,6.4192712 51.549217,6.8101906 47.697656,7.4917229 C 36.35144,9.4962267 34.291407,13.691825 34.291406,21.429223 L 34.291406,31.647973 L 61.103906,31.647973 L 61.103906,35.054223 L 34.291406,35.054223 L 24.228906,35.054223 C 16.436447,35.054223 9.6131468,39.73794 7.4789058,48.647973 C 5.0170858,58.860939 4.9078907,65.233996 7.4789058,75.897973 C 9.3848341,83.835825 13.936449,89.491721 21.728906,89.491723 L 30.947656,89.491723 L 30.947656,77.241723 C 30.947656,68.391821 38.6048,60.585475 47.697656,60.585473 L 74.478906,60.585473 C 81.933857,60.585473 87.885159,54.447309 87.885156,46.960473 L 87.885156,21.429223 C 87.885156,14.162884 81.755176,8.7044455 74.478906,7.4917229 C 69.872919,6.7249976 65.093809,6.3766746 60.510156,6.3979729 z M 46.010156,14.616723 C 48.779703,14.616723 51.041406,16.915369 51.041406,19.741723 C 51.041404,22.558059 48.779703,24.835473 46.010156,24.835473 C 43.23068,24.835472 40.978906,22.558058 40.978906,19.741723 C 40.978905,16.91537 43.23068,14.616723 46.010156,14.616723 z \" id=\"path1948\" style=\"fill:url(#linearGradient1478);fill-opacity:1\"/>\n", | |
|
527 | " <path d=\"M 91.228906,35.054223 L 91.228906,46.960473 C 91.228906,56.191228 83.403011,63.960472 74.478906,63.960473 L 47.697656,63.960473 C 40.361823,63.960473 34.291407,70.238956 34.291406,77.585473 L 34.291406,103.11672 C 34.291406,110.38306 40.609994,114.65704 47.697656,116.74172 C 56.184987,119.23733 64.323893,119.68835 74.478906,116.74172 C 81.229061,114.78733 87.885159,110.85411 87.885156,103.11672 L 87.885156,92.897973 L 61.103906,92.897973 L 61.103906,89.491723 L 87.885156,89.491723 L 101.29141,89.491723 C 109.08387,89.491723 111.98766,84.056315 114.69765,75.897973 C 117.49698,67.499087 117.37787,59.422197 114.69765,48.647973 C 112.77187,40.890532 109.09378,35.054223 101.29141,35.054223 L 91.228906,35.054223 z M 76.166406,99.710473 C 78.945884,99.710476 81.197656,101.98789 81.197656,104.80422 C 81.197654,107.63057 78.945881,109.92922 76.166406,109.92922 C 73.396856,109.92922 71.135156,107.63057 71.135156,104.80422 C 71.135158,101.98789 73.396853,99.710473 76.166406,99.710473 z \" id=\"path1950\" style=\"fill:url(#linearGradient1475);fill-opacity:1\"/>\n", | |
|
528 | " <path d=\"M 463.5544,26.909383 L 465.11635,26.909383 L 465.11635,17.113143 L 468.81648,17.113143 L 468.81648,15.945483 L 459.85427,15.945483 L 459.85427,17.113143 L 463.5544,17.113143 L 463.5544,26.909383 M 470.20142,26.909383 L 471.53589,26.909383 L 471.53589,17.962353 L 474.4323,26.908259 L 475.91799,26.908259 L 478.93615,17.992683 L 478.93615,26.909383 L 480.39194,26.909383 L 480.39194,15.945483 L 478.46605,15.945483 L 475.16774,25.33834 L 472.35477,15.945483 L 470.20142,15.945483 L 470.20142,26.909383\" id=\"text3004\" style=\"font-size:15.16445827px;font-style:normal;font-weight:normal;line-height:125%;fill:#646464;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans\"/>\n", | |
|
529 | " <path d=\"M 110.46717 132.28575 A 48.948284 8.6066771 0 1 1 12.570599,132.28575 A 48.948284 8.6066771 0 1 1 110.46717 132.28575 z\" id=\"path1894\" style=\"opacity:0.44382019;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" transform=\"matrix(0.73406,0,0,0.809524,16.24958,27.00935)\"/>\n", | |
|
530 | " </g>\n", | |
|
475 | 531 | "</svg>" |
|
476 | 532 | ], |
|
477 | 533 | "text": [ |
|
478 |
" |
|
|
534 | "<IPython.core.display.SVG at 0x1060e78d0>" | |
|
479 | 535 | ] |
|
480 | 536 | } |
|
481 | 537 | ], |
@@ -483,15 +539,17 b'' | |||
|
483 | 539 | }, |
|
484 | 540 | { |
|
485 | 541 | "cell_type": "markdown", |
|
542 | "metadata": {}, | |
|
486 | 543 | "source": [ |
|
487 | 544 | "#### Embedded vs Non-embedded Images" |
|
488 | 545 | ] |
|
489 | 546 | }, |
|
490 | 547 | { |
|
491 | 548 | "cell_type": "markdown", |
|
549 | "metadata": {}, | |
|
492 | 550 | "source": [ |
|
493 | "As of IPython 0.13, images are embedded by default for compatibility with QtConsole, and the ability to still be displayed offline.", | |
|
494 | "", | |
|
551 | "As of IPython 0.13, images are embedded by default for compatibility with QtConsole, and the ability to still be displayed offline.\n", | |
|
552 | "\n", | |
|
495 | 553 | "Let's look at the differences:" |
|
496 | 554 | ] |
|
497 | 555 | }, |
@@ -499,23 +557,25 b'' | |||
|
499 | 557 | "cell_type": "code", |
|
500 | 558 | "collapsed": false, |
|
501 | 559 | "input": [ |
|
502 | "# by default Image data are embedded", | |
|
503 | "Embed = Image( 'http://www.google.fr/images/srpr/logo3w.png')", | |
|
504 | "", | |
|
505 | "# if kwarg `url` is given, the embedding is assumed to be false", | |
|
506 | "SoftLinked = Image(url='http://www.google.fr/images/srpr/logo3w.png')", | |
|
507 | "", | |
|
508 | "# In each case, embed can be specified explicitly with the `embed` kwarg", | |
|
560 | "# by default Image data are embedded\n", | |
|
561 | "Embed = Image( 'http://www.google.fr/images/srpr/logo3w.png')\n", | |
|
562 | "\n", | |
|
563 | "# if kwarg `url` is given, the embedding is assumed to be false\n", | |
|
564 | "SoftLinked = Image(url='http://www.google.fr/images/srpr/logo3w.png')\n", | |
|
565 | "\n", | |
|
566 | "# In each case, embed can be specified explicitly with the `embed` kwarg\n", | |
|
509 | 567 | "# ForceEmbed = Image(url='http://www.google.fr/images/srpr/logo3w.png', embed=True)" |
|
510 | 568 | ], |
|
511 | 569 | "language": "python", |
|
570 | "metadata": {}, | |
|
512 | 571 | "outputs": [], |
|
513 |
"prompt_number": |
|
|
572 | "prompt_number": 4 | |
|
514 | 573 | }, |
|
515 | 574 | { |
|
516 | 575 | "cell_type": "markdown", |
|
576 | "metadata": {}, | |
|
517 | 577 | "source": [ |
|
518 | "Today's Google doodle, (at the time I created this notebook). This should also work in the Qtconsole.", | |
|
578 | "Today's Google doodle, (at the time I created this notebook). This should also work in the Qtconsole.\n", | |
|
519 | 579 | "Drawback is that the saved notebook will be larger, but the image will still be present offline." |
|
520 | 580 | ] |
|
521 | 581 | }, |
@@ -526,22 +586,24 b'' | |||
|
526 | 586 | "Embed" |
|
527 | 587 | ], |
|
528 | 588 | "language": "python", |
|
589 | "metadata": {}, | |
|
529 | 590 | "outputs": [ |
|
530 | 591 | { |
|
531 | "jpeg": "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\nBoDQGgNAaA0H/9k=\n", | |
|
532 | 592 | "output_type": "pyout", |
|
533 | "prompt_number": 7, | |
|
593 | "png": "iVBORw0KGgoAAAANSUhEUgAAARMAAABfCAMAAAD8mtMpAAAC/VBMVEUBIrIZH6qfBSGwAyWSDiTE\nAym9DifSCyysGCiQISvJES3eDDLMFinYGDDdFyzkGjbmGzGhMTePNjwsSa3JKDQYTukOZh3iKDKK\nQUPvKzHwKjnoLUDFODyxQUTAQEPuNT3kOEDeO0anS0xJYKH2OTf0Oz6fVVY5aN3zRErSXAD3Skfl\nUE2cZmTgU1tGg1DAYV32U1HXXVyVcG60aGO1cSLOcAKfeEncbgD4YVaugED5Z1+1enfNfxGqf3x5\nibPjfACgh168hTKXi3nJfHuih4WdjXP5dGnJih7mhQDvenOKla2ck5Bcqm7wjwDnkQhxne++llbf\niYa6m1/JmkHyioDwmQDZnSe+nZnnoA7Wmpb6nwDyoQy+p3jTqUa5qpD5pgDoqB+5q6v4npH/rgCp\ns834rxD/tADiuDvWs7D+uQ3/wCLiwXTPwqSZ1az+xjWw0rvjyYrg0K722YvH6tL35bX98tT99uEA\nQOKlpqNIh/03dPsAVP1UivYqSvC7vLnn6ebr7ert8Pjw8+8iYvojXvr19/P5+/j3+/4aReoAR/Gw\nsq50f5sMrBcAsBgvbvwGtCGkvvYSTfgANtvGx8QCLMLP0M0AS+3W2NV9qPnQ3Pnd39zY4PY0Wcf5\n29fj5OErZu4yZPIjaPwbPOI8ff0AS/VGascSV/mNsvgAL8yYm5f///9ZcrKUlZstV9NueZ778vFf\ncacaMdHwrqcYPdABN9THyM8IdwW/y+domfj608cpUdQiUt8jSOZjdKBaie3x5cQHjhg1a+336OVv\nh8UAgQzxo56xtcUQML9Marmcu/mAoeUAkw4jljYJQe2kvOv+zETk6fm5z/ogUfUZVuyFiZc2VrJN\nyWJKf/g1c/MAmwgjRrXsysYEpSUpQOcRdyP546X41HgdQsP7zlc/rlHyzGf1uLCssLWPn8rc7+Nk\niNnKzt6JvJUApRP2xr/g4el/hpoJbBf9+eq14cGJ2JWXm6oAcwwNM7UZuRego6hLfk8+W6gDnxBS\nZZpfieJCd+r6gHrQAAAYHUlEQVR42u2de1xTV7bHMyBggURaZSxoVVT6sDqiTsdqrbQztkUdsQ+p\nVdrS1sKo9XrnYecEkCQk5CRBSyEhCQQIECA8FAHBkQpSwQeoRYGUIULVaq223lrqHcfrtcLnrnVO\ngDzOCSrMZ1Dv+qPtxyY5+3z3b6291tr7HDkl96dJ//F3K/tv8k6+y7lPifwP2qeffgL2w/H/0omH\ni4ksPqM1uTCtum7r1q3V1WmFJ/ZmxMvuASLfIZFP+5icOlQs0EmHhUl8+tE6c1JurkSSACaR5OQk\nxcTEdNQdO5EhG+lI/v7NN198sZ1mcvzQ/yZq70gmLEzi0wvzknITjLGxKSlx+XH5+XGalFhjgiQn\nqR7AbC3cGz+SoYh1KoFA8NV2ZHL80D+L1XeGhJFJfPLWmKSE2FiNonZfZsGOHeU7mgoya+RyRVyK\nUZKTnVRfn20+lkGOWCakWAT21fZPPoVY8ref+PqSoTKJT46OyTXG5strCnZ9yU8UCFRogovXyjNr\n5Yr8tgRJdlJ2do6kZ690JIuF3L4dZPLzgb+dSRQOkYmsdWseaCROk7lrZ6JArROKxJSJhHqt6uLB\nfYRcoTFBcJEkGDW9l6UjmcknyOT4oTMC0dCYtKRFx0hAI6Xb+AK1XiwlbSQp1O05WEM0K9pMgESh\nIGqPiUasB5GfDhMTEElMQqy8srxYoBVJmTxVv6eJAK3ExSmaCYNSWfojeX8zkR0FvzGmyPd9yVcL\npWzxS3epkiBOnzYYqiqKinaoxCOYySdDZhJfCEhi84n2nQJneR8pPFJqIJRKIJJ6i6++r5nI0hBJ\nHNFeLNA7dwjxnkwgkpqaup+vEpH3MRNZ4dZoCxLhYPcp1RYAksb9I1cl1LrzySfbh8QEYkl0jDGO\n6Nw5OBKA8n1RauOukYyEZjI0nSRvjc5L0BCV3YM5DmXpFUXXt41oJMPAJB2Q5MYSRDlfdxtIZKUV\n57bdaWX1b2Lyt7tlEl+NwUROdN5evZSRfOSGYGQjGTqTo7TnVO0S3FZtQIq0WuGIrnaoegdj7IG7\nZZIRjZ4DMuFrb+9OSSlZUnJ/M0mLjo5JiCOq9t/x1+9bJunRHZRMzu1US/+fCc2kMA8qP4gmNxP1\nwzemsoasrM+6uj7Laii7vS9c/fzs1xfOnzx5/sLXZz8fum/STE45YVLW8Nm3uw8f3n0lq8yBSUt0\nXh4uOhXbhq2gK7vywctBM8CCgoKenrXq24bBbvHqlgubN/bZZrALWwaTrKwlvbU1OfmoxQrR0tJW\nrqw+0dLHZDs7k7IsaoRBtK3qKrNlkpyXZ5ag69zQDk/kzPrg2RmB06f7gQUGznjyyaAnA1Z1ObvF\nq38+CUQiI997773IyA0bLGTOip0Mp6U1ra7DnJfXEQ3WkWeOScqRGDUKhYLovRxP9jH5gYVJ2ZWX\nZ+AQwWCAQUFPPvn0FakVE1l1HnYICOXY4XGdrFVBM6b7jZ84e9682XMCfPz8Jz8JNmFOFtsdXj0L\nRCIj33z9pWI+/92333jLgmXDyc9ZQMpaq5NwQ0GSmxsTA1wASW6CMQWAEKXLBFqRhcl2NiafgUSm\nT5/4GIxw4ni/QGqAk+f0i5lTkgHRJKlNQVRNG45Vp+zwQiAyZd4SfiI2cgWrJ/lRVCZMnrCGed4/\nPo9IXnmJL1Br9Xq9Ti14JzKKhrLhI6avyFqjcxNi27KfeCKnLdYoyY6JQSQ1vr6Vlef2F1uQAJMf\nWJiUgYynT59Ej1Dw/hw/fxTzZP/JfVrmlCTHxMTgqlNVPgzhJGspXG/87OWJKq2QauPq1aun+PhP\nnjBhwuQxc5hKqbMnT26MfOsFuBchFVhJqUi76T2KyoYNUX9wLEhbVsJwfZu6+YmJideaNG1tIBfw\nm4LiG2CJ/c0wmslxRyYNOMQpc/GCOEKhdvUUnLTJ/j5TLFA4JdUxMUkYTqp2DX0lvvIyqGT8XL5K\n3z/BUqFqoo+PP0AZ4xPgGGtpJC/x1VY3T4o2vRcRtQEsap0DlNatMZLYzC/5Kp1eKNRrj+yLy481\nouMUqHV6/UB2jUx+YNBJlmWI6r7ODylcDxqZPHmMj89EetI4smhgkpACTLqHHGKv2F+PbkGpA3x8\nxkwGJj4B9hUmINkMKuHbFU/iTeERUVEboqLWRbxjC6UVM+7MYoGOhk6K9pTKFfkpKfkKosfmk8AE\n7NQhOyYWJDYFrHg9uLe/jw+PN5v6CU5LUlJSrlFDEFXLdENk8hl1vccdegjSLk+ezxgwHy8799mC\nsSR8gWPXQfzHcFQKMIn4SGSjko6kWNOXVg0N8WWTHKgo5IThoPUnSUTyw/FD/7RhUrb05Wenj59q\nV8OI5/gDEq6Ht7sAB8JJp5jEAZNruiHGkpfxehOXO4Yl8RqeD0Lx4XF/Zz2ZEF5PbnxrUTFDIBO9\niUpBJuGbBv5vxlYsQppsGhrSEwQygTWn9ojV75BfMTE5jNPm7TDELh9A4u3u7jobYXNac3NzJbHw\ni5XXhrYUl63C63FnMvXpxLO4FBMvD8/1A8O5egE9J3RBIkPsJT8Pj1hHMQl7s9+nZdXRkF1qum1v\nSVynUORTUAqsWDEygWkLApkk2ntEw3ieh6e7q6vraPxpztE+JlVDZLKbksm45UyRmuzieoFSfHge\nHpMGxgPB5OTG8NCXGNc76TsRCAWYrHhb1B9MUCY1drkledkXIgpAMVRZCYWJiWXa5jpcsGw8F5CM\ndnEZvVoITAqHiQlMwcIZftzHmBM/6Rxg4gM68fBc3TfEq+cpmSziM8d2FMo61MmKVyzeT8tEXmp/\nCWkPMGmDiELsGABOMfnZlgkEPGraHC64ChzH1cXF5aG52EDipEkgIUQmxLIhxRPw1KDA8d4zBcxJ\nznoehBTUieekvhHhmrMxMvRFlvRZ+ocICkpYSMi79F215uVh/Z7pkFvuVeS3teXLDUTpgAKYmKxa\niIvAOLuDBmXfBvEQyahHl/Op0ztWTBYPZS1uWAjX8+N5z2VJcsoCUCg8Lrjt+/S4SZQJuM6LbOnz\nWQuTFSFv0CNLw/o9hch0wC6rB53kg04qL4oGmPxszwTG+CxIeaLNQYOsVbAMe7iPfmguP1FFr/Cc\ntIQEYJIPTMqHkrN9u3BhEFzPcwkb2Ne8MJ5wPdzc59EC/xiRbAgPWcCWPosjKSYrQoIXUR+hMilY\nIR2ZkCtBJ+A7VVb+z8DkCjKZzptkHXSXAhGe9+jHQSKQ19Jj5xTi0SwKcoFqCEyWPku5jvtytiSn\ni+c1ZgzPC5g8TF8HamF0HXYm5B8svhMc/C7OLJVJteUT+xyF1ZoCTBSEsmLA/x2ZQJ3zbFCg3wCT\nsisLAyEv8Xxs7vI+idBMko3AxIhMSodQ7zQEBUGpSTFhW6oDIG+jmLiuFlMRdvMgTEr+vM7CZP7r\nSDo9F5iAomsuOjBpMQITgqgoWtYvU0cmDS/jGP15E+k/aPggCIjwxtlIhGbSajRiuWDrjHdsXXC5\nGX7IhG3xIucAEy9g4uo6D2f9rygTYBLMzuTzfiYL8FZbJbhCxslrHRdIWXZbiuI0UZHa7YRJ1rPI\nxIdmkrU00N/PhztpbrGNRGgmGbFtQCWFCrJ3vxjvnjFjRqA/MFnCunitgaWYZjIVr/Pxxs0YTkKD\nX2RlIo3sY/IihrpWKvJp5MRiR//swDtQFjXu1Dlhgp2/6X68cQL97imYGYybihLRO/QjOPEShJKC\nq3vB3S88HyAT1MnzrEVTl9cYZALZ4mP4mS1UhyQ8NISdCbmZZjJ//q/xM+kwd8Y2YFLguBjUGaEI\nrCjq5DuJsZ9hM9TPjztu3pyAWXNmz56JUYTp5BGH7E2JbWsDSRLEvj13HVBWBc4IRCaez7FybRgD\nUHiYQT+stWayiL2Vdd6GCTV74CPymiMO46xrA9cpSp02sMwyMwkEf/F+Xq1V4dFFBolY+ifH8lNi\nY2MxNSYu3ZXz4BHipZMDaSZTWRf0soAxwASTIysmEcCE/Vzi1/RabGFC9sai5cvljk6+tQ1lktpt\nnbM5MAnEMQKTeWqhUCQSi6Wsexl78yHhabM4z2CrcfrKarCVlFX39NT19j5R2gpfWgqX8/cb7+H9\nGPviFYC+AzpxecSKSVhoyLusM3GWYhI8/ynav45q2mD64uLkpfbgZWZYJIpSx1qVCQzxJHA6DBKY\nTBokEeOUxJugqkxJwZZ37RHRIERy0LLrzebeXnN9do3GYFB+r4YvrfL3RyZc74nsnjALmHDdoKx4\nHEf+OfbRNkQCk9dZ3Q2ZrEUm9NrUYsqHkWriFPJLdtJqSUCZNHZbXZz86pQ9kxl+/v7AxMNzkMYz\np4TswVI7BbsyRJOztlJGta9GI5fLNb4mpGLONtUalMpyqiF0GK6Ga5un52pWT5hDL8UuLjN11LpD\nMcEgyzptWygm85966gXqI+RKuUKuiFNARNlj+5XkNpTJrUSbXoE9k4ankQlO3HP6wfYB94JEqAaE\n4rTvEVbltxSaNDU1+/aVZmYWNDWBVupzTAZlRXsxdaTtip8fMuF5ez/HinUpMnEf7TJqCQ7p6ubI\nqA1RkVSQZbvolihgEgJMLJXsjzVyNBjpEzZXiTfng0ym2bTrHJmUraIHyfUYxHmAibSegoL/sOnK\n2DHJ2LPn4o1EMIFA8KEpJxs9R1l0iz6d0eCPO1xQ93o/xno9ZOINMnmEHuSFyMioqEinAQWZhIHr\n/NqyxJIf1kIaRSAW6+arrNqoIIqmweyUOGNS8i0MESeO67FaNNh+cTKFHpxHTsg/ZP20VKQHE1Ih\ne2+tqabGF5AU7adjKvk05EB4Oe++spfRd6hwYmnpbImIiIyMjAgPDX2DLaCcjYIQCzJZ0Hdb4kvI\nxEDAeHv7Tyu3VEsURNUtuzOYyOTnU7Z18XgYox9W55OcZmIcSpKnmxUW27eHVVZWP5Mur/X1JfBA\n6H6LLF7zoQyEwuqsEGM93F1cRlkcQfpeREQE9oxCQ9nWqq+jaNf5bb/2RJcopYBW8nNOIBVZS3J0\nroao3Ga3WYBMfrZjghPnB0XfGB7XqVCQCXkML4JEQJU9t3XGj9Bo0HNS+5lkcWkm7M5aFgArMcjk\nUUsPifwoPByoRISHhb7OgvF81LoVwU+h6/Rn7KIjmRUVVTBeRazEXJ2WVh1tTjIqKrsdTtcxMCnZ\nPYZSsw+PN85ZRKHO5IhKDQYaCmC5dBuVYLq8j8kuNdlX4vFoJmzOmjWBWnVG9TfN//oWDSUs7E3m\nEZIb10WgTGwatmLtsvbKKqASl5Bk7ojuMCeZFLXbEh0yq34mPw0waeDyLHLmzXEy9RQTci/4aB+U\n2g8Hz/AzNBpfC5M+z+zicrk8MBAKs7PuBia0TPo24D4KCwunhBL2NuMC/nGfTGwCv1Sovri4qb20\ntLSg15xnjpHkEzcZzpwxMSFf4/F4FihrRM6ZlIgPEgNKMQ3+sFIGhBM7JtLZHh6IhcsW1WfRC7HV\n3orozVCgAhb2FqNQLlDR5BmH3RipSKdWCWAF7K2PicmBNYfp4AyT75Q0eHL7pbJe7JxJyY/gPQbC\nEmlNgz6rlOHr61try6REP86DosLlTWS6Q3AdiCaj5lpt5pB/Cl1hofIOg5RRJug5DNs/pFQsEgr3\nJkiSciRQKC9jUCYyOWXPhFyDY7RQWSN2zoS8XINrHEFDqRlMKRkmkwMTcr2ntzdNZTbDHaJMXEY9\naqNy8R9DQkKACmD5o6O2Tq5bC7nJb9jPYp4wJkgkpji5oZyZySlkYrtfLJ4EY+zTymtMZXHZwNly\n6YeVSqUStEJB0ZwQ3wYTWIo5A0xKxGvc3Dw9KbE4Outh7Jy4PGK3DSp6B6CErEAom8QOnUf0nAVO\nTrCfaDOaEoxxCqKGIYGwMDlge7acbBjnCWPkeVFUZjmcE2o4DH/U/1yG+MPKCoTSDA4kj9N87/QB\nrgyLTDjWTEpEv3N3d3OjtGKvyyteXm4UErskQvhGcDAFJSL8T2ImJLbJqd22TpvR6GvUQKH2hONo\nKSbHjwMUm14E2eVOzRzXCzcmJyy1oZI1i7teJLV6fgeh0FQAikaT7cx/MkwWJDZMSOFzrkCF8qDX\nyqwvdpiLSB4tVtnvJZP6V4NpKhERF6x4/fU8Ipn/G6cPCMXnUI03TCCyHULgdz9TRA4cOP57G08W\nr4cxuuPMeeFOwoRZh7saysCyriyd4uGxHs/BWD3nJT5yrqiPCkDx7WF/hDgDkFSk2jMBKKtHu7q6\nu4EDcQMGTvVlzcLMZNRcvspxe50Ublo0f35wyIoVayMi/3yV/v8ffx0VAUh+/dtEtbNzfuTKNg1V\nu4L52nv7P746APH1p5/O/PPAN//4j//+y3ffWcYjVuEYYZAQWAALcgkICJgA9amH+xJ6H9Aa4Z6C\noiLEQlPxrenZy/IYfoYB83qOPRNIM1VTXcGQilcAzEBDQ9fhWVQX9pHlzDdIitSvPkNRCQMqm89/\nfeE8pGprVwQ/80KxYJB3L/xoQo1YqpLvbYD/5asvzvz0SzCgcgjU8sU3/9nnhGI1NUbEgpMHXHjA\nw83NbfQSOvWzeW5UqlvciFTouAJUfHtPtDhiiT9Rb1HJL36xyy7ki3XvT7XMA/osF9vSIJKHl/BV\nehZnlOpVr1JaCVmxdi3kcGvXhq0IeeWF4kT1YE9XkXs1loowLk6hsA4q0m++OPPLATtz5leJatHA\nBVePchk92pUi40aZu6ury8y+dz1w7JS8p6kxtR8LelBN77ET/a+zkMla0pN7TNQqDEiud968Zr8M\nkiLt+4+PcqGweEOM93Zzf5jaVmL3AlKsU727YNEzzwTjKhQSuuiVV3/LF6idPfmBB4aPrqzrrcUE\nwnAaVkoIK9mX+y8h/f3vf2VjxdZTAtpc8rALZTQZV5eHZoKOLbGL4zC8IzcbU1NTLVhoLr415t66\nHmy/1lMLDvoN8Ni1k5/IEAOlIq3q/ecfn/ow2NSpj89djs+zi51OOSnWaze9/eqLlL3+9vsqNeMm\ng4VHenK1OScBN0OJKiVUhEoKCiilZiDSSoU6G7Nr0UOBIHj+0Ycs9sjM5dZzwHH0b+3F8k4LFpoL\nbQT9LyW4zbn2W9t28gUwciHjveIT61oVvlxCAB/S6kW3cXyexMf/dVownV4oZv2CLL2wIyfBCJH1\ntKGy8ty5zs7KIgyAdEwpvf23BUhFetzRoJtkKhyjfR5rS0WnulY+9noqxQXJABo0+I/Kc2Nv7u++\nkYi/4mTklvRbRO0Y3MFGGonmbNuktTomxxeAVGY2lXdfu3ERbuhGO0AhqLqEMDxxJ+cU8f0XQmyS\niW1nlsP8YaFWdXHZ/mntYzuvX29sbLx+rnNs+81bu7p34uFjtU4vEv87HmpKr85LSshXEJn7KZWi\nosC0iytppTQ3GwwHhUMfGIedoV6rtogr0aIw9AOg+m96yEuWHG3Ohip4H75fQjegUnwwHnwcpALu\nXblH/C9jMlB9CvV0H/ZO/WDYkRRG5yUBkps7Ey3H0AfmT12gJOiIpzyoJ/+VTEaWFUZ31PvKiWnF\nDImOVNdErwZKZefQn3q+Z5gkR3eYJQpDezFjBUTqD9JMKiqPiB4UJhkdHXk5+YbKLwXMRSEp7EHn\ngdRpmf5BYZKWl1efICfaWZ+TJ3U1qJOiosW6B4RJS4zZnKMhlPtZ91FLyEsUk9RdQ3685B5hklxf\nnwTRpKLbyb5MS60BW3/bHhQm1Tk5OSaFoWqZkxsmsykm13QPCJNeiUQCuYnS6TNGvdjoun7jQYmx\nZpPJpAEm+7XOmRSl3rzjV9TdszrRtLUBE0O7k3giy0Emw/Dg+D3CpIdqBRAGZ6fL0uWGCpsjbfc5\nkxPUERmAwn5oqGQlyKRx2zA8JH2PMIk3GaDsBWtmbQaka4iK1FvDIJN7hQl5jMCyt5lobmZ5x2RL\nPcikvXg4XkNxr+T2olIltgMMzfLmOqYtyhYzILm9F6ndN0zIy+ew/UngzpPpmD0VWTLuJYzdKdAP\nR4PnnukVSC/voxrDEFfkGlNdckbf659lLelp2XKDsvJW8fAguYd6SpZdSqDS3Cz39TVl9/bgCfc6\ns0mDPYKxXzJtvd7nTEqkumWd/Xu3uO+EJm+mOkljtzndVbtvmZSQQvWy9kabfSfcYak6d7Ob3/fa\nkweNCe70qi8untZ5ndq/LSpKbbze2V7efSNRpRUN4xvD7rW/G0Iq0quPLC7fcfNme/vNph2Ll11k\n3Y18YJggFrFIT++ianV6/b9gu+le/TtESHKwfdS7t/8Dw4+o6YNxgfwAAAAASUVORK5CYII=\n", | |
|
594 | "prompt_number": 5, | |
|
534 | 595 | "text": [ |
|
535 |
"<IPython.core.display.Image at 0x10 |
|
|
596 | "<IPython.core.display.Image at 0x105baf950>" | |
|
536 | 597 | ] |
|
537 | 598 | } |
|
538 | 599 | ], |
|
539 |
"prompt_number": |
|
|
600 | "prompt_number": 5 | |
|
540 | 601 | }, |
|
541 | 602 | { |
|
542 | 603 | "cell_type": "markdown", |
|
604 | "metadata": {}, | |
|
543 | 605 | "source": [ |
|
544 | "Today's Google doodle, visible only with an active internet connexion, that should be different from the previous one. This will not work on Qtconsole.", | |
|
606 | "Today's Google doodle, visible only with an active internet connexion, that should be different from the previous one. This will not work on Qtconsole.\n", | |
|
545 | 607 | "Notebook saved with this kind of image will be lighter and always reflect the current version of the source, but the image won't display offline." |
|
546 | 608 | ] |
|
547 | 609 | }, |
@@ -552,40 +614,44 b'' | |||
|
552 | 614 | "SoftLinked" |
|
553 | 615 | ], |
|
554 | 616 | "language": "python", |
|
617 | "metadata": {}, | |
|
555 | 618 | "outputs": [ |
|
556 | 619 | { |
|
557 | 620 | "html": [ |
|
558 | 621 | "<img src=\"http://www.google.fr/images/srpr/logo3w.png\" />" |
|
559 | 622 | ], |
|
560 | 623 | "output_type": "pyout", |
|
561 |
"prompt_number": |
|
|
624 | "prompt_number": 6, | |
|
562 | 625 | "text": [ |
|
563 |
"<IPython.core.display.Image at 0x10 |
|
|
626 | "<IPython.core.display.Image at 0x105baf490>" | |
|
564 | 627 | ] |
|
565 | 628 | } |
|
566 | 629 | ], |
|
567 |
"prompt_number": |
|
|
630 | "prompt_number": 6 | |
|
568 | 631 | }, |
|
569 | 632 | { |
|
570 | 633 | "cell_type": "markdown", |
|
634 | "metadata": {}, | |
|
571 | 635 | "source": [ |
|
572 | "Of course, if you re-run this notebook, the two doodles will be the same again.", | |
|
636 | "Of course, if you re-run this notebook, the two doodles will be the same again.\n", | |
|
573 | 637 | "<!-- well actually I cheated a little, by setting Embed Url to http://www.google.com/logos/2012/doisneau12-hp.jpg then editing the ipynb myself and replacing it by the other url -->" |
|
574 | 638 | ] |
|
575 | 639 | }, |
|
576 | 640 | { |
|
577 | 641 | "cell_type": "markdown", |
|
642 | "metadata": {}, | |
|
578 | 643 | "source": [ |
|
579 | 644 | "### Video" |
|
580 | 645 | ] |
|
581 | 646 | }, |
|
582 | 647 | { |
|
583 | 648 | "cell_type": "markdown", |
|
649 | "metadata": {}, | |
|
584 | 650 | "source": [ |
|
585 | "And more exotic objects can also be displayed, as long as their representation supports ", | |
|
586 | "the IPython display protocol.", | |
|
587 | "", | |
|
588 | "For example, videos hosted externally on YouTube are easy to load (and writing a similar wrapper for other", | |
|
651 | "And more exotic objects can also be displayed, as long as their representation supports \n", | |
|
652 | "the IPython display protocol.\n", | |
|
653 | "\n", | |
|
654 | "For example, videos hosted externally on YouTube are easy to load (and writing a similar wrapper for other\n", | |
|
589 | 655 | "hosted content is trivial):" |
|
590 | 656 | ] |
|
591 | 657 | }, |
@@ -593,43 +659,45 b'' | |||
|
593 | 659 | "cell_type": "code", |
|
594 | 660 | "collapsed": false, |
|
595 | 661 | "input": [ |
|
596 | "from IPython.lib.display import YouTubeVideo", | |
|
597 | "# a talk about IPython at Sage Days at U. Washington, Seattle.", | |
|
598 | "# Video credit: William Stein.", | |
|
662 | "from IPython.lib.display import YouTubeVideo\n", | |
|
663 | "# a talk about IPython at Sage Days at U. Washington, Seattle.\n", | |
|
664 | "# Video credit: William Stein.\n", | |
|
599 | 665 | "YouTubeVideo('1j_HxD4iLn8')" |
|
600 | 666 | ], |
|
601 | 667 | "language": "python", |
|
668 | "metadata": {}, | |
|
602 | 669 | "outputs": [ |
|
603 | 670 | { |
|
604 | 671 | "html": [ |
|
605 | "", | |
|
606 | " <iframe", | |
|
607 | " width=\"400\"", | |
|
608 | " height=\"300\"", | |
|
609 | " src=\"http://www.youtube.com/embed/1j_HxD4iLn8\"", | |
|
610 | " frameborder=\"0\"", | |
|
611 | " allowfullscreen", | |
|
612 | " ></iframe>", | |
|
672 | "\n", | |
|
673 | " <iframe\n", | |
|
674 | " width=\"400\"\n", | |
|
675 | " height=\"300\"\n", | |
|
676 | " src=\"http://www.youtube.com/embed/1j_HxD4iLn8\"\n", | |
|
677 | " frameborder=\"0\"\n", | |
|
678 | " allowfullscreen\n", | |
|
679 | " ></iframe>\n", | |
|
613 | 680 | " " |
|
614 | 681 | ], |
|
615 | 682 | "output_type": "pyout", |
|
616 |
"prompt_number": |
|
|
683 | "prompt_number": 7, | |
|
617 | 684 | "text": [ |
|
618 |
" |
|
|
685 | "<IPython.lib.display.YouTubeVideo at 0x105baf9d0>" | |
|
619 | 686 | ] |
|
620 | 687 | } |
|
621 | 688 | ], |
|
622 |
"prompt_number": |
|
|
689 | "prompt_number": 7 | |
|
623 | 690 | }, |
|
624 | 691 | { |
|
625 | 692 | "cell_type": "markdown", |
|
693 | "metadata": {}, | |
|
626 | 694 | "source": [ |
|
627 | "Using the nascent video capabilities of modern browsers, you may also be able to display local", | |
|
628 | "videos. At the moment this doesn't work very well in all browsers, so it may or may not work for you;", | |
|
629 | "we will continue testing this and looking for ways to make it more robust. ", | |
|
630 | "", | |
|
631 | "The following cell loads a local file called `animation.m4v`, encodes the raw video as base64 for http", | |
|
632 | "transport, and uses the HTML5 video tag to load it. On Chrome 15 it works correctly, displaying a control", | |
|
695 | "Using the nascent video capabilities of modern browsers, you may also be able to display local\n", | |
|
696 | "videos. At the moment this doesn't work very well in all browsers, so it may or may not work for you;\n", | |
|
697 | "we will continue testing this and looking for ways to make it more robust. \n", | |
|
698 | "\n", | |
|
699 | "The following cell loads a local file called `animation.m4v`, encodes the raw video as base64 for http\n", | |
|
700 | "transport, and uses the HTML5 video tag to load it. On Chrome 15 it works correctly, displaying a control\n", | |
|
633 | 701 | "bar at the bottom with a play/pause button and a location slider." |
|
634 | 702 | ] |
|
635 | 703 | }, |
@@ -637,281 +705,284 b'' | |||
|
637 | 705 | "cell_type": "code", |
|
638 | 706 | "collapsed": false, |
|
639 | 707 | "input": [ |
|
640 | "from IPython.core.display import HTML", | |
|
641 | "video = open(\"animation.m4v\", \"rb\").read()", | |
|
642 | "video_encoded = video.encode(\"base64\")", | |
|
643 | "video_tag = '<video controls alt=\"test\" src=\"data:video/x-m4v;base64,{0}\">'.format(video_encoded)", | |
|
708 | "from IPython.core.display import HTML\n", | |
|
709 | "video = open(\"animation.m4v\", \"rb\").read()\n", | |
|
710 | "video_encoded = video.encode(\"base64\")\n", | |
|
711 | "video_tag = '<video controls alt=\"test\" src=\"data:video/x-m4v;base64,{0}\">'.format(video_encoded)\n", | |
|
644 | 712 | "HTML(data=video_tag)" |
|
645 | 713 | ], |
|
646 | 714 | "language": "python", |
|
715 | "metadata": {}, | |
|
647 | 716 | "outputs": [ |
|
648 | 717 | { |
|
649 | 718 | "html": [ |
|
650 | "<video controls alt=\"test\" src=\"data:video/x-m4v;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAqiW1kYXQAAAKMBgX//4jcRem9", | |
|
651 | "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTE4IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv", | |
|
652 | "cHlsZWZ0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w", | |
|
653 | "dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o", | |
|
654 | "ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2", | |
|
655 | "IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0", | |
|
656 | "X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBu", | |
|
657 | "cj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9p", | |
|
658 | "bnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEg", | |
|
659 | "d2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBz", | |
|
660 | "Y2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9", | |
|
661 | "MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89", | |
|
662 | "MS40MCBhcT0xOjEuMDAAgAAACqVliIQAV/0TAAI/3gU2tIW7KawwaCmQGTGHKmuYAAADACBcshU+", | |
|
663 | "yICkgAA14AHowiEeT6ei7v7h3Hu0i2fpUBLGBIkbCMP3Vfz+9BVGCDXnw9Uv5o3iN030tb7eq6rs", | |
|
664 | "EEhHs2azbdTiE9Csz5Zm6SiUWRdmB43hbD5i6syATuODUJd7LM3d9cbFpc7zFlu5y3vUmNGd6urp", | |
|
665 | "vKKT9iyleIyTuR1sVS431DhevGfkUllVeIznYUe2USoMW1tufETjyRdmGldN6eNlhAOsGAH4z+Hk", | |
|
666 | "rwKecPPU7Q5T4gDAIxj9hW84jVExMTSTHxkPTq1I4OotgUxURCGTsw60k/ezPNmNg38j1bqaGmPc", | |
|
667 | "ruDKEIBDsK5qEytFB90Q68s0h2wmlf2KXd5bleBefiK+/p47ZsyUO4IdlW25rRy+HLjt6wQXfYee", | |
|
668 | "3IkiQOoOK+U7u/lxcl78zfxwIoEMjUUSKNZjkp8clnmecDDJ3Kz+viF7bPklk7N6QRyizAKPIIpn", | |
|
669 | "NJUuMWQmqeL2Or6cr4D0/0tOym+4tficxmhuEONKUtO2pPn3hRjMllkd12tXp70fLTfxy0dwB70M", | |
|
670 | "L9iLEcItHb7zVupHlP5RxdvecpREw+OsIPr9KWilIesNE19jgIbT+TkiRBjOoKvUuwcQnKg7fOTH", | |
|
671 | "VoLvnKuAfea+oujEdm1Rwd2tEOnkF+ZC11WaNQsiNR/eJ9EnUXjXDYGfhB+Oe7qj8nYTT+eOXg1c", | |
|
672 | "uJNgLXEs4vOheWEjQOqfIWMQc3DmTof5s0ksBmUQ3PQ+UHPxZSnmOEZB+j6xT3wbm7HGzDjWtSg1", | |
|
673 | "SjTxd1EiJ8xA4SIxxR8WIKLg+TwFxJNS7Laxq7Uglu3AkXe82P1JCdJX5PsbFbxuDbuJgakzRcTw", | |
|
674 | "MLLSKCiizS/eCW0uJed/lev9yb80kKlVET4S219cn/zhkpeDV83cHYOr+sJQKDRk/Wh2c7fsuxfx", | |
|
675 | "aEH/6reSmvFDsAnXAyPXliJ3G4VG3OkEM5K5WyGGrBizZbTrdGsBnzj5VSGGOJdCKuRrUluw/8es", | |
|
676 | "2vYRPs9BcTqAqvHk9M52SSIf+1T6L53EZP8VbtXB+G29CMW4xVCK/B/YDjaNmqMwJ61dapugjnWJ", | |
|
677 | "fqeXlGGa3Ch3aA7gi30T8PucNRBjLK3lF67ZDDvkWXRQXd+VMnKWHkBbCkQ/F/fMuNpHO3C00Y2p", | |
|
678 | "ljna1qImBhVMvPe0F7Qx7G/YyxLRzhyUU8e23HGzp0agtNJRbydbrPV+TqJMSifJMNcZIf8wkdnC", | |
|
679 | "3/xdpcXnLf2Ye3Kbd0o7utciTG+q5h6WTEk+PaNbXLLA0YyZ2VnLTcyV1QTS76aNCbV9Q1/OQ7QU", | |
|
680 | "81Gg0hPa9aSiscGary6jLVwDQaik4zLsi7jPqgPVdup7pwx7uJDqRCVcVi5QoZFp/GHdex5sJTF6", | |
|
681 | "9A6sja69/NLkFIWNSIeRcuGahXpF+wZeYIrqJv975s1TKYKAvp1WtzgtgWNkcbzCtROqf8rPtlAI", | |
|
682 | "xkX8GLcEo9zfExyfimeXQ64qfFxEy0IMy2Hsxau9fSMqUnIjntuVVjCQtBL+94gx1RZLndE6wROV", | |
|
683 | "Tq/wHwHrQzo9QL9cpPqPFJjiZ/NGZIFuudS+wsBFe6Hu8Oitf5zToLqLdtU4Smwh4ne3JsiT9lOz", | |
|
684 | "N+4PPw3VSx9l5FppVwdKUWELw1dYpCOppyVWlJ3YQ8H4FQQM8EcYMG9N3Bxu79y1J1ikuvuhMmLQ", | |
|
685 | "lehLTbguhbix74hd1VIQC8EjHmOZSSWbssulYwPbr6FF49tifk6PymJvulR9/u+2585HkRfbxveG", | |
|
686 | "eWCz0ix1pIVfaNpESKmtLy/0mcbMg9hYDz2werz9oe0lT2BiMV6uAin6RaQcT8Vk9MPctfwae+gk", | |
|
687 | "vtnZA/sOBk8MbpylaHqc0KIVHhhLFMNnkOFiucjtGo/JWTa/F6g8wWeow5ZuIJUORaYHWqegZbTg", | |
|
688 | "M9dCsYYsfZGjjVMuSlDIvpYvIvFFooGPC7Ye2Jfawmq4Ut7EL/nv/dyAd2HRc5msmUhzeu/XpX3r", | |
|
689 | "VlzRmf9/Qan8Dbve3QfW1Ym0o5J/KAc3z1VBho7JBr5PgCL68RiD9jZHN0VvsT4gzsEjNlW3D91U", | |
|
690 | "y4RduaodBFoNTzXwlfUYULBzdiTbH75l/UmVMC4TKeTWhNzw2UezaqeGd8at3WSY7W/VR3+hvZHD", | |
|
691 | "pkIjgKuNNH0DsCRa/Kk56XQoHIyvvUH/eNekNvziReqS4qgLnXUT4BRGt2BOtCifI6+X/DGHUOmW", | |
|
692 | "lX7TN5b4pw5U7jwfwshtbhGZM49T8JMk15Mzrc7tM6J11TYxb5R3mQhZ8TZumJ0bMJXPM69HFyih", | |
|
693 | "r5dJSEJMycxJVUh6NTQALUOoRTHIOwE+FpWI6feTv1SiZ0YpYe5DbkYJJbN7zAHbAKw25XvqR2mA", | |
|
694 | "jQmOlsfX/tK8DPjP/8h5/xgAF4EUbj1tOnQCBQL8jk9vHtfsXncsprww4Z+P/Z/UrKifuFyEpBWN", | |
|
695 | "8kLpF7yywE2iYdDruV9+/qKR8rC9ozNKyqQNIwtxrzYkWpE5t8K7gG4JFnrHona/Rp8dOX6VW41+", | |
|
696 | "jb5LB1LEtE8MwjLp3RCUOq/+6yLzaOEgBTqzvEjDeFpg/u9DMHMr4/2TOchfjg7dl+uQ6Gsx+4Ia", | |
|
697 | "9W7vivG95027p25eKL0nHvx/OqmAQEZYJL/JO58lOj0zPdJxrQ5dZksjMISzVZNn7DsxqE3zgBBu", | |
|
698 | "Nzk50R8lTK3U8P12QiOAQYSTeGlYlkvfeofrfO1AitEj02m9aUkxTFd1ZZJoLQT2d3zEU5PmE4lx", | |
|
699 | "MVfL5ttNnIbqfcIU2RJKNWqdw77xfjfrNc/eNpRKPZ/6z50LzBprgjzBHRfKgSWWkDxHrX0aTbgw", | |
|
700 | "QFwd51+PoUWH4DkQg26uGslF5Hn3hB58+fkeLTosTANOIBNAeFZtTc4PIaLHw759zae7scY55xcT", | |
|
701 | "abzlilYIftst2RZ6ntsRC3zFxduCKvL6wLfYT+TiIWJn5P7sTwZwXuSzXY+9Q3xMZ5o4Xcpz6vD9", | |
|
702 | "FtTjzS69iefEYt4pXiDrZUo4ePGiLeoIFIwYB/v6GXdmG5VLLk+eKbOc9AmsX2zmvqtcvDRGQbzu", | |
|
703 | "gXbH/kTH/lkNPBTmqN3ZJODUEXVohPEJ6th0xna0EVleB73Q3eNvaVUvhlJbjs3D/T17FRCebN7A", | |
|
704 | "OXvzzbLE/I5kNfEmJcv4dxtIeo2uQ/z9ohSpiZzbDj1u40nJRyJxUK60wEv0nA9f/NuJ6/PEyU0b", | |
|
705 | "kK16z2KH12k3Lc4+1f5fawIzkK2qJRB4wnj8VHhUW9mbJhs9vgfFmU3xrXSShY67Ygb+gYNPxxtn", | |
|
706 | "4K/9eTSwIA9fv/nR33lA2lZoXALRUTmOZIl3R0gAM5h6oX1y1thIyqViBK95VZc8Pvy7G3O90M9S", | |
|
707 | "4zkpyFQ36jrMazvMveMA4d39fvoaC7p90quiJfjI4yrl+ECVkCJL5MxRSa+iVcIL7Xbl0jVaGhZI", | |
|
708 | "cMYmcGOBbLzhJgloM1x1zFnnj3ggJRFAM8yNnXxhavk+mA18JC+y3lqGsp6vPReRxGlGHMou17L4", | |
|
709 | "It070LzkoeCzarpv8Apw59smdS5KN9qVN1WgeL7OSN8BHg94ubCvS7DW6H3/PbtRB62jFLsBhUV5", | |
|
710 | "YqCIbIN5VZ81AAACpUGaIWxFfwAru8x8uT3FuOjrAeSWXmAWqq9jCNGE+N5AOv//9//xjk4uBAcA", | |
|
711 | "DN96c97AVGmzRtnWwPsgcCbLrVdQJgbKp4QSmPwQnVhv0hXyBjeFWWlcvx70urEN3FK6/lvk2tQe", | |
|
712 | "ZgbtlbzXluvTfnSj/Ctz7vZ+O1FjhDzzdpL7uLzewzCIW5VWLAEKUVuS2J6wNk6MR7UblcEd4EtO", | |
|
713 | "Y+R4/qJgfojCsfRvA0oC5dc41Vd0erZbSkrmPTjLCn815bxlchUJMS8gQD5hJNwoKHvNLNwn7XKu", | |
|
714 | "TtYIhH2wVNZvDWgzCjlPeQajnrcMsb6bZYJvNJU8HuGHvm50r7VG8qifEwmuyegAZXojh5Ul5Vvj", | |
|
715 | "DW7kSAZyw8a7I6mHY3FZHd+OA3V4JZMbNliI3Tj1L6+MKTmilVialmyZagRtEMeKRdtxUPd3vVEt", | |
|
716 | "rOBVIVYWdgAGA7HmZiHQUQNxLkWxbLyWVlrh5EM0Do2NdbclHxxArz90d+MSVeUOIXQ/4V9quq8C", | |
|
717 | "8qVflo1gPtPMkjO2/UrdOYqhY404ReObOu/fdp4hAEDq6jhy64vOeT7XUK/Onq0rXTldtA6kvgQa", | |
|
718 | "Jg+mgYSR9hfXtMbOUSLgLj/RmBSO8aAMHuJJZqf1tCM5pZ9eYUsrHmy+/z2NGalon0//uF6+33bQ", | |
|
719 | "zT/RLRfBbYTjy9QrJqHLlw46lggWPGkHuPKSqk/CB7U4pNPXUbR0DdcJy9Db00wCzVzxVc6h7jfC", | |
|
720 | "FgiL2Y0HVqd6bgIaVUqn/gJCEyCDVplnzebv0gg3XwMJAGu639lHu7rEvxTp1smIYjWp9R5L4Ssp", | |
|
721 | "VvS07Nb+Smk1FgsMp1K3EMUT8X2Fty4VG54/Ec6bE8tNVw4/QV1VzBw7Px2/2eEhhUS+FMfbHAlD", | |
|
722 | "28x00jRgAAACW0GaQjwhkymEVwArOUkEOhoFqiELtH8wgecFLiUq6WqmwAP7iGEwbYzfnHacfqUN", | |
|
723 | "XAfD+CGR2ap0lAHL25ipuYtd5j2O0PU/MpaWPG/n2y5OkfTzaOpotaR5tWjN55B2XblVVqsFfBC/", | |
|
724 | "mvsiPvCBWUHFChacdY5whj5mP5rqQ0dqLJCsWjrs4TWnIbL2V/Iwfj3hwI35jfo1JkTOeR+8GhOd", | |
|
725 | "ma9rgiKWafCbQyhYMTDmVdvhND60Flm97EDSTjF0OC+0gD9b8Yn4tNeHipCa/aWyt0n79bMmjfcj", | |
|
726 | "ntBCPjrcB5ecRTpfGHbEHy1IRj2cjkGXKC+VYoYJXBp4rd4cMd8ygLCk5nBSd8/cTaKNRjdBscOe", | |
|
727 | "TXG6QEjSxj9/2pVwx9DMRVtWQR0BSaAcQcZ8W2KPSaeRC4QwmNMu2xx25CSyrDiq2rFSK/JJtmvo", | |
|
728 | "IjAKq0ciEXoOgw+Ke+Ylb7ULKCS3k1p/613UNRp450uSq5b7CAHo7S0b7fBMLfNmwSjRYEhLlo0H", | |
|
729 | "UaRe/I+IX2Z6XdZH9Hty/399ZA1PwZGC6EfvUJIf7CBeaxv7cu6IT2/s0zPRGthpvXpYw6A7P4Ww", | |
|
730 | "z5C4V98KnIUNUanadqabKP6eXWhvbvcQHxAjiOOiKZgXZplZW2g+B2NNyJSLiR+g48DqvWR6t9S2", | |
|
731 | "aGfFjdOW1Gi6oTtZ1d4p5XIslAr8mryeZ6+htSSQe4AcfVt7k+V6mOthBCYtr/LEU4ZHtl0mW987", | |
|
732 | "6PK8mRFAaT8DJOUFVz1lPfzRApuPggkkyq+UMvyfKTUbCk7/DpfX8Y4s4QAAAg9BmmNJ4Q8mUwIr", | |
|
733 | "/wAsWUPjZw3ksgRsxZ6n4fQjprPbkj2aUh30y0bZJnLmiXnWskvOGnCPwBnG9dEhatwX3hoxk7BN", | |
|
734 | "yG+wQ4emZUpcVzcWl2T9nKQB1euucuZWHTg7TCtM/iHyfPO2vbmGsfzs70b/egIbywUH4y4BQSL1", | |
|
735 | "nWc1SmpHm2zHMBcUjYLDZ5gL5vdfxn0V8FFw66G88c/LN4I5icUa7xf4fcSBKywU0ajbp1P+aJYj", | |
|
736 | "BgWT6Ggu0MDLDNl54tfqd42lKosQtM1aif4WXAZFP5Ww3vrQ1rH9+utSYxqZd6N6gGtNbSNMcVia", | |
|
737 | "Kn5LcnjsbBi3T3EmGqshEbcme8VHKwR3kSfBOAprrIsv6K8R+X6az+MD23rWka/2v64m1qM69D7X", | |
|
738 | "a+Kcs/n0KLCJdTilyaGadopLeaAn3eYvWTeHcucMM1Fp1KgHD1tiFeO6HvobLkZlRximsA3/7Mio", | |
|
739 | "hYklLIcJrZL22BH+6W9d6kZsYIsej9RM681nU6mWNjepBAfAfTbrGRrVB/h2DxC5B8YyRjgSIzQj", | |
|
740 | "NYrse0rzChqbrsLl7mQ7W+1bsNKze5//9ZIa8rSsF+BXh/vgoRTDkPW/ws95B7VPCZEFChfX0icw", | |
|
741 | "+tpcpN/q7NY87tUn4vESdSiMMlyhKklMjQu/G51J69ZRQLs2oUO6YfoJFqliy4qCFCrf8SZE9Fc6", | |
|
742 | "DcCagAAAAodBmoRJ4Q8mUwIr/wArPWF/KOw78THwadfPqhJO0CnmR/M74/XYZLqVYKlNcEaYauf+", | |
|
743 | "vrRUDJPmu75sMKy2Y+Bnslc/iAISSyWtw/h/3CF8fE5ZrbrwSNst+MSyCoNWP+8imtoX2eyojpdC", | |
|
744 | "k8YP5K+cbK4SJPCkZXbYqSXYk7hO8AdSemBHgXKWiZ+UOr802aJo+98ZOIjX9hWL9bo31Gqx7cy4", | |
|
745 | "ZG+W/ar/WGlzDa1xPWnPRsEdrIcZlEVGV/jGmbirkxw1lyUYoqj8Vv7Bxube9XPQlBkXOV6Lc1LT", | |
|
746 | "2IzNq0V7WwVhF0kA6yxfAsFxc9krNEH8vGGntTWI608ovjatXc/CKKXw7AjJSftlTcLI0hIIGXbR", | |
|
747 | "Ur0NCYNp7M4cVd/n73Rjetnixz4SAKpcz/P47UsijZG7T3SxzK2D79WS42aEalc12hQwCZ01LfmF", | |
|
748 | "/H2mmGEvOzPBie1D0YT7Jh19vxa4Dd3SQ1FrDfmSUpvv4DjbYcZ2PrPpFpWtMjWqHBeoyMiZf6RP", | |
|
749 | "3EfYR6z9jsVNIIHxM0bzzBQF8eeYkPgDySydxPXv9Izo+QUY94N8kWi16fI6eZSDc1G0Yo0L91jc", | |
|
750 | "RQuDMGGS7B2zuf/0GbJyRhUO48UbMrqnILMrbQg1LF00Q3pH9nbGEK/RRQpRN3T/J/4IZQjwW2Ft", | |
|
751 | "2ipWGztg1Jn9I4DmffKS60QC+JQcyakdVON6zDcKttIKlqeTcmAi4xzmo4QXa2dRKleS+fs3EtTd", | |
|
752 | "BBtony2wK9T2Imj+NCziOSEL7Q7VuIU8kclUHrJJsSneFcxGRgIgGGUEQM8/pklwTOqab7mMmJeR", | |
|
753 | "iaBrjJDEnDpkR4Vz3qXxgyn4/5x24FuTMNVPwQAAAhtBmqVJ4Q8mUwIr/wApcLwPT0/Xh9UdWqWX", | |
|
754 | "Is8Wbj5K1hivmN6qIQnq+aolcegdlM/63MbHsdC6xYZC1e/Q8UjQCt9N/Ejqwms8DzeWv2qxskel", | |
|
755 | "iZH0kt1QWkErWSEodq7V0ZNksctLkMGWayX33gBT368EehfIeGDolBZoqIbJfb4nqcfU+ev4OzVv", | |
|
756 | "9zVqWyLck315GFmXxQKIM8pICQc8Q5es34LH1+DmnMnW8kQpVGrztQcDXhjCU3F0fOgoSsXSVWCj", | |
|
757 | "c6XKqGbCwQDfJUxCfXfIT6YmQoPpVp1mpGy1wQypXus9z0bScDpyDu23hViYDntdj1O45ea0znKZ", | |
|
758 | "kj1+tLHbBtqAGJ1WTcbGlF6Vya6hQhEsiiZUIC2fRxIj8/wEXCICIbr0gZ/m6gcOhE10tenvE7iy", | |
|
759 | "+BKY81wLWrnzos3S6FWxYtmCRes+LLhNGOKWRuQo6SyePH2OZ90xZm8oA1MuTe3V59euVNxjAt0F", | |
|
760 | "LkAc9TEiFhP/8CB+gA8mF+A8h1U01f4DVX55GzCH51jHI2xUS0L9GtsHoBxLPLK/NNel8zcnwG4X", | |
|
761 | "+UusfcfEb5hh+ffnXteCE9vRGbs2n9wYW0xA3ZicklfadmWKUtMiHYBfkMSULWnkBQr4CXxjpYOs", | |
|
762 | "6ygeEoA5+5B0B1SZObgZ42wWqddyyYE0NfwQAl75tfdJGqOa7OMHwBYNeatJaJK0zT2+bFaw2qWC", | |
|
763 | "WwAAAitBmsZJ4Q8mUwIr/wAstkdsayRXchoFk703izqzduZ5WsyXriI9cfUdMUWvm0iGHwYIrUuj", | |
|
764 | "vz3Yjou+JLwv9df2kt7MJo8u+3P5CjEKbwlz4vkE5AHTAbgXn3+Xc/MMJLgW5cm7iX3KiGNnBpbp", | |
|
765 | "hhwJRlb3u91NRDr0d1IR2up/z7lKxE7XPAPFe0siPMYVlIqWNSn5KqLABPeuxxbOsvMEb27/nH1L", | |
|
766 | "UVM8I2F95c1I3Lv1SpkhZXjs1JsmS9X7gsoTxkXyShGC2+zRJSGUbhCPo/q1XSFMHQyMWJ79FKPQ", | |
|
767 | "SL/RpVsacN2bYwdKo4TFBw1SsKq/L1iOmqMI+4Gxnbbjojdk0ek0JIcDb4bHv1czxchF7FX1Ym8H", | |
|
768 | "6IpPuE8CeNKjzQ1a1wqhEu+wl1N0x3Y37ZryCCKJRkxj0FT7bOoH3L38/yMUuh/v3aCmxY4eCkyk", | |
|
769 | "b2p6ZrYMFE044anM/nMjmbErMibfRFuCz58Io1rBlF7JfkIz0R2/5vjUMVskcdbX2mm7DntncOsW", | |
|
770 | "DIdg/XVmgsC9CzVzUyq4VsS/sk97lJggcddpWLNw/29egz8iLyzWHOAXCvl2fTIPkviYAOQXfVhZ", | |
|
771 | "UQdxsyJUNFMTiALrZCmoQLMp2LmDbfbW8JQriDeR3fVz6P1sjT8C2yEDvzkCn7sh0aTBK+sx7BKH", | |
|
772 | "1nb4320+caQepQj4TCJtCeNXjdrVcNEnjvwlcRJwFT1pT+Y7HREbHnT71XYNh4EAAAGEQZrnSeEP", | |
|
773 | "JlMCK/8AKIjxcI58rm/ML255fOJW1zbznFna7lfgMQrka7OTPPsvVAV4EJXye/Uxiu9dlftmRypJ", | |
|
774 | "qfDot3xwDe8lX/qAVf6pBkSlUsaLyBYtww/SUSa1bGl1JvrJCN7FXCCXbLd5R4PoYlPiDIm/DQH2", | |
|
775 | "puO0StIWmrR77Isc/J1pRvdu5+mQa/n0SEHUeM2KkoRzCznfD9zaaRO7BDtvC9SYIT0uYZxrwTjx", | |
|
776 | "Q7N7UERTrYG0P+vRLAhxkfohFIYl3HXyjPOvnlbUFP2oiiy6nkUFuaIyQcJawJv3GU8k4ObcKsC1", | |
|
777 | "cNDXjSpsyQRrxLFaCCjke4mikyt7vs0iN0bnrNWv9HXruG9zOFEOer1ggIFTsT1Eos5CXRkgja5H", | |
|
778 | "N4QUM6MhWpc5du/HgBIH8ANFcoo2kJpqcadw9r/0qk25X91MQSDJQiH8Hny2dQhqR+LFWEawiW75", | |
|
779 | "3SJhn0ngZcv/mPj3mwcHv1SL9ErBqAjm4JGiDetPKYtFwANYY11OyQAAAVdBmwhJ4Q8mUwIr/wAr", | |
|
780 | "Ox5HV2505jRePGgMxptW4PGIHEszV1xGZS+flSkF+aq30AaqO7u6XK9jJsuWXTfYCRQTn1bZfFQ2", | |
|
781 | "2DbO5DXAxK/TUmbQleCflFzeS6/czxkL4PJ8AwOs2U+oehekgCZC8gZyHHaQSaKbNJ46gTjNsLy8", | |
|
782 | "4ACQ5uNt11TPuCPqPTuh+schdw9S+/lU/6m+EyaqGZ49wDFPiBFBYXglQQBjyP9k/rqq0xL7SiLj", | |
|
783 | "pe4riYg8SFUuUtOzPdWHyvxnI7Ug/0VLPGAAhgMISUnqe01d5QFf36yHpwMAHexjAZFIGQHAFaut", | |
|
784 | "uMuEw6HzUZVzNdeHYxvEYOGkTo007bLwbuf/nxzrywGOxlRTYJLRdYI0mk0SdN3+LeTv1RIJwv21", | |
|
785 | "+e9rT5iFOTCgzeQoekEWXLYz0X8YLq5bVCtijP7/T7w1Ck71j0aqfrEn6wtIAAABNUGbKUnhDyZT", | |
|
786 | "Aiv/ACcySi7VBgOid6qZNXvhh/JsllHkMLLq0yNbQTqv/Wk2EBoSKICZwFwAD0WRzhvvReCGirep", | |
|
787 | "1Fe4bxjm49/UR+OYrXRmHR18T0C83AUVeBk7KvDZmb/eHzuzEN4yfXucr/NWFJl+USVMY4r4UQ9C", | |
|
788 | "ayrfEY9v6AQ6mzAdLy2UMfFxrRJ99g/Rfl8qx+m4jIZNjlrTaThzJ/3OpVmAliDfxVyg8+CVIlI3", | |
|
789 | "1IykiwQrXcebgajG+av8XU1SfyAG5ibvwbtdSAxkGBcJWL387V+uTdY56w3KN2vBtoQpVKD2zb3y", | |
|
790 | "azIcATZ02upwIytNcM/rpaLCdMb1myWcikE25agzLhDhOS+4zwjYz2DnW6VY0gFBAPsphhsUMnau", | |
|
791 | "VVdUVHzCTSdvzEve/H8q4AAAAVdBm0pJ4Q8mUwIr/wAo+x5XKuiN1am7SkJKSMonFZDPU3f5XFcD", | |
|
792 | "QSs0FLVq2idfsKwuIkt1mxIq8NgMHpzofTnDHqs/WedvAmhBgL0N5azdQa5MNKG2rJ4IAvGQY/uF", | |
|
793 | "m3jKQAKzvhSS01gO1oIfizF817z9IShS4QK2WT0PeFPELqLSpED8eNOpVTR96vmwpk/WBKRVJdTQ", | |
|
794 | "JzjiCQ5pgEwjtvk7KqoS0+lwXSbvIrXkYm8DignEts3DLNoLHrPjXlQmbIop76JZSyJEtB+91GrL", | |
|
795 | "wo6Km5GeebyA2E6qGL3xSkpppej/ruoFprSKrH60UMbrq/SK7eCo+1QFoySPQmqDFsMGiQFqvtld", | |
|
796 | "5BXDYdVI4yRaoyN7Y7wi83HRC6eVazuHU9OtIY3xJJApBWq1aJOsYwc38aTC3ee863Aa/4n9Lk4D", | |
|
797 | "AtyFYHNZjB5m2e2vk8G2Gny9YFlBAAABQEGba0nhDyZTAiv/ACoZSZQfHxhfQxEqOBQrP+L3Dmgv", | |
|
798 | "HSJQtB1iVkcLTxm+vagLHBLG91OGnopwrr7gT/loDypIhoRxjcwAAOeg/jN4WBbXzCJtnWGGllUC", | |
|
799 | "SdtUZQzKOSp9iM4yX18C6jrY4Sq6R9PUV/lEGNveJR4gw4FMve7110XdEPL1O2VTdHvdqeANyaq0", | |
|
800 | "nLdEmtXnrzvdrFlBaUvmaR4EdlkqGkvkZKWJej8Vq+msbKa7JdbxjwZtRufiyGfD/NVqMgSrYRzw", | |
|
801 | "9z/a8Zwbr+9+19CxlWD5bCuAEfPmjY6kZJE2L/CQI6+tnCBTXOmWZtZMBoCLGOf7G2uAC3+kFlbo", | |
|
802 | "h9as5WCkO6+iqXq29dyhKnsHInorRYsPlgxIXyU1Om/Kyhj1DJV0Am9WJK3Dln0zNUH0q6ZTOnZc", | |
|
803 | "FD36AAABYkGbjEnhDyZTAiv/ACcwdIOLRFfoGK2ZkKsvgMwG0m0qsY0vMLPSzefc+ebp/aztyF7M", | |
|
804 | "lsBz/fBeNtxFBcsKgR4pf65GvdfOMHah0ltZ918sMDmXUEZMeRHy/xpnWpTLeGz6uTs/7MATPmU5", | |
|
805 | "BgHbT/DkD8QeaZnFAzidyFCXDz2l/jaKhEdgqipbB2pH0+fQ039r05z9axxEWGmaLQjg6x9+po1o", | |
|
806 | "24yhkVO7m03YwWmPyCgy8cOwrvRyJkXJpRN4m8ZBS1zwY80HeN/VyMQQJSMwsTo7R1XMerSFuyx0", | |
|
807 | "nz+8qOuhiqykc2ohCCsXia/+kIKbJ5Vs+cbWtvkqBKIDSfU7FhAd3GjcY/xar0EVmi6wWFTugAog", | |
|
808 | "R3I7mTrQDdlTAqYgqO7Gn5NMXQVHu2i1zhFSdo9GjMbeGnbkJwsFbQ2XkoKRIDpuW7AewC9AEBt0", | |
|
809 | "Ox/Ah6dGXfXO1jl8pEApj2RFmgAAAPlBm61J4Q8mUwIr/wAlR+eW/VZ7bSrmwwMA62G05DZ7p/5F", | |
|
810 | "UugsSsQdonUq6abtbU5hjFr+I1lPgoiV5c3CkTQZS+K5zivdo+Ti2P4K90xXANp8dSMAu85uJIOC", | |
|
811 | "Qn2TXbEnNDifLB+3V84ht5tj4lvTaZx317BcliV8D5v2zZQW8RO1mUbuJEBItst8E7hfE+ZXj7tf", | |
|
812 | "DxNZPTvtpFyUv0fH1cTg1pr2VLy0d0zQLiA58dg+GkRvR1/hs2LyifBgHcj6eTWz0vsypVn9iPXR", | |
|
813 | "H/unJ6i8cfFL69NO24tQ9QQB+nDFhoP2cRhkAvhHwn56n5PppBD/oxni2f8AAAE9QZvOSeEPJlMC", | |
|
814 | "K/8AJjAXVGf+Kj2XNJnFeKC/gr7dJDTC2ngpd4WeAHlg04GuJKnn9hAmiECxxo9qM1IYMRiB85t6", | |
|
815 | "gALnlm9sRqGmioyzAm18RJndc9Ah8RlpGzr+44a6ntRaPx0cIwNIWAA8buL2JP00dmfjNqEiAlCa", | |
|
816 | "8OdV8FQxjp1vDXsGcAGF3Qbd62KEpkimeI3wH2nuXpbDHm8/ZKOR49s5ifUCkxCoJpfp43aC0lTz", | |
|
817 | "h2NXpcfVw6h0QnK8G60R4ZAxOxaJB7c0nn8ixXSU2JVY24EtGMF53nxJnHfzUheewUfBOGYSxeo8", | |
|
818 | "oK7oUCqX4rztzDwoc2QywNqQUJUkFrqIN+sb5ecYvX24Zujn+ZzTW6UDAF3R6WdNyJyRAremgC8s", | |
|
819 | "pSflTqygQNGfHyGkfIEEJJaFo/pBCBkAAAEWQZvvSeEPJlMCK/8AKI41fuekXG59Knbw4Y6YJrit", | |
|
820 | "sh9VtQgc3QKvVmxrzzo7f4aXn8N74eyP4b2lV1Z2Q+rohxps7EHTkOY9jLdqxI3MXe7je4g2qepz", | |
|
821 | "71+hY+jYdX+9LO0kA0Zg3NfyAlIRX7k6c/YHAZNtNaGZgTBMqiPgmEjiJH9Luk7shbgr+srfwiYw", | |
|
822 | "BX9rdS3fQNNFwcT8orQC+F60LAY9+GbFo2Sw3Ld4Tw9jq9yJtrY8RtHAdzytyek/mv2+j2TbTvAQ", | |
|
823 | "KbbCYtdC8E/KtR4V5ZTSScr5Wb63vmbw7UpddEXYvl55pARyyvMxWNSh3Li4GF8Jk5JBi5B5ASQw", | |
|
824 | "xCMYpX5hkAMc+d8tl2bT+IEvUTsAAAElQZoQSeEPJlMCK/8AJIAzFZs00JJ0yfm8CZiew4xWdArL", | |
|
825 | "klEvBVXo/+ukPLu3XP9HFOfsme3T6BJEKmPPgZw/Lxnraq6Sl2kLVW19YU1qmqgfv+80LkZaWU5g", | |
|
826 | "RAH4hqyo3bFYcbuY2SC3IW5Wm69gtYyAXOdbAYSEHA16fvCeRQjHEsxKVndJdrRAlrGHsKgUBQ3U", | |
|
827 | "p/ZXIy1vkdFOfKSjpuZnswkuqr8NZI5tJ/dnBSErBTNWPaNwWV7nNomC0EYVGo+geGBhLXzaLw0U", | |
|
828 | "AOCYGjiPc3803BDw1GLoLIXjrIFJxwRfBNIAXYZAglu30oYzhpAfRWSprkeULMWYJTlWvbUQ5CNe", | |
|
829 | "wSZssuDWIRAc3w8AcFaywwn+YSGhtR8VI1OGjYkfBbcAAAD8QZoxSeEPJlMCK/8AJdokjCUETRw/", | |
|
830 | "nciVPtaZQSBP/VxAQSITASEzlJBl9Na1r0DJhLOz279+KQLtl/xHZ8vAKc528mTMTqtWs4sFbeVg", | |
|
831 | "HWyBpHcHEtgTzjIqEinp/MPuUXF5poo8YLSSMFn9Ozx2FbU5/Kh9A39oN9NHQflVxV1NA6yT/84H", | |
|
832 | "HyfMtfdSMS8KTvAEE2lDs14VQayNs5ctjXboQT7xMBf5OLj6thhPvgaDrFB2o/PV9ouK147lruWT", | |
|
833 | "P2mkoA9oDIMYW1pcBx4yyV/t9GOPZ3aXneMUb2fFmUCX43BjXfUDMaa4GO2/Ankj3UEQwDxA7ZlN", | |
|
834 | "UQK2AAAA4UGaUknhDyZTAiv/ACJHv33I08bkhybYiJ/JiiheW5zMPBu4n5CxGr3frhE7TkLh0vPk", | |
|
835 | "tM8m/AhaDiJisdk5QXNe/4WmxEDSAyaVi4eUVu0iHT2ly/KNTGqiORqA2oKpTjh84nYbrpXwnGv9", | |
|
836 | "SOf/34Z06xN6Yo3t35UZrP8nlcs/63GtnEmnUwVZHBYfPM6bs5M5AeBfAQ/9mIqu7vnEst+5O2wp", | |
|
837 | "PjzdItjwGCZ2ApHVjGnYYFomlA9nm6AXnxNIWHIsDgxCk3zx+6QbXipu/CWLG1Wf0WIbt4C0JPVl", | |
|
838 | "3TEb0QAAAMlBmnNJ4Q8mUwIr/wAVV64OfTKmlktYOqZHH1W1DhPy/X/6sD4T6hRdzfOgNtTOX2Ic", | |
|
839 | "kRJHshfBQVkJIzns079io6kpJFCcS3VD4zrWCn/dNaGV0kWTpFBRuusfn8F0C0R/EhsQeyTsdZft", | |
|
840 | "EkLGb5tq+nrir3vfmeb7rjmWJRXkIrTEKu8pIuAd+4FBGp8ARgGe80Jqpp//s1433HqBFqXsIFJT", | |
|
841 | "mU8j/toF9HyueI1Ea4uvsQ6NANGcYCbOAKCmbNiwABMCFaiUTMAAAAPSbW9vdgAAAGxtdmhkAAAA", | |
|
842 | "AHwlsIB8JbCAAAAD6AAAAyAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA", | |
|
843 | "AAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAv10cmFrAAAAXHRraGQA", | |
|
844 | "AAAPfCWwgHwlsIAAAAABAAAAAAAAAyAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB", | |
|
845 | "AAAAAAAAAAAAAAAAAABAAAAAAY4AAAGGAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAMgAAAA", | |
|
846 | "AgABAAAAAAJ1bWRpYQAAACBtZGhkAAAAAHwlsIB8JbCAAAAAGQAAABRVxAAAAAAALWhkbHIAAAAA", | |
|
847 | "AAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACIG1pbmYAAAAUdm1oZAAAAAEAAAAA", | |
|
848 | "AAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAeBzdGJsAAAAtHN0c2QA", | |
|
849 | "AAAAAAAAAQAAAKRhdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAY4BhgBIAAAASAAAAAAAAAAB", | |
|
850 | "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAAMmF2Y0MBZAAV/+EAGWdkABWs", | |
|
851 | "2UGQz6mhAAADAAEAAAMAMg8WLZYBAAZo6+PLIsAAAAAcdXVpZGtoQPJfJE/FujmlG88DI/MAAAAA", | |
|
852 | "AAAAGHN0dHMAAAAAAAAAAQAAABQAAAABAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAA", | |
|
853 | "AAABAAAAFAAAAAIAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAZHN0c3oAAAAAAAAAAAAA", | |
|
854 | "ABQAAA05AAACqQAAAl8AAAITAAACiwAAAh8AAAIvAAABiAAAAVsAAAE5AAABWwAAAUQAAAFmAAAA", | |
|
855 | "/QAAAUEAAAEaAAABKQAAAQAAAADlAAAAzQAAAGBzdGNvAAAAAAAAABQAAAAsAAANZQAAEA4AABJt", | |
|
856 | "AAAUgAAAFwsAABkqAAAbWQAAHOEAAB48AAAfdQAAINAAACIUAAAjegAAJHcAACW4AAAm0gAAJ/sA", | |
|
857 | "ACj7AAAp4AAAAGF1ZHRhAAAAWW1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAA", | |
|
858 | "AAAAAAAALGlsc3QAAAAkqXRvbwAAABxkYXRhAAAAAQAAAABMYXZmNTIuMTExLjA=", | |
|
719 | "<video controls alt=\"test\" src=\"data:video/x-m4v;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAqiW1kYXQAAAKMBgX//4jcRem9\n", | |
|
720 | "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTE4IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv\n", | |
|
721 | "cHlsZWZ0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w\n", | |
|
722 | "dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o\n", | |
|
723 | "ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2\n", | |
|
724 | "IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0\n", | |
|
725 | "X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBu\n", | |
|
726 | "cj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9p\n", | |
|
727 | "bnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEg\n", | |
|
728 | "d2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBz\n", | |
|
729 | "Y2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9\n", | |
|
730 | "MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89\n", | |
|
731 | "MS40MCBhcT0xOjEuMDAAgAAACqVliIQAV/0TAAI/3gU2tIW7KawwaCmQGTGHKmuYAAADACBcshU+\n", | |
|
732 | "yICkgAA14AHowiEeT6ei7v7h3Hu0i2fpUBLGBIkbCMP3Vfz+9BVGCDXnw9Uv5o3iN030tb7eq6rs\n", | |
|
733 | "EEhHs2azbdTiE9Csz5Zm6SiUWRdmB43hbD5i6syATuODUJd7LM3d9cbFpc7zFlu5y3vUmNGd6urp\n", | |
|
734 | "vKKT9iyleIyTuR1sVS431DhevGfkUllVeIznYUe2USoMW1tufETjyRdmGldN6eNlhAOsGAH4z+Hk\n", | |
|
735 | "rwKecPPU7Q5T4gDAIxj9hW84jVExMTSTHxkPTq1I4OotgUxURCGTsw60k/ezPNmNg38j1bqaGmPc\n", | |
|
736 | "ruDKEIBDsK5qEytFB90Q68s0h2wmlf2KXd5bleBefiK+/p47ZsyUO4IdlW25rRy+HLjt6wQXfYee\n", | |
|
737 | "3IkiQOoOK+U7u/lxcl78zfxwIoEMjUUSKNZjkp8clnmecDDJ3Kz+viF7bPklk7N6QRyizAKPIIpn\n", | |
|
738 | "NJUuMWQmqeL2Or6cr4D0/0tOym+4tficxmhuEONKUtO2pPn3hRjMllkd12tXp70fLTfxy0dwB70M\n", | |
|
739 | "L9iLEcItHb7zVupHlP5RxdvecpREw+OsIPr9KWilIesNE19jgIbT+TkiRBjOoKvUuwcQnKg7fOTH\n", | |
|
740 | "VoLvnKuAfea+oujEdm1Rwd2tEOnkF+ZC11WaNQsiNR/eJ9EnUXjXDYGfhB+Oe7qj8nYTT+eOXg1c\n", | |
|
741 | "uJNgLXEs4vOheWEjQOqfIWMQc3DmTof5s0ksBmUQ3PQ+UHPxZSnmOEZB+j6xT3wbm7HGzDjWtSg1\n", | |
|
742 | "SjTxd1EiJ8xA4SIxxR8WIKLg+TwFxJNS7Laxq7Uglu3AkXe82P1JCdJX5PsbFbxuDbuJgakzRcTw\n", | |
|
743 | "MLLSKCiizS/eCW0uJed/lev9yb80kKlVET4S219cn/zhkpeDV83cHYOr+sJQKDRk/Wh2c7fsuxfx\n", | |
|
744 | "aEH/6reSmvFDsAnXAyPXliJ3G4VG3OkEM5K5WyGGrBizZbTrdGsBnzj5VSGGOJdCKuRrUluw/8es\n", | |
|
745 | "2vYRPs9BcTqAqvHk9M52SSIf+1T6L53EZP8VbtXB+G29CMW4xVCK/B/YDjaNmqMwJ61dapugjnWJ\n", | |
|
746 | "fqeXlGGa3Ch3aA7gi30T8PucNRBjLK3lF67ZDDvkWXRQXd+VMnKWHkBbCkQ/F/fMuNpHO3C00Y2p\n", | |
|
747 | "ljna1qImBhVMvPe0F7Qx7G/YyxLRzhyUU8e23HGzp0agtNJRbydbrPV+TqJMSifJMNcZIf8wkdnC\n", | |
|
748 | "3/xdpcXnLf2Ye3Kbd0o7utciTG+q5h6WTEk+PaNbXLLA0YyZ2VnLTcyV1QTS76aNCbV9Q1/OQ7QU\n", | |
|
749 | "81Gg0hPa9aSiscGary6jLVwDQaik4zLsi7jPqgPVdup7pwx7uJDqRCVcVi5QoZFp/GHdex5sJTF6\n", | |
|
750 | "9A6sja69/NLkFIWNSIeRcuGahXpF+wZeYIrqJv975s1TKYKAvp1WtzgtgWNkcbzCtROqf8rPtlAI\n", | |
|
751 | "xkX8GLcEo9zfExyfimeXQ64qfFxEy0IMy2Hsxau9fSMqUnIjntuVVjCQtBL+94gx1RZLndE6wROV\n", | |
|
752 | "Tq/wHwHrQzo9QL9cpPqPFJjiZ/NGZIFuudS+wsBFe6Hu8Oitf5zToLqLdtU4Smwh4ne3JsiT9lOz\n", | |
|
753 | "N+4PPw3VSx9l5FppVwdKUWELw1dYpCOppyVWlJ3YQ8H4FQQM8EcYMG9N3Bxu79y1J1ikuvuhMmLQ\n", | |
|
754 | "lehLTbguhbix74hd1VIQC8EjHmOZSSWbssulYwPbr6FF49tifk6PymJvulR9/u+2585HkRfbxveG\n", | |
|
755 | "eWCz0ix1pIVfaNpESKmtLy/0mcbMg9hYDz2werz9oe0lT2BiMV6uAin6RaQcT8Vk9MPctfwae+gk\n", | |
|
756 | "vtnZA/sOBk8MbpylaHqc0KIVHhhLFMNnkOFiucjtGo/JWTa/F6g8wWeow5ZuIJUORaYHWqegZbTg\n", | |
|
757 | "M9dCsYYsfZGjjVMuSlDIvpYvIvFFooGPC7Ye2Jfawmq4Ut7EL/nv/dyAd2HRc5msmUhzeu/XpX3r\n", | |
|
758 | "VlzRmf9/Qan8Dbve3QfW1Ym0o5J/KAc3z1VBho7JBr5PgCL68RiD9jZHN0VvsT4gzsEjNlW3D91U\n", | |
|
759 | "y4RduaodBFoNTzXwlfUYULBzdiTbH75l/UmVMC4TKeTWhNzw2UezaqeGd8at3WSY7W/VR3+hvZHD\n", | |
|
760 | "pkIjgKuNNH0DsCRa/Kk56XQoHIyvvUH/eNekNvziReqS4qgLnXUT4BRGt2BOtCifI6+X/DGHUOmW\n", | |
|
761 | "lX7TN5b4pw5U7jwfwshtbhGZM49T8JMk15Mzrc7tM6J11TYxb5R3mQhZ8TZumJ0bMJXPM69HFyih\n", | |
|
762 | "r5dJSEJMycxJVUh6NTQALUOoRTHIOwE+FpWI6feTv1SiZ0YpYe5DbkYJJbN7zAHbAKw25XvqR2mA\n", | |
|
763 | "jQmOlsfX/tK8DPjP/8h5/xgAF4EUbj1tOnQCBQL8jk9vHtfsXncsprww4Z+P/Z/UrKifuFyEpBWN\n", | |
|
764 | "8kLpF7yywE2iYdDruV9+/qKR8rC9ozNKyqQNIwtxrzYkWpE5t8K7gG4JFnrHona/Rp8dOX6VW41+\n", | |
|
765 | "jb5LB1LEtE8MwjLp3RCUOq/+6yLzaOEgBTqzvEjDeFpg/u9DMHMr4/2TOchfjg7dl+uQ6Gsx+4Ia\n", | |
|
766 | "9W7vivG95027p25eKL0nHvx/OqmAQEZYJL/JO58lOj0zPdJxrQ5dZksjMISzVZNn7DsxqE3zgBBu\n", | |
|
767 | "Nzk50R8lTK3U8P12QiOAQYSTeGlYlkvfeofrfO1AitEj02m9aUkxTFd1ZZJoLQT2d3zEU5PmE4lx\n", | |
|
768 | "MVfL5ttNnIbqfcIU2RJKNWqdw77xfjfrNc/eNpRKPZ/6z50LzBprgjzBHRfKgSWWkDxHrX0aTbgw\n", | |
|
769 | "QFwd51+PoUWH4DkQg26uGslF5Hn3hB58+fkeLTosTANOIBNAeFZtTc4PIaLHw759zae7scY55xcT\n", | |
|
770 | "abzlilYIftst2RZ6ntsRC3zFxduCKvL6wLfYT+TiIWJn5P7sTwZwXuSzXY+9Q3xMZ5o4Xcpz6vD9\n", | |
|
771 | "FtTjzS69iefEYt4pXiDrZUo4ePGiLeoIFIwYB/v6GXdmG5VLLk+eKbOc9AmsX2zmvqtcvDRGQbzu\n", | |
|
772 | "gXbH/kTH/lkNPBTmqN3ZJODUEXVohPEJ6th0xna0EVleB73Q3eNvaVUvhlJbjs3D/T17FRCebN7A\n", | |
|
773 | "OXvzzbLE/I5kNfEmJcv4dxtIeo2uQ/z9ohSpiZzbDj1u40nJRyJxUK60wEv0nA9f/NuJ6/PEyU0b\n", | |
|
774 | "kK16z2KH12k3Lc4+1f5fawIzkK2qJRB4wnj8VHhUW9mbJhs9vgfFmU3xrXSShY67Ygb+gYNPxxtn\n", | |
|
775 | "4K/9eTSwIA9fv/nR33lA2lZoXALRUTmOZIl3R0gAM5h6oX1y1thIyqViBK95VZc8Pvy7G3O90M9S\n", | |
|
776 | "4zkpyFQ36jrMazvMveMA4d39fvoaC7p90quiJfjI4yrl+ECVkCJL5MxRSa+iVcIL7Xbl0jVaGhZI\n", | |
|
777 | "cMYmcGOBbLzhJgloM1x1zFnnj3ggJRFAM8yNnXxhavk+mA18JC+y3lqGsp6vPReRxGlGHMou17L4\n", | |
|
778 | "It070LzkoeCzarpv8Apw59smdS5KN9qVN1WgeL7OSN8BHg94ubCvS7DW6H3/PbtRB62jFLsBhUV5\n", | |
|
779 | "YqCIbIN5VZ81AAACpUGaIWxFfwAru8x8uT3FuOjrAeSWXmAWqq9jCNGE+N5AOv//9//xjk4uBAcA\n", | |
|
780 | "DN96c97AVGmzRtnWwPsgcCbLrVdQJgbKp4QSmPwQnVhv0hXyBjeFWWlcvx70urEN3FK6/lvk2tQe\n", | |
|
781 | "ZgbtlbzXluvTfnSj/Ctz7vZ+O1FjhDzzdpL7uLzewzCIW5VWLAEKUVuS2J6wNk6MR7UblcEd4EtO\n", | |
|
782 | "Y+R4/qJgfojCsfRvA0oC5dc41Vd0erZbSkrmPTjLCn815bxlchUJMS8gQD5hJNwoKHvNLNwn7XKu\n", | |
|
783 | "TtYIhH2wVNZvDWgzCjlPeQajnrcMsb6bZYJvNJU8HuGHvm50r7VG8qifEwmuyegAZXojh5Ul5Vvj\n", | |
|
784 | "DW7kSAZyw8a7I6mHY3FZHd+OA3V4JZMbNliI3Tj1L6+MKTmilVialmyZagRtEMeKRdtxUPd3vVEt\n", | |
|
785 | "rOBVIVYWdgAGA7HmZiHQUQNxLkWxbLyWVlrh5EM0Do2NdbclHxxArz90d+MSVeUOIXQ/4V9quq8C\n", | |
|
786 | "8qVflo1gPtPMkjO2/UrdOYqhY404ReObOu/fdp4hAEDq6jhy64vOeT7XUK/Onq0rXTldtA6kvgQa\n", | |
|
787 | "Jg+mgYSR9hfXtMbOUSLgLj/RmBSO8aAMHuJJZqf1tCM5pZ9eYUsrHmy+/z2NGalon0//uF6+33bQ\n", | |
|
788 | "zT/RLRfBbYTjy9QrJqHLlw46lggWPGkHuPKSqk/CB7U4pNPXUbR0DdcJy9Db00wCzVzxVc6h7jfC\n", | |
|
789 | "FgiL2Y0HVqd6bgIaVUqn/gJCEyCDVplnzebv0gg3XwMJAGu639lHu7rEvxTp1smIYjWp9R5L4Ssp\n", | |
|
790 | "VvS07Nb+Smk1FgsMp1K3EMUT8X2Fty4VG54/Ec6bE8tNVw4/QV1VzBw7Px2/2eEhhUS+FMfbHAlD\n", | |
|
791 | "28x00jRgAAACW0GaQjwhkymEVwArOUkEOhoFqiELtH8wgecFLiUq6WqmwAP7iGEwbYzfnHacfqUN\n", | |
|
792 | "XAfD+CGR2ap0lAHL25ipuYtd5j2O0PU/MpaWPG/n2y5OkfTzaOpotaR5tWjN55B2XblVVqsFfBC/\n", | |
|
793 | "mvsiPvCBWUHFChacdY5whj5mP5rqQ0dqLJCsWjrs4TWnIbL2V/Iwfj3hwI35jfo1JkTOeR+8GhOd\n", | |
|
794 | "ma9rgiKWafCbQyhYMTDmVdvhND60Flm97EDSTjF0OC+0gD9b8Yn4tNeHipCa/aWyt0n79bMmjfcj\n", | |
|
795 | "ntBCPjrcB5ecRTpfGHbEHy1IRj2cjkGXKC+VYoYJXBp4rd4cMd8ygLCk5nBSd8/cTaKNRjdBscOe\n", | |
|
796 | "TXG6QEjSxj9/2pVwx9DMRVtWQR0BSaAcQcZ8W2KPSaeRC4QwmNMu2xx25CSyrDiq2rFSK/JJtmvo\n", | |
|
797 | "IjAKq0ciEXoOgw+Ke+Ylb7ULKCS3k1p/613UNRp450uSq5b7CAHo7S0b7fBMLfNmwSjRYEhLlo0H\n", | |
|
798 | "UaRe/I+IX2Z6XdZH9Hty/399ZA1PwZGC6EfvUJIf7CBeaxv7cu6IT2/s0zPRGthpvXpYw6A7P4Ww\n", | |
|
799 | "z5C4V98KnIUNUanadqabKP6eXWhvbvcQHxAjiOOiKZgXZplZW2g+B2NNyJSLiR+g48DqvWR6t9S2\n", | |
|
800 | "aGfFjdOW1Gi6oTtZ1d4p5XIslAr8mryeZ6+htSSQe4AcfVt7k+V6mOthBCYtr/LEU4ZHtl0mW987\n", | |
|
801 | "6PK8mRFAaT8DJOUFVz1lPfzRApuPggkkyq+UMvyfKTUbCk7/DpfX8Y4s4QAAAg9BmmNJ4Q8mUwIr\n", | |
|
802 | "/wAsWUPjZw3ksgRsxZ6n4fQjprPbkj2aUh30y0bZJnLmiXnWskvOGnCPwBnG9dEhatwX3hoxk7BN\n", | |
|
803 | "yG+wQ4emZUpcVzcWl2T9nKQB1euucuZWHTg7TCtM/iHyfPO2vbmGsfzs70b/egIbywUH4y4BQSL1\n", | |
|
804 | "nWc1SmpHm2zHMBcUjYLDZ5gL5vdfxn0V8FFw66G88c/LN4I5icUa7xf4fcSBKywU0ajbp1P+aJYj\n", | |
|
805 | "BgWT6Ggu0MDLDNl54tfqd42lKosQtM1aif4WXAZFP5Ww3vrQ1rH9+utSYxqZd6N6gGtNbSNMcVia\n", | |
|
806 | "Kn5LcnjsbBi3T3EmGqshEbcme8VHKwR3kSfBOAprrIsv6K8R+X6az+MD23rWka/2v64m1qM69D7X\n", | |
|
807 | "a+Kcs/n0KLCJdTilyaGadopLeaAn3eYvWTeHcucMM1Fp1KgHD1tiFeO6HvobLkZlRximsA3/7Mio\n", | |
|
808 | "hYklLIcJrZL22BH+6W9d6kZsYIsej9RM681nU6mWNjepBAfAfTbrGRrVB/h2DxC5B8YyRjgSIzQj\n", | |
|
809 | "NYrse0rzChqbrsLl7mQ7W+1bsNKze5//9ZIa8rSsF+BXh/vgoRTDkPW/ws95B7VPCZEFChfX0icw\n", | |
|
810 | "+tpcpN/q7NY87tUn4vESdSiMMlyhKklMjQu/G51J69ZRQLs2oUO6YfoJFqliy4qCFCrf8SZE9Fc6\n", | |
|
811 | "DcCagAAAAodBmoRJ4Q8mUwIr/wArPWF/KOw78THwadfPqhJO0CnmR/M74/XYZLqVYKlNcEaYauf+\n", | |
|
812 | "vrRUDJPmu75sMKy2Y+Bnslc/iAISSyWtw/h/3CF8fE5ZrbrwSNst+MSyCoNWP+8imtoX2eyojpdC\n", | |
|
813 | "k8YP5K+cbK4SJPCkZXbYqSXYk7hO8AdSemBHgXKWiZ+UOr802aJo+98ZOIjX9hWL9bo31Gqx7cy4\n", | |
|
814 | "ZG+W/ar/WGlzDa1xPWnPRsEdrIcZlEVGV/jGmbirkxw1lyUYoqj8Vv7Bxube9XPQlBkXOV6Lc1LT\n", | |
|
815 | "2IzNq0V7WwVhF0kA6yxfAsFxc9krNEH8vGGntTWI608ovjatXc/CKKXw7AjJSftlTcLI0hIIGXbR\n", | |
|
816 | "Ur0NCYNp7M4cVd/n73Rjetnixz4SAKpcz/P47UsijZG7T3SxzK2D79WS42aEalc12hQwCZ01LfmF\n", | |
|
817 | "/H2mmGEvOzPBie1D0YT7Jh19vxa4Dd3SQ1FrDfmSUpvv4DjbYcZ2PrPpFpWtMjWqHBeoyMiZf6RP\n", | |
|
818 | "3EfYR6z9jsVNIIHxM0bzzBQF8eeYkPgDySydxPXv9Izo+QUY94N8kWi16fI6eZSDc1G0Yo0L91jc\n", | |
|
819 | "RQuDMGGS7B2zuf/0GbJyRhUO48UbMrqnILMrbQg1LF00Q3pH9nbGEK/RRQpRN3T/J/4IZQjwW2Ft\n", | |
|
820 | "2ipWGztg1Jn9I4DmffKS60QC+JQcyakdVON6zDcKttIKlqeTcmAi4xzmo4QXa2dRKleS+fs3EtTd\n", | |
|
821 | "BBtony2wK9T2Imj+NCziOSEL7Q7VuIU8kclUHrJJsSneFcxGRgIgGGUEQM8/pklwTOqab7mMmJeR\n", | |
|
822 | "iaBrjJDEnDpkR4Vz3qXxgyn4/5x24FuTMNVPwQAAAhtBmqVJ4Q8mUwIr/wApcLwPT0/Xh9UdWqWX\n", | |
|
823 | "Is8Wbj5K1hivmN6qIQnq+aolcegdlM/63MbHsdC6xYZC1e/Q8UjQCt9N/Ejqwms8DzeWv2qxskel\n", | |
|
824 | "iZH0kt1QWkErWSEodq7V0ZNksctLkMGWayX33gBT368EehfIeGDolBZoqIbJfb4nqcfU+ev4OzVv\n", | |
|
825 | "9zVqWyLck315GFmXxQKIM8pICQc8Q5es34LH1+DmnMnW8kQpVGrztQcDXhjCU3F0fOgoSsXSVWCj\n", | |
|
826 | "c6XKqGbCwQDfJUxCfXfIT6YmQoPpVp1mpGy1wQypXus9z0bScDpyDu23hViYDntdj1O45ea0znKZ\n", | |
|
827 | "kj1+tLHbBtqAGJ1WTcbGlF6Vya6hQhEsiiZUIC2fRxIj8/wEXCICIbr0gZ/m6gcOhE10tenvE7iy\n", | |
|
828 | "+BKY81wLWrnzos3S6FWxYtmCRes+LLhNGOKWRuQo6SyePH2OZ90xZm8oA1MuTe3V59euVNxjAt0F\n", | |
|
829 | "LkAc9TEiFhP/8CB+gA8mF+A8h1U01f4DVX55GzCH51jHI2xUS0L9GtsHoBxLPLK/NNel8zcnwG4X\n", | |
|
830 | "+UusfcfEb5hh+ffnXteCE9vRGbs2n9wYW0xA3ZicklfadmWKUtMiHYBfkMSULWnkBQr4CXxjpYOs\n", | |
|
831 | "6ygeEoA5+5B0B1SZObgZ42wWqddyyYE0NfwQAl75tfdJGqOa7OMHwBYNeatJaJK0zT2+bFaw2qWC\n", | |
|
832 | "WwAAAitBmsZJ4Q8mUwIr/wAstkdsayRXchoFk703izqzduZ5WsyXriI9cfUdMUWvm0iGHwYIrUuj\n", | |
|
833 | "vz3Yjou+JLwv9df2kt7MJo8u+3P5CjEKbwlz4vkE5AHTAbgXn3+Xc/MMJLgW5cm7iX3KiGNnBpbp\n", | |
|
834 | "hhwJRlb3u91NRDr0d1IR2up/z7lKxE7XPAPFe0siPMYVlIqWNSn5KqLABPeuxxbOsvMEb27/nH1L\n", | |
|
835 | "UVM8I2F95c1I3Lv1SpkhZXjs1JsmS9X7gsoTxkXyShGC2+zRJSGUbhCPo/q1XSFMHQyMWJ79FKPQ\n", | |
|
836 | "SL/RpVsacN2bYwdKo4TFBw1SsKq/L1iOmqMI+4Gxnbbjojdk0ek0JIcDb4bHv1czxchF7FX1Ym8H\n", | |
|
837 | "6IpPuE8CeNKjzQ1a1wqhEu+wl1N0x3Y37ZryCCKJRkxj0FT7bOoH3L38/yMUuh/v3aCmxY4eCkyk\n", | |
|
838 | "b2p6ZrYMFE044anM/nMjmbErMibfRFuCz58Io1rBlF7JfkIz0R2/5vjUMVskcdbX2mm7DntncOsW\n", | |
|
839 | "DIdg/XVmgsC9CzVzUyq4VsS/sk97lJggcddpWLNw/29egz8iLyzWHOAXCvl2fTIPkviYAOQXfVhZ\n", | |
|
840 | "UQdxsyJUNFMTiALrZCmoQLMp2LmDbfbW8JQriDeR3fVz6P1sjT8C2yEDvzkCn7sh0aTBK+sx7BKH\n", | |
|
841 | "1nb4320+caQepQj4TCJtCeNXjdrVcNEnjvwlcRJwFT1pT+Y7HREbHnT71XYNh4EAAAGEQZrnSeEP\n", | |
|
842 | "JlMCK/8AKIjxcI58rm/ML255fOJW1zbznFna7lfgMQrka7OTPPsvVAV4EJXye/Uxiu9dlftmRypJ\n", | |
|
843 | "qfDot3xwDe8lX/qAVf6pBkSlUsaLyBYtww/SUSa1bGl1JvrJCN7FXCCXbLd5R4PoYlPiDIm/DQH2\n", | |
|
844 | "puO0StIWmrR77Isc/J1pRvdu5+mQa/n0SEHUeM2KkoRzCznfD9zaaRO7BDtvC9SYIT0uYZxrwTjx\n", | |
|
845 | "Q7N7UERTrYG0P+vRLAhxkfohFIYl3HXyjPOvnlbUFP2oiiy6nkUFuaIyQcJawJv3GU8k4ObcKsC1\n", | |
|
846 | "cNDXjSpsyQRrxLFaCCjke4mikyt7vs0iN0bnrNWv9HXruG9zOFEOer1ggIFTsT1Eos5CXRkgja5H\n", | |
|
847 | "N4QUM6MhWpc5du/HgBIH8ANFcoo2kJpqcadw9r/0qk25X91MQSDJQiH8Hny2dQhqR+LFWEawiW75\n", | |
|
848 | "3SJhn0ngZcv/mPj3mwcHv1SL9ErBqAjm4JGiDetPKYtFwANYY11OyQAAAVdBmwhJ4Q8mUwIr/wAr\n", | |
|
849 | "Ox5HV2505jRePGgMxptW4PGIHEszV1xGZS+flSkF+aq30AaqO7u6XK9jJsuWXTfYCRQTn1bZfFQ2\n", | |
|
850 | "2DbO5DXAxK/TUmbQleCflFzeS6/czxkL4PJ8AwOs2U+oehekgCZC8gZyHHaQSaKbNJ46gTjNsLy8\n", | |
|
851 | "4ACQ5uNt11TPuCPqPTuh+schdw9S+/lU/6m+EyaqGZ49wDFPiBFBYXglQQBjyP9k/rqq0xL7SiLj\n", | |
|
852 | "pe4riYg8SFUuUtOzPdWHyvxnI7Ug/0VLPGAAhgMISUnqe01d5QFf36yHpwMAHexjAZFIGQHAFaut\n", | |
|
853 | "uMuEw6HzUZVzNdeHYxvEYOGkTo007bLwbuf/nxzrywGOxlRTYJLRdYI0mk0SdN3+LeTv1RIJwv21\n", | |
|
854 | "+e9rT5iFOTCgzeQoekEWXLYz0X8YLq5bVCtijP7/T7w1Ck71j0aqfrEn6wtIAAABNUGbKUnhDyZT\n", | |
|
855 | "Aiv/ACcySi7VBgOid6qZNXvhh/JsllHkMLLq0yNbQTqv/Wk2EBoSKICZwFwAD0WRzhvvReCGirep\n", | |
|
856 | "1Fe4bxjm49/UR+OYrXRmHR18T0C83AUVeBk7KvDZmb/eHzuzEN4yfXucr/NWFJl+USVMY4r4UQ9C\n", | |
|
857 | "ayrfEY9v6AQ6mzAdLy2UMfFxrRJ99g/Rfl8qx+m4jIZNjlrTaThzJ/3OpVmAliDfxVyg8+CVIlI3\n", | |
|
858 | "1IykiwQrXcebgajG+av8XU1SfyAG5ibvwbtdSAxkGBcJWL387V+uTdY56w3KN2vBtoQpVKD2zb3y\n", | |
|
859 | "azIcATZ02upwIytNcM/rpaLCdMb1myWcikE25agzLhDhOS+4zwjYz2DnW6VY0gFBAPsphhsUMnau\n", | |
|
860 | "VVdUVHzCTSdvzEve/H8q4AAAAVdBm0pJ4Q8mUwIr/wAo+x5XKuiN1am7SkJKSMonFZDPU3f5XFcD\n", | |
|
861 | "QSs0FLVq2idfsKwuIkt1mxIq8NgMHpzofTnDHqs/WedvAmhBgL0N5azdQa5MNKG2rJ4IAvGQY/uF\n", | |
|
862 | "m3jKQAKzvhSS01gO1oIfizF817z9IShS4QK2WT0PeFPELqLSpED8eNOpVTR96vmwpk/WBKRVJdTQ\n", | |
|
863 | "JzjiCQ5pgEwjtvk7KqoS0+lwXSbvIrXkYm8DignEts3DLNoLHrPjXlQmbIop76JZSyJEtB+91GrL\n", | |
|
864 | "wo6Km5GeebyA2E6qGL3xSkpppej/ruoFprSKrH60UMbrq/SK7eCo+1QFoySPQmqDFsMGiQFqvtld\n", | |
|
865 | "5BXDYdVI4yRaoyN7Y7wi83HRC6eVazuHU9OtIY3xJJApBWq1aJOsYwc38aTC3ee863Aa/4n9Lk4D\n", | |
|
866 | "AtyFYHNZjB5m2e2vk8G2Gny9YFlBAAABQEGba0nhDyZTAiv/ACoZSZQfHxhfQxEqOBQrP+L3Dmgv\n", | |
|
867 | "HSJQtB1iVkcLTxm+vagLHBLG91OGnopwrr7gT/loDypIhoRxjcwAAOeg/jN4WBbXzCJtnWGGllUC\n", | |
|
868 | "SdtUZQzKOSp9iM4yX18C6jrY4Sq6R9PUV/lEGNveJR4gw4FMve7110XdEPL1O2VTdHvdqeANyaq0\n", | |
|
869 | "nLdEmtXnrzvdrFlBaUvmaR4EdlkqGkvkZKWJej8Vq+msbKa7JdbxjwZtRufiyGfD/NVqMgSrYRzw\n", | |
|
870 | "9z/a8Zwbr+9+19CxlWD5bCuAEfPmjY6kZJE2L/CQI6+tnCBTXOmWZtZMBoCLGOf7G2uAC3+kFlbo\n", | |
|
871 | "h9as5WCkO6+iqXq29dyhKnsHInorRYsPlgxIXyU1Om/Kyhj1DJV0Am9WJK3Dln0zNUH0q6ZTOnZc\n", | |
|
872 | "FD36AAABYkGbjEnhDyZTAiv/ACcwdIOLRFfoGK2ZkKsvgMwG0m0qsY0vMLPSzefc+ebp/aztyF7M\n", | |
|
873 | "lsBz/fBeNtxFBcsKgR4pf65GvdfOMHah0ltZ918sMDmXUEZMeRHy/xpnWpTLeGz6uTs/7MATPmU5\n", | |
|
874 | "BgHbT/DkD8QeaZnFAzidyFCXDz2l/jaKhEdgqipbB2pH0+fQ039r05z9axxEWGmaLQjg6x9+po1o\n", | |
|
875 | "24yhkVO7m03YwWmPyCgy8cOwrvRyJkXJpRN4m8ZBS1zwY80HeN/VyMQQJSMwsTo7R1XMerSFuyx0\n", | |
|
876 | "nz+8qOuhiqykc2ohCCsXia/+kIKbJ5Vs+cbWtvkqBKIDSfU7FhAd3GjcY/xar0EVmi6wWFTugAog\n", | |
|
877 | "R3I7mTrQDdlTAqYgqO7Gn5NMXQVHu2i1zhFSdo9GjMbeGnbkJwsFbQ2XkoKRIDpuW7AewC9AEBt0\n", | |
|
878 | "Ox/Ah6dGXfXO1jl8pEApj2RFmgAAAPlBm61J4Q8mUwIr/wAlR+eW/VZ7bSrmwwMA62G05DZ7p/5F\n", | |
|
879 | "UugsSsQdonUq6abtbU5hjFr+I1lPgoiV5c3CkTQZS+K5zivdo+Ti2P4K90xXANp8dSMAu85uJIOC\n", | |
|
880 | "Qn2TXbEnNDifLB+3V84ht5tj4lvTaZx317BcliV8D5v2zZQW8RO1mUbuJEBItst8E7hfE+ZXj7tf\n", | |
|
881 | "DxNZPTvtpFyUv0fH1cTg1pr2VLy0d0zQLiA58dg+GkRvR1/hs2LyifBgHcj6eTWz0vsypVn9iPXR\n", | |
|
882 | "H/unJ6i8cfFL69NO24tQ9QQB+nDFhoP2cRhkAvhHwn56n5PppBD/oxni2f8AAAE9QZvOSeEPJlMC\n", | |
|
883 | "K/8AJjAXVGf+Kj2XNJnFeKC/gr7dJDTC2ngpd4WeAHlg04GuJKnn9hAmiECxxo9qM1IYMRiB85t6\n", | |
|
884 | "gALnlm9sRqGmioyzAm18RJndc9Ah8RlpGzr+44a6ntRaPx0cIwNIWAA8buL2JP00dmfjNqEiAlCa\n", | |
|
885 | "8OdV8FQxjp1vDXsGcAGF3Qbd62KEpkimeI3wH2nuXpbDHm8/ZKOR49s5ifUCkxCoJpfp43aC0lTz\n", | |
|
886 | "h2NXpcfVw6h0QnK8G60R4ZAxOxaJB7c0nn8ixXSU2JVY24EtGMF53nxJnHfzUheewUfBOGYSxeo8\n", | |
|
887 | "oK7oUCqX4rztzDwoc2QywNqQUJUkFrqIN+sb5ecYvX24Zujn+ZzTW6UDAF3R6WdNyJyRAremgC8s\n", | |
|
888 | "pSflTqygQNGfHyGkfIEEJJaFo/pBCBkAAAEWQZvvSeEPJlMCK/8AKI41fuekXG59Knbw4Y6YJrit\n", | |
|
889 | "sh9VtQgc3QKvVmxrzzo7f4aXn8N74eyP4b2lV1Z2Q+rohxps7EHTkOY9jLdqxI3MXe7je4g2qepz\n", | |
|
890 | "71+hY+jYdX+9LO0kA0Zg3NfyAlIRX7k6c/YHAZNtNaGZgTBMqiPgmEjiJH9Luk7shbgr+srfwiYw\n", | |
|
891 | "BX9rdS3fQNNFwcT8orQC+F60LAY9+GbFo2Sw3Ld4Tw9jq9yJtrY8RtHAdzytyek/mv2+j2TbTvAQ\n", | |
|
892 | "KbbCYtdC8E/KtR4V5ZTSScr5Wb63vmbw7UpddEXYvl55pARyyvMxWNSh3Li4GF8Jk5JBi5B5ASQw\n", | |
|
893 | "xCMYpX5hkAMc+d8tl2bT+IEvUTsAAAElQZoQSeEPJlMCK/8AJIAzFZs00JJ0yfm8CZiew4xWdArL\n", | |
|
894 | "klEvBVXo/+ukPLu3XP9HFOfsme3T6BJEKmPPgZw/Lxnraq6Sl2kLVW19YU1qmqgfv+80LkZaWU5g\n", | |
|
895 | "RAH4hqyo3bFYcbuY2SC3IW5Wm69gtYyAXOdbAYSEHA16fvCeRQjHEsxKVndJdrRAlrGHsKgUBQ3U\n", | |
|
896 | "p/ZXIy1vkdFOfKSjpuZnswkuqr8NZI5tJ/dnBSErBTNWPaNwWV7nNomC0EYVGo+geGBhLXzaLw0U\n", | |
|
897 | "AOCYGjiPc3803BDw1GLoLIXjrIFJxwRfBNIAXYZAglu30oYzhpAfRWSprkeULMWYJTlWvbUQ5CNe\n", | |
|
898 | "wSZssuDWIRAc3w8AcFaywwn+YSGhtR8VI1OGjYkfBbcAAAD8QZoxSeEPJlMCK/8AJdokjCUETRw/\n", | |
|
899 | "nciVPtaZQSBP/VxAQSITASEzlJBl9Na1r0DJhLOz279+KQLtl/xHZ8vAKc528mTMTqtWs4sFbeVg\n", | |
|
900 | "HWyBpHcHEtgTzjIqEinp/MPuUXF5poo8YLSSMFn9Ozx2FbU5/Kh9A39oN9NHQflVxV1NA6yT/84H\n", | |
|
901 | "HyfMtfdSMS8KTvAEE2lDs14VQayNs5ctjXboQT7xMBf5OLj6thhPvgaDrFB2o/PV9ouK147lruWT\n", | |
|
902 | "P2mkoA9oDIMYW1pcBx4yyV/t9GOPZ3aXneMUb2fFmUCX43BjXfUDMaa4GO2/Ankj3UEQwDxA7ZlN\n", | |
|
903 | "UQK2AAAA4UGaUknhDyZTAiv/ACJHv33I08bkhybYiJ/JiiheW5zMPBu4n5CxGr3frhE7TkLh0vPk\n", | |
|
904 | "tM8m/AhaDiJisdk5QXNe/4WmxEDSAyaVi4eUVu0iHT2ly/KNTGqiORqA2oKpTjh84nYbrpXwnGv9\n", | |
|
905 | "SOf/34Z06xN6Yo3t35UZrP8nlcs/63GtnEmnUwVZHBYfPM6bs5M5AeBfAQ/9mIqu7vnEst+5O2wp\n", | |
|
906 | "PjzdItjwGCZ2ApHVjGnYYFomlA9nm6AXnxNIWHIsDgxCk3zx+6QbXipu/CWLG1Wf0WIbt4C0JPVl\n", | |
|
907 | "3TEb0QAAAMlBmnNJ4Q8mUwIr/wAVV64OfTKmlktYOqZHH1W1DhPy/X/6sD4T6hRdzfOgNtTOX2Ic\n", | |
|
908 | "kRJHshfBQVkJIzns079io6kpJFCcS3VD4zrWCn/dNaGV0kWTpFBRuusfn8F0C0R/EhsQeyTsdZft\n", | |
|
909 | "EkLGb5tq+nrir3vfmeb7rjmWJRXkIrTEKu8pIuAd+4FBGp8ARgGe80Jqpp//s1433HqBFqXsIFJT\n", | |
|
910 | "mU8j/toF9HyueI1Ea4uvsQ6NANGcYCbOAKCmbNiwABMCFaiUTMAAAAPSbW9vdgAAAGxtdmhkAAAA\n", | |
|
911 | "AHwlsIB8JbCAAAAD6AAAAyAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA\n", | |
|
912 | "AAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAv10cmFrAAAAXHRraGQA\n", | |
|
913 | "AAAPfCWwgHwlsIAAAAABAAAAAAAAAyAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB\n", | |
|
914 | "AAAAAAAAAAAAAAAAAABAAAAAAY4AAAGGAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAMgAAAA\n", | |
|
915 | "AgABAAAAAAJ1bWRpYQAAACBtZGhkAAAAAHwlsIB8JbCAAAAAGQAAABRVxAAAAAAALWhkbHIAAAAA\n", | |
|
916 | "AAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACIG1pbmYAAAAUdm1oZAAAAAEAAAAA\n", | |
|
917 | "AAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAeBzdGJsAAAAtHN0c2QA\n", | |
|
918 | "AAAAAAAAAQAAAKRhdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAY4BhgBIAAAASAAAAAAAAAAB\n", | |
|
919 | "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAAMmF2Y0MBZAAV/+EAGWdkABWs\n", | |
|
920 | "2UGQz6mhAAADAAEAAAMAMg8WLZYBAAZo6+PLIsAAAAAcdXVpZGtoQPJfJE/FujmlG88DI/MAAAAA\n", | |
|
921 | "AAAAGHN0dHMAAAAAAAAAAQAAABQAAAABAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAA\n", | |
|
922 | "AAABAAAAFAAAAAIAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAZHN0c3oAAAAAAAAAAAAA\n", | |
|
923 | "ABQAAA05AAACqQAAAl8AAAITAAACiwAAAh8AAAIvAAABiAAAAVsAAAE5AAABWwAAAUQAAAFmAAAA\n", | |
|
924 | "/QAAAUEAAAEaAAABKQAAAQAAAADlAAAAzQAAAGBzdGNvAAAAAAAAABQAAAAsAAANZQAAEA4AABJt\n", | |
|
925 | "AAAUgAAAFwsAABkqAAAbWQAAHOEAAB48AAAfdQAAINAAACIUAAAjegAAJHcAACW4AAAm0gAAJ/sA\n", | |
|
926 | "ACj7AAAp4AAAAGF1ZHRhAAAAWW1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAA\n", | |
|
927 | "AAAAAAAALGlsc3QAAAAkqXRvbwAAABxkYXRhAAAAAQAAAABMYXZmNTIuMTExLjA=\n", | |
|
859 | 928 | "\">" |
|
860 | 929 | ], |
|
861 | 930 | "output_type": "pyout", |
|
862 |
"prompt_number": |
|
|
931 | "prompt_number": 8, | |
|
863 | 932 | "text": [ |
|
864 |
" |
|
|
933 | "<IPython.core.display.HTML at 0x105baff50>" | |
|
865 | 934 | ] |
|
866 | 935 | } |
|
867 | 936 | ], |
|
868 |
"prompt_number": |
|
|
937 | "prompt_number": 8 | |
|
869 | 938 | }, |
|
870 | 939 | { |
|
871 | 940 | "cell_type": "markdown", |
|
941 | "metadata": {}, | |
|
872 | 942 | "source": [ |
|
873 | "## Local Files", | |
|
874 | "", | |
|
875 | "The above examples embed images and video from the notebook filesystem in the output", | |
|
876 | "areas of code cells. It is also possible to request these files directly in markdown cells", | |
|
877 | "if they reside in the notebook directory via relative urls prefixed with `files/`:", | |
|
878 | "", | |
|
879 | " files/[subdirectory/]<filename>", | |
|
880 | "", | |
|
881 | "", | |
|
882 | "For example, in the example notebook folder, we have the Python logo, addressed as:", | |
|
883 | "", | |
|
884 | " <img src=\"files/python-logo.svg\" />", | |
|
885 | "", | |
|
886 | "<img src=\"/files/python-logo.svg\" />", | |
|
887 | "", | |
|
888 | "and a video with the HTML5 video tag:", | |
|
889 | "", | |
|
890 | " <video controls src=\"files/animation.m4v\" />", | |
|
891 | "", | |
|
892 | "<video controls src=\"/files/animation.m4v\" />", | |
|
893 | "", | |
|
894 | "These do not embed the data into the notebook file,", | |
|
895 | "and require that the files exist when you are viewing the notebook.", | |
|
896 | "", | |
|
897 | "### Security of local files", | |
|
898 | "", | |
|
899 | "Note that this means that the IPython notebook server also acts as a generic file server", | |
|
900 | "for files inside the same tree as your notebooks. Access is not granted outside the", | |
|
901 | "notebook folder so you have strict control over what files are visible, but for this", | |
|
902 | "reason it is highly recommended that you do not run the notebook server with a notebook", | |
|
903 | "directory at a high level in your filesystem (e.g. your home directory).", | |
|
904 | "", | |
|
905 | "When you run the notebook in a password-protected manner, local file access is restricted", | |
|
943 | "## Local Files\n", | |
|
944 | "\n", | |
|
945 | "The above examples embed images and video from the notebook filesystem in the output\n", | |
|
946 | "areas of code cells. It is also possible to request these files directly in markdown cells\n", | |
|
947 | "if they reside in the notebook directory via relative urls prefixed with `files/`:\n", | |
|
948 | "\n", | |
|
949 | " files/[subdirectory/]<filename>\n", | |
|
950 | "\n", | |
|
951 | "\n", | |
|
952 | "For example, in the example notebook folder, we have the Python logo, addressed as:\n", | |
|
953 | "\n", | |
|
954 | " <img src=\"files/python-logo.svg\" />\n", | |
|
955 | "\n", | |
|
956 | "<img src=\"/files/python-logo.svg\" />\n", | |
|
957 | "\n", | |
|
958 | "and a video with the HTML5 video tag:\n", | |
|
959 | "\n", | |
|
960 | " <video controls src=\"files/animation.m4v\" />\n", | |
|
961 | "\n", | |
|
962 | "<video controls src=\"/files/animation.m4v\" />\n", | |
|
963 | "\n", | |
|
964 | "These do not embed the data into the notebook file,\n", | |
|
965 | "and require that the files exist when you are viewing the notebook.\n", | |
|
966 | "\n", | |
|
967 | "### Security of local files\n", | |
|
968 | "\n", | |
|
969 | "Note that this means that the IPython notebook server also acts as a generic file server\n", | |
|
970 | "for files inside the same tree as your notebooks. Access is not granted outside the\n", | |
|
971 | "notebook folder so you have strict control over what files are visible, but for this\n", | |
|
972 | "reason it is highly recommended that you do not run the notebook server with a notebook\n", | |
|
973 | "directory at a high level in your filesystem (e.g. your home directory).\n", | |
|
974 | "\n", | |
|
975 | "When you run the notebook in a password-protected manner, local file access is restricted\n", | |
|
906 | 976 | "to authenticated users unless read-only views are active." |
|
907 | 977 | ] |
|
908 | 978 | }, |
|
909 | 979 | { |
|
910 | 980 | "cell_type": "markdown", |
|
981 | "metadata": {}, | |
|
911 | 982 | "source": [ |
|
912 | "### External sites", | |
|
913 | "", | |
|
914 | "You can even embed an entire page from another site in an iframe; for example this is today's Wikipedia", | |
|
983 | "### External sites\n", | |
|
984 | "\n", | |
|
985 | "You can even embed an entire page from another site in an iframe; for example this is today's Wikipedia\n", | |
|
915 | 986 | "page for mobile users:" |
|
916 | 987 | ] |
|
917 | 988 | }, |
@@ -922,31 +993,33 b'' | |||
|
922 | 993 | "HTML('<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>')" |
|
923 | 994 | ], |
|
924 | 995 | "language": "python", |
|
996 | "metadata": {}, | |
|
925 | 997 | "outputs": [ |
|
926 | 998 | { |
|
927 | 999 | "html": [ |
|
928 | 1000 | "<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>" |
|
929 | 1001 | ], |
|
930 | 1002 | "output_type": "pyout", |
|
931 |
"prompt_number": |
|
|
1003 | "prompt_number": 9, | |
|
932 | 1004 | "text": [ |
|
933 |
" |
|
|
1005 | "<IPython.core.display.HTML at 0x105baff10>" | |
|
934 | 1006 | ] |
|
935 | 1007 | } |
|
936 | 1008 | ], |
|
937 |
"prompt_number": |
|
|
1009 | "prompt_number": 9 | |
|
938 | 1010 | }, |
|
939 | 1011 | { |
|
940 | 1012 | "cell_type": "markdown", |
|
1013 | "metadata": {}, | |
|
941 | 1014 | "source": [ |
|
942 | "### Mathematics", | |
|
943 | "", | |
|
944 | "And we also support the display of mathematical expressions typeset in LaTeX, which is rendered", | |
|
945 | "in the browser thanks to the [MathJax library](http://mathjax.org). ", | |
|
946 | "", | |
|
947 | "Note that this is *different* from the above examples. Above we were typing mathematical expressions", | |
|
948 | "in Markdown cells (along with normal text) and letting the browser render them; now we are displaying", | |
|
949 | "the output of a Python computation as a LaTeX expression wrapped by the `Math()` object so the browser", | |
|
1015 | "### Mathematics\n", | |
|
1016 | "\n", | |
|
1017 | "And we also support the display of mathematical expressions typeset in LaTeX, which is rendered\n", | |
|
1018 | "in the browser thanks to the [MathJax library](http://mathjax.org). \n", | |
|
1019 | "\n", | |
|
1020 | "Note that this is *different* from the above examples. Above we were typing mathematical expressions\n", | |
|
1021 | "in Markdown cells (along with normal text) and letting the browser render them; now we are displaying\n", | |
|
1022 | "the output of a Python computation as a LaTeX expression wrapped by the `Math()` object so the browser\n", | |
|
950 | 1023 | "renders it. The `Math` object will add the needed LaTeX delimiters (`$$`) if they are not provided:" |
|
951 | 1024 | ] |
|
952 | 1025 | }, |
@@ -954,26 +1027,28 b'' | |||
|
954 | 1027 | "cell_type": "code", |
|
955 | 1028 | "collapsed": false, |
|
956 | 1029 | "input": [ |
|
957 | "from IPython.core.display import Math", | |
|
1030 | "from IPython.core.display import Math\n", | |
|
958 | 1031 | "Math(r'F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx')" |
|
959 | 1032 | ], |
|
960 | 1033 | "language": "python", |
|
1034 | "metadata": {}, | |
|
961 | 1035 | "outputs": [ |
|
962 | 1036 | { |
|
963 | 1037 | "latex": [ |
|
964 | 1038 | "$$F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx$$" |
|
965 | 1039 | ], |
|
966 | 1040 | "output_type": "pyout", |
|
967 | "prompt_number": 1, | |
|
1041 | "prompt_number": 10, | |
|
968 | 1042 | "text": [ |
|
969 |
"<IPython.core.display.Math |
|
|
1043 | "<IPython.core.display.Math at 0x105bafb10>" | |
|
970 | 1044 | ] |
|
971 | 1045 | } |
|
972 | 1046 | ], |
|
973 | "prompt_number": 1 | |
|
1047 | "prompt_number": 10 | |
|
974 | 1048 | }, |
|
975 | 1049 | { |
|
976 | 1050 | "cell_type": "markdown", |
|
1051 | "metadata": {}, | |
|
977 | 1052 | "source": [ |
|
978 | 1053 | "With the `Latex` class, you have to include the delimiters yourself. This allows you to use other LaTeX modes such as `eqnarray`:" |
|
979 | 1054 | ] |
@@ -982,112 +1057,137 b'' | |||
|
982 | 1057 | "cell_type": "code", |
|
983 | 1058 | "collapsed": false, |
|
984 | 1059 | "input": [ |
|
985 | "from IPython.core.display import Latex", | |
|
986 | "Latex(r\"\"\"\\begin{eqnarray}", | |
|
987 | "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\", | |
|
988 | "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\", | |
|
989 | "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\", | |
|
990 | "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 ", | |
|
1060 | "from IPython.core.display import Latex\n", | |
|
1061 | "Latex(r\"\"\"\\begin{eqnarray}\n", | |
|
1062 | "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n", | |
|
1063 | "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n", | |
|
1064 | "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n", | |
|
1065 | "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 \n", | |
|
991 | 1066 | "\\end{eqnarray}\"\"\")" |
|
992 | 1067 | ], |
|
993 | 1068 | "language": "python", |
|
1069 | "metadata": {}, | |
|
994 | 1070 | "outputs": [ |
|
995 | 1071 | { |
|
996 | 1072 | "latex": [ |
|
997 | "\\begin{eqnarray}", | |
|
998 |
"\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\ |
|
|
999 | "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\", | |
|
1000 | "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 ", | |
|
1073 | "\\begin{eqnarray}\n", | |
|
1074 | "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n", | |
|
1075 | "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n", | |
|
1076 | "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n", | |
|
1077 | "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 \n", | |
|
1001 | 1078 | "\\end{eqnarray}" |
|
1002 | 1079 | ], |
|
1003 | 1080 | "output_type": "pyout", |
|
1004 |
"prompt_number": |
|
|
1081 | "prompt_number": 11, | |
|
1005 | 1082 | "text": [ |
|
1006 |
"<IPython.core.display.Latex |
|
|
1083 | "<IPython.core.display.Latex at 0x105bafc10>" | |
|
1007 | 1084 | ] |
|
1008 | 1085 | } |
|
1009 | 1086 | ], |
|
1010 |
"prompt_number": |
|
|
1087 | "prompt_number": 11 | |
|
1011 | 1088 | }, |
|
1012 | 1089 | { |
|
1013 | 1090 | "cell_type": "markdown", |
|
1091 | "metadata": {}, | |
|
1014 | 1092 | "source": [ |
|
1015 | "# Loading external codes", | |
|
1016 | "* Drag and drop a ``.py`` in the dashboard", | |
|
1017 | "* Use ``%load`` with any local or remote url: [the Matplotlib Gallery!](http://matplotlib.sourceforge.net/gallery.html)", | |
|
1018 | "", | |
|
1019 | "In this notebook we've kept the output saved so you can see the result, but you should run the next", | |
|
1093 | "# Loading external codes\n", | |
|
1094 | "* Drag and drop a ``.py`` in the dashboard\n", | |
|
1095 | "* Use ``%load`` with any local or remote url: [the Matplotlib Gallery!](http://matplotlib.sourceforge.net/gallery.html)\n", | |
|
1096 | "\n", | |
|
1097 | "In this notebook we've kept the output saved so you can see the result, but you should run the next\n", | |
|
1020 | 1098 | "cell yourself (with an active internet connection)." |
|
1021 | 1099 | ] |
|
1022 | 1100 | }, |
|
1023 | 1101 | { |
|
1102 | "cell_type": "markdown", | |
|
1103 | "metadata": {}, | |
|
1104 | "source": [ | |
|
1105 | "Let's make sure we have pylab again, in case we have restarted the kernel due to the crash demo above" | |
|
1106 | ] | |
|
1107 | }, | |
|
1108 | { | |
|
1024 | 1109 | "cell_type": "code", |
|
1025 |
"collapsed": |
|
|
1110 | "collapsed": false, | |
|
1111 | "input": [ | |
|
1112 | "%pylab inline" | |
|
1113 | ], | |
|
1114 | "language": "python", | |
|
1115 | "metadata": {}, | |
|
1116 | "outputs": [ | |
|
1117 | { | |
|
1118 | "output_type": "stream", | |
|
1119 | "stream": "stdout", | |
|
1120 | "text": [ | |
|
1121 | "\n", | |
|
1122 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", | |
|
1123 | "For more information, type 'help(pylab)'.\n" | |
|
1124 | ] | |
|
1125 | } | |
|
1126 | ], | |
|
1127 | "prompt_number": 12 | |
|
1128 | }, | |
|
1129 | { | |
|
1130 | "cell_type": "code", | |
|
1131 | "collapsed": false, | |
|
1026 | 1132 | "input": [ |
|
1027 | 1133 | "%load http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/integral_demo.py" |
|
1028 | 1134 | ], |
|
1029 | 1135 | "language": "python", |
|
1136 | "metadata": {}, | |
|
1030 | 1137 | "outputs": [], |
|
1031 |
"prompt_number": |
|
|
1138 | "prompt_number": 15 | |
|
1032 | 1139 | }, |
|
1033 | 1140 | { |
|
1034 | 1141 | "cell_type": "code", |
|
1035 | 1142 | "collapsed": false, |
|
1036 | 1143 | "input": [ |
|
1037 | "#!/usr/bin/env python", | |
|
1038 | "", | |
|
1039 | "# implement the example graphs/integral from pyx", | |
|
1040 | "from pylab import *", | |
|
1041 | "from matplotlib.patches import Polygon", | |
|
1042 | "", | |
|
1043 | "def func(x):", | |
|
1044 | " return (x-3)*(x-5)*(x-7)+85", | |
|
1045 | "", | |
|
1046 | "ax = subplot(111)", | |
|
1047 | "", | |
|
1048 | "a, b = 2, 9 # integral area", | |
|
1049 | "x = arange(0, 10, 0.01)", | |
|
1050 | "y = func(x)", | |
|
1051 | "plot(x, y, linewidth=1)", | |
|
1052 | "", | |
|
1053 | "# make the shaded region", | |
|
1054 | "ix = arange(a, b, 0.01)", | |
|
1055 | "iy = func(ix)", | |
|
1056 | "verts = [(a,0)] + zip(ix,iy) + [(b,0)]", | |
|
1057 | "poly = Polygon(verts, facecolor='0.8', edgecolor='k')", | |
|
1058 | "ax.add_patch(poly)", | |
|
1059 | "", | |
|
1060 | "text(0.5 * (a + b), 30,", | |
|
1061 | " r\"$\\int_a^b f(x)\\mathrm{d}x$\", horizontalalignment='center',", | |
|
1062 | " fontsize=20)", | |
|
1063 | "", | |
|
1064 | "axis([0,10, 0, 180])", | |
|
1065 | "figtext(0.9, 0.05, 'x')", | |
|
1066 | "figtext(0.1, 0.9, 'y')", | |
|
1067 | "ax.set_xticks((a,b))", | |
|
1068 | "ax.set_xticklabels(('a','b'))", | |
|
1069 | "ax.set_yticks([])", | |
|
1070 | "show()" | |
|
1144 | "#!/usr/bin/env python\n", | |
|
1145 | "\n", | |
|
1146 | "# implement the example graphs/integral from pyx\n", | |
|
1147 | "from pylab import *\n", | |
|
1148 | "from matplotlib.patches import Polygon\n", | |
|
1149 | "\n", | |
|
1150 | "def func(x):\n", | |
|
1151 | " return (x-3)*(x-5)*(x-7)+85\n", | |
|
1152 | "\n", | |
|
1153 | "ax = subplot(111)\n", | |
|
1154 | "\n", | |
|
1155 | "a, b = 2, 9 # integral area\n", | |
|
1156 | "x = arange(0, 10, 0.01)\n", | |
|
1157 | "y = func(x)\n", | |
|
1158 | "plot(x, y, linewidth=1)\n", | |
|
1159 | "\n", | |
|
1160 | "# make the shaded region\n", | |
|
1161 | "ix = arange(a, b, 0.01)\n", | |
|
1162 | "iy = func(ix)\n", | |
|
1163 | "verts = [(a,0)] + zip(ix,iy) + [(b,0)]\n", | |
|
1164 | "poly = Polygon(verts, facecolor='0.8', edgecolor='k')\n", | |
|
1165 | "ax.add_patch(poly)\n", | |
|
1166 | "\n", | |
|
1167 | "text(0.5 * (a + b), 30,\n", | |
|
1168 | " r\"$\\int_a^b f(x)\\mathrm{d}x$\", horizontalalignment='center',\n", | |
|
1169 | " fontsize=20)\n", | |
|
1170 | "\n", | |
|
1171 | "axis([0,10, 0, 180])\n", | |
|
1172 | "figtext(0.9, 0.05, 'x')\n", | |
|
1173 | "figtext(0.1, 0.9, 'y')\n", | |
|
1174 | "ax.set_xticks((a,b))\n", | |
|
1175 | "ax.set_xticklabels(('a','b'))\n", | |
|
1176 | "ax.set_yticks([])\n", | |
|
1177 | "show()\n" | |
|
1071 | 1178 | ], |
|
1072 | 1179 | "language": "python", |
|
1180 | "metadata": {}, | |
|
1073 | 1181 | "outputs": [ |
|
1074 | 1182 | { |
|
1075 | 1183 | "output_type": "display_data", |
|
1076 | "png": "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\nSUVORK5CYII=\n" | |
|
1184 | "png": "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\ng23UdEXM4ccffzS6hFo5pem+/roj5XrwGEVEmgFPnuWe0uQLaVu3Qno6/PvfzijHM/n4+LBv3z6e\nfvppo0vJDkGKAAAB1ElEQVQRkVrYbDajS6iTxV7L1NkMf2qIiHii87XWWpOup18FFBExGx28KCLi\nRmq6IiJupKZbh9tuu43evXuTnJzMhx9+aHQ5IlKDvLw8uprkziyXP4Ld7D7++GOioqIoLy+nb9++\n3H777bRs2dLoskTEpJR06/D222/TvXt3BgwYQEFBATk5OUaXJCI1qK6uZtSoUXTp0oU777yT8vJy\no0uqkZpuLX788UeWLFlCWloaGzdupHv37lRWVhpdlojUICsri7Fjx5KZmUlERATvvvuu0SXVSE23\nFsXFxURFRREUFMS2bdtIS0szuiQROY/27dszYMAAAEaNGsXy5csNrqhmarq1uP7666murqZLly48\n++yzp/+DiojnOfNmLk8+3lEX0moREBDAwoULjS5DROohPz+ftLQ0+vfvz7x587jiiiuMLqlGSroi\nYnoWi4XExETeeecdunTpwrFjx3j00UeNLqtGtZ69ICIizqWkKyLiRmq6IiJupKYrIuJka9asoVu3\nblRWVlJaWkpycjKZmZmAZroiIi4xadIkKioqKC8vp3379kycOBFQ0xURcYkTJ07Qu3dvgoOD+eWX\nX07vG9Z4QUTEBQ4dOkRpaSklJSVnnQPx/xV9BfkfDyZLAAAAAElFTkSuQmCC\n" | |
|
1077 | 1185 | } |
|
1078 | 1186 | ], |
|
1079 |
"prompt_number": |
|
|
1080 | }, | |
|
1081 | { | |
|
1082 | "cell_type": "code", | |
|
1083 | "collapsed": true, | |
|
1084 | "input": [ | |
|
1085 | "" | |
|
1086 | ], | |
|
1087 | "language": "python", | |
|
1088 | "outputs": [] | |
|
1187 | "prompt_number": 16 | |
|
1089 | 1188 | } |
|
1090 | ] | |
|
1189 | ], | |
|
1190 | "metadata": {} | |
|
1091 | 1191 | } |
|
1092 | 1192 | ] |
|
1093 | } | |
|
1193 | } No newline at end of file |
This diff has been collapsed as it changes many lines, (708 lines changed) Show them Hide them | |||
@@ -3,480 +3,600 b'' | |||
|
3 | 3 | "name": "01_notebook_introduction" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
11 | "cell_type": "heading", | |
|
12 | "level": 1, | |
|
13 | "metadata": {}, | |
|
14 | "source": [ | |
|
15 | "An introduction to the IPython notebook" | |
|
16 | ] | |
|
17 | }, | |
|
18 | { | |
|
10 | 19 | "cell_type": "markdown", |
|
20 | "metadata": {}, | |
|
11 | 21 | "source": [ |
|
12 | "# An introduction to the IPython notebook", | |
|
13 | "", | |
|
14 | "The IPython web notebook is a frontend that allows for new modes", | |
|
15 | "of interaction with IPython: this web-based interface allows you to execute Python and IPython", | |
|
16 | "commands in each input cell just like you would at the IPython terminal or Qt console, but you can", | |
|
17 | "also save an entire session as a document in a file with the `.ipynb` extension.", | |
|
18 | "", | |
|
19 | "The document you are reading now is precisely an example of one such notebook, and we will show you", | |
|
20 | "here how to best use this new interface.", | |
|
21 | "", | |
|
22 | "The first thing to understand is that a notebook consists of a sequence of 'cells' that can contain ", | |
|
23 | "either text (such as this one) or code meant for execution (such as the next one):", | |
|
24 | "", | |
|
25 | "* Text cells can be written using [Markdown syntax](http://daringfireball.net/projects/markdown/syntax) ", | |
|
26 | "(in a future release we will also provide support for reStructuredText and Sphinx integration, and we ", | |
|
27 | "welcome help from interested contributors to make that happen).", | |
|
28 | "", | |
|
29 | "* Code cells take IPython input (i.e. Python code, `%magics`, `!system calls`, etc) like IPython at", | |
|
30 | "the terminal or at the Qt Console. The only difference is that in order to execute a cell, you *must*", | |
|
31 | "use `Shift-Enter`, as pressing `Enter` will add a new line of text to the cell. When you type ", | |
|
32 | "`Shift-Enter`, the cell content is executed, output displayed and a new cell is created below. Try", | |
|
22 | "\n", | |
|
23 | "The IPython web notebook is a frontend that allows for new modes\n", | |
|
24 | "of interaction with IPython: this web-based interface allows you to execute Python and IPython\n", | |
|
25 | "commands in each input cell just like you would at the IPython terminal or Qt console, but you can\n", | |
|
26 | "also save an entire session as a document in a file with the `.ipynb` extension.\n", | |
|
27 | "\n", | |
|
28 | "The document you are reading now is precisely an example of one such notebook, and we will show you\n", | |
|
29 | "here how to best use this new interface.\n", | |
|
30 | "\n", | |
|
31 | "The first thing to understand is that a notebook consists of a sequence of 'cells' that can contain \n", | |
|
32 | "either text (such as this one) or code meant for execution (such as the next one):\n", | |
|
33 | "\n", | |
|
34 | "* Text cells can be written using [Markdown syntax](http://daringfireball.net/projects/markdown/syntax) \n", | |
|
35 | "(in a future release we will also provide support for reStructuredText and Sphinx integration, and we \n", | |
|
36 | "welcome help from interested contributors to make that happen).\n", | |
|
37 | "\n", | |
|
38 | "* Code cells take IPython input (i.e. Python code, `%magics`, `!system calls`, etc) like IPython at\n", | |
|
39 | "the terminal or at the Qt Console. The only difference is that in order to execute a cell, you *must*\n", | |
|
40 | "use `Shift-Enter`, as pressing `Enter` will add a new line of text to the cell. When you type \n", | |
|
41 | "`Shift-Enter`, the cell content is executed, output displayed and a new cell is created below. Try\n", | |
|
33 | 42 | "it now by putting your cursor on the next cell and typing `Shift-Enter`:" |
|
34 | 43 | ] |
|
35 | 44 | }, |
|
36 | 45 | { |
|
37 | 46 | "cell_type": "code", |
|
47 | "collapsed": false, | |
|
38 | 48 | "input": [ |
|
39 | 49 | "\"This is the new IPython notebook\"" |
|
40 | 50 | ], |
|
41 | 51 | "language": "python", |
|
52 | "metadata": {}, | |
|
42 | 53 | "outputs": [ |
|
43 | 54 | { |
|
44 | 55 | "output_type": "pyout", |
|
45 |
"prompt_number": |
|
|
56 | "prompt_number": 2, | |
|
46 | 57 | "text": [ |
|
47 | 58 | "'This is the new IPython notebook'" |
|
48 | 59 | ] |
|
49 | 60 | } |
|
50 | 61 | ], |
|
51 |
"prompt_number": |
|
|
62 | "prompt_number": 2 | |
|
52 | 63 | }, |
|
53 | 64 | { |
|
54 | 65 | "cell_type": "markdown", |
|
66 | "metadata": {}, | |
|
55 | 67 | "source": [ |
|
56 | "You can re-execute the same cell over and over as many times as you want. Simply put your", | |
|
57 | "cursor in the cell again, edit at will, and type `Shift-Enter` to execute. ", | |
|
58 | "", | |
|
59 | "**Tip:** A cell can also be executed", | |
|
60 | "*in-place*, where IPython executes its content but leaves the cursor in the same cell. This is done by", | |
|
61 | "typing `Ctrl-Enter` instead, and is useful if you want to quickly run a command to check something ", | |
|
62 | "before tping the real content you want to leave in the cell. For example, in the next cell, try issuing", | |
|
68 | "You can re-execute the same cell over and over as many times as you want. Simply put your\n", | |
|
69 | "cursor in the cell again, edit at will, and type `Shift-Enter` to execute. \n", | |
|
70 | "\n", | |
|
71 | "**Tip:** A cell can also be executed\n", | |
|
72 | "*in-place*, where IPython executes its content but leaves the cursor in the same cell. This is done by\n", | |
|
73 | "typing `Ctrl-Enter` instead, and is useful if you want to quickly run a command to check something \n", | |
|
74 | "before tping the real content you want to leave in the cell. For example, in the next cell, try issuing\n", | |
|
63 | 75 | "several system commands in-place with `Ctrl-Enter`, such as `pwd` and then `ls`:" |
|
64 | 76 | ] |
|
65 | 77 | }, |
|
66 | 78 | { |
|
67 | 79 | "cell_type": "code", |
|
80 | "collapsed": false, | |
|
68 | 81 | "input": [ |
|
69 | 82 | "ls" |
|
70 | 83 | ], |
|
71 | 84 | "language": "python", |
|
85 | "metadata": {}, | |
|
72 | 86 | "outputs": [ |
|
73 | 87 | { |
|
74 | 88 | "output_type": "stream", |
|
75 | 89 | "stream": "stdout", |
|
76 | 90 | "text": [ |
|
77 |
"00_notebook_tour.ipynb |
|
|
78 |
"01_notebook_introduction.ipynb |
|
|
79 | "display_protocol.ipynb sympy.ipynb" | |
|
91 | "00_notebook_tour.ipynb callbacks.ipynb python-logo.svg\r\n", | |
|
92 | "01_notebook_introduction.ipynb cython_extension.ipynb rmagic_extension.ipynb\r\n", | |
|
93 | "Animations_and_Progress.ipynb display_protocol.ipynb sympy.ipynb\r\n", | |
|
94 | "Capturing Output.ipynb formatting.ipynb sympy_quantum_computing.ipynb\r\n", | |
|
95 | "Script Magics.ipynb octavemagic_extension.ipynb trapezoid_rule.ipynb\r\n", | |
|
96 | "animation.m4v progbar.ipynb\r\n" | |
|
80 | 97 | ] |
|
81 | 98 | } |
|
82 | 99 | ], |
|
83 |
"prompt_number": |
|
|
100 | "prompt_number": 3 | |
|
84 | 101 | }, |
|
85 | 102 | { |
|
86 | 103 | "cell_type": "markdown", |
|
104 | "metadata": {}, | |
|
87 | 105 | "source": [ |
|
88 | "In a cell, you can type anything from a single python expression to an arbitrarily long amount of code ", | |
|
106 | "In a cell, you can type anything from a single python expression to an arbitrarily long amount of code \n", | |
|
89 | 107 | "(although for reasons of readability, you should probably limit this to a few dozen lines):" |
|
90 | 108 | ] |
|
91 | 109 | }, |
|
92 | 110 | { |
|
93 | 111 | "cell_type": "code", |
|
112 | "collapsed": false, | |
|
94 | 113 | "input": [ |
|
95 | "def f(x):", | |
|
96 | " \"\"\"My function", | |
|
97 | " x : parameter\"\"\"", | |
|
98 | " ", | |
|
99 | " return x+1", | |
|
100 | "", | |
|
114 | "def f(x):\n", | |
|
115 | " \"\"\"My function\n", | |
|
116 | " x : parameter\"\"\"\n", | |
|
117 | " \n", | |
|
118 | " return x+1\n", | |
|
119 | "\n", | |
|
101 | 120 | "print \"f(3) = \", f(3)" |
|
102 | 121 | ], |
|
103 | 122 | "language": "python", |
|
123 | "metadata": {}, | |
|
104 | 124 | "outputs": [ |
|
105 | 125 | { |
|
106 | 126 | "output_type": "stream", |
|
107 | 127 | "stream": "stdout", |
|
108 | 128 | "text": [ |
|
109 | "f(3) = 4" | |
|
129 | "f(3) = 4\n" | |
|
110 | 130 | ] |
|
111 | 131 | } |
|
112 | 132 | ], |
|
113 |
"prompt_number": |
|
|
133 | "prompt_number": 4 | |
|
134 | }, | |
|
135 | { | |
|
136 | "cell_type": "heading", | |
|
137 | "level": 2, | |
|
138 | "metadata": {}, | |
|
139 | "source": [ | |
|
140 | "User interface" | |
|
141 | ] | |
|
114 | 142 | }, |
|
115 | 143 | { |
|
116 | 144 | "cell_type": "markdown", |
|
145 | "metadata": {}, | |
|
117 | 146 | "source": [ |
|
118 | "## User interface", | |
|
119 | "", | |
|
120 | "When you start a new notebook server with `ipython notebook`, your", | |
|
121 | "browser should open into the *Dashboard*, a page listing all notebooks", | |
|
122 | "available in the current directory as well as letting you create new", | |
|
123 | "notebooks. In this page, you can also drag and drop existing `.py` files", | |
|
124 | "over the file list to import them as notebooks (see the manual for ", | |
|
125 | "[further details on how these files are ", | |
|
126 | "interpreted](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html)).", | |
|
127 | "", | |
|
128 | "Once you open an existing notebook (like this one) or create a new one,", | |
|
129 | "you are in the main notebook interface, which consists of a main editing", | |
|
130 | "area (where these cells are contained) as well as a collapsible left panel, ", | |
|
131 | "a permanent header area at the top, and a pager that rises from the", | |
|
147 | "When you start a new notebook server with `ipython notebook`, your\n", | |
|
148 | "browser should open into the *Dashboard*, a page listing all notebooks\n", | |
|
149 | "available in the current directory as well as letting you create new\n", | |
|
150 | "notebooks. In this page, you can also drag and drop existing `.py` files\n", | |
|
151 | "over the file list to import them as notebooks (see the manual for \n", | |
|
152 | "[further details on how these files are \n", | |
|
153 | "interpreted](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html)).\n", | |
|
154 | "\n", | |
|
155 | "Once you open an existing notebook (like this one) or create a new one,\n", | |
|
156 | "you are in the main notebook interface, which consists of a main editing\n", | |
|
157 | "area (where these cells are contained) as well as a menu and \n", | |
|
158 | "permanent header area at the top, and a pager that rises from the\n", | |
|
132 | 159 | "bottom when needed and can be collapsed again." |
|
133 | 160 | ] |
|
134 | 161 | }, |
|
135 | 162 | { |
|
163 | "cell_type": "heading", | |
|
164 | "level": 3, | |
|
165 | "metadata": {}, | |
|
166 | "source": [ | |
|
167 | "Main editing area" | |
|
168 | ] | |
|
169 | }, | |
|
170 | { | |
|
136 | 171 | "cell_type": "markdown", |
|
172 | "metadata": {}, | |
|
137 | 173 | "source": [ |
|
138 | "### Main editing area", | |
|
139 | "", | |
|
140 | "Here, you can move with the arrow keys or using the ", | |
|
141 | "scroll bars. The cursor enters code cells immediately, but only selects", | |
|
142 | "text (markdown) cells without entering in them; to enter a text cell,", | |
|
143 | "use `Enter`, and `Shift-Enter` to exit it again (just like to execute a ", | |
|
174 | "Here, you can move with the arrow keys or using the \n", | |
|
175 | "scroll bars. The cursor enters code cells immediately, but only selects\n", | |
|
176 | "text (markdown) cells without entering in them; to enter a text cell,\n", | |
|
177 | "use `Enter` (or double-click), and `Shift-Enter` to exit it again (just like to execute a \n", | |
|
144 | 178 | "code cell)." |
|
145 | 179 | ] |
|
146 | 180 | }, |
|
147 | 181 | { |
|
182 | "cell_type": "heading", | |
|
183 | "level": 3, | |
|
184 | "metadata": {}, | |
|
185 | "source": [ | |
|
186 | "Menu" | |
|
187 | ] | |
|
188 | }, | |
|
189 | { | |
|
148 | 190 | "cell_type": "markdown", |
|
191 | "metadata": {}, | |
|
192 | "source": [ | |
|
193 | "The menu bar conains all the commands you can use to manipulate the notebook.\n", | |
|
194 | "\n", | |
|
195 | "The *File* menu has the usual open/save file operations, as well as Export,\n", | |
|
196 | "for downloading the notebook to your computer.\n", | |
|
197 | "\n", | |
|
198 | "*Edit* has controls for cut/copy/paste, and moving cells around.\n", | |
|
199 | "\n", | |
|
200 | "*View* lets you toggle visibility of the header elements,\n", | |
|
201 | "to recover precious screen real estate.\n", | |
|
202 | "\n", | |
|
203 | "The *Cell* menu lets you manipulate individual cells,\n", | |
|
204 | "and the names should be fairly self-explanatory.\n", | |
|
205 | "\n", | |
|
206 | "The *Kernel* menu lets you signal the kernel executing your code. \n", | |
|
207 | "`Interrupt` does the equivalent of hitting `Ctrl-C` at a terminal, and\n", | |
|
208 | "`Restart` fully kills the kernel process and starts a fresh one. Obviously\n", | |
|
209 | "this means that all your previous variables are destroyed, but it also\n", | |
|
210 | "makes it easy to get a fresh kernel in which to re-execute a notebook, perhaps\n", | |
|
211 | "after changing an extension module for which Python's `reload` mechanism\n", | |
|
212 | "does not work.\n", | |
|
213 | "\n", | |
|
214 | "The *Help* menu contains links to the documentation of some projects\n", | |
|
215 | "closely related to IPython as well as the minimal keybindings you need to\n", | |
|
216 | "know. But you should use `Ctrl-m h` (or click the `QuickHelp` button at\n", | |
|
217 | "the top) and learn some of the other keybindings, as it will make your \n", | |
|
218 | "workflow much more fluid and efficient.\n", | |
|
219 | "\n", | |
|
220 | "You will also see a few buttons there for common actions,\n", | |
|
221 | "and hovering over each button will tell you which command they correspond to,\n", | |
|
222 | "if the icons are not clear enough." | |
|
223 | ] | |
|
224 | }, | |
|
225 | { | |
|
226 | "cell_type": "heading", | |
|
227 | "level": 3, | |
|
228 | "metadata": {}, | |
|
149 | 229 | "source": [ |
|
150 | "### Left panel", | |
|
151 | "", | |
|
152 | "This panel contains a number of panes that can be", | |
|
153 | "collapsed vertically by clicking on their title bar, and the whole panel", | |
|
154 | "can also be collapsed by clicking on the vertical divider (note that you", | |
|
155 | "can not *drag* the divider, for now you can only click on it).", | |
|
156 | "", | |
|
157 | "The *Notebook* section contains actions that pertain to the whole notebook,", | |
|
158 | "such as downloading the current notebook either in its original format", | |
|
159 | "or as a `.py` script, and printing it. When you click the `Print` button,", | |
|
160 | "a new HTML page opens with a static copy of the notebook; you can then", | |
|
161 | "use your web browser's mechanisms to save or print this file.", | |
|
162 | "", | |
|
163 | "The *Cell* section lets you manipulate individual cells, and the names should ", | |
|
164 | "be fairly self-explanatory.", | |
|
165 | "", | |
|
166 | "The *Kernel* section lets you signal the kernel executing your code. ", | |
|
167 | "`Interrupt` does the equivalent of hitting `Ctrl-C` at a terminal, and", | |
|
168 | "`Restart` fully kills the kernel process and starts a fresh one. Obviously", | |
|
169 | "this means that all your previous variables are destroyed, but it also", | |
|
170 | "makes it easy to get a fresh kernel in which to re-execute a notebook, perhaps", | |
|
171 | "after changing an extension module for which Python's `reload` mechanism", | |
|
172 | "does not work. If you check the 'Kill kernel upon exit' box, when you ", | |
|
173 | "close the page IPython will automatically shut down the running kernel;", | |
|
174 | "otherwise the kernels won't close until you stop the whole ", | |
|
175 | "", | |
|
176 | "The *Help* section contains links to the documentation of some projects", | |
|
177 | "closely related to IPython as well as the minimal keybindings you need to", | |
|
178 | "know. But you should use `Ctrl-m h` (or click the `QuickHelp` button at", | |
|
179 | "the top) and learn some of the other keybindings, as it will make your ", | |
|
180 | "workflow much more fluid and efficient." | |
|
230 | "Header bar" | |
|
181 | 231 | ] |
|
182 | 232 | }, |
|
183 | 233 | { |
|
184 | 234 | "cell_type": "markdown", |
|
235 | "metadata": {}, | |
|
185 | 236 | "source": [ |
|
186 | "### Header bar", | |
|
187 | "", | |
|
188 | "The header area at the top allows you to rename an existing ", | |
|
189 | "notebook and open up a short help tooltip. This area also indicates", | |
|
190 | "with a red **Busy** mark on the right whenever the kernel is busy executing", | |
|
237 | "The header area at the top allows you to rename an existing \n", | |
|
238 | "notebook and open up a short help tooltip. This area also indicates\n", | |
|
239 | "with a red **Busy** mark on the right whenever the kernel is busy executing\n", | |
|
191 | 240 | "code." |
|
192 | 241 | ] |
|
193 | 242 | }, |
|
194 | 243 | { |
|
244 | "cell_type": "heading", | |
|
245 | "level": 3, | |
|
246 | "metadata": {}, | |
|
247 | "source": [ | |
|
248 | "The pager at the bottom" | |
|
249 | ] | |
|
250 | }, | |
|
251 | { | |
|
195 | 252 | "cell_type": "markdown", |
|
253 | "metadata": {}, | |
|
196 | 254 | "source": [ |
|
197 | "### The pager at the bottom", | |
|
198 | "", | |
|
199 | "Whenever IPython needs to display additional ", | |
|
200 | "information, such as when you type `somefunction?` in a cell, the notebook", | |
|
201 | "opens a pane at the bottom where this information is shown. You can keep", | |
|
202 | "this pager pane open for reference (it doesn't block input in the main area)", | |
|
255 | "Whenever IPython needs to display additional \n", | |
|
256 | "information, such as when you type `somefunction?` in a cell, the notebook\n", | |
|
257 | "opens a pane at the bottom where this information is shown. You can keep\n", | |
|
258 | "this pager pane open for reference (it doesn't block input in the main area)\n", | |
|
203 | 259 | "or dismiss it by clicking on its divider bar." |
|
204 | 260 | ] |
|
205 | 261 | }, |
|
206 | 262 | { |
|
263 | "cell_type": "heading", | |
|
264 | "level": 3, | |
|
265 | "metadata": {}, | |
|
266 | "source": [ | |
|
267 | "Tab completion and tooltips" | |
|
268 | ] | |
|
269 | }, | |
|
270 | { | |
|
207 | 271 | "cell_type": "markdown", |
|
272 | "metadata": {}, | |
|
208 | 273 | "source": [ |
|
209 | "### Tab completion and tooltips", | |
|
210 | "", | |
|
211 | "The notebook uses the same underlying machinery for tab completion that ", | |
|
212 | "IPython uses at the terminal, but displays the information differently.", | |
|
213 | "Whey you complete with the `Tab` key, IPython shows a drop list with all", | |
|
214 | "available completions. If you type more characters while this list is open,", | |
|
215 | "IPython automatically eliminates from the list options that don't match the", | |
|
216 | "new characters; once there is only one option left you can hit `Tab` once", | |
|
217 | "more (or `Enter`) to complete. You can also select the completion you", | |
|
218 | "want with the arrow keys or the mouse, and then hit `Enter`.", | |
|
219 | "", | |
|
220 | "In addition, if you hit `Tab` inside of open parentheses, IPython will ", | |
|
221 | "search for the docstring of the last object left of the parens and will", | |
|
222 | "display it on a tooltip. For example, type `list(<TAB>` and you will", | |
|
274 | "The notebook uses the same underlying machinery for tab completion that \n", | |
|
275 | "IPython uses at the terminal, but displays the information differently.\n", | |
|
276 | "Whey you complete with the `Tab` key, IPython shows a drop list with all\n", | |
|
277 | "available completions. If you type more characters while this list is open,\n", | |
|
278 | "IPython automatically eliminates from the list options that don't match the\n", | |
|
279 | "new characters; once there is only one option left you can hit `Tab` once\n", | |
|
280 | "more (or `Enter`) to complete. You can also select the completion you\n", | |
|
281 | "want with the arrow keys or the mouse, and then hit `Enter`.\n", | |
|
282 | "\n", | |
|
283 | "In addition, if you hit `Tab` inside of open parentheses, IPython will \n", | |
|
284 | "search for the docstring of the last object left of the parens and will\n", | |
|
285 | "display it on a tooltip. For example, type `list(<TAB>` and you will\n", | |
|
223 | 286 | "see the docstring for the builtin `list` constructor:" |
|
224 | 287 | ] |
|
225 | 288 | }, |
|
226 | 289 | { |
|
227 | 290 | "cell_type": "code", |
|
291 | "collapsed": false, | |
|
228 | 292 | "input": [ |
|
229 | "# Position your cursor after the ( and hit the Tab key:", | |
|
293 | "# Position your cursor after the ( and hit the Tab key:\n", | |
|
230 | 294 | "range(" |
|
231 | 295 | ], |
|
232 | 296 | "language": "python", |
|
297 | "metadata": {}, | |
|
233 | 298 | "outputs": [] |
|
234 | 299 | }, |
|
235 | 300 | { |
|
236 | 301 | "cell_type": "markdown", |
|
302 | "metadata": {}, | |
|
237 | 303 | "source": [ |
|
238 |
"More |
|
|
239 | "", | |
|
240 | "* firt `tab` press, you get a classical tooltip", | |
|
241 |
"* second t |
|
|
242 |
"* third tab |
|
|
243 |
"* forth t |
|
|
244 | "<script>", | |
|
245 | " IPython.tooltip.tabs_functions = [ function(cell,text){", | |
|
246 | " IPython.tooltip._request_tooltip(cell,text);", | |
|
247 | " IPython.notification_widget.set_message('tab again to expand pager',2500);", | |
|
248 | " setTimeout(function(){", | |
|
249 | " $('.tooltiptext pre').text(\"function signture : You've invoked a tooltip !\\n\\nWell done! Here usualy lies the current function *call signature* and it's *docstring*. You can now expand the tooltip pressing <tab> a second time...\")},400);", | |
|
250 | " },", | |
|
251 | " function(){", | |
|
252 | " IPython.tooltip.expand();", | |
|
253 | " IPython.notification_widget.set_message('tab again to make pager sticky for 10s',2500);", | |
|
254 | " setTimeout(function(){", | |
|
255 | " $('.tooltiptext pre').text(\"Now the tooltip is expanded !\\", | |
|
256 | " \\n\\nThis is really usefull if you have long docstring and if you want to be able to scroll them. \\", | |
|
257 | "For example, I can give you many information about the tooltip:\\n - The tooltip is smart, and \\", | |
|
258 | "you don't always need to press tab to invoke it, if you press an opening bracket `(` then nothing \\", | |
|
259 | "for some time, tooltip will be invoked by itself.\\", | |
|
260 | "\\n - Also you can hoover over the icon on the top right to know what they are dooing...\\", | |
|
261 | "\\n\\nBack to the next lesson.\\n\\nSometime you need to the tooltip to stay on screen while\\", | |
|
262 | "you type. That's the reason for the sticky mode (indicated by a small clock on the top left of the tooltip),\\", | |
|
263 | "\\n\\nNow press <tab> a 3rd time and continue typing some text to test it...\")", | |
|
264 | " },400);", | |
|
265 | " },", | |
|
266 | " function(){", | |
|
267 | " var time = 35;", | |
|
268 | " IPython.tooltip.stick(time);", | |
|
269 | " $('.tooltiptext pre').text(\"Type more text !...\\n\\n range(7,125,3)\\n\\n The tooltip is in sticky mode, it won't be dismissed for at least 10 secondes \",400);", | |
|
270 | " setTimeout(function(){", | |
|
271 | " $('.tooltiptext pre').text(\"That was sticky mode...\\nI'll keep it on 15 more seconds just for you.\\n\\nLast thing you can do is send the current help displayed in the tooltip to the pager at the bottom of the screen. To do that, press tab 4 time in a row after a parenthesis. \\n\\n Now I'll stop bothering you and let you Play with the tooltip !\");", | |
|
272 | " reset_tooltip()", | |
|
273 | " },15000);", | |
|
274 | " },", | |
|
275 | " function(cell){", | |
|
276 | " IPython.tooltip.cancel_stick();", | |
|
277 | " reset_tooltip()", | |
|
278 | " IPython.tooltip.showInPager(cell);", | |
|
279 | " IPython.tooltip._cmfocus();", | |
|
280 | " }", | |
|
281 | " ];", | |
|
282 | " ", | |
|
283 | " reset_tooltip = function(){", | |
|
284 | " IPython.tooltip.tabs_functions = [ function(cell,text){", | |
|
285 | " IPython.tooltip._request_tooltip(cell,text);", | |
|
286 | " IPython.notification_widget.set_message('tab again to expand pager',2500);", | |
|
287 | " },", | |
|
288 | " function(){", | |
|
289 | " IPython.tooltip.expand();", | |
|
290 | " IPython.notification_widget.set_message('tab again to make pager sticky for 10s',2500);", | |
|
291 | " },", | |
|
292 | " function(){", | |
|
293 | " IPython.tooltip.stick();", | |
|
294 | " IPython.notification_widget.set_message('tab again to open help in pager',2500);", | |
|
295 | " },", | |
|
296 | " function(cell){", | |
|
297 | " IPython.tooltip.cancel_stick();", | |
|
298 | " IPython.tooltip.showInPager(cell);", | |
|
299 | " IPython.tooltip._cmfocus();", | |
|
300 | " }", | |
|
301 | " ];", | |
|
302 | " }", | |
|
304 | "Moreover, pressing tab several time in a row allows you change the behaviour of the tooltip.\n", | |
|
305 | "\n", | |
|
306 | "* first `tab` press, you get a classical tooltip\n", | |
|
307 | "* second tab, the tooltip grow vertically, and allow you to scroll the docstring\n", | |
|
308 | "* third tab, tooltip will be made sticky for 10 seconds, allowing you to carry on typing while it stays open.\n", | |
|
309 | "* forth tab, the tooltip help is sent to the pager at the bottom of the screen.\n", | |
|
310 | "<script>\n", | |
|
311 | " IPython.tooltip.tabs_functions = [ function(cell,text){\n", | |
|
312 | " IPython.tooltip._request_tooltip(cell,text);\n", | |
|
313 | " IPython.notification_widget.set_message('tab again to expand pager',2500);\n", | |
|
314 | " setTimeout(function(){\n", | |
|
315 | " $('.tooltiptext pre').text(\"function signture : You've invoked a tooltip !\\n\\nWell done! Here usualy lies the current function *call signature* and it's *docstring*. You can now expand the tooltip pressing <tab> a second time...\")},400);\n", | |
|
316 | " },\n", | |
|
317 | " function(){\n", | |
|
318 | " IPython.tooltip.expand();\n", | |
|
319 | " IPython.notification_widget.set_message('tab again to make pager sticky for 10s',2500);\n", | |
|
320 | " setTimeout(function(){\n", | |
|
321 | " $('.tooltiptext pre').text(\"Now the tooltip is expanded !\\\n", | |
|
322 | " \\n\\nThis is really usefull if you have long docstring and if you want to be able to scroll them. \\\n", | |
|
323 | "For example, I can give you many information about the tooltip:\\n - The tooltip is smart, and \\\n", | |
|
324 | "you don't always need to press tab to invoke it, if you press an opening bracket `(` then nothing \\\n", | |
|
325 | "for some time, tooltip will be invoked by itself.\\\n", | |
|
326 | "\\n - Also you can hoover over the icon on the top right to know what they are dooing...\\\n", | |
|
327 | "\\n\\nBack to the next lesson.\\n\\nSometime you need to the tooltip to stay on screen while\\\n", | |
|
328 | "you type. That's the reason for the sticky mode (indicated by a small clock on the top left of the tooltip),\\\n", | |
|
329 | "\\n\\nNow press <tab> a 3rd time and continue typing some text to test it...\")\n", | |
|
330 | " },400);\n", | |
|
331 | " },\n", | |
|
332 | " function(){\n", | |
|
333 | " var time = 35;\n", | |
|
334 | " IPython.tooltip.stick(time);\n", | |
|
335 | " $('.tooltiptext pre').text(\"Type more text !...\\n\\n range(7,125,3)\\n\\n The tooltip is in sticky mode, it won't be dismissed for at least 10 secondes \",400);\n", | |
|
336 | " setTimeout(function(){\n", | |
|
337 | " $('.tooltiptext pre').text(\"That was sticky mode...\\nI'll keep it on 15 more seconds just for you.\\n\\nLast thing you can do is send the current help displayed in the tooltip to the pager at the bottom of the screen. To do that, press tab 4 time in a row after a parenthesis. \\n\\n Now I'll stop bothering you and let you Play with the tooltip !\");\n", | |
|
338 | " reset_tooltip()\n", | |
|
339 | " },15000);\n", | |
|
340 | " },\n", | |
|
341 | " function(cell){\n", | |
|
342 | " IPython.tooltip.cancel_stick();\n", | |
|
343 | " reset_tooltip()\n", | |
|
344 | " IPython.tooltip.showInPager(cell);\n", | |
|
345 | " IPython.tooltip._cmfocus();\n", | |
|
346 | " }\n", | |
|
347 | " ];\n", | |
|
348 | " \n", | |
|
349 | " reset_tooltip = function(){\n", | |
|
350 | " IPython.tooltip.tabs_functions = [ function(cell,text){\n", | |
|
351 | " IPython.tooltip._request_tooltip(cell,text);\n", | |
|
352 | " IPython.notification_widget.set_message('tab again to expand pager',2500);\n", | |
|
353 | " },\n", | |
|
354 | " function(){\n", | |
|
355 | " IPython.tooltip.expand();\n", | |
|
356 | " IPython.notification_widget.set_message('tab again to make pager sticky for 10s',2500);\n", | |
|
357 | " },\n", | |
|
358 | " function(){\n", | |
|
359 | " IPython.tooltip.stick();\n", | |
|
360 | " IPython.notification_widget.set_message('tab again to open help in pager',2500);\n", | |
|
361 | " },\n", | |
|
362 | " function(cell){\n", | |
|
363 | " IPython.tooltip.cancel_stick();\n", | |
|
364 | " IPython.tooltip.showInPager(cell);\n", | |
|
365 | " IPython.tooltip._cmfocus();\n", | |
|
366 | " }\n", | |
|
367 | " ];\n", | |
|
368 | " }\n", | |
|
303 | 369 | "</script>" |
|
304 | 370 | ] |
|
305 | 371 | }, |
|
306 | 372 | { |
|
373 | "cell_type": "heading", | |
|
374 | "level": 2, | |
|
375 | "metadata": {}, | |
|
376 | "source": [ | |
|
377 | "The frontend/kernel model" | |
|
378 | ] | |
|
379 | }, | |
|
380 | { | |
|
307 | 381 | "cell_type": "markdown", |
|
382 | "metadata": {}, | |
|
308 | 383 | "source": [ |
|
309 | "## The frontend/kernel model", | |
|
310 | "", | |
|
311 | "The IPython notebook works on a client/server model where an *IPython kernel*", | |
|
312 | "starts in a separate process and acts as a server to executes the code you type,", | |
|
313 | "while the web browser provides acts as a client, providing a front end environment", | |
|
314 | "for you to type. But one kernel is capable of simultaneously talking to more than", | |
|
315 | "one client, and they do not all need to be of the same kind. All IPython frontends", | |
|
316 | "are capable of communicating with a kernel, and any number of them can be active", | |
|
317 | "at the same time. In addition to allowing you to have, for example, more than one", | |
|
318 | "browser session active, this lets you connect clients with different user interface features.", | |
|
319 | "", | |
|
320 | "For example, you may want to connect a Qt console to your kernel and use it as a help", | |
|
321 | "browser, calling `??` on objects in the Qt console (whose pager is more flexible than the", | |
|
322 | "one in the notebook). You can start a new Qt console connected to your current kernel by ", | |
|
323 | "using the `%qtconsole` magic, this will automatically detect the necessary connection", | |
|
324 | "information.", | |
|
325 | "", | |
|
326 | "If you want to open one manually, or want to open a text console from a terminal, you can ", | |
|
384 | "The IPython notebook works on a client/server model where an *IPython kernel*\n", | |
|
385 | "starts in a separate process and acts as a server to executes the code you type,\n", | |
|
386 | "while the web browser provides acts as a client, providing a front end environment\n", | |
|
387 | "for you to type. But one kernel is capable of simultaneously talking to more than\n", | |
|
388 | "one client, and they do not all need to be of the same kind. All IPython frontends\n", | |
|
389 | "are capable of communicating with a kernel, and any number of them can be active\n", | |
|
390 | "at the same time. In addition to allowing you to have, for example, more than one\n", | |
|
391 | "browser session active, this lets you connect clients with different user interface features.\n", | |
|
392 | "\n", | |
|
393 | "For example, you may want to connect a Qt console to your kernel and use it as a help\n", | |
|
394 | "browser, calling `??` on objects in the Qt console (whose pager is more flexible than the\n", | |
|
395 | "one in the notebook). You can start a new Qt console connected to your current kernel by \n", | |
|
396 | "using the `%qtconsole` magic, this will automatically detect the necessary connection\n", | |
|
397 | "information.\n", | |
|
398 | "\n", | |
|
399 | "If you want to open one manually, or want to open a text console from a terminal, you can \n", | |
|
327 | 400 | "get your kernel's connection information with the `%connect_info` magic:" |
|
328 | 401 | ] |
|
329 | 402 | }, |
|
330 | 403 | { |
|
331 | 404 | "cell_type": "code", |
|
405 | "collapsed": false, | |
|
332 | 406 | "input": [ |
|
333 | 407 | "%connect_info" |
|
334 | 408 | ], |
|
335 | 409 | "language": "python", |
|
410 | "metadata": {}, | |
|
336 | 411 | "outputs": [ |
|
337 | 412 | { |
|
338 | 413 | "output_type": "stream", |
|
339 | 414 | "stream": "stdout", |
|
340 | 415 | "text": [ |
|
341 | "{", | |
|
342 |
" \"stdin_port\": 5 |
|
|
343 | " \"ip\": \"127.0.0.1\", ", | |
|
344 |
" \"hb_port\": 5 |
|
|
345 |
" \"key\": \" |
|
|
346 |
" \"shell_port\": 5 |
|
|
347 |
" \"iopub_port\": 5 |
|
|
348 | "}", | |
|
349 | "", | |
|
350 | "Paste the above JSON into a file, and connect with:", | |
|
351 | " $> ipython <app> --existing <file>", | |
|
352 | "or, if you are local, you can connect with just:", | |
|
353 |
" $> ipython <app> --existing kernel- |
|
|
354 | "or even just:", | |
|
355 | " $> ipython <app> --existing ", | |
|
356 | "if this is the most recent IPython session you have started." | |
|
416 | "{\n", | |
|
417 | " \"stdin_port\": 52858, \n", | |
|
418 | " \"ip\": \"127.0.0.1\", \n", | |
|
419 | " \"hb_port\": 52859, \n", | |
|
420 | " \"key\": \"7efd45ca-d8a2-41b0-9cea-d9116d0fb883\", \n", | |
|
421 | " \"shell_port\": 52856, \n", | |
|
422 | " \"iopub_port\": 52857\n", | |
|
423 | "}\n", | |
|
424 | "\n", | |
|
425 | "Paste the above JSON into a file, and connect with:\n", | |
|
426 | " $> ipython <app> --existing <file>\n", | |
|
427 | "or, if you are local, you can connect with just:\n", | |
|
428 | " $> ipython <app> --existing kernel-b3bac7c1-8b2c-4536-8082-8d1df24f99ac.json \n", | |
|
429 | "or even just:\n", | |
|
430 | " $> ipython <app> --existing \n", | |
|
431 | "if this is the most recent IPython session you have started.\n" | |
|
357 | 432 | ] |
|
358 | 433 | } |
|
359 | 434 | ], |
|
360 |
"prompt_number": |
|
|
435 | "prompt_number": 6 | |
|
436 | }, | |
|
437 | { | |
|
438 | "cell_type": "heading", | |
|
439 | "level": 2, | |
|
440 | "metadata": {}, | |
|
441 | "source": [ | |
|
442 | "The kernel's `raw_input` and `%debug`" | |
|
443 | ] | |
|
361 | 444 | }, |
|
362 | 445 | { |
|
363 | 446 | "cell_type": "markdown", |
|
447 | "metadata": {}, | |
|
364 | 448 | "source": [ |
|
365 | "## The kernel's `raw_input` and `%debug`", | |
|
366 | "", | |
|
367 | "The one feature the notebook currently doesn't support as a client is the ability to send data to the kernel's", | |
|
368 | "standard input socket. That is, if the kernel requires information to be typed interactively by calling the", | |
|
369 | "builtin `raw_input` function, the notebook will be blocked. This happens for example if you run a script", | |
|
370 | "that queries interactively for parameters, and very importantly, is how the interactive IPython debugger that ", | |
|
371 | "activates when you type `%debug` works.", | |
|
372 | "", | |
|
373 | "So, in order to be able to use `%debug` or anything else that requires `raw_input`, you can either use a Qt ", | |
|
374 | "console or a terminal console:", | |
|
375 | "", | |
|
376 | "- From the notebook, typing `%qtconsole` finds all the necessary connection data for you.", | |
|
377 | "- From the terminal, first type `%connect_info` while still in the notebook, and then copy and paste the ", | |
|
449 | "The one feature the notebook currently doesn't support as a client is the ability to send data to the kernel's\n", | |
|
450 | "standard input socket. That is, if the kernel requires information to be typed interactively by calling the\n", | |
|
451 | "builtin `raw_input` function, the notebook will be blocked. This happens for example if you run a script\n", | |
|
452 | "that queries interactively for parameters, and very importantly, is how the interactive IPython debugger that \n", | |
|
453 | "activates when you type `%debug` works.\n", | |
|
454 | "\n", | |
|
455 | "So, in order to be able to use `%debug` or anything else that requires `raw_input`, you can either use a Qt \n", | |
|
456 | "console or a terminal console:\n", | |
|
457 | "\n", | |
|
458 | "- From the notebook, typing `%qtconsole` finds all the necessary connection data for you.\n", | |
|
459 | "- From the terminal, first type `%connect_info` while still in the notebook, and then copy and paste the \n", | |
|
378 | 460 | "resulting information, using `qtconsole` or `console` depending on which type of client you want." |
|
379 | 461 | ] |
|
380 | 462 | }, |
|
381 | 463 | { |
|
464 | "cell_type": "heading", | |
|
465 | "level": 2, | |
|
466 | "metadata": {}, | |
|
467 | "source": [ | |
|
468 | "Display of complex objects" | |
|
469 | ] | |
|
470 | }, | |
|
471 | { | |
|
382 | 472 | "cell_type": "markdown", |
|
473 | "metadata": {}, | |
|
383 | 474 | "source": [ |
|
384 | "## Display of complex objects", | |
|
385 | "", | |
|
386 | "As the 'tour' notebook shows, the IPython notebook has fairly sophisticated display capabilities. In addition", | |
|
387 | "to the examples there, you can study the `display_protocol` notebook in this same examples folder, to ", | |
|
388 | "learn how to customize arbitrary objects (in your own code or external libraries) to display in the notebook", | |
|
475 | "As the 'tour' notebook shows, the IPython notebook has fairly sophisticated display capabilities. In addition\n", | |
|
476 | "to the examples there, you can study the `display_protocol` notebook in this same examples folder, to \n", | |
|
477 | "learn how to customize arbitrary objects (in your own code or external libraries) to display in the notebook\n", | |
|
389 | 478 | "in any way you want, including graphical forms or mathematical expressions." |
|
390 | 479 | ] |
|
391 | 480 | }, |
|
392 | 481 | { |
|
482 | "cell_type": "heading", | |
|
483 | "level": 2, | |
|
484 | "metadata": {}, | |
|
485 | "source": [ | |
|
486 | "Plotting support" | |
|
487 | ] | |
|
488 | }, | |
|
489 | { | |
|
393 | 490 | "cell_type": "markdown", |
|
491 | "metadata": {}, | |
|
394 | 492 | "source": [ |
|
395 | "## Plotting support", | |
|
396 | "", | |
|
397 | "As we've explained already, the notebook is just another frontend talking to the same IPython kernel that", | |
|
398 | "you're already familiar with, so the same options for plotting support apply.", | |
|
399 | "", | |
|
400 | "If you start the notebook with `--pylab`, you will get matplotlib's floating, interactive windows and you", | |
|
401 | "can call the `display` function to paste figures into the notebook document. If you start it with ", | |
|
402 | "`--pylab inline`, all plots will appear inline automatically. In this regard, the notebook works identically", | |
|
403 | "to the Qt console.", | |
|
404 | "", | |
|
405 | "Note that if you start the notebook server with pylab support, *all* kernels are automatically started in", | |
|
406 | "pylab mode and with the same choice of backend (i.e. floating windows or inline figures). But you can also", | |
|
407 | "start the notebook server simply by typing `ipython notebook`, and then selectively turn on pylab support ", | |
|
408 | "only for the notebooks you want by using the `%pylab` magic (see its docstring for details)." | |
|
493 | "As we've explained already, the notebook is just another frontend talking to the same IPython kernel that\n", | |
|
494 | "you're familiar with, so the same options for plotting support apply.\n", | |
|
495 | "\n", | |
|
496 | "You can enable inline plotting with `%pylab inline`:" | |
|
409 | 497 | ] |
|
410 | 498 | }, |
|
411 | 499 | { |
|
412 | 500 | "cell_type": "code", |
|
501 | "collapsed": false, | |
|
413 | 502 | "input": [ |
|
414 |
"%pylab inline" |
|
|
415 | "plot(rand(100))" | |
|
503 | "%pylab inline" | |
|
416 | 504 | ], |
|
417 | 505 | "language": "python", |
|
506 | "metadata": {}, | |
|
418 | 507 | "outputs": [ |
|
419 | 508 | { |
|
420 | 509 | "output_type": "stream", |
|
421 | 510 | "stream": "stdout", |
|
422 | 511 | "text": [ |
|
423 | "", | |
|
424 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", | |
|
425 | "For more information, type 'help(pylab)'." | |
|
512 | "\n", | |
|
513 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", | |
|
514 | "For more information, type 'help(pylab)'.\n" | |
|
426 | 515 | ] |
|
427 |
} |
|
|
516 | } | |
|
517 | ], | |
|
518 | "prompt_number": 7 | |
|
519 | }, | |
|
520 | { | |
|
521 | "cell_type": "markdown", | |
|
522 | "metadata": {}, | |
|
523 | "source": [ | |
|
524 | "If you start the notebook server itself with `--pylab`, you will get matplotlib's floating, interactive windows and you\n", | |
|
525 | "can call the `display` function to paste figures into the notebook document. If you start it with \n", | |
|
526 | "`--pylab inline`, all plots will appear inline automatically. In this regard, the notebook works identically\n", | |
|
527 | "to the Qt console.\n", | |
|
528 | "\n", | |
|
529 | "Note that if you start the notebook server with pylab support, *all* kernels are automatically started in\n", | |
|
530 | "pylab mode and with the same choice of backend (i.e. floating windows or inline figures).\n", | |
|
531 | "For this reason, it is recommended that you\n", | |
|
532 | "start the notebook server simply by typing `ipython notebook`, and then selectively turn on pylab support \n", | |
|
533 | "only for the notebooks you want by using the `%pylab` magic (see its docstring for details)." | |
|
534 | ] | |
|
535 | }, | |
|
536 | { | |
|
537 | "cell_type": "code", | |
|
538 | "collapsed": false, | |
|
539 | "input": [ | |
|
540 | "plot(rand(100))" | |
|
541 | ], | |
|
542 | "language": "python", | |
|
543 | "metadata": {}, | |
|
544 | "outputs": [ | |
|
428 | 545 | { |
|
429 | 546 | "output_type": "pyout", |
|
430 |
"prompt_number": |
|
|
547 | "prompt_number": 8, | |
|
431 | 548 | "text": [ |
|
432 |
"[<matplotlib.lines.Line2D at 0x11 |
|
|
549 | "[<matplotlib.lines.Line2D at 0x1124ba350>]" | |
|
433 | 550 | ] |
|
434 | 551 | }, |
|
435 | 552 | { |
|
436 | 553 | "output_type": "display_data", |
|
437 | "png": "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\n" | |
|
554 | "png": "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\nDVi7dm3cTUgMSqkvvv/9cPdfSn0RNmxfBIeS4OfMmYPOzs5Tnzs7O9HISRh+m66uLswRSAD+IWBh\nYWFhES6UFs3SpUuxe/dudHR0YHh4GJs3b8aqVasKtlm1ahXuu+8+AMC2bdswadIkzJw5M7wWW1hY\nWFhoQangs9ksNmzYgBUrVmB0dBTXXXcdFixYgI0bNwIA1qxZg8suuwyPPfYYmpubUV9fj3vuuSeS\nhltYWFhYuMAJGY8//rgzf/58p7m52bntttvCPlyi8P777zvLly93Fi5c6Jx11lnOnXfe6TiO4xw+\nfNi5+OKLnZaWFueSSy5xjh49GnNLo8PIyIizZMkS57Of/azjOOnti6NHjzpXXnml09ra6ixYsMDZ\ntm1bavti3bp1zsKFC51FixY511xzjTM4OJiavrj22mudGTNmOIsWLTr1nerc161b5zQ3Nzvz5893\nfve737nuP9R5ajp59OWMqqoq3HHHHXjjjTewbds2/PjHP8auXbtw22234ZJLLsHbb7+Niy66CLfd\ndlvcTY0Md955JxYuXHgq4J7WvvjGN76Byy67DLt27cJrr72G1tbWVPZFR0cHfvrTn2LHjh14/fXX\nMTo6ivvvvz81fXHttdeira2t4DvZue/cuRObN2/Gzp070dbWhq997WsYGxtTHyCUx9IHeO6555wV\nK1ac+vz973/f+f73vx/mIRONyy+/3HniiSec+fPnO/v373ccx3H27dvnzJ8/P+aWRYPOzk7noosu\ncv74xz+eUvBp7Ive3l7njDPOKPo+jX1x+PBhZ968ec6RI0ecXC7nfPazn3V+//vfp6ov9uzZU6Dg\nZee+bt26AhdkxYoVzp///GflvkNV8Dp59GlBR0cHXn75ZSxbtgwHDhw4FYieOXNmaiaGffOb38QP\nfvADVDAFTtLYF3v27MH06dNx7bXX4qMf/Siuv/56nDhxIpV9MWXKFNxyyy04/fTT0dDQgEmTJuGS\nSy5JZV9QyM597969BVmMOnwaKsHbvHeC/v5+XHnllbjzzjsxfvz4gv/LZDKp6KdHH30UM2bMwDnn\nnCNNmU1LX4yMjGDHjh342te+hh07dqC+vr7IgkhLX7z77rv44Q9/iI6ODuzduxf9/f345S9/WbBN\nWvpCBLdzd+uXUAleJ4++3JHL5XDllVfii1/8Ij7/+c8DIE/l/fv3AwD27duHGSlYbv65557Dww8/\njDPOOAPXXHMN/vjHP+KLX/xiKvuisbERjY2NOPfccwEAV111FXbs2IFZs2alri9efPFFfPzjH8fU\nqVORzWZxxRVX4M9//nMq+4JCdk/ozjliESrB6+TRlzMcx8F1112HhQsX4uabbz71/apVq3DvvfcC\nAO69995TxF/OWLduHTo7O7Fnzx7cf//9uPDCC/GLX/wilX0xa9YsNDU14e233wYAbN26FWeddRY+\n97nPpa4vWltbsW3bNgwMDMBxHGzduhULFy5MZV9QyO6JVatW4f7778fw8DD27NmD3bt347zzzlPv\nzHTAgMdjjz3mzJs3zznzzDOddevWhX24ROGZZ55xMpmMs3jxYmfJkiXOkiVLnMcff9w5fPiwc9FF\nF5V9CpgM7e3tzuc+9znHcZzU9sUrr7ziLF261Dn77LOdL3zhC05vb29q+2L9+vWn0iS/9KUvOcPD\nw6npi9WrVzuzZ892qqqqnMbGRudnP/uZ8ty/973vOWeeeaYzf/58p62tzXX/GcexNQQsLCwsyhF2\nvRYLCwuLMoUleAsLC4syhSV4CwsLizKFJXgLCwuLMoUleAsLC4syhSV4CwsLizLF/weSDoopnVla\nxAAAAABJRU5ErkJggg==\n" | |
|
438 | 555 | } |
|
439 | 556 | ], |
|
440 |
"prompt_number": |
|
|
557 | "prompt_number": 8 | |
|
441 | 558 | }, |
|
442 | 559 | { |
|
443 |
"cell_type": " |
|
|
560 | "cell_type": "heading", | |
|
561 | "level": 2, | |
|
562 | "metadata": {}, | |
|
444 | 563 | "source": [ |
|
445 |
" |
|
|
446 | "", | |
|
447 | "By default the notebook only listens on localhost, so it does not expose your computer to attacks coming from", | |
|
448 | "the internet. By default the notebook does not require any authentication, but you can configure it to", | |
|
449 | "ask for a password before allowing access to the files. ", | |
|
450 | "", | |
|
451 | "Furthermore, you can require the notebook to encrypt all communications by using SSL and making all connections", | |
|
452 | "using the https protocol instead of plain http. This is a good idea if you decide to run your notebook on", | |
|
453 | "addresses that are visible from the internet. For further details on how to configure this, see the", | |
|
454 | "[security section](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html#security) of the ", | |
|
455 | "manual.", | |
|
456 | "", | |
|
457 | "Finally, note that you can also run a notebook with the `--read-only` flag, which lets you provide access", | |
|
458 | "to your notebook documents to others without letting them execute code (which can be useful to broadcast", | |
|
459 | "a computation to colleagues or students, for example). The read-only flag behaves differently depending", | |
|
460 | "on whether the server has a password or not:", | |
|
461 | "", | |
|
462 | "- Passwordless server: users directly see all notebooks in read-only mode.", | |
|
463 | "- Password-protected server: users can see all notebooks in read-only mode, but a login button is available", | |
|
464 | "and once a user authenticates, he or she obtains write/execute privileges.", | |
|
465 | "", | |
|
466 | "The first case above makes it easy to broadcast on the fly an existing notebook by simply starting a *second* ", | |
|
467 | "notebook server in the same directory as the first, but in read-only mode. This can be done without having", | |
|
468 | "to configure a password first (which requires calling a hashing function and editing a configuration file)." | |
|
564 | "Security" | |
|
469 | 565 | ] |
|
470 | 566 | }, |
|
471 | 567 | { |
|
472 |
"cell_type": " |
|
|
473 | "input": [ | |
|
474 | "" | |
|
475 | ], | |
|
476 | "language": "python", | |
|
477 | "outputs": [] | |
|
568 | "cell_type": "markdown", | |
|
569 | "metadata": {}, | |
|
570 | "source": [ | |
|
571 | "By default the notebook only listens on localhost, so it does not expose your computer to attacks coming from\n", | |
|
572 | "the internet. By default the notebook does not require any authentication, but you can configure it to\n", | |
|
573 | "ask for a password before allowing access to the files. \n", | |
|
574 | "\n", | |
|
575 | "Furthermore, you can require the notebook to encrypt all communications by using SSL and making all connections\n", | |
|
576 | "using the https protocol instead of plain http. This is a good idea if you decide to run your notebook on\n", | |
|
577 | "addresses that are visible from the internet. For further details on how to configure this, see the\n", | |
|
578 | "[security section](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html#security) of the \n", | |
|
579 | "manual.\n", | |
|
580 | "\n", | |
|
581 | "Finally, note that you can also run a notebook with the `--read-only` flag, which lets you provide access\n", | |
|
582 | "to your notebook documents to others without letting them execute code (which can be useful to broadcast\n", | |
|
583 | "a computation to colleagues or students, for example). The read-only flag behaves differently depending\n", | |
|
584 | "on whether the server has a password or not:\n", | |
|
585 | "\n", | |
|
586 | "- Passwordless server: users directly see all notebooks in read-only mode.\n", | |
|
587 | "- Password-protected server: users can see all notebooks in read-only mode, but a login button is available\n", | |
|
588 | "and once a user authenticates, he or she obtains write/execute privileges.\n", | |
|
589 | "\n", | |
|
590 | "The first case above makes it easy to broadcast on the fly an existing notebook by simply starting a *second* \n", | |
|
591 | "notebook server in the same directory as the first, but in read-only mode. This can be done without having\n", | |
|
592 | "to configure a password first (which requires calling a hashing function and editing a configuration file).\n", | |
|
593 | "\n", | |
|
594 | "**NOTE:** IPython 0.13's javascript rewrite did not include read-only UI, so it does not work well.\n", | |
|
595 | "Code/notebooks are still protected from unauthorized access, but the UI is not appropriately restricted." | |
|
596 | ] | |
|
478 | 597 | } |
|
479 | ] | |
|
598 | ], | |
|
599 | "metadata": {} | |
|
480 | 600 | } |
|
481 | 601 | ] |
|
482 | 602 | } No newline at end of file |
@@ -3,30 +3,34 b'' | |||
|
3 | 3 | "name": "Animations_and_Progress" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "heading", |
|
11 | 12 | "level": 1, |
|
13 | "metadata": {}, | |
|
12 | 14 | "source": [ |
|
13 | 15 | "Simple animations, progress bars, and clearing output" |
|
14 | 16 | ] |
|
15 | 17 | }, |
|
16 | 18 | { |
|
17 | 19 | "cell_type": "markdown", |
|
20 | "metadata": {}, | |
|
18 | 21 | "source": [ |
|
19 | "Sometimes you want to print progress in-place, but don't want", | |
|
20 | "to keep growing the output area. In terminals, there is the carriage-return", | |
|
21 | "(`'\\r'`) for overwriting a single line, but the notebook frontend does not support this", | |
|
22 | "behavior (yet).", | |
|
23 | "", | |
|
24 | "What the notebook *does* support is explicit `clear_output`, and you can use this to replace previous", | |
|
22 | "Sometimes you want to print progress in-place, but don't want\n", | |
|
23 | "to keep growing the output area. In terminals, there is the carriage-return\n", | |
|
24 | "(`'\\r'`) for overwriting a single line, but the notebook frontend does not support this\n", | |
|
25 | "behavior (yet).\n", | |
|
26 | "\n", | |
|
27 | "What the notebook *does* support is explicit `clear_output`, and you can use this to replace previous\n", | |
|
25 | 28 | "output (specifying stdout/stderr or the special IPython display outputs)." |
|
26 | 29 | ] |
|
27 | 30 | }, |
|
28 | 31 | { |
|
29 | 32 | "cell_type": "markdown", |
|
33 | "metadata": {}, | |
|
30 | 34 | "source": [ |
|
31 | 35 | "A simple example printing our progress iterating through a list:" |
|
32 | 36 | ] |
@@ -35,34 +39,35 b'' | |||
|
35 | 39 | "cell_type": "code", |
|
36 | 40 | "collapsed": true, |
|
37 | 41 | "input": [ |
|
38 | "import sys", | |
|
42 | "import sys\n", | |
|
39 | 43 | "import time" |
|
40 | 44 | ], |
|
41 | 45 | "language": "python", |
|
42 |
" |
|
|
43 | "prompt_number": 16 | |
|
46 | "metadata": {}, | |
|
47 | "outputs": [] | |
|
44 | 48 | }, |
|
45 | 49 | { |
|
46 | 50 | "cell_type": "code", |
|
47 | 51 | "collapsed": false, |
|
48 | 52 | "input": [ |
|
49 | "from IPython.core.display import clear_output", | |
|
50 | "for i in range(10):", | |
|
51 | " time.sleep(0.25)", | |
|
52 | " clear_output()", | |
|
53 | " print i", | |
|
53 | "from IPython.core.display import clear_output\n", | |
|
54 | "for i in range(10):\n", | |
|
55 | " time.sleep(0.25)\n", | |
|
56 | " clear_output()\n", | |
|
57 | " print i\n", | |
|
54 | 58 | " sys.stdout.flush()" |
|
55 | 59 | ], |
|
56 | 60 | "language": "python", |
|
57 |
" |
|
|
58 | "prompt_number": 12 | |
|
61 | "metadata": {}, | |
|
62 | "outputs": [] | |
|
59 | 63 | }, |
|
60 | 64 | { |
|
61 | 65 | "cell_type": "markdown", |
|
66 | "metadata": {}, | |
|
62 | 67 | "source": [ |
|
63 | "The AsyncResult object has a special `wait_interactive()` method, which prints its progress interactively,", | |
|
64 | "so you can watch as your parallel computation completes.", | |
|
65 | "", | |
|
68 | "The AsyncResult object has a special `wait_interactive()` method, which prints its progress interactively,\n", | |
|
69 | "so you can watch as your parallel computation completes.\n", | |
|
70 | "\n", | |
|
66 | 71 | "**This example assumes you have an IPython cluster running, which you can start from the [cluster panel](/#tab2)**" |
|
67 | 72 | ] |
|
68 | 73 | }, |
@@ -70,23 +75,24 b'' | |||
|
70 | 75 | "cell_type": "code", |
|
71 | 76 | "collapsed": false, |
|
72 | 77 | "input": [ |
|
73 | "from IPython import parallel", | |
|
74 | "rc = parallel.Client()", | |
|
75 | "view = rc.load_balanced_view()", | |
|
76 | "", | |
|
77 | "amr = view.map_async(time.sleep, [0.5]*100)", | |
|
78 | "", | |
|
78 | "from IPython import parallel\n", | |
|
79 | "rc = parallel.Client()\n", | |
|
80 | "view = rc.load_balanced_view()\n", | |
|
81 | "\n", | |
|
82 | "amr = view.map_async(time.sleep, [0.5]*100)\n", | |
|
83 | "\n", | |
|
79 | 84 | "amr.wait_interactive()" |
|
80 | 85 | ], |
|
81 | 86 | "language": "python", |
|
82 |
" |
|
|
83 | "prompt_number": 13 | |
|
87 | "metadata": {}, | |
|
88 | "outputs": [] | |
|
84 | 89 | }, |
|
85 | 90 | { |
|
86 | 91 | "cell_type": "markdown", |
|
92 | "metadata": {}, | |
|
87 | 93 | "source": [ |
|
88 | "You can also use `clear_output()` to clear figures and plots.", | |
|
89 | "", | |
|
94 | "You can also use `clear_output()` to clear figures and plots.\n", | |
|
95 | "\n", | |
|
90 | 96 | "This time, we need to make sure we are using inline pylab (**requires matplotlib**)" |
|
91 | 97 | ] |
|
92 | 98 | }, |
@@ -97,63 +103,47 b'' | |||
|
97 | 103 | "%pylab inline" |
|
98 | 104 | ], |
|
99 | 105 | "language": "python", |
|
100 | "outputs": [ | |
|
101 | { | |
|
102 | "output_type": "stream", | |
|
103 | "stream": "stdout", | |
|
104 | "text": [ | |
|
105 | "", | |
|
106 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", | |
|
107 | "For more information, type 'help(pylab)'." | |
|
108 | ] | |
|
109 | } | |
|
110 | ], | |
|
111 | "prompt_number": 17 | |
|
106 | "metadata": {}, | |
|
107 | "outputs": [] | |
|
112 | 108 | }, |
|
113 | 109 | { |
|
114 | 110 | "cell_type": "code", |
|
115 | 111 | "collapsed": false, |
|
116 | 112 | "input": [ |
|
117 | "from scipy.special import jn", | |
|
118 | "x = np.linspace(0,5)", | |
|
119 | "f, ax = plt.subplots()", | |
|
120 | "ax.set_title(\"Bessel functions\")", | |
|
121 | "", | |
|
122 | "for n in range(1,10):", | |
|
123 | " time.sleep(1)", | |
|
124 | " ax.plot(x, jn(x,n))", | |
|
125 | " clear_output()", | |
|
126 | " display(f)", | |
|
127 | "", | |
|
128 | "# close the figure at the end, so we don't get a duplicate", | |
|
129 | "# of the last plot", | |
|
113 | "from scipy.special import jn\n", | |
|
114 | "x = np.linspace(0,5)\n", | |
|
115 | "f, ax = plt.subplots()\n", | |
|
116 | "ax.set_title(\"Bessel functions\")\n", | |
|
117 | "\n", | |
|
118 | "for n in range(1,10):\n", | |
|
119 | " time.sleep(1)\n", | |
|
120 | " ax.plot(x, jn(x,n))\n", | |
|
121 | " clear_output()\n", | |
|
122 | " display(f)\n", | |
|
123 | "\n", | |
|
124 | "# close the figure at the end, so we don't get a duplicate\n", | |
|
125 | "# of the last plot\n", | |
|
130 | 126 | "plt.close()" |
|
131 | 127 | ], |
|
132 | 128 | "language": "python", |
|
133 | "outputs": [ | |
|
134 | { | |
|
135 | "output_type": "display_data", | |
|
136 | "png": "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\nYII=\n", | |
|
137 | "text": [ | |
|
138 | "<matplotlib.figure.Figure at 0x1083272d0>" | |
|
139 | ] | |
|
140 | } | |
|
141 | ], | |
|
142 | "prompt_number": 20 | |
|
129 | "metadata": {}, | |
|
130 | "outputs": [] | |
|
143 | 131 | }, |
|
144 | 132 | { |
|
145 | 133 | "cell_type": "heading", |
|
146 | 134 | "level": 2, |
|
135 | "metadata": {}, | |
|
147 | 136 | "source": [ |
|
148 | 137 | "A Javascript Progress Bar" |
|
149 | 138 | ] |
|
150 | 139 | }, |
|
151 | 140 | { |
|
152 | 141 | "cell_type": "markdown", |
|
142 | "metadata": {}, | |
|
153 | 143 | "source": [ |
|
154 | "`clear_output()` is still something of a hack, and if you want to do a progress bar in the notebook", | |
|
155 | "it is better to just use Javascript/HTML if you can.", | |
|
156 | "", | |
|
144 | "`clear_output()` is still something of a hack, and if you want to do a progress bar in the notebook\n", | |
|
145 | "it is better to just use Javascript/HTML if you can.\n", | |
|
146 | "\n", | |
|
157 | 147 | "Here is a simple progress bar using HTML/Javascript:" |
|
158 | 148 | ] |
|
159 | 149 | }, |
@@ -161,47 +151,50 b'' | |||
|
161 | 151 | "cell_type": "code", |
|
162 | 152 | "collapsed": false, |
|
163 | 153 | "input": [ |
|
164 | "import uuid", | |
|
165 | "from IPython.core.display import HTML, Javascript, display", | |
|
166 | "", | |
|
167 | "divid = str(uuid.uuid4())", | |
|
168 | "", | |
|
169 | "pb = HTML(", | |
|
170 | "\"\"\"", | |
|
171 | "<div style=\"border: 1px solid black; width:500px\">", | |
|
172 | " <div id=\"%s\" style=\"background-color:blue; width:0%%\"> </div>", | |
|
173 | "</div> ", | |
|
174 | "\"\"\" % divid)", | |
|
175 | "display(pb)", | |
|
176 | "for i in range(1,101):", | |
|
177 | " time.sleep(0.1)", | |
|
178 | " ", | |
|
154 | "import uuid\n", | |
|
155 | "from IPython.core.display import HTML, Javascript, display\n", | |
|
156 | "\n", | |
|
157 | "divid = str(uuid.uuid4())\n", | |
|
158 | "\n", | |
|
159 | "pb = HTML(\n", | |
|
160 | "\"\"\"\n", | |
|
161 | "<div style=\"border: 1px solid black; width:500px\">\n", | |
|
162 | " <div id=\"%s\" style=\"background-color:blue; width:0%%\"> </div>\n", | |
|
163 | "</div> \n", | |
|
164 | "\"\"\" % divid)\n", | |
|
165 | "display(pb)\n", | |
|
166 | "for i in range(1,101):\n", | |
|
167 | " time.sleep(0.1)\n", | |
|
168 | " \n", | |
|
179 | 169 | " display(Javascript(\"$('div#%s').width('%i%%')\" % (divid, i)))" |
|
180 | 170 | ], |
|
181 | 171 | "language": "python", |
|
182 |
" |
|
|
183 | "prompt_number": 15 | |
|
172 | "metadata": {}, | |
|
173 | "outputs": [] | |
|
184 | 174 | }, |
|
185 | 175 | { |
|
186 | 176 | "cell_type": "markdown", |
|
177 | "metadata": {}, | |
|
187 | 178 | "source": [ |
|
188 | "The above simply makes a div that is a box, and a blue div inside it with a unique ID ", | |
|
189 | "(so that the javascript won't collide with other similar progress bars on the same page). ", | |
|
190 | "", | |
|
191 | "Then, at every progress point, we run a simple jQuery call to resize the blue box to", | |
|
192 | "the appropriate fraction of the width of its containing box, and voil\u00e0 a nice", | |
|
179 | "The above simply makes a div that is a box, and a blue div inside it with a unique ID \n", | |
|
180 | "(so that the javascript won't collide with other similar progress bars on the same page). \n", | |
|
181 | "\n", | |
|
182 | "Then, at every progress point, we run a simple jQuery call to resize the blue box to\n", | |
|
183 | "the appropriate fraction of the width of its containing box, and voil\u00e0 a nice\n", | |
|
193 | 184 | "HTML/Javascript progress bar!" |
|
194 | 185 | ] |
|
195 | 186 | }, |
|
196 | 187 | { |
|
197 | 188 | "cell_type": "heading", |
|
198 | 189 | "level": 2, |
|
190 | "metadata": {}, | |
|
199 | 191 | "source": [ |
|
200 | 192 | "ProgressBar class" |
|
201 | 193 | ] |
|
202 | 194 | }, |
|
203 | 195 | { |
|
204 | 196 | "cell_type": "markdown", |
|
197 | "metadata": {}, | |
|
205 | 198 | "source": [ |
|
206 | 199 | "And finally, here is a progress bar *class* extracted from [PyMC](http://code.google.com/p/pymc/), which will work in regular Python as well as in the IPython Notebook" |
|
207 | 200 | ] |
@@ -210,65 +203,73 b'' | |||
|
210 | 203 | "cell_type": "code", |
|
211 | 204 | "collapsed": true, |
|
212 | 205 | "input": [ |
|
213 | "import sys, time", | |
|
214 | "try:", | |
|
215 | " from IPython.core.display import clear_output", | |
|
216 | " have_ipython = True", | |
|
217 | "except ImportError:", | |
|
218 | " have_ipython = False", | |
|
219 | "", | |
|
220 | "class ProgressBar:", | |
|
221 | " def __init__(self, iterations):", | |
|
222 | " self.iterations = iterations", | |
|
223 | " self.prog_bar = '[]'", | |
|
224 | " self.fill_char = '*'", | |
|
225 | " self.width = 40", | |
|
226 | " self.__update_amount(0)", | |
|
227 | " if have_ipython:", | |
|
228 | " self.animate = self.animate_ipython", | |
|
229 | " else:", | |
|
230 | " self.animate = self.animate_noipython", | |
|
231 | "", | |
|
232 | " def animate_ipython(self, iter):", | |
|
233 | " clear_output()", | |
|
234 | " print '\\r', self,", | |
|
235 | " sys.stdout.flush()", | |
|
236 | " self.update_iteration(iter + 1)", | |
|
237 | "", | |
|
238 | " def update_iteration(self, elapsed_iter):", | |
|
239 |
" self. |
|
|
240 | " self.prog_bar += ' %d of %s complete' % (elapsed_iter, self.iterations)", | |
|
241 | "", | |
|
242 | " def __update_amount(self, new_amount):", | |
|
243 | " percent_done = int(round((new_amount / 100.0) * 100.0))", | |
|
244 | " all_full = self.width - 2", | |
|
245 | " num_hashes = int(round((percent_done / 100.0) * all_full))", | |
|
246 | " self.prog_bar = '[' + self.fill_char * num_hashes + ' ' * (all_full - num_hashes) + ']'", | |
|
247 | " pct_place = (len(self.prog_bar) // 2) - len(str(percent_done))", | |
|
248 | " pct_string = '%d%%' % percent_done", | |
|
249 |
" |
|
|
250 | " (pct_string + self.prog_bar[pct_place + len(pct_string):])", | |
|
251 | "", | |
|
252 | " def __str__(self):", | |
|
206 | "import sys, time\n", | |
|
207 | "try:\n", | |
|
208 | " from IPython.core.display import clear_output\n", | |
|
209 | " have_ipython = True\n", | |
|
210 | "except ImportError:\n", | |
|
211 | " have_ipython = False\n", | |
|
212 | "\n", | |
|
213 | "class ProgressBar:\n", | |
|
214 | " def __init__(self, iterations):\n", | |
|
215 | " self.iterations = iterations\n", | |
|
216 | " self.prog_bar = '[]'\n", | |
|
217 | " self.fill_char = '*'\n", | |
|
218 | " self.width = 40\n", | |
|
219 | " self.__update_amount(0)\n", | |
|
220 | " if have_ipython:\n", | |
|
221 | " self.animate = self.animate_ipython\n", | |
|
222 | " else:\n", | |
|
223 | " self.animate = self.animate_noipython\n", | |
|
224 | "\n", | |
|
225 | " def animate_ipython(self, iter):\n", | |
|
226 | " print '\\r', self,\n", | |
|
227 | " sys.stdout.flush()\n", | |
|
228 | " self.update_iteration(iter + 1)\n", | |
|
229 | "\n", | |
|
230 | " def update_iteration(self, elapsed_iter):\n", | |
|
231 | " self.__update_amount((elapsed_iter / float(self.iterations)) * 100.0)\n", | |
|
232 | " self.prog_bar += ' %d of %s complete' % (elapsed_iter, self.iterations)\n", | |
|
233 | "\n", | |
|
234 | " def __update_amount(self, new_amount):\n", | |
|
235 | " percent_done = int(round((new_amount / 100.0) * 100.0))\n", | |
|
236 | " all_full = self.width - 2\n", | |
|
237 | " num_hashes = int(round((percent_done / 100.0) * all_full))\n", | |
|
238 | " self.prog_bar = '[' + self.fill_char * num_hashes + ' ' * (all_full - num_hashes) + ']'\n", | |
|
239 | " pct_place = (len(self.prog_bar) // 2) - len(str(percent_done))\n", | |
|
240 | " pct_string = '%d%%' % percent_done\n", | |
|
241 | " self.prog_bar = self.prog_bar[0:pct_place] + \\\n", | |
|
242 | " (pct_string + self.prog_bar[pct_place + len(pct_string):])\n", | |
|
243 | "\n", | |
|
244 | " def __str__(self):\n", | |
|
253 | 245 | " return str(self.prog_bar)" |
|
254 | 246 | ], |
|
255 | 247 | "language": "python", |
|
256 |
" |
|
|
257 | "prompt_number": 10 | |
|
248 | "metadata": {}, | |
|
249 | "outputs": [] | |
|
258 | 250 | }, |
|
259 | 251 | { |
|
260 | 252 | "cell_type": "code", |
|
261 | 253 | "collapsed": false, |
|
262 | 254 | "input": [ |
|
263 | "p = ProgressBar(1000)", | |
|
264 | "for i in range(1001):", | |
|
255 | "p = ProgressBar(1000)\n", | |
|
256 | "for i in range(1001):\n", | |
|
265 | 257 | " p.animate(i)" |
|
266 | 258 | ], |
|
267 | 259 | "language": "python", |
|
268 |
" |
|
|
269 | "prompt_number": 11 | |
|
260 | "metadata": {}, | |
|
261 | "outputs": [] | |
|
262 | }, | |
|
263 | { | |
|
264 | "cell_type": "code", | |
|
265 | "collapsed": false, | |
|
266 | "input": [], | |
|
267 | "language": "python", | |
|
268 | "metadata": {}, | |
|
269 | "outputs": [] | |
|
270 | 270 | } |
|
271 | ] | |
|
271 | ], | |
|
272 | "metadata": {} | |
|
272 | 273 | } |
|
273 | 274 | ] |
|
274 | 275 | } No newline at end of file |
@@ -3,180 +3,207 b'' | |||
|
3 | 3 | "name": "Capturing Output" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "heading", |
|
11 | 12 | "level": 1, |
|
13 | "metadata": {}, | |
|
12 | 14 | "source": [ |
|
13 | 15 | "Capturing Output with <tt>%%capture</tt>" |
|
14 | 16 | ] |
|
15 | 17 | }, |
|
16 | 18 | { |
|
17 | 19 | "cell_type": "markdown", |
|
20 | "metadata": {}, | |
|
18 | 21 | "source": [ |
|
19 | "One of IPython's new cell magics is `%%capture`, which captures stdout/err for a cell,", | |
|
22 | "One of IPython's new cell magics is `%%capture`, which captures stdout/err for a cell,\n", | |
|
20 | 23 | "and discards them or stores them in variables in your namespace." |
|
21 | 24 | ] |
|
22 | 25 | }, |
|
23 | 26 | { |
|
24 | 27 | "cell_type": "code", |
|
28 | "collapsed": false, | |
|
25 | 29 | "input": [ |
|
26 | 30 | "import sys" |
|
27 | 31 | ], |
|
28 | 32 | "language": "python", |
|
33 | "metadata": {}, | |
|
29 | 34 | "outputs": [] |
|
30 | 35 | }, |
|
31 | 36 | { |
|
32 | 37 | "cell_type": "markdown", |
|
38 | "metadata": {}, | |
|
33 | 39 | "source": [ |
|
34 | 40 | "By default, it just swallows it up. This is a simple way to suppress unwanted output." |
|
35 | 41 | ] |
|
36 | 42 | }, |
|
37 | 43 | { |
|
38 | 44 | "cell_type": "code", |
|
45 | "collapsed": false, | |
|
39 | 46 | "input": [ |
|
40 | "%%capture", | |
|
41 | "print 'hi, stdout'", | |
|
47 | "%%capture\n", | |
|
48 | "print 'hi, stdout'\n", | |
|
42 | 49 | "print >> sys.stderr, 'hi, stderr'" |
|
43 | 50 | ], |
|
44 | 51 | "language": "python", |
|
52 | "metadata": {}, | |
|
45 | 53 | "outputs": [] |
|
46 | 54 | }, |
|
47 | 55 | { |
|
48 | 56 | "cell_type": "markdown", |
|
57 | "metadata": {}, | |
|
49 | 58 | "source": [ |
|
50 | 59 | "If you specify a name, then stdout and stderr will be stored in an object in your namespace." |
|
51 | 60 | ] |
|
52 | 61 | }, |
|
53 | 62 | { |
|
54 | 63 | "cell_type": "code", |
|
64 | "collapsed": false, | |
|
55 | 65 | "input": [ |
|
56 | "%%capture captured", | |
|
57 | "print 'hi, stdout'", | |
|
66 | "%%capture captured\n", | |
|
67 | "print 'hi, stdout'\n", | |
|
58 | 68 | "print >> sys.stderr, 'hi, stderr'" |
|
59 | 69 | ], |
|
60 | 70 | "language": "python", |
|
71 | "metadata": {}, | |
|
61 | 72 | "outputs": [] |
|
62 | 73 | }, |
|
63 | 74 | { |
|
64 | 75 | "cell_type": "code", |
|
76 | "collapsed": false, | |
|
65 | 77 | "input": [ |
|
66 | 78 | "captured" |
|
67 | 79 | ], |
|
68 | 80 | "language": "python", |
|
81 | "metadata": {}, | |
|
69 | 82 | "outputs": [] |
|
70 | 83 | }, |
|
71 | 84 | { |
|
72 | 85 | "cell_type": "markdown", |
|
86 | "metadata": {}, | |
|
73 | 87 | "source": [ |
|
74 | 88 | "Calling the object writes the output to stdout/err as appropriate." |
|
75 | 89 | ] |
|
76 | 90 | }, |
|
77 | 91 | { |
|
78 | 92 | "cell_type": "code", |
|
93 | "collapsed": false, | |
|
79 | 94 | "input": [ |
|
80 | 95 | "captured()" |
|
81 | 96 | ], |
|
82 | 97 | "language": "python", |
|
98 | "metadata": {}, | |
|
83 | 99 | "outputs": [] |
|
84 | 100 | }, |
|
85 | 101 | { |
|
86 | 102 | "cell_type": "code", |
|
103 | "collapsed": false, | |
|
87 | 104 | "input": [ |
|
88 | 105 | "captured.stdout" |
|
89 | 106 | ], |
|
90 | 107 | "language": "python", |
|
108 | "metadata": {}, | |
|
91 | 109 | "outputs": [] |
|
92 | 110 | }, |
|
93 | 111 | { |
|
94 | 112 | "cell_type": "code", |
|
113 | "collapsed": false, | |
|
95 | 114 | "input": [ |
|
96 | 115 | "captured.stderr" |
|
97 | 116 | ], |
|
98 | 117 | "language": "python", |
|
118 | "metadata": {}, | |
|
99 | 119 | "outputs": [] |
|
100 | 120 | }, |
|
101 | 121 | { |
|
102 | 122 | "cell_type": "markdown", |
|
123 | "metadata": {}, | |
|
103 | 124 | "source": [ |
|
104 | 125 | "`%%capture` only captures stdout/err, not displaypub, so you can still do plots and use the display protocol inside %%capture" |
|
105 | 126 | ] |
|
106 | 127 | }, |
|
107 | 128 | { |
|
108 | 129 | "cell_type": "code", |
|
130 | "collapsed": false, | |
|
109 | 131 | "input": [ |
|
110 | 132 | "%pylab inline" |
|
111 | 133 | ], |
|
112 | 134 | "language": "python", |
|
135 | "metadata": {}, | |
|
113 | 136 | "outputs": [] |
|
114 | 137 | }, |
|
115 | 138 | { |
|
116 | 139 | "cell_type": "code", |
|
140 | "collapsed": false, | |
|
117 | 141 | "input": [ |
|
118 | "%%capture wontshutup", | |
|
119 | "", | |
|
120 | "print \"setting up X\"", | |
|
121 | "x = np.linspace(0,5,1000)", | |
|
122 | "print \"step 2: constructing y-data\"", | |
|
123 | "y = np.sin(x)", | |
|
124 | "print \"step 3: display info about y\"", | |
|
125 | "plt.plot(x,y)", | |
|
142 | "%%capture wontshutup\n", | |
|
143 | "\n", | |
|
144 | "print \"setting up X\"\n", | |
|
145 | "x = np.linspace(0,5,1000)\n", | |
|
146 | "print \"step 2: constructing y-data\"\n", | |
|
147 | "y = np.sin(x)\n", | |
|
148 | "print \"step 3: display info about y\"\n", | |
|
149 | "plt.plot(x,y)\n", | |
|
126 | 150 | "print \"okay, I'm done now\"" |
|
127 | 151 | ], |
|
128 | 152 | "language": "python", |
|
153 | "metadata": {}, | |
|
129 | 154 | "outputs": [] |
|
130 | 155 | }, |
|
131 | 156 | { |
|
132 | 157 | "cell_type": "code", |
|
158 | "collapsed": false, | |
|
133 | 159 | "input": [ |
|
134 | 160 | "wontshutup()" |
|
135 | 161 | ], |
|
136 | 162 | "language": "python", |
|
163 | "metadata": {}, | |
|
137 | 164 | "outputs": [] |
|
138 | 165 | }, |
|
139 | 166 | { |
|
140 | 167 | "cell_type": "markdown", |
|
168 | "metadata": {}, | |
|
141 | 169 | "source": [ |
|
142 | 170 | "And you can selectively disable capturing stdout or stderr by passing `--no-stdout/err`." |
|
143 | 171 | ] |
|
144 | 172 | }, |
|
145 | 173 | { |
|
146 | 174 | "cell_type": "code", |
|
175 | "collapsed": false, | |
|
147 | 176 | "input": [ |
|
148 | "%%capture cap --no-stderr", | |
|
149 | "print 'hi, stdout'", | |
|
177 | "%%capture cap --no-stderr\n", | |
|
178 | "print 'hi, stdout'\n", | |
|
150 | 179 | "print >> sys.stderr, \"hello, stderr\"" |
|
151 | 180 | ], |
|
152 | 181 | "language": "python", |
|
182 | "metadata": {}, | |
|
153 | 183 | "outputs": [] |
|
154 | 184 | }, |
|
155 | 185 | { |
|
156 | 186 | "cell_type": "code", |
|
187 | "collapsed": false, | |
|
157 | 188 | "input": [ |
|
158 | 189 | "cap.stdout" |
|
159 | 190 | ], |
|
160 | 191 | "language": "python", |
|
192 | "metadata": {}, | |
|
161 | 193 | "outputs": [] |
|
162 | 194 | }, |
|
163 | 195 | { |
|
164 | 196 | "cell_type": "code", |
|
197 | "collapsed": false, | |
|
165 | 198 | "input": [ |
|
166 | 199 | "cap.stderr" |
|
167 | 200 | ], |
|
168 | 201 | "language": "python", |
|
169 | "outputs": [] | |
|
170 | }, | |
|
171 | { | |
|
172 | "cell_type": "code", | |
|
173 | "input": [ | |
|
174 | "" | |
|
175 | ], | |
|
176 | "language": "python", | |
|
202 | "metadata": {}, | |
|
177 | 203 | "outputs": [] |
|
178 | 204 | } |
|
179 | ] | |
|
205 | ], | |
|
206 | "metadata": {} | |
|
180 | 207 | } |
|
181 | 208 | ] |
|
182 | 209 | } No newline at end of file |
@@ -3,57 +3,64 b'' | |||
|
3 | 3 | "name": "Script Magics" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "heading", |
|
11 | 12 | "level": 1, |
|
13 | "metadata": {}, | |
|
12 | 14 | "source": [ |
|
13 | 15 | "Running Scripts from IPython" |
|
14 | 16 | ] |
|
15 | 17 | }, |
|
16 | 18 | { |
|
17 | 19 | "cell_type": "markdown", |
|
20 | "metadata": {}, | |
|
18 | 21 | "source": [ |
|
19 | "IPython has a `%%script` cell magic, which lets you run a cell in", | |
|
20 | "a subprocess of any interpreter on your system, such as: bash, ruby, perl, zsh, R, etc.", | |
|
21 | "", | |
|
22 | "IPython has a `%%script` cell magic, which lets you run a cell in\n", | |
|
23 | "a subprocess of any interpreter on your system, such as: bash, ruby, perl, zsh, R, etc.\n", | |
|
24 | "\n", | |
|
22 | 25 | "It can even be a script of your own, which expects input on stdin." |
|
23 | 26 | ] |
|
24 | 27 | }, |
|
25 | 28 | { |
|
26 | 29 | "cell_type": "code", |
|
30 | "collapsed": false, | |
|
27 | 31 | "input": [ |
|
28 | 32 | "import sys" |
|
29 | 33 | ], |
|
30 | 34 | "language": "python", |
|
35 | "metadata": {}, | |
|
31 | 36 | "outputs": [], |
|
32 | 37 | "prompt_number": 1 |
|
33 | 38 | }, |
|
34 | 39 | { |
|
35 | 40 | "cell_type": "markdown", |
|
41 | "metadata": {}, | |
|
36 | 42 | "source": [ |
|
37 | "To use it, simply pass a path or shell command to the program you want to run on the `%%script` line,", | |
|
43 | "To use it, simply pass a path or shell command to the program you want to run on the `%%script` line,\n", | |
|
38 | 44 | "and the rest of the cell will be run by that script, and stdout/err from the subprocess are captured and displayed." |
|
39 | 45 | ] |
|
40 | 46 | }, |
|
41 | 47 | { |
|
42 | 48 | "cell_type": "code", |
|
49 | "collapsed": false, | |
|
43 | 50 | "input": [ |
|
44 | "%%script python", | |
|
45 | "import sys", | |
|
51 | "%%script python\n", | |
|
52 | "import sys\n", | |
|
46 | 53 | "print 'hello from Python %s' % sys.version" |
|
47 | 54 | ], |
|
48 | 55 | "language": "python", |
|
56 | "metadata": {}, | |
|
49 | 57 | "outputs": [ |
|
50 | 58 | { |
|
51 | 59 | "output_type": "stream", |
|
52 | 60 | "stream": "stdout", |
|
53 | 61 | "text": [ |
|
54 | "hello from Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) ", | |
|
55 |
"[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)]" |
|
|
56 | "" | |
|
62 | "hello from Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) \n", | |
|
63 | "[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)]\n" | |
|
57 | 64 | ] |
|
58 | 65 | } |
|
59 | 66 | ], |
@@ -61,20 +68,21 b'' | |||
|
61 | 68 | }, |
|
62 | 69 | { |
|
63 | 70 | "cell_type": "code", |
|
71 | "collapsed": false, | |
|
64 | 72 | "input": [ |
|
65 | "%%script python3", | |
|
66 | "import sys", | |
|
73 | "%%script python3\n", | |
|
74 | "import sys\n", | |
|
67 | 75 | "print('hello from Python: %s' % sys.version)" |
|
68 | 76 | ], |
|
69 | 77 | "language": "python", |
|
78 | "metadata": {}, | |
|
70 | 79 | "outputs": [ |
|
71 | 80 | { |
|
72 | 81 | "output_type": "stream", |
|
73 | 82 | "stream": "stdout", |
|
74 | 83 | "text": [ |
|
75 | "hello from Python: 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:25:50) ", | |
|
76 |
"[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]" |
|
|
77 | "" | |
|
84 | "hello from Python: 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:25:50) \n", | |
|
85 | "[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]\n" | |
|
78 | 86 | ] |
|
79 | 87 | } |
|
80 | 88 | ], |
@@ -82,26 +90,28 b'' | |||
|
82 | 90 | }, |
|
83 | 91 | { |
|
84 | 92 | "cell_type": "markdown", |
|
93 | "metadata": {}, | |
|
85 | 94 | "source": [ |
|
86 | "IPython also creates aliases for a few common interpreters, such as bash, ruby, perl, etc.", | |
|
87 | "", | |
|
95 | "IPython also creates aliases for a few common interpreters, such as bash, ruby, perl, etc.\n", | |
|
96 | "\n", | |
|
88 | 97 | "These are all equivalent to `%%script <name>`" |
|
89 | 98 | ] |
|
90 | 99 | }, |
|
91 | 100 | { |
|
92 | 101 | "cell_type": "code", |
|
102 | "collapsed": false, | |
|
93 | 103 | "input": [ |
|
94 | "%%ruby", | |
|
104 | "%%ruby\n", | |
|
95 | 105 | "puts \"Hello from Ruby #{RUBY_VERSION}\"" |
|
96 | 106 | ], |
|
97 | 107 | "language": "python", |
|
108 | "metadata": {}, | |
|
98 | 109 | "outputs": [ |
|
99 | 110 | { |
|
100 | 111 | "output_type": "stream", |
|
101 | 112 | "stream": "stdout", |
|
102 | 113 | "text": [ |
|
103 |
"Hello from Ruby 1.8.7" |
|
|
104 | "" | |
|
114 | "Hello from Ruby 1.8.7\n" | |
|
105 | 115 | ] |
|
106 | 116 | } |
|
107 | 117 | ], |
@@ -109,18 +119,19 b'' | |||
|
109 | 119 | }, |
|
110 | 120 | { |
|
111 | 121 | "cell_type": "code", |
|
122 | "collapsed": false, | |
|
112 | 123 | "input": [ |
|
113 | "%%bash", | |
|
124 | "%%bash\n", | |
|
114 | 125 | "echo \"hello from $BASH\"" |
|
115 | 126 | ], |
|
116 | 127 | "language": "python", |
|
128 | "metadata": {}, | |
|
117 | 129 | "outputs": [ |
|
118 | 130 | { |
|
119 | 131 | "output_type": "stream", |
|
120 | 132 | "stream": "stdout", |
|
121 | 133 | "text": [ |
|
122 |
"hello from /usr/local/bin/bash" |
|
|
123 | "" | |
|
134 | "hello from /usr/local/bin/bash\n" | |
|
124 | 135 | ] |
|
125 | 136 | } |
|
126 | 137 | ], |
@@ -129,40 +140,41 b'' | |||
|
129 | 140 | { |
|
130 | 141 | "cell_type": "heading", |
|
131 | 142 | "level": 2, |
|
143 | "metadata": {}, | |
|
132 | 144 | "source": [ |
|
133 | 145 | "Capturing output" |
|
134 | 146 | ] |
|
135 | 147 | }, |
|
136 | 148 | { |
|
137 | 149 | "cell_type": "markdown", |
|
150 | "metadata": {}, | |
|
138 | 151 | "source": [ |
|
139 | 152 | "You can also capture stdout/err from these subprocesses into Python variables, instead of letting them go directly to stdout/err" |
|
140 | 153 | ] |
|
141 | 154 | }, |
|
142 | 155 | { |
|
143 | 156 | "cell_type": "code", |
|
157 | "collapsed": false, | |
|
144 | 158 | "input": [ |
|
145 | "%%bash", | |
|
146 | "echo \"hi, stdout\"", | |
|
147 |
"echo \"hello, stderr\" >&2" |
|
|
148 | "" | |
|
159 | "%%bash\n", | |
|
160 | "echo \"hi, stdout\"\n", | |
|
161 | "echo \"hello, stderr\" >&2\n" | |
|
149 | 162 | ], |
|
150 | 163 | "language": "python", |
|
164 | "metadata": {}, | |
|
151 | 165 | "outputs": [ |
|
152 | 166 | { |
|
153 | 167 | "output_type": "stream", |
|
154 | 168 | "stream": "stdout", |
|
155 | 169 | "text": [ |
|
156 |
"hi, stdout" |
|
|
157 | "" | |
|
170 | "hi, stdout\n" | |
|
158 | 171 | ] |
|
159 | 172 | }, |
|
160 | 173 | { |
|
161 | 174 | "output_type": "stream", |
|
162 | 175 | "stream": "stderr", |
|
163 | 176 | "text": [ |
|
164 |
"hello, stderr" |
|
|
165 | "" | |
|
177 | "hello, stderr\n" | |
|
166 | 178 | ] |
|
167 | 179 | } |
|
168 | 180 | ], |
@@ -170,32 +182,35 b'' | |||
|
170 | 182 | }, |
|
171 | 183 | { |
|
172 | 184 | "cell_type": "code", |
|
185 | "collapsed": false, | |
|
173 | 186 | "input": [ |
|
174 | "%%bash --out output --err error", | |
|
175 | "echo \"hi, stdout\"", | |
|
187 | "%%bash --out output --err error\n", | |
|
188 | "echo \"hi, stdout\"\n", | |
|
176 | 189 | "echo \"hello, stderr\" >&2" |
|
177 | 190 | ], |
|
178 | 191 | "language": "python", |
|
192 | "metadata": {}, | |
|
179 | 193 | "outputs": [], |
|
180 | 194 | "prompt_number": 7 |
|
181 | 195 | }, |
|
182 | 196 | { |
|
183 | 197 | "cell_type": "code", |
|
198 | "collapsed": false, | |
|
184 | 199 | "input": [ |
|
185 | "print error", | |
|
200 | "print error\n", | |
|
186 | 201 | "print output" |
|
187 | 202 | ], |
|
188 | 203 | "language": "python", |
|
204 | "metadata": {}, | |
|
189 | 205 | "outputs": [ |
|
190 | 206 | { |
|
191 | 207 | "output_type": "stream", |
|
192 | 208 | "stream": "stdout", |
|
193 | 209 | "text": [ |
|
194 | "hello, stderr", | |
|
195 | "", | |
|
196 | "hi, stdout", | |
|
197 |
"" |
|
|
198 | "" | |
|
210 | "hello, stderr\n", | |
|
211 | "\n", | |
|
212 | "hi, stdout\n", | |
|
213 | "\n" | |
|
199 | 214 | ] |
|
200 | 215 | } |
|
201 | 216 | ], |
@@ -204,37 +219,40 b'' | |||
|
204 | 219 | { |
|
205 | 220 | "cell_type": "heading", |
|
206 | 221 | "level": 2, |
|
222 | "metadata": {}, | |
|
207 | 223 | "source": [ |
|
208 | 224 | "Background Scripts" |
|
209 | 225 | ] |
|
210 | 226 | }, |
|
211 | 227 | { |
|
212 | 228 | "cell_type": "markdown", |
|
229 | "metadata": {}, | |
|
213 | 230 | "source": [ |
|
214 | "These scripts can be run in the background, by adding the `--bg` flag.", | |
|
215 | "", | |
|
216 | "When you do this, output is discarded unless you use the `--out/err`", | |
|
231 | "These scripts can be run in the background, by adding the `--bg` flag.\n", | |
|
232 | "\n", | |
|
233 | "When you do this, output is discarded unless you use the `--out/err`\n", | |
|
217 | 234 | "flags to store output as above." |
|
218 | 235 | ] |
|
219 | 236 | }, |
|
220 | 237 | { |
|
221 | 238 | "cell_type": "code", |
|
239 | "collapsed": false, | |
|
222 | 240 | "input": [ |
|
223 | "%%ruby --bg --out ruby_lines", | |
|
224 | "for n in 1...10", | |
|
225 | " sleep 1", | |
|
226 | " puts \"line #{n}\"", | |
|
227 | " STDOUT.flush", | |
|
241 | "%%ruby --bg --out ruby_lines\n", | |
|
242 | "for n in 1...10\n", | |
|
243 | " sleep 1\n", | |
|
244 | " puts \"line #{n}\"\n", | |
|
245 | " STDOUT.flush\n", | |
|
228 | 246 | "end" |
|
229 | 247 | ], |
|
230 | 248 | "language": "python", |
|
249 | "metadata": {}, | |
|
231 | 250 | "outputs": [ |
|
232 | 251 | { |
|
233 | 252 | "output_type": "stream", |
|
234 | 253 | "stream": "stdout", |
|
235 | 254 | "text": [ |
|
236 |
"Starting job # 0 in a separate thread." |
|
|
237 | "" | |
|
255 | "Starting job # 0 in a separate thread.\n" | |
|
238 | 256 | ] |
|
239 | 257 | } |
|
240 | 258 | ], |
@@ -242,23 +260,26 b'' | |||
|
242 | 260 | }, |
|
243 | 261 | { |
|
244 | 262 | "cell_type": "markdown", |
|
263 | "metadata": {}, | |
|
245 | 264 | "source": [ |
|
246 | "When you do store output of a background thread, these are the stdout/err *pipes*,", | |
|
265 | "When you do store output of a background thread, these are the stdout/err *pipes*,\n", | |
|
247 | 266 | "rather than the text of the output." |
|
248 | 267 | ] |
|
249 | 268 | }, |
|
250 | 269 | { |
|
251 | 270 | "cell_type": "code", |
|
271 | "collapsed": false, | |
|
252 | 272 | "input": [ |
|
253 | 273 | "ruby_lines" |
|
254 | 274 | ], |
|
255 | 275 | "language": "python", |
|
276 | "metadata": {}, | |
|
256 | 277 | "outputs": [ |
|
257 | 278 | { |
|
258 | 279 | "output_type": "pyout", |
|
259 | 280 | "prompt_number": 10, |
|
260 | 281 | "text": [ |
|
261 |
"<open file '<fdopen>', mode 'rb' at 0x10 |
|
|
282 | "<open file '<fdopen>', mode 'rb' at 0x10a4be660>" | |
|
262 | 283 | ] |
|
263 | 284 | } |
|
264 | 285 | ], |
@@ -266,26 +287,27 b'' | |||
|
266 | 287 | }, |
|
267 | 288 | { |
|
268 | 289 | "cell_type": "code", |
|
290 | "collapsed": false, | |
|
269 | 291 | "input": [ |
|
270 | 292 | "print ruby_lines.read()" |
|
271 | 293 | ], |
|
272 | 294 | "language": "python", |
|
295 | "metadata": {}, | |
|
273 | 296 | "outputs": [ |
|
274 | 297 | { |
|
275 | 298 | "output_type": "stream", |
|
276 | 299 | "stream": "stdout", |
|
277 | 300 | "text": [ |
|
278 | "line 1", | |
|
279 | "line 2", | |
|
280 | "line 3", | |
|
281 | "line 4", | |
|
282 | "line 5", | |
|
283 | "line 6", | |
|
284 | "line 7", | |
|
285 | "line 8", | |
|
286 | "line 9", | |
|
287 |
"" |
|
|
288 | "" | |
|
301 | "line 1\n", | |
|
302 | "line 2\n", | |
|
303 | "line 3\n", | |
|
304 | "line 4\n", | |
|
305 | "line 5\n", | |
|
306 | "line 6\n", | |
|
307 | "line 7\n", | |
|
308 | "line 8\n", | |
|
309 | "line 9\n", | |
|
310 | "\n" | |
|
289 | 311 | ] |
|
290 | 312 | } |
|
291 | 313 | ], |
@@ -294,31 +316,34 b'' | |||
|
294 | 316 | { |
|
295 | 317 | "cell_type": "heading", |
|
296 | 318 | "level": 2, |
|
319 | "metadata": {}, | |
|
297 | 320 | "source": [ |
|
298 | 321 | "Arguments to subcommand" |
|
299 | 322 | ] |
|
300 | 323 | }, |
|
301 | 324 | { |
|
302 | 325 | "cell_type": "markdown", |
|
326 | "metadata": {}, | |
|
303 | 327 | "source": [ |
|
304 | "You can pass arguments the subcommand as well,", | |
|
328 | "You can pass arguments the subcommand as well,\n", | |
|
305 | 329 | "such as this example instructing Python to use integer division from Python 3:" |
|
306 | 330 | ] |
|
307 | 331 | }, |
|
308 | 332 | { |
|
309 | 333 | "cell_type": "code", |
|
334 | "collapsed": false, | |
|
310 | 335 | "input": [ |
|
311 | "%%script python -Qnew", | |
|
336 | "%%script python -Qnew\n", | |
|
312 | 337 | "print 1/3" |
|
313 | 338 | ], |
|
314 | 339 | "language": "python", |
|
340 | "metadata": {}, | |
|
315 | 341 | "outputs": [ |
|
316 | 342 | { |
|
317 | 343 | "output_type": "stream", |
|
318 | 344 | "stream": "stdout", |
|
319 | 345 | "text": [ |
|
320 |
"0.333333333333" |
|
|
321 | "" | |
|
346 | "0.333333333333\n" | |
|
322 | 347 | ] |
|
323 | 348 | } |
|
324 | 349 | ], |
@@ -326,30 +351,31 b'' | |||
|
326 | 351 | }, |
|
327 | 352 | { |
|
328 | 353 | "cell_type": "markdown", |
|
354 | "metadata": {}, | |
|
329 | 355 | "source": [ |
|
330 | "You can really specify *any* program for `%%script`,", | |
|
356 | "You can really specify *any* program for `%%script`,\n", | |
|
331 | 357 | "for instance here is a 'program' that echos the lines of stdin, with delays between each line." |
|
332 | 358 | ] |
|
333 | 359 | }, |
|
334 | 360 | { |
|
335 | 361 | "cell_type": "code", |
|
362 | "collapsed": false, | |
|
336 | 363 | "input": [ |
|
337 | "%%script --bg --out bashout bash -c \"while read line; do echo $line; sleep 1; done\"", | |
|
338 | "line 1", | |
|
339 | "line 2", | |
|
340 | "line 3", | |
|
341 | "line 4", | |
|
342 |
"line 5" |
|
|
343 | "" | |
|
364 | "%%script --bg --out bashout bash -c \"while read line; do echo $line; sleep 1; done\"\n", | |
|
365 | "line 1\n", | |
|
366 | "line 2\n", | |
|
367 | "line 3\n", | |
|
368 | "line 4\n", | |
|
369 | "line 5\n" | |
|
344 | 370 | ], |
|
345 | 371 | "language": "python", |
|
372 | "metadata": {}, | |
|
346 | 373 | "outputs": [ |
|
347 | 374 | { |
|
348 | 375 | "output_type": "stream", |
|
349 | 376 | "stream": "stdout", |
|
350 | 377 | "text": [ |
|
351 |
"Starting job # 2 in a separate thread." |
|
|
352 | "" | |
|
378 | "Starting job # 2 in a separate thread.\n" | |
|
353 | 379 | ] |
|
354 | 380 | } |
|
355 | 381 | ], |
@@ -357,65 +383,62 b'' | |||
|
357 | 383 | }, |
|
358 | 384 | { |
|
359 | 385 | "cell_type": "markdown", |
|
386 | "metadata": {}, | |
|
360 | 387 | "source": [ |
|
361 | "Remember, since the output of a background script is just the stdout pipe,", | |
|
388 | "Remember, since the output of a background script is just the stdout pipe,\n", | |
|
362 | 389 | "you can read it as lines become available:" |
|
363 | 390 | ] |
|
364 | 391 | }, |
|
365 | 392 | { |
|
366 | 393 | "cell_type": "code", |
|
394 | "collapsed": false, | |
|
367 | 395 | "input": [ |
|
368 | "import time", | |
|
369 | "tic = time.time()", | |
|
370 | "line = True", | |
|
371 | "while True:", | |
|
372 | " line = bashout.readline()", | |
|
373 | " if not line:", | |
|
374 | " break", | |
|
375 | " sys.stdout.write(\"%.1fs: %s\" %(time.time()-tic, line))", | |
|
376 |
" sys.stdout.flush()" |
|
|
377 | "" | |
|
396 | "import time\n", | |
|
397 | "tic = time.time()\n", | |
|
398 | "line = True\n", | |
|
399 | "while True:\n", | |
|
400 | " line = bashout.readline()\n", | |
|
401 | " if not line:\n", | |
|
402 | " break\n", | |
|
403 | " sys.stdout.write(\"%.1fs: %s\" %(time.time()-tic, line))\n", | |
|
404 | " sys.stdout.flush()\n" | |
|
378 | 405 | ], |
|
379 | 406 | "language": "python", |
|
407 | "metadata": {}, | |
|
380 | 408 | "outputs": [ |
|
381 | 409 | { |
|
382 | 410 | "output_type": "stream", |
|
383 | 411 | "stream": "stdout", |
|
384 | 412 | "text": [ |
|
385 |
"0.0s: line 1" |
|
|
386 | "" | |
|
413 | "0.0s: line 1\n" | |
|
387 | 414 | ] |
|
388 | 415 | }, |
|
389 | 416 | { |
|
390 | 417 | "output_type": "stream", |
|
391 | 418 | "stream": "stdout", |
|
392 | 419 | "text": [ |
|
393 |
"1.0s: line 2" |
|
|
394 | "" | |
|
420 | "1.0s: line 2\n" | |
|
395 | 421 | ] |
|
396 | 422 | }, |
|
397 | 423 | { |
|
398 | 424 | "output_type": "stream", |
|
399 | 425 | "stream": "stdout", |
|
400 | 426 | "text": [ |
|
401 |
"2.0s: line 3" |
|
|
402 | "" | |
|
427 | "2.0s: line 3\n" | |
|
403 | 428 | ] |
|
404 | 429 | }, |
|
405 | 430 | { |
|
406 | 431 | "output_type": "stream", |
|
407 | 432 | "stream": "stdout", |
|
408 | 433 | "text": [ |
|
409 |
"3.0s: line 4" |
|
|
410 | "" | |
|
434 | "3.0s: line 4\n" | |
|
411 | 435 | ] |
|
412 | 436 | }, |
|
413 | 437 | { |
|
414 | 438 | "output_type": "stream", |
|
415 | 439 | "stream": "stdout", |
|
416 | 440 | "text": [ |
|
417 |
"4.0s: line 5" |
|
|
418 | "" | |
|
441 | "4.0s: line 5\n" | |
|
419 | 442 | ] |
|
420 | 443 | } |
|
421 | 444 | ], |
@@ -424,25 +447,28 b'' | |||
|
424 | 447 | { |
|
425 | 448 | "cell_type": "heading", |
|
426 | 449 | "level": 2, |
|
450 | "metadata": {}, | |
|
427 | 451 | "source": [ |
|
428 | 452 | "Configuring the default ScriptMagics" |
|
429 | 453 | ] |
|
430 | 454 | }, |
|
431 | 455 | { |
|
432 | 456 | "cell_type": "markdown", |
|
457 | "metadata": {}, | |
|
433 | 458 | "source": [ |
|
434 | "The list of aliased script magics is configurable.", | |
|
435 | "", | |
|
436 | "The default is to pick from a few common interpreters, and use them if found, but you can specify your own in ipython_config.py:", | |
|
437 | "", | |
|
438 | " c.ScriptMagics.scripts = ['R', 'pypy', 'myprogram']", | |
|
439 | "", | |
|
440 | "And if any of these programs do not apear on your default PATH, then you would also need to specify their location with:", | |
|
441 | "", | |
|
459 | "The list of aliased script magics is configurable.\n", | |
|
460 | "\n", | |
|
461 | "The default is to pick from a few common interpreters, and use them if found, but you can specify your own in ipython_config.py:\n", | |
|
462 | "\n", | |
|
463 | " c.ScriptMagics.scripts = ['R', 'pypy', 'myprogram']\n", | |
|
464 | "\n", | |
|
465 | "And if any of these programs do not apear on your default PATH, then you would also need to specify their location with:\n", | |
|
466 | "\n", | |
|
442 | 467 | " c.ScriptMagics.script_paths = {'myprogram': '/opt/path/to/myprogram'}" |
|
443 | 468 | ] |
|
444 | 469 | } |
|
445 | ] | |
|
470 | ], | |
|
471 | "metadata": {} | |
|
446 | 472 | } |
|
447 | 473 | ] |
|
448 | 474 | } No newline at end of file |
@@ -3,12 +3,14 b'' | |||
|
3 | 3 | "name": "cython_extension" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "heading", |
|
11 | 12 | "level": 1, |
|
13 | "metadata": {}, | |
|
12 | 14 | "source": [ |
|
13 | 15 | "Cython Magic Functions Extension" |
|
14 | 16 | ] |
@@ -16,116 +18,134 b'' | |||
|
16 | 18 | { |
|
17 | 19 | "cell_type": "heading", |
|
18 | 20 | "level": 2, |
|
21 | "metadata": {}, | |
|
19 | 22 | "source": [ |
|
20 | 23 | "Loading the extension" |
|
21 | 24 | ] |
|
22 | 25 | }, |
|
23 | 26 | { |
|
24 | 27 | "cell_type": "markdown", |
|
28 | "metadata": {}, | |
|
25 | 29 | "source": [ |
|
26 | 30 | "IPtyhon has a `cythonmagic` extension that contains a number of magic functions for working with Cython code. This extension can be loaded using the `%load_ext` magic as follows:" |
|
27 | 31 | ] |
|
28 | 32 | }, |
|
29 | 33 | { |
|
30 | 34 | "cell_type": "code", |
|
35 | "collapsed": false, | |
|
31 | 36 | "input": [ |
|
32 | 37 | "%load_ext cythonmagic" |
|
33 | 38 | ], |
|
34 | 39 | "language": "python", |
|
40 | "metadata": {}, | |
|
35 | 41 | "outputs": [], |
|
36 | 42 | "prompt_number": 1 |
|
37 | 43 | }, |
|
38 | 44 | { |
|
39 | 45 | "cell_type": "heading", |
|
40 | 46 | "level": 2, |
|
47 | "metadata": {}, | |
|
41 | 48 | "source": [ |
|
42 | 49 | "The %cython_inline magic" |
|
43 | 50 | ] |
|
44 | 51 | }, |
|
45 | 52 | { |
|
46 | 53 | "cell_type": "markdown", |
|
54 | "metadata": {}, | |
|
47 | 55 | "source": [ |
|
48 | 56 | "The `%%cython_inline` magic uses `Cython.inline` to compile a Cython expression. This allows you to enter and run a function body with Cython code. Use a bare `return` statement to return values. " |
|
49 | 57 | ] |
|
50 | 58 | }, |
|
51 | 59 | { |
|
52 | 60 | "cell_type": "code", |
|
61 | "collapsed": false, | |
|
53 | 62 | "input": [ |
|
54 | 63 | "a = 10\n", |
|
55 | 64 | "b = 20" |
|
56 | 65 | ], |
|
57 | 66 | "language": "python", |
|
67 | "metadata": {}, | |
|
58 | 68 | "outputs": [], |
|
59 |
"prompt_number": |
|
|
69 | "prompt_number": 2 | |
|
60 | 70 | }, |
|
61 | 71 | { |
|
62 | 72 | "cell_type": "code", |
|
73 | "collapsed": false, | |
|
63 | 74 | "input": [ |
|
64 | 75 | "%%cython_inline\n", |
|
65 | 76 | "return a+b" |
|
66 | 77 | ], |
|
67 | 78 | "language": "python", |
|
79 | "metadata": {}, | |
|
68 | 80 | "outputs": [ |
|
69 | 81 | { |
|
70 | 82 | "output_type": "pyout", |
|
71 |
"prompt_number": |
|
|
83 | "prompt_number": 3, | |
|
72 | 84 | "text": [ |
|
73 | 85 | "30" |
|
74 | 86 | ] |
|
75 | 87 | } |
|
76 | 88 | ], |
|
77 |
"prompt_number": |
|
|
89 | "prompt_number": 3 | |
|
78 | 90 | }, |
|
79 | 91 | { |
|
80 | 92 | "cell_type": "heading", |
|
81 | 93 | "level": 2, |
|
94 | "metadata": {}, | |
|
82 | 95 | "source": [ |
|
83 | 96 | "The %cython_pyximport magic" |
|
84 | 97 | ] |
|
85 | 98 | }, |
|
86 | 99 | { |
|
87 | 100 | "cell_type": "markdown", |
|
101 | "metadata": {}, | |
|
88 | 102 | "source": [ |
|
89 | 103 | "The `%%cython_pyximport` magic allows you to enter arbitrary Cython code into a cell. That Cython code is written as a `.pyx` file in the current working directory and then imported using `pyximport`. You have the specify the name of the module that the Code will appear in. All symbols from the module are imported automatically by the magic function." |
|
90 | 104 | ] |
|
91 | 105 | }, |
|
92 | 106 | { |
|
93 | 107 | "cell_type": "code", |
|
108 | "collapsed": false, | |
|
94 | 109 | "input": [ |
|
95 | 110 | "%%cython_pyximport foo\n", |
|
96 | 111 | "def f(x):\n", |
|
97 | 112 | " return 4.0*x" |
|
98 | 113 | ], |
|
99 | 114 | "language": "python", |
|
115 | "metadata": {}, | |
|
100 | 116 | "outputs": [], |
|
101 |
"prompt_number": |
|
|
117 | "prompt_number": 4 | |
|
102 | 118 | }, |
|
103 | 119 | { |
|
104 | 120 | "cell_type": "code", |
|
121 | "collapsed": false, | |
|
105 | 122 | "input": [ |
|
106 | 123 | "f(10)" |
|
107 | 124 | ], |
|
108 | 125 | "language": "python", |
|
126 | "metadata": {}, | |
|
109 | 127 | "outputs": [ |
|
110 | 128 | { |
|
111 | 129 | "output_type": "pyout", |
|
112 |
"prompt_number": |
|
|
130 | "prompt_number": 5, | |
|
113 | 131 | "text": [ |
|
114 | 132 | "40.0" |
|
115 | 133 | ] |
|
116 | 134 | } |
|
117 | 135 | ], |
|
118 |
"prompt_number": |
|
|
136 | "prompt_number": 5 | |
|
119 | 137 | }, |
|
120 | 138 | { |
|
121 | 139 | "cell_type": "heading", |
|
122 | 140 | "level": 2, |
|
141 | "metadata": {}, | |
|
123 | 142 | "source": [ |
|
124 | 143 | "The %cython magic" |
|
125 | 144 | ] |
|
126 | 145 | }, |
|
127 | 146 | { |
|
128 | 147 | "cell_type": "markdown", |
|
148 | "metadata": {}, | |
|
129 | 149 | "source": [ |
|
130 | 150 | "Probably the most important magic is the `%cython` magic. This is similar to the `%%cython_pyximport` magic, but doesn't require you to specify a module name. Instead, the `%%cython` magic uses manages everything using temporary files in the `~/.cython/magic` directory. All of the symbols in the Cython module are imported automatically by the magic.\n", |
|
131 | 151 | "\n", |
@@ -134,6 +154,7 b'' | |||
|
134 | 154 | }, |
|
135 | 155 | { |
|
136 | 156 | "cell_type": "code", |
|
157 | "collapsed": false, | |
|
137 | 158 | "input": [ |
|
138 | 159 | "%%cython\n", |
|
139 | 160 | "cimport cython\n", |
@@ -165,15 +186,18 b'' | |||
|
165 | 186 | " return optprice" |
|
166 | 187 | ], |
|
167 | 188 | "language": "python", |
|
189 | "metadata": {}, | |
|
168 | 190 | "outputs": [], |
|
169 | 191 | "prompt_number": 6 |
|
170 | 192 | }, |
|
171 | 193 | { |
|
172 | 194 | "cell_type": "code", |
|
195 | "collapsed": false, | |
|
173 | 196 | "input": [ |
|
174 | 197 | "black_scholes(100.0, 100.0, 1.0, 0.3, 0.03, 0.0, -1)" |
|
175 | 198 | ], |
|
176 | 199 | "language": "python", |
|
200 | "metadata": {}, | |
|
177 | 201 | "outputs": [ |
|
178 | 202 | { |
|
179 | 203 | "output_type": "pyout", |
@@ -187,35 +211,40 b'' | |||
|
187 | 211 | }, |
|
188 | 212 | { |
|
189 | 213 | "cell_type": "code", |
|
214 | "collapsed": false, | |
|
190 | 215 | "input": [ |
|
191 | 216 | "%timeit black_scholes(100.0, 100.0, 1.0, 0.3, 0.03, 0.0, -1)" |
|
192 | 217 | ], |
|
193 | 218 | "language": "python", |
|
219 | "metadata": {}, | |
|
194 | 220 | "outputs": [ |
|
195 | 221 | { |
|
196 | 222 | "output_type": "stream", |
|
197 | 223 | "stream": "stdout", |
|
198 | 224 | "text": [ |
|
199 |
"1000000 loops, best of 3: |
|
|
225 | "1000000 loops, best of 3: 821 ns per loop\n" | |
|
200 | 226 | ] |
|
201 | 227 | } |
|
202 | 228 | ], |
|
203 |
"prompt_number": |
|
|
229 | "prompt_number": 8 | |
|
204 | 230 | }, |
|
205 | 231 | { |
|
206 | 232 | "cell_type": "markdown", |
|
233 | "metadata": {}, | |
|
207 | 234 | "source": [ |
|
208 | 235 | "Cython allows you to specify additional libraries to be linked with your extension, you can do so with the `-l` flag (also spelled `--lib`). Note that this flag can be passed more than once to specify multiple libraries, such as `-lm -llib2 --lib lib3`. Here's a simple example of how to access the system math library:" |
|
209 | 236 | ] |
|
210 | 237 | }, |
|
211 | 238 | { |
|
212 | 239 | "cell_type": "code", |
|
240 | "collapsed": false, | |
|
213 | 241 | "input": [ |
|
214 | 242 | "%%cython -lm\n", |
|
215 | 243 | "from libc.math cimport sin\n", |
|
216 | 244 | "print 'sin(1)=', sin(1)" |
|
217 | 245 | ], |
|
218 | 246 | "language": "python", |
|
247 | "metadata": {}, | |
|
219 | 248 | "outputs": [ |
|
220 | 249 | { |
|
221 | 250 | "output_type": "stream", |
@@ -225,15 +254,17 b'' | |||
|
225 | 254 | ] |
|
226 | 255 | } |
|
227 | 256 | ], |
|
228 |
"prompt_number": |
|
|
257 | "prompt_number": 9 | |
|
229 | 258 | }, |
|
230 | 259 | { |
|
231 | 260 | "cell_type": "markdown", |
|
261 | "metadata": {}, | |
|
232 | 262 | "source": [ |
|
233 | 263 | "You can similarly use the `-I/--include` flag to add include directories to the search path, and `-c/--compile-args` to add extra flags that are passed to Cython via the `extra_compile_args` of the distutils `Extension` class. Please see [the Cython docs on C library usage](http://docs.cython.org/src/tutorial/clibraries.html) for more details on the use of these flags." |
|
234 | 264 | ] |
|
235 | 265 | } |
|
236 | ] | |
|
266 | ], | |
|
267 | "metadata": {} | |
|
237 | 268 | } |
|
238 | 269 | ] |
|
239 | 270 | } No newline at end of file |
@@ -3,42 +3,73 b'' | |||
|
3 | 3 | "name": "display_protocol" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
11 | "cell_type": "heading", | |
|
12 | "level": 1, | |
|
13 | "metadata": {}, | |
|
14 | "source": [ | |
|
15 | "Using the IPython display protocol for your own objects" | |
|
16 | ] | |
|
17 | }, | |
|
18 | { | |
|
19 | "cell_type": "markdown", | |
|
20 | "metadata": {}, | |
|
21 | "source": [ | |
|
22 | "IPython extends the idea of the ``__repr__`` method in Python to support multiple representations for a given\n", | |
|
23 | "object, which clients can use to display the object according to their capabilities. An object can return multiple\n", | |
|
24 | "representations of itself by implementing special methods, and you can also define at runtime custom display \n", | |
|
25 | "functions for existing objects whose methods you can't or won't modify. In this notebook, we show how both approaches work.\n", | |
|
26 | "\n", | |
|
27 | "<br/>\n", | |
|
28 | "**Note:** this notebook has had all output cells stripped out so we can include it in the IPython documentation with \n", | |
|
29 | "a minimal file size. You'll need to manually execute the cells to see the output (you can run all of them with the \n", | |
|
30 | "\"Run All\" button, or execute each individually)." | |
|
31 | ] | |
|
32 | }, | |
|
33 | { | |
|
34 | "cell_type": "markdown", | |
|
35 | "metadata": {}, | |
|
36 | "source": [ | |
|
37 | "Parts of this notebook need the inline matplotlib backend:" | |
|
38 | ] | |
|
39 | }, | |
|
40 | { | |
|
41 | "cell_type": "code", | |
|
42 | "collapsed": false, | |
|
43 | "input": [ | |
|
44 | "%pylab inline" | |
|
45 | ], | |
|
46 | "language": "python", | |
|
47 | "metadata": {}, | |
|
48 | "outputs": [] | |
|
49 | }, | |
|
50 | { | |
|
51 | "cell_type": "heading", | |
|
52 | "level": 2, | |
|
53 | "metadata": {}, | |
|
54 | "source": [ | |
|
55 | "Custom-built classes with dedicated ``_repr_*_`` methods" | |
|
56 | ] | |
|
57 | }, | |
|
58 | { | |
|
10 | 59 | "cell_type": "markdown", |
|
60 | "metadata": {}, | |
|
11 | 61 | "source": [ |
|
12 | "# Using the IPython display protocol for your own objects", | |
|
13 | "", | |
|
14 | "IPython extends the idea of the ``__repr__`` method in Python to support multiple representations for a given", | |
|
15 | "object, which clients can use to display the object according to their capabilities. An object can return multiple", | |
|
16 | "representations of itself by implementing special methods, and you can also define at runtime custom display ", | |
|
17 | "functions for existing objects whose methods you can't or won't modify. In this notebook, we show how both approaches work.", | |
|
18 | "", | |
|
19 | "<br/>", | |
|
20 | "**Note:** this notebook has had all output cells stripped out so we can include it in the IPython documentation with ", | |
|
21 | "a minimal file size. You'll need to manually execute the cells to see the output (you can run all of them with the ", | |
|
22 | "\"Run All\" button, or execute each individually). You must start this notebook with", | |
|
23 | "<pre>", | |
|
24 | "ipython notebook --pylab inline", | |
|
25 | "</pre>", | |
|
26 | "", | |
|
27 | "to ensure pylab support is available for plots.", | |
|
28 | "", | |
|
29 | "## Custom-built classes with dedicated ``_repr_*_`` methods", | |
|
30 | "", | |
|
31 | "In our first example, we illustrate how objects can expose directly to IPython special representations of", | |
|
32 | "themselves, by providing methods such as ``_repr_svg_``, ``_repr_png_``, ``_repr_latex_``, etc. For a full", | |
|
33 | "list of the special ``_repr_*_`` methods supported, see the code in ``IPython.core.displaypub``.", | |
|
34 | "", | |
|
35 | "As an illustration, we build a class that holds data generated by sampling a Gaussian distribution with given mean ", | |
|
36 | "and variance. The class can display itself in a variety of ways: as a LaTeX expression or as an image in PNG or SVG ", | |
|
37 | "format. Each frontend can then decide which representation it can handle.", | |
|
38 | "Further, we illustrate how to expose directly to the user the ability to directly access the various alternate ", | |
|
39 | "representations (since by default displaying the object itself will only show one, and which is shown will depend on the ", | |
|
40 | "required representations that even cache necessary data in cases where it may be expensive to compute.", | |
|
41 | "", | |
|
62 | "In our first example, we illustrate how objects can expose directly to IPython special representations of\n", | |
|
63 | "themselves, by providing methods such as ``_repr_svg_``, ``_repr_png_``, ``_repr_latex_``, etc. For a full\n", | |
|
64 | "list of the special ``_repr_*_`` methods supported, see the code in ``IPython.core.displaypub``.\n", | |
|
65 | "\n", | |
|
66 | "As an illustration, we build a class that holds data generated by sampling a Gaussian distribution with given mean \n", | |
|
67 | "and variance. The class can display itself in a variety of ways: as a LaTeX expression or as an image in PNG or SVG \n", | |
|
68 | "format. Each frontend can then decide which representation it can handle.\n", | |
|
69 | "Further, we illustrate how to expose directly to the user the ability to directly access the various alternate \n", | |
|
70 | "representations (since by default displaying the object itself will only show one, and which is shown will depend on the \n", | |
|
71 | "required representations that even cache necessary data in cases where it may be expensive to compute.\n", | |
|
72 | "\n", | |
|
42 | 73 | "The next cell defines the Gaussian class:" |
|
43 | 74 | ] |
|
44 | 75 | }, |
@@ -46,81 +77,82 b'' | |||
|
46 | 77 | "cell_type": "code", |
|
47 | 78 | "collapsed": false, |
|
48 | 79 | "input": [ |
|
49 | "from IPython.core.pylabtools import print_figure", | |
|
50 |
"from IPython. |
|
|
51 | "", | |
|
52 | "class Gaussian(object):", | |
|
53 | " \"\"\"A simple object holding data sampled from a Gaussian distribution.", | |
|
54 | " \"\"\"", | |
|
55 | " def __init__(self, mean=0, std=1, size=1000):", | |
|
56 | " self.data = np.random.normal(mean, std, size)", | |
|
57 | " self.mean = mean", | |
|
58 | " self.std = std", | |
|
59 | " self.size = size", | |
|
60 | " # For caching plots that may be expensive to compute", | |
|
61 | " self._png_data = None", | |
|
62 | " self._svg_data = None", | |
|
63 | " ", | |
|
64 | " def _figure_data(self, format):", | |
|
65 | " fig, ax = plt.subplots()", | |
|
66 | " ax.plot(self.data, 'o')", | |
|
67 | " ax.set_title(self._repr_latex_())", | |
|
68 | " data = print_figure(fig, format)", | |
|
69 | " # We MUST close the figure, otherwise IPython's display machinery", | |
|
70 | " # will pick it up and send it as output, resulting in a double display", | |
|
71 | " plt.close(fig)", | |
|
72 | " return data", | |
|
73 | " ", | |
|
74 | " # Here we define the special repr methods that provide the IPython display protocol", | |
|
75 | " # Note that for the two figures, we cache the figure data once computed.", | |
|
76 | " ", | |
|
77 | " def _repr_png_(self):", | |
|
78 | " if self._png_data is None:", | |
|
79 | " self._png_data = self._figure_data('png')", | |
|
80 | " return self._png_data", | |
|
81 | "", | |
|
82 | "", | |
|
83 | " def _repr_svg_(self):", | |
|
84 | " if self._svg_data is None:", | |
|
85 | " self._svg_data = self._figure_data('svg')", | |
|
86 | " return self._svg_data", | |
|
87 | " ", | |
|
88 | " def _repr_latex_(self):", | |
|
89 | " return r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,", | |
|
90 | " self.std, self.size)", | |
|
91 | " ", | |
|
92 | " # We expose as properties some of the above reprs, so that the user can see them", | |
|
93 | " # directly (since otherwise the client dictates which one it shows by default)", | |
|
94 | " @property", | |
|
95 | " def png(self):", | |
|
96 | " return Image(self._repr_png_(), embed=True)", | |
|
97 | " ", | |
|
98 | " @property", | |
|
99 | " def svg(self):", | |
|
100 | " return SVG(self._repr_svg_())", | |
|
101 | " ", | |
|
102 | " @property", | |
|
103 | " def latex(self):", | |
|
104 | " return Math(self._repr_svg_())", | |
|
105 | " ", | |
|
106 | " # An example of using a property to display rich information, in this case", | |
|
107 | " # the histogram of the distribution. We've hardcoded the format to be png", | |
|
108 | " # in this case, but in production code it would be trivial to make it an option", | |
|
109 | " @property", | |
|
110 | " def hist(self):", | |
|
111 | " fig, ax = plt.subplots()", | |
|
112 | " ax.hist(self.data, bins=100)", | |
|
113 | " ax.set_title(self._repr_latex_())", | |
|
114 | " data = print_figure(fig, 'png')", | |
|
115 | " plt.close(fig)", | |
|
80 | "from IPython.core.pylabtools import print_figure\n", | |
|
81 | "from IPython.display import Image, SVG, Math\n", | |
|
82 | "\n", | |
|
83 | "class Gaussian(object):\n", | |
|
84 | " \"\"\"A simple object holding data sampled from a Gaussian distribution.\n", | |
|
85 | " \"\"\"\n", | |
|
86 | " def __init__(self, mean=0, std=1, size=1000):\n", | |
|
87 | " self.data = np.random.normal(mean, std, size)\n", | |
|
88 | " self.mean = mean\n", | |
|
89 | " self.std = std\n", | |
|
90 | " self.size = size\n", | |
|
91 | " # For caching plots that may be expensive to compute\n", | |
|
92 | " self._png_data = None\n", | |
|
93 | " self._svg_data = None\n", | |
|
94 | " \n", | |
|
95 | " def _figure_data(self, format):\n", | |
|
96 | " fig, ax = plt.subplots()\n", | |
|
97 | " ax.plot(self.data, 'o')\n", | |
|
98 | " ax.set_title(self._repr_latex_())\n", | |
|
99 | " data = print_figure(fig, format)\n", | |
|
100 | " # We MUST close the figure, otherwise IPython's display machinery\n", | |
|
101 | " # will pick it up and send it as output, resulting in a double display\n", | |
|
102 | " plt.close(fig)\n", | |
|
103 | " return data\n", | |
|
104 | " \n", | |
|
105 | " # Here we define the special repr methods that provide the IPython display protocol\n", | |
|
106 | " # Note that for the two figures, we cache the figure data once computed.\n", | |
|
107 | " \n", | |
|
108 | " def _repr_png_(self):\n", | |
|
109 | " if self._png_data is None:\n", | |
|
110 | " self._png_data = self._figure_data('png')\n", | |
|
111 | " return self._png_data\n", | |
|
112 | "\n", | |
|
113 | "\n", | |
|
114 | " def _repr_svg_(self):\n", | |
|
115 | " if self._svg_data is None:\n", | |
|
116 | " self._svg_data = self._figure_data('svg')\n", | |
|
117 | " return self._svg_data\n", | |
|
118 | " \n", | |
|
119 | " def _repr_latex_(self):\n", | |
|
120 | " return r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,\n", | |
|
121 | " self.std, self.size)\n", | |
|
122 | " \n", | |
|
123 | " # We expose as properties some of the above reprs, so that the user can see them\n", | |
|
124 | " # directly (since otherwise the client dictates which one it shows by default)\n", | |
|
125 | " @property\n", | |
|
126 | " def png(self):\n", | |
|
127 | " return Image(self._repr_png_(), embed=True)\n", | |
|
128 | " \n", | |
|
129 | " @property\n", | |
|
130 | " def svg(self):\n", | |
|
131 | " return SVG(self._repr_svg_())\n", | |
|
132 | " \n", | |
|
133 | " @property\n", | |
|
134 | " def latex(self):\n", | |
|
135 | " return Math(self._repr_svg_())\n", | |
|
136 | " \n", | |
|
137 | " # An example of using a property to display rich information, in this case\n", | |
|
138 | " # the histogram of the distribution. We've hardcoded the format to be png\n", | |
|
139 | " # in this case, but in production code it would be trivial to make it an option\n", | |
|
140 | " @property\n", | |
|
141 | " def hist(self):\n", | |
|
142 | " fig, ax = plt.subplots()\n", | |
|
143 | " ax.hist(self.data, bins=100)\n", | |
|
144 | " ax.set_title(self._repr_latex_())\n", | |
|
145 | " data = print_figure(fig, 'png')\n", | |
|
146 | " plt.close(fig)\n", | |
|
116 | 147 | " return Image(data, embed=True)" |
|
117 | 148 | ], |
|
118 | 149 | "language": "python", |
|
119 |
" |
|
|
120 | "prompt_number": 1 | |
|
150 | "metadata": {}, | |
|
151 | "outputs": [] | |
|
121 | 152 | }, |
|
122 | 153 | { |
|
123 | 154 | "cell_type": "markdown", |
|
155 | "metadata": {}, | |
|
124 | 156 | "source": [ |
|
125 | 157 | "Now, we create an instance of the Gaussian distribution, whose default representation will be its LaTeX form:" |
|
126 | 158 | ] |
@@ -129,15 +161,16 b'' | |||
|
129 | 161 | "cell_type": "code", |
|
130 | 162 | "collapsed": false, |
|
131 | 163 | "input": [ |
|
132 | "x = Gaussian()", | |
|
164 | "x = Gaussian()\n", | |
|
133 | 165 | "x" |
|
134 | 166 | ], |
|
135 | 167 | "language": "python", |
|
136 |
" |
|
|
137 | "prompt_number": 2 | |
|
168 | "metadata": {}, | |
|
169 | "outputs": [] | |
|
138 | 170 | }, |
|
139 | 171 | { |
|
140 | 172 | "cell_type": "markdown", |
|
173 | "metadata": {}, | |
|
141 | 174 | "source": [ |
|
142 | 175 | "We can view the data in png or svg formats:" |
|
143 | 176 | ] |
@@ -149,8 +182,8 b'' | |||
|
149 | 182 | "x.png" |
|
150 | 183 | ], |
|
151 | 184 | "language": "python", |
|
152 |
" |
|
|
153 | "prompt_number": 3 | |
|
185 | "metadata": {}, | |
|
186 | "outputs": [] | |
|
154 | 187 | }, |
|
155 | 188 | { |
|
156 | 189 | "cell_type": "code", |
@@ -159,13 +192,14 b'' | |||
|
159 | 192 | "x.svg" |
|
160 | 193 | ], |
|
161 | 194 | "language": "python", |
|
162 |
" |
|
|
163 | "prompt_number": 4 | |
|
195 | "metadata": {}, | |
|
196 | "outputs": [] | |
|
164 | 197 | }, |
|
165 | 198 | { |
|
166 | 199 | "cell_type": "markdown", |
|
200 | "metadata": {}, | |
|
167 | 201 | "source": [ |
|
168 | "Since IPython only displays by default as an ``Out[]`` cell the result of the last computation, we can use the", | |
|
202 | "Since IPython only displays by default as an ``Out[]`` cell the result of the last computation, we can use the\n", | |
|
169 | 203 | "``display()`` function to show more than one representation in a single cell:" |
|
170 | 204 | ] |
|
171 | 205 | }, |
@@ -173,15 +207,16 b'' | |||
|
173 | 207 | "cell_type": "code", |
|
174 | 208 | "collapsed": false, |
|
175 | 209 | "input": [ |
|
176 | "display(x.png)", | |
|
210 | "display(x.png)\n", | |
|
177 | 211 | "display(x.svg)" |
|
178 | 212 | ], |
|
179 | 213 | "language": "python", |
|
180 |
" |
|
|
181 | "prompt_number": 5 | |
|
214 | "metadata": {}, | |
|
215 | "outputs": [] | |
|
182 | 216 | }, |
|
183 | 217 | { |
|
184 | 218 | "cell_type": "markdown", |
|
219 | "metadata": {}, | |
|
185 | 220 | "source": [ |
|
186 | 221 | "Now let's create a new Gaussian with different parameters" |
|
187 | 222 | ] |
@@ -190,15 +225,16 b'' | |||
|
190 | 225 | "cell_type": "code", |
|
191 | 226 | "collapsed": false, |
|
192 | 227 | "input": [ |
|
193 | "x2 = Gaussian(0.5, 0.2, 2000)", | |
|
228 | "x2 = Gaussian(0.5, 0.2, 2000)\n", | |
|
194 | 229 | "x2" |
|
195 | 230 | ], |
|
196 | 231 | "language": "python", |
|
197 |
" |
|
|
198 | "prompt_number": 6 | |
|
232 | "metadata": {}, | |
|
233 | "outputs": [] | |
|
199 | 234 | }, |
|
200 | 235 | { |
|
201 | 236 | "cell_type": "markdown", |
|
237 | "metadata": {}, | |
|
202 | 238 | "source": [ |
|
203 | 239 | "We can easily compare them by displaying their histograms" |
|
204 | 240 | ] |
@@ -207,26 +243,27 b'' | |||
|
207 | 243 | "cell_type": "code", |
|
208 | 244 | "collapsed": false, |
|
209 | 245 | "input": [ |
|
210 | "display(x.hist)", | |
|
246 | "display(x.hist)\n", | |
|
211 | 247 | "display(x2.hist)" |
|
212 | 248 | ], |
|
213 | 249 | "language": "python", |
|
214 |
" |
|
|
215 | "prompt_number": 7 | |
|
250 | "metadata": {}, | |
|
251 | "outputs": [] | |
|
216 | 252 | }, |
|
217 | 253 | { |
|
218 | 254 | "cell_type": "markdown", |
|
255 | "metadata": {}, | |
|
219 | 256 | "source": [ |
|
220 | "## Adding IPython display support to existing objects", | |
|
221 | "", | |
|
222 | "When you are directly writing your own classes, you can adapt them for display in IPython by ", | |
|
223 | "following the above example. But in practice, we often need to work with existing code we", | |
|
224 | "can't modify. ", | |
|
225 | "", | |
|
226 | "We now illustrate how to add these kinds of extended display capabilities to existing objects.", | |
|
227 | "We will use the numpy polynomials and change their default representation to be a formatted", | |
|
228 | "LaTeX expression.", | |
|
229 | "", | |
|
257 | "## Adding IPython display support to existing objects\n", | |
|
258 | "\n", | |
|
259 | "When you are directly writing your own classes, you can adapt them for display in IPython by \n", | |
|
260 | "following the above example. But in practice, we often need to work with existing code we\n", | |
|
261 | "can't modify. \n", | |
|
262 | "\n", | |
|
263 | "We now illustrate how to add these kinds of extended display capabilities to existing objects.\n", | |
|
264 | "We will use the numpy polynomials and change their default representation to be a formatted\n", | |
|
265 | "LaTeX expression.\n", | |
|
266 | "\n", | |
|
230 | 267 | "First, consider how a numpy polynomial object renders by default:" |
|
231 | 268 | ] |
|
232 | 269 | }, |
@@ -234,48 +271,50 b'' | |||
|
234 | 271 | "cell_type": "code", |
|
235 | 272 | "collapsed": false, |
|
236 | 273 | "input": [ |
|
237 | "p = np.polynomial.Polynomial([1,2,3], [-10, 10])", | |
|
274 | "p = np.polynomial.Polynomial([1,2,3], [-10, 10])\n", | |
|
238 | 275 | "p" |
|
239 | 276 | ], |
|
240 | 277 | "language": "python", |
|
241 |
" |
|
|
242 | "prompt_number": 8 | |
|
278 | "metadata": {}, | |
|
279 | "outputs": [] | |
|
243 | 280 | }, |
|
244 | 281 | { |
|
245 | 282 | "cell_type": "markdown", |
|
283 | "metadata": {}, | |
|
246 | 284 | "source": [ |
|
247 | 285 | "Next, we define a function that pretty-prints a polynomial as a LaTeX string:" |
|
248 | 286 | ] |
|
249 | 287 | }, |
|
250 | 288 | { |
|
251 | 289 | "cell_type": "code", |
|
252 |
"collapsed": |
|
|
290 | "collapsed": false, | |
|
253 | 291 | "input": [ |
|
254 | "def poly2latex(p):", | |
|
255 | " terms = ['%.2g' % p.coef[0]]", | |
|
256 | " if len(p) > 1:", | |
|
257 | " term = 'x'", | |
|
258 | " c = p.coef[1]", | |
|
259 | " if c!=1:", | |
|
260 | " term = ('%.2g ' % c) + term", | |
|
261 | " terms.append(term)", | |
|
262 | " if len(p) > 2:", | |
|
263 | " for i in range(2, len(p)):", | |
|
264 | " term = 'x^%d' % i", | |
|
265 | " c = p.coef[i]", | |
|
266 | " if c!=1:", | |
|
267 | " term = ('%.2g ' % c) + term", | |
|
268 | " terms.append(term)", | |
|
269 | " px = '$P(x)=%s$' % '+'.join(terms)", | |
|
270 | " dom = r', domain: $[%.2g,\\ %.2g]$' % tuple(p.domain)", | |
|
292 | "def poly2latex(p):\n", | |
|
293 | " terms = ['%.2g' % p.coef[0]]\n", | |
|
294 | " if len(p) > 1:\n", | |
|
295 | " term = 'x'\n", | |
|
296 | " c = p.coef[1]\n", | |
|
297 | " if c!=1:\n", | |
|
298 | " term = ('%.2g ' % c) + term\n", | |
|
299 | " terms.append(term)\n", | |
|
300 | " if len(p) > 2:\n", | |
|
301 | " for i in range(2, len(p)):\n", | |
|
302 | " term = 'x^%d' % i\n", | |
|
303 | " c = p.coef[i]\n", | |
|
304 | " if c!=1:\n", | |
|
305 | " term = ('%.2g ' % c) + term\n", | |
|
306 | " terms.append(term)\n", | |
|
307 | " px = '$P(x)=%s$' % '+'.join(terms)\n", | |
|
308 | " dom = r', domain: $[%.2g,\\ %.2g]$' % tuple(p.domain)\n", | |
|
271 | 309 | " return px+dom" |
|
272 | 310 | ], |
|
273 | 311 | "language": "python", |
|
274 |
" |
|
|
275 | "prompt_number": 9 | |
|
312 | "metadata": {}, | |
|
313 | "outputs": [] | |
|
276 | 314 | }, |
|
277 | 315 | { |
|
278 | 316 | "cell_type": "markdown", |
|
317 | "metadata": {}, | |
|
279 | 318 | "source": [ |
|
280 | 319 | "This produces, on our polynomial ``p``, the following:" |
|
281 | 320 | ] |
@@ -287,59 +326,53 b'' | |||
|
287 | 326 | "poly2latex(p)" |
|
288 | 327 | ], |
|
289 | 328 | "language": "python", |
|
290 |
" |
|
|
291 | "prompt_number": 10 | |
|
292 | }, | |
|
293 | { | |
|
294 | "cell_type": "markdown", | |
|
295 | "source": [ | |
|
296 | "Note that this did *not* produce a formated LaTeX object, because it is simply a string ", | |
|
297 | "with LaTeX code. In order for this to be interpreted as a mathematical expression, it", | |
|
298 | "must be properly wrapped into a Math object:" | |
|
299 | ] | |
|
329 | "metadata": {}, | |
|
330 | "outputs": [] | |
|
300 | 331 | }, |
|
301 | 332 | { |
|
302 | 333 | "cell_type": "code", |
|
303 | 334 | "collapsed": false, |
|
304 | 335 | "input": [ |
|
305 |
"from IPython. |
|
|
306 |
" |
|
|
336 | "from IPython.display import Latex\n", | |
|
337 | "Latex(poly2latex(p))" | |
|
307 | 338 | ], |
|
308 | 339 | "language": "python", |
|
309 |
" |
|
|
310 | "prompt_number": 11 | |
|
340 | "metadata": {}, | |
|
341 | "outputs": [] | |
|
311 | 342 | }, |
|
312 | 343 | { |
|
313 | 344 | "cell_type": "markdown", |
|
345 | "metadata": {}, | |
|
314 | 346 | "source": [ |
|
315 | "But we can configure IPython to do this automatically for us as follows. We hook into the", | |
|
316 | "IPython display system and instruct it to use ``poly2latex`` for the latex mimetype, when", | |
|
317 | "encountering objects of the ``Polynomial`` type defined in the", | |
|
347 | "But we can configure IPython to do this automatically for us as follows. We hook into the\n", | |
|
348 | "IPython display system and instruct it to use ``poly2latex`` for the latex mimetype, when\n", | |
|
349 | "encountering objects of the ``Polynomial`` type defined in the\n", | |
|
318 | 350 | "``numpy.polynomial.polynomial`` module:" |
|
319 | 351 | ] |
|
320 | 352 | }, |
|
321 | 353 | { |
|
322 | 354 | "cell_type": "code", |
|
323 |
"collapsed": |
|
|
355 | "collapsed": false, | |
|
324 | 356 | "input": [ |
|
325 | "ip = get_ipython()", | |
|
326 | "latex_formatter = ip.display_formatter.formatters['text/latex']", | |
|
327 | "latex_formatter.for_type_by_name('numpy.polynomial.polynomial',", | |
|
357 | "ip = get_ipython()\n", | |
|
358 | "latex_formatter = ip.display_formatter.formatters['text/latex']\n", | |
|
359 | "latex_formatter.for_type_by_name('numpy.polynomial.polynomial',\n", | |
|
328 | 360 | " 'Polynomial', poly2latex)" |
|
329 | 361 | ], |
|
330 | 362 | "language": "python", |
|
331 |
" |
|
|
332 | "prompt_number": 12 | |
|
363 | "metadata": {}, | |
|
364 | "outputs": [] | |
|
333 | 365 | }, |
|
334 | 366 | { |
|
335 | 367 | "cell_type": "markdown", |
|
368 | "metadata": {}, | |
|
336 | 369 | "source": [ |
|
337 | "For more examples on how to use the above system, and how to bundle similar print functions", | |
|
338 | "into a convenient IPython extension, see the ``IPython/extensions/sympyprinting.py`` file. ", | |
|
339 | "The machinery that defines the display system is in the ``display.py`` and ``displaypub.py`` ", | |
|
340 | "files in ``IPython/core``.", | |
|
341 | "", | |
|
342 | "Once our special printer has been loaded, all polynomials will be represented by their ", | |
|
370 | "For more examples on how to use the above system, and how to bundle similar print functions\n", | |
|
371 | "into a convenient IPython extension, see the ``IPython/extensions/sympyprinting.py`` file. \n", | |
|
372 | "The machinery that defines the display system is in the ``display.py`` and ``displaypub.py`` \n", | |
|
373 | "files in ``IPython/core``.\n", | |
|
374 | "\n", | |
|
375 | "Once our special printer has been loaded, all polynomials will be represented by their \n", | |
|
343 | 376 | "mathematical form instead:" |
|
344 | 377 | ] |
|
345 | 378 | }, |
@@ -350,29 +383,22 b'' | |||
|
350 | 383 | "p" |
|
351 | 384 | ], |
|
352 | 385 | "language": "python", |
|
353 |
" |
|
|
354 | "prompt_number": 13 | |
|
386 | "metadata": {}, | |
|
387 | "outputs": [] | |
|
355 | 388 | }, |
|
356 | 389 | { |
|
357 | 390 | "cell_type": "code", |
|
358 | 391 | "collapsed": false, |
|
359 | 392 | "input": [ |
|
360 | "p2 = np.polynomial.Polynomial([-20, 71, -15, 1])", | |
|
393 | "p2 = np.polynomial.Polynomial([-20, 71, -15, 1])\n", | |
|
361 | 394 | "p2" |
|
362 | 395 | ], |
|
363 | 396 | "language": "python", |
|
364 |
" |
|
|
365 | "prompt_number": 14 | |
|
366 | }, | |
|
367 | { | |
|
368 | "cell_type": "code", | |
|
369 | "collapsed": true, | |
|
370 | "input": [], | |
|
371 | "language": "python", | |
|
372 | "outputs": [], | |
|
373 | "prompt_number": 14 | |
|
397 | "metadata": {}, | |
|
398 | "outputs": [] | |
|
374 | 399 | } |
|
375 | ] | |
|
400 | ], | |
|
401 | "metadata": {} | |
|
376 | 402 | } |
|
377 | 403 | ] |
|
378 | 404 | } No newline at end of file |
@@ -3,124 +3,137 b'' | |||
|
3 | 3 | "name": "formatting" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "markdown", |
|
12 | "metadata": {}, | |
|
11 | 13 | "source": [ |
|
12 | "# Examples of basic formatting in the notebook", | |
|
13 | "", | |
|
14 | "Normal and formatted text cells such as this one use the ", | |
|
15 | "[Markdown](http://daringfireball.net/projects/markdown/basics) syntax.", | |
|
16 | "", | |
|
17 | "", | |
|
18 | "# Title (h1)", | |
|
19 | "", | |
|
20 | "## Heading (h2)", | |
|
21 | "", | |
|
22 | "### Heading (h3)", | |
|
23 | "", | |
|
24 | "Here is a paragraph of text.", | |
|
25 | "", | |
|
26 | "* One.", | |
|
27 | " - Sublist", | |
|
28 | " - Here we go", | |
|
29 | " - Sublist", | |
|
30 | " - Here we go", | |
|
31 | " - Here we go", | |
|
32 | "* Two.", | |
|
33 | " - Sublist", | |
|
34 | "* Three.", | |
|
35 | " - Sublist", | |
|
36 | "", | |
|
37 | "Now another list:", | |
|
38 | "", | |
|
39 | "---", | |
|
40 | "", | |
|
41 | "1. Here we go", | |
|
42 | " 1. Sublist", | |
|
43 | " 2. Sublist", | |
|
44 | "2. There we go", | |
|
45 | "3. Now this", | |
|
46 | "", | |
|
47 | "And another paragraph.", | |
|
48 | "", | |
|
49 | "### Heading (h3)", | |
|
50 | "", | |
|
51 | "#### Heading (h4)", | |
|
52 | "", | |
|
53 | "##### Heading (h5)", | |
|
54 | "", | |
|
55 | "###### Heading (h6)", | |
|
56 | "", | |
|
14 | "# Examples of basic formatting in the notebook\n", | |
|
15 | "\n", | |
|
16 | "Normal and formatted text cells such as this one use the \n", | |
|
17 | "[Markdown](http://daringfireball.net/projects/markdown/basics) syntax.\n", | |
|
18 | "\n", | |
|
19 | "\n", | |
|
20 | "# Title (h1)\n", | |
|
21 | "\n", | |
|
22 | "## Heading (h2)\n", | |
|
23 | "\n", | |
|
24 | "### Heading (h3)\n", | |
|
25 | "\n", | |
|
26 | "Here is a paragraph of text.\n", | |
|
27 | "\n", | |
|
28 | "* One.\n", | |
|
29 | " - Sublist\n", | |
|
30 | " - Here we go\n", | |
|
31 | " - Sublist\n", | |
|
32 | " - Here we go\n", | |
|
33 | " - Here we go\n", | |
|
34 | "* Two.\n", | |
|
35 | " - Sublist\n", | |
|
36 | "* Three.\n", | |
|
37 | " - Sublist\n", | |
|
38 | "\n", | |
|
39 | "Now another list:\n", | |
|
40 | "\n", | |
|
41 | "---\n", | |
|
42 | "\n", | |
|
43 | "1. Here we go\n", | |
|
44 | " 1. Sublist\n", | |
|
45 | " 2. Sublist\n", | |
|
46 | "2. There we go\n", | |
|
47 | "3. Now this\n", | |
|
48 | "\n", | |
|
49 | "And another paragraph.\n", | |
|
50 | "\n", | |
|
51 | "### Heading (h3)\n", | |
|
52 | "\n", | |
|
53 | "#### Heading (h4)\n", | |
|
54 | "\n", | |
|
55 | "##### Heading (h5)\n", | |
|
56 | "\n", | |
|
57 | "###### Heading (h6)\n", | |
|
58 | "\n", | |
|
57 | 59 | "## Heading (h2)" |
|
58 | 60 | ] |
|
59 | 61 | }, |
|
60 | 62 | { |
|
61 | 63 | "cell_type": "markdown", |
|
64 | "metadata": {}, | |
|
62 | 65 | "source": [ |
|
63 | "# Heading (h1)", | |
|
64 | "", | |
|
65 | "## Heading (h2)", | |
|
66 | "", | |
|
67 | "### Heading (h3)", | |
|
68 | "", | |
|
69 | "#### Heading (h4)", | |
|
70 | "", | |
|
71 | "##### Heading (h5)", | |
|
72 | "", | |
|
73 | "###### Heading (h6)", | |
|
74 | "", | |
|
75 | "Now for a simple code example:", | |
|
76 | "", | |
|
77 | " for i in range(10):", | |
|
78 | " print i", | |
|
79 | "", | |
|
66 | "# Heading (h1)\n", | |
|
67 | "\n", | |
|
68 | "## Heading (h2)\n", | |
|
69 | "\n", | |
|
70 | "### Heading (h3)\n", | |
|
71 | "\n", | |
|
72 | "#### Heading (h4)\n", | |
|
73 | "\n", | |
|
74 | "##### Heading (h5)\n", | |
|
75 | "\n", | |
|
76 | "###### Heading (h6)\n", | |
|
77 | "\n", | |
|
78 | "Now for a simple code example:\n", | |
|
79 | "\n", | |
|
80 | " for i in range(10):\n", | |
|
81 | " print i\n", | |
|
82 | "\n", | |
|
80 | 83 | "Now more text" |
|
81 | 84 | ] |
|
82 | 85 | }, |
|
83 | 86 | { |
|
84 |
"cell_type": " |
|
|
87 | "cell_type": "heading", | |
|
88 | "level": 1, | |
|
89 | "metadata": {}, | |
|
85 | 90 | "source": [ |
|
86 | "## Heading (h2)", | |
|
87 |
|
|
|
88 | "Here is text.", | |
|
89 | "", | |
|
90 | "> This is a *block* quote. This is a block quote. This is a block quote. ", | |
|
91 | "> This is a **block** quote. This is a block quote. This is a block quote. ", | |
|
92 | "> This is a `block` quote. This is a block quote. This is a block quote. ", | |
|
93 | "> This is a block quote. This is a block quote. This is a block quote. ", | |
|
94 | "> This is a block quote. This is a block quote. This is a block quote. ", | |
|
95 | "> This is a block quote. This is a block quote. This is a block quote. ", | |
|
96 | "", | |
|
97 | "Here is text", | |
|
98 | "", | |
|
99 | "<table>", | |
|
100 | "<tr>", | |
|
101 | "<th>Header 1</th>", | |
|
102 | "<th>Header 2</th>", | |
|
103 | "</tr>", | |
|
104 | "<tr>", | |
|
105 | "<td>row 1, cell 1</td>", | |
|
106 | "<td>row 1, cell 2</td>", | |
|
107 | "</tr>", | |
|
108 | "<tr>", | |
|
109 | "<td>row 2, cell 1</td>", | |
|
110 | "<td>row 2, cell 2</td>", | |
|
111 | "</tr>", | |
|
112 | "</table>" | |
|
91 | "This is a Heading Cell (level 1)" | |
|
92 | ] | |
|
93 | }, | |
|
94 | { | |
|
95 | "cell_type": "heading", | |
|
96 | "level": 4, | |
|
97 | "metadata": {}, | |
|
98 | "source": [ | |
|
99 | "This is a Heading Cell (level 4)" | |
|
113 | 100 | ] |
|
114 | 101 | }, |
|
115 | 102 | { |
|
116 |
"cell_type": " |
|
|
117 | "collapsed": true, | |
|
118 |
" |
|
|
119 | "language": "python", | |
|
120 | "outputs": [], | |
|
121 | "prompt_number": " " | |
|
103 | "cell_type": "markdown", | |
|
104 | "metadata": {}, | |
|
105 | "source": [ | |
|
106 | "## Heading (h2)\n", | |
|
107 | "\n", | |
|
108 | "Here is text.\n", | |
|
109 | "\n", | |
|
110 | "> This is a *block* quote. This is a block quote. This is a block quote. \n", | |
|
111 | "> This is a **block** quote. This is a block quote. This is a block quote. \n", | |
|
112 | "> This is a `block` quote. This is a block quote. This is a block quote. \n", | |
|
113 | "> This is a block quote. This is a block quote. This is a block quote. \n", | |
|
114 | "> This is a block quote. This is a block quote. This is a block quote. \n", | |
|
115 | "> This is a block quote. This is a block quote. This is a block quote. \n", | |
|
116 | "\n", | |
|
117 | "Here is text\n", | |
|
118 | "\n", | |
|
119 | "<table>\n", | |
|
120 | "<tr>\n", | |
|
121 | "<th>Header 1</th>\n", | |
|
122 | "<th>Header 2</th>\n", | |
|
123 | "</tr>\n", | |
|
124 | "<tr>\n", | |
|
125 | "<td>row 1, cell 1</td>\n", | |
|
126 | "<td>row 1, cell 2</td>\n", | |
|
127 | "</tr>\n", | |
|
128 | "<tr>\n", | |
|
129 | "<td>row 2, cell 1</td>\n", | |
|
130 | "<td>row 2, cell 2</td>\n", | |
|
131 | "</tr>\n", | |
|
132 | "</table>" | |
|
133 | ] | |
|
122 | 134 | } |
|
123 | ] | |
|
135 | ], | |
|
136 | "metadata": {} | |
|
124 | 137 | } |
|
125 | 138 | ] |
|
126 | 139 | } No newline at end of file |
@@ -3,12 +3,14 b'' | |||
|
3 | 3 | "name": "octavemagic_extension" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "heading", |
|
11 | 12 | "level": 1, |
|
13 | "metadata": {}, | |
|
12 | 14 | "source": [ |
|
13 | 15 | "octavemagic: Octave inside IPython" |
|
14 | 16 | ] |
@@ -16,57 +18,65 b'' | |||
|
16 | 18 | { |
|
17 | 19 | "cell_type": "heading", |
|
18 | 20 | "level": 2, |
|
21 | "metadata": {}, | |
|
19 | 22 | "source": [ |
|
20 | 23 | "Installation" |
|
21 | 24 | ] |
|
22 | 25 | }, |
|
23 | 26 | { |
|
24 | 27 | "cell_type": "markdown", |
|
28 | "metadata": {}, | |
|
25 | 29 | "source": [ |
|
26 | "The `octavemagic` extension provides the ability to interact with Octave. It depends on the `oct2py` and `h5py` packages,", | |
|
27 | "which may be installed using `easy_install`.", | |
|
28 | "", | |
|
30 | "The `octavemagic` extension provides the ability to interact with Octave. It depends on the `oct2py` and `h5py` packages,\n", | |
|
31 | "which may be installed using `easy_install`.\n", | |
|
32 | "\n", | |
|
29 | 33 | "To enable the extension, load it as follows:" |
|
30 | 34 | ] |
|
31 | 35 | }, |
|
32 | 36 | { |
|
33 | 37 | "cell_type": "code", |
|
38 | "collapsed": false, | |
|
34 | 39 | "input": [ |
|
35 | 40 | "%load_ext octavemagic" |
|
36 | 41 | ], |
|
37 | 42 | "language": "python", |
|
43 | "metadata": {}, | |
|
38 | 44 | "outputs": [], |
|
39 | 45 | "prompt_number": 18 |
|
40 | 46 | }, |
|
41 | 47 | { |
|
42 | 48 | "cell_type": "heading", |
|
43 | 49 | "level": 2, |
|
50 | "metadata": {}, | |
|
44 | 51 | "source": [ |
|
45 | 52 | "Overview" |
|
46 | 53 | ] |
|
47 | 54 | }, |
|
48 | 55 | { |
|
49 | 56 | "cell_type": "markdown", |
|
57 | "metadata": {}, | |
|
50 | 58 | "source": [ |
|
51 | "Loading the extension enables three magic functions: `%octave`, `%octave_push`, and `%octave_pull`.", | |
|
52 | "", | |
|
53 | "The first is for executing one or more lines of Octave, while the latter allow moving variables between the Octave and Python workspace.", | |
|
59 | "Loading the extension enables three magic functions: `%octave`, `%octave_push`, and `%octave_pull`.\n", | |
|
60 | "\n", | |
|
61 | "The first is for executing one or more lines of Octave, while the latter allow moving variables between the Octave and Python workspace.\n", | |
|
54 | 62 | "Here you see an example of how to execute a single line of Octave, and how to transfer the generated value back to Python:" |
|
55 | 63 | ] |
|
56 | 64 | }, |
|
57 | 65 | { |
|
58 | 66 | "cell_type": "code", |
|
67 | "collapsed": false, | |
|
59 | 68 | "input": [ |
|
60 | "x = %octave [1 2; 3 4];", | |
|
69 | "x = %octave [1 2; 3 4];\n", | |
|
61 | 70 | "x" |
|
62 | 71 | ], |
|
63 | 72 | "language": "python", |
|
73 | "metadata": {}, | |
|
64 | 74 | "outputs": [ |
|
65 | 75 | { |
|
66 | 76 | "output_type": "pyout", |
|
67 | 77 | "prompt_number": 19, |
|
68 | 78 | "text": [ |
|
69 | "array([[ 1., 2.],", | |
|
79 | "array([[ 1., 2.],\n", | |
|
70 | 80 | " [ 3., 4.]])" |
|
71 | 81 | ] |
|
72 | 82 | } |
@@ -75,15 +85,17 b'' | |||
|
75 | 85 | }, |
|
76 | 86 | { |
|
77 | 87 | "cell_type": "code", |
|
88 | "collapsed": false, | |
|
78 | 89 | "input": [ |
|
79 | "a = [1, 2, 3]", | |
|
80 | "", | |
|
81 | "%octave_push a", | |
|
82 | "%octave a = a * 2;", | |
|
83 | "%octave_pull a", | |
|
90 | "a = [1, 2, 3]\n", | |
|
91 | "\n", | |
|
92 | "%octave_push a\n", | |
|
93 | "%octave a = a * 2;\n", | |
|
94 | "%octave_pull a\n", | |
|
84 | 95 | "a" |
|
85 | 96 | ], |
|
86 | 97 | "language": "python", |
|
98 | "metadata": {}, | |
|
87 | 99 | "outputs": [ |
|
88 | 100 | { |
|
89 | 101 | "output_type": "pyout", |
@@ -97,33 +109,38 b'' | |||
|
97 | 109 | }, |
|
98 | 110 | { |
|
99 | 111 | "cell_type": "markdown", |
|
112 | "metadata": {}, | |
|
100 | 113 | "source": [ |
|
101 | "When using the cell magic, `%%octave` (note the double `%`), multiple lines of Octave can be executed together. Unlike", | |
|
114 | "When using the cell magic, `%%octave` (note the double `%`), multiple lines of Octave can be executed together. Unlike\n", | |
|
102 | 115 | "with the single cell magic, no value is returned, so we use the `-i` and `-o` flags to specify input and output variables." |
|
103 | 116 | ] |
|
104 | 117 | }, |
|
105 | 118 | { |
|
106 | 119 | "cell_type": "code", |
|
120 | "collapsed": false, | |
|
107 | 121 | "input": [ |
|
108 | "%%octave -i x -o y", | |
|
122 | "%%octave -i x -o y\n", | |
|
109 | 123 | "y = x + 3;" |
|
110 | 124 | ], |
|
111 | 125 | "language": "python", |
|
126 | "metadata": {}, | |
|
112 | 127 | "outputs": [], |
|
113 | 128 | "prompt_number": 21 |
|
114 | 129 | }, |
|
115 | 130 | { |
|
116 | 131 | "cell_type": "code", |
|
132 | "collapsed": false, | |
|
117 | 133 | "input": [ |
|
118 | 134 | "y" |
|
119 | 135 | ], |
|
120 | 136 | "language": "python", |
|
137 | "metadata": {}, | |
|
121 | 138 | "outputs": [ |
|
122 | 139 | { |
|
123 | 140 | "output_type": "pyout", |
|
124 | 141 | "prompt_number": 22, |
|
125 | 142 | "text": [ |
|
126 | "array([[ 4., 5.],", | |
|
143 | "array([[ 4., 5.],\n", | |
|
127 | 144 | " [ 6., 7.]])" |
|
128 | 145 | ] |
|
129 | 146 | } |
@@ -133,28 +150,32 b'' | |||
|
133 | 150 | { |
|
134 | 151 | "cell_type": "heading", |
|
135 | 152 | "level": 2, |
|
153 | "metadata": {}, | |
|
136 | 154 | "source": [ |
|
137 | 155 | "Plotting" |
|
138 | 156 | ] |
|
139 | 157 | }, |
|
140 | 158 | { |
|
141 | 159 | "cell_type": "markdown", |
|
160 | "metadata": {}, | |
|
142 | 161 | "source": [ |
|
143 | 162 | "Plot output is automatically captured and displayed, and using the `-f` flag you may choose its format (currently, `png` and `svg` are supported)." |
|
144 | 163 | ] |
|
145 | 164 | }, |
|
146 | 165 | { |
|
147 | 166 | "cell_type": "code", |
|
167 | "collapsed": false, | |
|
148 | 168 | "input": [ |
|
149 | "%%octave -f svg", | |
|
150 | "", | |
|
151 | "p = [12 -2.5 -8 -0.1 8];", | |
|
152 | "x = 0:0.01:1;", | |
|
153 | "", | |
|
154 | "polyout(p, 'x')", | |
|
169 | "%%octave -f svg\n", | |
|
170 | "\n", | |
|
171 | "p = [12 -2.5 -8 -0.1 8];\n", | |
|
172 | "x = 0:0.01:1;\n", | |
|
173 | "\n", | |
|
174 | "polyout(p, 'x')\n", | |
|
155 | 175 | "plot(x, polyval(p, x));" |
|
156 | 176 | ], |
|
157 | 177 | "language": "python", |
|
178 | "metadata": {}, | |
|
158 | 179 | "outputs": [ |
|
159 | 180 | { |
|
160 | 181 | "output_type": "display_data", |
@@ -165,111 +186,111 b'' | |||
|
165 | 186 | { |
|
166 | 187 | "output_type": "display_data", |
|
167 | 188 | "svg": [ |
|
168 | "<svg height=\"240px\" viewBox=\"0 0 192 115\" width=\"400px\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">", | |
|
169 | "", | |
|
170 | "<desc>Produced by GNUPLOT 4.4 patchlevel 0 </desc>", | |
|
171 | "", | |
|
172 | "<defs>", | |
|
173 | "", | |
|
174 | "\t<circle id=\"gpDot\" r=\"0.5\" stroke-width=\"0.5\"/>", | |
|
175 | "\t<path d=\"M-1,0 h2 M0,-1 v2\" id=\"gpPt0\" stroke=\"currentColor\" stroke-width=\"0.333\"/>", | |
|
176 | "\t<path d=\"M-1,-1 L1,1 M1,-1 L-1,1\" id=\"gpPt1\" stroke=\"currentColor\" stroke-width=\"0.333\"/>", | |
|
177 | "\t<path d=\"M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1\" id=\"gpPt2\" stroke=\"currentColor\" stroke-width=\"0.333\"/>", | |
|
178 | "\t<rect height=\"2\" id=\"gpPt3\" stroke=\"currentColor\" stroke-width=\"0.333\" width=\"2\" x=\"-1\" y=\"-1\"/>", | |
|
179 | "\t<rect fill=\"currentColor\" height=\"2\" id=\"gpPt4\" stroke=\"currentColor\" stroke-width=\"0.333\" width=\"2\" x=\"-1\" y=\"-1\"/>", | |
|
180 | "\t<circle cx=\"0\" cy=\"0\" id=\"gpPt5\" r=\"1\" stroke=\"currentColor\" stroke-width=\"0.333\"/>", | |
|
181 | "\t<use fill=\"currentColor\" id=\"gpPt6\" stroke=\"none\" xlink:href=\"#gpPt5\"/>", | |
|
182 | "\t<path d=\"M0,-1.33 L-1.33,0.67 L1.33,0.67 z\" id=\"gpPt7\" stroke=\"currentColor\" stroke-width=\"0.333\"/>", | |
|
183 | "\t<use fill=\"currentColor\" id=\"gpPt8\" stroke=\"none\" xlink:href=\"#gpPt7\"/>", | |
|
184 | "\t<use id=\"gpPt9\" stroke=\"currentColor\" transform=\"rotate(180)\" xlink:href=\"#gpPt7\"/>", | |
|
185 | "\t<use fill=\"currentColor\" id=\"gpPt10\" stroke=\"none\" xlink:href=\"#gpPt9\"/>", | |
|
186 | "\t<use id=\"gpPt11\" stroke=\"currentColor\" transform=\"rotate(45)\" xlink:href=\"#gpPt3\"/>", | |
|
187 | "\t<use fill=\"currentColor\" id=\"gpPt12\" stroke=\"none\" xlink:href=\"#gpPt11\"/>", | |
|
188 | "</defs>", | |
|
189 | "<g style=\"fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter\">", | |
|
190 | "</g>", | |
|
191 | "<g style=\"fill:none; color:white; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">", | |
|
192 | "</g>", | |
|
193 | "<g style=\"fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">", | |
|
194 | "\t<path d=\"M36.4,91.2 L44.8,91.2 M177.9,91.2 L169.5,91.2 \"/>", | |
|
195 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,94.2)\">", | |
|
196 | "\t\t<text><tspan>6</tspan>", | |
|
197 | "\t\t</text>", | |
|
198 | "\t</g>", | |
|
199 | "\t<path d=\"M36.4,79.8 L44.8,79.8 M177.9,79.8 L169.5,79.8 \"/>", | |
|
200 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,82.8)\">", | |
|
201 | "\t\t<text><tspan>6.5</tspan>", | |
|
202 | "\t\t</text>", | |
|
203 | "\t</g>", | |
|
204 | "\t<path d=\"M36.4,68.4 L44.8,68.4 M177.9,68.4 L169.5,68.4 \"/>", | |
|
205 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,71.4)\">", | |
|
206 | "\t\t<text><tspan>7</tspan>", | |
|
207 | "\t\t</text>", | |
|
208 | "\t</g>", | |
|
209 | "\t<path d=\"M36.4,57.0 L44.8,57.0 M177.9,57.0 L169.5,57.0 \"/>", | |
|
210 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,60.0)\">", | |
|
211 | "\t\t<text><tspan>7.5</tspan>", | |
|
212 | "\t\t</text>", | |
|
213 | "\t</g>", | |
|
214 | "\t<path d=\"M36.4,45.5 L44.8,45.5 M177.9,45.5 L169.5,45.5 \"/>", | |
|
215 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,48.5)\">", | |
|
216 | "\t\t<text><tspan>8</tspan>", | |
|
217 | "\t\t</text>", | |
|
218 | "\t</g>", | |
|
219 | "\t<path d=\"M36.4,34.1 L44.8,34.1 M177.9,34.1 L169.5,34.1 \"/>", | |
|
220 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,37.1)\">", | |
|
221 | "\t\t<text><tspan>8.5</tspan>", | |
|
222 | "\t\t</text>", | |
|
223 | "\t</g>", | |
|
224 | "\t<path d=\"M36.4,22.7 L44.8,22.7 M177.9,22.7 L169.5,22.7 \"/>", | |
|
225 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,25.7)\">", | |
|
226 | "\t\t<text><tspan>9</tspan>", | |
|
227 | "\t\t</text>", | |
|
228 | "\t</g>", | |
|
229 | "\t<path d=\"M36.4,11.3 L44.8,11.3 M177.9,11.3 L169.5,11.3 \"/>", | |
|
230 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,14.3)\">", | |
|
231 | "\t\t<text><tspan>9.5</tspan>", | |
|
232 | "\t\t</text>", | |
|
233 | "\t</g>", | |
|
234 | "\t<path d=\"M36.4,91.2 L36.4,82.8 M36.4,11.3 L36.4,19.7 \"/>", | |
|
235 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(36.4,106.2)\">", | |
|
236 | "\t\t<text><tspan>0</tspan>", | |
|
237 | "\t\t</text>", | |
|
238 | "\t</g>", | |
|
239 | "\t<path d=\"M64.7,91.2 L64.7,82.8 M64.7,11.3 L64.7,19.7 \"/>", | |
|
240 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(64.7,106.2)\">", | |
|
241 | "\t\t<text><tspan>0.2</tspan>", | |
|
242 | "\t\t</text>", | |
|
243 | "\t</g>", | |
|
244 | "\t<path d=\"M93.0,91.2 L93.0,82.8 M93.0,11.3 L93.0,19.7 \"/>", | |
|
245 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(93.0,106.2)\">", | |
|
246 | "\t\t<text><tspan>0.4</tspan>", | |
|
247 | "\t\t</text>", | |
|
248 | "\t</g>", | |
|
249 | "\t<path d=\"M121.3,91.2 L121.3,82.8 M121.3,11.3 L121.3,19.7 \"/>", | |
|
250 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(121.3,106.2)\">", | |
|
251 | "\t\t<text><tspan>0.6</tspan>", | |
|
252 | "\t\t</text>", | |
|
253 | "\t</g>", | |
|
254 | "\t<path d=\"M149.6,91.2 L149.6,82.8 M149.6,11.3 L149.6,19.7 \"/>", | |
|
255 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(149.6,106.2)\">", | |
|
256 | "\t\t<text><tspan>0.8</tspan>", | |
|
257 | "\t\t</text>", | |
|
258 | "\t</g>", | |
|
259 | "\t<path d=\"M177.9,91.2 L177.9,82.8 M177.9,11.3 L177.9,19.7 \"/>", | |
|
260 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(177.9,106.2)\">", | |
|
261 | "\t\t<text><tspan>1</tspan>", | |
|
262 | "\t\t</text>", | |
|
263 | "\t</g>", | |
|
264 | "\t<path d=\"M36.4,11.3 L36.4,91.2 L177.9,91.2 L177.9,11.3 L36.4,11.3 Z \"/>", | |
|
265 | "</g>", | |
|
266 | "\t<a xlink:title=\"Plot #1\">", | |
|
267 | "<g style=\"fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">", | |
|
268 | "\t<path d=\"M36.4,45.5 L37.8,45.6 L39.2,45.7 L40.6,45.8 L42.1,45.9 L43.5,46.1 L44.9,46.3 L46.3,46.6 L47.7,46.9 L49.1,47.3 L50.6,47.6 L52.0,48.0 L53.4,48.5 L54.8,49.0 L56.2,49.5 L57.6,50.0 L59.0,50.6 L60.5,51.3 L61.9,51.9 L63.3,52.6 L64.7,53.3 L66.1,54.1 L67.5,54.9 L68.9,55.7 L70.4,56.5 L71.8,57.3 L73.2,58.2 L74.6,59.1 L76.0,60.1 L77.4,61.0 L78.9,62.0 L80.3,63.0 L81.7,64.0 L83.1,65.0 L84.5,66.0 L85.9,67.0 L87.3,68.1 L88.8,69.1 L90.2,70.2 L91.6,71.3 L93.0,72.3 L94.4,73.4 L95.8,74.4 L97.2,75.5 L98.7,76.5 L100.1,77.5 L101.5,78.5 L102.9,79.5 L104.3,80.5 L105.7,81.4 L107.2,82.4 L108.6,83.2 L110.0,84.1 L111.4,84.9 L112.8,85.7 L114.2,86.5 L115.6,87.2 L117.1,87.8 L118.5,88.4 L119.9,89.0 L121.3,89.5 L122.7,89.9 L124.1,90.3 L125.5,90.6 L127.0,90.8 L128.4,91.0 L129.8,91.0 L131.2,91.0 L132.6,90.9 L134.0,90.7 L135.5,90.4 L136.9,90.0 L138.3,89.5 L139.7,88.9 L141.1,88.2 L142.5,87.4 L143.9,86.4 L145.4,85.3 L146.8,84.1 L148.2,82.8 L149.6,81.3 L151.0,79.6 L152.4,77.8 L153.8,75.9 L155.3,73.8 L156.7,71.5 L158.1,69.0 L159.5,66.4 L160.9,63.6 L162.3,60.6 L163.8,57.4 L165.2,54.0 L166.6,50.4 L168.0,46.6 L169.4,42.6 L170.8,38.3 L172.2,33.9 L173.7,29.2 L175.1,24.2 L176.5,19.0 L177.9,13.6 \" stroke=\"rgb( 0, 0, 255)\"/>", | |
|
269 | "</g>", | |
|
270 | "\t</a>", | |
|
271 | "<g style=\"fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">", | |
|
272 | "</g>", | |
|
189 | "<svg height=\"240px\" viewBox=\"0 0 192 115\" width=\"400px\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", | |
|
190 | "\n", | |
|
191 | "<desc>Produced by GNUPLOT 4.4 patchlevel 0 </desc>\n", | |
|
192 | "\n", | |
|
193 | "<defs>\n", | |
|
194 | "\n", | |
|
195 | "\t<circle id=\"gpDot\" r=\"0.5\" stroke-width=\"0.5\"/>\n", | |
|
196 | "\t<path d=\"M-1,0 h2 M0,-1 v2\" id=\"gpPt0\" stroke=\"currentColor\" stroke-width=\"0.333\"/>\n", | |
|
197 | "\t<path d=\"M-1,-1 L1,1 M1,-1 L-1,1\" id=\"gpPt1\" stroke=\"currentColor\" stroke-width=\"0.333\"/>\n", | |
|
198 | "\t<path d=\"M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1\" id=\"gpPt2\" stroke=\"currentColor\" stroke-width=\"0.333\"/>\n", | |
|
199 | "\t<rect height=\"2\" id=\"gpPt3\" stroke=\"currentColor\" stroke-width=\"0.333\" width=\"2\" x=\"-1\" y=\"-1\"/>\n", | |
|
200 | "\t<rect fill=\"currentColor\" height=\"2\" id=\"gpPt4\" stroke=\"currentColor\" stroke-width=\"0.333\" width=\"2\" x=\"-1\" y=\"-1\"/>\n", | |
|
201 | "\t<circle cx=\"0\" cy=\"0\" id=\"gpPt5\" r=\"1\" stroke=\"currentColor\" stroke-width=\"0.333\"/>\n", | |
|
202 | "\t<use fill=\"currentColor\" id=\"gpPt6\" stroke=\"none\" xlink:href=\"#gpPt5\"/>\n", | |
|
203 | "\t<path d=\"M0,-1.33 L-1.33,0.67 L1.33,0.67 z\" id=\"gpPt7\" stroke=\"currentColor\" stroke-width=\"0.333\"/>\n", | |
|
204 | "\t<use fill=\"currentColor\" id=\"gpPt8\" stroke=\"none\" xlink:href=\"#gpPt7\"/>\n", | |
|
205 | "\t<use id=\"gpPt9\" stroke=\"currentColor\" transform=\"rotate(180)\" xlink:href=\"#gpPt7\"/>\n", | |
|
206 | "\t<use fill=\"currentColor\" id=\"gpPt10\" stroke=\"none\" xlink:href=\"#gpPt9\"/>\n", | |
|
207 | "\t<use id=\"gpPt11\" stroke=\"currentColor\" transform=\"rotate(45)\" xlink:href=\"#gpPt3\"/>\n", | |
|
208 | "\t<use fill=\"currentColor\" id=\"gpPt12\" stroke=\"none\" xlink:href=\"#gpPt11\"/>\n", | |
|
209 | "</defs>\n", | |
|
210 | "<g style=\"fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter\">\n", | |
|
211 | "</g>\n", | |
|
212 | "<g style=\"fill:none; color:white; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">\n", | |
|
213 | "</g>\n", | |
|
214 | "<g style=\"fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">\n", | |
|
215 | "\t<path d=\"M36.4,91.2 L44.8,91.2 M177.9,91.2 L169.5,91.2 \"/>\n", | |
|
216 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,94.2)\">\n", | |
|
217 | "\t\t<text><tspan>6</tspan>\n", | |
|
218 | "\t\t</text>\n", | |
|
219 | "\t</g>\n", | |
|
220 | "\t<path d=\"M36.4,79.8 L44.8,79.8 M177.9,79.8 L169.5,79.8 \"/>\n", | |
|
221 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,82.8)\">\n", | |
|
222 | "\t\t<text><tspan>6.5</tspan>\n", | |
|
223 | "\t\t</text>\n", | |
|
224 | "\t</g>\n", | |
|
225 | "\t<path d=\"M36.4,68.4 L44.8,68.4 M177.9,68.4 L169.5,68.4 \"/>\n", | |
|
226 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,71.4)\">\n", | |
|
227 | "\t\t<text><tspan>7</tspan>\n", | |
|
228 | "\t\t</text>\n", | |
|
229 | "\t</g>\n", | |
|
230 | "\t<path d=\"M36.4,57.0 L44.8,57.0 M177.9,57.0 L169.5,57.0 \"/>\n", | |
|
231 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,60.0)\">\n", | |
|
232 | "\t\t<text><tspan>7.5</tspan>\n", | |
|
233 | "\t\t</text>\n", | |
|
234 | "\t</g>\n", | |
|
235 | "\t<path d=\"M36.4,45.5 L44.8,45.5 M177.9,45.5 L169.5,45.5 \"/>\n", | |
|
236 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,48.5)\">\n", | |
|
237 | "\t\t<text><tspan>8</tspan>\n", | |
|
238 | "\t\t</text>\n", | |
|
239 | "\t</g>\n", | |
|
240 | "\t<path d=\"M36.4,34.1 L44.8,34.1 M177.9,34.1 L169.5,34.1 \"/>\n", | |
|
241 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,37.1)\">\n", | |
|
242 | "\t\t<text><tspan>8.5</tspan>\n", | |
|
243 | "\t\t</text>\n", | |
|
244 | "\t</g>\n", | |
|
245 | "\t<path d=\"M36.4,22.7 L44.8,22.7 M177.9,22.7 L169.5,22.7 \"/>\n", | |
|
246 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,25.7)\">\n", | |
|
247 | "\t\t<text><tspan>9</tspan>\n", | |
|
248 | "\t\t</text>\n", | |
|
249 | "\t</g>\n", | |
|
250 | "\t<path d=\"M36.4,11.3 L44.8,11.3 M177.9,11.3 L169.5,11.3 \"/>\n", | |
|
251 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:end\" transform=\"translate(30.8,14.3)\">\n", | |
|
252 | "\t\t<text><tspan>9.5</tspan>\n", | |
|
253 | "\t\t</text>\n", | |
|
254 | "\t</g>\n", | |
|
255 | "\t<path d=\"M36.4,91.2 L36.4,82.8 M36.4,11.3 L36.4,19.7 \"/>\n", | |
|
256 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(36.4,106.2)\">\n", | |
|
257 | "\t\t<text><tspan>0</tspan>\n", | |
|
258 | "\t\t</text>\n", | |
|
259 | "\t</g>\n", | |
|
260 | "\t<path d=\"M64.7,91.2 L64.7,82.8 M64.7,11.3 L64.7,19.7 \"/>\n", | |
|
261 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(64.7,106.2)\">\n", | |
|
262 | "\t\t<text><tspan>0.2</tspan>\n", | |
|
263 | "\t\t</text>\n", | |
|
264 | "\t</g>\n", | |
|
265 | "\t<path d=\"M93.0,91.2 L93.0,82.8 M93.0,11.3 L93.0,19.7 \"/>\n", | |
|
266 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(93.0,106.2)\">\n", | |
|
267 | "\t\t<text><tspan>0.4</tspan>\n", | |
|
268 | "\t\t</text>\n", | |
|
269 | "\t</g>\n", | |
|
270 | "\t<path d=\"M121.3,91.2 L121.3,82.8 M121.3,11.3 L121.3,19.7 \"/>\n", | |
|
271 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(121.3,106.2)\">\n", | |
|
272 | "\t\t<text><tspan>0.6</tspan>\n", | |
|
273 | "\t\t</text>\n", | |
|
274 | "\t</g>\n", | |
|
275 | "\t<path d=\"M149.6,91.2 L149.6,82.8 M149.6,11.3 L149.6,19.7 \"/>\n", | |
|
276 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(149.6,106.2)\">\n", | |
|
277 | "\t\t<text><tspan>0.8</tspan>\n", | |
|
278 | "\t\t</text>\n", | |
|
279 | "\t</g>\n", | |
|
280 | "\t<path d=\"M177.9,91.2 L177.9,82.8 M177.9,11.3 L177.9,19.7 \"/>\n", | |
|
281 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:{}; font-size:10.00pt; text-anchor:middle\" transform=\"translate(177.9,106.2)\">\n", | |
|
282 | "\t\t<text><tspan>1</tspan>\n", | |
|
283 | "\t\t</text>\n", | |
|
284 | "\t</g>\n", | |
|
285 | "\t<path d=\"M36.4,11.3 L36.4,91.2 L177.9,91.2 L177.9,11.3 L36.4,11.3 Z \"/>\n", | |
|
286 | "</g>\n", | |
|
287 | "\t<a xlink:title=\"Plot #1\">\n", | |
|
288 | "<g style=\"fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">\n", | |
|
289 | "\t<path d=\"M36.4,45.5 L37.8,45.6 L39.2,45.7 L40.6,45.8 L42.1,45.9 L43.5,46.1 L44.9,46.3 L46.3,46.6 L47.7,46.9 L49.1,47.3 L50.6,47.6 L52.0,48.0 L53.4,48.5 L54.8,49.0 L56.2,49.5 L57.6,50.0 L59.0,50.6 L60.5,51.3 L61.9,51.9 L63.3,52.6 L64.7,53.3 L66.1,54.1 L67.5,54.9 L68.9,55.7 L70.4,56.5 L71.8,57.3 L73.2,58.2 L74.6,59.1 L76.0,60.1 L77.4,61.0 L78.9,62.0 L80.3,63.0 L81.7,64.0 L83.1,65.0 L84.5,66.0 L85.9,67.0 L87.3,68.1 L88.8,69.1 L90.2,70.2 L91.6,71.3 L93.0,72.3 L94.4,73.4 L95.8,74.4 L97.2,75.5 L98.7,76.5 L100.1,77.5 L101.5,78.5 L102.9,79.5 L104.3,80.5 L105.7,81.4 L107.2,82.4 L108.6,83.2 L110.0,84.1 L111.4,84.9 L112.8,85.7 L114.2,86.5 L115.6,87.2 L117.1,87.8 L118.5,88.4 L119.9,89.0 L121.3,89.5 L122.7,89.9 L124.1,90.3 L125.5,90.6 L127.0,90.8 L128.4,91.0 L129.8,91.0 L131.2,91.0 L132.6,90.9 L134.0,90.7 L135.5,90.4 L136.9,90.0 L138.3,89.5 L139.7,88.9 L141.1,88.2 L142.5,87.4 L143.9,86.4 L145.4,85.3 L146.8,84.1 L148.2,82.8 L149.6,81.3 L151.0,79.6 L152.4,77.8 L153.8,75.9 L155.3,73.8 L156.7,71.5 L158.1,69.0 L159.5,66.4 L160.9,63.6 L162.3,60.6 L163.8,57.4 L165.2,54.0 L166.6,50.4 L168.0,46.6 L169.4,42.6 L170.8,38.3 L172.2,33.9 L173.7,29.2 L175.1,24.2 L176.5,19.0 L177.9,13.6 \" stroke=\"rgb( 0, 0, 255)\"/>\n", | |
|
290 | "</g>\n", | |
|
291 | "\t</a>\n", | |
|
292 | "<g style=\"fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">\n", | |
|
293 | "</g>\n", | |
|
273 | 294 | "</svg>" |
|
274 | 295 | ] |
|
275 | 296 | } |
@@ -278,21 +299,24 b'' | |||
|
278 | 299 | }, |
|
279 | 300 | { |
|
280 | 301 | "cell_type": "markdown", |
|
302 | "metadata": {}, | |
|
281 | 303 | "source": [ |
|
282 | 304 | "The plot size is adjusted using the `-s` flag:" |
|
283 | 305 | ] |
|
284 | 306 | }, |
|
285 | 307 | { |
|
286 | 308 | "cell_type": "code", |
|
309 | "collapsed": false, | |
|
287 | 310 | "input": [ |
|
288 | "%%octave -s 500,500", | |
|
289 | "", | |
|
290 | "# butterworth filter, order 2, cutoff pi/2 radians", | |
|
291 | "b = [0.292893218813452 0.585786437626905 0.292893218813452];", | |
|
292 | "a = [1 0 0.171572875253810];", | |
|
311 | "%%octave -s 500,500\n", | |
|
312 | "\n", | |
|
313 | "# butterworth filter, order 2, cutoff pi/2 radians\n", | |
|
314 | "b = [0.292893218813452 0.585786437626905 0.292893218813452];\n", | |
|
315 | "a = [1 0 0.171572875253810];\n", | |
|
293 | 316 | "freqz(b, a, 32);" |
|
294 | 317 | ], |
|
295 | 318 | "language": "python", |
|
319 | "metadata": {}, | |
|
296 | 320 | "outputs": [ |
|
297 | 321 | { |
|
298 | 322 | "output_type": "display_data", |
@@ -303,18 +327,20 b'' | |||
|
303 | 327 | }, |
|
304 | 328 | { |
|
305 | 329 | "cell_type": "code", |
|
330 | "collapsed": false, | |
|
306 | 331 | "input": [ |
|
307 | "%%octave -s 600,200 -f png", | |
|
308 | "", | |
|
309 | "subplot(121);", | |
|
310 | "[x, y] = meshgrid(0:0.1:3);", | |
|
311 | "r = sin(x - 0.5).^2 + cos(y - 0.5).^2;", | |
|
312 | "surf(x, y, r);", | |
|
313 | "", | |
|
314 | "subplot(122);", | |
|
332 | "%%octave -s 600,200 -f png\n", | |
|
333 | "\n", | |
|
334 | "subplot(121);\n", | |
|
335 | "[x, y] = meshgrid(0:0.1:3);\n", | |
|
336 | "r = sin(x - 0.5).^2 + cos(y - 0.5).^2;\n", | |
|
337 | "surf(x, y, r);\n", | |
|
338 | "\n", | |
|
339 | "subplot(122);\n", | |
|
315 | 340 | "sombrero()" |
|
316 | 341 | ], |
|
317 | 342 | "language": "python", |
|
343 | "metadata": {}, | |
|
318 | 344 | "outputs": [ |
|
319 | 345 | { |
|
320 | 346 | "output_type": "display_data", |
@@ -326,17 +352,20 b'' | |||
|
326 | 352 | { |
|
327 | 353 | "cell_type": "heading", |
|
328 | 354 | "level": 2, |
|
355 | "metadata": {}, | |
|
329 | 356 | "source": [ |
|
330 | 357 | "Future work" |
|
331 | 358 | ] |
|
332 | 359 | }, |
|
333 | 360 | { |
|
334 | 361 | "cell_type": "markdown", |
|
362 | "metadata": {}, | |
|
335 | 363 | "source": [ |
|
336 | 364 | "After the next release of `oct2py`, we'll add the ability to interrupt/kill the current Octave session without restarting the Python kernel." |
|
337 | 365 | ] |
|
338 | 366 | } |
|
339 | ] | |
|
367 | ], | |
|
368 | "metadata": {} | |
|
340 | 369 | } |
|
341 | 370 | ] |
|
342 | 371 | } No newline at end of file |
@@ -3,12 +3,14 b'' | |||
|
3 | 3 | "name": "rmagic_extension" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "heading", |
|
11 | 12 | "level": 1, |
|
13 | "metadata": {}, | |
|
12 | 14 | "source": [ |
|
13 | 15 | "Rmagic Functions Extension" |
|
14 | 16 | ] |
@@ -16,12 +18,14 b'' | |||
|
16 | 18 | { |
|
17 | 19 | "cell_type": "heading", |
|
18 | 20 | "level": 2, |
|
21 | "metadata": {}, | |
|
19 | 22 | "source": [ |
|
20 | 23 | "Line magics" |
|
21 | 24 | ] |
|
22 | 25 | }, |
|
23 | 26 | { |
|
24 | 27 | "cell_type": "markdown", |
|
28 | "metadata": {}, | |
|
25 | 29 | "source": [ |
|
26 | 30 | "IPython has an `rmagic` extension that contains a some magic functions for working with R via rpy2. This extension can be loaded using the `%load_ext` magic as follows:" |
|
27 | 31 | ] |
@@ -30,17 +34,19 b'' | |||
|
30 | 34 | "cell_type": "code", |
|
31 | 35 | "collapsed": true, |
|
32 | 36 | "input": [ |
|
33 | "%load_ext rmagic", | |
|
37 | "%load_ext rmagic\n", | |
|
34 | 38 | " " |
|
35 | 39 | ], |
|
36 | 40 | "language": "python", |
|
41 | "metadata": {}, | |
|
37 | 42 | "outputs": [], |
|
38 | 43 | "prompt_number": 1 |
|
39 | 44 | }, |
|
40 | 45 | { |
|
41 | 46 | "cell_type": "markdown", |
|
47 | "metadata": {}, | |
|
42 | 48 | "source": [ |
|
43 | "A typical use case one imagines is having some numpy arrays, wanting to compute some statistics of interest on these", | |
|
49 | "A typical use case one imagines is having some numpy arrays, wanting to compute some statistics of interest on these\n", | |
|
44 | 50 | " arrays and return the result back to python. Let's suppose we just want to fit a simple linear model to a scatterplot." |
|
45 | 51 | ] |
|
46 | 52 | }, |
@@ -48,14 +54,14 b'' | |||
|
48 | 54 | "cell_type": "code", |
|
49 | 55 | "collapsed": false, |
|
50 | 56 | "input": [ |
|
51 | "import numpy as np", | |
|
52 | "import pylab", | |
|
53 | "X = np.array([0,1,2,3,4])", | |
|
54 | "Y = np.array([3,5,4,6,7])", | |
|
55 |
"pylab.scatter(X, Y)" |
|
|
56 | "" | |
|
57 | "import numpy as np\n", | |
|
58 | "import pylab\n", | |
|
59 | "X = np.array([0,1,2,3,4])\n", | |
|
60 | "Y = np.array([3,5,4,6,7])\n", | |
|
61 | "pylab.scatter(X, Y)\n" | |
|
57 | 62 | ], |
|
58 | 63 | "language": "python", |
|
64 | "metadata": {}, | |
|
59 | 65 | "outputs": [ |
|
60 | 66 | { |
|
61 | 67 | "output_type": "pyout", |
@@ -69,6 +75,7 b'' | |||
|
69 | 75 | }, |
|
70 | 76 | { |
|
71 | 77 | "cell_type": "markdown", |
|
78 | "metadata": {}, | |
|
72 | 79 | "source": [ |
|
73 | 80 | "We can accomplish this by first pushing variables to R, fitting a model and returning the results. The line magic %Rpush copies its arguments to variables of the same name in rpy2. The %R line magic evaluates the string in rpy2 and returns the results. In this case, the coefficients of a linear model." |
|
74 | 81 | ] |
@@ -77,10 +84,11 b'' | |||
|
77 | 84 | "cell_type": "code", |
|
78 | 85 | "collapsed": false, |
|
79 | 86 | "input": [ |
|
80 | "%Rpush X Y", | |
|
87 | "%Rpush X Y\n", | |
|
81 | 88 | "%R lm(Y~X)$coef" |
|
82 | 89 | ], |
|
83 | 90 | "language": "python", |
|
91 | "metadata": {}, | |
|
84 | 92 | "outputs": [ |
|
85 | 93 | { |
|
86 | 94 | "output_type": "pyout", |
@@ -94,6 +102,7 b'' | |||
|
94 | 102 | }, |
|
95 | 103 | { |
|
96 | 104 | "cell_type": "markdown", |
|
105 | "metadata": {}, | |
|
97 | 106 | "source": [ |
|
98 | 107 | "We can check that this is correct fairly easily:" |
|
99 | 108 | ] |
@@ -102,12 +111,13 b'' | |||
|
102 | 111 | "cell_type": "code", |
|
103 | 112 | "collapsed": false, |
|
104 | 113 | "input": [ |
|
105 | "Xr = X - X.mean(); Yr = Y - Y.mean()", | |
|
106 | "slope = (Xr*Yr).sum() / (Xr**2).sum()", | |
|
107 | "intercept = Y.mean() - X.mean() * slope", | |
|
114 | "Xr = X - X.mean(); Yr = Y - Y.mean()\n", | |
|
115 | "slope = (Xr*Yr).sum() / (Xr**2).sum()\n", | |
|
116 | "intercept = Y.mean() - X.mean() * slope\n", | |
|
108 | 117 | "(intercept, slope)" |
|
109 | 118 | ], |
|
110 | 119 | "language": "python", |
|
120 | "metadata": {}, | |
|
111 | 121 | "outputs": [ |
|
112 | 122 | { |
|
113 | 123 | "output_type": "pyout", |
@@ -121,6 +131,7 b'' | |||
|
121 | 131 | }, |
|
122 | 132 | { |
|
123 | 133 | "cell_type": "markdown", |
|
134 | "metadata": {}, | |
|
124 | 135 | "source": [ |
|
125 | 136 | "It is also possible to return more than one value with %R." |
|
126 | 137 | ] |
@@ -129,10 +140,10 b'' | |||
|
129 | 140 | "cell_type": "code", |
|
130 | 141 | "collapsed": false, |
|
131 | 142 | "input": [ |
|
132 |
"%R resid(lm(Y~X)); coef(lm(X~Y))" |
|
|
133 | "" | |
|
143 | "%R resid(lm(Y~X)); coef(lm(X~Y))\n" | |
|
134 | 144 | ], |
|
135 | 145 | "language": "python", |
|
146 | "metadata": {}, | |
|
136 | 147 | "outputs": [ |
|
137 | 148 | { |
|
138 | 149 | "output_type": "pyout", |
@@ -146,18 +157,20 b'' | |||
|
146 | 157 | }, |
|
147 | 158 | { |
|
148 | 159 | "cell_type": "markdown", |
|
160 | "metadata": {}, | |
|
149 | 161 | "source": [ |
|
150 | "One can also easily capture the results of %R into python objects. Like R, the return value of this multiline expression (multiline in the sense that it is separated by ';') is the final value, which is ", | |
|
162 | "One can also easily capture the results of %R into python objects. Like R, the return value of this multiline expression (multiline in the sense that it is separated by ';') is the final value, which is \n", | |
|
151 | 163 | "the *coef(lm(X~Y))*. To pull other variables from R, there is one more magic." |
|
152 | 164 | ] |
|
153 | 165 | }, |
|
154 | 166 | { |
|
155 | 167 | "cell_type": "markdown", |
|
168 | "metadata": {}, | |
|
156 | 169 | "source": [ |
|
157 | "There are two more line magics, %Rpull and %Rget. Both are useful after some R code has been executed and there are variables", | |
|
158 | "in the rpy2 namespace that one would like to retrieve. The main difference is that one", | |
|
159 | " returns the value (%Rget), while the other pulls it to self.shell.user_ns (%Rpull). Imagine we've stored the results", | |
|
160 | "of some calculation in the variable \"a\" in rpy2's namespace. By using the %R magic, we can obtain these results and", | |
|
170 | "There are two more line magics, %Rpull and %Rget. Both are useful after some R code has been executed and there are variables\n", | |
|
171 | "in the rpy2 namespace that one would like to retrieve. The main difference is that one\n", | |
|
172 | " returns the value (%Rget), while the other pulls it to self.shell.user_ns (%Rpull). Imagine we've stored the results\n", | |
|
173 | "of some calculation in the variable \"a\" in rpy2's namespace. By using the %R magic, we can obtain these results and\n", | |
|
161 | 174 | "store them in b. We can also pull them directly to user_ns with %Rpull. They are both views on the same data." |
|
162 | 175 | ] |
|
163 | 176 | }, |
@@ -165,20 +178,20 b'' | |||
|
165 | 178 | "cell_type": "code", |
|
166 | 179 | "collapsed": false, |
|
167 | 180 | "input": [ |
|
168 | "b = %R a=resid(lm(Y~X))", | |
|
169 | "%Rpull a", | |
|
170 | "print a", | |
|
171 | "assert id(b.data) == id(a.data)", | |
|
181 | "b = %R a=resid(lm(Y~X))\n", | |
|
182 | "%Rpull a\n", | |
|
183 | "print a\n", | |
|
184 | "assert id(b.data) == id(a.data)\n", | |
|
172 | 185 | "%R -o a" |
|
173 | 186 | ], |
|
174 | 187 | "language": "python", |
|
188 | "metadata": {}, | |
|
175 | 189 | "outputs": [ |
|
176 | 190 | { |
|
177 | 191 | "output_type": "stream", |
|
178 | 192 | "stream": "stdout", |
|
179 | 193 | "text": [ |
|
180 |
"[-0.2 0.9 -1. 0.1 0.2]" |
|
|
181 | "" | |
|
194 | "[-0.2 0.9 -1. 0.1 0.2]\n" | |
|
182 | 195 | ] |
|
183 | 196 | } |
|
184 | 197 | ], |
@@ -186,32 +199,32 b'' | |||
|
186 | 199 | }, |
|
187 | 200 | { |
|
188 | 201 | "cell_type": "markdown", |
|
202 | "metadata": {}, | |
|
189 | 203 | "source": [ |
|
190 |
"%Rpull is equivalent to calling %R with just -o" |
|
|
191 | "" | |
|
204 | "%Rpull is equivalent to calling %R with just -o\n" | |
|
192 | 205 | ] |
|
193 | 206 | }, |
|
194 | 207 | { |
|
195 | 208 | "cell_type": "code", |
|
196 | 209 | "collapsed": false, |
|
197 | 210 | "input": [ |
|
198 | "%R d=resid(lm(Y~X)); e=coef(lm(Y~X))", | |
|
199 | "%R -o d -o e", | |
|
200 | "%Rpull e", | |
|
201 | "print d", | |
|
202 | "print e", | |
|
203 | "import numpy as np", | |
|
211 | "%R d=resid(lm(Y~X)); e=coef(lm(Y~X))\n", | |
|
212 | "%R -o d -o e\n", | |
|
213 | "%Rpull e\n", | |
|
214 | "print d\n", | |
|
215 | "print e\n", | |
|
216 | "import numpy as np\n", | |
|
204 | 217 | "np.testing.assert_almost_equal(d, a)" |
|
205 | 218 | ], |
|
206 | 219 | "language": "python", |
|
220 | "metadata": {}, | |
|
207 | 221 | "outputs": [ |
|
208 | 222 | { |
|
209 | 223 | "output_type": "stream", |
|
210 | 224 | "stream": "stdout", |
|
211 | 225 | "text": [ |
|
212 | "[-0.2 0.9 -1. 0.1 0.2]", | |
|
213 |
"[ 3.2 0.9]" |
|
|
214 | "" | |
|
226 | "[-0.2 0.9 -1. 0.1 0.2]\n", | |
|
227 | "[ 3.2 0.9]\n" | |
|
215 | 228 | ] |
|
216 | 229 | } |
|
217 | 230 | ], |
@@ -219,6 +232,7 b'' | |||
|
219 | 232 | }, |
|
220 | 233 | { |
|
221 | 234 | "cell_type": "markdown", |
|
235 | "metadata": {}, | |
|
222 | 236 | "source": [ |
|
223 | 237 | "On the other hand %Rpush is equivalent to calling %R with just -i and no trailing code." |
|
224 | 238 | ] |
@@ -227,12 +241,12 b'' | |||
|
227 | 241 | "cell_type": "code", |
|
228 | 242 | "collapsed": false, |
|
229 | 243 | "input": [ |
|
230 | "A = np.arange(20)", | |
|
231 | "%R -i A", | |
|
232 |
"%R mean(A)" |
|
|
233 | "" | |
|
244 | "A = np.arange(20)\n", | |
|
245 | "%R -i A\n", | |
|
246 | "%R mean(A)\n" | |
|
234 | 247 | ], |
|
235 | 248 | "language": "python", |
|
249 | "metadata": {}, | |
|
236 | 250 | "outputs": [ |
|
237 | 251 | { |
|
238 | 252 | "output_type": "pyout", |
@@ -246,6 +260,7 b'' | |||
|
246 | 260 | }, |
|
247 | 261 | { |
|
248 | 262 | "cell_type": "markdown", |
|
263 | "metadata": {}, | |
|
249 | 264 | "source": [ |
|
250 | 265 | "The magic %Rget retrieves one variable from R." |
|
251 | 266 | ] |
@@ -257,12 +272,13 b'' | |||
|
257 | 272 | "%Rget A" |
|
258 | 273 | ], |
|
259 | 274 | "language": "python", |
|
275 | "metadata": {}, | |
|
260 | 276 | "outputs": [ |
|
261 | 277 | { |
|
262 | 278 | "output_type": "pyout", |
|
263 | 279 | "prompt_number": 9, |
|
264 | 280 | "text": [ |
|
265 | "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,", | |
|
281 | "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n", | |
|
266 | 282 | " 17, 18, 19], dtype=int32)" |
|
267 | 283 | ] |
|
268 | 284 | } |
@@ -272,12 +288,14 b'' | |||
|
272 | 288 | { |
|
273 | 289 | "cell_type": "heading", |
|
274 | 290 | "level": 2, |
|
291 | "metadata": {}, | |
|
275 | 292 | "source": [ |
|
276 | 293 | "Plotting and capturing output" |
|
277 | 294 | ] |
|
278 | 295 | }, |
|
279 | 296 | { |
|
280 | 297 | "cell_type": "markdown", |
|
298 | "metadata": {}, | |
|
281 | 299 | "source": [ |
|
282 | 300 | "R's console (i.e. its stdout() connection) is captured by ipython, as are any plots which are published as PNG files like the notebook with arguments --pylab inline. As a call to %R may produce a return value (see above) we must ask what happens to a magic like the one below. The R code specifies that something is published to the notebook. If anything is published to the notebook, that call to %R returns None." |
|
283 | 301 | ] |
@@ -286,36 +304,36 b'' | |||
|
286 | 304 | "cell_type": "code", |
|
287 | 305 | "collapsed": false, |
|
288 | 306 | "input": [ |
|
289 | "v1 = %R plot(X,Y); print(summary(lm(Y~X))); vv=mean(X)*mean(Y)", | |
|
290 | "print 'v1 is:', v1", | |
|
291 | "v2 = %R mean(X)*mean(Y)", | |
|
307 | "v1 = %R plot(X,Y); print(summary(lm(Y~X))); vv=mean(X)*mean(Y)\n", | |
|
308 | "print 'v1 is:', v1\n", | |
|
309 | "v2 = %R mean(X)*mean(Y)\n", | |
|
292 | 310 | "print 'v2 is:', v2" |
|
293 | 311 | ], |
|
294 | 312 | "language": "python", |
|
313 | "metadata": {}, | |
|
295 | 314 | "outputs": [ |
|
296 | 315 | { |
|
297 | 316 | "output_type": "display_data", |
|
298 | 317 | "text": [ |
|
299 | "", | |
|
300 | "Call:", | |
|
301 | "lm(formula = Y ~ X)", | |
|
302 | "", | |
|
303 | "Residuals:", | |
|
304 | " 1 2 3 4 5 ", | |
|
305 | "-0.2 0.9 -1.0 0.1 0.2 ", | |
|
306 | "", | |
|
307 | "Coefficients:", | |
|
308 | " Estimate Std. Error t value Pr(>|t|) ", | |
|
309 | "(Intercept) 3.2000 0.6164 5.191 0.0139 *", | |
|
310 | "X 0.9000 0.2517 3.576 0.0374 *", | |
|
311 | "---", | |
|
312 | "Signif. codes: 0 \u2018***\u2019 0.001 \u2018**\u2019 0.01 \u2018*\u2019 0.05 \u2018.\u2019 0.1 \u2018 \u2019 1 ", | |
|
313 | "", | |
|
314 | "Residual standard error: 0.7958 on 3 degrees of freedom", | |
|
315 | "Multiple R-squared: 0.81,\tAdjusted R-squared: 0.7467 ", | |
|
316 | "F-statistic: 12.79 on 1 and 3 DF, p-value: 0.03739 ", | |
|
317 |
"" |
|
|
318 | "" | |
|
318 | "\n", | |
|
319 | "Call:\n", | |
|
320 | "lm(formula = Y ~ X)\n", | |
|
321 | "\n", | |
|
322 | "Residuals:\n", | |
|
323 | " 1 2 3 4 5 \n", | |
|
324 | "-0.2 0.9 -1.0 0.1 0.2 \n", | |
|
325 | "\n", | |
|
326 | "Coefficients:\n", | |
|
327 | " Estimate Std. Error t value Pr(>|t|) \n", | |
|
328 | "(Intercept) 3.2000 0.6164 5.191 0.0139 *\n", | |
|
329 | "X 0.9000 0.2517 3.576 0.0374 *\n", | |
|
330 | "---\n", | |
|
331 | "Signif. codes: 0 \u2018***\u2019 0.001 \u2018**\u2019 0.01 \u2018*\u2019 0.05 \u2018.\u2019 0.1 \u2018 \u2019 1 \n", | |
|
332 | "\n", | |
|
333 | "Residual standard error: 0.7958 on 3 degrees of freedom\n", | |
|
334 | "Multiple R-squared: 0.81,\tAdjusted R-squared: 0.7467 \n", | |
|
335 | "F-statistic: 12.79 on 1 and 3 DF, p-value: 0.03739 \n", | |
|
336 | "\n" | |
|
319 | 337 | ] |
|
320 | 338 | }, |
|
321 | 339 | { |
@@ -326,9 +344,8 b'' | |||
|
326 | 344 | "output_type": "stream", |
|
327 | 345 | "stream": "stdout", |
|
328 | 346 | "text": [ |
|
329 | "v1 is: [ 10.]", | |
|
330 |
"v2 is: [ 10.]" |
|
|
331 | "" | |
|
347 | "v1 is: [ 10.]\n", | |
|
348 | "v2 is: [ 10.]\n" | |
|
332 | 349 | ] |
|
333 | 350 | } |
|
334 | 351 | ], |
@@ -337,12 +354,14 b'' | |||
|
337 | 354 | { |
|
338 | 355 | "cell_type": "heading", |
|
339 | 356 | "level": 2, |
|
357 | "metadata": {}, | |
|
340 | 358 | "source": [ |
|
341 | 359 | "What value is returned from %R?" |
|
342 | 360 | ] |
|
343 | 361 | }, |
|
344 | 362 | { |
|
345 | 363 | "cell_type": "markdown", |
|
364 | "metadata": {}, | |
|
346 | 365 | "source": [ |
|
347 | 366 | "Some calls have no particularly interesting return value, the magic %R will not return anything in this case. The return value in rpy2 is actually NULL so %R returns None." |
|
348 | 367 | ] |
@@ -351,10 +370,11 b'' | |||
|
351 | 370 | "cell_type": "code", |
|
352 | 371 | "collapsed": false, |
|
353 | 372 | "input": [ |
|
354 | "v = %R plot(X,Y)", | |
|
373 | "v = %R plot(X,Y)\n", | |
|
355 | 374 | "assert v == None" |
|
356 | 375 | ], |
|
357 | 376 | "language": "python", |
|
377 | "metadata": {}, | |
|
358 | 378 | "outputs": [ |
|
359 | 379 | { |
|
360 | 380 | "output_type": "display_data", |
@@ -365,6 +385,7 b'' | |||
|
365 | 385 | }, |
|
366 | 386 | { |
|
367 | 387 | "cell_type": "markdown", |
|
388 | "metadata": {}, | |
|
368 | 389 | "source": [ |
|
369 | 390 | "Also, if the return value of a call to %R (in line mode) has just been printed to the console, then its value is also not returned." |
|
370 | 391 | ] |
@@ -373,16 +394,16 b'' | |||
|
373 | 394 | "cell_type": "code", |
|
374 | 395 | "collapsed": false, |
|
375 | 396 | "input": [ |
|
376 | "v = %R print(X)", | |
|
397 | "v = %R print(X)\n", | |
|
377 | 398 | "assert v == None" |
|
378 | 399 | ], |
|
379 | 400 | "language": "python", |
|
401 | "metadata": {}, | |
|
380 | 402 | "outputs": [ |
|
381 | 403 | { |
|
382 | 404 | "output_type": "display_data", |
|
383 | 405 | "text": [ |
|
384 |
"[1] 0 1 2 3 4" |
|
|
385 | "" | |
|
406 | "[1] 0 1 2 3 4\n" | |
|
386 | 407 | ] |
|
387 | 408 | } |
|
388 | 409 | ], |
@@ -390,34 +411,33 b'' | |||
|
390 | 411 | }, |
|
391 | 412 | { |
|
392 | 413 | "cell_type": "markdown", |
|
414 | "metadata": {}, | |
|
393 | 415 | "source": [ |
|
394 |
"But, if the last value did not print anything to console, the value is returned:" |
|
|
395 | "" | |
|
416 | "But, if the last value did not print anything to console, the value is returned:\n" | |
|
396 | 417 | ] |
|
397 | 418 | }, |
|
398 | 419 | { |
|
399 | 420 | "cell_type": "code", |
|
400 | 421 | "collapsed": false, |
|
401 | 422 | "input": [ |
|
402 | "v = %R print(summary(X)); X", | |
|
423 | "v = %R print(summary(X)); X\n", | |
|
403 | 424 | "print 'v:', v" |
|
404 | 425 | ], |
|
405 | 426 | "language": "python", |
|
427 | "metadata": {}, | |
|
406 | 428 | "outputs": [ |
|
407 | 429 | { |
|
408 | 430 | "output_type": "display_data", |
|
409 | 431 | "text": [ |
|
410 | " Min. 1st Qu. Median Mean 3rd Qu. Max. ", | |
|
411 |
" 0 1 2 2 3 4 " |
|
|
412 | "" | |
|
432 | " Min. 1st Qu. Median Mean 3rd Qu. Max. \n", | |
|
433 | " 0 1 2 2 3 4 \n" | |
|
413 | 434 | ] |
|
414 | 435 | }, |
|
415 | 436 | { |
|
416 | 437 | "output_type": "stream", |
|
417 | 438 | "stream": "stdout", |
|
418 | 439 | "text": [ |
|
419 |
"v: [0 1 2 3 4]" |
|
|
420 | "" | |
|
440 | "v: [0 1 2 3 4]\n" | |
|
421 | 441 | ] |
|
422 | 442 | } |
|
423 | 443 | ], |
@@ -425,9 +445,9 b'' | |||
|
425 | 445 | }, |
|
426 | 446 | { |
|
427 | 447 | "cell_type": "markdown", |
|
448 | "metadata": {}, | |
|
428 | 449 | "source": [ |
|
429 |
"The return value can be suppressed by a trailing ';' or an -n argument." |
|
|
430 | "" | |
|
450 | "The return value can be suppressed by a trailing ';' or an -n argument.\n" | |
|
431 | 451 | ] |
|
432 | 452 | }, |
|
433 | 453 | { |
@@ -437,6 +457,7 b'' | |||
|
437 | 457 | "%R -n X" |
|
438 | 458 | ], |
|
439 | 459 | "language": "python", |
|
460 | "metadata": {}, | |
|
440 | 461 | "outputs": [], |
|
441 | 462 | "prompt_number": 14 |
|
442 | 463 | }, |
@@ -447,27 +468,30 b'' | |||
|
447 | 468 | "%R X; " |
|
448 | 469 | ], |
|
449 | 470 | "language": "python", |
|
471 | "metadata": {}, | |
|
450 | 472 | "outputs": [], |
|
451 | 473 | "prompt_number": 15 |
|
452 | 474 | }, |
|
453 | 475 | { |
|
454 | 476 | "cell_type": "heading", |
|
455 | 477 | "level": 2, |
|
478 | "metadata": {}, | |
|
456 | 479 | "source": [ |
|
457 | 480 | "Cell level magic" |
|
458 | 481 | ] |
|
459 | 482 | }, |
|
460 | 483 | { |
|
461 | 484 | "cell_type": "markdown", |
|
485 | "metadata": {}, | |
|
462 | 486 | "source": [ |
|
463 | "Often, we will want to do more than a simple linear regression model. There may be several lines of R code that we want to ", | |
|
464 | "use before returning to python. This is the cell-level magic.", | |
|
465 | "", | |
|
466 | "", | |
|
467 | "For the cell level magic, inputs can be passed via the -i or --inputs argument in the line. These variables are copied ", | |
|
468 | "from the shell namespace to R's namespace using rpy2.robjects.r.assign. It would be nice not to have to copy these into R: rnumpy ( http://bitbucket.org/njs/rnumpy/wiki/API ) has done some work to limit or at least make transparent the number of copies of an array. This seems like a natural thing to try to build on. Arrays can be output from R via the -o or --outputs argument in the line. All other arguments are sent to R's png function, which is the graphics device used to create the plots.", | |
|
469 | "", | |
|
470 | "We can redo the above calculations in one ipython cell. We might also want to add some output such as a summary", | |
|
487 | "Often, we will want to do more than a simple linear regression model. There may be several lines of R code that we want to \n", | |
|
488 | "use before returning to python. This is the cell-level magic.\n", | |
|
489 | "\n", | |
|
490 | "\n", | |
|
491 | "For the cell level magic, inputs can be passed via the -i or --inputs argument in the line. These variables are copied \n", | |
|
492 | "from the shell namespace to R's namespace using rpy2.robjects.r.assign. It would be nice not to have to copy these into R: rnumpy ( http://bitbucket.org/njs/rnumpy/wiki/API ) has done some work to limit or at least make transparent the number of copies of an array. This seems like a natural thing to try to build on. Arrays can be output from R via the -o or --outputs argument in the line. All other arguments are sent to R's png function, which is the graphics device used to create the plots.\n", | |
|
493 | "\n", | |
|
494 | "We can redo the above calculations in one ipython cell. We might also want to add some output such as a summary\n", | |
|
471 | 495 | " from R or perhaps the standard plotting diagnostics of the lm." |
|
472 | 496 | ] |
|
473 | 497 | }, |
@@ -475,38 +499,38 b'' | |||
|
475 | 499 | "cell_type": "code", |
|
476 | 500 | "collapsed": false, |
|
477 | 501 | "input": [ |
|
478 | "%%R -i X,Y -o XYcoef", | |
|
479 | "XYlm = lm(Y~X)", | |
|
480 | "XYcoef = coef(XYlm)", | |
|
481 | "print(summary(XYlm))", | |
|
482 | "par(mfrow=c(2,2))", | |
|
502 | "%%R -i X,Y -o XYcoef\n", | |
|
503 | "XYlm = lm(Y~X)\n", | |
|
504 | "XYcoef = coef(XYlm)\n", | |
|
505 | "print(summary(XYlm))\n", | |
|
506 | "par(mfrow=c(2,2))\n", | |
|
483 | 507 | "plot(XYlm)" |
|
484 | 508 | ], |
|
485 | 509 | "language": "python", |
|
510 | "metadata": {}, | |
|
486 | 511 | "outputs": [ |
|
487 | 512 | { |
|
488 | 513 | "output_type": "display_data", |
|
489 | 514 | "text": [ |
|
490 | "", | |
|
491 | "Call:", | |
|
492 | "lm(formula = Y ~ X)", | |
|
493 | "", | |
|
494 | "Residuals:", | |
|
495 | " 1 2 3 4 5 ", | |
|
496 | "-0.2 0.9 -1.0 0.1 0.2 ", | |
|
497 | "", | |
|
498 | "Coefficients:", | |
|
499 | " Estimate Std. Error t value Pr(>|t|) ", | |
|
500 | "(Intercept) 3.2000 0.6164 5.191 0.0139 *", | |
|
501 | "X 0.9000 0.2517 3.576 0.0374 *", | |
|
502 | "---", | |
|
503 | "Signif. codes: 0 \u2018***\u2019 0.001 \u2018**\u2019 0.01 \u2018*\u2019 0.05 \u2018.\u2019 0.1 \u2018 \u2019 1 ", | |
|
504 | "", | |
|
505 | "Residual standard error: 0.7958 on 3 degrees of freedom", | |
|
506 | "Multiple R-squared: 0.81,\tAdjusted R-squared: 0.7467 ", | |
|
507 | "F-statistic: 12.79 on 1 and 3 DF, p-value: 0.03739 ", | |
|
508 |
"" |
|
|
509 | "" | |
|
515 | "\n", | |
|
516 | "Call:\n", | |
|
517 | "lm(formula = Y ~ X)\n", | |
|
518 | "\n", | |
|
519 | "Residuals:\n", | |
|
520 | " 1 2 3 4 5 \n", | |
|
521 | "-0.2 0.9 -1.0 0.1 0.2 \n", | |
|
522 | "\n", | |
|
523 | "Coefficients:\n", | |
|
524 | " Estimate Std. Error t value Pr(>|t|) \n", | |
|
525 | "(Intercept) 3.2000 0.6164 5.191 0.0139 *\n", | |
|
526 | "X 0.9000 0.2517 3.576 0.0374 *\n", | |
|
527 | "---\n", | |
|
528 | "Signif. codes: 0 \u2018***\u2019 0.001 \u2018**\u2019 0.01 \u2018*\u2019 0.05 \u2018.\u2019 0.1 \u2018 \u2019 1 \n", | |
|
529 | "\n", | |
|
530 | "Residual standard error: 0.7958 on 3 degrees of freedom\n", | |
|
531 | "Multiple R-squared: 0.81,\tAdjusted R-squared: 0.7467 \n", | |
|
532 | "F-statistic: 12.79 on 1 and 3 DF, p-value: 0.03739 \n", | |
|
533 | "\n" | |
|
510 | 534 | ] |
|
511 | 535 | }, |
|
512 | 536 | { |
@@ -519,18 +543,19 b'' | |||
|
519 | 543 | { |
|
520 | 544 | "cell_type": "heading", |
|
521 | 545 | "level": 2, |
|
546 | "metadata": {}, | |
|
522 | 547 | "source": [ |
|
523 | 548 | "Passing data back and forth" |
|
524 | 549 | ] |
|
525 | 550 | }, |
|
526 | 551 | { |
|
527 | 552 | "cell_type": "markdown", |
|
553 | "metadata": {}, | |
|
528 | 554 | "source": [ |
|
529 | "Currently, data is passed through RMagics.pyconverter when going from python to R and RMagics.Rconverter when ", | |
|
530 | "going from R to python. These currently default to numpy.ndarray. Future work will involve writing better converters, most likely involving integration with http://pandas.sourceforge.net.", | |
|
531 | "", | |
|
532 |
"Passing ndarrays into R seems to require a copy, though once an object is returned to python, this object is NOT copied, and it is possible to change its values." |
|
|
533 | "" | |
|
555 | "Currently, data is passed through RMagics.pyconverter when going from python to R and RMagics.Rconverter when \n", | |
|
556 | "going from R to python. These currently default to numpy.ndarray. Future work will involve writing better converters, most likely involving integration with http://pandas.sourceforge.net.\n", | |
|
557 | "\n", | |
|
558 | "Passing ndarrays into R seems to require a copy, though once an object is returned to python, this object is NOT copied, and it is possible to change its values.\n" | |
|
534 | 559 | ] |
|
535 | 560 | }, |
|
536 | 561 | { |
@@ -540,6 +565,7 b'' | |||
|
540 | 565 | "seq1 = np.arange(10)" |
|
541 | 566 | ], |
|
542 | 567 | "language": "python", |
|
568 | "metadata": {}, | |
|
543 | 569 | "outputs": [], |
|
544 | 570 | "prompt_number": 17 |
|
545 | 571 | }, |
@@ -547,17 +573,17 b'' | |||
|
547 | 573 | "cell_type": "code", |
|
548 | 574 | "collapsed": false, |
|
549 | 575 | "input": [ |
|
550 | "%%R -i seq1 -o seq2", | |
|
551 | "seq2 = rep(seq1, 2)", | |
|
576 | "%%R -i seq1 -o seq2\n", | |
|
577 | "seq2 = rep(seq1, 2)\n", | |
|
552 | 578 | "print(seq2)" |
|
553 | 579 | ], |
|
554 | 580 | "language": "python", |
|
581 | "metadata": {}, | |
|
555 | 582 | "outputs": [ |
|
556 | 583 | { |
|
557 | 584 | "output_type": "display_data", |
|
558 | 585 | "text": [ |
|
559 |
" [1] 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9" |
|
|
560 | "" | |
|
586 | " [1] 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9\n" | |
|
561 | 587 | ] |
|
562 | 588 | } |
|
563 | 589 | ], |
@@ -567,10 +593,11 b'' | |||
|
567 | 593 | "cell_type": "code", |
|
568 | 594 | "collapsed": false, |
|
569 | 595 | "input": [ |
|
570 | "seq2[::2] = 0", | |
|
596 | "seq2[::2] = 0\n", | |
|
571 | 597 | "seq2" |
|
572 | 598 | ], |
|
573 | 599 | "language": "python", |
|
600 | "metadata": {}, | |
|
574 | 601 | "outputs": [ |
|
575 | 602 | { |
|
576 | 603 | "output_type": "pyout", |
@@ -586,16 +613,16 b'' | |||
|
586 | 613 | "cell_type": "code", |
|
587 | 614 | "collapsed": false, |
|
588 | 615 | "input": [ |
|
589 | "%%R", | |
|
616 | "%%R\n", | |
|
590 | 617 | "print(seq2)" |
|
591 | 618 | ], |
|
592 | 619 | "language": "python", |
|
620 | "metadata": {}, | |
|
593 | 621 | "outputs": [ |
|
594 | 622 | { |
|
595 | 623 | "output_type": "display_data", |
|
596 | 624 | "text": [ |
|
597 |
" [1] 0 1 0 3 0 5 0 7 0 9 0 1 0 3 0 5 0 7 0 9" |
|
|
598 | "" | |
|
625 | " [1] 0 1 0 3 0 5 0 7 0 9 0 1 0 3 0 5 0 7 0 9\n" | |
|
599 | 626 | ] |
|
600 | 627 | } |
|
601 | 628 | ], |
@@ -603,6 +630,7 b'' | |||
|
603 | 630 | }, |
|
604 | 631 | { |
|
605 | 632 | "cell_type": "markdown", |
|
633 | "metadata": {}, | |
|
606 | 634 | "source": [ |
|
607 | 635 | "Once the array data has been passed to R, modifring its contents does not modify R's copy of the data." |
|
608 | 636 | ] |
@@ -611,16 +639,16 b'' | |||
|
611 | 639 | "cell_type": "code", |
|
612 | 640 | "collapsed": false, |
|
613 | 641 | "input": [ |
|
614 | "seq1[0] = 200", | |
|
642 | "seq1[0] = 200\n", | |
|
615 | 643 | "%R print(seq1)" |
|
616 | 644 | ], |
|
617 | 645 | "language": "python", |
|
646 | "metadata": {}, | |
|
618 | 647 | "outputs": [ |
|
619 | 648 | { |
|
620 | 649 | "output_type": "display_data", |
|
621 | 650 | "text": [ |
|
622 |
" [1] 0 1 2 3 4 5 6 7 8 9" |
|
|
623 | "" | |
|
651 | " [1] 0 1 2 3 4 5 6 7 8 9\n" | |
|
624 | 652 | ] |
|
625 | 653 | } |
|
626 | 654 | ], |
@@ -628,8 +656,9 b'' | |||
|
628 | 656 | }, |
|
629 | 657 | { |
|
630 | 658 | "cell_type": "markdown", |
|
659 | "metadata": {}, | |
|
631 | 660 | "source": [ |
|
632 | "But, if we pass data as both input and output, then the value of \"data\" in user_ns will be overwritten and the", | |
|
661 | "But, if we pass data as both input and output, then the value of \"data\" in user_ns will be overwritten and the\n", | |
|
633 | 662 | "new array will be a view of the data in R's copy." |
|
634 | 663 | ] |
|
635 | 664 | }, |
@@ -637,30 +666,29 b'' | |||
|
637 | 666 | "cell_type": "code", |
|
638 | 667 | "collapsed": false, |
|
639 | 668 | "input": [ |
|
640 | "print seq1", | |
|
641 | "%R -i seq1 -o seq1", | |
|
642 | "print seq1", | |
|
643 | "seq1[0] = 200", | |
|
644 | "%R print(seq1)", | |
|
645 | "seq1_view = %R seq1", | |
|
669 | "print seq1\n", | |
|
670 | "%R -i seq1 -o seq1\n", | |
|
671 | "print seq1\n", | |
|
672 | "seq1[0] = 200\n", | |
|
673 | "%R print(seq1)\n", | |
|
674 | "seq1_view = %R seq1\n", | |
|
646 | 675 | "assert(id(seq1_view.data) == id(seq1.data))" |
|
647 | 676 | ], |
|
648 | 677 | "language": "python", |
|
678 | "metadata": {}, | |
|
649 | 679 | "outputs": [ |
|
650 | 680 | { |
|
651 | 681 | "output_type": "stream", |
|
652 | 682 | "stream": "stdout", |
|
653 | 683 | "text": [ |
|
654 | "[200 1 2 3 4 5 6 7 8 9]", | |
|
655 |
"[200 1 2 3 4 5 6 7 8 9]" |
|
|
656 | "" | |
|
684 | "[200 1 2 3 4 5 6 7 8 9]\n", | |
|
685 | "[200 1 2 3 4 5 6 7 8 9]\n" | |
|
657 | 686 | ] |
|
658 | 687 | }, |
|
659 | 688 | { |
|
660 | 689 | "output_type": "display_data", |
|
661 | 690 | "text": [ |
|
662 |
" [1] 200 1 2 3 4 5 6 7 8 9" |
|
|
663 | "" | |
|
691 | " [1] 200 1 2 3 4 5 6 7 8 9\n" | |
|
664 | 692 | ] |
|
665 | 693 | } |
|
666 | 694 | ], |
@@ -669,13 +697,14 b'' | |||
|
669 | 697 | { |
|
670 | 698 | "cell_type": "heading", |
|
671 | 699 | "level": 2, |
|
700 | "metadata": {}, | |
|
672 | 701 | "source": [ |
|
673 |
"Exception handling" |
|
|
674 | "" | |
|
702 | "Exception handling\n" | |
|
675 | 703 | ] |
|
676 | 704 | }, |
|
677 | 705 | { |
|
678 | 706 | "cell_type": "markdown", |
|
707 | "metadata": {}, | |
|
679 | 708 | "source": [ |
|
680 | 709 | "Exceptions are handled by passing back rpy2's exception and the line that triggered it." |
|
681 | 710 | ] |
@@ -684,25 +713,25 b'' | |||
|
684 | 713 | "cell_type": "code", |
|
685 | 714 | "collapsed": false, |
|
686 | 715 | "input": [ |
|
687 | "try:", | |
|
688 | " %R -n nosuchvar", | |
|
689 | "except Exception as e:", | |
|
690 | " print e.message", | |
|
716 | "try:\n", | |
|
717 | " %R -n nosuchvar\n", | |
|
718 | "except Exception as e:\n", | |
|
719 | " print e.message\n", | |
|
691 | 720 | " pass" |
|
692 | 721 | ], |
|
693 | 722 | "language": "python", |
|
723 | "metadata": {}, | |
|
694 | 724 | "outputs": [ |
|
695 | 725 | { |
|
696 | 726 | "output_type": "stream", |
|
697 | 727 | "stream": "stdout", |
|
698 | 728 | "text": [ |
|
699 | "parsing and evaluating line \"nosuchvar\".", | |
|
700 | "R error message: \"Error in eval(expr, envir, enclos) : object 'nosuchvar' not found", | |
|
701 | "\"", | |
|
702 | " R stdout:\"Error in eval(expr, envir, enclos) : object 'nosuchvar' not found", | |
|
703 | "\"", | |
|
704 |
"" |
|
|
705 | "" | |
|
729 | "parsing and evaluating line \"nosuchvar\".\n", | |
|
730 | "R error message: \"Error in eval(expr, envir, enclos) : object 'nosuchvar' not found\n", | |
|
731 | "\"\n", | |
|
732 | " R stdout:\"Error in eval(expr, envir, enclos) : object 'nosuchvar' not found\n", | |
|
733 | "\"\n", | |
|
734 | "\n" | |
|
706 | 735 | ] |
|
707 | 736 | } |
|
708 | 737 | ], |
@@ -711,13 +740,14 b'' | |||
|
711 | 740 | { |
|
712 | 741 | "cell_type": "heading", |
|
713 | 742 | "level": 2, |
|
743 | "metadata": {}, | |
|
714 | 744 | "source": [ |
|
715 |
"Structured arrays and data frames" |
|
|
716 | "" | |
|
745 | "Structured arrays and data frames\n" | |
|
717 | 746 | ] |
|
718 | 747 | }, |
|
719 | 748 | { |
|
720 | 749 | "cell_type": "markdown", |
|
750 | "metadata": {}, | |
|
721 | 751 | "source": [ |
|
722 | 752 | "In R, data frames play an important role as they allow array-like objects of mixed type with column names (and row names). In bumpy, the closest analogy is a structured array with named fields. In future work, it would be nice to use pandas to return full-fledged DataFrames from rpy2. In the mean time, structured arrays can be passed back and forth with the -d flag to %R, %Rpull, and %Rget" |
|
723 | 753 | ] |
@@ -726,11 +756,11 b'' | |||
|
726 | 756 | "cell_type": "code", |
|
727 | 757 | "collapsed": true, |
|
728 | 758 | "input": [ |
|
729 | "datapy= np.array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c')],", | |
|
730 |
" dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])" |
|
|
731 | "" | |
|
759 | "datapy= np.array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c')],\n", | |
|
760 | " dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])\n" | |
|
732 | 761 | ], |
|
733 | 762 | "language": "python", |
|
763 | "metadata": {}, | |
|
734 | 764 | "outputs": [], |
|
735 | 765 | "prompt_number": 24 |
|
736 | 766 | }, |
@@ -738,10 +768,11 b'' | |||
|
738 | 768 | "cell_type": "code", |
|
739 | 769 | "collapsed": true, |
|
740 | 770 | "input": [ |
|
741 | "%%R -i datapy -d datar", | |
|
771 | "%%R -i datapy -d datar\n", | |
|
742 | 772 | "datar = datapy" |
|
743 | 773 | ], |
|
744 | 774 | "language": "python", |
|
775 | "metadata": {}, | |
|
745 | 776 | "outputs": [], |
|
746 | 777 | "prompt_number": 25 |
|
747 | 778 | }, |
@@ -752,12 +783,13 b'' | |||
|
752 | 783 | "datar" |
|
753 | 784 | ], |
|
754 | 785 | "language": "python", |
|
786 | "metadata": {}, | |
|
755 | 787 | "outputs": [ |
|
756 | 788 | { |
|
757 | 789 | "output_type": "pyout", |
|
758 | 790 | "prompt_number": 26, |
|
759 | 791 | "text": [ |
|
760 | "array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c')], ", | |
|
792 | "array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c')], \n", | |
|
761 | 793 | " dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])" |
|
762 | 794 | ] |
|
763 | 795 | } |
@@ -768,17 +800,18 b'' | |||
|
768 | 800 | "cell_type": "code", |
|
769 | 801 | "collapsed": false, |
|
770 | 802 | "input": [ |
|
771 | "%R datar2 = datapy", | |
|
772 | "%Rpull -d datar2", | |
|
803 | "%R datar2 = datapy\n", | |
|
804 | "%Rpull -d datar2\n", | |
|
773 | 805 | "datar2" |
|
774 | 806 | ], |
|
775 | 807 | "language": "python", |
|
808 | "metadata": {}, | |
|
776 | 809 | "outputs": [ |
|
777 | 810 | { |
|
778 | 811 | "output_type": "pyout", |
|
779 | 812 | "prompt_number": 27, |
|
780 | 813 | "text": [ |
|
781 | "array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c')], ", | |
|
814 | "array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c')], \n", | |
|
782 | 815 | " dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])" |
|
783 | 816 | ] |
|
784 | 817 | } |
@@ -792,12 +825,13 b'' | |||
|
792 | 825 | "%Rget -d datar2" |
|
793 | 826 | ], |
|
794 | 827 | "language": "python", |
|
828 | "metadata": {}, | |
|
795 | 829 | "outputs": [ |
|
796 | 830 | { |
|
797 | 831 | "output_type": "pyout", |
|
798 | 832 | "prompt_number": 28, |
|
799 | 833 | "text": [ |
|
800 | "array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c')], ", | |
|
834 | "array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c')], \n", | |
|
801 | 835 | " dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])" |
|
802 | 836 | ] |
|
803 | 837 | } |
@@ -806,6 +840,7 b'' | |||
|
806 | 840 | }, |
|
807 | 841 | { |
|
808 | 842 | "cell_type": "markdown", |
|
843 | "metadata": {}, | |
|
809 | 844 | "source": [ |
|
810 | 845 | "For arrays without names, the -d argument has no effect because the R object has no colnames or names." |
|
811 | 846 | ] |
@@ -814,11 +849,12 b'' | |||
|
814 | 849 | "cell_type": "code", |
|
815 | 850 | "collapsed": false, |
|
816 | 851 | "input": [ |
|
817 | "Z = np.arange(6)", | |
|
818 | "%R -i Z", | |
|
852 | "Z = np.arange(6)\n", | |
|
853 | "%R -i Z\n", | |
|
819 | 854 | "%Rget -d Z" |
|
820 | 855 | ], |
|
821 | 856 | "language": "python", |
|
857 | "metadata": {}, | |
|
822 | 858 | "outputs": [ |
|
823 | 859 | { |
|
824 | 860 | "output_type": "pyout", |
@@ -832,8 +868,9 b'' | |||
|
832 | 868 | }, |
|
833 | 869 | { |
|
834 | 870 | "cell_type": "markdown", |
|
871 | "metadata": {}, | |
|
835 | 872 | "source": [ |
|
836 | "For mixed-type data frames in R, if the -d flag is not used, then an array of a single type is returned and", | |
|
873 | "For mixed-type data frames in R, if the -d flag is not used, then an array of a single type is returned and\n", | |
|
837 | 874 | "its value is transposed. This would be nice to fix, but it seems something that should be fixed at the rpy2 level (See: https://bitbucket.org/lgautier/rpy2/issue/44/numpyrecarray-as-dataframe)" |
|
838 | 875 | ] |
|
839 | 876 | }, |
@@ -844,14 +881,15 b'' | |||
|
844 | 881 | "%Rget datar2" |
|
845 | 882 | ], |
|
846 | 883 | "language": "python", |
|
884 | "metadata": {}, | |
|
847 | 885 | "outputs": [ |
|
848 | 886 | { |
|
849 | 887 | "output_type": "pyout", |
|
850 | 888 | "prompt_number": 30, |
|
851 | 889 | "text": [ |
|
852 | "array([['1', '2', '3'],", | |
|
853 | " ['2', '3', '2'],", | |
|
854 | " ['a', 'b', 'c']], ", | |
|
890 | "array([['1', '2', '3'],\n", | |
|
891 | " ['2', '3', '2'],\n", | |
|
892 | " ['a', 'b', 'c']], \n", | |
|
855 | 893 | " dtype='|S1')" |
|
856 | 894 | ] |
|
857 | 895 | } |
@@ -861,14 +899,14 b'' | |||
|
861 | 899 | { |
|
862 | 900 | "cell_type": "code", |
|
863 | 901 | "collapsed": true, |
|
864 | "input": [ | |
|
865 | "" | |
|
866 | ], | |
|
902 | "input": [], | |
|
867 | 903 | "language": "python", |
|
904 | "metadata": {}, | |
|
868 | 905 | "outputs": [], |
|
869 | 906 | "prompt_number": 30 |
|
870 | 907 | } |
|
871 | ] | |
|
908 | ], | |
|
909 | "metadata": {} | |
|
872 | 910 | } |
|
873 | 911 | ] |
|
874 | 912 | } No newline at end of file |
@@ -3,18 +3,20 b'' | |||
|
3 | 3 | "name": "sympy" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "markdown", |
|
12 | "metadata": {}, | |
|
11 | 13 | "source": [ |
|
12 | "# SymPy: Open Source Symbolic Mathematics", | |
|
13 | "", | |
|
14 | "This notebook uses the [SymPy](http://sympy.org) package to perform symbolic manipulations,", | |
|
15 | "and combined with numpy and matplotlib, also displays numerical visualizations of symbolically", | |
|
16 | "constructed expressions.", | |
|
17 | "", | |
|
14 | "# SymPy: Open Source Symbolic Mathematics\n", | |
|
15 | "\n", | |
|
16 | "This notebook uses the [SymPy](http://sympy.org) package to perform symbolic manipulations,\n", | |
|
17 | "and combined with numpy and matplotlib, also displays numerical visualizations of symbolically\n", | |
|
18 | "constructed expressions.\n", | |
|
19 | "\n", | |
|
18 | 20 | "We first load sympy printing and plotting support, as well as all of sympy:" |
|
19 | 21 | ] |
|
20 | 22 | }, |
@@ -22,24 +24,25 b'' | |||
|
22 | 24 | "cell_type": "code", |
|
23 | 25 | "collapsed": false, |
|
24 | 26 | "input": [ |
|
25 | "%load_ext sympyprinting", | |
|
26 | "%pylab inline", | |
|
27 | "", | |
|
28 | "from __future__ import division", | |
|
29 | "import sympy as sym", | |
|
30 | "from sympy import *", | |
|
31 | "x, y, z = symbols(\"x y z\")", | |
|
32 | "k, m, n = symbols(\"k m n\", integer=True)", | |
|
27 | "%load_ext sympyprinting\n", | |
|
28 | "%pylab inline\n", | |
|
29 | "\n", | |
|
30 | "from __future__ import division\n", | |
|
31 | "import sympy as sym\n", | |
|
32 | "from sympy import *\n", | |
|
33 | "x, y, z = symbols(\"x y z\")\n", | |
|
34 | "k, m, n = symbols(\"k m n\", integer=True)\n", | |
|
33 | 35 | "f, g, h = map(Function, 'fgh')" |
|
34 | 36 | ], |
|
35 | 37 | "language": "python", |
|
38 | "metadata": {}, | |
|
36 | 39 | "outputs": [ |
|
37 | 40 | { |
|
38 | 41 | "output_type": "stream", |
|
39 | 42 | "stream": "stdout", |
|
40 | 43 | "text": [ |
|
41 | "", | |
|
42 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", | |
|
44 | "\n", | |
|
45 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", | |
|
43 | 46 | "For more information, type 'help(pylab)'." |
|
44 | 47 | ] |
|
45 | 48 | } |
@@ -48,6 +51,7 b'' | |||
|
48 | 51 | }, |
|
49 | 52 | { |
|
50 | 53 | "cell_type": "markdown", |
|
54 | "metadata": {}, | |
|
51 | 55 | "source": [ |
|
52 | 56 | "<h2>Elementary operations</h2>" |
|
53 | 57 | ] |
@@ -59,6 +63,7 b'' | |||
|
59 | 63 | "Rational(3,2)*pi + exp(I*x) / (x**2 + y)" |
|
60 | 64 | ], |
|
61 | 65 | "language": "python", |
|
66 | "metadata": {}, | |
|
62 | 67 | "outputs": [ |
|
63 | 68 | { |
|
64 | 69 | "latex": [ |
@@ -68,11 +73,11 b'' | |||
|
68 | 73 | "png": "iVBORw0KGgoAAAANSUhEUgAAAFAAAAAlCAYAAADV/m7fAAAABHNCSVQICAgIfAhkiAAAA91JREFU\naIHt2luIVVUcx/HPjFNm2YxhZA0hk5HkJbtAWTReioIuUyFRmBZGE12wIoiUHoLpoXsRCRFBDyNS\nPmQWVg9RD0FRD5bagwRpdKUYGro4mSHk9PDfR7cnxzn7nL3P8cj5wmHWOrPP//8/e6/1X7+1/ocW\nNdHW6ADqxDm4AluxDb2Yi2FcjnuwqxrD7al2L27DA3gzcXi0sAun4yechHfRgS9xrypvXjk/YEXS\n7sdfmJiH4SOA47EeZ6BT3LxNYgD11GK4I9W+Bt8m7T8xoRbDRxhTxQA5FXfie/FdF+N3fFet4bFy\n4OvYjserNdxg7sbf+AcnYLAoRx1l/QtwHXbjhaKcFswTYga9gsm4vxFB3IUvMKkOvub5/4Oslqni\n4a/ActwkbmLhzMeQSLIwG6O4qg6+B9WYyFNcj89zslURJRkzjB34Oemfi71iFDYTOxwszY4RGq8w\nvVuaOt/geZEvjsUlWIhfy64/EauwUuipQzGKRfg472Ar4CusxcP4Rciw15KYCiGde96q4PqX8Rtu\nxQ3YLCTAgyJp7xEr36e5RpmNFxvo+7DcgqWp/hsOaMWParA7KL8cWHeyrH7rU+0pyWf/FSv1yXkG\n1UxUKx+W47OkPUuI1vFYKxancqbjIrFoldOvSRay0XFe5WzDhUn7WoyofqUbVNkUHi/GhrxKIzDL\nl18oRs2WpN8pxOpZ+DqDnayMF2M7VmOfSC3PFRjLQU6z8hA+FEFyQDuen0tE1dOHjXhayLCz6+E0\nfQPn4zE8ibfFFutQzMSaVH+zyId7iggwAzOEtCJ07cx6Op+Ml1L9m0Ve66qD70H5yJiJQujD++jO\nwWbFzBO548yk3ymSZF8dfK8R53R5sQCP5GivItrEFC4l6jniBs6qdyA10oVHGx0ErBN742ZjpThA\nmIQrM3zuvjyD6Mczmq9it0wUh4bFMf3cDJ8dyCuIPnEDiafYk5fhnLhUVA6fxY1ixG0UK3AtDIzx\n/gTcgVdFWiO2rft3R2kZswjT8J5I6ktwWo2B5Umn0HbrxGnPKqEcRlS2layGJXhH1FVmJ+9dhh9L\nF5Sm6QxRIy0//u6SU800B44TSmEvnsIfyd+sTBPHb+kU1YtPUv0RUVArybidYjbuFg9tp+atGSGm\nUGkvPiUHewOH+d9SbEj1t4viG6rbyjWKq8XI6RELxFYR/7KC/XaLnQ2hk7vFYQqaq3i+QPzG5RRx\ngHte0t+g9m3kYmMfCg+Jw+R9Qu4MiTJBixSrK7zuA9xeYBxHHXNEzadNSKgtQqjvp5mmcCNoF6v2\ndFwsfldTlGRq0aJFi6bjP9GM0XhICUQDAAAAAElFTkSuQmCC\n", |
|
69 | 74 | "prompt_number": 2, |
|
70 | 75 | "text": [ |
|
71 | "", | |
|
72 | " \u2148\u22c5x ", | |
|
73 | "3\u22c5\u03c0 \u212f ", | |
|
74 | "\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500", | |
|
75 | " 2 2 ", | |
|
76 | "\n", | |
|
77 | " \u2148\u22c5x \n", | |
|
78 | "3\u22c5\u03c0 \u212f \n", | |
|
79 | "\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\n", | |
|
80 | " 2 2 \n", | |
|
76 | 81 | " x + y" |
|
77 | 82 | ] |
|
78 | 83 | } |
@@ -86,6 +91,7 b'' | |||
|
86 | 91 | "exp(I*x).subs(x,pi).evalf()" |
|
87 | 92 | ], |
|
88 | 93 | "language": "python", |
|
94 | "metadata": {}, | |
|
89 | 95 | "outputs": [ |
|
90 | 96 | { |
|
91 | 97 | "latex": [ |
@@ -108,6 +114,7 b'' | |||
|
108 | 114 | "e = x + 2*y" |
|
109 | 115 | ], |
|
110 | 116 | "language": "python", |
|
117 | "metadata": {}, | |
|
111 | 118 | "outputs": [], |
|
112 | 119 | "prompt_number": 5 |
|
113 | 120 | }, |
@@ -118,6 +125,7 b'' | |||
|
118 | 125 | "srepr(e)" |
|
119 | 126 | ], |
|
120 | 127 | "language": "python", |
|
128 | "metadata": {}, | |
|
121 | 129 | "outputs": [ |
|
122 | 130 | { |
|
123 | 131 | "output_type": "pyout", |
@@ -136,6 +144,7 b'' | |||
|
136 | 144 | "exp(pi * sqrt(163)).evalf(50)" |
|
137 | 145 | ], |
|
138 | 146 | "language": "python", |
|
147 | "metadata": {}, | |
|
139 | 148 | "outputs": [ |
|
140 | 149 | { |
|
141 | 150 | "latex": [ |
@@ -153,6 +162,7 b'' | |||
|
153 | 162 | }, |
|
154 | 163 | { |
|
155 | 164 | "cell_type": "markdown", |
|
165 | "metadata": {}, | |
|
156 | 166 | "source": [ |
|
157 | 167 | "<h2>Algebra<h2>" |
|
158 | 168 | ] |
@@ -161,10 +171,11 b'' | |||
|
161 | 171 | "cell_type": "code", |
|
162 | 172 | "collapsed": false, |
|
163 | 173 | "input": [ |
|
164 | "eq = ((x+y)**2 * (x+1))", | |
|
174 | "eq = ((x+y)**2 * (x+1))\n", | |
|
165 | 175 | "eq" |
|
166 | 176 | ], |
|
167 | 177 | "language": "python", |
|
178 | "metadata": {}, | |
|
168 | 179 | "outputs": [ |
|
169 | 180 | { |
|
170 | 181 | "latex": [ |
@@ -174,8 +185,8 b'' | |||
|
174 | 185 | "png": "iVBORw0KGgoAAAANSUhEUgAAAHQAAAAbCAYAAACtOKuoAAAABHNCSVQICAgIfAhkiAAAA/tJREFU\naIHt2luoVFUcx/GPZp7Ek0bUKcrsImVmnlMhSUFmUhbhSxASkUQJBV3einrq9tCN0tDEkB4mouuT\nLxldKC0sDOqhyEq7GEFlGBVGZlb28N+Hs9yz9zkz4+wzh858YZi9Lnvt/3+tvX7rv9YMXf5XTOi0\nAV1aYgGuxGTMwT34uKMWdWmZXqxN0suwB9M7Y06XQ6Uf/2JWlp6GA1jaMYu6HBIThOQOLpdzxYDO\nGe6mS3FEtXY1zQx8WZDfI+wdrzyLxwcTEwsqLMZM/DlaFo3AVCzBW4ZkJmUfFuKc0TRqjLACP+CO\nsgq9eKFiI/oxqcG6c7ABD2KLkJYijsRWwwcGVatOM341wkjKs1QMKEzBKUWV7lf94lore3gD95UN\nKFyD20rKFuPGFp7ZDDWt+TUcDyhWnovFYB6ffa7FBUUNbMNhbTYqT001A9qreC82GqpDNQNapDyn\niW3KgdxnGgdLxDyhx//kGj0LNwgJmI6bhWYfg+NwN75trx8t8buw6Ux8nuTfiecK6nfSrz7cgvlY\nh1eSsltxlZDbPViF5XgyK/9aDPSIXIencnknY6Wh4OllfIrLMmP246amXKluhsImcYKSUqQ6nfbr\nMfES3YX3cmVb8WKSLlOeQtIo91j8liu/HfeKjSxx1LQXb2AXHhKdMVbY7uBOLVOdTvrVjx2iry/B\n90nZVJyHzUleqjwjkg5oj/o3ea2Y9oPMx2vZ9XfiDPHXRh40SuxxsBwNiM7L00m/fsIzOFEoQroc\nXCiWwXdy92wXa+eIpGvobvWR0jfJ9ezMiLcbaVgYPVCQPxPn46+CshX4sMH2izgdnyTpItWhs379\nmH0vE7NvY1LvIjEO23L355WnlHRAd+KMYeouzoxNNX8Wviqpf31Jfg33Zc9rN7NF0DBIkerk6ZRf\nl4uXaF+StxDvqo8V8spTSiq5W3CCoQ7oEdIzL0tfIaLHP7J0r/J9XyeYJNaa95O83WLWpowVv07C\nFzm7FqiXW8KHXY00mg7oXvHGnJ2lF4mDhlk4V0z5v7OyyaJTnmjkIW3i6Oy7r6R8rlgH9yd5O9Wr\nziJjw6/PhEwPsk6cZG0uqJtXnoYZwKvZ9VFiwV4jDn8Px2qsxyOiM1qhpvHwvk84uMPQBvoXfCC2\nWSkb1f/iMEWsoansjgW/iBn6Jp4WivC6CMTy5+uT8HNmZ0usFAt2VdS0/0RlmdjbFbFBcRDTbmpa\n92uiCJZWFZQN4PkW20X8zvaweLurYLU4f2wXPXhU+d9pUtWpkmb8WoOPkvRyERzNKKhbpDzjnqpV\np1l2iogYThVHjEsK6g2nPOOaqlWnWa7GS+J8dr3iX1RGUp4uXbp06dKlSxv5DwKJ3tRzwoGmAAAA\nAElFTkSuQmCC\n", |
|
175 | 186 | "prompt_number": 8, |
|
176 | 187 | "text": [ |
|
177 | "", | |
|
178 | " 2", | |
|
188 | "\n", | |
|
189 | " 2\n", | |
|
179 | 190 | "(x + 1)\u22c5(x + y) " |
|
180 | 191 | ] |
|
181 | 192 | } |
@@ -189,6 +200,7 b'' | |||
|
189 | 200 | "expand(eq)" |
|
190 | 201 | ], |
|
191 | 202 | "language": "python", |
|
203 | "metadata": {}, | |
|
192 | 204 | "outputs": [ |
|
193 | 205 | { |
|
194 | 206 | "latex": [ |
@@ -198,8 +210,8 b'' | |||
|
198 | 210 | "png": "iVBORw0KGgoAAAANSUhEUgAAAQ0AAAAbCAYAAABm6to6AAAABHNCSVQICAgIfAhkiAAABQhJREFU\neJzt3FmoVVUcx/GPF/FaWiY0SINlBqKWUUiiZNpgSPgimFA+lAhFgw9BUBBNZBSNRlRQQTuKiqDh\nQUMwaCACi6KBJposIpKCBqPRtIe1Lx5P9+reZ+199jnd9YXL2Wutff7r//uv5Tp7DVsSiUSiBGM6\n/N6pmIbJWIQH8GJVTjXAPJyDcZiJ6/Beox7FkfQkYqgl3l/jgvx6DX7FYKzRhpiI+1rSK7Edk5px\nJ5qkJxFDbfE+HhPy6xX4Xf8OGnOwE9Pz9IHYhWWNeRRH0pOIoSvxfgLXVGmwy4wRHseGpmqzhSDN\nbMyjOJKeRAy1xvtkXI+HsH8VBkswCxuxGW9gvbC+UgWP4c6KbPUCSU88dfa3XqeWeF+Et7Bf1YZH\nYAZew9Q8PRnv53+HR9peg9t0vkDcayQ98dTZ33qdyuI9D9uE3RPCKLwLSyNszsHYgvc+hwVteQty\nH+6J8GGZECTCAHhMhK2ilNFdlir11OlnUZrSU1d/q5I62qfSfw/ThZF3aOHzPPyJQyJsZiWc2oaP\ncUBL3lj8gQ86rH+REKAp+d/5mN+hrTJk6hmcqtaT6c4gOhJN6qmjv1VNptr22Wu8OxmdPhfmOGuF\nfdz5OA3fx3pakM9wkrB7sz3P26HzgetYbBC2mlrp1y29pKdaqu5vvc4+490+aMzCauEpYhIuxpU4\nGIfhanwlPLI1xSJB0E8teVOFraENbfcW0fOFPX9F9sWhuBRzhUNtG1vKLsNynFXCXhnq0FMHRftR\n0Vg2qafq/lZGdx0UqbtwvI/GXRjI008Lj19L8gr+FhY96yAT93h1K/6x59yzLj13CB3iKrzeVrYF\nT5WwlSmuu1/ap4yfVcayDJlm+1vVujPF9UTXPdByvVbYQt2Zp8cJh7Y2C/O6W4RA9BrH4XKss2cQ\n6tAzB5/iZ5yOb1vKJgjb0K+UtFmUfmmfon42GcsYYvtbk7orr3taW/ob3BzhYBkynY384/GmsC3U\nTh16puR1HiH80ixvKVsirKjPLmEvU1x3v7RPUT+rjmUZMs31tzp0Z4rpqaTu1jWNL1uuZ+SGXyrg\nSBkexYnD5E/FKfhrmLI1wjmQdsbgEWzCtcOU16Hnu/xzpfC+zQstZQvxAz4c5ntV6O6X9inqZ6ex\nLEMv9rcY3bF6ao35JcLqcOtJz+kj3FsFmfIj/zr/bbwLR7i3aj2b8Hxb3st4tqSdTGe/eP3QPhTz\ns6pYliHTfH+rUnemnJ6ouofWNAaF119PyNNLhb3p3/L0RGEe1yusFuaON7XlL8w/69ZzFD5pSQ8K\nh95ejbC5N/qlfTrxs9ux7IQ6+luTuqPqHpqeLMaNwjvzY4VRa0deNk4IyPpoV6vhDNwujJaPt+QP\n2r0ItVi9ej6y+1gxYetqvPoWsBbrj/ZZrLyf3Y5lWerqb03qjqp7aNDYIryteqYwL5orHOB6ED/i\nSWF/uRd4Bgdh1TBl6/LPuvVcIcxvH8Y7OFJYkX43wube6Jf26cTPbseyLHX1tyZ193rMC5Fp9phy\nDAPCAtPdHXw30x+6M93xMyaWZcj0VtxjdWc611O67oF939IVfhHO8vcD9+LtlvQq4c3HTl4f7hfd\ndflZZSzL0HTcq9ZdRk9TMR/VbMUN+fU04bHz7Kac6XO2Gp2x3Ko53dF1/1/+n4VusgLnCi/ojcP9\nwrwwUZ7RGssmdY/WmCcSiUQikUgkEolEIpEY5fwLmrvyxplDsPoAAAAASUVORK5CYII=\n", |
|
199 | 211 | "prompt_number": 9, |
|
200 | 212 | "text": [ |
|
201 | "", | |
|
202 | " 3 2 2 2 2", | |
|
213 | "\n", | |
|
214 | " 3 2 2 2 2\n", | |
|
203 | 215 | "x + 2\u22c5x \u22c5y + x + x\u22c5y + 2\u22c5x\u22c5y + y " |
|
204 | 216 | ] |
|
205 | 217 | } |
@@ -210,10 +222,11 b'' | |||
|
210 | 222 | "cell_type": "code", |
|
211 | 223 | "collapsed": false, |
|
212 | 224 | "input": [ |
|
213 | "a = 1/x + (x*sin(x) - 1)/x", | |
|
225 | "a = 1/x + (x*sin(x) - 1)/x\n", | |
|
214 | 226 | "a" |
|
215 | 227 | ], |
|
216 | 228 | "language": "python", |
|
229 | "metadata": {}, | |
|
217 | 230 | "outputs": [ |
|
218 | 231 | { |
|
219 | 232 | "latex": [ |
@@ -223,9 +236,9 b'' | |||
|
223 | 236 | "png": "iVBORw0KGgoAAAANSUhEUgAAAFwAAAAbCAYAAADxsuiMAAAABHNCSVQICAgIfAhkiAAAAolJREFU\naIHt2duLjVEYx/HPMONYaHIYFyYkF3KYQkiKuEEyLgwhh5kQV3Io/4C4JbmR2pMLKTXiSiTlAiHl\nmEPKFSlFKUY0LtaavGl2+52xZ+/X3vtbb3u9z177+a3D8z5rvWtT479kLh6XuxF/MQ7X0Zwl3foi\nibzE+iL5Kga7MR6rMKQKdDNDD6ZmSTcZ4UsxXUgPd9GElTiMt1iHKfiIblwVZnEnFuMknqERezEf\nxzAz/m4yDkWtmXiVQndk9FlxjEFHLG/AvVjuFAZgOB5E2wRcSdSdiPPYGG17MAyvsSnh/0ssNwiP\nXBrdSVjyD/3KbIT/EAYNFqErlnck6o3FE1xDe7TfQB1WCAMNF4RJGY6L0Tbfn0hdlCgX0oU1uIP9\nwpOQj/sJvWIyF8/xcxB8g4dYGMvjEvaRaMVtHE/Y9+E0RgvRC9uRS9Q5g4PCpG3V92KdT7e9j7pp\nKUaE5wbgI69u70q6Ggdipdl4FL/bImxv3uMXLuMc3iR8bBNSQFsUIuTgm4k6bULkb8ZnIV0U0u2l\nQQUxNH4uwxwhH99CS7y/JCyS9ZgmDH4jziZ8zBAi9yneRdsRnMDXeD8LI4R14Hn0/baA7reo24wX\n/ezXDmEiW2K7m4QFeSC0xrZ9LrFuUVmbst5yjBrEdqQhpzwLb9WSU8QBr8q3oXJSV+4GZIhOzOvD\n3owPwhb2bzqE3VW/6amyqz/kpEspqbR798O1SP93Uo1hLYeXmGIdz6al0AHZ/06m+lfooCqr5KTL\n4Znr3wjhFJHwFnq0HI0YAKekG7BM9y/fQVWlkIn+JQ+quoX1Y4hw7FoJpOpfKbeDu7BA+GOiHt/j\n1YVPJWzHYFHp/atRo0aNquc3S/HNyBXE+1kAAAAASUVORK5CYII=\n", |
|
224 | 237 | "prompt_number": 10, |
|
225 | 238 | "text": [ |
|
226 | "", | |
|
227 | "x\u22c5sin(x) - 1 1", | |
|
228 | "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500", | |
|
239 | "\n", | |
|
240 | "x\u22c5sin(x) - 1 1\n", | |
|
241 | "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\n", | |
|
229 | 242 | " x x" |
|
230 | 243 | ] |
|
231 | 244 | } |
@@ -239,6 +252,7 b'' | |||
|
239 | 252 | "simplify(a)" |
|
240 | 253 | ], |
|
241 | 254 | "language": "python", |
|
255 | "metadata": {}, | |
|
242 | 256 | "outputs": [ |
|
243 | 257 | { |
|
244 | 258 | "latex": [ |
@@ -258,10 +272,11 b'' | |||
|
258 | 272 | "cell_type": "code", |
|
259 | 273 | "collapsed": false, |
|
260 | 274 | "input": [ |
|
261 | "eq = Eq(x**3 + 2*x**2 + 4*x + 8, 0)", | |
|
275 | "eq = Eq(x**3 + 2*x**2 + 4*x + 8, 0)\n", | |
|
262 | 276 | "eq" |
|
263 | 277 | ], |
|
264 | 278 | "language": "python", |
|
279 | "metadata": {}, | |
|
265 | 280 | "outputs": [ |
|
266 | 281 | { |
|
267 | 282 | "latex": [ |
@@ -271,8 +286,8 b'' | |||
|
271 | 286 | "png": "iVBORw0KGgoAAAANSUhEUgAAALIAAAAZCAYAAACVUXRFAAAABHNCSVQICAgIfAhkiAAABSRJREFU\neJzt2nnsHVMUwPHPrz+UtlpNiKK6KJFaSkQsjajtD0sliFRCE0uF8I9dbN2oiCKI0NhfEZTYUoJY\n/7DE9gciSC2xhFhraS1Ff/44M/p+09f2zXtvOn0y32QyM3fu3HvOzJ1zzzl3qKj4H9DT4n37YCyG\nYxLm4dlOCVUCe+JQbIDxmIF3SpWoYq3wOY5PjqdhCQaWJ05bDMGNdedT8CuGlSNOxdpkJwxOjo/G\n77p3IE/AcoxLzoeiD5NLk6iiFO7FxWUL0QY9wrVI3awdxUAeX5pEFblp1UeG3XA4RuIM/NYRiZpj\nB1wlfNpheAWzsbgDbd+Nb3FOB9pqlXOxPq4oUYZGDMcF6BXPvRcz8UXB/Y4U7/tr/CyezbX4oZOd\nnIK3sFEnG10N2+MljErOh+PdZNuyzbanYa72PvB2GY2lmFWiDI3YBAuwRV3ZBLwnBlpR9OIjMc5S\n5uBpDGin4T3xjchaENaxDwe30eYErNdk3UcwMVM2MZHh+jZkmCwGMvFRjmmjrTz6ZLlF6DKrjf6b\nJY+cU3FJg/K5OLtjEq3McfjTipgMthPP6KS0oJUR/T0W4avkfBcsE1a5Vc7W/Fc9EXdg47qy14Wy\nB7XY/yRsjicwAkfqb3nykkefeo7C8230m5c8cu4mMlXZoP4fxWZ4zsPLYpZKWYRPdCAgP1L4cRdh\nobDS7VDTvAV8WfjjIzLlPwvfNi/biHRbX2Yb2kJbKTX5LfoQ3JYcry2LXNO8nFOEXAuEOweDhEtX\nVGC8nsgo3dzg2tP4sb5iPTvgRPHVDcOpYsBuKizWBfhMTO9lMUm89J/qykaJgfd4pm4z+nyiv3Uv\niwutObhr9v0UwaNi0WsK9sX5OEYExe8X1OfmIl5Z0uDaUvFBDcSf9QN5NE4WD2Y5HhDuwpkiG/Aq\nXhA+XJn8rf8ghtOFzPUDoVv0gV3Fy/p4NXXK1mcZjsCDOAR3CVfs7dXcc4dwSfJwJl5MjtNZd2mD\nemnZJiJm+4+r9bdMj+LN5HhrXJrcVAQ1rQdX24pBMDtT3i36DMB8kUpMaeRaFKFPTb7nfqxYBT1M\nzGR9yb6orMVOVu1m3Z9c2yx7YWzm/Etc3mnJVkFNawN5Q7whIucs3aLPadg/U9bo5RWhT03zcp4g\nLHDKYJHLXS7y+EWwvgjiZzW4tlDMEj3095E/rTveHluJqaqTzBdZjiyjsEciWJZpGmdEenAnnsL0\nBte7QZ8Rwu+d10Rf7ejTied+qlj4SlmKs/AhbhKW8bsm5WmWv/CBFcFlPUNEcN+3ugZOE1/CoLqy\ncauo2wlq8lvkOVYewCesou66qs9UPCPchHR7QrycD5Lzoxrc1yl9mpVzsLC8jVyXHvxi5RkDbhXu\nT55tUqaNu/FwpqxXxElPZjscKH5d3Dk5f0x/J36ImEaKoibfQD5R+IRZbk/23aZPPWOs7FoUpU9N\n83K+Ln5JyLK3WN0rinPFUnT9yvFe4hkdmBakrsV+Ilh6JykbI7IDRBAyA9cVKGweDhDr7k/hnrry\ngcJq0F36ZBma2bNu6HOZiEUWidmCCPJmiExDUdwulqdPxg1J2Ul4Dc+lldKB/Jr4i+1A4S/tjmtE\nKmcx7lNcfjIvD4kp7rgG1+Yk+27SJ2WosLSp1T1DWLsrRTqqbH0WJn3MFFN7r/Bhp1uRPSmCxWIF\nb7pwVQhXp9HsUDo17f3bsK5R0x361HSHnGukrb+HOsgv+KNsITpIt+jTLXJWVFRUVFRUVFRUVOTk\nX/JnRRiZjdxGAAAAAElFTkSuQmCC\n", |
|
272 | 287 | "prompt_number": 12, |
|
273 | 288 | "text": [ |
|
274 | "", | |
|
275 | " 3 2 ", | |
|
289 | "\n", | |
|
290 | " 3 2 \n", | |
|
276 | 291 | "x + 2\u22c5x + 4\u22c5x + 8 = 0" |
|
277 | 292 | ] |
|
278 | 293 | } |
@@ -286,6 +301,7 b'' | |||
|
286 | 301 | "solve(eq, x)" |
|
287 | 302 | ], |
|
288 | 303 | "language": "python", |
|
304 | "metadata": {}, | |
|
289 | 305 | "outputs": [ |
|
290 | 306 | { |
|
291 | 307 | "output_type": "pyout", |
@@ -301,10 +317,11 b'' | |||
|
301 | 317 | "cell_type": "code", |
|
302 | 318 | "collapsed": false, |
|
303 | 319 | "input": [ |
|
304 | "a, b = symbols('a b')", | |
|
320 | "a, b = symbols('a b')\n", | |
|
305 | 321 | "Sum(6*n**2 + 2**n, (n, a, b))" |
|
306 | 322 | ], |
|
307 | 323 | "language": "python", |
|
324 | "metadata": {}, | |
|
308 | 325 | "outputs": [ |
|
309 | 326 | { |
|
310 | 327 | "latex": [ |
@@ -314,14 +331,14 b'' | |||
|
314 | 331 | "png": "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\nTkSuQmCC\n", |
|
315 | 332 | "prompt_number": 14, |
|
316 | 333 | "text": [ |
|
317 | "", | |
|
318 | " b ", | |
|
319 | " ___ ", | |
|
320 | " \u2572 ", | |
|
321 | " \u2572 \u239b n 2\u239e", | |
|
322 | " \u2571 \u239d2 + 6\u22c5n \u23a0", | |
|
323 | " \u2571 ", | |
|
324 | " \u203e\u203e\u203e ", | |
|
334 | "\n", | |
|
335 | " b \n", | |
|
336 | " ___ \n", | |
|
337 | " \u2572 \n", | |
|
338 | " \u2572 \u239b n 2\u239e\n", | |
|
339 | " \u2571 \u239d2 + 6\u22c5n \u23a0\n", | |
|
340 | " \u2571 \n", | |
|
341 | " \u203e\u203e\u203e \n", | |
|
325 | 342 | "n = a " |
|
326 | 343 | ] |
|
327 | 344 | } |
@@ -330,6 +347,7 b'' | |||
|
330 | 347 | }, |
|
331 | 348 | { |
|
332 | 349 | "cell_type": "markdown", |
|
350 | "metadata": {}, | |
|
333 | 351 | "source": [ |
|
334 | 352 | "<h2>Calculus</h2>" |
|
335 | 353 | ] |
@@ -341,6 +359,7 b'' | |||
|
341 | 359 | "limit((sin(x)-x)/x**3, x, 0)" |
|
342 | 360 | ], |
|
343 | 361 | "language": "python", |
|
362 | "metadata": {}, | |
|
344 | 363 | "outputs": [ |
|
345 | 364 | { |
|
346 | 365 | "latex": [ |
@@ -363,6 +382,7 b'' | |||
|
363 | 382 | "(1/cos(x)).series(x, 0, 6)" |
|
364 | 383 | ], |
|
365 | 384 | "language": "python", |
|
385 | "metadata": {}, | |
|
366 | 386 | "outputs": [ |
|
367 | 387 | { |
|
368 | 388 | "latex": [ |
@@ -372,10 +392,10 b'' | |||
|
372 | 392 | "png": "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\n", |
|
373 | 393 | "prompt_number": 16, |
|
374 | 394 | "text": [ |
|
375 | "", | |
|
376 | " 2 4 ", | |
|
377 | " x 5\u22c5x \u239b 6\u239e", | |
|
378 | "1 + \u2500\u2500 + \u2500\u2500\u2500\u2500 + O\u239dx \u23a0", | |
|
395 | "\n", | |
|
396 | " 2 4 \n", | |
|
397 | " x 5\u22c5x \u239b 6\u239e\n", | |
|
398 | "1 + \u2500\u2500 + \u2500\u2500\u2500\u2500 + O\u239dx \u23a0\n", | |
|
379 | 399 | " 2 24 " |
|
380 | 400 | ] |
|
381 | 401 | } |
@@ -389,6 +409,7 b'' | |||
|
389 | 409 | "diff(cos(x**2)**2 / (1+x), x)" |
|
390 | 410 | ], |
|
391 | 411 | "language": "python", |
|
412 | "metadata": {}, | |
|
392 | 413 | "outputs": [ |
|
393 | 414 | { |
|
394 | 415 | "latex": [ |
@@ -398,12 +419,12 b'' | |||
|
398 | 419 | "png": "iVBORw0KGgoAAAANSUhEUgAAAMIAAAAoCAYAAACsPiXVAAAABHNCSVQICAgIfAhkiAAABhBJREFU\neJzt3G2sHUUZwPEf5YIU29tGpVawpQgCGmluYhAiNMEQJJIgbwGNVktiFAOYkIi8BAgXDKBADMYY\nEpUg1ER5k7dPakT4IGLEaKgxolZFCWCjUahKgWL58OzhbE/PObt7z569d3vm/+XuzszOPM+zZ3Zm\nnpnnkkgk7DHfAjTEGvylRLlFuBj/x6u4MZd3ALbglZpl68ca7ZJ3FIbpkGeNybHJWFiFT5Ys+2Ec\nll3fg8NzeUtweY1yDaJt8o7KMB06jN0mi0pW3mbOx3dKln0HTsmuN+PQXN5/8DROr0+0vrRN3lEZ\npkOHSbNJ7azFBRXKvwFLs+sfYP+e/D3w9RrkGkTb5K2DIh0asUnbRoS1eKJC+ZPx4wrlX8JWrMPD\neKYnf4cYXldXqLMKbZO3Dop0aMQmbesIT+oOe2V4H35bsY1lOA7XDcj/M2Yq1lmWtslbF8N0aMQm\nbesILwklyrKv8BxUYT2+hMU4oU/+ZuF9GAdtk7cuhunQiE2mKjZQhQuxl5175TFiMbMWj2Eljs/K\n/ikrc7LwEmwRP/wHRYc9G0fjq3gW5+C9uEYsiFbhbfh8rr19+sg1TIajM3mvwp5ieO3ln3h7T9pn\nxVfoKWzH3bn0aWwT7r8LhVuvn45NylsXVfVmV92XGq5D22yyEwfiv5jNpU3jU9n1afh5dn2bUIRY\n6DyeXe+HB3LlV2AjzsRnsDf+gI/k6n++R45HxReligxFnCtedIerdTv7KWJeSnTQ/EfgrkzWQTo2\nJW9dVNWb4boPok022YVviEXJbC5tH/HjJYatS/o8NyV+3JvERshbsvSlwgBPi+FuqRja/pp79gPC\naHk24oiKMhTxFd3h9mDxdVmS3b8Ry/ukw334nME6NiFvXcxFb4brPohGbDKONcLpeKhP+ja8nF2f\noOsJWJ4rs10Md1fgKN1pzlZ8XBh1UVbX8T3tnCmG5mW6O+YP4ZCKMhSxCj/Nrj+IXwj/NDEK/rtP\n+mJdL8YgHZuQty7mojfDdR9EIzapuyMswUn4Xp+8Dwl/8Bq8B7/K2v9Ylr9azP1fFT/4W/DH3PPr\nxfB3lhhtejvCWfguPprlw704sYIMReyHv+N/2f0zopN2mBId8tme9Itwu5i6DdNx3PLWRVW9Nyl+\nv4NoxCZ7lny4LFfia/iXmBY9ovs1WCeGuBVZ2kx2fzdeFAacwkHCaG/CN3N1HyK+9r8Ri7MviKGx\n8/V5txg2H8dzWdq2rJ3t+FsJGYq4FjfjH9n977M6Dhfb+kfifvHiZ/AuHJvp9sUSOo5b3rqoqjfF\nug+iLTZ5nRlcmrvvXSPMF51DWKNyGM6ooZ4i2iZvE7TGJovEtGXvXNpC6QiJRCF1rRHOwbd1FzGJ\nRKvIb6gdIdyeZWMUfi18sSvF/PzmekVLjJm5vu/dkjoCc9Zjg3ChddhLeI+exO+E5+CeGtpK1MOo\n731HcZEE4dpKa4REaxjXWaPpnr+JRJOUDf8cG9P4ifDR7siE+BlObVqQxERTJvwzMWaW40cWdjDM\n7s4FYlcbrhcdI1Ej5xfkf1psKu4Q66RJY/ECabcoXDMxIrMly01iRzhRnD6dD1aIM2a9rLPzaYeB\ntC1CrS6OwSdwg9hyPw/fF8EeieqsECc6NzfQVr+p5xZxdil/XLsoXHPiGSWwY7ZkG5M2IlymHg/h\nKFPPKRGV1uE8sZ81KFxzl4cnjZdFsAdxJv7e7HpDT7m3ikVXfvPpWDuHDm4VEVmTzv54oYZ6igJ1\nOqdVr+2Tt12ccCCOZBeFayZy/FIcIaZcYMdsyXonbUT4Vs/9XKeesyXbG2Tf3oOfpZnENcKogR2J\nXcn/+KaF336jCJ29SPxDra3qDxDq5Tm8eS4PTuLUaCXeKTb5LhMHybbhjhrq3iAWaHCTCBy5qYZ6\nFzrLctfzOfVcLUJGE2OmjuCQ3ZE7B6Q3PfUcJEchkzg1GoUvz7cAC5RHhfuU+Zt67msE923dMcuJ\nyWSTcGv+0Ggxxcfpxrj3Y4PoZDMi9nml+AdfsvZvlaZGiXnm/brToLky16nngXaf+OxEIpFIJBKJ\nRCKRSCQWBq8BH7XPIH70GuoAAAAASUVORK5CYII=\n", |
|
399 | 420 | "prompt_number": 17, |
|
400 | 421 | "text": [ |
|
401 | "", | |
|
402 | " 2 ", | |
|
403 | " \u239b 2\u239e \u239b 2\u239e \u239b 2\u239e", | |
|
404 | " 4\u22c5x\u22c5sin\u239dx \u23a0\u22c5cos\u239dx \u23a0 cos \u239dx \u23a0", | |
|
405 | "- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 - \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500", | |
|
406 | " x + 1 2", | |
|
422 | "\n", | |
|
423 | " 2 \n", | |
|
424 | " \u239b 2\u239e \u239b 2\u239e \u239b 2\u239e\n", | |
|
425 | " 4\u22c5x\u22c5sin\u239dx \u23a0\u22c5cos\u239dx \u23a0 cos \u239dx \u23a0\n", | |
|
426 | "- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 - \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", | |
|
427 | " x + 1 2\n", | |
|
407 | 428 | " (x + 1) " |
|
408 | 429 | ] |
|
409 | 430 | } |
@@ -417,6 +438,7 b'' | |||
|
417 | 438 | "integrate(x**2 * cos(x), (x, 0, pi/2))" |
|
418 | 439 | ], |
|
419 | 440 | "language": "python", |
|
441 | "metadata": {}, | |
|
420 | 442 | "outputs": [ |
|
421 | 443 | { |
|
422 | 444 | "latex": [ |
@@ -426,10 +448,10 b'' | |||
|
426 | 448 | "png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAfCAYAAABNjStyAAAABHNCSVQICAgIfAhkiAAAArVJREFU\naIHt2UuojVEUwPHfRd7PgRK6ySNdQgaIcCUjr5HkMUAoQyUDA0oMRPIoAyaOmBmYEGFgIEIkjwgD\nIzGhkLwZ7A+f757rnu/Y373Hdf61u3vvb5+11ll37bXW16FOLho62oAaZBrmozuasA13OtSiyAzE\nBTRGkNUXh1LrpXiDARFk1wTrsQXfMCKCvIn4ilHJun8ie2EE2TVFLIc1CFfyR6oan8huiiC7BeNw\nRrge17Efg4pQVIZYDstyHHsLkGssLvuVRwbhbjKGFqEwQxEOW4vdCiqMpzAjszdD+CIHqpA3Ed1y\nnI/tsIWCw6BXZNngBR6iX2qvG97jfhXySvIZGdNhzYKzhiRjBab/eJjnv/gnnmAy+ghlGD7jAwZH\n0tEejMRpob1I87Ot6BJJUbOQq56n9hqFsnwtko5yrMLRZL4fG1s51w878FKIxnLjK4YlZxsy43Ux\n5v/OLnzRMrdVQkncvHECB4UO/jDWYZ4QTYuS+UzxAig3o/EW26v8fEk8hy3HstT6JLom80uRdPwV\nPXFDKMnVUlJMXzVQqOiE6ncvr4B00p+AIyrvO25jQ2avQcgp57C1AhnHMKnMfiOm4mOZZ2txs0Ib\ns6zE1WTehHdVyonGTi0dtboKOSVtR1hryTs9stzGlGS+QKjouRrTmElujVBpdmT2Z0XUkSZbycqN\nNLOFyL2VrPsL7cOYPEpj9WFzsUe4iidS+z0EJ9YCm3BRqNzwLPk7GY/a25hXWr8W2YirhJL8SX+v\n0Bq0xoPM8964gsU59dQkJfkc1iy8ns0pwJbf6LBGrQ1eC++hlTBAqLQPijOnc7FZyJWX/McRVimL\ncVZ4yW8X/mWHDRU699zd+t/Qte0jNcsSwWkzkzHfrzbmcQfa9c/wVDvksM7AcOzDJ5zXCX8Sq1On\nTp1YfAdxIoFGVphKVAAAAABJRU5ErkJggg==\n", |
|
427 | 449 | "prompt_number": 18, |
|
428 | 450 | "text": [ |
|
429 | "", | |
|
430 | " 2", | |
|
431 | " \u03c0 ", | |
|
432 | "-2 + \u2500\u2500", | |
|
451 | "\n", | |
|
452 | " 2\n", | |
|
453 | " \u03c0 \n", | |
|
454 | "-2 + \u2500\u2500\n", | |
|
433 | 455 | " 4 " |
|
434 | 456 | ] |
|
435 | 457 | } |
@@ -440,11 +462,12 b'' | |||
|
440 | 462 | "cell_type": "code", |
|
441 | 463 | "collapsed": false, |
|
442 | 464 | "input": [ |
|
443 | "eqn = Eq(Derivative(f(x),x,x) + 9*f(x), 1)", | |
|
444 | "display(eqn)", | |
|
465 | "eqn = Eq(Derivative(f(x),x,x) + 9*f(x), 1)\n", | |
|
466 | "display(eqn)\n", | |
|
445 | 467 | "dsolve(eqn, f(x))" |
|
446 | 468 | ], |
|
447 | 469 | "language": "python", |
|
470 | "metadata": {}, | |
|
448 | 471 | "outputs": [ |
|
449 | 472 | { |
|
450 | 473 | "latex": [ |
@@ -453,11 +476,11 b'' | |||
|
453 | 476 | "output_type": "display_data", |
|
454 | 477 | "png": "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\n", |
|
455 | 478 | "text": [ |
|
456 | "", | |
|
457 | " 2 ", | |
|
458 | " d ", | |
|
459 | "9\u22c5f(x) + \u2500\u2500\u2500(f(x)) = 1", | |
|
460 | " 2 ", | |
|
479 | "\n", | |
|
480 | " 2 \n", | |
|
481 | " d \n", | |
|
482 | "9\u22c5f(x) + \u2500\u2500\u2500(f(x)) = 1\n", | |
|
483 | " 2 \n", | |
|
461 | 484 | " dx " |
|
462 | 485 | ] |
|
463 | 486 | }, |
@@ -477,10 +500,11 b'' | |||
|
477 | 500 | }, |
|
478 | 501 | { |
|
479 | 502 | "cell_type": "markdown", |
|
503 | "metadata": {}, | |
|
480 | 504 | "source": [ |
|
481 | "# Illustrating Taylor series", | |
|
482 | "", | |
|
483 | "We will define a function to compute the Taylor series expansions of a symbolically defined expression at", | |
|
505 | "# Illustrating Taylor series\n", | |
|
506 | "\n", | |
|
507 | "We will define a function to compute the Taylor series expansions of a symbolically defined expression at\n", | |
|
484 | 508 | "various orders and visualize all the approximations together with the original function" |
|
485 | 509 | ] |
|
486 | 510 | }, |
@@ -488,11 +512,12 b'' | |||
|
488 | 512 | "cell_type": "code", |
|
489 | 513 | "collapsed": true, |
|
490 | 514 | "input": [ |
|
491 | "# You can change the default figure size to be a bit larger if you want,", | |
|
492 | "# uncomment the next line for that:", | |
|
515 | "# You can change the default figure size to be a bit larger if you want,\n", | |
|
516 | "# uncomment the next line for that:\n", | |
|
493 | 517 | "#plt.rc('figure', figsize=(10, 6))" |
|
494 | 518 | ], |
|
495 | 519 | "language": "python", |
|
520 | "metadata": {}, | |
|
496 | 521 | "outputs": [], |
|
497 | 522 | "prompt_number": 20 |
|
498 | 523 | }, |
@@ -500,68 +525,70 b'' | |||
|
500 | 525 | "cell_type": "code", |
|
501 | 526 | "collapsed": true, |
|
502 | 527 | "input": [ |
|
503 | "def plot_taylor_approximations(func, x0=None, orders=(2, 4), xrange=(0,1), yrange=None, npts=200):", | |
|
504 | " \"\"\"Plot the Taylor series approximations to a function at various orders.", | |
|
505 | "", | |
|
506 | " Parameters", | |
|
507 | " ----------", | |
|
508 | " func : a sympy function", | |
|
509 | " x0 : float", | |
|
510 | " Origin of the Taylor series expansion. If not given, x0=xrange[0].", | |
|
511 | " orders : list", | |
|
512 | " List of integers with the orders of Taylor series to show. Default is (2, 4).", | |
|
513 | " xrange : 2-tuple or array.", | |
|
514 | " Either an (xmin, xmax) tuple indicating the x range for the plot (default is (0, 1)),", | |
|
515 | " or the actual array of values to use.", | |
|
516 | " yrange : 2-tuple", | |
|
517 | " (ymin, ymax) tuple indicating the y range for the plot. If not given,", | |
|
518 | " the full range of values will be automatically used. ", | |
|
519 | " npts : int", | |
|
520 | " Number of points to sample the x range with. Default is 200.", | |
|
521 | " \"\"\"", | |
|
522 | " if not callable(func):", | |
|
523 | " raise ValueError('func must be callable')", | |
|
524 | " if isinstance(xrange, (list, tuple)):", | |
|
525 | " x = np.linspace(float(xrange[0]), float(xrange[1]), npts)", | |
|
526 | " else:", | |
|
527 | " x = xrange", | |
|
528 | " if x0 is None: x0 = x[0]", | |
|
529 | " xs = sym.Symbol('x')", | |
|
530 | " # Make a numpy-callable form of the original function for plotting", | |
|
531 | " fx = func(xs)", | |
|
532 | " f = sym.lambdify(xs, fx, modules=['numpy'])", | |
|
533 | " # We could use latex(fx) instead of str(), but matploblib gets confused", | |
|
534 | " # with some of the (valid) latex constructs sympy emits. So we play it safe.", | |
|
535 | " plot(x, f(x), label=str(fx), lw=2)", | |
|
536 | " # Build the Taylor approximations, plotting as we go", | |
|
537 | " apps = {}", | |
|
538 | " for order in orders:", | |
|
539 | " app = fx.series(xs, x0, n=order).removeO()", | |
|
540 | " apps[order] = app", | |
|
541 | " # Must be careful here: if the approximation is a constant, we can't", | |
|
542 | " # blindly use lambdify as it won't do the right thing. In that case, ", | |
|
543 | " # evaluate the number as a float and fill the y array with that value.", | |
|
544 | " if isinstance(app, sym.numbers.Number):", | |
|
545 | " y = np.zeros_like(x)", | |
|
546 | " y.fill(app.evalf())", | |
|
547 | " else:", | |
|
548 | " fa = sym.lambdify(xs, app, modules=['numpy'])", | |
|
549 | " y = fa(x)", | |
|
550 | " tex = sym.latex(app).replace('$', '')", | |
|
551 | " plot(x, y, label=r'$n=%s:\\, %s$' % (order, tex) )", | |
|
552 | " ", | |
|
553 | " # Plot refinements", | |
|
554 | " if yrange is not None:", | |
|
555 | " plt.ylim(*yrange)", | |
|
556 | " grid()", | |
|
528 | "def plot_taylor_approximations(func, x0=None, orders=(2, 4), xrange=(0,1), yrange=None, npts=200):\n", | |
|
529 | " \"\"\"Plot the Taylor series approximations to a function at various orders.\n", | |
|
530 | "\n", | |
|
531 | " Parameters\n", | |
|
532 | " ----------\n", | |
|
533 | " func : a sympy function\n", | |
|
534 | " x0 : float\n", | |
|
535 | " Origin of the Taylor series expansion. If not given, x0=xrange[0].\n", | |
|
536 | " orders : list\n", | |
|
537 | " List of integers with the orders of Taylor series to show. Default is (2, 4).\n", | |
|
538 | " xrange : 2-tuple or array.\n", | |
|
539 | " Either an (xmin, xmax) tuple indicating the x range for the plot (default is (0, 1)),\n", | |
|
540 | " or the actual array of values to use.\n", | |
|
541 | " yrange : 2-tuple\n", | |
|
542 | " (ymin, ymax) tuple indicating the y range for the plot. If not given,\n", | |
|
543 | " the full range of values will be automatically used. \n", | |
|
544 | " npts : int\n", | |
|
545 | " Number of points to sample the x range with. Default is 200.\n", | |
|
546 | " \"\"\"\n", | |
|
547 | " if not callable(func):\n", | |
|
548 | " raise ValueError('func must be callable')\n", | |
|
549 | " if isinstance(xrange, (list, tuple)):\n", | |
|
550 | " x = np.linspace(float(xrange[0]), float(xrange[1]), npts)\n", | |
|
551 | " else:\n", | |
|
552 | " x = xrange\n", | |
|
553 | " if x0 is None: x0 = x[0]\n", | |
|
554 | " xs = sym.Symbol('x')\n", | |
|
555 | " # Make a numpy-callable form of the original function for plotting\n", | |
|
556 | " fx = func(xs)\n", | |
|
557 | " f = sym.lambdify(xs, fx, modules=['numpy'])\n", | |
|
558 | " # We could use latex(fx) instead of str(), but matploblib gets confused\n", | |
|
559 | " # with some of the (valid) latex constructs sympy emits. So we play it safe.\n", | |
|
560 | " plot(x, f(x), label=str(fx), lw=2)\n", | |
|
561 | " # Build the Taylor approximations, plotting as we go\n", | |
|
562 | " apps = {}\n", | |
|
563 | " for order in orders:\n", | |
|
564 | " app = fx.series(xs, x0, n=order).removeO()\n", | |
|
565 | " apps[order] = app\n", | |
|
566 | " # Must be careful here: if the approximation is a constant, we can't\n", | |
|
567 | " # blindly use lambdify as it won't do the right thing. In that case, \n", | |
|
568 | " # evaluate the number as a float and fill the y array with that value.\n", | |
|
569 | " if isinstance(app, sym.numbers.Number):\n", | |
|
570 | " y = np.zeros_like(x)\n", | |
|
571 | " y.fill(app.evalf())\n", | |
|
572 | " else:\n", | |
|
573 | " fa = sym.lambdify(xs, app, modules=['numpy'])\n", | |
|
574 | " y = fa(x)\n", | |
|
575 | " tex = sym.latex(app).replace('$', '')\n", | |
|
576 | " plot(x, y, label=r'$n=%s:\\, %s$' % (order, tex) )\n", | |
|
577 | " \n", | |
|
578 | " # Plot refinements\n", | |
|
579 | " if yrange is not None:\n", | |
|
580 | " plt.ylim(*yrange)\n", | |
|
581 | " grid()\n", | |
|
557 | 582 | " legend(loc='best').get_frame().set_alpha(0.8)" |
|
558 | 583 | ], |
|
559 | 584 | "language": "python", |
|
585 | "metadata": {}, | |
|
560 | 586 | "outputs": [], |
|
561 | 587 | "prompt_number": 21 |
|
562 | 588 | }, |
|
563 | 589 | { |
|
564 | 590 | "cell_type": "markdown", |
|
591 | "metadata": {}, | |
|
565 | 592 | "source": [ |
|
566 | 593 | "With this function defined, we can now use it for any sympy function or expression" |
|
567 | 594 | ] |
@@ -573,6 +600,7 b'' | |||
|
573 | 600 | "plot_taylor_approximations(sin, 0, [2, 4, 6], (0, 2*pi), (-2,2))" |
|
574 | 601 | ], |
|
575 | 602 | "language": "python", |
|
603 | "metadata": {}, | |
|
576 | 604 | "outputs": [ |
|
577 | 605 | { |
|
578 | 606 | "output_type": "display_data", |
@@ -588,6 +616,7 b'' | |||
|
588 | 616 | "plot_taylor_approximations(cos, 0, [2, 4, 6], (0, 2*pi), (-2,2))" |
|
589 | 617 | ], |
|
590 | 618 | "language": "python", |
|
619 | "metadata": {}, | |
|
591 | 620 | "outputs": [ |
|
592 | 621 | { |
|
593 | 622 | "output_type": "display_data", |
@@ -598,8 +627,9 b'' | |||
|
598 | 627 | }, |
|
599 | 628 | { |
|
600 | 629 | "cell_type": "markdown", |
|
630 | "metadata": {}, | |
|
601 | 631 | "source": [ |
|
602 | "This shows easily how a Taylor series is useless beyond its convergence radius, illustrated by ", | |
|
632 | "This shows easily how a Taylor series is useless beyond its convergence radius, illustrated by \n", | |
|
603 | 633 | "a simple function that has singularities on the real axis:" |
|
604 | 634 | ] |
|
605 | 635 | }, |
@@ -607,11 +637,12 b'' | |||
|
607 | 637 | "cell_type": "code", |
|
608 | 638 | "collapsed": false, |
|
609 | 639 | "input": [ |
|
610 | "# For an expression made from elementary functions, we must first make it into", | |
|
611 | "# a callable function, the simplest way is to use the Python lambda construct.", | |
|
640 | "# For an expression made from elementary functions, we must first make it into\n", | |
|
641 | "# a callable function, the simplest way is to use the Python lambda construct.\n", | |
|
612 | 642 | "plot_taylor_approximations(lambda x: 1/cos(x), 0, [2,4,6], (0, 2*pi), (-5,5))" |
|
613 | 643 | ], |
|
614 | 644 | "language": "python", |
|
645 | "metadata": {}, | |
|
615 | 646 | "outputs": [ |
|
616 | 647 | { |
|
617 | 648 | "output_type": "display_data", |
@@ -620,7 +651,8 b'' | |||
|
620 | 651 | ], |
|
621 | 652 | "prompt_number": 24 |
|
622 | 653 | } |
|
623 | ] | |
|
654 | ], | |
|
655 | "metadata": {} | |
|
624 | 656 | } |
|
625 | 657 | ] |
|
626 | 658 | } No newline at end of file |
@@ -3,15 +3,17 b'' | |||
|
3 | 3 | "name": "sympy_quantum_computing" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "markdown", |
|
12 | "metadata": {}, | |
|
11 | 13 | "source": [ |
|
12 | "# Basic Symbolic Quantum Mechanics with [SymPy](http://sympy.org)", | |
|
13 | "", | |
|
14 | "We first load the IPython extensions that enable LaTeX-based mathematical printing ", | |
|
14 | "# Basic Symbolic Quantum Mechanics with [SymPy](http://sympy.org)\n", | |
|
15 | "\n", | |
|
16 | "We first load the IPython extensions that enable LaTeX-based mathematical printing \n", | |
|
15 | 17 | "of SymPy objects, and then import the quantum computing libraries from SymPy." |
|
16 | 18 | ] |
|
17 | 19 | }, |
@@ -22,6 +24,7 b'' | |||
|
22 | 24 | "%load_ext sympyprinting" |
|
23 | 25 | ], |
|
24 | 26 | "language": "python", |
|
27 | "metadata": {}, | |
|
25 | 28 | "outputs": [], |
|
26 | 29 | "prompt_number": 1 |
|
27 | 30 | }, |
@@ -29,27 +32,30 b'' | |||
|
29 | 32 | "cell_type": "code", |
|
30 | 33 | "collapsed": true, |
|
31 | 34 | "input": [ |
|
32 | "from sympy import sqrt, symbols, Rational", | |
|
33 | "from sympy import expand, Eq, Symbol, simplify, exp, sin", | |
|
34 | "from sympy.physics.quantum import *", | |
|
35 | "from sympy.physics.quantum.qubit import *", | |
|
36 | "from sympy.physics.quantum.gate import *", | |
|
37 | "from sympy.physics.quantum.grover import *", | |
|
38 | "from sympy.physics.quantum.qft import QFT, IQFT, Fourier", | |
|
35 | "from sympy import sqrt, symbols, Rational\n", | |
|
36 | "from sympy import expand, Eq, Symbol, simplify, exp, sin\n", | |
|
37 | "from sympy.physics.quantum import *\n", | |
|
38 | "from sympy.physics.quantum.qubit import *\n", | |
|
39 | "from sympy.physics.quantum.gate import *\n", | |
|
40 | "from sympy.physics.quantum.grover import *\n", | |
|
41 | "from sympy.physics.quantum.qft import QFT, IQFT, Fourier\n", | |
|
39 | 42 | "from sympy.physics.quantum.circuitplot import circuit_plot" |
|
40 | 43 | ], |
|
41 | 44 | "language": "python", |
|
45 | "metadata": {}, | |
|
42 | 46 | "outputs": [], |
|
43 | 47 | "prompt_number": 2 |
|
44 | 48 | }, |
|
45 | 49 | { |
|
46 | 50 | "cell_type": "markdown", |
|
51 | "metadata": {}, | |
|
47 | 52 | "source": [ |
|
48 | 53 | "<h2>Bras and Kets</h2>" |
|
49 | 54 | ] |
|
50 | 55 | }, |
|
51 | 56 | { |
|
52 | 57 | "cell_type": "markdown", |
|
58 | "metadata": {}, | |
|
53 | 59 | "source": [ |
|
54 | 60 | "Create symbolic states" |
|
55 | 61 | ] |
@@ -58,15 +64,17 b'' | |||
|
58 | 64 | "cell_type": "code", |
|
59 | 65 | "collapsed": true, |
|
60 | 66 | "input": [ |
|
61 | "phi, psi = Ket('phi'), Ket('psi')", | |
|
67 | "phi, psi = Ket('phi'), Ket('psi')\n", | |
|
62 | 68 | "alpha, beta = symbols('alpha beta', complex=True)" |
|
63 | 69 | ], |
|
64 | 70 | "language": "python", |
|
71 | "metadata": {}, | |
|
65 | 72 | "outputs": [], |
|
66 | 73 | "prompt_number": 3 |
|
67 | 74 | }, |
|
68 | 75 | { |
|
69 | 76 | "cell_type": "markdown", |
|
77 | "metadata": {}, | |
|
70 | 78 | "source": [ |
|
71 | 79 | "Create a superposition" |
|
72 | 80 | ] |
@@ -78,6 +86,7 b'' | |||
|
78 | 86 | "state = alpha*psi + beta*phi; state" |
|
79 | 87 | ], |
|
80 | 88 | "language": "python", |
|
89 | "metadata": {}, | |
|
81 | 90 | "outputs": [ |
|
82 | 91 | { |
|
83 | 92 | "latex": [ |
@@ -95,6 +104,7 b'' | |||
|
95 | 104 | }, |
|
96 | 105 | { |
|
97 | 106 | "cell_type": "markdown", |
|
107 | "metadata": {}, | |
|
98 | 108 | "source": [ |
|
99 | 109 | "Dagger the superposition and multiply the original" |
|
100 | 110 | ] |
@@ -106,6 +116,7 b'' | |||
|
106 | 116 | "ip = Dagger(state)*state; ip" |
|
107 | 117 | ], |
|
108 | 118 | "language": "python", |
|
119 | "metadata": {}, | |
|
109 | 120 | "outputs": [ |
|
110 | 121 | { |
|
111 | 122 | "latex": [ |
@@ -115,8 +126,8 b'' | |||
|
115 | 126 | "png": "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\nRK5CYII=\n", |
|
116 | 127 | "prompt_number": 5, |
|
117 | 128 | "text": [ |
|
118 | "", | |
|
119 | "\u239b_ _ \u239e ", | |
|
129 | "\n", | |
|
130 | "\u239b_ _ \u239e \n", | |
|
120 | 131 | "\u239d\u03b1\u22c5\u27e8\u03c8\u2758 + \u03b2\u22c5\u27e8\u03c6\u2758\u23a0\u22c5(\u03b1\u22c5\u2758\u03c8\u27e9 + \u03b2\u22c5\u2758\u03c6\u27e9)" |
|
121 | 132 | ] |
|
122 | 133 | } |
@@ -125,6 +136,7 b'' | |||
|
125 | 136 | }, |
|
126 | 137 | { |
|
127 | 138 | "cell_type": "markdown", |
|
139 | "metadata": {}, | |
|
128 | 140 | "source": [ |
|
129 | 141 | "Distribute" |
|
130 | 142 | ] |
@@ -136,6 +148,7 b'' | |||
|
136 | 148 | "qapply(expand(ip))" |
|
137 | 149 | ], |
|
138 | 150 | "language": "python", |
|
151 | "metadata": {}, | |
|
139 | 152 | "outputs": [ |
|
140 | 153 | { |
|
141 | 154 | "latex": [ |
@@ -145,8 +158,8 b'' | |||
|
145 | 158 | "png": "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\ncOsl0kmXAAAAAElFTkSuQmCC\n", |
|
146 | 159 | "prompt_number": 6, |
|
147 | 160 | "text": [ |
|
148 | "", | |
|
149 | " _ _ _ _ ", | |
|
161 | "\n", | |
|
162 | " _ _ _ _ \n", | |
|
150 | 163 | "\u03b1\u22c5\u03b1\u22c5\u27e8\u03c8\u2758\u03c8\u27e9 + \u03b1\u22c5\u03b2\u22c5\u27e8\u03c6\u2758\u03c8\u27e9 + \u03b2\u22c5\u03b1\u22c5\u27e8\u03c8\u2758\u03c6\u27e9 + \u03b2\u22c5\u03b2\u22c5\u27e8\u03c6\u2758\u03c6\u27e9" |
|
151 | 164 | ] |
|
152 | 165 | } |
@@ -155,12 +168,14 b'' | |||
|
155 | 168 | }, |
|
156 | 169 | { |
|
157 | 170 | "cell_type": "markdown", |
|
171 | "metadata": {}, | |
|
158 | 172 | "source": [ |
|
159 | 173 | "<h2>Operators</h2>" |
|
160 | 174 | ] |
|
161 | 175 | }, |
|
162 | 176 | { |
|
163 | 177 | "cell_type": "markdown", |
|
178 | "metadata": {}, | |
|
164 | 179 | "source": [ |
|
165 | 180 | "Create symbolic operators" |
|
166 | 181 | ] |
@@ -169,16 +184,18 b'' | |||
|
169 | 184 | "cell_type": "code", |
|
170 | 185 | "collapsed": true, |
|
171 | 186 | "input": [ |
|
172 | "A = Operator('A')", | |
|
173 | "B = Operator('B')", | |
|
187 | "A = Operator('A')\n", | |
|
188 | "B = Operator('B')\n", | |
|
174 | 189 | "C = Operator('C')" |
|
175 | 190 | ], |
|
176 | 191 | "language": "python", |
|
192 | "metadata": {}, | |
|
177 | 193 | "outputs": [], |
|
178 | 194 | "prompt_number": 7 |
|
179 | 195 | }, |
|
180 | 196 | { |
|
181 | 197 | "cell_type": "markdown", |
|
198 | "metadata": {}, | |
|
182 | 199 | "source": [ |
|
183 | 200 | "Test commutativity" |
|
184 | 201 | ] |
@@ -190,6 +207,7 b'' | |||
|
190 | 207 | "A*B == B*A" |
|
191 | 208 | ], |
|
192 | 209 | "language": "python", |
|
210 | "metadata": {}, | |
|
193 | 211 | "outputs": [ |
|
194 | 212 | { |
|
195 | 213 | "output_type": "pyout", |
@@ -203,6 +221,7 b'' | |||
|
203 | 221 | }, |
|
204 | 222 | { |
|
205 | 223 | "cell_type": "markdown", |
|
224 | "metadata": {}, | |
|
206 | 225 | "source": [ |
|
207 | 226 | "Distribute A+B squared" |
|
208 | 227 | ] |
@@ -214,6 +233,7 b'' | |||
|
214 | 233 | "expand((A+B)**2)" |
|
215 | 234 | ], |
|
216 | 235 | "language": "python", |
|
236 | "metadata": {}, | |
|
217 | 237 | "outputs": [ |
|
218 | 238 | { |
|
219 | 239 | "latex": [ |
@@ -223,8 +243,8 b'' | |||
|
223 | 243 | "png": "iVBORw0KGgoAAAANSUhEUgAAAMAAAAAZCAYAAABn7SHgAAAABHNCSVQICAgIfAhkiAAABHpJREFU\neJztml2IVVUUx39OTlQ20xiJpZZDE4gUBn0YJE3Q10MZfZEvUS9ST+lDhgWFPRgRFaRGT9mwI8ge\nKoqoCCqikl6ysg/SfOlBjKxetLCymh7Wvnjnsvc5e62zj1dv+wfDPffsfc5e//Wf/XH2uVAo/I+Z\n1e8AjlMuA64HTgSWAhuAr/oaUSFG8SozpwLPdn1fBRwETutPOIUKilctsAz4F5jw30eBaWBl3yIq\nxChetcAsZFrtLB/PR5K6tG8RFWLUeqV9BngamUI2VNTZClyK9L4/gE+Bv3zZGcBc4GXgUeCQsn0N\nw8BC4IfE+iFt85EYD1Rc9yKwH1inD7ExbeQ6xePcxLzS6BulZa8uAf4BphLqjiM97YlA2Q2+7A1L\nEInMBh4BTkmsH9M2DDzl7xdiNaKxn5sJ4+TLtcbjXNR5NU6avla9GgLe9429nVD/Tl/3mkj5HiTR\nI4ntLyMuLMQ6f00KddpWEE7+SiSpACcjRlnR6usmV661HsfI7ZVGn9qrocQg7wFeAQ4DZybUn0Sm\nqu2BshFgETIV/ZbY/n3+mhRGgMtJ3+qq07YdGGPmzsGVyPLoLX/NLcBZie2F0OjrJVeutR7HyO2V\nRl8rXs1DRoYhYC+wL+Ga3cDHkbL1SI++WxGDI32EvRW4P7FuqrZ7gbX++FxkjTzd8zea2GYIh30G\nyZFri8cxHHm90urL7tUUMrUA7AD+pnrmmO8b2dhzfsyf2w/cpQkAXVK3IL0+hVRt1wEvJd7TgsPW\nAXLlWutxFY58Xln0qbyqW6utAE7gyPTzk/8+zx+HmPSfE8Dj/ngEWYd97++5JzVAA4uAXxLqabTt\nptkavy1y5NricS7qvLLoy+bVbOATZq6XppAeeWHFdc8AfwInBcoeQ6aka5WxONJFvUv9nrxW2xxg\nV2L7Fhw205rm2upxFY58Xln0qbyqmubWAK8DP3ad64wIVQ9Jk8BnyL5tLxsRMc+nBmjgZ+C8mjpa\nbRP+vscaTXNt9TgXdV5Z9Km8ii2BFiAPJ98xc/tpsf+MJWcMuAB4MlJ+GOnRC5Gp7GBP+QuER55z\ngOUceQnSzWpk3dphF7AEeDMSg0XbEl+/KTn0dWiaa6vHHdr2yqovi1fbgKsC529DpscHItfdSPVv\nLa7w5e8p43GkT6sXA89VlFu0PQzclNi+BYd+CdQ011aP63Dk8cqqT+VVaAl0NfAr8EGgbK//jI0O\nkz6o0J7tMPCQP96aGqCBHcDphH/xZ9E2jIxo7+QKMBNNct3E45xUeWXR19iri5A14NxI+YQPaluk\n/Avg68D5xcCrwO/AHYa4HLoRcjmwqeecVduDwO2Kti049DOANddNPa7D0dwrsOkze7UA+Ab56eg0\n8C2yB9vNa8gLkmnkoeQjZM91FBlJvvRlh5CdhQ/9307gc2Azsqaz4ND/g9yMmN1E29nIi5W2caTp\na5LrJnnQ4LB71UTf0fKqLziOzX34XDgGR5/jONJifdt3tDlAeCtsUBgkfYOkpVAoFAqFQqFQKAwY\n/wF5Fp03jGX3sQAAAABJRU5ErkJggg==\n", |
|
224 | 244 | "prompt_number": 9, |
|
225 | 245 | "text": [ |
|
226 | "", | |
|
227 | " 2 2", | |
|
246 | "\n", | |
|
247 | " 2 2\n", | |
|
228 | 248 | "A\u22c5B + A + B\u22c5A + B " |
|
229 | 249 | ] |
|
230 | 250 | } |
@@ -233,6 +253,7 b'' | |||
|
233 | 253 | }, |
|
234 | 254 | { |
|
235 | 255 | "cell_type": "markdown", |
|
256 | "metadata": {}, | |
|
236 | 257 | "source": [ |
|
237 | 258 | "Create a commutator" |
|
238 | 259 | ] |
@@ -244,6 +265,7 b'' | |||
|
244 | 265 | "comm = Commutator(A,B); comm" |
|
245 | 266 | ], |
|
246 | 267 | "language": "python", |
|
268 | "metadata": {}, | |
|
247 | 269 | "outputs": [ |
|
248 | 270 | { |
|
249 | 271 | "latex": [ |
@@ -261,6 +283,7 b'' | |||
|
261 | 283 | }, |
|
262 | 284 | { |
|
263 | 285 | "cell_type": "markdown", |
|
286 | "metadata": {}, | |
|
264 | 287 | "source": [ |
|
265 | 288 | "Carry out the commutator" |
|
266 | 289 | ] |
@@ -272,6 +295,7 b'' | |||
|
272 | 295 | "comm.doit()" |
|
273 | 296 | ], |
|
274 | 297 | "language": "python", |
|
298 | "metadata": {}, | |
|
275 | 299 | "outputs": [ |
|
276 | 300 | { |
|
277 | 301 | "latex": [ |
@@ -289,6 +313,7 b'' | |||
|
289 | 313 | }, |
|
290 | 314 | { |
|
291 | 315 | "cell_type": "markdown", |
|
316 | "metadata": {}, | |
|
292 | 317 | "source": [ |
|
293 | 318 | "Create a more fancy commutator" |
|
294 | 319 | ] |
@@ -300,6 +325,7 b'' | |||
|
300 | 325 | "comm = Commutator(A*B,B+C); comm" |
|
301 | 326 | ], |
|
302 | 327 | "language": "python", |
|
328 | "metadata": {}, | |
|
303 | 329 | "outputs": [ |
|
304 | 330 | { |
|
305 | 331 | "latex": [ |
@@ -317,6 +343,7 b'' | |||
|
317 | 343 | }, |
|
318 | 344 | { |
|
319 | 345 | "cell_type": "markdown", |
|
346 | "metadata": {}, | |
|
320 | 347 | "source": [ |
|
321 | 348 | "Expand the commutator" |
|
322 | 349 | ] |
@@ -328,6 +355,7 b'' | |||
|
328 | 355 | "comm.expand(commutator=True)" |
|
329 | 356 | ], |
|
330 | 357 | "language": "python", |
|
358 | "metadata": {}, | |
|
331 | 359 | "outputs": [ |
|
332 | 360 | { |
|
333 | 361 | "latex": [ |
@@ -345,6 +373,7 b'' | |||
|
345 | 373 | }, |
|
346 | 374 | { |
|
347 | 375 | "cell_type": "markdown", |
|
376 | "metadata": {}, | |
|
348 | 377 | "source": [ |
|
349 | 378 | "Carry out and expand the commutators" |
|
350 | 379 | ] |
@@ -356,6 +385,7 b'' | |||
|
356 | 385 | "_.doit().expand()" |
|
357 | 386 | ], |
|
358 | 387 | "language": "python", |
|
388 | "metadata": {}, | |
|
359 | 389 | "outputs": [ |
|
360 | 390 | { |
|
361 | 391 | "latex": [ |
@@ -365,8 +395,8 b'' | |||
|
365 | 395 | "png": "iVBORw0KGgoAAAANSUhEUgAAAO8AAAAZCAYAAADZu3m9AAAABHNCSVQICAgIfAhkiAAABUBJREFU\neJztm1uIVVUYgD9tJrKaaYyGbMzx1JAmXSRNIySD7kxKNyqwC4REFywII43EiMKiAru+VEwnitSH\ngggSpUKyiB4s7YKWD1lIpVQPillZTQ//Osye3Vp7r8u+nIn1weGcvW77/9f+11r/+vc6EIlExiTj\n6hYg4sQ5wCBwODADWAl8XqtEkUgkl6OB5xPX1wH7gWPqEScSidhyJvAPMKCuu4FhYEFtEkUiESvG\nIW5za6tzGjJ4Z9QmUaRWXPe8qxFXbWVGmZeAOchK8TvwMfCnyjsOmAisBR4BDhramIasKOcCfcAB\n4GfgAWAX0ASWAT85yh9Knv6dwGRExjQu/dKN9M2+DFleBfYCS10U8KCI55mmKjsKpSg7rF3fs4G/\ngSGLsg1kVXhck3e5yntLk3cYsBz4AbgTOCWRNwXYBLwM7LCUuUjy9O8AHgSOzGijgV2/dAJPqjZ1\nLFZtVBVwbOD3PHVUYUehFGmHtes7HnhPVX7HovxNquxFhvydiEJdibR+ZLbZBZxqqDdLtfuchQwg\ns5hpALhgo/9Sdb8sXPplHvqHuAAZvAATkAdeNj7PU0cVdhRKkXbYFvreDtyBLOOfWpR/EfgDMa40\nXciy/yMjK0cH8AnwLXBCTtt7gKssZABxaxqWZbPI078LeMOiHdd+eYHR0eTzkYE7SX0WIS5d2bjK\nbaJsOwqlaDusXd9eZPYYD+xGXIk8vgY2G/LuQ2aXWxNpq1TajRZtfwj0WJSDYgavjf5XA/datOXa\nL0uAu9Xvk5F903Dq021x31Bc5dZRhR2FUqQdtoW+Q4gLB7AF+EsJZOJ4dZOHU+k9Km0vcHMi/SzE\nFfgqp90W11uUadEkfPDa6P8Msipm4dovAJcArzvKWzQ+cuso245CKdoOS9c3bz84D9m8f6Su96jr\nXvVbx3z1PQA8pn53IXu1b1SbOxPlBxGlnkLeY+axzqJMUdjqfyIShczCtV9AZuKGh9xF4iN3mirs\nKJQi7bB2fTsQ1yDp+w8hs8PMjHrPIn77EZq8VYjrd3Eibb1qc7atYA408Td+F/03kP++1bVfAI6i\nnsh6Eh+5k1RlR6EUZYdtoe89/Hcf96gS4tKMetsYmXHSTAAOAd8n0n5F3BXdJj3NNIsySZr4D14X\n/V8DFua059ovINFr0x6oKnzkTlKVHYVSlB1Wpq/Jbe5TAmxndNh6qvqeZKjXA5wOPGHIP4TMLpMR\nl2A/8B0Sns978dwL3ALcr8l7Bf2s1g/MZeRld5LFyF5Eh6v+O4DpwNuG9nz6BdXmdkOdLM5AItW2\nUcmtSGQ0ja/cLaq0o1Cdi7DDKvU1sga4QJN+DTKDLDPUW0j2edvzVP67ibTVKq0/SyDgIWRT70IT\nv5XXVf/ZSJjfhE+/AKwArsgTtkR85W5RpR2FUoQdVqqvLvp1IfAL8L4mb7f6Ns0g89VNdMt/J3Ks\nDOQoWIt1yKyyyNAmwG1IqN202S8SH/23AMdi/oePT790Il7D+nyRS8NH7hZV21EooXZYu76zlGAT\nDfkD6iZrDPmfAV9o0qcihxgOADdo8i8DfgPuYvSeYzoSeRvMEjqDJm4rb4j+c5FIpQ6fflkOXJsj\nb9n4Ps+67CgUXzusVd8+4EskRD6MvOtKuwZvIrPOMHJw+gPkPWQ3MttsVXkHkWjbJvXZhpwueRrx\n603MQc7zbgY2IvvYFcBJGXXyaGI3eEP0T3Il8iAhrF+mIAc06iBE7nawo1Bc7PD/oG/b0qT+96SR\nSCnYnCQZy+xDZrtIJBKJRCKRSCQSiUQikcgY4V+hOFAJDK9DFAAAAABJRU5ErkJggg==\n", |
|
366 | 396 | "prompt_number": 14, |
|
367 | 397 | "text": [ |
|
368 | "", | |
|
369 | " 2 ", | |
|
398 | "\n", | |
|
399 | " 2 \n", | |
|
370 | 400 | "A\u22c5B\u22c5C + A\u22c5B - B\u22c5A\u22c5B - C\u22c5A\u22c5B" |
|
371 | 401 | ] |
|
372 | 402 | } |
@@ -375,6 +405,7 b'' | |||
|
375 | 405 | }, |
|
376 | 406 | { |
|
377 | 407 | "cell_type": "markdown", |
|
408 | "metadata": {}, | |
|
378 | 409 | "source": [ |
|
379 | 410 | "Take the dagger" |
|
380 | 411 | ] |
@@ -386,6 +417,7 b'' | |||
|
386 | 417 | "Dagger(_)" |
|
387 | 418 | ], |
|
388 | 419 | "language": "python", |
|
420 | "metadata": {}, | |
|
389 | 421 | "outputs": [ |
|
390 | 422 | { |
|
391 | 423 | "latex": [ |
@@ -395,16 +427,17 b'' | |||
|
395 | 427 | "png": "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\n", |
|
396 | 428 | "prompt_number": 15, |
|
397 | 429 | "text": [ |
|
398 | "", | |
|
399 | " 2 ", | |
|
400 | " \u2020 \u2020 \u2020 \u2020 \u2020 \u2020 \u239b \u2020\u239e \u2020 \u2020 \u2020 \u2020", | |
|
430 | "\n", | |
|
431 | " 2 \n", | |
|
432 | " \u2020 \u2020 \u2020 \u2020 \u2020 \u2020 \u239b \u2020\u239e \u2020 \u2020 \u2020 \u2020\n", | |
|
401 | 433 | "- B \u22c5A \u22c5B - B \u22c5A \u22c5C + \u239dB \u23a0 \u22c5A + C \u22c5B \u22c5A " |
|
402 | 434 | ] |
|
403 | 435 | } |
|
404 | 436 | ], |
|
405 | 437 | "prompt_number": 15 |
|
406 | 438 | } |
|
407 | ] | |
|
439 | ], | |
|
440 | "metadata": {} | |
|
408 | 441 | } |
|
409 | 442 | ] |
|
410 | 443 | } No newline at end of file |
@@ -3,40 +3,65 b'' | |||
|
3 | 3 | "name": "trapezoid_rule" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "markdown", |
|
12 | "metadata": {}, | |
|
11 | 13 | "source": [ |
|
12 | "Basic numerical integration: the trapezoid rule", | |
|
13 | "===============================================", | |
|
14 | "", | |
|
15 | "A simple illustration of the trapezoid rule for definite integration:", | |
|
16 | "", | |
|
17 | "$$", | |
|
18 | "\\int_{a}^{b} f(x)\\, dx \\approx \\frac{1}{2} \\sum_{k=1}^{N} \\left( x_{k} - x_{k-1} \\right) \\left( f(x_{k}) + f(x_{k-1}) \\right).", | |
|
19 | "$$", | |
|
20 | "<br>", | |
|
14 | "Basic numerical integration: the trapezoid rule\n", | |
|
15 | "===============================================\n", | |
|
16 | "\n", | |
|
17 | "A simple illustration of the trapezoid rule for definite integration:\n", | |
|
18 | "\n", | |
|
19 | "$$\n", | |
|
20 | "\\int_{a}^{b} f(x)\\, dx \\approx \\frac{1}{2} \\sum_{k=1}^{N} \\left( x_{k} - x_{k-1} \\right) \\left( f(x_{k}) + f(x_{k-1}) \\right).\n", | |
|
21 | "$$\n", | |
|
22 | "<br>\n", | |
|
21 | 23 | "First, we define a simple function and sample it between 0 and 10 at 200 points" |
|
22 | 24 | ] |
|
23 | 25 | }, |
|
24 | 26 | { |
|
25 | 27 | "cell_type": "code", |
|
28 | "collapsed": false, | |
|
29 | "input": [ | |
|
30 | "%pylab inline" | |
|
31 | ], | |
|
32 | "language": "python", | |
|
33 | "metadata": {}, | |
|
34 | "outputs": [ | |
|
35 | { | |
|
36 | "output_type": "stream", | |
|
37 | "stream": "stdout", | |
|
38 | "text": [ | |
|
39 | "\n", | |
|
40 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", | |
|
41 | "For more information, type 'help(pylab)'.\n" | |
|
42 | ] | |
|
43 | } | |
|
44 | ], | |
|
45 | "prompt_number": 1 | |
|
46 | }, | |
|
47 | { | |
|
48 | "cell_type": "code", | |
|
26 | 49 | "collapsed": true, |
|
27 | 50 | "input": [ |
|
28 | "def f(x):", | |
|
29 | " return (x-3)*(x-5)*(x-7)+85", | |
|
30 | "", | |
|
31 | "x = linspace(0, 10, 200)", | |
|
51 | "def f(x):\n", | |
|
52 | " return (x-3)*(x-5)*(x-7)+85\n", | |
|
53 | "\n", | |
|
54 | "x = linspace(0, 10, 200)\n", | |
|
32 | 55 | "y = f(x)" |
|
33 | 56 | ], |
|
34 | 57 | "language": "python", |
|
58 | "metadata": {}, | |
|
35 | 59 | "outputs": [], |
|
36 |
"prompt_number": |
|
|
60 | "prompt_number": 2 | |
|
37 | 61 | }, |
|
38 | 62 | { |
|
39 | 63 | "cell_type": "markdown", |
|
64 | "metadata": {}, | |
|
40 | 65 | "source": [ |
|
41 | 66 | "Choose a region to integrate over and take only a few points in that region" |
|
42 | 67 | ] |
@@ -45,16 +70,18 b'' | |||
|
45 | 70 | "cell_type": "code", |
|
46 | 71 | "collapsed": true, |
|
47 | 72 | "input": [ |
|
48 | "a, b = 1, 9", | |
|
49 | "xint = x[logical_and(x>=a, x<=b)][::30]", | |
|
73 | "a, b = 1, 9\n", | |
|
74 | "xint = x[logical_and(x>=a, x<=b)][::30]\n", | |
|
50 | 75 | "yint = y[logical_and(x>=a, x<=b)][::30]" |
|
51 | 76 | ], |
|
52 | 77 | "language": "python", |
|
78 | "metadata": {}, | |
|
53 | 79 | "outputs": [], |
|
54 |
"prompt_number": |
|
|
80 | "prompt_number": 3 | |
|
55 | 81 | }, |
|
56 | 82 | { |
|
57 | 83 | "cell_type": "markdown", |
|
84 | "metadata": {}, | |
|
58 | 85 | "source": [ |
|
59 | 86 | "Plot both the function and the area below it in the trapezoid approximation" |
|
60 | 87 | ] |
@@ -63,22 +90,24 b'' | |||
|
63 | 90 | "cell_type": "code", |
|
64 | 91 | "collapsed": false, |
|
65 | 92 | "input": [ |
|
66 | "plot(x, y, lw=2)", | |
|
67 | "axis([0, 10, 0, 140])", | |
|
68 | "fill_between(xint, 0, yint, facecolor='gray', alpha=0.4)", | |
|
93 | "plot(x, y, lw=2)\n", | |
|
94 | "axis([0, 10, 0, 140])\n", | |
|
95 | "fill_between(xint, 0, yint, facecolor='gray', alpha=0.4)\n", | |
|
69 | 96 | "text(0.5 * (a + b), 30,r\"$\\int_a^b f(x)dx$\", horizontalalignment='center', fontsize=20);" |
|
70 | 97 | ], |
|
71 | 98 | "language": "python", |
|
99 | "metadata": {}, | |
|
72 | 100 | "outputs": [ |
|
73 | 101 | { |
|
74 | 102 | "output_type": "display_data", |
|
75 | "png": "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\nAElFTkSuQmCC\n" | |
|
103 | "png": "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\n" | |
|
76 | 104 | } |
|
77 | 105 | ], |
|
78 |
"prompt_number": |
|
|
106 | "prompt_number": 4 | |
|
79 | 107 | }, |
|
80 | 108 | { |
|
81 | 109 | "cell_type": "markdown", |
|
110 | "metadata": {}, | |
|
82 | 111 | "source": [ |
|
83 | 112 | "Compute the integral both at high accuracy and with the trapezoid approximation" |
|
84 | 113 | ] |
@@ -87,32 +116,35 b'' | |||
|
87 | 116 | "cell_type": "code", |
|
88 | 117 | "collapsed": false, |
|
89 | 118 | "input": [ |
|
90 | "from scipy.integrate import quad, trapz", | |
|
91 | "integral, error = quad(f, 1, 9)", | |
|
92 | "print \"The integral is:\", integral, \"+/-\", error", | |
|
119 | "from scipy.integrate import quad, trapz\n", | |
|
120 | "integral, error = quad(f, 1, 9)\n", | |
|
121 | "print \"The integral is:\", integral, \"+/-\", error\n", | |
|
93 | 122 | "print \"The trapezoid approximation with\", len(xint), \"points is:\", trapz(yint, xint)" |
|
94 | 123 | ], |
|
95 | 124 | "language": "python", |
|
125 | "metadata": {}, | |
|
96 | 126 | "outputs": [ |
|
97 | 127 | { |
|
98 | 128 | "output_type": "stream", |
|
99 | 129 | "stream": "stdout", |
|
100 | 130 | "text": [ |
|
101 | "The integral is: 680.0 +/- 7.54951656745e-12", | |
|
102 | "The trapezoid approximation with 6 points is: 621.286411141" | |
|
131 | "The integral is: 680.0 +/- 7.54951656745e-12\n", | |
|
132 | "The trapezoid approximation with 6 points is: 621.286411141\n" | |
|
103 | 133 | ] |
|
104 | 134 | } |
|
105 | 135 | ], |
|
106 |
"prompt_number": |
|
|
136 | "prompt_number": 5 | |
|
107 | 137 | }, |
|
108 | 138 | { |
|
109 | 139 | "cell_type": "code", |
|
110 | 140 | "collapsed": true, |
|
111 | 141 | "input": [], |
|
112 | 142 | "language": "python", |
|
143 | "metadata": {}, | |
|
113 | 144 | "outputs": [] |
|
114 | 145 | } |
|
115 | ] | |
|
146 | ], | |
|
147 | "metadata": {} | |
|
116 | 148 | } |
|
117 | 149 | ] |
|
118 | 150 | } No newline at end of file |
@@ -3,18 +3,21 b'' | |||
|
3 | 3 | "name": "Parallel Magics" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "heading", |
|
11 | 12 | "level": 1, |
|
13 | "metadata": {}, | |
|
12 | 14 | "source": [ |
|
13 | 15 | "Using Parallel Magics" |
|
14 | 16 | ] |
|
15 | 17 | }, |
|
16 | 18 | { |
|
17 | 19 | "cell_type": "markdown", |
|
20 | "metadata": {}, | |
|
18 | 21 | "source": [ |
|
19 | 22 | "IPython has a few magics for working with your engines.\n", |
|
20 | 23 | "\n", |
@@ -24,6 +27,7 b'' | |||
|
24 | 27 | }, |
|
25 | 28 | { |
|
26 | 29 | "cell_type": "code", |
|
30 | "collapsed": false, | |
|
27 | 31 | "input": [ |
|
28 | 32 | "from IPython import parallel\n", |
|
29 | 33 | "rc = parallel.Client()\n", |
@@ -31,10 +35,12 b'' | |||
|
31 | 35 | "rc.ids" |
|
32 | 36 | ], |
|
33 | 37 | "language": "python", |
|
38 | "metadata": {}, | |
|
34 | 39 | "outputs": [] |
|
35 | 40 | }, |
|
36 | 41 | { |
|
37 | 42 | "cell_type": "markdown", |
|
43 | "metadata": {}, | |
|
38 | 44 | "source": [ |
|
39 | 45 | "Creating a Client registers the parallel magics `%px`, `%%px`, `%pxresult`, `pxconfig`, and `%autopx`. \n", |
|
40 | 46 | "These magics are initially associated with a DirectView always associated with all currently registered engines." |
@@ -42,77 +48,94 b'' | |||
|
42 | 48 | }, |
|
43 | 49 | { |
|
44 | 50 | "cell_type": "markdown", |
|
51 | "metadata": {}, | |
|
45 | 52 | "source": [ |
|
46 | 53 | "Now we can execute code remotely with `%px`:" |
|
47 | 54 | ] |
|
48 | 55 | }, |
|
49 | 56 | { |
|
50 | 57 | "cell_type": "code", |
|
58 | "collapsed": false, | |
|
51 | 59 | "input": [ |
|
52 | 60 | "%px a=5" |
|
53 | 61 | ], |
|
54 | 62 | "language": "python", |
|
63 | "metadata": {}, | |
|
55 | 64 | "outputs": [] |
|
56 | 65 | }, |
|
57 | 66 | { |
|
58 | 67 | "cell_type": "code", |
|
68 | "collapsed": false, | |
|
59 | 69 | "input": [ |
|
60 | 70 | "%px print a" |
|
61 | 71 | ], |
|
62 | 72 | "language": "python", |
|
73 | "metadata": {}, | |
|
63 | 74 | "outputs": [] |
|
64 | 75 | }, |
|
65 | 76 | { |
|
66 | 77 | "cell_type": "code", |
|
78 | "collapsed": false, | |
|
67 | 79 | "input": [ |
|
68 | 80 | "%px a" |
|
69 | 81 | ], |
|
70 | 82 | "language": "python", |
|
83 | "metadata": {}, | |
|
71 | 84 | "outputs": [] |
|
72 | 85 | }, |
|
73 | 86 | { |
|
74 | 87 | "cell_type": "code", |
|
88 | "collapsed": false, | |
|
75 | 89 | "input": [ |
|
76 | 90 | "with dv.sync_imports():\n", |
|
77 | 91 | " import sys" |
|
78 | 92 | ], |
|
79 | 93 | "language": "python", |
|
94 | "metadata": {}, | |
|
80 | 95 | "outputs": [] |
|
81 | 96 | }, |
|
82 | 97 | { |
|
83 | 98 | "cell_type": "code", |
|
99 | "collapsed": false, | |
|
84 | 100 | "input": [ |
|
85 | 101 | "%px print >> sys.stderr, \"ERROR\"" |
|
86 | 102 | ], |
|
87 | 103 | "language": "python", |
|
104 | "metadata": {}, | |
|
88 | 105 | "outputs": [] |
|
89 | 106 | }, |
|
90 | 107 | { |
|
91 | 108 | "cell_type": "markdown", |
|
109 | "metadata": {}, | |
|
92 | 110 | "source": [ |
|
93 | 111 | "You don't have to wait for results. The `%pxconfig` magic lets you change the default blocking/targets for the `%px` magics:" |
|
94 | 112 | ] |
|
95 | 113 | }, |
|
96 | 114 | { |
|
97 | 115 | "cell_type": "code", |
|
116 | "collapsed": false, | |
|
98 | 117 | "input": [ |
|
99 | 118 | "%pxconfig --noblock" |
|
100 | 119 | ], |
|
101 | 120 | "language": "python", |
|
121 | "metadata": {}, | |
|
102 | 122 | "outputs": [] |
|
103 | 123 | }, |
|
104 | 124 | { |
|
105 | 125 | "cell_type": "code", |
|
126 | "collapsed": false, | |
|
106 | 127 | "input": [ |
|
107 | 128 | "%px import time\n", |
|
108 | 129 | "%px time.sleep(5)\n", |
|
109 | 130 | "%px time.time()" |
|
110 | 131 | ], |
|
111 | 132 | "language": "python", |
|
133 | "metadata": {}, | |
|
112 | 134 | "outputs": [] |
|
113 | 135 | }, |
|
114 | 136 | { |
|
115 | 137 | "cell_type": "markdown", |
|
138 | "metadata": {}, | |
|
116 | 139 | "source": [ |
|
117 | 140 | "But you will notice that this didn't output the result of the last command.\n", |
|
118 | 141 | "For this, we have `%pxresult`, which displays the output of the latest request:" |
@@ -120,29 +143,35 b'' | |||
|
120 | 143 | }, |
|
121 | 144 | { |
|
122 | 145 | "cell_type": "code", |
|
146 | "collapsed": false, | |
|
123 | 147 | "input": [ |
|
124 | 148 | "%pxresult" |
|
125 | 149 | ], |
|
126 | 150 | "language": "python", |
|
151 | "metadata": {}, | |
|
127 | 152 | "outputs": [] |
|
128 | 153 | }, |
|
129 | 154 | { |
|
130 | 155 | "cell_type": "markdown", |
|
156 | "metadata": {}, | |
|
131 | 157 | "source": [ |
|
132 | 158 | "Remember, an IPython engine is IPython, so you can do magics remotely as well!" |
|
133 | 159 | ] |
|
134 | 160 | }, |
|
135 | 161 | { |
|
136 | 162 | "cell_type": "code", |
|
163 | "collapsed": false, | |
|
137 | 164 | "input": [ |
|
138 | 165 | "%pxconfig --block\n", |
|
139 | 166 | "%px %pylab inline" |
|
140 | 167 | ], |
|
141 | 168 | "language": "python", |
|
169 | "metadata": {}, | |
|
142 | 170 | "outputs": [] |
|
143 | 171 | }, |
|
144 | 172 | { |
|
145 | 173 | "cell_type": "markdown", |
|
174 | "metadata": {}, | |
|
146 | 175 | "source": [ |
|
147 | 176 | "`%%px` can also be used as a cell magic, for submitting whole blocks.\n", |
|
148 | 177 | "This one acceps `--block` and `--noblock` flags to specify\n", |
@@ -151,15 +180,18 b'' | |||
|
151 | 180 | }, |
|
152 | 181 | { |
|
153 | 182 | "cell_type": "code", |
|
183 | "collapsed": false, | |
|
154 | 184 | "input": [ |
|
155 | 185 | "dv.scatter('id', dv.targets, flatten=True)\n", |
|
156 | 186 | "dv['stride'] = len(dv)" |
|
157 | 187 | ], |
|
158 | 188 | "language": "python", |
|
189 | "metadata": {}, | |
|
159 | 190 | "outputs": [] |
|
160 | 191 | }, |
|
161 | 192 | { |
|
162 | 193 | "cell_type": "code", |
|
194 | "collapsed": false, | |
|
163 | 195 | "input": [ |
|
164 | 196 | "%%px --noblock\n", |
|
165 | 197 | "x = linspace(0,pi,1000)\n", |
@@ -169,18 +201,22 b'' | |||
|
169 | 201 | "plt.title(\"Plot %i\" % id)" |
|
170 | 202 | ], |
|
171 | 203 | "language": "python", |
|
204 | "metadata": {}, | |
|
172 | 205 | "outputs": [] |
|
173 | 206 | }, |
|
174 | 207 | { |
|
175 | 208 | "cell_type": "code", |
|
209 | "collapsed": false, | |
|
176 | 210 | "input": [ |
|
177 | 211 | "%pxresult" |
|
178 | 212 | ], |
|
179 | 213 | "language": "python", |
|
214 | "metadata": {}, | |
|
180 | 215 | "outputs": [] |
|
181 | 216 | }, |
|
182 | 217 | { |
|
183 | 218 | "cell_type": "markdown", |
|
219 | "metadata": {}, | |
|
184 | 220 | "source": [ |
|
185 | 221 | "It also lets you choose some amount of the grouping of the outputs with `--group-outputs`:\n", |
|
186 | 222 | "\n", |
@@ -195,6 +231,7 b'' | |||
|
195 | 231 | }, |
|
196 | 232 | { |
|
197 | 233 | "cell_type": "code", |
|
234 | "collapsed": false, | |
|
198 | 235 | "input": [ |
|
199 | 236 | "%%px --group-outputs=engine\n", |
|
200 | 237 | "x = linspace(0,pi,1000)\n", |
@@ -205,10 +242,12 b'' | |||
|
205 | 242 | " plt.title(\"Plot %i\" % n)" |
|
206 | 243 | ], |
|
207 | 244 | "language": "python", |
|
245 | "metadata": {}, | |
|
208 | 246 | "outputs": [] |
|
209 | 247 | }, |
|
210 | 248 | { |
|
211 | 249 | "cell_type": "markdown", |
|
250 | "metadata": {}, | |
|
212 | 251 | "source": [ |
|
213 | 252 | "When you specify 'order', then individual display outputs (e.g. plots) will be interleaved.\n", |
|
214 | 253 | "\n", |
@@ -218,27 +257,32 b'' | |||
|
218 | 257 | }, |
|
219 | 258 | { |
|
220 | 259 | "cell_type": "code", |
|
260 | "collapsed": false, | |
|
221 | 261 | "input": [ |
|
222 | 262 | "%pxresult --group-outputs=order" |
|
223 | 263 | ], |
|
224 | 264 | "language": "python", |
|
265 | "metadata": {}, | |
|
225 | 266 | "outputs": [] |
|
226 | 267 | }, |
|
227 | 268 | { |
|
228 | 269 | "cell_type": "heading", |
|
229 | 270 | "level": 2, |
|
271 | "metadata": {}, | |
|
230 | 272 | "source": [ |
|
231 | 273 | "Single-engine views" |
|
232 | 274 | ] |
|
233 | 275 | }, |
|
234 | 276 | { |
|
235 | 277 | "cell_type": "markdown", |
|
278 | "metadata": {}, | |
|
236 | 279 | "source": [ |
|
237 | 280 | "When a DirectView has a single target, the output is a bit simpler (no prefixes on stdout/err, etc.):" |
|
238 | 281 | ] |
|
239 | 282 | }, |
|
240 | 283 | { |
|
241 | 284 | "cell_type": "code", |
|
285 | "collapsed": false, | |
|
242 | 286 | "input": [ |
|
243 | 287 | "def generate_output():\n", |
|
244 | 288 | " \"\"\"function for testing output\n", |
@@ -264,10 +308,12 b'' | |||
|
264 | 308 | "dv['generate_output'] = generate_output" |
|
265 | 309 | ], |
|
266 | 310 | "language": "python", |
|
311 | "metadata": {}, | |
|
267 | 312 | "outputs": [] |
|
268 | 313 | }, |
|
269 | 314 | { |
|
270 | 315 | "cell_type": "markdown", |
|
316 | "metadata": {}, | |
|
271 | 317 | "source": [ |
|
272 | 318 | "You can also have more than one set of parallel magics registered at a time.\n", |
|
273 | 319 | "\n", |
@@ -276,61 +322,74 b'' | |||
|
276 | 322 | }, |
|
277 | 323 | { |
|
278 | 324 | "cell_type": "code", |
|
325 | "collapsed": false, | |
|
279 | 326 | "input": [ |
|
280 | 327 | "e0 = rc[-1]\n", |
|
281 | 328 | "e0.block = True\n", |
|
282 | 329 | "e0.activate('0')" |
|
283 | 330 | ], |
|
284 | 331 | "language": "python", |
|
332 | "metadata": {}, | |
|
285 | 333 | "outputs": [] |
|
286 | 334 | }, |
|
287 | 335 | { |
|
288 | 336 | "cell_type": "code", |
|
337 | "collapsed": false, | |
|
289 | 338 | "input": [ |
|
290 | 339 | "%px0 generate_output()" |
|
291 | 340 | ], |
|
292 | 341 | "language": "python", |
|
342 | "metadata": {}, | |
|
293 | 343 | "outputs": [] |
|
294 | 344 | }, |
|
295 | 345 | { |
|
296 | 346 | "cell_type": "code", |
|
347 | "collapsed": false, | |
|
297 | 348 | "input": [ |
|
298 | 349 | "%px generate_output()" |
|
299 | 350 | ], |
|
300 | 351 | "language": "python", |
|
352 | "metadata": {}, | |
|
301 | 353 | "outputs": [] |
|
302 | 354 | }, |
|
303 | 355 | { |
|
304 | 356 | "cell_type": "markdown", |
|
357 | "metadata": {}, | |
|
305 | 358 | "source": [ |
|
306 | 359 | "As mentioned above, we can redisplay those same results with various grouping:" |
|
307 | 360 | ] |
|
308 | 361 | }, |
|
309 | 362 | { |
|
310 | 363 | "cell_type": "code", |
|
364 | "collapsed": false, | |
|
311 | 365 | "input": [ |
|
312 | 366 | "%pxresult --group-outputs order" |
|
313 | 367 | ], |
|
314 | 368 | "language": "python", |
|
369 | "metadata": {}, | |
|
315 | 370 | "outputs": [] |
|
316 | 371 | }, |
|
317 | 372 | { |
|
318 | 373 | "cell_type": "code", |
|
374 | "collapsed": false, | |
|
319 | 375 | "input": [ |
|
320 | 376 | "%pxresult --group-outputs engine" |
|
321 | 377 | ], |
|
322 | 378 | "language": "python", |
|
379 | "metadata": {}, | |
|
323 | 380 | "outputs": [] |
|
324 | 381 | }, |
|
325 | 382 | { |
|
326 | 383 | "cell_type": "heading", |
|
327 | 384 | "level": 2, |
|
385 | "metadata": {}, | |
|
328 | 386 | "source": [ |
|
329 | 387 | "Parallel Exceptions" |
|
330 | 388 | ] |
|
331 | 389 | }, |
|
332 | 390 | { |
|
333 | 391 | "cell_type": "markdown", |
|
392 | "metadata": {}, | |
|
334 | 393 | "source": [ |
|
335 | 394 | "When you raise exceptions with the parallel exception,\n", |
|
336 | 395 | "the CompositeError raised locally will display your remote traceback." |
@@ -338,29 +397,34 b'' | |||
|
338 | 397 | }, |
|
339 | 398 | { |
|
340 | 399 | "cell_type": "code", |
|
400 | "collapsed": false, | |
|
341 | 401 | "input": [ |
|
342 | 402 | "%%px\n", |
|
343 | 403 | "from numpy.random import random\n", |
|
344 | 404 | "A = random((100,100,'invalid shape'))" |
|
345 | 405 | ], |
|
346 | 406 | "language": "python", |
|
407 | "metadata": {}, | |
|
347 | 408 | "outputs": [] |
|
348 | 409 | }, |
|
349 | 410 | { |
|
350 | 411 | "cell_type": "heading", |
|
351 | 412 | "level": 2, |
|
413 | "metadata": {}, | |
|
352 | 414 | "source": [ |
|
353 | 415 | "Remote Cell Magics" |
|
354 | 416 | ] |
|
355 | 417 | }, |
|
356 | 418 | { |
|
357 | 419 | "cell_type": "markdown", |
|
420 | "metadata": {}, | |
|
358 | 421 | "source": [ |
|
359 | 422 | "Remember, Engines are IPython too, so the cell that is run remotely by %%px can in turn use a cell magic." |
|
360 | 423 | ] |
|
361 | 424 | }, |
|
362 | 425 | { |
|
363 | 426 | "cell_type": "code", |
|
427 | "collapsed": false, | |
|
364 | 428 | "input": [ |
|
365 | 429 | "%%px\n", |
|
366 | 430 | "%%timeit\n", |
@@ -370,15 +434,19 b'' | |||
|
370 | 434 | "norm(A, 2) " |
|
371 | 435 | ], |
|
372 | 436 | "language": "python", |
|
437 | "metadata": {}, | |
|
373 | 438 | "outputs": [] |
|
374 | 439 | }, |
|
375 | 440 | { |
|
376 | 441 | "cell_type": "code", |
|
442 | "collapsed": false, | |
|
377 | 443 | "input": [], |
|
378 | 444 | "language": "python", |
|
445 | "metadata": {}, | |
|
379 | 446 | "outputs": [] |
|
380 | 447 | } |
|
381 | ] | |
|
448 | ], | |
|
449 | "metadata": {} | |
|
382 | 450 | } |
|
383 | 451 | ] |
|
384 | 452 | } No newline at end of file |
@@ -3,14 +3,16 b'' | |||
|
3 | 3 | "name": "helloworld" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "markdown", |
|
12 | "metadata": {}, | |
|
11 | 13 | "source": [ |
|
12 | "# Distributed hello world", | |
|
13 | "", | |
|
14 | "# Distributed hello world\n", | |
|
15 | "\n", | |
|
14 | 16 | "Originally by Ken Kinder (ken at kenkinder dom com)" |
|
15 | 17 | ] |
|
16 | 18 | }, |
@@ -21,6 +23,7 b'' | |||
|
21 | 23 | "from IPython.parallel import Client" |
|
22 | 24 | ], |
|
23 | 25 | "language": "python", |
|
26 | "metadata": {}, | |
|
24 | 27 | "outputs": [], |
|
25 | 28 | "prompt_number": 1 |
|
26 | 29 | }, |
@@ -28,10 +31,11 b'' | |||
|
28 | 31 | "cell_type": "code", |
|
29 | 32 | "collapsed": true, |
|
30 | 33 | "input": [ |
|
31 | "rc = Client()", | |
|
34 | "rc = Client()\n", | |
|
32 | 35 | "view = rc.load_balanced_view()" |
|
33 | 36 | ], |
|
34 | 37 | "language": "python", |
|
38 | "metadata": {}, | |
|
35 | 39 | "outputs": [], |
|
36 | 40 | "prompt_number": 2 |
|
37 | 41 | }, |
@@ -39,12 +43,13 b'' | |||
|
39 | 43 | "cell_type": "code", |
|
40 | 44 | "collapsed": true, |
|
41 | 45 | "input": [ |
|
42 | "def sleep_and_echo(t, msg):", | |
|
43 | " import time", | |
|
44 | " time.sleep(t)", | |
|
46 | "def sleep_and_echo(t, msg):\n", | |
|
47 | " import time\n", | |
|
48 | " time.sleep(t)\n", | |
|
45 | 49 | " return msg" |
|
46 | 50 | ], |
|
47 | 51 | "language": "python", |
|
52 | "metadata": {}, | |
|
48 | 53 | "outputs": [], |
|
49 | 54 | "prompt_number": 3 |
|
50 | 55 | }, |
@@ -52,10 +57,11 b'' | |||
|
52 | 57 | "cell_type": "code", |
|
53 | 58 | "collapsed": true, |
|
54 | 59 | "input": [ |
|
55 | "world = view.apply_async(sleep_and_echo, 3, 'World!')", | |
|
60 | "world = view.apply_async(sleep_and_echo, 3, 'World!')\n", | |
|
56 | 61 | "hello = view.apply_async(sleep_and_echo, 2, 'Hello')" |
|
57 | 62 | ], |
|
58 | 63 | "language": "python", |
|
64 | "metadata": {}, | |
|
59 | 65 | "outputs": [], |
|
60 | 66 | "prompt_number": 4 |
|
61 | 67 | }, |
@@ -63,30 +69,33 b'' | |||
|
63 | 69 | "cell_type": "code", |
|
64 | 70 | "collapsed": false, |
|
65 | 71 | "input": [ |
|
66 |
"print \"Submitted tasks:\", hello.msg_ids |
|
|
72 | "print \"Submitted tasks:\", hello.msg_ids + world.msg_ids\n", | |
|
67 | 73 | "print hello.get(), world.get()" |
|
68 | 74 | ], |
|
69 | 75 | "language": "python", |
|
76 | "metadata": {}, | |
|
70 | 77 | "outputs": [ |
|
71 | 78 | { |
|
72 | 79 | "output_type": "stream", |
|
73 | 80 | "stream": "stdout", |
|
74 | 81 | "text": [ |
|
75 | "Submitted tasks: ['dd1052e0-aa75-4b25-9d35-ecbdaf6e3ed7'] ['1b46aa21-20d1-459c-bc36-2d8d03336f74']", | |
|
76 | "Hello" | |
|
77 | ] | |
|
78 | }, | |
|
79 | { | |
|
80 | "output_type": "stream", | |
|
81 | "stream": "stdout", | |
|
82 | "text": [ | |
|
83 | " World!" | |
|
82 | "Submitted tasks: ['04670c2d-b2fd-4b6b-a5ac-dee15e533683', 'fc802284-507b-4c29-a526-67396e17718c']\n", | |
|
83 | "Hello World!\n" | |
|
84 | 84 | ] |
|
85 | 85 | } |
|
86 | 86 | ], |
|
87 |
"prompt_number": |
|
|
87 | "prompt_number": 6 | |
|
88 | }, | |
|
89 | { | |
|
90 | "cell_type": "code", | |
|
91 | "collapsed": false, | |
|
92 | "input": [], | |
|
93 | "language": "python", | |
|
94 | "metadata": {}, | |
|
95 | "outputs": [] | |
|
88 | 96 | } |
|
89 | ] | |
|
97 | ], | |
|
98 | "metadata": {} | |
|
90 | 99 | } |
|
91 | 100 | ] |
|
92 | 101 | } No newline at end of file |
@@ -3,32 +3,38 b'' | |||
|
3 | 3 | "name": "parallel_mpi" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
11 | "cell_type": "heading", | |
|
12 | "level": 1, | |
|
13 | "metadata": {}, | |
|
14 | "source": [ | |
|
15 | "Simple usage of a set of MPI engines" | |
|
16 | ] | |
|
17 | }, | |
|
18 | { | |
|
10 | 19 | "cell_type": "markdown", |
|
20 | "metadata": {}, | |
|
11 | 21 | "source": [ |
|
12 | "# Simple usage of a set of MPI engines", | |
|
13 | "", | |
|
14 | "This example assumes you've started a cluster of N engines (4 in this example) as part", | |
|
15 | "of an MPI world. ", | |
|
16 | "", | |
|
17 | "Our documentation describes [how to create an MPI profile](http://ipython.org/ipython-doc/dev/parallel/parallel_process.html#using-ipcluster-in-mpiexec-mpirun-mode)", | |
|
18 | "and explains [basic MPI usage of the IPython cluster](http://ipython.org/ipython-doc/dev/parallel/parallel_mpi.html).", | |
|
19 | "", | |
|
20 | "", | |
|
21 | "For the simplest possible way to start 4 engines that belong to the same MPI world, ", | |
|
22 | "you can run this in a terminal or antoher notebook:", | |
|
23 | "", | |
|
24 | "<pre>", | |
|
25 | "ipcluster start --engines=MPI -n 4", | |
|
26 | "</pre>", | |
|
27 | "", | |
|
28 | "Note: to run the above in a notebook, use a *new* notebook and prepend the command with `!`, but do not run", | |
|
29 | "it in *this* notebook, as this command will block until you shut down the cluster. To stop the cluster, use ", | |
|
30 | "the 'Interrupt' button on the left, which is the equivalent of sending `Ctrl-C` to the kernel.", | |
|
31 | "", | |
|
22 | "This example assumes you've started a cluster of N engines (4 in this example) as part\n", | |
|
23 | "of an MPI world. \n", | |
|
24 | "\n", | |
|
25 | "Our documentation describes [how to create an MPI profile](http://ipython.org/ipython-doc/dev/parallel/parallel_process.html#using-ipcluster-in-mpiexec-mpirun-mode)\n", | |
|
26 | "and explains [basic MPI usage of the IPython cluster](http://ipython.org/ipython-doc/dev/parallel/parallel_mpi.html).\n", | |
|
27 | "\n", | |
|
28 | "\n", | |
|
29 | "For the simplest possible way to start 4 engines that belong to the same MPI world, \n", | |
|
30 | "you can run this in a terminal:\n", | |
|
31 | "\n", | |
|
32 | "<pre>\n", | |
|
33 | "ipcluster start --engines=MPI -n 4\n", | |
|
34 | "</pre>\n", | |
|
35 | "\n", | |
|
36 | "or start an MPI cluster from the cluster tab if you have one configured.\n", | |
|
37 | "\n", | |
|
32 | 38 | "Once the cluster is running, we can connect to it and open a view into it:" |
|
33 | 39 | ] |
|
34 | 40 | }, |
@@ -36,16 +42,18 b'' | |||
|
36 | 42 | "cell_type": "code", |
|
37 | 43 | "collapsed": true, |
|
38 | 44 | "input": [ |
|
39 | "from IPython.parallel import Client", | |
|
40 | "c = Client()", | |
|
45 | "from IPython.parallel import Client\n", | |
|
46 | "c = Client()\n", | |
|
41 | 47 | "view = c[:]" |
|
42 | 48 | ], |
|
43 | 49 | "language": "python", |
|
50 | "metadata": {}, | |
|
44 | 51 | "outputs": [], |
|
45 |
"prompt_number": |
|
|
52 | "prompt_number": 1 | |
|
46 | 53 | }, |
|
47 | 54 | { |
|
48 | 55 | "cell_type": "markdown", |
|
56 | "metadata": {}, | |
|
49 | 57 | "source": [ |
|
50 | 58 | "Let's define a simple function that gets the MPI rank from each engine." |
|
51 | 59 | ] |
@@ -54,15 +62,16 b'' | |||
|
54 | 62 | "cell_type": "code", |
|
55 | 63 | "collapsed": true, |
|
56 | 64 | "input": [ |
|
57 | "@view.remote(block=True)", | |
|
58 | "def mpi_rank():", | |
|
59 | " from mpi4py import MPI", | |
|
60 | " comm = MPI.COMM_WORLD", | |
|
65 | "@view.remote(block=True)\n", | |
|
66 | "def mpi_rank():\n", | |
|
67 | " from mpi4py import MPI\n", | |
|
68 | " comm = MPI.COMM_WORLD\n", | |
|
61 | 69 | " return comm.Get_rank()" |
|
62 | 70 | ], |
|
63 | 71 | "language": "python", |
|
72 | "metadata": {}, | |
|
64 | 73 | "outputs": [], |
|
65 |
"prompt_number": 2 |
|
|
74 | "prompt_number": 2 | |
|
66 | 75 | }, |
|
67 | 76 | { |
|
68 | 77 | "cell_type": "code", |
@@ -71,127 +80,77 b'' | |||
|
71 | 80 | "mpi_rank()" |
|
72 | 81 | ], |
|
73 | 82 | "language": "python", |
|
83 | "metadata": {}, | |
|
74 | 84 | "outputs": [ |
|
75 | 85 | { |
|
76 | 86 | "output_type": "pyout", |
|
77 |
"prompt_number": |
|
|
87 | "prompt_number": 3, | |
|
78 | 88 | "text": [ |
|
79 |
"[ |
|
|
89 | "[2, 3, 1, 0]" | |
|
80 | 90 | ] |
|
81 | 91 | } |
|
82 | 92 | ], |
|
83 |
"prompt_number": |
|
|
84 | }, | |
|
85 | { | |
|
86 | "cell_type": "markdown", | |
|
87 | "source": [ | |
|
88 | "For interactive convenience, we load the parallel magic extensions and make this view", | |
|
89 | "the active one for the automatic parallelism magics.", | |
|
90 | "", | |
|
91 | "This is not necessary and in production codes likely won't be used, as the engines will ", | |
|
92 | "load their own MPI codes separately. But it makes it easy to illustrate everything from", | |
|
93 | "within a single notebook here." | |
|
94 | ] | |
|
95 | }, | |
|
96 | { | |
|
97 | "cell_type": "code", | |
|
98 | "collapsed": true, | |
|
99 | "input": [ | |
|
100 | "%load_ext parallelmagic", | |
|
101 | "view.activate()" | |
|
102 | ], | |
|
103 | "language": "python", | |
|
104 | "outputs": [], | |
|
105 | "prompt_number": 4 | |
|
93 | "prompt_number": 3 | |
|
106 | 94 | }, |
|
107 | 95 | { |
|
108 | 96 | "cell_type": "markdown", |
|
97 | "metadata": {}, | |
|
109 | 98 | "source": [ |
|
110 | "Use the autopx magic to make the rest of this cell execute on the engines instead", | |
|
111 | "of locally" | |
|
99 | "To get a mapping of IPython IDs and MPI rank (these do not always match),\n", | |
|
100 | "you can use the get_dict method on AsyncResults." | |
|
112 | 101 | ] |
|
113 | 102 | }, |
|
114 | 103 | { |
|
115 | 104 | "cell_type": "code", |
|
116 | "collapsed": true, | |
|
117 | "input": [ | |
|
118 | "view.block = True" | |
|
119 | ], | |
|
120 | "language": "python", | |
|
121 | "outputs": [], | |
|
122 | "prompt_number": 24 | |
|
123 | }, | |
|
124 | { | |
|
125 | "cell_type": "code", | |
|
126 | 105 | "collapsed": false, |
|
127 | 106 | "input": [ |
|
128 | "%autopx" | |
|
107 | "mpi_rank.block = False\n", | |
|
108 | "ar = mpi_rank()\n", | |
|
109 | "ar.get_dict()" | |
|
129 | 110 | ], |
|
130 | 111 | "language": "python", |
|
112 | "metadata": {}, | |
|
131 | 113 | "outputs": [ |
|
132 | 114 | { |
|
133 |
"output_type": " |
|
|
134 | "stream": "stdout", | |
|
115 | "output_type": "pyout", | |
|
116 | "prompt_number": 4, | |
|
135 | 117 | "text": [ |
|
136 | "%autopx enabled" | |
|
118 | "{0: 2, 1: 3, 2: 1, 3: 0}" | |
|
137 | 119 | ] |
|
138 | 120 | } |
|
139 | 121 | ], |
|
140 |
"prompt_number": |
|
|
122 | "prompt_number": 4 | |
|
141 | 123 | }, |
|
142 | 124 | { |
|
143 | 125 | "cell_type": "markdown", |
|
126 | "metadata": {}, | |
|
144 | 127 | "source": [ |
|
145 |
"With |
|
|
128 | "With %%px cell magic, the next cell will actually execute *entirely on each engine*:" | |
|
146 | 129 | ] |
|
147 | 130 | }, |
|
148 | 131 | { |
|
149 | 132 | "cell_type": "code", |
|
150 | 133 | "collapsed": true, |
|
151 | 134 | "input": [ |
|
152 | "from mpi4py import MPI", | |
|
153 | "", | |
|
154 | "comm = MPI.COMM_WORLD", | |
|
155 | "size = comm.Get_size()", | |
|
156 |
" |
|
|
157 | "", | |
|
158 |
" |
|
|
159 | " data = [(i+1)**2 for i in range(size)]", | |
|
160 | "else:", | |
|
161 | " data = None", | |
|
162 | "data = comm.scatter(data, root=0)", | |
|
163 | "", | |
|
135 | "%%px\n", | |
|
136 | "from mpi4py import MPI\n", | |
|
137 | "\n", | |
|
138 | "comm = MPI.COMM_WORLD\n", | |
|
139 | "size = comm.Get_size()\n", | |
|
140 | "rank = comm.Get_rank()\n", | |
|
141 | "\n", | |
|
142 | "if rank == 0:\n", | |
|
143 | " data = [(i+1)**2 for i in range(size)]\n", | |
|
144 | "else:\n", | |
|
145 | " data = None\n", | |
|
146 | "data = comm.scatter(data, root=0)\n", | |
|
147 | "\n", | |
|
164 | 148 | "assert data == (rank+1)**2, 'data=%s, rank=%s' % (data, rank)" |
|
165 | 149 | ], |
|
166 | 150 | "language": "python", |
|
151 | "metadata": {}, | |
|
167 | 152 | "outputs": [], |
|
168 |
"prompt_number": |
|
|
169 | }, | |
|
170 | { | |
|
171 | "cell_type": "markdown", | |
|
172 | "source": [ | |
|
173 | "Though the assertion at the end of the previous block validated the code, we can now ", | |
|
174 | "pull the 'data' variable from all the nodes for local inspection.", | |
|
175 | "First, don't forget to toggle off `autopx` mode so code runs again in the notebook:" | |
|
176 | ] | |
|
177 | }, | |
|
178 | { | |
|
179 | "cell_type": "code", | |
|
180 | "collapsed": false, | |
|
181 | "input": [ | |
|
182 | "%autopx" | |
|
183 | ], | |
|
184 | "language": "python", | |
|
185 | "outputs": [ | |
|
186 | { | |
|
187 | "output_type": "stream", | |
|
188 | "stream": "stdout", | |
|
189 | "text": [ | |
|
190 | "%autopx disabled" | |
|
191 | ] | |
|
192 | } | |
|
193 | ], | |
|
194 | "prompt_number": 33 | |
|
153 | "prompt_number": 5 | |
|
195 | 154 | }, |
|
196 | 155 | { |
|
197 | 156 | "cell_type": "code", |
@@ -200,25 +159,29 b'' | |||
|
200 | 159 | "view['data']" |
|
201 | 160 | ], |
|
202 | 161 | "language": "python", |
|
162 | "metadata": {}, | |
|
203 | 163 | "outputs": [ |
|
204 | 164 | { |
|
205 | 165 | "output_type": "pyout", |
|
206 |
"prompt_number": |
|
|
166 | "prompt_number": 6, | |
|
207 | 167 | "text": [ |
|
208 |
"[ |
|
|
168 | "[9, 16, 4, 1]" | |
|
209 | 169 | ] |
|
210 | 170 | } |
|
211 | 171 | ], |
|
212 |
"prompt_number": |
|
|
172 | "prompt_number": 6 | |
|
213 | 173 | }, |
|
214 | 174 | { |
|
215 | 175 | "cell_type": "code", |
|
216 | 176 | "collapsed": true, |
|
217 | 177 | "input": [], |
|
218 | 178 | "language": "python", |
|
219 | "outputs": [] | |
|
179 | "metadata": {}, | |
|
180 | "outputs": [], | |
|
181 | "prompt_number": 6 | |
|
220 | 182 | } |
|
221 | ] | |
|
183 | ], | |
|
184 | "metadata": {} | |
|
222 | 185 | } |
|
223 | 186 | ] |
|
224 | 187 | } No newline at end of file |
@@ -3,11 +3,13 b'' | |||
|
3 | 3 | "name": "task1" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "markdown", |
|
12 | "metadata": {}, | |
|
11 | 13 | "source": [ |
|
12 | 14 | "# Simple task farming example" |
|
13 | 15 | ] |
@@ -19,11 +21,13 b'' | |||
|
19 | 21 | "from IPython.parallel import Client" |
|
20 | 22 | ], |
|
21 | 23 | "language": "python", |
|
24 | "metadata": {}, | |
|
22 | 25 | "outputs": [], |
|
23 |
"prompt_number": |
|
|
26 | "prompt_number": 1 | |
|
24 | 27 | }, |
|
25 | 28 | { |
|
26 | 29 | "cell_type": "markdown", |
|
30 | "metadata": {}, | |
|
27 | 31 | "source": [ |
|
28 | 32 | "A `Client.load_balanced_view` is used to get the object used for working with load balanced tasks." |
|
29 | 33 | ] |
@@ -32,15 +36,17 b'' | |||
|
32 | 36 | "cell_type": "code", |
|
33 | 37 | "collapsed": true, |
|
34 | 38 | "input": [ |
|
35 | "rc = Client()", | |
|
39 | "rc = Client()\n", | |
|
36 | 40 | "v = rc.load_balanced_view()" |
|
37 | 41 | ], |
|
38 | 42 | "language": "python", |
|
43 | "metadata": {}, | |
|
39 | 44 | "outputs": [], |
|
40 |
"prompt_number": |
|
|
45 | "prompt_number": 2 | |
|
41 | 46 | }, |
|
42 | 47 | { |
|
43 | 48 | "cell_type": "markdown", |
|
49 | "metadata": {}, | |
|
44 | 50 | "source": [ |
|
45 | 51 | "Set the variable `d` on all engines:" |
|
46 | 52 | ] |
@@ -52,11 +58,13 b'' | |||
|
52 | 58 | "rc[:]['d'] = 30" |
|
53 | 59 | ], |
|
54 | 60 | "language": "python", |
|
61 | "metadata": {}, | |
|
55 | 62 | "outputs": [], |
|
56 |
"prompt_number": |
|
|
63 | "prompt_number": 3 | |
|
57 | 64 | }, |
|
58 | 65 | { |
|
59 | 66 | "cell_type": "markdown", |
|
67 | "metadata": {}, | |
|
60 | 68 | "source": [ |
|
61 | 69 | "Define a function that will be our task:" |
|
62 | 70 | ] |
@@ -65,15 +73,17 b'' | |||
|
65 | 73 | "cell_type": "code", |
|
66 | 74 | "collapsed": true, |
|
67 | 75 | "input": [ |
|
68 | "def task(a):", | |
|
76 | "def task(a):\n", | |
|
69 | 77 | " return a, 10*d, a*10*d" |
|
70 | 78 | ], |
|
71 | 79 | "language": "python", |
|
80 | "metadata": {}, | |
|
72 | 81 | "outputs": [], |
|
73 |
"prompt_number": |
|
|
82 | "prompt_number": 4 | |
|
74 | 83 | }, |
|
75 | 84 | { |
|
76 | 85 | "cell_type": "markdown", |
|
86 | "metadata": {}, | |
|
77 | 87 | "source": [ |
|
78 | 88 | "Run the task once:" |
|
79 | 89 | ] |
@@ -85,11 +95,13 b'' | |||
|
85 | 95 | "ar = v.apply(task, 5)" |
|
86 | 96 | ], |
|
87 | 97 | "language": "python", |
|
98 | "metadata": {}, | |
|
88 | 99 | "outputs": [], |
|
89 |
"prompt_number": |
|
|
100 | "prompt_number": 5 | |
|
90 | 101 | }, |
|
91 | 102 | { |
|
92 | 103 | "cell_type": "markdown", |
|
104 | "metadata": {}, | |
|
93 | 105 | "source": [ |
|
94 | 106 | "Print the results:" |
|
95 | 107 | ] |
@@ -101,18 +113,28 b'' | |||
|
101 | 113 | "print \"a, b, c: \", ar.get()" |
|
102 | 114 | ], |
|
103 | 115 | "language": "python", |
|
116 | "metadata": {}, | |
|
104 | 117 | "outputs": [ |
|
105 | 118 | { |
|
106 | 119 | "output_type": "stream", |
|
107 | 120 | "stream": "stdout", |
|
108 | 121 | "text": [ |
|
109 | "a, b, c: [5, 300, 1500]" | |
|
122 | "a, b, c: [5, 300, 1500]\n" | |
|
110 | 123 | ] |
|
111 | 124 | } |
|
112 | 125 | ], |
|
113 |
"prompt_number": |
|
|
126 | "prompt_number": 6 | |
|
127 | }, | |
|
128 | { | |
|
129 | "cell_type": "code", | |
|
130 | "collapsed": false, | |
|
131 | "input": [], | |
|
132 | "language": "python", | |
|
133 | "metadata": {}, | |
|
134 | "outputs": [] | |
|
114 | 135 | } |
|
115 | ] | |
|
136 | ], | |
|
137 | "metadata": {} | |
|
116 | 138 | } |
|
117 | 139 | ] |
|
118 | 140 | } No newline at end of file |
@@ -3,11 +3,13 b'' | |||
|
3 | 3 | "name": "taskmap" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "markdown", |
|
12 | "metadata": {}, | |
|
11 | 13 | "source": [ |
|
12 | 14 | "# Load balanced map and parallel function decorator" |
|
13 | 15 | ] |
@@ -19,6 +21,7 b'' | |||
|
19 | 21 | "from IPython.parallel import Client" |
|
20 | 22 | ], |
|
21 | 23 | "language": "python", |
|
24 | "metadata": {}, | |
|
22 | 25 | "outputs": [], |
|
23 | 26 | "prompt_number": 1 |
|
24 | 27 | }, |
@@ -26,21 +29,23 b'' | |||
|
26 | 29 | "cell_type": "code", |
|
27 | 30 | "collapsed": false, |
|
28 | 31 | "input": [ |
|
29 | "rc = Client()", | |
|
32 | "rc = Client()\n", | |
|
30 | 33 | "v = rc.load_balanced_view()" |
|
31 | 34 | ], |
|
32 | 35 | "language": "python", |
|
36 | "metadata": {}, | |
|
33 | 37 | "outputs": [], |
|
34 |
"prompt_number": |
|
|
38 | "prompt_number": 2 | |
|
35 | 39 | }, |
|
36 | 40 | { |
|
37 | 41 | "cell_type": "code", |
|
38 | 42 | "collapsed": false, |
|
39 | 43 | "input": [ |
|
40 | "result = v.map(lambda x: 2*x, range(10))", | |
|
44 | "result = v.map(lambda x: 2*x, range(10))\n", | |
|
41 | 45 | "print \"Simple, default map: \", list(result)" |
|
42 | 46 | ], |
|
43 | 47 | "language": "python", |
|
48 | "metadata": {}, | |
|
44 | 49 | "outputs": [ |
|
45 | 50 | { |
|
46 | 51 | "output_type": "stream", |
@@ -53,57 +58,68 b'' | |||
|
53 | 58 | "output_type": "stream", |
|
54 | 59 | "stream": "stdout", |
|
55 | 60 | "text": [ |
|
56 | "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]" | |
|
61 | "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\n" | |
|
57 | 62 | ] |
|
58 | 63 | } |
|
59 | 64 | ], |
|
60 |
"prompt_number": |
|
|
65 | "prompt_number": 3 | |
|
61 | 66 | }, |
|
62 | 67 | { |
|
63 | 68 | "cell_type": "code", |
|
64 | 69 | "collapsed": false, |
|
65 | 70 | "input": [ |
|
66 | "ar = v.map_async(lambda x: 2*x, range(10))", | |
|
67 | "print \"Submitted tasks, got ids: \", ar.msg_ids", | |
|
68 | "result = ar.get()", | |
|
71 | "ar = v.map_async(lambda x: 2*x, range(10))\n", | |
|
72 | "print \"Submitted tasks, got ids: \", ar.msg_ids\n", | |
|
73 | "result = ar.get()\n", | |
|
69 | 74 | "print \"Using a mapper: \", result" |
|
70 | 75 | ], |
|
71 | 76 | "language": "python", |
|
77 | "metadata": {}, | |
|
72 | 78 | "outputs": [ |
|
73 | 79 | { |
|
74 | 80 | "output_type": "stream", |
|
75 | 81 | "stream": "stdout", |
|
76 | 82 | "text": [ |
|
77 | "Submitted tasks, got ids: ['5100a4c7-73a4-4832-aa91-e774f6f3ede8', 'd0cae1cf-2b32-4092-9eb7-f17b43fb3849', 'e08d3ee2-f221-47fe-9556-ed938e692030', '065585e4-cdf9-4240-a5fe-e44b2ae5d023', 'd2162f23-68e5-4318-ba1e-e34fd03a72ac', '5b3b835f-2099-4a70-9896-d1aa810c77e6', 'e2c2a823-bd44-4f91-8db3-c154d0d86e56', '991e0c25-f98a-44b5-9d9e-889d4180b9a5', '4ad41221-28bd-482f-a300-97c404648161', '5b730eb3-e0bb-4cdd-b228-c3b8d158828a']", | |
|
78 | "Using a mapper: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]" | |
|
83 | "Submitted tasks, got ids: ['d482fcb3-f8e9-41ff-ba16-9fd4118324f1', 'e4fe38dd-8a4d-4f3a-a111-e4c9fdbea7c3', '580431f4-ac66-4517-b03e-a58aa690a87b', '19a012cf-5d9d-4cf3-9656-d56263958c0e', '012ebbb5-5def-47ad-a247-20f88d2c8980', '0dea6cdb-5b22-4bac-a1bb-7544c0ef44e6', '909d073f-7eee-42a7-8f3b-8f7aa32e7639', 'be6c7466-d541-47a0-b12d-bc408d40ad77', 'b97b5967-a5a3-45c5-95cc-44e0823fd646', '69b06902-9526-42d9-bda6-c943be19cc5a']\n", | |
|
84 | "Using a mapper: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\n" | |
|
79 | 85 | ] |
|
80 | 86 | } |
|
81 | 87 | ], |
|
82 |
"prompt_number": |
|
|
88 | "prompt_number": 4 | |
|
83 | 89 | }, |
|
84 | 90 | { |
|
85 | 91 | "cell_type": "code", |
|
86 | 92 | "collapsed": false, |
|
87 | 93 | "input": [ |
|
88 | "@v.parallel(block=True)", | |
|
89 | "def f(x): return 2*x", | |
|
90 | "", | |
|
91 | "result = f.map(range(10))", | |
|
94 | "@v.parallel(block=True)\n", | |
|
95 | "def f(x): return 2*x\n", | |
|
96 | "\n", | |
|
97 | "result = f.map(range(10))\n", | |
|
92 | 98 | "print \"Using a parallel function: \", result" |
|
93 | 99 | ], |
|
94 | 100 | "language": "python", |
|
101 | "metadata": {}, | |
|
95 | 102 | "outputs": [ |
|
96 | 103 | { |
|
97 | 104 | "output_type": "stream", |
|
98 | 105 | "stream": "stdout", |
|
99 | 106 | "text": [ |
|
100 | "Using a parallel function: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]" | |
|
107 | "Using a parallel function: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\n" | |
|
101 | 108 | ] |
|
102 | 109 | } |
|
103 | 110 | ], |
|
104 |
"prompt_number": |
|
|
111 | "prompt_number": 5 | |
|
112 | }, | |
|
113 | { | |
|
114 | "cell_type": "code", | |
|
115 | "collapsed": false, | |
|
116 | "input": [], | |
|
117 | "language": "python", | |
|
118 | "metadata": {}, | |
|
119 | "outputs": [] | |
|
105 | 120 | } |
|
106 | ] | |
|
121 | ], | |
|
122 | "metadata": {} | |
|
107 | 123 | } |
|
108 | 124 | ] |
|
109 | 125 | } No newline at end of file |
@@ -3,36 +3,44 b'' | |||
|
3 | 3 | "name": "directview" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | "nbformat_minor": 0, | |
|
6 | 7 | "worksheets": [ |
|
7 | 8 | { |
|
8 | 9 | "cells": [ |
|
9 | 10 | { |
|
10 | 11 | "cell_type": "code", |
|
12 | "collapsed": false, | |
|
11 | 13 | "input": [ |
|
12 | "from directview import interact", | |
|
14 | "from directview import interact\n", | |
|
13 | 15 | "from IPython.parallel import Client" |
|
14 | 16 | ], |
|
15 | 17 | "language": "python", |
|
18 | "metadata": {}, | |
|
16 | 19 | "outputs": [] |
|
17 | 20 | }, |
|
18 | 21 | { |
|
19 | 22 | "cell_type": "code", |
|
23 | "collapsed": false, | |
|
20 | 24 | "input": [ |
|
21 | "c = Client()", | |
|
25 | "c = Client()\n", | |
|
22 | 26 | "dv = c[:]" |
|
23 | 27 | ], |
|
24 | 28 | "language": "python", |
|
29 | "metadata": {}, | |
|
25 | 30 | "outputs": [] |
|
26 | 31 | }, |
|
27 | 32 | { |
|
28 | 33 | "cell_type": "code", |
|
34 | "collapsed": false, | |
|
29 | 35 | "input": [ |
|
30 | 36 | "interact(dv)" |
|
31 | 37 | ], |
|
32 | 38 | "language": "python", |
|
39 | "metadata": {}, | |
|
33 | 40 | "outputs": [] |
|
34 | 41 | } |
|
35 | ] | |
|
42 | ], | |
|
43 | "metadata": {} | |
|
36 | 44 | } |
|
37 | 45 | ] |
|
38 | 46 | } No newline at end of file |
@@ -1,255 +0,0 b'' | |||
|
1 | { | |
|
2 | "metadata": { | |
|
3 | "name": "direct_view_widget" | |
|
4 | }, | |
|
5 | "nbformat": 3, | |
|
6 | "worksheets": [ | |
|
7 | { | |
|
8 | "cells": [ | |
|
9 | { | |
|
10 | "cell_type": "heading", | |
|
11 | "level": 1, | |
|
12 | "source": [ | |
|
13 | "Direct View Widget" | |
|
14 | ] | |
|
15 | }, | |
|
16 | { | |
|
17 | "cell_type": "markdown", | |
|
18 | "source": [ | |
|
19 | "IPython has a JavaScript widget for interacting with an IPython parallel engine interactively in the Notebook. This Notebook shows how this widget can be used." | |
|
20 | ] | |
|
21 | }, | |
|
22 | { | |
|
23 | "cell_type": "code", | |
|
24 | "input": [ | |
|
25 | "from IPython.frontend.html.notebook.widgets import directview", | |
|
26 | "from IPython.parallel import Client" | |
|
27 | ], | |
|
28 | "language": "python", | |
|
29 | "outputs": [], | |
|
30 | "prompt_number": 4 | |
|
31 | }, | |
|
32 | { | |
|
33 | "cell_type": "markdown", | |
|
34 | "source": [ | |
|
35 | "Let's create a `Client` and build a `DirectView` containing all of the engines:" | |
|
36 | ] | |
|
37 | }, | |
|
38 | { | |
|
39 | "cell_type": "code", | |
|
40 | "input": [ | |
|
41 | "c = Client()", | |
|
42 | "dv = c[:]" | |
|
43 | ], | |
|
44 | "language": "python", | |
|
45 | "outputs": [], | |
|
46 | "prompt_number": 5 | |
|
47 | }, | |
|
48 | { | |
|
49 | "cell_type": "markdown", | |
|
50 | "source": [ | |
|
51 | "To interact with the engines we simply pass the `DirectView` instance to the `interact` function. The resulting widget has an embedded notebook cell, but any code entered into the embedded cell is run on the engines you choose. The engines are now full blown IPython kernels so you can enter arbitrary Python/IPython code and even make plots on the engines." | |
|
52 | ] | |
|
53 | }, | |
|
54 | { | |
|
55 | "cell_type": "code", | |
|
56 | "input": [ | |
|
57 | "directview.interact(dv)" | |
|
58 | ], | |
|
59 | "language": "python", | |
|
60 | "outputs": [ | |
|
61 | { | |
|
62 | "javascript": [ | |
|
63 | "//----------------------------------------------------------------------------", | |
|
64 | "// Copyright (C) 2008-2012 The IPython Development Team", | |
|
65 | "//", | |
|
66 | "// Distributed under the terms of the BSD License. The full license is in", | |
|
67 | "// the file COPYING, distributed as part of this software.", | |
|
68 | "//----------------------------------------------------------------------------", | |
|
69 | "", | |
|
70 | "//============================================================================", | |
|
71 | "// EngineInteract", | |
|
72 | "//============================================================================", | |
|
73 | "", | |
|
74 | "var key = IPython.utils.keycodes;", | |
|
75 | "", | |
|
76 | "", | |
|
77 | "var DirectViewWidget = function (selector, kernel, targets) {", | |
|
78 | " // The kernel doesn't have to be set at creation time, in that case", | |
|
79 | " // it will be null and set_kernel has to be called later.", | |
|
80 | " this.selector = selector;", | |
|
81 | " this.element = $(selector);", | |
|
82 | " this.kernel = kernel || null;", | |
|
83 | " this.code_mirror = null;", | |
|
84 | " this.targets = targets;", | |
|
85 | " this.create_element();", | |
|
86 | "};", | |
|
87 | "", | |
|
88 | "", | |
|
89 | "DirectViewWidget.prototype.create_element = function () {", | |
|
90 | " this.element.addClass('cell border-box-sizing code_cell vbox');", | |
|
91 | " this.element.attr('tabindex','2');", | |
|
92 | " this.element.css('padding-right',0);", | |
|
93 | "", | |
|
94 | " var control = $('<div/>').addClass('dv_control').height('30px');", | |
|
95 | " var control_label = $('<span/>').html('Select engine(s) to run code on interactively: ');", | |
|
96 | " control_label.css('line-height','30px');", | |
|
97 | " var select = $('<select/>').addClass('dv_select ui-widget ui-widget-content');", | |
|
98 | " select.css('font-size','85%').css('margin-bottom','5px');", | |
|
99 | " var n = this.targets.length;", | |
|
100 | " select.append($('<option/>').html('all').attr('value','all'));", | |
|
101 | " for (var i=0; i<n; i++) {", | |
|
102 | " select.append($('<option/>').html(this.targets[i]).attr('value',this.targets[i]))", | |
|
103 | " }", | |
|
104 | " control.append(control_label).append(select);", | |
|
105 | "", | |
|
106 | " var input = $('<div></div>').addClass('input hbox');", | |
|
107 | " var input_area = $('<div/>').addClass('input_area box-flex1');", | |
|
108 | " this.code_mirror = CodeMirror(input_area.get(0), {", | |
|
109 | " indentUnit : 4,", | |
|
110 | " mode: 'python',", | |
|
111 | " theme: 'ipython',", | |
|
112 | " onKeyEvent: $.proxy(this.handle_codemirror_keyevent,this)", | |
|
113 | " });", | |
|
114 | " input.append(input_area);", | |
|
115 | " var output = $('<div></div>');", | |
|
116 | "", | |
|
117 | "", | |
|
118 | " this.element.append(control).append(input).append(output);", | |
|
119 | "\tthis.output_area = new IPython.OutputArea(output, false);", | |
|
120 | "", | |
|
121 | "};", | |
|
122 | "", | |
|
123 | "", | |
|
124 | "DirectViewWidget.prototype.handle_codemirror_keyevent = function (editor, event) {", | |
|
125 | " // This method gets called in CodeMirror's onKeyDown/onKeyPress", | |
|
126 | " // handlers and is used to provide custom key handling. Its return", | |
|
127 | " // value is used to determine if CodeMirror should ignore the event:", | |
|
128 | " // true = ignore, false = don't ignore.", | |
|
129 | " ", | |
|
130 | " var that = this;", | |
|
131 | " var cur = editor.getCursor();", | |
|
132 | "", | |
|
133 | " if (event.keyCode === key.ENTER && event.shiftKey && event.type === 'keydown') {", | |
|
134 | " // Always ignore shift-enter in CodeMirror as we handle it.", | |
|
135 | " event.stop();", | |
|
136 | " that.execute();", | |
|
137 | " return true;", | |
|
138 | " } else if (event.keyCode === key.UP && event.type === 'keydown') {", | |
|
139 | " event.stop();", | |
|
140 | " return false;", | |
|
141 | " } else if (event.keyCode === key.DOWN && event.type === 'keydown') {", | |
|
142 | " event.stop();", | |
|
143 | " return false;", | |
|
144 | " } else if (event.keyCode === key.BACKSPACE && event.type == 'keydown') {", | |
|
145 | " // If backspace and the line ends with 4 spaces, remove them.", | |
|
146 | " var line = editor.getLine(cur.line);", | |
|
147 | " var ending = line.slice(-4);", | |
|
148 | " if (ending === ' ') {", | |
|
149 | " editor.replaceRange('',", | |
|
150 | " {line: cur.line, ch: cur.ch-4},", | |
|
151 | " {line: cur.line, ch: cur.ch}", | |
|
152 | " );", | |
|
153 | " event.stop();", | |
|
154 | " return true;", | |
|
155 | " } else {", | |
|
156 | " return false;", | |
|
157 | " };", | |
|
158 | " };", | |
|
159 | "", | |
|
160 | " return false;", | |
|
161 | "};", | |
|
162 | "", | |
|
163 | "", | |
|
164 | "// Kernel related calls.", | |
|
165 | "", | |
|
166 | "", | |
|
167 | "DirectViewWidget.prototype.set_kernel = function (kernel) {", | |
|
168 | " this.kernel = kernel;", | |
|
169 | "}", | |
|
170 | "", | |
|
171 | "", | |
|
172 | "DirectViewWidget.prototype.execute = function () {", | |
|
173 | " this.output_area.clear_output(true, true, true);", | |
|
174 | " this.element.addClass(\"running\");", | |
|
175 | " var callbacks = {", | |
|
176 | " 'execute_reply': $.proxy(this._handle_execute_reply, this),", | |
|
177 | " 'output': $.proxy(this.output_area.handle_output, this.output_area),", | |
|
178 | " 'clear_output': $.proxy(this.output_area.handle_clear_output, this.output_area),", | |
|
179 | " };", | |
|
180 | " var target = this.element.find('.dv_select option:selected').attr('value');", | |
|
181 | " if (target === 'all') {", | |
|
182 | " target = '\"all\"';", | |
|
183 | " }", | |
|
184 | " var code = '__widget_b32c0bd12a804f69b0e6445ef57c08d9.execute(\"\"\"'+this.get_text()+'\"\"\",targets='+target+')';", | |
|
185 | " var msg_id = this.kernel.execute(code, callbacks, {silent: false});", | |
|
186 | " this.clear_input();", | |
|
187 | " this.code_mirror.focus();", | |
|
188 | "};", | |
|
189 | "", | |
|
190 | "", | |
|
191 | "DirectViewWidget.prototype._handle_execute_reply = function (content) {", | |
|
192 | " this.element.removeClass(\"running\");", | |
|
193 | " // this.dirty = true;", | |
|
194 | "}", | |
|
195 | "", | |
|
196 | "// Basic cell manipulation.", | |
|
197 | "", | |
|
198 | "", | |
|
199 | "DirectViewWidget.prototype.select_all = function () {", | |
|
200 | " var start = {line: 0, ch: 0};", | |
|
201 | " var nlines = this.code_mirror.lineCount();", | |
|
202 | " var last_line = this.code_mirror.getLine(nlines-1);", | |
|
203 | " var end = {line: nlines-1, ch: last_line.length};", | |
|
204 | " this.code_mirror.setSelection(start, end);", | |
|
205 | "};", | |
|
206 | "", | |
|
207 | "", | |
|
208 | "DirectViewWidget.prototype.clear_input = function () {", | |
|
209 | " this.code_mirror.setValue('');", | |
|
210 | "};", | |
|
211 | "", | |
|
212 | "", | |
|
213 | "DirectViewWidget.prototype.get_text = function () {", | |
|
214 | " return this.code_mirror.getValue();", | |
|
215 | "};", | |
|
216 | "", | |
|
217 | "", | |
|
218 | "DirectViewWidget.prototype.set_text = function (code) {", | |
|
219 | " return this.code_mirror.setValue(code);", | |
|
220 | "};", | |
|
221 | "", | |
|
222 | "container.show();", | |
|
223 | "var widget = $('<div/>')", | |
|
224 | "// When templating over a JSON string, we must use single quotes.", | |
|
225 | "var targets = '[0,1,2,3]';", | |
|
226 | "targets = $.parseJSON(targets);", | |
|
227 | "var eiw = new DirectViewWidget(widget, IPython.notebook.kernel, targets);", | |
|
228 | "element.append(widget);", | |
|
229 | "element.css('padding',0);", | |
|
230 | "setTimeout(function () {", | |
|
231 | " eiw.code_mirror.refresh();", | |
|
232 | " eiw.code_mirror.focus();", | |
|
233 | "}, 1);", | |
|
234 | "", | |
|
235 | "" | |
|
236 | ], | |
|
237 | "output_type": "display_data", | |
|
238 | "text": [ | |
|
239 | "<IPython.core.display.Javascript at 0x107d35fd0>" | |
|
240 | ] | |
|
241 | }, | |
|
242 | { | |
|
243 | "output_type": "pyout", | |
|
244 | "prompt_number": 6, | |
|
245 | "text": [ | |
|
246 | "<IPython.frontend.html.notebook.widgets.directview.DirectViewWidget at 0x107eb9890>" | |
|
247 | ] | |
|
248 | } | |
|
249 | ], | |
|
250 | "prompt_number": 6 | |
|
251 | } | |
|
252 | ] | |
|
253 | } | |
|
254 | ] | |
|
255 | } No newline at end of file |
General Comments 0
You need to be logged in to leave comments.
Login now