Show More
The requested changes are too big and content was truncated. Show full diff
@@ -1,1050 +1,1050 b'' | |||
|
1 | 1 | .. _messaging: |
|
2 | 2 | |
|
3 | 3 | ====================== |
|
4 | 4 | Messaging in IPython |
|
5 | 5 | ====================== |
|
6 | 6 | |
|
7 | 7 | |
|
8 | 8 | Introduction |
|
9 | 9 | ============ |
|
10 | 10 | |
|
11 | 11 | This document explains the basic communications design and messaging |
|
12 | 12 | specification for how the various IPython objects interact over a network |
|
13 | 13 | transport. The current implementation uses the ZeroMQ_ library for messaging |
|
14 | 14 | within and between hosts. |
|
15 | 15 | |
|
16 | 16 | .. Note:: |
|
17 | 17 | |
|
18 | 18 | This document should be considered the authoritative description of the |
|
19 | 19 | IPython messaging protocol, and all developers are strongly encouraged to |
|
20 | 20 | keep it updated as the implementation evolves, so that we have a single |
|
21 | 21 | common reference for all protocol details. |
|
22 | 22 | |
|
23 | 23 | The basic design is explained in the following diagram: |
|
24 | 24 | |
|
25 | 25 | .. image:: figs/frontend-kernel.png |
|
26 | 26 | :width: 450px |
|
27 | 27 | :alt: IPython kernel/frontend messaging architecture. |
|
28 | 28 | :align: center |
|
29 | 29 | :target: ../_images/frontend-kernel.png |
|
30 | 30 | |
|
31 | 31 | A single kernel can be simultaneously connected to one or more frontends. The |
|
32 | 32 | kernel has three sockets that serve the following functions: |
|
33 | 33 | |
|
34 | 34 | 1. stdin: this ROUTER socket is connected to all frontends, and it allows |
|
35 | 35 | the kernel to request input from the active frontend when :func:`raw_input` is called. |
|
36 | 36 | The frontend that executed the code has a DEALER socket that acts as a 'virtual keyboard' |
|
37 | 37 | for the kernel while this communication is happening (illustrated in the |
|
38 | 38 | figure by the black outline around the central keyboard). In practice, |
|
39 | 39 | frontends may display such kernel requests using a special input widget or |
|
40 | 40 | otherwise indicating that the user is to type input for the kernel instead |
|
41 | 41 | of normal commands in the frontend. |
|
42 | 42 | |
|
43 | 43 | 2. Shell: this single ROUTER socket allows multiple incoming connections from |
|
44 | 44 | frontends, and this is the socket where requests for code execution, object |
|
45 | 45 | information, prompts, etc. are made to the kernel by any frontend. The |
|
46 | 46 | communication on this socket is a sequence of request/reply actions from |
|
47 | 47 | each frontend and the kernel. |
|
48 | 48 | |
|
49 | 49 | 3. IOPub: this socket is the 'broadcast channel' where the kernel publishes all |
|
50 | 50 | side effects (stdout, stderr, etc.) as well as the requests coming from any |
|
51 | 51 | client over the shell socket and its own requests on the stdin socket. There |
|
52 | 52 | are a number of actions in Python which generate side effects: :func:`print` |
|
53 | 53 | writes to ``sys.stdout``, errors generate tracebacks, etc. Additionally, in |
|
54 | 54 | a multi-client scenario, we want all frontends to be able to know what each |
|
55 | 55 | other has sent to the kernel (this can be useful in collaborative scenarios, |
|
56 | 56 | for example). This socket allows both side effects and the information |
|
57 | 57 | about communications taking place with one client over the shell channel |
|
58 | 58 | to be made available to all clients in a uniform manner. |
|
59 | 59 | |
|
60 | 60 | All messages are tagged with enough information (details below) for clients |
|
61 | 61 | to know which messages come from their own interaction with the kernel and |
|
62 | 62 | which ones are from other clients, so they can display each type |
|
63 | 63 | appropriately. |
|
64 | 64 | |
|
65 | 65 | The actual format of the messages allowed on each of these channels is |
|
66 | 66 | specified below. Messages are dicts of dicts with string keys and values that |
|
67 | 67 | are reasonably representable in JSON. Our current implementation uses JSON |
|
68 | 68 | explicitly as its message format, but this shouldn't be considered a permanent |
|
69 | 69 | feature. As we've discovered that JSON has non-trivial performance issues due |
|
70 | 70 | to excessive copying, we may in the future move to a pure pickle-based raw |
|
71 | 71 | message format. However, it should be possible to easily convert from the raw |
|
72 | 72 | objects to JSON, since we may have non-python clients (e.g. a web frontend). |
|
73 | 73 | As long as it's easy to make a JSON version of the objects that is a faithful |
|
74 | 74 | representation of all the data, we can communicate with such clients. |
|
75 | 75 | |
|
76 | 76 | .. Note:: |
|
77 | 77 | |
|
78 | 78 | Not all of these have yet been fully fleshed out, but the key ones are, see |
|
79 | 79 | kernel and frontend files for actual implementation details. |
|
80 | 80 | |
|
81 | 81 | General Message Format |
|
82 | 82 | ====================== |
|
83 | 83 | |
|
84 | 84 | A message is defined by the following four-dictionary structure:: |
|
85 | 85 | |
|
86 | 86 | { |
|
87 | 87 | # The message header contains a pair of unique identifiers for the |
|
88 | 88 | # originating session and the actual message id, in addition to the |
|
89 | 89 | # username for the process that generated the message. This is useful in |
|
90 | 90 | # collaborative settings where multiple users may be interacting with the |
|
91 | 91 | # same kernel simultaneously, so that frontends can label the various |
|
92 | 92 | # messages in a meaningful way. |
|
93 | 93 | 'header' : { |
|
94 | 94 | 'msg_id' : uuid, |
|
95 | 95 | 'username' : str, |
|
96 | 96 | 'session' : uuid |
|
97 | 97 | # All recognized message type strings are listed below. |
|
98 | 98 | 'msg_type' : str, |
|
99 | 99 | }, |
|
100 | 100 | |
|
101 | 101 | # In a chain of messages, the header from the parent is copied so that |
|
102 | 102 | # clients can track where messages come from. |
|
103 | 103 | 'parent_header' : dict, |
|
104 | 104 | |
|
105 | 105 | # The actual content of the message must be a dict, whose structure |
|
106 | 106 | # depends on the message type. |
|
107 | 107 | 'content' : dict, |
|
108 | 108 | |
|
109 | 109 | # Any metadata associated with the message. |
|
110 | 110 | 'metadata' : dict, |
|
111 | 111 | } |
|
112 | 112 | |
|
113 | 113 | |
|
114 | 114 | Python functional API |
|
115 | 115 | ===================== |
|
116 | 116 | |
|
117 | 117 | As messages are dicts, they map naturally to a ``func(**kw)`` call form. We |
|
118 | 118 | should develop, at a few key points, functional forms of all the requests that |
|
119 | 119 | take arguments in this manner and automatically construct the necessary dict |
|
120 | 120 | for sending. |
|
121 | 121 | |
|
122 | 122 | In addition, the Python implementation of the message specification extends |
|
123 | 123 | messages upon deserialization to the following form for convenience:: |
|
124 | 124 | |
|
125 | 125 | { |
|
126 | 126 | 'header' : dict, |
|
127 | 127 | # The msg's unique identifier and type are always stored in the header, |
|
128 | 128 | # but the Python implementation copies them to the top level. |
|
129 | 129 | 'msg_id' : uuid, |
|
130 | 130 | 'msg_type' : str, |
|
131 | 131 | 'parent_header' : dict, |
|
132 | 132 | 'content' : dict, |
|
133 | 133 | 'metadata' : dict, |
|
134 | 134 | } |
|
135 | 135 | |
|
136 | 136 | All messages sent to or received by any IPython process should have this |
|
137 | 137 | extended structure. |
|
138 | 138 | |
|
139 | 139 | |
|
140 | 140 | Messages on the shell ROUTER/DEALER sockets |
|
141 | 141 | =========================================== |
|
142 | 142 | |
|
143 | 143 | .. _execute: |
|
144 | 144 | |
|
145 | 145 | Execute |
|
146 | 146 | ------- |
|
147 | 147 | |
|
148 | 148 | This message type is used by frontends to ask the kernel to execute code on |
|
149 | 149 | behalf of the user, in a namespace reserved to the user's variables (and thus |
|
150 | 150 | separate from the kernel's own internal code and variables). |
|
151 | 151 | |
|
152 | 152 | Message type: ``execute_request``:: |
|
153 | 153 | |
|
154 | 154 | content = { |
|
155 | 155 | # Source code to be executed by the kernel, one or more lines. |
|
156 | 156 | 'code' : str, |
|
157 | 157 | |
|
158 | 158 | # A boolean flag which, if True, signals the kernel to execute |
|
159 | 159 | # this code as quietly as possible. This means that the kernel |
|
160 | 160 | # will compile the code with 'exec' instead of 'single' (so |
|
161 | 161 | # sys.displayhook will not fire), forces store_history to be False, |
|
162 | 162 | # and will *not*: |
|
163 | 163 | # - broadcast exceptions on the PUB socket |
|
164 | 164 | # - do any logging |
|
165 | 165 | # |
|
166 | 166 | # The default is False. |
|
167 | 167 | 'silent' : bool, |
|
168 | 168 | |
|
169 | 169 | # A boolean flag which, if True, signals the kernel to populate history |
|
170 | 170 | # The default is True if silent is False. If silent is True, store_history |
|
171 | 171 | # is forced to be False. |
|
172 | 172 | 'store_history' : bool, |
|
173 | 173 | |
|
174 | 174 | # A list of variable names from the user's namespace to be retrieved. What |
|
175 | 175 | # returns is a JSON string of the variable's repr(), not a python object. |
|
176 | 176 | 'user_variables' : list, |
|
177 | 177 | |
|
178 | 178 | # Similarly, a dict mapping names to expressions to be evaluated in the |
|
179 | 179 | # user's dict. |
|
180 | 180 | 'user_expressions' : dict, |
|
181 | 181 | |
|
182 | 182 | # Some frontends (e.g. the Notebook) do not support stdin requests. If |
|
183 | 183 | # raw_input is called from code executed from such a frontend, a |
|
184 | 184 | # StdinNotImplementedError will be raised. |
|
185 | 185 | 'allow_stdin' : True, |
|
186 | 186 | |
|
187 | 187 | } |
|
188 | 188 | |
|
189 | 189 | The ``code`` field contains a single string (possibly multiline). The kernel |
|
190 | 190 | is responsible for splitting this into one or more independent execution blocks |
|
191 | 191 | and deciding whether to compile these in 'single' or 'exec' mode (see below for |
|
192 | 192 | detailed execution semantics). |
|
193 | 193 | |
|
194 | 194 | The ``user_`` fields deserve a detailed explanation. In the past, IPython had |
|
195 | 195 | the notion of a prompt string that allowed arbitrary code to be evaluated, and |
|
196 | 196 | this was put to good use by many in creating prompts that displayed system |
|
197 | 197 | status, path information, and even more esoteric uses like remote instrument |
|
198 | 198 | status aqcuired over the network. But now that IPython has a clean separation |
|
199 | 199 | between the kernel and the clients, the kernel has no prompt knowledge; prompts |
|
200 | 200 | are a frontend-side feature, and it should be even possible for different |
|
201 | 201 | frontends to display different prompts while interacting with the same kernel. |
|
202 | 202 | |
|
203 | 203 | The kernel now provides the ability to retrieve data from the user's namespace |
|
204 | 204 | after the execution of the main ``code``, thanks to two fields in the |
|
205 | 205 | ``execute_request`` message: |
|
206 | 206 | |
|
207 | 207 | - ``user_variables``: If only variables from the user's namespace are needed, a |
|
208 | 208 | list of variable names can be passed and a dict with these names as keys and |
|
209 | 209 | their :func:`repr()` as values will be returned. |
|
210 | 210 | |
|
211 | 211 | - ``user_expressions``: For more complex expressions that require function |
|
212 | 212 | evaluations, a dict can be provided with string keys and arbitrary python |
|
213 | 213 | expressions as values. The return message will contain also a dict with the |
|
214 | 214 | same keys and the :func:`repr()` of the evaluated expressions as value. |
|
215 | 215 | |
|
216 | 216 | With this information, frontends can display any status information they wish |
|
217 | 217 | in the form that best suits each frontend (a status line, a popup, inline for a |
|
218 | 218 | terminal, etc). |
|
219 | 219 | |
|
220 | 220 | .. Note:: |
|
221 | 221 | |
|
222 | 222 | In order to obtain the current execution counter for the purposes of |
|
223 | 223 | displaying input prompts, frontends simply make an execution request with an |
|
224 | 224 | empty code string and ``silent=True``. |
|
225 | 225 | |
|
226 | 226 | Execution semantics |
|
227 | 227 | ~~~~~~~~~~~~~~~~~~~ |
|
228 | 228 | |
|
229 | 229 | When the silent flag is false, the execution of use code consists of the |
|
230 | 230 | following phases (in silent mode, only the ``code`` field is executed): |
|
231 | 231 | |
|
232 | 232 | 1. Run the ``pre_runcode_hook``. |
|
233 | 233 | |
|
234 | 234 | 2. Execute the ``code`` field, see below for details. |
|
235 | 235 | |
|
236 | 236 | 3. If #2 succeeds, compute ``user_variables`` and ``user_expressions`` are |
|
237 | 237 | computed. This ensures that any error in the latter don't harm the main |
|
238 | 238 | code execution. |
|
239 | 239 | |
|
240 | 240 | 4. Call any method registered with :meth:`register_post_execute`. |
|
241 | 241 | |
|
242 | 242 | .. warning:: |
|
243 | 243 | |
|
244 | 244 | The API for running code before/after the main code block is likely to |
|
245 | 245 | change soon. Both the ``pre_runcode_hook`` and the |
|
246 | 246 | :meth:`register_post_execute` are susceptible to modification, as we find a |
|
247 | 247 | consistent model for both. |
|
248 | 248 | |
|
249 | 249 | To understand how the ``code`` field is executed, one must know that Python |
|
250 | 250 | code can be compiled in one of three modes (controlled by the ``mode`` argument |
|
251 | 251 | to the :func:`compile` builtin): |
|
252 | 252 | |
|
253 | 253 | *single* |
|
254 | 254 | Valid for a single interactive statement (though the source can contain |
|
255 | 255 | multiple lines, such as a for loop). When compiled in this mode, the |
|
256 | 256 | generated bytecode contains special instructions that trigger the calling of |
|
257 | 257 | :func:`sys.displayhook` for any expression in the block that returns a value. |
|
258 | 258 | This means that a single statement can actually produce multiple calls to |
|
259 | 259 | :func:`sys.displayhook`, if for example it contains a loop where each |
|
260 | 260 | iteration computes an unassigned expression would generate 10 calls:: |
|
261 | 261 | |
|
262 | 262 | for i in range(10): |
|
263 | 263 | i**2 |
|
264 | 264 | |
|
265 | 265 | *exec* |
|
266 | 266 | An arbitrary amount of source code, this is how modules are compiled. |
|
267 | 267 | :func:`sys.displayhook` is *never* implicitly called. |
|
268 | 268 | |
|
269 | 269 | *eval* |
|
270 | 270 | A single expression that returns a value. :func:`sys.displayhook` is *never* |
|
271 | 271 | implicitly called. |
|
272 | 272 | |
|
273 | 273 | |
|
274 | 274 | The ``code`` field is split into individual blocks each of which is valid for |
|
275 | 275 | execution in 'single' mode, and then: |
|
276 | 276 | |
|
277 | 277 | - If there is only a single block: it is executed in 'single' mode. |
|
278 | 278 | |
|
279 | 279 | - If there is more than one block: |
|
280 | 280 | |
|
281 | 281 | * if the last one is a single line long, run all but the last in 'exec' mode |
|
282 | 282 | and the very last one in 'single' mode. This makes it easy to type simple |
|
283 | 283 | expressions at the end to see computed values. |
|
284 | 284 | |
|
285 | 285 | * if the last one is no more than two lines long, run all but the last in |
|
286 | 286 | 'exec' mode and the very last one in 'single' mode. This makes it easy to |
|
287 | 287 | type simple expressions at the end to see computed values. - otherwise |
|
288 | 288 | (last one is also multiline), run all in 'exec' mode |
|
289 | 289 | |
|
290 | 290 | * otherwise (last one is also multiline), run all in 'exec' mode as a single |
|
291 | 291 | unit. |
|
292 | 292 | |
|
293 | 293 | Any error in retrieving the ``user_variables`` or evaluating the |
|
294 | 294 | ``user_expressions`` will result in a simple error message in the return fields |
|
295 | 295 | of the form:: |
|
296 | 296 | |
|
297 | 297 | [ERROR] ExceptionType: Exception message |
|
298 | 298 | |
|
299 | 299 | The user can simply send the same variable name or expression for evaluation to |
|
300 | 300 | see a regular traceback. |
|
301 | 301 | |
|
302 | 302 | Errors in any registered post_execute functions are also reported similarly, |
|
303 | 303 | and the failing function is removed from the post_execution set so that it does |
|
304 | 304 | not continue triggering failures. |
|
305 | 305 | |
|
306 | 306 | Upon completion of the execution request, the kernel *always* sends a reply, |
|
307 | 307 | with a status code indicating what happened and additional data depending on |
|
308 | 308 | the outcome. See :ref:`below <execution_results>` for the possible return |
|
309 | 309 | codes and associated data. |
|
310 | 310 | |
|
311 | 311 | |
|
312 | 312 | Execution counter (old prompt number) |
|
313 | 313 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
314 | 314 | |
|
315 | 315 | The kernel has a single, monotonically increasing counter of all execution |
|
316 | 316 | requests that are made with ``store_history=True``. This counter is used to populate |
|
317 | 317 | the ``In[n]``, ``Out[n]`` and ``_n`` variables, so clients will likely want to |
|
318 | 318 | display it in some form to the user, which will typically (but not necessarily) |
|
319 | 319 | be done in the prompts. The value of this counter will be returned as the |
|
320 | 320 | ``execution_count`` field of all ``execute_reply`` messages. |
|
321 | 321 | |
|
322 | 322 | .. _execution_results: |
|
323 | 323 | |
|
324 | 324 | Execution results |
|
325 | 325 | ~~~~~~~~~~~~~~~~~ |
|
326 | 326 | |
|
327 | 327 | Message type: ``execute_reply``:: |
|
328 | 328 | |
|
329 | 329 | content = { |
|
330 | 330 | # One of: 'ok' OR 'error' OR 'abort' |
|
331 | 331 | 'status' : str, |
|
332 | 332 | |
|
333 | 333 | # The global kernel counter that increases by one with each request that |
|
334 | 334 | # stores history. This will typically be used by clients to display |
|
335 | 335 | # prompt numbers to the user. If the request did not store history, this will |
|
336 | 336 | # be the current value of the counter in the kernel. |
|
337 | 337 | 'execution_count' : int, |
|
338 | 338 | } |
|
339 | 339 | |
|
340 | 340 | When status is 'ok', the following extra fields are present:: |
|
341 | 341 | |
|
342 | 342 | { |
|
343 | 343 | # 'payload' will be a list of payload dicts. |
|
344 | 344 | # Each execution payload is a dict with string keys that may have been |
|
345 | 345 | # produced by the code being executed. It is retrieved by the kernel at |
|
346 | 346 | # the end of the execution and sent back to the front end, which can take |
|
347 | 347 | # action on it as needed. See main text for further details. |
|
348 | 348 | 'payload' : list(dict), |
|
349 | 349 | |
|
350 | 350 | # Results for the user_variables and user_expressions. |
|
351 | 351 | 'user_variables' : dict, |
|
352 | 352 | 'user_expressions' : dict, |
|
353 | 353 | } |
|
354 | 354 | |
|
355 | 355 | .. admonition:: Execution payloads |
|
356 | 356 | |
|
357 | 357 | The notion of an 'execution payload' is different from a return value of a |
|
358 | 358 | given set of code, which normally is just displayed on the pyout stream |
|
359 | 359 | through the PUB socket. The idea of a payload is to allow special types of |
|
360 | 360 | code, typically magics, to populate a data container in the IPython kernel |
|
361 | 361 | that will be shipped back to the caller via this channel. The kernel |
|
362 | 362 | has an API for this in the PayloadManager:: |
|
363 | 363 | |
|
364 | 364 | ip.payload_manager.write_payload(payload_dict) |
|
365 | 365 | |
|
366 | 366 | which appends a dictionary to the list of payloads. |
|
367 | 367 | |
|
368 | 368 | |
|
369 | 369 | When status is 'error', the following extra fields are present:: |
|
370 | 370 | |
|
371 | 371 | { |
|
372 | 372 | 'ename' : str, # Exception name, as a string |
|
373 | 373 | 'evalue' : str, # Exception value, as a string |
|
374 | 374 | |
|
375 | 375 | # The traceback will contain a list of frames, represented each as a |
|
376 | 376 | # string. For now we'll stick to the existing design of ultraTB, which |
|
377 | 377 | # controls exception level of detail statefully. But eventually we'll |
|
378 | 378 | # want to grow into a model where more information is collected and |
|
379 | 379 | # packed into the traceback object, with clients deciding how little or |
|
380 | 380 | # how much of it to unpack. But for now, let's start with a simple list |
|
381 | 381 | # of strings, since that requires only minimal changes to ultratb as |
|
382 | 382 | # written. |
|
383 | 383 | 'traceback' : list, |
|
384 | 384 | } |
|
385 | 385 | |
|
386 | 386 | |
|
387 | 387 | When status is 'abort', there are for now no additional data fields. This |
|
388 | 388 | happens when the kernel was interrupted by a signal. |
|
389 | 389 | |
|
390 | 390 | Kernel attribute access |
|
391 | 391 | ----------------------- |
|
392 | 392 | |
|
393 | 393 | .. warning:: |
|
394 | 394 | |
|
395 | 395 | This part of the messaging spec is not actually implemented in the kernel |
|
396 | 396 | yet. |
|
397 | 397 | |
|
398 | 398 | While this protocol does not specify full RPC access to arbitrary methods of |
|
399 | 399 | the kernel object, the kernel does allow read (and in some cases write) access |
|
400 | 400 | to certain attributes. |
|
401 | 401 | |
|
402 | 402 | The policy for which attributes can be read is: any attribute of the kernel, or |
|
403 | 403 | its sub-objects, that belongs to a :class:`Configurable` object and has been |
|
404 | 404 | declared at the class-level with Traits validation, is in principle accessible |
|
405 | 405 | as long as its name does not begin with a leading underscore. The attribute |
|
406 | 406 | itself will have metadata indicating whether it allows remote read and/or write |
|
407 | 407 | access. The message spec follows for attribute read and write requests. |
|
408 | 408 | |
|
409 | 409 | Message type: ``getattr_request``:: |
|
410 | 410 | |
|
411 | 411 | content = { |
|
412 | 412 | # The (possibly dotted) name of the attribute |
|
413 | 413 | 'name' : str, |
|
414 | 414 | } |
|
415 | 415 | |
|
416 | 416 | When a ``getattr_request`` fails, there are two possible error types: |
|
417 | 417 | |
|
418 | 418 | - AttributeError: this type of error was raised when trying to access the |
|
419 | 419 | given name by the kernel itself. This means that the attribute likely |
|
420 | 420 | doesn't exist. |
|
421 | 421 | |
|
422 | 422 | - AccessError: the attribute exists but its value is not readable remotely. |
|
423 | 423 | |
|
424 | 424 | |
|
425 | 425 | Message type: ``getattr_reply``:: |
|
426 | 426 | |
|
427 | 427 | content = { |
|
428 | 428 | # One of ['ok', 'AttributeError', 'AccessError']. |
|
429 | 429 | 'status' : str, |
|
430 | 430 | # If status is 'ok', a JSON object. |
|
431 | 431 | 'value' : object, |
|
432 | 432 | } |
|
433 | 433 | |
|
434 | 434 | Message type: ``setattr_request``:: |
|
435 | 435 | |
|
436 | 436 | content = { |
|
437 | 437 | # The (possibly dotted) name of the attribute |
|
438 | 438 | 'name' : str, |
|
439 | 439 | |
|
440 | 440 | # A JSON-encoded object, that will be validated by the Traits |
|
441 | 441 | # information in the kernel |
|
442 | 442 | 'value' : object, |
|
443 | 443 | } |
|
444 | 444 | |
|
445 | 445 | When a ``setattr_request`` fails, there are also two possible error types with |
|
446 | 446 | similar meanings as those of the ``getattr_request`` case, but for writing. |
|
447 | 447 | |
|
448 | 448 | Message type: ``setattr_reply``:: |
|
449 | 449 | |
|
450 | 450 | content = { |
|
451 | 451 | # One of ['ok', 'AttributeError', 'AccessError']. |
|
452 | 452 | 'status' : str, |
|
453 | 453 | } |
|
454 | 454 | |
|
455 | 455 | |
|
456 | 456 | |
|
457 | 457 | Object information |
|
458 | 458 | ------------------ |
|
459 | 459 | |
|
460 | 460 | One of IPython's most used capabilities is the introspection of Python objects |
|
461 | 461 | in the user's namespace, typically invoked via the ``?`` and ``??`` characters |
|
462 | 462 | (which in reality are shorthands for the ``%pinfo`` magic). This is used often |
|
463 | 463 | enough that it warrants an explicit message type, especially because frontends |
|
464 | 464 | may want to get object information in response to user keystrokes (like Tab or |
|
465 | 465 | F1) besides from the user explicitly typing code like ``x??``. |
|
466 | 466 | |
|
467 | 467 | Message type: ``object_info_request``:: |
|
468 | 468 | |
|
469 | 469 | content = { |
|
470 | 470 | # The (possibly dotted) name of the object to be searched in all |
|
471 | 471 | # relevant namespaces |
|
472 | 472 | 'name' : str, |
|
473 | 473 | |
|
474 | 474 | # The level of detail desired. The default (0) is equivalent to typing |
|
475 | 475 | # 'x?' at the prompt, 1 is equivalent to 'x??'. |
|
476 | 476 | 'detail_level' : int, |
|
477 | 477 | } |
|
478 | 478 | |
|
479 | 479 | The returned information will be a dictionary with keys very similar to the |
|
480 | 480 | field names that IPython prints at the terminal. |
|
481 | 481 | |
|
482 | 482 | Message type: ``object_info_reply``:: |
|
483 | 483 | |
|
484 | 484 | content = { |
|
485 | 485 | # The name the object was requested under |
|
486 | 486 | 'name' : str, |
|
487 | 487 | |
|
488 | 488 | # Boolean flag indicating whether the named object was found or not. If |
|
489 | 489 | # it's false, all other fields will be empty. |
|
490 | 490 | 'found' : bool, |
|
491 | 491 | |
|
492 | 492 | # Flags for magics and system aliases |
|
493 | 493 | 'ismagic' : bool, |
|
494 | 494 | 'isalias' : bool, |
|
495 | 495 | |
|
496 | 496 | # The name of the namespace where the object was found ('builtin', |
|
497 | 497 | # 'magics', 'alias', 'interactive', etc.) |
|
498 | 498 | 'namespace' : str, |
|
499 | 499 | |
|
500 | 500 | # The type name will be type.__name__ for normal Python objects, but it |
|
501 | 501 | # can also be a string like 'Magic function' or 'System alias' |
|
502 | 502 | 'type_name' : str, |
|
503 | 503 | |
|
504 | 504 | # The string form of the object, possibly truncated for length if |
|
505 | 505 | # detail_level is 0 |
|
506 | 506 | 'string_form' : str, |
|
507 | 507 | |
|
508 | 508 | # For objects with a __class__ attribute this will be set |
|
509 | 509 | 'base_class' : str, |
|
510 | 510 | |
|
511 | 511 | # For objects with a __len__ attribute this will be set |
|
512 | 512 | 'length' : int, |
|
513 | 513 | |
|
514 | 514 | # If the object is a function, class or method whose file we can find, |
|
515 | 515 | # we give its full path |
|
516 | 516 | 'file' : str, |
|
517 | 517 | |
|
518 | 518 | # For pure Python callable objects, we can reconstruct the object |
|
519 | 519 | # definition line which provides its call signature. For convenience this |
|
520 | 520 | # is returned as a single 'definition' field, but below the raw parts that |
|
521 | 521 | # compose it are also returned as the argspec field. |
|
522 | 522 | 'definition' : str, |
|
523 | 523 | |
|
524 | 524 | # The individual parts that together form the definition string. Clients |
|
525 | 525 | # with rich display capabilities may use this to provide a richer and more |
|
526 | 526 | # precise representation of the definition line (e.g. by highlighting |
|
527 | 527 | # arguments based on the user's cursor position). For non-callable |
|
528 | 528 | # objects, this field is empty. |
|
529 | 529 | 'argspec' : { # The names of all the arguments |
|
530 | 530 | args : list, |
|
531 | 531 | # The name of the varargs (*args), if any |
|
532 | 532 | varargs : str, |
|
533 | 533 | # The name of the varkw (**kw), if any |
|
534 | 534 | varkw : str, |
|
535 | 535 | # The values (as strings) of all default arguments. Note |
|
536 | 536 | # that these must be matched *in reverse* with the 'args' |
|
537 | 537 | # list above, since the first positional args have no default |
|
538 | 538 | # value at all. |
|
539 | 539 | defaults : list, |
|
540 | 540 | }, |
|
541 | 541 | |
|
542 | 542 | # For instances, provide the constructor signature (the definition of |
|
543 | 543 | # the __init__ method): |
|
544 | 544 | 'init_definition' : str, |
|
545 | 545 | |
|
546 | 546 | # Docstrings: for any object (function, method, module, package) with a |
|
547 | 547 | # docstring, we show it. But in addition, we may provide additional |
|
548 | 548 | # docstrings. For example, for instances we will show the constructor |
|
549 | 549 | # and class docstrings as well, if available. |
|
550 | 550 | 'docstring' : str, |
|
551 | 551 | |
|
552 | 552 | # For instances, provide the constructor and class docstrings |
|
553 | 553 | 'init_docstring' : str, |
|
554 | 554 | 'class_docstring' : str, |
|
555 | 555 | |
|
556 | 556 | # If it's a callable object whose call method has a separate docstring and |
|
557 | 557 | # definition line: |
|
558 | 558 | 'call_def' : str, |
|
559 | 559 | 'call_docstring' : str, |
|
560 | 560 | |
|
561 | 561 | # If detail_level was 1, we also try to find the source code that |
|
562 | 562 | # defines the object, if possible. The string 'None' will indicate |
|
563 | 563 | # that no source was found. |
|
564 | 564 | 'source' : str, |
|
565 | 565 | } |
|
566 | 566 | |
|
567 | 567 | |
|
568 | 568 | Complete |
|
569 | 569 | -------- |
|
570 | 570 | |
|
571 | 571 | Message type: ``complete_request``:: |
|
572 | 572 | |
|
573 | 573 | content = { |
|
574 | 574 | # The text to be completed, such as 'a.is' |
|
575 | 575 | 'text' : str, |
|
576 | 576 | |
|
577 | 577 | # The full line, such as 'print a.is'. This allows completers to |
|
578 | 578 | # make decisions that may require information about more than just the |
|
579 | 579 | # current word. |
|
580 | 580 | 'line' : str, |
|
581 | 581 | |
|
582 | 582 | # The entire block of text where the line is. This may be useful in the |
|
583 | 583 | # case of multiline completions where more context may be needed. Note: if |
|
584 | 584 | # in practice this field proves unnecessary, remove it to lighten the |
|
585 | 585 | # messages. |
|
586 | 586 | |
|
587 | 587 | 'block' : str, |
|
588 | 588 | |
|
589 | 589 | # The position of the cursor where the user hit 'TAB' on the line. |
|
590 | 590 | 'cursor_pos' : int, |
|
591 | 591 | } |
|
592 | 592 | |
|
593 | 593 | Message type: ``complete_reply``:: |
|
594 | 594 | |
|
595 | 595 | content = { |
|
596 | 596 | # The list of all matches to the completion request, such as |
|
597 | 597 | # ['a.isalnum', 'a.isalpha'] for the above example. |
|
598 | 598 | 'matches' : list |
|
599 | 599 | } |
|
600 | 600 | |
|
601 | 601 | |
|
602 | 602 | History |
|
603 | 603 | ------- |
|
604 | 604 | |
|
605 | 605 | For clients to explicitly request history from a kernel. The kernel has all |
|
606 | 606 | the actual execution history stored in a single location, so clients can |
|
607 | 607 | request it from the kernel when needed. |
|
608 | 608 | |
|
609 | 609 | Message type: ``history_request``:: |
|
610 | 610 | |
|
611 | 611 | content = { |
|
612 | 612 | |
|
613 | 613 | # If True, also return output history in the resulting dict. |
|
614 | 614 | 'output' : bool, |
|
615 | 615 | |
|
616 | 616 | # If True, return the raw input history, else the transformed input. |
|
617 | 617 | 'raw' : bool, |
|
618 | 618 | |
|
619 | 619 | # So far, this can be 'range', 'tail' or 'search'. |
|
620 | 620 | 'hist_access_type' : str, |
|
621 | 621 | |
|
622 | 622 | # If hist_access_type is 'range', get a range of input cells. session can |
|
623 | 623 | # be a positive session number, or a negative number to count back from |
|
624 | 624 | # the current session. |
|
625 | 625 | 'session' : int, |
|
626 | 626 | # start and stop are line numbers within that session. |
|
627 | 627 | 'start' : int, |
|
628 | 628 | 'stop' : int, |
|
629 | 629 | |
|
630 | 630 | # If hist_access_type is 'tail' or 'search', get the last n cells. |
|
631 | 631 | 'n' : int, |
|
632 | 632 | |
|
633 | 633 | # If hist_access_type is 'search', get cells matching the specified glob |
|
634 | 634 | # pattern (with * and ? as wildcards). |
|
635 | 635 | 'pattern' : str, |
|
636 | 636 | |
|
637 | 637 | # If hist_access_type is 'search' and unique is true, do not |
|
638 | 638 | # include duplicated history. Default is false. |
|
639 | 639 | 'unique' : bool, |
|
640 | 640 | |
|
641 | 641 | } |
|
642 | 642 | |
|
643 | 643 | .. versionadded:: 4.0 |
|
644 | 644 | The key ``unique`` for ``history_request``. |
|
645 | 645 | |
|
646 | 646 | Message type: ``history_reply``:: |
|
647 | 647 | |
|
648 | 648 | content = { |
|
649 | 649 | # A list of 3 tuples, either: |
|
650 | 650 | # (session, line_number, input) or |
|
651 | 651 | # (session, line_number, (input, output)), |
|
652 | 652 | # depending on whether output was False or True, respectively. |
|
653 | 653 | 'history' : list, |
|
654 | 654 | } |
|
655 | 655 | |
|
656 | 656 | |
|
657 | 657 | Connect |
|
658 | 658 | ------- |
|
659 | 659 | |
|
660 | 660 | When a client connects to the request/reply socket of the kernel, it can issue |
|
661 | 661 | a connect request to get basic information about the kernel, such as the ports |
|
662 | 662 | the other ZeroMQ sockets are listening on. This allows clients to only have |
|
663 | 663 | to know about a single port (the shell channel) to connect to a kernel. |
|
664 | 664 | |
|
665 | 665 | Message type: ``connect_request``:: |
|
666 | 666 | |
|
667 | 667 | content = { |
|
668 | 668 | } |
|
669 | 669 | |
|
670 | 670 | Message type: ``connect_reply``:: |
|
671 | 671 | |
|
672 | 672 | content = { |
|
673 | 673 | 'shell_port' : int # The port the shell ROUTER socket is listening on. |
|
674 | 674 | 'iopub_port' : int # The port the PUB socket is listening on. |
|
675 | 675 | 'stdin_port' : int # The port the stdin ROUTER socket is listening on. |
|
676 | 676 | 'hb_port' : int # The port the heartbeat socket is listening on. |
|
677 | 677 | } |
|
678 | 678 | |
|
679 | 679 | |
|
680 | 680 | Kernel info |
|
681 | 681 | ----------- |
|
682 | 682 | |
|
683 | 683 | If a client needs to know what protocol the kernel supports, it can |
|
684 | 684 | ask version number of the messaging protocol supported by the kernel. |
|
685 | 685 | This message can be used to fetch other core information of the |
|
686 | 686 | kernel, including language (e.g., Python), language version number and |
|
687 | 687 | IPython version number. |
|
688 | 688 | |
|
689 | 689 | Message type: ``kernel_info_request``:: |
|
690 | 690 | |
|
691 | 691 | content = { |
|
692 | 692 | } |
|
693 | 693 | |
|
694 | 694 | Message type: ``kernel_info_reply``:: |
|
695 | 695 | |
|
696 | 696 | content = { |
|
697 | 697 | # Version of messaging protocol (mandatory). |
|
698 | 698 | # The first integer indicates major version. It is incremented when |
|
699 | 699 | # there is any backward incompatible change. |
|
700 | 700 | # The second integer indicates minor version. It is incremented when |
|
701 | 701 | # there is any backward compatible change. |
|
702 | 702 | 'protocol_version': [int, int], |
|
703 | 703 | |
|
704 | 704 | # IPython version number (optional). |
|
705 | 705 | # Non-python kernel backend may not have this version number. |
|
706 | 706 | # The last component is an extra field, which may be 'dev' or |
|
707 | 707 | # 'rc1' in development version. It is an empty string for |
|
708 | 708 | # released version. |
|
709 | 709 | 'ipython_version': [int, int, int, str], |
|
710 | 710 | |
|
711 | 711 | # Language version number (mandatory). |
|
712 | 712 | # It is Python version number (e.g., [2, 7, 3]) for the kernel |
|
713 | 713 | # included in IPython. |
|
714 | 714 | 'language_version': [int, ...], |
|
715 | 715 | |
|
716 | 716 | # Programming language in which kernel is implemented (mandatory). |
|
717 | 717 | # Kernel included in IPython returns 'python'. |
|
718 | 718 | 'language': str, |
|
719 | 719 | } |
|
720 | 720 | |
|
721 | 721 | |
|
722 | 722 | Kernel shutdown |
|
723 | 723 | --------------- |
|
724 | 724 | |
|
725 | 725 | The clients can request the kernel to shut itself down; this is used in |
|
726 | 726 | multiple cases: |
|
727 | 727 | |
|
728 | 728 | - when the user chooses to close the client application via a menu or window |
|
729 | 729 | control. |
|
730 | 730 | - when the user types 'exit' or 'quit' (or their uppercase magic equivalents). |
|
731 | 731 | - when the user chooses a GUI method (like the 'Ctrl-C' shortcut in the |
|
732 | 732 | IPythonQt client) to force a kernel restart to get a clean kernel without |
|
733 | 733 | losing client-side state like history or inlined figures. |
|
734 | 734 | |
|
735 | 735 | The client sends a shutdown request to the kernel, and once it receives the |
|
736 | 736 | reply message (which is otherwise empty), it can assume that the kernel has |
|
737 | 737 | completed shutdown safely. |
|
738 | 738 | |
|
739 | 739 | Upon their own shutdown, client applications will typically execute a last |
|
740 | 740 | minute sanity check and forcefully terminate any kernel that is still alive, to |
|
741 | 741 | avoid leaving stray processes in the user's machine. |
|
742 | 742 | |
|
743 | 743 | For both shutdown request and reply, there is no actual content that needs to |
|
744 | 744 | be sent, so the content dict is empty. |
|
745 | 745 | |
|
746 | 746 | Message type: ``shutdown_request``:: |
|
747 | 747 | |
|
748 | 748 | content = { |
|
749 | 749 | 'restart' : bool # whether the shutdown is final, or precedes a restart |
|
750 | 750 | } |
|
751 | 751 | |
|
752 | 752 | Message type: ``shutdown_reply``:: |
|
753 | 753 | |
|
754 | 754 | content = { |
|
755 | 755 | 'restart' : bool # whether the shutdown is final, or precedes a restart |
|
756 | 756 | } |
|
757 | 757 | |
|
758 | 758 | .. Note:: |
|
759 | 759 | |
|
760 | 760 | When the clients detect a dead kernel thanks to inactivity on the heartbeat |
|
761 | 761 | socket, they simply send a forceful process termination signal, since a dead |
|
762 | 762 | process is unlikely to respond in any useful way to messages. |
|
763 | 763 | |
|
764 | 764 | |
|
765 | 765 | Messages on the PUB/SUB socket |
|
766 | 766 | ============================== |
|
767 | 767 | |
|
768 | 768 | Streams (stdout, stderr, etc) |
|
769 | 769 | ------------------------------ |
|
770 | 770 | |
|
771 | 771 | Message type: ``stream``:: |
|
772 | 772 | |
|
773 | 773 | content = { |
|
774 | 774 | # The name of the stream is one of 'stdin', 'stdout', 'stderr' |
|
775 | 775 | 'name' : str, |
|
776 | 776 | |
|
777 | 777 | # The data is an arbitrary string to be written to that stream |
|
778 | 778 | 'data' : str, |
|
779 | 779 | } |
|
780 | 780 | |
|
781 | 781 | When a kernel receives a raw_input call, it should also broadcast it on the pub |
|
782 | 782 | socket with the names 'stdin' and 'stdin_reply'. This will allow other clients |
|
783 | 783 | to monitor/display kernel interactions and possibly replay them to their user |
|
784 | 784 | or otherwise expose them. |
|
785 | 785 | |
|
786 | 786 | Display Data |
|
787 | 787 | ------------ |
|
788 | 788 | |
|
789 | 789 | This type of message is used to bring back data that should be diplayed (text, |
|
790 | 790 | html, svg, etc.) in the frontends. This data is published to all frontends. |
|
791 | 791 | Each message can have multiple representations of the data; it is up to the |
|
792 | 792 | frontend to decide which to use and how. A single message should contain all |
|
793 | 793 | possible representations of the same information. Each representation should |
|
794 | 794 | be a JSON'able data structure, and should be a valid MIME type. |
|
795 | 795 | |
|
796 | 796 | Some questions remain about this design: |
|
797 | 797 | |
|
798 | 798 | * Do we use this message type for pyout/displayhook? Probably not, because |
|
799 | 799 | the displayhook also has to handle the Out prompt display. On the other hand |
|
800 | 800 | we could put that information into the metadata secion. |
|
801 | 801 | |
|
802 | 802 | Message type: ``display_data``:: |
|
803 | 803 | |
|
804 | 804 | content = { |
|
805 | 805 | |
|
806 | 806 | # Who create the data |
|
807 | 807 | 'source' : str, |
|
808 | 808 | |
|
809 | 809 | # The data dict contains key/value pairs, where the kids are MIME |
|
810 | 810 | # types and the values are the raw data of the representation in that |
|
811 | 811 | # format. The data dict must minimally contain the ``text/plain`` |
|
812 | 812 | # MIME type which is used as a backup representation. |
|
813 | 813 | 'data' : dict, |
|
814 | 814 | |
|
815 | 815 | # Any metadata that describes the data |
|
816 | 816 | 'metadata' : dict |
|
817 | 817 | } |
|
818 | 818 | |
|
819 | 819 | |
|
820 | 820 | Raw Data Publication |
|
821 | 821 | -------------------- |
|
822 | 822 | |
|
823 | 823 | ``display_data`` lets you publish *representations* of data, such as images and html. |
|
824 | 824 | This ``data_pub`` message lets you publish *actual raw data*, sent via message buffers. |
|
825 | 825 | |
|
826 | 826 | data_pub messages are constructed via the :func:`IPython.lib.datapub.publish_data` function: |
|
827 | 827 | |
|
828 | 828 | .. sourcecode:: python |
|
829 | 829 | |
|
830 | from IPython.zmq.datapub import publish_data | |
|
830 | from IPython.kernel.zmq.datapub import publish_data | |
|
831 | 831 | ns = dict(x=my_array) |
|
832 | 832 | publish_data(ns) |
|
833 | 833 | |
|
834 | 834 | |
|
835 | 835 | Message type: ``data_pub``:: |
|
836 | 836 | |
|
837 | 837 | content = { |
|
838 | 838 | # the keys of the data dict, after it has been unserialized |
|
839 | 839 | keys = ['a', 'b'] |
|
840 | 840 | } |
|
841 | 841 | # the namespace dict will be serialized in the message buffers, |
|
842 | 842 | # which will have a length of at least one |
|
843 | 843 | buffers = ['pdict', ...] |
|
844 | 844 | |
|
845 | 845 | |
|
846 | 846 | The interpretation of a sequence of data_pub messages for a given parent request should be |
|
847 | 847 | to update a single namespace with subsequent results. |
|
848 | 848 | |
|
849 | 849 | .. note:: |
|
850 | 850 | |
|
851 | 851 | No frontends directly handle data_pub messages at this time. |
|
852 | 852 | It is currently only used by the client/engines in :mod:`IPython.parallel`, |
|
853 | 853 | where engines may publish *data* to the Client, |
|
854 | 854 | of which the Client can then publish *representations* via ``display_data`` |
|
855 | 855 | to various frontends. |
|
856 | 856 | |
|
857 | 857 | Python inputs |
|
858 | 858 | ------------- |
|
859 | 859 | |
|
860 | 860 | These messages are the re-broadcast of the ``execute_request``. |
|
861 | 861 | |
|
862 | 862 | Message type: ``pyin``:: |
|
863 | 863 | |
|
864 | 864 | content = { |
|
865 | 865 | 'code' : str, # Source code to be executed, one or more lines |
|
866 | 866 | |
|
867 | 867 | # The counter for this execution is also provided so that clients can |
|
868 | 868 | # display it, since IPython automatically creates variables called _iN |
|
869 | 869 | # (for input prompt In[N]). |
|
870 | 870 | 'execution_count' : int |
|
871 | 871 | } |
|
872 | 872 | |
|
873 | 873 | Python outputs |
|
874 | 874 | -------------- |
|
875 | 875 | |
|
876 | 876 | When Python produces output from code that has been compiled in with the |
|
877 | 877 | 'single' flag to :func:`compile`, any expression that produces a value (such as |
|
878 | 878 | ``1+1``) is passed to ``sys.displayhook``, which is a callable that can do with |
|
879 | 879 | this value whatever it wants. The default behavior of ``sys.displayhook`` in |
|
880 | 880 | the Python interactive prompt is to print to ``sys.stdout`` the :func:`repr` of |
|
881 | 881 | the value as long as it is not ``None`` (which isn't printed at all). In our |
|
882 | 882 | case, the kernel instantiates as ``sys.displayhook`` an object which has |
|
883 | 883 | similar behavior, but which instead of printing to stdout, broadcasts these |
|
884 | 884 | values as ``pyout`` messages for clients to display appropriately. |
|
885 | 885 | |
|
886 | 886 | IPython's displayhook can handle multiple simultaneous formats depending on its |
|
887 | 887 | configuration. The default pretty-printed repr text is always given with the |
|
888 | 888 | ``data`` entry in this message. Any other formats are provided in the |
|
889 | 889 | ``extra_formats`` list. Frontends are free to display any or all of these |
|
890 | 890 | according to its capabilities. ``extra_formats`` list contains 3-tuples of an ID |
|
891 | 891 | string, a type string, and the data. The ID is unique to the formatter |
|
892 | 892 | implementation that created the data. Frontends will typically ignore the ID |
|
893 | 893 | unless if it has requested a particular formatter. The type string tells the |
|
894 | 894 | frontend how to interpret the data. It is often, but not always a MIME type. |
|
895 | 895 | Frontends should ignore types that it does not understand. The data itself is |
|
896 | 896 | any JSON object and depends on the format. It is often, but not always a string. |
|
897 | 897 | |
|
898 | 898 | Message type: ``pyout``:: |
|
899 | 899 | |
|
900 | 900 | content = { |
|
901 | 901 | |
|
902 | 902 | # The counter for this execution is also provided so that clients can |
|
903 | 903 | # display it, since IPython automatically creates variables called _N |
|
904 | 904 | # (for prompt N). |
|
905 | 905 | 'execution_count' : int, |
|
906 | 906 | |
|
907 | 907 | # The data dict contains key/value pairs, where the kids are MIME |
|
908 | 908 | # types and the values are the raw data of the representation in that |
|
909 | 909 | # format. The data dict must minimally contain the ``text/plain`` |
|
910 | 910 | # MIME type which is used as a backup representation. |
|
911 | 911 | 'data' : dict, |
|
912 | 912 | |
|
913 | 913 | } |
|
914 | 914 | |
|
915 | 915 | Python errors |
|
916 | 916 | ------------- |
|
917 | 917 | |
|
918 | 918 | When an error occurs during code execution |
|
919 | 919 | |
|
920 | 920 | Message type: ``pyerr``:: |
|
921 | 921 | |
|
922 | 922 | content = { |
|
923 | 923 | # Similar content to the execute_reply messages for the 'error' case, |
|
924 | 924 | # except the 'status' field is omitted. |
|
925 | 925 | } |
|
926 | 926 | |
|
927 | 927 | Kernel status |
|
928 | 928 | ------------- |
|
929 | 929 | |
|
930 | 930 | This message type is used by frontends to monitor the status of the kernel. |
|
931 | 931 | |
|
932 | 932 | Message type: ``status``:: |
|
933 | 933 | |
|
934 | 934 | content = { |
|
935 | 935 | # When the kernel starts to execute code, it will enter the 'busy' |
|
936 | 936 | # state and when it finishes, it will enter the 'idle' state. |
|
937 | 937 | execution_state : ('busy', 'idle') |
|
938 | 938 | } |
|
939 | 939 | |
|
940 | 940 | Kernel crashes |
|
941 | 941 | -------------- |
|
942 | 942 | |
|
943 | 943 | When the kernel has an unexpected exception, caught by the last-resort |
|
944 | 944 | sys.excepthook, we should broadcast the crash handler's output before exiting. |
|
945 | 945 | This will allow clients to notice that a kernel died, inform the user and |
|
946 | 946 | propose further actions. |
|
947 | 947 | |
|
948 | 948 | Message type: ``crash``:: |
|
949 | 949 | |
|
950 | 950 | content = { |
|
951 | 951 | # Similarly to the 'error' case for execute_reply messages, this will |
|
952 | 952 | # contain ename, etype and traceback fields. |
|
953 | 953 | |
|
954 | 954 | # An additional field with supplementary information such as where to |
|
955 | 955 | # send the crash message |
|
956 | 956 | 'info' : str, |
|
957 | 957 | } |
|
958 | 958 | |
|
959 | 959 | |
|
960 | 960 | Future ideas |
|
961 | 961 | ------------ |
|
962 | 962 | |
|
963 | 963 | Other potential message types, currently unimplemented, listed below as ideas. |
|
964 | 964 | |
|
965 | 965 | Message type: ``file``:: |
|
966 | 966 | |
|
967 | 967 | content = { |
|
968 | 968 | 'path' : 'cool.jpg', |
|
969 | 969 | 'mimetype' : str, |
|
970 | 970 | 'data' : str, |
|
971 | 971 | } |
|
972 | 972 | |
|
973 | 973 | |
|
974 | 974 | Messages on the stdin ROUTER/DEALER sockets |
|
975 | 975 | =========================================== |
|
976 | 976 | |
|
977 | 977 | This is a socket where the request/reply pattern goes in the opposite direction: |
|
978 | 978 | from the kernel to a *single* frontend, and its purpose is to allow |
|
979 | 979 | ``raw_input`` and similar operations that read from ``sys.stdin`` on the kernel |
|
980 | 980 | to be fulfilled by the client. The request should be made to the frontend that |
|
981 | 981 | made the execution request that prompted ``raw_input`` to be called. For now we |
|
982 | 982 | will keep these messages as simple as possible, since they only mean to convey |
|
983 | 983 | the ``raw_input(prompt)`` call. |
|
984 | 984 | |
|
985 | 985 | Message type: ``input_request``:: |
|
986 | 986 | |
|
987 | 987 | content = { 'prompt' : str } |
|
988 | 988 | |
|
989 | 989 | Message type: ``input_reply``:: |
|
990 | 990 | |
|
991 | 991 | content = { 'value' : str } |
|
992 | 992 | |
|
993 | 993 | .. Note:: |
|
994 | 994 | |
|
995 | 995 | We do not explicitly try to forward the raw ``sys.stdin`` object, because in |
|
996 | 996 | practice the kernel should behave like an interactive program. When a |
|
997 | 997 | program is opened on the console, the keyboard effectively takes over the |
|
998 | 998 | ``stdin`` file descriptor, and it can't be used for raw reading anymore. |
|
999 | 999 | Since the IPython kernel effectively behaves like a console program (albeit |
|
1000 | 1000 | one whose "keyboard" is actually living in a separate process and |
|
1001 | 1001 | transported over the zmq connection), raw ``stdin`` isn't expected to be |
|
1002 | 1002 | available. |
|
1003 | 1003 | |
|
1004 | 1004 | |
|
1005 | 1005 | Heartbeat for kernels |
|
1006 | 1006 | ===================== |
|
1007 | 1007 | |
|
1008 | 1008 | Initially we had considered using messages like those above over ZMQ for a |
|
1009 | 1009 | kernel 'heartbeat' (a way to detect quickly and reliably whether a kernel is |
|
1010 | 1010 | alive at all, even if it may be busy executing user code). But this has the |
|
1011 | 1011 | problem that if the kernel is locked inside extension code, it wouldn't execute |
|
1012 | 1012 | the python heartbeat code. But it turns out that we can implement a basic |
|
1013 | 1013 | heartbeat with pure ZMQ, without using any Python messaging at all. |
|
1014 | 1014 | |
|
1015 | 1015 | The monitor sends out a single zmq message (right now, it is a str of the |
|
1016 | 1016 | monitor's lifetime in seconds), and gets the same message right back, prefixed |
|
1017 | 1017 | with the zmq identity of the DEALER socket in the heartbeat process. This can be |
|
1018 | 1018 | a uuid, or even a full message, but there doesn't seem to be a need for packing |
|
1019 | 1019 | up a message when the sender and receiver are the exact same Python object. |
|
1020 | 1020 | |
|
1021 | 1021 | The model is this:: |
|
1022 | 1022 | |
|
1023 | 1023 | monitor.send(str(self.lifetime)) # '1.2345678910' |
|
1024 | 1024 | |
|
1025 | 1025 | and the monitor receives some number of messages of the form:: |
|
1026 | 1026 | |
|
1027 | 1027 | ['uuid-abcd-dead-beef', '1.2345678910'] |
|
1028 | 1028 | |
|
1029 | 1029 | where the first part is the zmq.IDENTITY of the heart's DEALER on the engine, and |
|
1030 | 1030 | the rest is the message sent by the monitor. No Python code ever has any |
|
1031 | 1031 | access to the message between the monitor's send, and the monitor's recv. |
|
1032 | 1032 | |
|
1033 | 1033 | |
|
1034 | 1034 | ToDo |
|
1035 | 1035 | ==== |
|
1036 | 1036 | |
|
1037 | 1037 | Missing things include: |
|
1038 | 1038 | |
|
1039 | 1039 | * Important: finish thinking through the payload concept and API. |
|
1040 | 1040 | |
|
1041 | 1041 | * Important: ensure that we have a good solution for magics like %edit. It's |
|
1042 | 1042 | likely that with the payload concept we can build a full solution, but not |
|
1043 | 1043 | 100% clear yet. |
|
1044 | 1044 | |
|
1045 | 1045 | * Finishing the details of the heartbeat protocol. |
|
1046 | 1046 | |
|
1047 | 1047 | * Signal handling: specify what kind of information kernel should broadcast (or |
|
1048 | 1048 | not) when it receives signals. |
|
1049 | 1049 | |
|
1050 | 1050 | .. include:: ../links.rst |
@@ -1,367 +1,367 b'' | |||
|
1 | 1 | .. _parallel_messages: |
|
2 | 2 | |
|
3 | 3 | Messaging for Parallel Computing |
|
4 | 4 | ================================ |
|
5 | 5 | |
|
6 | 6 | This is an extension of the :ref:`messaging <messaging>` doc. Diagrams of the connections |
|
7 | 7 | can be found in the :ref:`parallel connections <parallel_connections>` doc. |
|
8 | 8 | |
|
9 | 9 | |
|
10 | 10 | ZMQ messaging is also used in the parallel computing IPython system. All messages to/from |
|
11 | 11 | kernels remain the same as the single kernel model, and are forwarded through a ZMQ Queue |
|
12 | 12 | device. The controller receives all messages and replies in these channels, and saves |
|
13 | 13 | results for future use. |
|
14 | 14 | |
|
15 | 15 | The Controller |
|
16 | 16 | -------------- |
|
17 | 17 | |
|
18 | 18 | The controller is the central collection of processes in the IPython parallel computing |
|
19 | 19 | model. It has two major components: |
|
20 | 20 | |
|
21 | 21 | * The Hub |
|
22 | 22 | * A collection of Schedulers |
|
23 | 23 | |
|
24 | 24 | The Hub |
|
25 | 25 | ------- |
|
26 | 26 | |
|
27 | 27 | The Hub is the central process for monitoring the state of the engines, and all task |
|
28 | 28 | requests and results. It has no role in execution and does no relay of messages, so |
|
29 | 29 | large blocking requests or database actions in the Hub do not have the ability to impede |
|
30 | 30 | job submission and results. |
|
31 | 31 | |
|
32 | 32 | Registration (``ROUTER``) |
|
33 | 33 | ************************* |
|
34 | 34 | |
|
35 | 35 | The first function of the Hub is to facilitate and monitor connections of clients |
|
36 | 36 | and engines. Both client and engine registration are handled by the same socket, so only |
|
37 | 37 | one ip/port pair is needed to connect any number of connections and clients. |
|
38 | 38 | |
|
39 | 39 | Engines register with the ``zmq.IDENTITY`` of their two ``DEALER`` sockets, one for the |
|
40 | 40 | queue, which receives execute requests, and one for the heartbeat, which is used to |
|
41 | 41 | monitor the survival of the Engine process. |
|
42 | 42 | |
|
43 | 43 | Message type: ``registration_request``:: |
|
44 | 44 | |
|
45 | 45 | content = { |
|
46 | 46 | 'uuid' : 'abcd-1234-...', # the zmq.IDENTITY of the engine's sockets |
|
47 | 47 | } |
|
48 | 48 | |
|
49 | 49 | .. note:: |
|
50 | 50 | |
|
51 | 51 | these are always the same, at least for now. |
|
52 | 52 | |
|
53 | 53 | The Controller replies to an Engine's registration request with the engine's integer ID, |
|
54 | 54 | and all the remaining connection information for connecting the heartbeat process, and |
|
55 | 55 | kernel queue socket(s). The message status will be an error if the Engine requests IDs that |
|
56 | 56 | already in use. |
|
57 | 57 | |
|
58 | 58 | Message type: ``registration_reply``:: |
|
59 | 59 | |
|
60 | 60 | content = { |
|
61 | 61 | 'status' : 'ok', # or 'error' |
|
62 | 62 | # if ok: |
|
63 | 63 | 'id' : 0, # int, the engine id |
|
64 | 64 | } |
|
65 | 65 | |
|
66 | 66 | Clients use the same socket as engines to start their connections. Connection requests |
|
67 | 67 | from clients need no information: |
|
68 | 68 | |
|
69 | 69 | Message type: ``connection_request``:: |
|
70 | 70 | |
|
71 | 71 | content = {} |
|
72 | 72 | |
|
73 | 73 | The reply to a Client registration request contains the connection information for the |
|
74 | 74 | multiplexer and load balanced queues, as well as the address for direct hub |
|
75 | 75 | queries. If any of these addresses is `None`, that functionality is not available. |
|
76 | 76 | |
|
77 | 77 | Message type: ``connection_reply``:: |
|
78 | 78 | |
|
79 | 79 | content = { |
|
80 | 80 | 'status' : 'ok', # or 'error' |
|
81 | 81 | } |
|
82 | 82 | |
|
83 | 83 | Heartbeat |
|
84 | 84 | ********* |
|
85 | 85 | |
|
86 | 86 | The hub uses a heartbeat system to monitor engines, and track when they become |
|
87 | 87 | unresponsive. As described in :ref:`messaging <messaging>`, and shown in :ref:`connections |
|
88 | 88 | <parallel_connections>`. |
|
89 | 89 | |
|
90 | 90 | Notification (``PUB``) |
|
91 | 91 | ********************** |
|
92 | 92 | |
|
93 | 93 | The hub publishes all engine registration/unregistration events on a ``PUB`` socket. |
|
94 | 94 | This allows clients to have up-to-date engine ID sets without polling. Registration |
|
95 | 95 | notifications contain both the integer engine ID and the queue ID, which is necessary for |
|
96 | 96 | sending messages via the Multiplexer Queue and Control Queues. |
|
97 | 97 | |
|
98 | 98 | Message type: ``registration_notification``:: |
|
99 | 99 | |
|
100 | 100 | content = { |
|
101 | 101 | 'id' : 0, # engine ID that has been registered |
|
102 | 102 | 'uuid' : 'engine_id' # the IDENT for the engine's sockets |
|
103 | 103 | } |
|
104 | 104 | |
|
105 | 105 | Message type : ``unregistration_notification``:: |
|
106 | 106 | |
|
107 | 107 | content = { |
|
108 | 108 | 'id' : 0 # engine ID that has been unregistered |
|
109 | 109 | 'uuid' : 'engine_id' # the IDENT for the engine's sockets |
|
110 | 110 | } |
|
111 | 111 | |
|
112 | 112 | |
|
113 | 113 | Client Queries (``ROUTER``) |
|
114 | 114 | *************************** |
|
115 | 115 | |
|
116 | 116 | The hub monitors and logs all queue traffic, so that clients can retrieve past |
|
117 | 117 | results or monitor pending tasks. This information may reside in-memory on the Hub, or |
|
118 | 118 | on disk in a database (SQLite and MongoDB are currently supported). These requests are |
|
119 | 119 | handled by the same socket as registration. |
|
120 | 120 | |
|
121 | 121 | |
|
122 | 122 | :func:`queue_request` requests can specify multiple engines to query via the `targets` |
|
123 | 123 | element. A verbose flag can be passed, to determine whether the result should be the list |
|
124 | 124 | of `msg_ids` in the queue or simply the length of each list. |
|
125 | 125 | |
|
126 | 126 | Message type: ``queue_request``:: |
|
127 | 127 | |
|
128 | 128 | content = { |
|
129 | 129 | 'verbose' : True, # whether return should be lists themselves or just lens |
|
130 | 130 | 'targets' : [0,3,1] # list of ints |
|
131 | 131 | } |
|
132 | 132 | |
|
133 | 133 | The content of a reply to a :func:`queue_request` request is a dict, keyed by the engine |
|
134 | 134 | IDs. Note that they will be the string representation of the integer keys, since JSON |
|
135 | 135 | cannot handle number keys. The three keys of each dict are:: |
|
136 | 136 | |
|
137 | 137 | 'completed' : messages submitted via any queue that ran on the engine |
|
138 | 138 | 'queue' : jobs submitted via MUX queue, whose results have not been received |
|
139 | 139 | 'tasks' : tasks that are known to have been submitted to the engine, but |
|
140 | 140 | have not completed. Note that with the pure zmq scheduler, this will |
|
141 | 141 | always be 0/[]. |
|
142 | 142 | |
|
143 | 143 | Message type: ``queue_reply``:: |
|
144 | 144 | |
|
145 | 145 | content = { |
|
146 | 146 | 'status' : 'ok', # or 'error' |
|
147 | 147 | # if verbose=False: |
|
148 | 148 | '0' : {'completed' : 1, 'queue' : 7, 'tasks' : 0}, |
|
149 | 149 | # if verbose=True: |
|
150 | 150 | '1' : {'completed' : ['abcd-...','1234-...'], 'queue' : ['58008-'], 'tasks' : []}, |
|
151 | 151 | } |
|
152 | 152 | |
|
153 | 153 | Clients can request individual results directly from the hub. This is primarily for |
|
154 | 154 | gathering results of executions not submitted by the requesting client, as the client |
|
155 | 155 | will have all its own results already. Requests are made by msg_id, and can contain one or |
|
156 | 156 | more msg_id. An additional boolean key 'statusonly' can be used to not request the |
|
157 | 157 | results, but simply poll the status of the jobs. |
|
158 | 158 | |
|
159 | 159 | Message type: ``result_request``:: |
|
160 | 160 | |
|
161 | 161 | content = { |
|
162 | 162 | 'msg_ids' : ['uuid','...'], # list of strs |
|
163 | 163 | 'targets' : [1,2,3], # list of int ids or uuids |
|
164 | 164 | 'statusonly' : False, # bool |
|
165 | 165 | } |
|
166 | 166 | |
|
167 | 167 | The :func:`result_request` reply contains the content objects of the actual execution |
|
168 | 168 | reply messages. If `statusonly=True`, then there will be only the 'pending' and |
|
169 | 169 | 'completed' lists. |
|
170 | 170 | |
|
171 | 171 | |
|
172 | 172 | Message type: ``result_reply``:: |
|
173 | 173 | |
|
174 | 174 | content = { |
|
175 | 175 | 'status' : 'ok', # else error |
|
176 | 176 | # if ok: |
|
177 | 177 | 'acbd-...' : msg, # the content dict is keyed by msg_ids, |
|
178 | 178 | # values are the result messages |
|
179 | 179 | # there will be none of these if `statusonly=True` |
|
180 | 180 | 'pending' : ['msg_id','...'], # msg_ids still pending |
|
181 | 181 | 'completed' : ['msg_id','...'], # list of completed msg_ids |
|
182 | 182 | } |
|
183 | 183 | buffers = ['bufs','...'] # the buffers that contained the results of the objects. |
|
184 | 184 | # this will be empty if no messages are complete, or if |
|
185 | 185 | # statusonly is True. |
|
186 | 186 | |
|
187 | 187 | For memory management purposes, Clients can also instruct the hub to forget the |
|
188 | 188 | results of messages. This can be done by message ID or engine ID. Individual messages are |
|
189 | 189 | dropped by msg_id, and all messages completed on an engine are dropped by engine ID. This |
|
190 | 190 | may no longer be necessary with the mongodb-based message logging backend. |
|
191 | 191 | |
|
192 | 192 | If the msg_ids element is the string ``'all'`` instead of a list, then all completed |
|
193 | 193 | results are forgotten. |
|
194 | 194 | |
|
195 | 195 | Message type: ``purge_request``:: |
|
196 | 196 | |
|
197 | 197 | content = { |
|
198 | 198 | 'msg_ids' : ['id1', 'id2',...], # list of msg_ids or 'all' |
|
199 | 199 | 'engine_ids' : [0,2,4] # list of engine IDs |
|
200 | 200 | } |
|
201 | 201 | |
|
202 | 202 | The reply to a purge request is simply the status 'ok' if the request succeeded, or an |
|
203 | 203 | explanation of why it failed, such as requesting the purge of a nonexistent or pending |
|
204 | 204 | message. |
|
205 | 205 | |
|
206 | 206 | Message type: ``purge_reply``:: |
|
207 | 207 | |
|
208 | 208 | content = { |
|
209 | 209 | 'status' : 'ok', # or 'error' |
|
210 | 210 | } |
|
211 | 211 | |
|
212 | 212 | |
|
213 | 213 | Schedulers |
|
214 | 214 | ---------- |
|
215 | 215 | |
|
216 | 216 | There are three basic schedulers: |
|
217 | 217 | |
|
218 | 218 | * Task Scheduler |
|
219 | 219 | * MUX Scheduler |
|
220 | 220 | * Control Scheduler |
|
221 | 221 | |
|
222 | 222 | The MUX and Control schedulers are simple MonitoredQueue ØMQ devices, with ``ROUTER`` |
|
223 | 223 | sockets on either side. This allows the queue to relay individual messages to particular |
|
224 | 224 | targets via ``zmq.IDENTITY`` routing. The Task scheduler may be a MonitoredQueue ØMQ |
|
225 | 225 | device, in which case the client-facing socket is ``ROUTER``, and the engine-facing socket |
|
226 | 226 | is ``DEALER``. The result of this is that client-submitted messages are load-balanced via |
|
227 | 227 | the ``DEALER`` socket, but the engine's replies to each message go to the requesting client. |
|
228 | 228 | |
|
229 | 229 | Raw ``DEALER`` scheduling is quite primitive, and doesn't allow message introspection, so |
|
230 | 230 | there are also Python Schedulers that can be used. These Schedulers behave in much the |
|
231 | 231 | same way as a MonitoredQueue does from the outside, but have rich internal logic to |
|
232 | 232 | determine destinations, as well as handle dependency graphs Their sockets are always |
|
233 | 233 | ``ROUTER`` on both sides. |
|
234 | 234 | |
|
235 | 235 | The Python task schedulers have an additional message type, which informs the Hub of |
|
236 | 236 | the destination of a task as soon as that destination is known. |
|
237 | 237 | |
|
238 | 238 | Message type: ``task_destination``:: |
|
239 | 239 | |
|
240 | 240 | content = { |
|
241 | 241 | 'msg_id' : 'abcd-1234-...', # the msg's uuid |
|
242 | 242 | 'engine_id' : '1234-abcd-...', # the destination engine's zmq.IDENTITY |
|
243 | 243 | } |
|
244 | 244 | |
|
245 | 245 | :func:`apply` |
|
246 | 246 | ************* |
|
247 | 247 | |
|
248 | 248 | In terms of message classes, the MUX scheduler and Task scheduler relay the exact same |
|
249 | 249 | message types. Their only difference lies in how the destination is selected. |
|
250 | 250 | |
|
251 | 251 | The `Namespace <http://gist.github.com/483294>`_ model suggests that execution be able to |
|
252 | 252 | use the model:: |
|
253 | 253 | |
|
254 | 254 | ns.apply(f, *args, **kwargs) |
|
255 | 255 | |
|
256 | 256 | which takes `f`, a function in the user's namespace, and executes ``f(*args, **kwargs)`` |
|
257 | 257 | on a remote engine, returning the result (or, for non-blocking, information facilitating |
|
258 | 258 | later retrieval of the result). This model, unlike the execute message which just uses a |
|
259 | 259 | code string, must be able to send arbitrary (pickleable) Python objects. And ideally, copy |
|
260 | 260 | as little data as we can. The `buffers` property of a Message was introduced for this |
|
261 | 261 | purpose. |
|
262 | 262 | |
|
263 | Utility method :func:`build_apply_message` in :mod:`IPython.zmq.serialize` wraps a | |
|
263 | Utility method :func:`build_apply_message` in :mod:`IPython.kernel.zmq.serialize` wraps a | |
|
264 | 264 | function signature and builds a sendable buffer format for minimal data copying (exactly |
|
265 | 265 | zero copies of numpy array data or buffers or large strings). |
|
266 | 266 | |
|
267 | 267 | Message type: ``apply_request``:: |
|
268 | 268 | |
|
269 | 269 | metadata = { |
|
270 | 270 | 'after' : ['msg_id',...], # list of msg_ids or output of Dependency.as_dict() |
|
271 | 271 | 'follow' : ['msg_id',...], # list of msg_ids or output of Dependency.as_dict() |
|
272 | 272 | } |
|
273 | 273 | content = {} |
|
274 | 274 | buffers = ['...'] # at least 3 in length |
|
275 | 275 | # as built by build_apply_message(f,args,kwargs) |
|
276 | 276 | |
|
277 | 277 | after/follow represent task dependencies. 'after' corresponds to a time dependency. The |
|
278 | 278 | request will not arrive at an engine until the 'after' dependency tasks have completed. |
|
279 | 279 | 'follow' corresponds to a location dependency. The task will be submitted to the same |
|
280 | 280 | engine as these msg_ids (see :class:`Dependency` docs for details). |
|
281 | 281 | |
|
282 | 282 | Message type: ``apply_reply``:: |
|
283 | 283 | |
|
284 | 284 | content = { |
|
285 | 285 | 'status' : 'ok' # 'ok' or 'error' |
|
286 | 286 | # other error info here, as in other messages |
|
287 | 287 | } |
|
288 | 288 | buffers = ['...'] # either 1 or 2 in length |
|
289 | 289 | # a serialization of the return value of f(*args,**kwargs) |
|
290 | 290 | # only populated if status is 'ok' |
|
291 | 291 | |
|
292 | 292 | All engine execution and data movement is performed via apply messages. |
|
293 | 293 | |
|
294 | 294 | Control Messages |
|
295 | 295 | ---------------- |
|
296 | 296 | |
|
297 | 297 | Messages that interact with the engines, but are not meant to execute code, are submitted |
|
298 | 298 | via the Control queue. These messages have high priority, and are thus received and |
|
299 | 299 | handled before any execution requests. |
|
300 | 300 | |
|
301 | 301 | Clients may want to clear the namespace on the engine. There are no arguments nor |
|
302 | 302 | information involved in this request, so the content is empty. |
|
303 | 303 | |
|
304 | 304 | Message type: ``clear_request``:: |
|
305 | 305 | |
|
306 | 306 | content = {} |
|
307 | 307 | |
|
308 | 308 | Message type: ``clear_reply``:: |
|
309 | 309 | |
|
310 | 310 | content = { |
|
311 | 311 | 'status' : 'ok' # 'ok' or 'error' |
|
312 | 312 | # other error info here, as in other messages |
|
313 | 313 | } |
|
314 | 314 | |
|
315 | 315 | Clients may want to abort tasks that have not yet run. This can by done by message id, or |
|
316 | 316 | all enqueued messages can be aborted if None is specified. |
|
317 | 317 | |
|
318 | 318 | Message type: ``abort_request``:: |
|
319 | 319 | |
|
320 | 320 | content = { |
|
321 | 321 | 'msg_ids' : ['1234-...', '...'] # list of msg_ids or None |
|
322 | 322 | } |
|
323 | 323 | |
|
324 | 324 | Message type: ``abort_reply``:: |
|
325 | 325 | |
|
326 | 326 | content = { |
|
327 | 327 | 'status' : 'ok' # 'ok' or 'error' |
|
328 | 328 | # other error info here, as in other messages |
|
329 | 329 | } |
|
330 | 330 | |
|
331 | 331 | The last action a client may want to do is shutdown the kernel. If a kernel receives a |
|
332 | 332 | shutdown request, then it aborts all queued messages, replies to the request, and exits. |
|
333 | 333 | |
|
334 | 334 | Message type: ``shutdown_request``:: |
|
335 | 335 | |
|
336 | 336 | content = {} |
|
337 | 337 | |
|
338 | 338 | Message type: ``shutdown_reply``:: |
|
339 | 339 | |
|
340 | 340 | content = { |
|
341 | 341 | 'status' : 'ok' # 'ok' or 'error' |
|
342 | 342 | # other error info here, as in other messages |
|
343 | 343 | } |
|
344 | 344 | |
|
345 | 345 | |
|
346 | 346 | Implementation |
|
347 | 347 | -------------- |
|
348 | 348 | |
|
349 | 349 | There are a few differences in implementation between the `StreamSession` object used in |
|
350 | 350 | the newparallel branch and the `Session` object, the main one being that messages are |
|
351 | 351 | sent in parts, rather than as a single serialized object. `StreamSession` objects also |
|
352 | 352 | take pack/unpack functions, which are to be used when serializing/deserializing objects. |
|
353 | 353 | These can be any functions that translate to/from formats that ZMQ sockets can send |
|
354 | 354 | (buffers,bytes, etc.). |
|
355 | 355 | |
|
356 | 356 | Split Sends |
|
357 | 357 | *********** |
|
358 | 358 | |
|
359 | 359 | Previously, messages were bundled as a single json object and one call to |
|
360 | 360 | :func:`socket.send_json`. Since the hub inspects all messages, and doesn't need to |
|
361 | 361 | see the content of the messages, which can be large, messages are now serialized and sent in |
|
362 | 362 | pieces. All messages are sent in at least 4 parts: the header, the parent header, the metadata and the content. |
|
363 | 363 | This allows the controller to unpack and inspect the (always small) header, |
|
364 | 364 | without spending time unpacking the content unless the message is bound for the |
|
365 | 365 | controller. Buffers are added on to the end of the message, and can be any objects that |
|
366 | 366 | present the buffer interface. |
|
367 | 367 |
@@ -1,85 +1,85 b'' | |||
|
1 | 1 | .. _module_reorg: |
|
2 | 2 | |
|
3 | 3 | =========================== |
|
4 | 4 | IPython module organization |
|
5 | 5 | =========================== |
|
6 | 6 | |
|
7 | 7 | As of the 0.11 release of IPython, the top-level packages and modules have |
|
8 | 8 | been completely reorganized. This section describes the purpose of the |
|
9 | 9 | top-level IPython subpackages. |
|
10 | 10 | |
|
11 | 11 | Subpackage descriptions |
|
12 | 12 | ======================= |
|
13 | 13 | |
|
14 | 14 | * :mod:`IPython.config`. This package contains the :ref:`configuration system |
|
15 | 15 | <config_index>` of IPython, as well as default configuration files for the |
|
16 | 16 | different IPython applications. |
|
17 | 17 | |
|
18 | 18 | * :mod:`IPython.core`. This sub-package contains the core of the IPython |
|
19 | 19 | interpreter, but none of its extended capabilities. |
|
20 | 20 | |
|
21 | 21 | * :mod:`IPython.deathrow`. This is for code that is outdated, untested, |
|
22 | 22 | rotting, or that belongs in a separate third party project. Eventually all |
|
23 | 23 | this code will either 1) be revived by someone willing to maintain it with |
|
24 | 24 | tests and docs and re-included into IPython or 2) be removed from IPython |
|
25 | 25 | proper, but put into a separate third-party Python package. No new code will |
|
26 | 26 | be allowed here. If your favorite extension has been moved here please |
|
27 | 27 | contact the IPython developer mailing list to help us determine the best |
|
28 | 28 | course of action. |
|
29 | 29 | |
|
30 | 30 | * :mod:`IPython.extensions`. This package contains fully supported IPython |
|
31 | 31 | extensions. These extensions adhere to the official IPython extension API |
|
32 | 32 | and can be enabled by adding them to a field in the configuration file. |
|
33 | 33 | If your extension is no longer in this location, please look in |
|
34 | 34 | :mod:`IPython.quarantine` and :mod:`IPython.deathrow` and contact the |
|
35 | 35 | IPython developer mailing list. |
|
36 | 36 | |
|
37 | 37 | * :mod:`IPython.external`. This package contains third party packages and |
|
38 | 38 | modules that IPython ships internally to reduce the number of dependencies. |
|
39 | 39 | Usually, these are short, single file modules. |
|
40 | 40 | |
|
41 | 41 | * :mod:`IPython.frontend`. This package contains the various IPython |
|
42 | frontends which communicate with the :mod:`IPython.zmq` kernels (see | |
|
42 | frontends which communicate with the :mod:`IPython.kernel.zmq` kernels (see | |
|
43 | 43 | :ref:`Messaging in IPython <messaging>`). This includes the |
|
44 | 44 | :ref:`ipython notebook <htmlnotebook>`, :ref:`ipython qtconsole |
|
45 | 45 | <qtconsole>`, and :ref:`ipython console <two_process_console>` entry points. |
|
46 | 46 | |
|
47 | 47 | * :mod:`IPython.lib`. IPython has many extended capabilities that are not part |
|
48 | 48 | of the IPython core. These things will go here and in. Modules in this |
|
49 | 49 | package are similar to extensions, but don't adhere to the official |
|
50 | 50 | IPython extension API. |
|
51 | 51 | |
|
52 | 52 | * :mod:`IPython.nbformat`. This package contains code related to reading and |
|
53 | 53 | writing :ref:`IPython Notebook's <htmlnotebook>` file format (`.ipynb` |
|
54 | 54 | files). |
|
55 | 55 | |
|
56 | 56 | * :mod:`IPython.parallel`. This contains :ref:`IPython's parallel computing |
|
57 | 57 | system <parallel_index>`. This previously lived under :mod:`IPython.kernel`, |
|
58 | 58 | but that module has been deprecated. |
|
59 | 59 | |
|
60 | 60 | * :mod:`IPython.quarantine`. This is for code that doesn't meet IPython's |
|
61 | 61 | standards, but that we plan on keeping. To be moved out of this sub-package |
|
62 | 62 | a module needs to have approval of the core IPython developers, tests and |
|
63 | 63 | documentation. If your favorite extension has been moved here please contact |
|
64 | 64 | the IPython developer mailing list to help us determine the best course of |
|
65 | 65 | action. |
|
66 | 66 | |
|
67 | 67 | * :mod:`IPython.scripts`. This package contains a variety of top-level |
|
68 | 68 | command line scripts. Eventually, these should be moved to the |
|
69 | 69 | :file:`scripts` subdirectory of the appropriate IPython subpackage. |
|
70 | 70 | |
|
71 | 71 | * :mod:`IPython.testing`. This package contains code related to the IPython |
|
72 | 72 | test suite, which locates and executes the `tests` submodules of all |
|
73 | 73 | IPython sub-packages. It also contains decorators and utilities relevant for |
|
74 | 74 | testing. |
|
75 | 75 | |
|
76 | 76 | * :mod:`IPython.utils`. This sub-package will contain anything that might |
|
77 | 77 | eventually be found in the Python standard library, like things in |
|
78 | 78 | :mod:`genutils`. Each sub-module in this sub-package should contain |
|
79 | 79 | functions and classes that serve a single purpose and that don't |
|
80 | 80 | depend on things in the rest of IPython. |
|
81 | 81 | |
|
82 |
* :mod:`IPython.zmq`. This sub-package contains code related to starting |
|
|
83 | managing IPython kernels, which :mod:`IPython.frontend` instances can then | |
|
82 | * :mod:`IPython.kernel.zmq`. This sub-package contains code related to starting | |
|
83 | and managing IPython kernels, which :mod:`IPython.frontend` instances can then | |
|
84 | 84 | communicate with (see :ref:`Messaging in IPython <messaging>`). |
|
85 | 85 |
@@ -1,395 +1,395 b'' | |||
|
1 | 1 | Overview |
|
2 | 2 | ======== |
|
3 | 3 | |
|
4 | 4 | This document describes the steps required to install IPython. IPython is |
|
5 | 5 | organized into a number of subpackages, each of which has its own dependencies. |
|
6 | 6 | All of the subpackages come with IPython, so you don't need to download and |
|
7 | 7 | install them separately. However, to use a given subpackage, you will need to |
|
8 | 8 | install all of its dependencies. |
|
9 | 9 | |
|
10 | 10 | Please let us know if you have problems installing IPython or any of its |
|
11 | 11 | dependencies. Officially, IPython requires Python 2.6, 2.7, 3.1, or 3.2. |
|
12 | 12 | |
|
13 | 13 | .. warning:: |
|
14 | 14 | |
|
15 | 15 | Since version 0.11, IPython has a hard syntax dependency on 2.6, and will no |
|
16 | 16 | longer work on Python <= 2.5. You can find older versions of IPython which |
|
17 | 17 | supported Python <= 2.5 `here <http://archive.ipython.org/release/>`_ |
|
18 | 18 | |
|
19 | 19 | Some of the installation approaches use the :mod:`distribute` package and its |
|
20 | 20 | :command:`easy_install` command line program. In many scenarios, this provides |
|
21 | 21 | the most simple method of installing IPython and its dependencies. More |
|
22 | 22 | information about :mod:`distribute` can be found on `its PyPI page |
|
23 | 23 | <http://pypi.python.org/pypi/distribute>`__. |
|
24 | 24 | |
|
25 | 25 | .. note:: |
|
26 | 26 | |
|
27 | 27 | On Windows, IPython has a hard dependency on :mod:`distribute`. We hope to |
|
28 | 28 | change this in the future, but for now on Windows, you *must* install |
|
29 | 29 | :mod:`distribute`. |
|
30 | 30 | |
|
31 | 31 | More general information about installing Python packages can be found in |
|
32 | 32 | `Python's documentation <http://docs.python.org>`_. |
|
33 | 33 | |
|
34 | 34 | |
|
35 | 35 | Quickstart |
|
36 | 36 | ========== |
|
37 | 37 | |
|
38 | 38 | If you have :mod:`distribute` installed and you are on OS X or Linux (not |
|
39 | 39 | Windows), the following will download and install IPython *and* the main |
|
40 | 40 | optional dependencies: |
|
41 | 41 | |
|
42 | 42 | .. code-block:: bash |
|
43 | 43 | |
|
44 | 44 | $ easy_install ipython[zmq,qtconsole,notebook,test] |
|
45 | 45 | |
|
46 | 46 | This will get: |
|
47 | 47 | |
|
48 | 48 | - jinja2, needed for the notebook |
|
49 | 49 | - pyzmq, needed for IPython's parallel computing features, qt console and |
|
50 | 50 | notebook. |
|
51 | 51 | - pygments, used by the Qt console for syntax highlighting. |
|
52 | 52 | - tornado, needed by the web-based notebook |
|
53 | 53 | - nose, used by the test suite. |
|
54 | 54 | |
|
55 | 55 | To run IPython's test suite, use the :command:`iptest` command: |
|
56 | 56 | |
|
57 | 57 | .. code-block:: bash |
|
58 | 58 | |
|
59 | 59 | $ iptest |
|
60 | 60 | |
|
61 | 61 | |
|
62 | 62 | Installing IPython itself |
|
63 | 63 | ========================= |
|
64 | 64 | |
|
65 | 65 | Given a properly built Python, the basic interactive IPython shell will work |
|
66 | 66 | with no external dependencies. However, some Python distributions |
|
67 | 67 | (particularly on Windows and OS X), don't come with a working :mod:`readline` |
|
68 | 68 | module. The IPython shell will work without :mod:`readline`, but will lack |
|
69 | 69 | many features that users depend on, such as tab completion and command line |
|
70 | 70 | editing. If you install IPython with :mod:`distribute`, (e.g. with |
|
71 | 71 | `easy_install`), then the appropriate :mod:`readline` for your platform will be |
|
72 | 72 | installed. See below for details of how to make sure you have a working |
|
73 | 73 | :mod:`readline`. |
|
74 | 74 | |
|
75 | 75 | Installation using easy_install |
|
76 | 76 | ------------------------------- |
|
77 | 77 | |
|
78 | 78 | If you have :mod:`distribute` installed, the easiest way of getting IPython is |
|
79 | 79 | to simply use :command:`easy_install`: |
|
80 | 80 | |
|
81 | 81 | .. code-block:: bash |
|
82 | 82 | |
|
83 | 83 | $ easy_install ipython |
|
84 | 84 | |
|
85 | 85 | That's it. |
|
86 | 86 | |
|
87 | 87 | Installation from source |
|
88 | 88 | ------------------------ |
|
89 | 89 | |
|
90 | 90 | If you don't want to use :command:`easy_install`, or don't have it installed, |
|
91 | 91 | just grab the latest stable build of IPython from `here |
|
92 | 92 | <http://ipython.org/download.html>`_. Then do the following: |
|
93 | 93 | |
|
94 | 94 | .. code-block:: bash |
|
95 | 95 | |
|
96 | 96 | $ tar -xzf ipython.tar.gz |
|
97 | 97 | $ cd ipython |
|
98 | 98 | $ python setup.py install |
|
99 | 99 | |
|
100 | 100 | If you are installing to a location (like ``/usr/local``) that requires higher |
|
101 | 101 | permissions, you may need to run the last command with :command:`sudo`. |
|
102 | 102 | |
|
103 | 103 | Windows |
|
104 | 104 | ------- |
|
105 | 105 | |
|
106 | 106 | As mentioned above, on Windows, IPython requires :mod:`distribute`, and it also |
|
107 | 107 | requires the PyReadline library to properly support coloring and keyboard |
|
108 | 108 | management (features that the default windows console doesn't have). So on |
|
109 | 109 | Windows, the installation procedure is: |
|
110 | 110 | |
|
111 | 111 | 1. Install `distribute <http://pypi.python.org/pypi/distribute>`_. |
|
112 | 112 | |
|
113 | 113 | 2. Install `pyreadline <http://pypi.python.org/pypi/pyreadline>`_. You can use |
|
114 | 114 | the command ``easy_install pyreadline`` from a terminal, or the binary |
|
115 | 115 | installer appropriate for your platform from the PyPI page. |
|
116 | 116 | |
|
117 | 117 | 3. Install IPython itself, which you can download from `PyPI |
|
118 | 118 | <http://pypi.python.org/pypi/ipython>`_ or from `our site |
|
119 | 119 | <http://ipython.org/download.html>`_. Note that on Windows 7, you *must* |
|
120 | 120 | right-click and 'Run as administrator' for the Start menu shortcuts to be |
|
121 | 121 | created. |
|
122 | 122 | |
|
123 | 123 | IPython by default runs in a terminal window, but the normal terminal |
|
124 | 124 | application supplied by Microsoft Windows is very primitive. You may want to |
|
125 | 125 | download the excellent and free Console_ application instead, which is a far |
|
126 | 126 | superior tool. You can even configure Console to give you by default an |
|
127 | 127 | IPython tab, which is very convenient to create new IPython sessions directly |
|
128 | 128 | from the working terminal. |
|
129 | 129 | |
|
130 | 130 | .. _Console: http://sourceforge.net/projects/console |
|
131 | 131 | |
|
132 | 132 | |
|
133 | 133 | Installing the development version |
|
134 | 134 | ---------------------------------- |
|
135 | 135 | |
|
136 | 136 | It is also possible to install the development version of IPython from our |
|
137 | 137 | `Git <http://git-scm.com/>`_ source code repository. To do this you will |
|
138 | 138 | need to have Git installed on your system. Then just do: |
|
139 | 139 | |
|
140 | 140 | .. code-block:: bash |
|
141 | 141 | |
|
142 | 142 | $ git clone https://github.com/ipython/ipython.git |
|
143 | 143 | $ cd ipython |
|
144 | 144 | $ python setup.py install |
|
145 | 145 | |
|
146 | 146 | Some users want to be able to follow the development branch as it changes. If |
|
147 | 147 | you have :mod:`distribute` installed, this is easy. Simply replace the last |
|
148 | 148 | step by: |
|
149 | 149 | |
|
150 | 150 | .. code-block:: bash |
|
151 | 151 | |
|
152 | 152 | $ python setupegg.py develop |
|
153 | 153 | |
|
154 | 154 | This creates links in the right places and installs the command line script to |
|
155 | 155 | the appropriate places. Then, if you want to update your IPython at any time, |
|
156 | 156 | just do: |
|
157 | 157 | |
|
158 | 158 | .. code-block:: bash |
|
159 | 159 | |
|
160 | 160 | $ git pull |
|
161 | 161 | |
|
162 | 162 | |
|
163 | 163 | Basic optional dependencies |
|
164 | 164 | =========================== |
|
165 | 165 | |
|
166 | 166 | There are a number of basic optional dependencies that most users will want to |
|
167 | 167 | get. These are: |
|
168 | 168 | |
|
169 | 169 | * readline (for command line editing, tab completion, etc.) |
|
170 | 170 | * nose (to run the IPython test suite) |
|
171 | 171 | * pexpect (to use things like irunner) |
|
172 | 172 | |
|
173 | 173 | If you are comfortable installing these things yourself, have at it, otherwise |
|
174 | 174 | read on for more details. |
|
175 | 175 | |
|
176 | 176 | readline |
|
177 | 177 | -------- |
|
178 | 178 | |
|
179 | 179 | As indicated above, on Windows, PyReadline is a *mandatory* dependency. |
|
180 | 180 | PyReadline is a separate, Windows only implementation of readline that uses |
|
181 | 181 | native Windows calls through :mod:`ctypes`. The easiest way of installing |
|
182 | 182 | PyReadline is you use the binary installer available `here |
|
183 | 183 | <http://pypi.python.org/pypi/pyreadline>`_. |
|
184 | 184 | |
|
185 | 185 | On OSX, if you are using the built-in Python shipped by Apple, you will be |
|
186 | 186 | missing a full readline implementation as Apple ships instead a library called |
|
187 | 187 | ``libedit`` that provides only some of readline's functionality. While you may |
|
188 | 188 | find libedit sufficient, we have occasional reports of bugs with it and several |
|
189 | 189 | developers who use OS X as their main environment consider libedit unacceptable |
|
190 | 190 | for productive, regular use with IPython. |
|
191 | 191 | |
|
192 | 192 | Therefore, we *strongly* recommend that on OS X you get the full |
|
193 | 193 | :mod:`readline` module. We will *not* consider completion/history problems to |
|
194 | 194 | be bugs for IPython if you are using libedit. |
|
195 | 195 | |
|
196 | 196 | To get a working :mod:`readline` module, just do (with :mod:`distribute` |
|
197 | 197 | installed): |
|
198 | 198 | |
|
199 | 199 | .. code-block:: bash |
|
200 | 200 | |
|
201 | 201 | $ easy_install readline |
|
202 | 202 | |
|
203 | 203 | .. note:: |
|
204 | 204 | |
|
205 | 205 | Other Python distributions on OS X (such as fink, MacPorts and the official |
|
206 | 206 | python.org binaries) already have readline installed so you likely don't |
|
207 | 207 | have to do this step. |
|
208 | 208 | |
|
209 | 209 | When IPython is installed with :mod:`distribute`, (e.g. using the |
|
210 | 210 | ``easy_install`` command), readline is added as a dependency on OS X, and |
|
211 | 211 | PyReadline on Windows, and will be installed on your system. However, if you |
|
212 | 212 | do not use distribute, you may have to install one of these packages yourself. |
|
213 | 213 | |
|
214 | 214 | |
|
215 | 215 | nose |
|
216 | 216 | ---- |
|
217 | 217 | |
|
218 | 218 | To run the IPython test suite you will need the :mod:`nose` package. Nose |
|
219 | 219 | provides a great way of sniffing out and running all of the IPython tests. The |
|
220 | 220 | simplest way of getting nose, is to use :command:`easy_install`: |
|
221 | 221 | |
|
222 | 222 | .. code-block:: bash |
|
223 | 223 | |
|
224 | 224 | $ easy_install nose |
|
225 | 225 | |
|
226 | 226 | Another way of getting this is to do: |
|
227 | 227 | |
|
228 | 228 | .. code-block:: bash |
|
229 | 229 | |
|
230 | 230 | $ easy_install ipython[test] |
|
231 | 231 | |
|
232 | 232 | For more installation options, see the `nose website |
|
233 | 233 | <http://somethingaboutorange.com/mrl/projects/nose/>`_. |
|
234 | 234 | |
|
235 | 235 | Once you have nose installed, you can run IPython's test suite using the |
|
236 | 236 | iptest command: |
|
237 | 237 | |
|
238 | 238 | .. code-block:: bash |
|
239 | 239 | |
|
240 | 240 | $ iptest |
|
241 | 241 | |
|
242 | 242 | pexpect |
|
243 | 243 | ------- |
|
244 | 244 | |
|
245 | 245 | The pexpect_ package is used in IPython's :command:`irunner` script, as well as |
|
246 | 246 | for managing subprocesses. IPython now includes a version of pexpect in |
|
247 | 247 | :mod:`IPython.external`, but if you have installed pexpect, IPython will use |
|
248 | 248 | that instead. On Unix platforms (including OS X), just do: |
|
249 | 249 | |
|
250 | 250 | .. code-block:: bash |
|
251 | 251 | |
|
252 | 252 | $ easy_install pexpect |
|
253 | 253 | |
|
254 | 254 | Windows users are out of luck as pexpect does not run there. |
|
255 | 255 | |
|
256 | 256 | Dependencies for IPython.parallel (parallel computing) |
|
257 | 257 | ====================================================== |
|
258 | 258 | |
|
259 | 259 | :mod:`IPython.kernel` has been replaced by :mod:`IPython.parallel`, |
|
260 | 260 | which uses ZeroMQ for all communication. |
|
261 | 261 | |
|
262 | 262 | IPython.parallel provides a nice architecture for parallel computing, with a |
|
263 | 263 | focus on fluid interactive workflows. These features require just one package: |
|
264 | 264 | PyZMQ. See the next section for PyZMQ details. |
|
265 | 265 | |
|
266 | 266 | On a Unix style platform (including OS X), if you want to use |
|
267 | 267 | :mod:`distribute`, you can just do: |
|
268 | 268 | |
|
269 | 269 | .. code-block:: bash |
|
270 | 270 | |
|
271 | 271 | $ easy_install ipython[zmq] # will include pyzmq |
|
272 | 272 | |
|
273 | 273 | Security in IPython.parallel is provided by SSH tunnels. By default, Linux |
|
274 | 274 | and OSX clients will use the shell ssh command, but on Windows, we also |
|
275 | 275 | support tunneling with paramiko_. |
|
276 | 276 | |
|
277 | Dependencies for IPython.zmq | |
|
277 | Dependencies for IPython.kernel.zmq | |
|
278 | 278 | ============================ |
|
279 | 279 | |
|
280 | 280 | pyzmq |
|
281 | 281 | ----- |
|
282 | 282 | |
|
283 | 283 | IPython 0.11 introduced some new functionality, including a two-process |
|
284 | 284 | execution model using ZeroMQ_ for communication. The Python bindings to ZeroMQ |
|
285 | 285 | are found in the PyZMQ_ project, which is easy_install-able once you have |
|
286 | 286 | ZeroMQ installed. If you are on Python 2.6 or 2.7 on OSX, or 2.7 on Windows, |
|
287 | 287 | pyzmq has eggs that include ZeroMQ itself. |
|
288 | 288 | |
|
289 | IPython.zmq depends on pyzmq >= 2.1.4. | |
|
289 | IPython.kernel.zmq depends on pyzmq >= 2.1.4. | |
|
290 | 290 | |
|
291 | 291 | Dependencies for the IPython QT console |
|
292 | 292 | ======================================= |
|
293 | 293 | |
|
294 | 294 | pyzmq |
|
295 | 295 | ----- |
|
296 | 296 | |
|
297 | 297 | Like the :mod:`IPython.parallel` package, the QT Console requires ZeroMQ and |
|
298 | 298 | PyZMQ. |
|
299 | 299 | |
|
300 | 300 | Qt |
|
301 | 301 | -- |
|
302 | 302 | |
|
303 | Also with 0.11, a new GUI was added using the work in :mod:`IPython.zmq`, which | |
|
303 | Also with 0.11, a new GUI was added using the work in :mod:`IPython.kernel.zmq`, which | |
|
304 | 304 | can be launched with ``ipython qtconsole``. The GUI is built on Qt, and works |
|
305 | 305 | with either PyQt, which can be installed from the `PyQt website |
|
306 | 306 | <http://www.riverbankcomputing.co.uk/>`_, or `PySide |
|
307 | 307 | <http://www.pyside.org/>`_, from Nokia. |
|
308 | 308 | |
|
309 | 309 | pygments |
|
310 | 310 | -------- |
|
311 | 311 | |
|
312 | 312 | The syntax-highlighting in ``ipython qtconsole`` is done with the pygments_ |
|
313 | 313 | project, which is easy_install-able. |
|
314 | 314 | |
|
315 | 315 | .. _installnotebook: |
|
316 | 316 | |
|
317 | 317 | Dependencies for the IPython HTML notebook |
|
318 | 318 | ========================================== |
|
319 | 319 | |
|
320 | 320 | The IPython notebook is a notebook-style web interface to IPython and can be |
|
321 | 321 | started withe command ``ipython notebook``. |
|
322 | 322 | |
|
323 | 323 | pyzmq |
|
324 | 324 | ----- |
|
325 | 325 | |
|
326 | 326 | Like the :mod:`IPython.parallel` and :mod:`IPython.frontend.qt.console` |
|
327 | 327 | packages, the HTML notebook requires ZeroMQ and PyZMQ. |
|
328 | 328 | |
|
329 | 329 | Tornado |
|
330 | 330 | ------- |
|
331 | 331 | |
|
332 | 332 | The IPython notebook uses the Tornado_ project for its HTTP server. Tornado 2.1 |
|
333 | 333 | is required, in order to support current versions of browsers, due to an update |
|
334 | 334 | to the websocket protocol. |
|
335 | 335 | |
|
336 | 336 | Jinja |
|
337 | 337 | ----- |
|
338 | 338 | |
|
339 | 339 | The IPython notebook uses the Jinja_ templating tool to render HTML pages. |
|
340 | 340 | |
|
341 | 341 | |
|
342 | 342 | MathJax |
|
343 | 343 | ------- |
|
344 | 344 | |
|
345 | 345 | The IPython notebook uses the MathJax_ Javascript library for rendering LaTeX |
|
346 | 346 | in web browsers. Because MathJax is large, we don't include it with |
|
347 | 347 | IPython. Normally IPython will load MathJax from a CDN, but if you have a slow |
|
348 | 348 | network connection, or want to use LaTeX without an internet connection at all, |
|
349 | 349 | you can install MathJax locally. |
|
350 | 350 | |
|
351 | 351 | A quick and easy method is to install it from a python session:: |
|
352 | 352 | |
|
353 | 353 | from IPython.external.mathjax import install_mathjax |
|
354 | 354 | install_mathjax() |
|
355 | 355 | |
|
356 | 356 | If you need tighter configuration control, you can download your own copy |
|
357 | 357 | of MathJax from http://www.mathjax.org/download/ - use the MathJax-2.0 link. |
|
358 | 358 | When you have the file stored locally, install it with:: |
|
359 | 359 | |
|
360 | 360 | python -m IPython.external.mathjax /path/to/source/mathjax-MathJax-v2.0-20-g07669ac.zip |
|
361 | 361 | |
|
362 | 362 | For unusual needs, IPython can tell you what directory it wants to find MathJax in:: |
|
363 | 363 | |
|
364 | 364 | python -m IPython.external.mathjax -d /some/other/mathjax |
|
365 | 365 | |
|
366 | 366 | By default Mathjax will be installed in your ipython profile directory, but you |
|
367 | 367 | can make system wide install, please refer to the documentation and helper function |
|
368 | 368 | of :mod:`IPython.external.mathjax` |
|
369 | 369 | |
|
370 | 370 | Browser Compatibility |
|
371 | 371 | --------------------- |
|
372 | 372 | |
|
373 | 373 | The notebook uses WebSockets and the flexible box model. These features are |
|
374 | 374 | available in the following browsers: |
|
375 | 375 | |
|
376 | 376 | * Chrome |
|
377 | 377 | * Safari |
|
378 | 378 | * Firefox 6 and above |
|
379 | 379 | * Firefox 4 and 5: These browsers have WebSocket support, but it is disabled by |
|
380 | 380 | default. If you're unable to upgrade, you can enable it by entering ``about:config`` |
|
381 | 381 | in the URL bar and then setting ``network.websocket.enabled`` and |
|
382 | 382 | ``network.websocket.override-security-block`` to ``true``. |
|
383 | 383 | |
|
384 | 384 | Internet Explorer 9 does not support WebSockets or the flexible box model, but |
|
385 | 385 | these features should appear in Internet Explorer 10. |
|
386 | 386 | |
|
387 | 387 | |
|
388 | 388 | .. _ZeroMQ: http://www.zeromq.org |
|
389 | 389 | .. _PyZMQ: https://github.com/zeromq/pyzmq |
|
390 | 390 | .. _paramiko: https://github.com/robey/paramiko |
|
391 | 391 | .. _pygments: http://pygments.org |
|
392 | 392 | .. _pexpect: http://www.noah.org/wiki/Pexpect |
|
393 | 393 | .. _Jinja: http://jinja.pocoo.org |
|
394 | 394 | .. _Tornado: http://www.tornadoweb.org |
|
395 | 395 | .. _MathJax: http://www.mathjax.org |
@@ -1,251 +1,251 b'' | |||
|
1 | 1 | .. _parallelsecurity: |
|
2 | 2 | |
|
3 | 3 | =========================== |
|
4 | 4 | Security details of IPython |
|
5 | 5 | =========================== |
|
6 | 6 | |
|
7 | 7 | .. note:: |
|
8 | 8 | |
|
9 | This section is not thorough, and IPython.zmq needs a thorough security | |
|
9 | This section is not thorough, and IPython.kernel.zmq needs a thorough security | |
|
10 | 10 | audit. |
|
11 | 11 | |
|
12 | IPython's :mod:`IPython.zmq` package exposes the full power of the | |
|
12 | IPython's :mod:`IPython.kernel.zmq` package exposes the full power of the | |
|
13 | 13 | Python interpreter over a TCP/IP network for the purposes of parallel |
|
14 | 14 | computing. This feature brings up the important question of IPython's security |
|
15 | 15 | model. This document gives details about this model and how it is implemented |
|
16 | 16 | in IPython's architecture. |
|
17 | 17 | |
|
18 | 18 | Process and network topology |
|
19 | 19 | ============================ |
|
20 | 20 | |
|
21 | 21 | To enable parallel computing, IPython has a number of different processes that |
|
22 | 22 | run. These processes are discussed at length in the IPython documentation and |
|
23 | 23 | are summarized here: |
|
24 | 24 | |
|
25 | 25 | * The IPython *engine*. This process is a full blown Python |
|
26 | 26 | interpreter in which user code is executed. Multiple |
|
27 | 27 | engines are started to make parallel computing possible. |
|
28 | 28 | * The IPython *hub*. This process monitors a set of |
|
29 | 29 | engines and schedulers, and keeps track of the state of the processes. It listens |
|
30 | 30 | for registration connections from engines and clients, and monitor connections |
|
31 | 31 | from schedulers. |
|
32 | 32 | * The IPython *schedulers*. This is a set of processes that relay commands and results |
|
33 | 33 | between clients and engines. They are typically on the same machine as the controller, |
|
34 | 34 | and listen for connections from engines and clients, but connect to the Hub. |
|
35 | 35 | * The IPython *client*. This process is typically an |
|
36 | 36 | interactive Python process that is used to coordinate the |
|
37 | 37 | engines to get a parallel computation done. |
|
38 | 38 | |
|
39 | 39 | Collectively, these processes are called the IPython *cluster*, and the hub and schedulers |
|
40 | 40 | together are referred to as the *controller*. |
|
41 | 41 | |
|
42 | 42 | |
|
43 | 43 | These processes communicate over any transport supported by ZeroMQ (tcp,pgm,infiniband,ipc) |
|
44 | 44 | with a well defined topology. The IPython hub and schedulers listen on sockets. Upon |
|
45 | 45 | starting, an engine connects to a hub and registers itself, which then informs the engine |
|
46 | 46 | of the connection information for the schedulers, and the engine then connects to the |
|
47 | 47 | schedulers. These engine/hub and engine/scheduler connections persist for the |
|
48 | 48 | lifetime of each engine. |
|
49 | 49 | |
|
50 | 50 | The IPython client also connects to the controller processes using a number of socket |
|
51 | 51 | connections. As of writing, this is one socket per scheduler (4), and 3 connections to the |
|
52 | 52 | hub for a total of 7. These connections persist for the lifetime of the client only. |
|
53 | 53 | |
|
54 | 54 | A given IPython controller and set of engines engines typically has a relatively |
|
55 | 55 | short lifetime. Typically this lifetime corresponds to the duration of a single parallel |
|
56 | 56 | simulation performed by a single user. Finally, the hub, schedulers, engines, and client |
|
57 | 57 | processes typically execute with the permissions of that same user. More specifically, the |
|
58 | 58 | controller and engines are *not* executed as root or with any other superuser permissions. |
|
59 | 59 | |
|
60 | 60 | Application logic |
|
61 | 61 | ================= |
|
62 | 62 | |
|
63 | 63 | When running the IPython kernel to perform a parallel computation, a user |
|
64 | 64 | utilizes the IPython client to send Python commands and data through the |
|
65 | 65 | IPython schedulers to the IPython engines, where those commands are executed |
|
66 | 66 | and the data processed. The design of IPython ensures that the client is the |
|
67 | 67 | only access point for the capabilities of the engines. That is, the only way |
|
68 | 68 | of addressing the engines is through a client. |
|
69 | 69 | |
|
70 | 70 | A user can utilize the client to instruct the IPython engines to execute |
|
71 | 71 | arbitrary Python commands. These Python commands can include calls to the |
|
72 | 72 | system shell, access the filesystem, etc., as required by the user's |
|
73 | 73 | application code. From this perspective, when a user runs an IPython engine on |
|
74 | 74 | a host, that engine has the same capabilities and permissions as the user |
|
75 | 75 | themselves (as if they were logged onto the engine's host with a terminal). |
|
76 | 76 | |
|
77 | 77 | Secure network connections |
|
78 | 78 | ========================== |
|
79 | 79 | |
|
80 | 80 | Overview |
|
81 | 81 | -------- |
|
82 | 82 | |
|
83 | 83 | ZeroMQ provides exactly no security. For this reason, users of IPython must be very |
|
84 | 84 | careful in managing connections, because an open TCP/IP socket presents access to |
|
85 | 85 | arbitrary execution as the user on the engine machines. As a result, the default behavior |
|
86 | 86 | of controller processes is to only listen for clients on the loopback interface, and the |
|
87 | 87 | client must establish SSH tunnels to connect to the controller processes. |
|
88 | 88 | |
|
89 | 89 | .. warning:: |
|
90 | 90 | |
|
91 | 91 | If the controller's loopback interface is untrusted, then IPython should be considered |
|
92 | 92 | vulnerable, and this extends to the loopback of all connected clients, which have |
|
93 | 93 | opened a loopback port that is redirected to the controller's loopback port. |
|
94 | 94 | |
|
95 | 95 | |
|
96 | 96 | SSH |
|
97 | 97 | --- |
|
98 | 98 | |
|
99 | 99 | Since ZeroMQ provides no security, SSH tunnels are the primary source of secure |
|
100 | 100 | connections. A connector file, such as `ipcontroller-client.json`, will contain |
|
101 | 101 | information for connecting to the controller, possibly including the address of an |
|
102 | 102 | ssh-server through with the client is to tunnel. The Client object then creates tunnels |
|
103 | 103 | using either [OpenSSH]_ or [Paramiko]_, depending on the platform. If users do not wish to |
|
104 | 104 | use OpenSSH or Paramiko, or the tunneling utilities are insufficient, then they may |
|
105 | 105 | construct the tunnels themselves, and simply connect clients and engines as if the |
|
106 | 106 | controller were on loopback on the connecting machine. |
|
107 | 107 | |
|
108 | 108 | |
|
109 | 109 | Authentication |
|
110 | 110 | -------------- |
|
111 | 111 | |
|
112 | 112 | To protect users of shared machines, [HMAC]_ digests are used to sign messages, using a |
|
113 | 113 | shared key. |
|
114 | 114 | |
|
115 | 115 | The Session object that handles the message protocol uses a unique key to verify valid |
|
116 | 116 | messages. This can be any value specified by the user, but the default behavior is a |
|
117 | 117 | pseudo-random 128-bit number, as generated by `uuid.uuid4()`. This key is used to |
|
118 | 118 | initialize an HMAC object, which digests all messages, and includes that digest as a |
|
119 | 119 | signature and part of the message. Every message that is unpacked (on Controller, Engine, |
|
120 | 120 | and Client) will also be digested by the receiver, ensuring that the sender's key is the |
|
121 | 121 | same as the receiver's. No messages that do not contain this key are acted upon in any |
|
122 | 122 | way. The key itself is never sent over the network. |
|
123 | 123 | |
|
124 | 124 | There is exactly one shared key per cluster - it must be the same everywhere. Typically, |
|
125 | 125 | the controller creates this key, and stores it in the private connection files |
|
126 | 126 | `ipython-{engine|client}.json`. These files are typically stored in the |
|
127 | 127 | `~/.ipython/profile_<name>/security` directory, and are maintained as readable only by the |
|
128 | 128 | owner, just as is common practice with a user's keys in their `.ssh` directory. |
|
129 | 129 | |
|
130 | 130 | .. warning:: |
|
131 | 131 | |
|
132 | 132 | It is important to note that the signatures protect against unauthorized messages, |
|
133 | 133 | but, as there is no encryption, provide exactly no protection of data privacy. It is |
|
134 | 134 | possible, however, to use a custom serialization scheme (via Session.packer/unpacker |
|
135 | 135 | traits) that does incorporate your own encryption scheme. |
|
136 | 136 | |
|
137 | 137 | |
|
138 | 138 | |
|
139 | 139 | Specific security vulnerabilities |
|
140 | 140 | ================================= |
|
141 | 141 | |
|
142 | 142 | There are a number of potential security vulnerabilities present in IPython's |
|
143 | 143 | architecture. In this section we discuss those vulnerabilities and detail how |
|
144 | 144 | the security architecture described above prevents them from being exploited. |
|
145 | 145 | |
|
146 | 146 | Unauthorized clients |
|
147 | 147 | -------------------- |
|
148 | 148 | |
|
149 | 149 | The IPython client can instruct the IPython engines to execute arbitrary |
|
150 | 150 | Python code with the permissions of the user who started the engines. If an |
|
151 | 151 | attacker were able to connect their own hostile IPython client to the IPython |
|
152 | 152 | controller, they could instruct the engines to execute code. |
|
153 | 153 | |
|
154 | 154 | |
|
155 | 155 | On the first level, this attack is prevented by requiring access to the controller's |
|
156 | 156 | ports, which are recommended to only be open on loopback if the controller is on an |
|
157 | 157 | untrusted local network. If the attacker does have access to the Controller's ports, then |
|
158 | 158 | the attack is prevented by the capabilities based client authentication of the execution |
|
159 | 159 | key. The relevant authentication information is encoded into the JSON file that clients |
|
160 | 160 | must present to gain access to the IPython controller. By limiting the distribution of |
|
161 | 161 | those keys, a user can grant access to only authorized persons, just as with SSH keys. |
|
162 | 162 | |
|
163 | 163 | It is highly unlikely that an execution key could be guessed by an attacker |
|
164 | 164 | in a brute force guessing attack. A given instance of the IPython controller |
|
165 | 165 | only runs for a relatively short amount of time (on the order of hours). Thus |
|
166 | 166 | an attacker would have only a limited amount of time to test a search space of |
|
167 | 167 | size 2**128. For added security, users can have arbitrarily long keys. |
|
168 | 168 | |
|
169 | 169 | .. warning:: |
|
170 | 170 | |
|
171 | 171 | If the attacker has gained enough access to intercept loopback connections on *either* the |
|
172 | 172 | controller or client, then a duplicate message can be sent. To protect against this, |
|
173 | 173 | recipients only allow each signature once, and consider duplicates invalid. However, |
|
174 | 174 | the duplicate message could be sent to *another* recipient using the same key, |
|
175 | 175 | and it would be considered valid. |
|
176 | 176 | |
|
177 | 177 | |
|
178 | 178 | Unauthorized engines |
|
179 | 179 | -------------------- |
|
180 | 180 | |
|
181 | 181 | If an attacker were able to connect a hostile engine to a user's controller, |
|
182 | 182 | the user might unknowingly send sensitive code or data to the hostile engine. |
|
183 | 183 | This attacker's engine would then have full access to that code and data. |
|
184 | 184 | |
|
185 | 185 | This type of attack is prevented in the same way as the unauthorized client |
|
186 | 186 | attack, through the usage of the capabilities based authentication scheme. |
|
187 | 187 | |
|
188 | 188 | Unauthorized controllers |
|
189 | 189 | ------------------------ |
|
190 | 190 | |
|
191 | 191 | It is also possible that an attacker could try to convince a user's IPython |
|
192 | 192 | client or engine to connect to a hostile IPython controller. That controller |
|
193 | 193 | would then have full access to the code and data sent between the IPython |
|
194 | 194 | client and the IPython engines. |
|
195 | 195 | |
|
196 | 196 | Again, this attack is prevented through the capabilities in a connection file, which |
|
197 | 197 | ensure that a client or engine connects to the correct controller. It is also important to |
|
198 | 198 | note that the connection files also encode the IP address and port that the controller is |
|
199 | 199 | listening on, so there is little chance of mistakenly connecting to a controller running |
|
200 | 200 | on a different IP address and port. |
|
201 | 201 | |
|
202 | 202 | When starting an engine or client, a user must specify the key to use |
|
203 | 203 | for that connection. Thus, in order to introduce a hostile controller, the |
|
204 | 204 | attacker must convince the user to use the key associated with the |
|
205 | 205 | hostile controller. As long as a user is diligent in only using keys from |
|
206 | 206 | trusted sources, this attack is not possible. |
|
207 | 207 | |
|
208 | 208 | .. note:: |
|
209 | 209 | |
|
210 | 210 | I may be wrong, the unauthorized controller may be easier to fake than this. |
|
211 | 211 | |
|
212 | 212 | Other security measures |
|
213 | 213 | ======================= |
|
214 | 214 | |
|
215 | 215 | A number of other measures are taken to further limit the security risks |
|
216 | 216 | involved in running the IPython kernel. |
|
217 | 217 | |
|
218 | 218 | First, by default, the IPython controller listens on random port numbers. |
|
219 | 219 | While this can be overridden by the user, in the default configuration, an |
|
220 | 220 | attacker would have to do a port scan to even find a controller to attack. |
|
221 | 221 | When coupled with the relatively short running time of a typical controller |
|
222 | 222 | (on the order of hours), an attacker would have to work extremely hard and |
|
223 | 223 | extremely *fast* to even find a running controller to attack. |
|
224 | 224 | |
|
225 | 225 | Second, much of the time, especially when run on supercomputers or clusters, |
|
226 | 226 | the controller is running behind a firewall. Thus, for engines or client to |
|
227 | 227 | connect to the controller: |
|
228 | 228 | |
|
229 | 229 | * The different processes have to all be behind the firewall. |
|
230 | 230 | |
|
231 | 231 | or: |
|
232 | 232 | |
|
233 | 233 | * The user has to use SSH port forwarding to tunnel the |
|
234 | 234 | connections through the firewall. |
|
235 | 235 | |
|
236 | 236 | In either case, an attacker is presented with additional barriers that prevent |
|
237 | 237 | attacking or even probing the system. |
|
238 | 238 | |
|
239 | 239 | Summary |
|
240 | 240 | ======= |
|
241 | 241 | |
|
242 | 242 | IPython's architecture has been carefully designed with security in mind. The |
|
243 | 243 | capabilities based authentication model, in conjunction with SSH tunneled |
|
244 | 244 | TCP/IP channels, address the core potential vulnerabilities in the system, |
|
245 | 245 | while still enabling user's to use the system in open networks. |
|
246 | 246 | |
|
247 | 247 | .. [RFC5246] <http://tools.ietf.org/html/rfc5246> |
|
248 | 248 | |
|
249 | 249 | .. [OpenSSH] <http://www.openssh.com/> |
|
250 | 250 | .. [Paramiko] <http://www.lag.net/paramiko/> |
|
251 | 251 | .. [HMAC] <http://tools.ietf.org/html/rfc2104.html> |
@@ -1,59 +1,59 b'' | |||
|
1 | 1 | #----------------------------------------------------------------------------- |
|
2 | 2 | # Imports |
|
3 | 3 | #----------------------------------------------------------------------------- |
|
4 | 4 | |
|
5 | 5 | import subprocess |
|
6 | 6 | import sys |
|
7 | 7 | |
|
8 | 8 | from IPython.lib.kernel import connect_qtconsole |
|
9 | from IPython.zmq.ipkernel import IPKernelApp | |
|
9 | from IPython.kernel.zmq.ipkernel import IPKernelApp | |
|
10 | 10 | |
|
11 | 11 | #----------------------------------------------------------------------------- |
|
12 | 12 | # Functions and classes |
|
13 | 13 | #----------------------------------------------------------------------------- |
|
14 | 14 | def pylab_kernel(gui): |
|
15 | 15 | """Launch and return an IPython kernel with pylab support for the desired gui |
|
16 | 16 | """ |
|
17 | 17 | kernel = IPKernelApp.instance() |
|
18 | 18 | kernel.initialize(['python', '--pylab=%s' % gui, |
|
19 | 19 | #'--log-level=10' |
|
20 | 20 | ]) |
|
21 | 21 | return kernel |
|
22 | 22 | |
|
23 | 23 | |
|
24 | 24 | class InternalIPKernel(object): |
|
25 | 25 | |
|
26 | 26 | def init_ipkernel(self, backend): |
|
27 | 27 | # Start IPython kernel with GUI event loop and pylab support |
|
28 | 28 | self.ipkernel = pylab_kernel(backend) |
|
29 | 29 | # To create and track active qt consoles |
|
30 | 30 | self.consoles = [] |
|
31 | 31 | |
|
32 | 32 | # This application will also act on the shell user namespace |
|
33 | 33 | self.namespace = self.ipkernel.shell.user_ns |
|
34 | 34 | # Keys present at startup so we don't print the entire pylab/numpy |
|
35 | 35 | # namespace when the user clicks the 'namespace' button |
|
36 | 36 | self._init_keys = set(self.namespace.keys()) |
|
37 | 37 | |
|
38 | 38 | # Example: a variable that will be seen by the user in the shell, and |
|
39 | 39 | # that the GUI modifies (the 'Counter++' button increments it): |
|
40 | 40 | self.namespace['app_counter'] = 0 |
|
41 | 41 | #self.namespace['ipkernel'] = self.ipkernel # dbg |
|
42 | 42 | |
|
43 | 43 | def print_namespace(self, evt=None): |
|
44 | 44 | print("\n***Variables in User namespace***") |
|
45 | 45 | for k, v in self.namespace.iteritems(): |
|
46 | 46 | if k not in self._init_keys and not k.startswith('_'): |
|
47 | 47 | print('%s -> %r' % (k, v)) |
|
48 | 48 | sys.stdout.flush() |
|
49 | 49 | |
|
50 | 50 | def new_qt_console(self, evt=None): |
|
51 | 51 | """start a new qtconsole connected to our kernel""" |
|
52 | 52 | return connect_qtconsole(self.ipkernel.connection_file, profile=self.ipkernel.profile) |
|
53 | 53 | |
|
54 | 54 | def count(self, evt=None): |
|
55 | 55 | self.namespace['app_counter'] += 1 |
|
56 | 56 | |
|
57 | 57 | def cleanup_consoles(self, evt=None): |
|
58 | 58 | for c in self.consoles: |
|
59 | 59 | c.kill() |
@@ -1,201 +1,201 b'' | |||
|
1 | 1 | { |
|
2 | 2 | "metadata": { |
|
3 | 3 | "name": "Animations Using clear_output" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | 6 | "nbformat_minor": 0, |
|
7 | 7 | "worksheets": [ |
|
8 | 8 | { |
|
9 | 9 | "cells": [ |
|
10 | 10 | { |
|
11 | 11 | "cell_type": "heading", |
|
12 | 12 | "level": 1, |
|
13 | 13 | "metadata": {}, |
|
14 | 14 | "source": [ |
|
15 | 15 | "Simple animations Using clear_output" |
|
16 | 16 | ] |
|
17 | 17 | }, |
|
18 | 18 | { |
|
19 | 19 | "cell_type": "markdown", |
|
20 | 20 | "metadata": {}, |
|
21 | 21 | "source": [ |
|
22 | 22 | "Sometimes you want to clear the output area in the middle of a calculation. This can be useful for doing simple animations. In terminals, there is the carriage-return (`'\\r'`) for overwriting a single line, but the notebook frontend does not support this behavior.\n", |
|
23 | 23 | "\n", |
|
24 | 24 | "To clear output in the Notebook you can use the `clear_output` function." |
|
25 | 25 | ] |
|
26 | 26 | }, |
|
27 | 27 | { |
|
28 | 28 | "cell_type": "heading", |
|
29 | 29 | "level": 2, |
|
30 | 30 | "metadata": {}, |
|
31 | 31 | "source": [ |
|
32 | 32 | "Simple example" |
|
33 | 33 | ] |
|
34 | 34 | }, |
|
35 | 35 | { |
|
36 | 36 | "cell_type": "markdown", |
|
37 | 37 | "metadata": {}, |
|
38 | 38 | "source": [ |
|
39 | 39 | "Here we show our progress iterating through a list:" |
|
40 | 40 | ] |
|
41 | 41 | }, |
|
42 | 42 | { |
|
43 | 43 | "cell_type": "code", |
|
44 | 44 | "collapsed": true, |
|
45 | 45 | "input": [ |
|
46 | 46 | "import sys\n", |
|
47 | 47 | "import time" |
|
48 | 48 | ], |
|
49 | 49 | "language": "python", |
|
50 | 50 | "metadata": {}, |
|
51 | 51 | "outputs": [], |
|
52 | 52 | "prompt_number": 1 |
|
53 | 53 | }, |
|
54 | 54 | { |
|
55 | 55 | "cell_type": "code", |
|
56 | 56 | "collapsed": false, |
|
57 | 57 | "input": [ |
|
58 | 58 | "from IPython.display import clear_output\n", |
|
59 | 59 | "for i in range(10):\n", |
|
60 | 60 | " time.sleep(0.25)\n", |
|
61 | 61 | " clear_output()\n", |
|
62 | 62 | " print(i)\n", |
|
63 | 63 | " sys.stdout.flush()" |
|
64 | 64 | ], |
|
65 | 65 | "language": "python", |
|
66 | 66 | "metadata": {}, |
|
67 | 67 | "outputs": [ |
|
68 | 68 | { |
|
69 | 69 | "output_type": "stream", |
|
70 | 70 | "stream": "stdout", |
|
71 | 71 | "text": [ |
|
72 | 72 | "9\n" |
|
73 | 73 | ] |
|
74 | 74 | } |
|
75 | 75 | ], |
|
76 | 76 | "prompt_number": 2 |
|
77 | 77 | }, |
|
78 | 78 | { |
|
79 | 79 | "cell_type": "heading", |
|
80 | 80 | "level": 2, |
|
81 | 81 | "metadata": {}, |
|
82 | 82 | "source": [ |
|
83 | 83 | "AsyncResult.wait_interactive" |
|
84 | 84 | ] |
|
85 | 85 | }, |
|
86 | 86 | { |
|
87 | 87 | "cell_type": "markdown", |
|
88 | 88 | "metadata": {}, |
|
89 | 89 | "source": [ |
|
90 | 90 | "The AsyncResult object has a special `wait_interactive()` method, which prints its progress interactively,\n", |
|
91 | 91 | "so you can watch as your parallel computation completes.\n", |
|
92 | 92 | "\n", |
|
93 | 93 | "**This example assumes you have an IPython cluster running, which you can start from the [cluster panel](/#tab2)**" |
|
94 | 94 | ] |
|
95 | 95 | }, |
|
96 | 96 | { |
|
97 | 97 | "cell_type": "code", |
|
98 | 98 | "collapsed": false, |
|
99 | 99 | "input": [ |
|
100 | 100 | "from IPython import parallel\n", |
|
101 | 101 | "rc = parallel.Client()\n", |
|
102 | 102 | "view = rc.load_balanced_view()\n", |
|
103 | 103 | "\n", |
|
104 | 104 | "amr = view.map_async(time.sleep, [0.5]*100)\n", |
|
105 | 105 | "\n", |
|
106 | 106 | "amr.wait_interactive()" |
|
107 | 107 | ], |
|
108 | 108 | "language": "python", |
|
109 | 109 | "metadata": {}, |
|
110 | 110 | "outputs": [ |
|
111 | 111 | { |
|
112 | 112 | "output_type": "stream", |
|
113 | 113 | "stream": "stdout", |
|
114 | 114 | "text": [ |
|
115 | 115 | " 100/100 tasks finished after 30 s" |
|
116 | 116 | ] |
|
117 | 117 | }, |
|
118 | 118 | { |
|
119 | 119 | "output_type": "stream", |
|
120 | 120 | "stream": "stdout", |
|
121 | 121 | "text": [ |
|
122 | 122 | "\n", |
|
123 | 123 | "done\n" |
|
124 | 124 | ] |
|
125 | 125 | } |
|
126 | 126 | ], |
|
127 | 127 | "prompt_number": 3 |
|
128 | 128 | }, |
|
129 | 129 | { |
|
130 | 130 | "cell_type": "heading", |
|
131 | 131 | "level": 2, |
|
132 | 132 | "metadata": {}, |
|
133 | 133 | "source": [ |
|
134 | 134 | "Matplotlib example" |
|
135 | 135 | ] |
|
136 | 136 | }, |
|
137 | 137 | { |
|
138 | 138 | "cell_type": "markdown", |
|
139 | 139 | "metadata": {}, |
|
140 | 140 | "source": [ |
|
141 | 141 | "You can also use `clear_output()` to clear figures and plots." |
|
142 | 142 | ] |
|
143 | 143 | }, |
|
144 | 144 | { |
|
145 | 145 | "cell_type": "code", |
|
146 | 146 | "collapsed": false, |
|
147 | 147 | "input": [ |
|
148 | 148 | "%pylab inline" |
|
149 | 149 | ], |
|
150 | 150 | "language": "python", |
|
151 | 151 | "metadata": {}, |
|
152 | 152 | "outputs": [ |
|
153 | 153 | { |
|
154 | 154 | "output_type": "stream", |
|
155 | 155 | "stream": "stdout", |
|
156 | 156 | "text": [ |
|
157 | 157 | "\n", |
|
158 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", | |
|
158 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\n", | |
|
159 | 159 | "For more information, type 'help(pylab)'.\n" |
|
160 | 160 | ] |
|
161 | 161 | } |
|
162 | 162 | ], |
|
163 | 163 | "prompt_number": 4 |
|
164 | 164 | }, |
|
165 | 165 | { |
|
166 | 166 | "cell_type": "code", |
|
167 | 167 | "collapsed": false, |
|
168 | 168 | "input": [ |
|
169 | 169 | "from scipy.special import jn\n", |
|
170 | 170 | "x = np.linspace(0,5)\n", |
|
171 | 171 | "f, ax = plt.subplots()\n", |
|
172 | 172 | "ax.set_title(\"Bessel functions\")\n", |
|
173 | 173 | "\n", |
|
174 | 174 | "for n in range(1,10):\n", |
|
175 | 175 | " time.sleep(1)\n", |
|
176 | 176 | " ax.plot(x, jn(x,n))\n", |
|
177 | 177 | " clear_output()\n", |
|
178 | 178 | " display(f)\n", |
|
179 | 179 | "\n", |
|
180 | 180 | "# close the figure at the end, so we don't get a duplicate\n", |
|
181 | 181 | "# of the last plot\n", |
|
182 | 182 | "plt.close()" |
|
183 | 183 | ], |
|
184 | 184 | "language": "python", |
|
185 | 185 | "metadata": {}, |
|
186 | 186 | "outputs": [ |
|
187 | 187 | { |
|
188 | 188 | "output_type": "display_data", |
|
189 | 189 | "png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEICAYAAABRSj9aAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXdYFNfXx7+AooIowgJiwa7YscUSC/ZujDGWRGOPGktM\nfknemKZpxmgsWBJLTGISjT32xNhQlo5iBUEEAeltl7Kwbb7vH2OIBaVtAZ3P88zDrjNz79lx99x7\nzz3FgiQhISEhIfHMYmluASQkJCQkjIuk6CUkJCSecSRFLyEhIfGMIyl6CQkJiWccSdFLSEhIPONI\nil5CQkLiGUdS9BLPFXfv3oWlpSUEQXji+VdffRV16tTBpk2bTCZXXFwc7OzsIHk7SxgDSdFLGJ3G\njRvDxsYGdnZ2aNq0KRYvXozU1FRzi1Ukv//+O2rXro2MjAwsXLjQaP00btwY586dK3zv5uaGnJwc\nWFhYGK1PiecXSdFLGB0LCwscP34cOTk58Pf3R3x8PDZu3GhusYpELpeje/fusLQ07k/DwsJCmr1L\nmAxJ0UuYFBcXF0ycOBEnTpwo/DedTod9+/ZhwIAB8PDwwI4dO6DRaAAAKpUKs2fPRuPGjeHo6Ii+\nffsWKsgdO3agZ8+eqF27Ntzd3R+aIf/1118YM2YMWrVqhXXr1iE3N7dY2QYMGIAzZ85g8eLFqFWr\nFm7fvg1PT0/s2LGj8JpffvkFffr0KXxvaWmJXbt2wcPDA82bN8e6deseavP8+fOYMmUKHBwc0LZt\nW4SGhmLq1KmIi4vD6NGjYWdnh+++++4xk1JmZia+/fZbtGjRAuPHj8eFCxcK21y+fDkmT56MhQsX\nom7dupgwYQLCw8MLzz/tuUg8p1BCwsg0btyYZ86cIUneu3ePo0aN4jvvvFN43svLiwMGDOCNGzcY\nFRVFT09Pbtu2jSS5adMmvvbaa1QqldTpdJTL5STJtLQ0NmjQgJGRkSTJ2NhY3rlzhyR55MgRdujQ\ngf7+/kxMTOSECRP40UcfkSRjYmJoYWFBvV5fpKyenp7csWPHE9///PPP7N27d+F7CwsLDhgwgOHh\n4bx06RLt7OwYFRVFkrx8+TKdnZ25e/duajQaRkVFMTY2tvCZnD17trCdR+V64403OGHCBMbHx/Pg\nwYN0cHBgTEwMSXLZsmW0trbmtm3bmJmZydmzZ3PKlCnFPheJ5xdpRi9hdEhi7NixqFOnDho1aoSY\nmBh88sknhef37duHL7/8Em3btkWzZs3w9ttv4/DhwwAAQRCQnp6OhIQEWFlZ4cUXXwQgmj7y8/MR\nGRkJrVYLNzc3NG3aFACwd+9e/N///R969OgBV1dXLF26tLC9kspbGhYsWAB3d3d07twZvXr1wunT\npwEAe/bsweTJkzF58mRUrVoVzZo1g5ubW7Ht6fV6nDhxAl9++SUaNGiAcePGYfjw4fjzzz8Lr2nV\nqhXmzJmDOnXqYNasWThz5gyApz8XiecXSdFLGB0LCwscOXIEWVlZyMrKwrx589CmTRtoNBrk5eXB\nz88PI0eORJ06dVCnTh1Mnz4dfn5+AIBZs2bB09MTo0aNQvv27QvNKI6Ojvjtt9+wbt06uLq6YsmS\nJUhLSwMAnDlzBvPnzy9sr3///rh7926JN4BLuyHq4eFR+NrV1RWJiYkAAG9v78KBqTSEh4dDrVaj\nZcuWhf/WpUsX+Pj4FL7v2LFj4eu6desiJSUFgiA89blIPL9Iil7CpNjZ2WH+/PnIycmBj48PbG1t\n0b17d5w6dapwIFAoFMjKygIA2NjYYOnSpbhz5w5++uknvPvuuwgLCwMADB8+HGfOnEFYWBhiYmKw\natUqAKKtffv27YXtZWVlIS8vD87OzqWWt379+khOTi58HxoaWuJ7+/fvD7lcXuQ5KyurJ64c3N3d\nUa1aNURERBT+W0hICPr27Vuifp/0XCSeXyRFL2ES/lVqubm52LZtG2xsbNCrVy8AwNSpU/HZZ5/h\n8uXLEAQBCQkJ+OeffwAAJ06cQFRUFARBgK2tLaytrVG9enVERkbi3LlzUKvVsLa2RrVq1WBnZ1fY\n3qpVqyCXy6HX65GWloajR4+WWlYAGDhwIA4fPoyEhAScO3cOR44cKfbef++fNGkS9u3bh3379kGj\n0SAqKgpxcXEAxBn6pUuXimyjSpUqGDlyJJYtW4aEhAQcPnwYf//9N8aOHVus7E97LhLPL5KilzAJ\n/3qYNG3aFOfOncPOnTtRo0YNAMCcOXMwc+ZMfPbZZ3BwcMDgwYMRGRkJALh9+zYGDx6M2rVrY86c\nOfjqq6/QtGlTqNVqLF26FE5OTujatSvs7e3xzjvvABBntF988QU2bdoEJycn9OzZE0FBQYWyFGea\nefD8uHHj0KtXL3Tt2hWrVq3CggULHjr/aFsWFhaF/+bh4YFdu3bh0KFDcHZ2xrhx4wpXKvPmzcPx\n48fh4OCAtWvXPtbW2rVr0bFjR/Tr1w+//vor9u/fj8aNGz/Wx6NyPO25SDy/WLC0O08SEhISEpWK\ncs/oL168iNatW6NFixZFBsHk5+dj2rRp6NSpE/r161fs0ldCQkJCwrCUe0bfqVMneHl5oVGjRhg6\ndCjkcjlkMlnh+S1btuDatWv4/vvvERsbiwEDBiAqKkoK9ZaQkJAwEeWa0SuVSgBA37590ahRIwwZ\nMgSBgYEPXVO7dm3k5ORAq9UiMzMTNjY2kpKXkJCQMCHlUvTBwcFwd3cvfN+mTRsEBAQ8dM3kyZOh\n1+shk8nQu3dv7Nq1qzxdSkhISEiUkirG7mDTpk2oUqUKkpKScP36dYwcORKxsbGPJY2SZvkSEhIS\nZaM4C3y5ZvTdunXDrVu3Ct/fvHkTPXr0eOiaixcv4vXXX4eNjQ26d++OevXqFbrOFSWsdBDLli0z\nuwwV5ZCehfQspGfx9KMklEvR165du1CZ3717F6dPn0b37t0fumbgwIE4duwYBEFAdHQ0MjMzHzL3\nSEhISEgYl3KbbtavX4+5c+dCq9Vi8eLFkMlk2Lp1KwBg7ty5mDRpEsLCwtC1a1c4OTnBy8ur3EJL\nSEhISJScChMw9WAhBp0OiI0FIiKAmBigbVugZ0+gWjUzC2kivL294enpaW4xKgTSs/gP6Vn8h/Qs\n/qMkRWwqlKJ/6SUiMlJU7i4uQMuWgJsbcO0acOsW8OKLwODBwKBBQPv2gLR/KyEh8bxT6RT9gQNE\ny5ZA8+bA/TQohWRmAufPA6dPA2fOADk5wLBhwLJlgJRuW0JC4nml0in60ogSEwPs3g2sWwcsXgx8\n8AFQvboRBZSQkJCogJREd1ba7JVNmgAffwxcvgxcuSKacv7+29xSSUhISFQ8Ku2M/lFOngQWLQI6\ndRJn+Q0bGlA4CQkJiQrKMz2jf5QRI4AbN0QPnU6dgPXrgYoxhElISEiYl2dmRv8gUVHAxImAhwew\nZQtQtapBmpWQkJCocDzTm7HFkZsLTJoEaLXA/v1ArVoGa1pCQkKiwvBcmW4epWZN4PBh0fWyTx8g\nIcHcEklISEiYh2dW0QNAlSrA998Dr78uRtZev25uiSQkJCRMzzNrunmUvXtFr5xdu8ToWgkJCYln\ngefadPMoEycCBw8CU6cCv/1mbmkkJCQkTIfRC49UJPr0Aby9gYEDxRQL48ebWyIJCQkJ4/NcKXoA\ncHcXg6uGDAHs7IChQ80tkYSEhIRxeW5MNw/SsSPw55+iGcfX19zSSEhISBiX51LRA0CvXqKtftw4\nMVeOhISExLPKc6voAdFss3mzmD7hCWVsJSQkJCo9z52N/lHGjweys0WbvY+PlAxNQkLi2eO5V/QA\nMHMmoFCI/vUXLwLOzuaWSEJCQsJwPDcBUyXh44+Bc+fESlZSERMJCYnKwHOd1KwsCIKYCK16dWDn\nTqkmrYSERMVHiowtJZaWwC+/ADdvAqtXm1saCQkJCcMg2egfwcYGOHIE6N5dDK4aM8bcEklISEiU\nD8l08wQCA4FRo0Sbffv25pZGQkJComgk00056N5dLEc4ZgyQlmZuaSQkJCTKjjSjL4aPPgLkcuDM\nGcDa2tzSSEhISDyM5HVjAARBTJPg6Aj8+KPkiSMhIVGxkEw3BsDSEvj9dyAkBNi0ydzSSEhISJSe\nciv6ixcvonXr1mjRogU2btxY5DXBwcHo1q0bWrduDU9Pz/J2aXJq1gQOHQK+/BLw8zO3NBISEhKl\no9ymm06dOsHLywuNGjXC0KFDIZfLIZPJCs+TRIcOHbBu3ToMGjQI6enpD50vFKSCmm4e5PhxYP58\ncXbv4mJuaSQkJCRMYLpRKpUAgL59+6JRo0YYMmQIAgMDH7omJCQEHTp0wKBBgwCgSCVfWRg1Cpg2\nDZg8GdDpzC2NhISERMkol6IPDg6Gu7t74fs2bdogICDgoWtOnToFCwsL9OnTB6NHj8apU6fK06XZ\n+fxzoEoV4JNPzC2JhISERMkwemRsQUEBrly5gjNnzkClUmHw4MG4ceMGatSo8di1y5cvL3zt6elZ\nIe35VlbA7t1Aly5Ajx7A2LHmlkhCQuJ5wtvbG97e3qW6p1w2eqVSCU9PT4SGhgIAFi1ahGHDhmHk\nyJGF15w4cQLe3t5YfT95zMSJEzFz5kwMfaRYa2Ww0T9IYCAwerRYirBFC3NLIyEh8bxidBt97dq1\nAYieN3fv3sXp06fRvXv3h67p0aMHLly4AJVKhczMTISGhuLFF18sT7cVgu7dRTPOuHFAXp65pZGQ\nkJB4MuU23axfvx5z586FVqvF4sWLIZPJsHXrVgDA3Llz4ejoiBkzZqBr165wcnLCF198gZo1a5Zb\n8IrAvHmAv7/499dfHw+mUuvUCE4MRmJOIlLzUpGSl4LUvNTCI1eTi7o166KeXT3Ut6uPenb1Cl83\nd2iOOjXqmOeDSUhIPFNIkbHlRKUCevYU3S7nzQPS8tJw8vZJHIs8hjPRZ9DCsQUa2zeGs60znG2c\n4VLTRXxt6wybqjZIyU1BYk4iEnISkJiTWPj6dsZttJK1wuCmgzGo6SC82PBFVKtSzdwfV0JCooIh\npUAwEX+HROCVTw6h+YhjiFWFYVDTQRjdcjSGtxgOZ9uy1SXU6DXwj/fHmZgzOH3nNMLSwtCrYS8M\najoIL7u/jGYOzQz8KSQkJCojkqI3Mncy7+DT85/iXMw5eFR9FdcOjMaVw/3g7Gj4mbeiQIHzMefx\nT/Q/OBh2EB51PTC/63yMbjUaVSylsgISEs8rkqI3Esm5yfjq4lfYc2MPlvRYgiU9lqCmdU3Mnw+k\npwP79hk3+VmBrgAHww5iy6UtiMmKwezOszG782w0qNXAeJ1KSEhUSCRFb2Cy1dlY7bca3wd/j2kd\np+GjPh9BZvNfpG9BAdCrFzBzJrBwoWlkup5yHVsvbcXu67vRr3E/vN/rffRq2Ms0nUtISJgdSdEb\nCJLYfnk7Pj3/KYY3H47PPT9HI/tGRV4bFSUq+xMngG7dTCdjriYXv1/7Hd/Iv0EHlw74qv9X6Fi3\no+kEkJCQMAuSojcAKq0Kbx57EzfTbuLXsb+ivUvxdQUPHgTefx+4dAmoY2IPSbVOja2XtmKFzwr0\nb9Ifn3t+jpaOLU0rhISEhMmQ8tGXk+isaPTa0QuWFpbwnelbIiUPAK+8IiZAmzEDMPXYVa1KNSzu\nvhhRi6PQ3rk9eu3ohTnH5iBeGW9aQSQkJCoMkqJ/An/d/gs9d/TE7M6zsXPsTthUtSnV/atXA4mJ\nYt1Zc1DTuiY+6vMRIhdFQmYjg8dWDyz3Xo4CXYF5BJKQkDAbkunmEQQK+Pri19hyaQv2jd+HF93K\nnq4hJkZMlXD0qJgAzZzEK+Ox5NQSXEu5hu9HfI/BzQabVyAJCQmDINnoS4myQImpf05FZn4m9r+6\nH652ruVu8/Bh4O23gdBQwMHBAEKWk+ORx7Hor0Xo0aAH1g5Za5DPKCEhYT4kG30pUBYoMeDXAWhQ\nqwHOTTtnMAU4diwwfrxYsEQQDNJkuRjVchRuvnUTje0bo8OWDtgctBl6QW9usSQkJIyINKMHkKfJ\nw9Dfh6KTaydsGLYBFgaOdtJqgb59gZdfBj74wKBNl4ubqTcx/8R85Ovy8ctLv6Ctc1tziyQhIVFK\nJNNNCSjQFWDMH2NQv1Z97BizA5YWxlnkxMWJfvUHDwK9exulizLxb4zAx+c+xtLeS7GkxxKjPQMJ\nCQnDIyn6YtDqtXh1/6uoalUVf7zyh9Fzxpw4IWa4vHwZcHIyalelJjorGtMOT4OVhRV+GfsLGts3\nLn0jJJCVJY5qubmApWXRh5MT4OoqvpaQkCgXkqJ/CnpBjzcOvwFFgQJ/TvwT1lbWJun3ww+BK1eA\nkycrnp7TC3qs9V+LVX6rsHLgSszsNLNoM1ZuLiCXiyNWXBwQGyv+jYsTay26uQG1aombEo8eej2Q\nmgpkZgINGgCNGwONGolHkyZA585AmzYV7+FISFRQJEX/BEhi3ol5iEiPwF+v/4UaVR+vX2ssdDqg\nf39g+HDgo49M1m2puJ5yHVP/nIqGtRti++jtqGtVW6ywcv48cO4ccPUq0LWr6DvauLGo2P897lcd\nK5aCgv8GidhY4O5dIDoaCAkRB4IXXhB9Unv2FP+aOsRYQqKSICn6IiCJ90+/D584H5yZegZ21eyM\n3uejJCSIenLPHqBfP5N3XyI02Vk4/sUUOB8+jR5JVqjSwQMYMEAcpXr1AmxKF0BWKtLSgIAAcXDx\n9xeVv5sbMHKk6MbUvbu4cpCQkJAUfVF4BXhhR+gOeE/3hkMN8zm2nzoFzJol6rC6dc0mxuNcvw5s\n3Qrs3g306YMbI1/AqxnfY1TX1/D1gK9NZuJ6CJ1ONBMdOyYGJqSmAmPGAC+9BAwcCNQw3YpMQqKi\nISn6Rwi8F4jRf4xG4OxANKnTxKh9lYTlywFvb+DMGaCKOWuH5OcDBw4AW7aIJpQ5c8RRqGFDAEC6\nKh3TD09HmioNe17ZY/5nFx0NHDkiHqGhwJAhwPTpwNChZn6QEhKmR1L0D5CZn4nOWztj/bD1GOs+\n1mj9lAa9XrRGdOwIfPutGQTQaoEffgC++krcBJ03T8zGVoSyJIl1AeuwUr4S34/8HuPbjDeDwEWQ\nng4cOgT89BMQHy9Gps2cCTRvbm7JJCRMgqTo70MSL+15Cc0dmmPt0LVG6aOspKcDXboAXl6i+dkk\nkKIZ5P33gaZNxQxs7dqV6NbghGBMOjgJQ5oNwdoha026kV0sN2+KCv/33wF3d1Hhjx8P2NqaWzIJ\nCaMhKfr7fOf3HQ6EHcDFGRfNY2MuhqAgcSLt52eCiWhoKPC//4l27u++A4YNK3UTygIl5h6fi/D0\ncByccBDNHSrY7FmjAY4fB3bsAAIDRVPUwoVA/frmlkxCwuBIuW4A+MX7YbXfauwdv7dCKnlA9CRc\nvlzMY69SGamTxERxhjtiBDBxoujMXwYlDwC1q9fGH6/8gbld5qLXjl44fOuwgYUtJ9bWwLhxYoRa\nYKD4UNu3B6ZOFTd1JSSeM57pGX26Kh2dt3bG5hGbMbrVaIO2bWhIUQ9VqQL8/LOBi4vv3i2m0Jw1\nS3Ter1XLYE0HJQRhwv4JmNB2AlYMXGH06OIyk5UF/PgjsGGDuGx6911xg6QEgVmZWi1uqVS4pVIh\nMj8f6VotFDodlA8eej1y9XpUtbBAdUtLVLe0RLX7f6tbWqKmlRXqW1ujYfXqaFCtGhpUq4aG9/86\nVKli8PxKEs8Pz7XpRqCAUbtHoa1zW6wevNpg7RqTvDzRRfztt0VrQ7nJzRVNFv7+otN+p04GaPRx\n0lXpmHJoCvJ1+djzyp6KnfpYqwX27wfWrBGDtj75BJgwAbCyAkncUqlwXqHA1dxchN9X7gWCAHcb\nG7S2sUFLGxs4Va0K+ypVUPv+YV+lCmpbWaGmlRV0JAoEAQWCAPUDr3N0OtxTq3FPrUb8/ePf1wDQ\nwdYWHWvWFA9bW7SztUUNKVZAogQ814r+W/m3OBp5FN7TvFHVqqrB2jU2ERFAnz7AX3+Jm7Rl5vJl\nYNIksTEvL6BmTYPJWBR6QY+vLn6FbZe3Yfe43ejXuIJGgv0LCZw6hbj163G2Xj2cHT8e5+ztYW1p\niQH29uhqZwd3Gxu429jA1draqDPuNI0G1/LycCU3F1fvH5H5+WhcvTpesLODp709+tnbo0n16tLM\nX+IxnltFH5wQjNF/jEbwnGA0rN3QIG2akgMHgPfeA4KDy5D8TBDE+oUrV4pmikmTjCLjkzgVdQrT\nDk/D/3r+D+/1eq9CKqYrubnYmZyM4xkZUOp0GKBWY+DRoxgQHIym8+bBYvJks/vjawQB4SoV/LOz\ncUGhgLdCgaoWFuhnbw/P+0dTSfFL4DlV9DpBh27bu+G9nu/h9Q6vG0Ay87B0qbiPeOoUULWkC5LU\nVNGPXKEQ7fJNzBPYFKeMwyv7XkET+ybYMWaHWdJMPEqyRoNdKSn4NTkZSr0eb7i4YLyTE9rZ2sLS\nwkKc4Z8/D3z+ubhxvWwZ8NprFSa5Gknczs+Ht0KBCwoFzisUsLGywhhHR4x2dETv2rVRtYLIKmFa\nSqQ7WU4uXLhAd3d3Nm/enBs2bHjidUFBQbSysuLBgweLPG8AUUiSa/zWcNCvgygIgkHaMxc6HTls\nGPn22yW84cYN0s2NXLqU1GiMKltJyNfmc9aRWWyzuQ1vpd0yiwxqvZ77UlI44upV2vv4cHp4OM9n\nZVFf3Hfj3DmyRw+yQwfy+HGyAn6XBEFgaE4OP4+JYZeQENbx8eHkmzf5R0oKs7Rac4snYUJKojvL\nPaPv1KkTvLy80KhRIwwdOhRyuRwymeyha/R6PQYPHgwbGxvMmDEDr7zyStlGpWKIU8ah89bO8J/l\njxaOLcrVVkUgK0t0vfzkE3Gi/kR8fMTAoDVrgClTTCZfSdh+SSxqsm30NpNFJOfr9diRnIxVcXFo\nVqMGZtSti3FOTqhZms1NUqzq/tFHgKOjaArr1ct4QpeTBLUaxzMycDQ9HT5KJfra2+M1Z2eMkclK\n97kfQafUQR2vhjZdC71KD0ElQJ9//69KDyFfrI9pWd3y4aOG+LeqY1VY17WGtYs1LKtJKw5jYHTT\njVKphKenJ0JDQwEAixcvxtChQzFy5MiHrlu/fj2sra0RHByMUaNGGUXR83706wv1X8AnfT8pczsV\njZs3AU9PMX99t25FXHDokJi6YNcuYPBgU4tXIoISgjB+33i80fENfO75OawsjeNNkqvXY2tiItbE\nx+OFWrXwsZsbupXXlVSvB377TTTleHgAX39d4ihic5Gj0+FIRgZ2p6TAV6nECEdHvObsjKEODrB+\nxLxDEgUxBcgNzUXezTyo49RQ31OjIL4A6ng1QKBaw2qo6lQVVrZWsLKxEpW4jSWsaoivYQEIBcLj\nR74AbboWmmQNNCkaWNlZiUq/rjWquVZDjeY1UKNVDdi0soFNSxtY1ZS8jMpCSXRnuXacgoOD4e7u\nXvi+TZs2CAgIeEjRJyQk4MiRIzh37hyCg4ONtnl0+NZhRGVGYf+r+43Svrlo2xbYtk0MpgoOBlxc\nHji5eTOwYoVoyDeS66QheKH+Cwh5MwSTDkzCyN0jsWvcLjjaOBqsfaVOh80JCfC6dw+e9vb4q0MH\ndDSUl5GVlZgwbdIkMS/QwIHA6NHAl1+KVbIqIHZVqmCKiwumuLggTaPBgbQ0rIqPx4xbtzAj2x5j\nE2rCJVyH3NBc5F7JhZWtFWp2rgnb9raw62YH2TgZqjWshuoNq8OqtpVBfrMUCF2mDppkDdRJamgS\nNciPykf6oXSoIlTIj8pHVYeqqNGqBmxb26Jm55qw62oH2za2sKgibTiXF6O7FixZsgQrV64sHHWe\nNvIsX7688LWnpyc8PT1L1Ee2OhuL/16MXeN2oVqVauWUuOLx8sti5oLx44GzZwHrqgQ+/lgsQCuX\nm23TtTQ42zrjn6n/4MMzH6Lb9m44NPEQPOp6lKtNHYmN9+5hRVwchjs4wNvDA62NldemenXgnXeA\nGTPEwbVdO2DJEjGdhDFz85cT+2wLjLtYBf1P1UDaPyrkWSng1yoLie6WaDfbCSM9W6BufePnArKw\ntEBVWVVUlVWFbbvH+6NAqOPUUEWokHczD4pzCsSviof6nhq2HW1h19UOdl3tUOuFWqjRssZz7W3k\n7e0Nb2/vUt1jUNPNokWLMGzYsIdm9E2bNi1U7unp6bCxscH27dsxZsyYhwUph+nm7b/fRq4mFzvG\n7CjjJ6n4CIKYfr1xfS025s8WHe6PHwce2Q+pDOy9sRcL/1qIdUPXYUqHsu0pyJVKvBUZCRdra2xs\n0QLupla2MTFiXUg/P9GcM2VKhfDQoUBkB2Qj82QmMk9lQhWpgn0/ezgMdYDDUAfUaF4DJHFBqcSO\npCQcy8jAMAcHzHZ1xQB7e9EDqQKhU4orj+zgbOSE5CDbPxvUEPae9rD3tEftfrVh427zXCt+k7hX\n/rsZ6+bmhmHDhhW5GfsvM2bMwOjRozFu3LgyCVsUIYkhGLV7FG6+ddOg5oCKiDJdi6AmE9CyiRaN\n/PdW6qyMN1Jv4OW9L2NEixH4bvB3JQ5qS9Vo8EF0NM5kZWFts2Z41cnJvD9yPz8xnYJWK26Gl3AV\namhUt1VI+S0FKb+lwNLGErIxMjgMdUCtXrVgaf3kAShLq8Xu1FT8mJQEpU6H+fXqYaarKxxL7NNr\negruFkDhrSg89Pl62Hvao86AOnAY7oDqbtVL3SZJ6PVKaDTJ0GhSoNGkQKtNhV6fB0FQQxAK7h/i\na1IDC4uqsLSsBkvLarCwqFb42tLSBlWrymBt7YSqVWWoWlX8a2VlnN+rSRT9hQsXMG/ePGi1Wixe\nvBiLFy/G1q1bAQBz58596FpDK3qdoEP3H7tjSfclmNpxatk/RGVAEIBp05AXl4FW4Yex8w9rDBxo\nbqHKh6JAgSmHpiBbnY19r+5D3ZpPLrWlJ7E1MRHL797FG3XrYlmjRrCrKEVGSGDvXnGG37WrmPbZ\nBOY0bYYWqXtTkfJbCgpiCuA82Rkub7igpkfNMg1+QdnZ2JyQgKMZGRgnk2FB/frobGf+GIjiKLhb\nAMUFBbLAeqYoAAAgAElEQVROZyHzVCas61rDYbgDHEc4otaLtWBZVRzoSB3y86OhUt166FCr70Gr\nTYWFhTWsrV1gbV0X1tYuqFrVGVZWNWFpWf3+Ua3wtYVFVZDa+4pfDVJdOBDo9SpotemPHGkAAGvr\nuqhevTGqV2+C6tUbo0aNJoXvra1dYWFR+lXhMx8wtT5gPY5FHsOZqWee7aUbCSxYILrg/PUXvINs\nMGECcOEC0Lq1uYUrHwIFfHHhC+wI3YF94/ehZ8Oej10TnpeHqbduwdbSEptbtkS7irqSyc8XZ/Xr\n1gHz54uK3wipJ7IDsxG/Jh6ZpzLhONwRLm+4wGGIg8E2LdM0GvyYlIQtiYmoX60aFtavj/FOTo95\n7FREqCdyQnKQ/lcy0q8GosDmEqr0iwQaR0FbLQ7VqtWDjY37A0crVKvmBmtrF1hZGdf8p9eroNEk\noqDgLvLzY1BQcBcFBTGFh16fBxub1rC1bXf/aAtb23awtq73VP32TCv65NxktPu+Hfxm+aGlY0sj\nSlYB+PBDcRf27NnCzJM//ywWhgoMrJRm+sc4HnkcM4/MxOeen2Ne13mF34cfk5LwUUwMVjRpgtmu\nrpVjQL93D/i//xNH4pUrgddfL3c6UgpExokMxK+OhzpOjQbvNEDd6XVRpbbxVjU6EsczMrApIQFh\neXlYUL8+5tarB1kFNOvodAooFD7IzvaDUumH3NxLqF69CWpW7QHLqHbI/6cBsv+sjdoeTpCNk0E2\nVoZqrhXLcUOnUyAvLwx5eTfuHzeRl3cDpAY1a3ZCrVovwM6uG+zsXkC1ag0KfwvPtKJfcHIBqllV\nq3AVowzON9+IPvIXLoiBOw+wdKkYK3X2LFCtYn1ny8TtjNt4Zd8r6OTaCSuGbsTb0fGIys/HnjZt\nTL/Zagh8fcVUpNbWYmK5IgMhno6gFpDyewriv4uHpY0l3N53g9N4J5O7HN7Iy8O6+HgcSk/HJGdn\nLGnQAK3M+H9CEvn5kcjIOI6MjBPIyQlBrVrdUbv2i6hVqxdq1eqOKlVqP3SPPk+PzFOZSD+UjowT\nGbBpYwOncU5wetWpTHZ9U6HRpCIn5xJycoKRkxOM7OwgWFhYwM7uBdSq9QIaN/702VT0UZlR6PFj\nD9xaeAsym2dgOvskNm8WzQA+PkX6bAuCmGG3Rg3g118NnMPeTORp8jD2789wocaLeN21EX5o0wnV\nK4HJ4IkIArBzp+gOO3y46Jr5UDDEE24rEJCwOQHxa+JRs2NNNHy/Iez725t9RZOi0eD7hARsSUzE\nC7Vq4Z0GDdDf3jRykTooFBfuK/fj0OtVcHQcBUfHUahTZ0CpNjsFjQDFOQXSDqYh/c902LjbwHmy\nM5xedYK1c8UsUPQvJKFWxyMnJwjZ2cFo3nzVs6noJx+cjLZObZ+pCNjH+PVXUTlcvPjUjT2VSnT0\nGD0a+PRT04lnDHQkvoqNxdbERLxkEYk/ff8PP7/0M0a0GGFu0cqPUikGWf2r9BcsKDJbHQUidU8q\nYj6OgW0HWzT5sglqdjBuiumykK/X4/eUFKy7dw/VLS3xgZsbxjs5oYoRFH5u7nWkpOxESsouVKvW\nADLZS3B0HAVb244GGWAEjYCsf7KQ8kcKMk9kolaPWnCe7AzZyzJUqVVBNvyfgkmSmhmKkopyKfES\nXb9zZa4618gSmZHjx8m6dcmwsBJdnpRENmpE7t5tXLGMSapazb6XL3PQlStMLCggSfrG+bL+mvpc\ndn4Z9YLezBIaiPBwcsgQsk0b8syZh05lnstkSJcQhnQLYZZ3lpkELB16QeCx9HT2vnyZTfz9uene\nPebpdOVuV61OZXz8egYHd6KfXwPeubOUeXnGT46ny9UxZU8Kr425xou1LvLGhBtMP55OQVtxEttl\nZ2fzxIkTfO+999ilSxfTJDUzFCWd0Q/9fSjGthqL+d3mm0AqMxAWJk7Rjx4FevQo8W3Xr4vR+YcO\nAb17G088Y3AzLw+jr1/Hay4u+KJx44eCdpJzkzHxwETYVrXFby//9mzESvybMO2dd4BOnZA39xtE\nb1AjLywPTVc0hdMEJ1hYVj47nJ9SidXx8fBTKrGgfn0sqF+/VP74JKFQnENCwkYoFN5wdByDunXf\ngL19f1hYmD4PjjZTi7R9aUjemYyCuwVwfs0ZdafVNfkKS6VSQS6X4/z58zh//jxu3LiBbt26oX//\n/ujfvz/69u37bM3oz9w5w+YbmlOjM38aXqOQkUE2a0bu3Fmm20+dIp2dyevXDSyXEfkrI4NOcjl/\nS05+4jUanYb/O/U/NlrXiAHxASaUzrhoU3MZ2eN3yi0OM27Iduqzno1VanheHmfdusU6Pj5cHBnJ\nuPz8p16v1xcwKekXBgV1YGBgGyYkbKNWm20iaUtG3q08Rn8cTT83PwZ7BDNubRzVqWqj9ZeWlsaf\nfvqJo0ePpp2dHXv37s1PP/2U586dY/4jz7MkurPSKHpBENh1W1fuub7HRBKZGK2WHDSIfPfdcjWz\nezfZoAF5966B5DIiG+/dY11fX8oVihJdfyjsEJ1WOXFj4MZKX28g/WQ6/dz8GD49nJor0eSrr5KN\nG5MHD1bI/PdlIaGggO9FRbGOjw9nhIfzVl7eQ+c1mnTevfsVfX1deeXKYGZk/F3h/18FvcDMs5kM\nmxpGn9o+vPHKDaafTKegK7/csbGx9PLyoqenJ2vVqsVx48bxt99+Y2Zm5lPve6YU/b4b+9h5a+dn\nx1b7KEuWiLZbAxSN8PIiW7YkU1MNIJcR0AoCF0RGsk1gIO+oVKW6Nyojih5bPDhh/wRmF1SsWV9J\nUKeqGfZ6GP2b+DPjn4yHT549S7ZtKw74JdyfqQxkaDT8PCaGTnI5x9+4weD0cEZEvEUfH3uGh89g\nTs41c4tYJrQKLRN+SGBI1xD6NfBj9CfRVN0p3fdZoVBw69at7NGjBx0dHTl9+nQeOXKEqlL8Lp4Z\nRa/RadhiQwv+E/WPCSUyIT/9RLZoQRYzcpeGjz8mu3YlsyuYLlRotRxy5QqHXr1KRRkHNZVGxTlH\n57DVxla8nlI57FSCIDD592T6uvjy9ru3qct9woalRkOuX0/KZOLqroSrncpApiqJey/P5rHzdvzG\nbxrPp96q8DP4kpJzNYeRiyMpl8kZOiCUKXtSqC8oelKq1+t59uxZTpkyhbVr1+a4ceN47NgxaspY\nGe6ZUfRbgrdw4M6BJpTGhPj5kU5OBp/BCQI5Z444OVQbz5RYKpLVarYPCuKCyEhqDfAD33llJ2Wr\nZPwl9BcDSGc8Cu4V8OrwqwzqEERlkLJkN6WkkDNnit5XP/1E6ivvSlarVTA6+lP6+DgwMnIBs1X3\nuD0xkc0DAvji5cs8mZ7+zCh8fYGeKX+kMHRAKOVOcka9F8W8CNFkFR8fz2XLlrFx48bs0KED169f\nz7S0tHL3+Uwo+jxNHuutqcfghGATS2QC4uPJevXIEyeM0rxWS44dS06caH49EV9QwFaBgfw8Jsag\nP+rrKdfpvsmd0/6cxhx1jsHaNRTpx9Pp6+LLmOUx1GvK8J8QGEh2706+8AIZULk2onW6XMbGrqRc\nLmN4+HTm58c8dF4rCNydnMx2QUHsFBzM/ampxdfzrUTkReYx6v0o/ljnRw5zHkZ7W3u+Ne8tXrp0\nyaC/gWdC0a+4uIKv7nvVxNKYAJWK7NKFXLnSqN3k55P9+pELF5pvjy9apWJTf3+uio01Svu56lxO\nPzydrTa24pWkK0bpo7To1Xrefvc2/dz8mHWxnD7xer3oieXqSk6bJgZOVGAEQWBKyh/082vAGzfG\nMzf36atVvSDwSFoaXwgJoXtgIHcmJVFj7plJOdHpdDx06BB79+5NNzc3Lp+6nD79fMRZ/vtRVN0u\nnS3/aVQ6Rb948WLu2rWLUVFRFASBygIlHb91ZER6hLnFMzxvvUVOmGAS7atQkB4e5Icfml7ZR+Tl\nsaGfHzfdu2f0vn67+htlq2TcHLTZrKYA1W0VQ7qE8PpL16nJMKArsFJJvv8+6ehIrlpVcWxyD5Cb\ne4Ohof0ZFNSBCoVPqe4VBIGnMzPpGRrKxv7+/CEhgfmVTOHn5ubSy8uLTZs2Zffu3bl3715qH9iL\nyovMY9R7UZTL5Lwy+ApTD6aWbaX3AJVO0a9atYqvvPIK69evT5lMRvde7mw/qT1v375tbvEMy59/\niq50JtxoS0sj27cXN2lNpQOv5+aynq8vdyQmmqZDkhHpEey0pRPH7R3HTJXhNrdLSvLuZMplct7b\neM94g01EBDlihLiBf/RohXDH1GqVvH37XcrlMt67t5GCUD7vMV+FgiOuXmU9X1+uiYtjrgGibY2J\nSqXi2rVrWbduXY4bN45+fn5PvV6fr2fy78m83PsyfV19Gf1pNPPjnh5v8CQqnaJ/kKi7UbSfZs/X\n57xOJycnDh48mH/++edDo2OlJD5ejGoq5otgDFJTyXbtyM8+M35fl7Kz6eLry91PCYQyFgXaAi46\nuYiN1jWiX5xpnrNOpWP4zHAGtAxgTqiJ9gr++ot0dycHDyZv3DBNn48gCAKTk3+nr289hofPoFqd\nYtD2L2dnc/yNG3SSy/nl3bvMqmC///z8fG7YsIH16tXjyy+/zKtXr5a6jdzruYxcGEmfOj68NuYa\nM/7KoKAv+eBdEkVfYVMgbAnZgmORx3DitRMoKCjAgQMH8P333yM+Ph5vvvkmZs+eDdciMjqWh7w8\nIDYWyMoCMjPFv/8eCgVgZwc0aAA0bPjfX3v7UmSN1OvFPAWDB4uJrcxAairQvz8wcSLw2WfG6SMw\nOxtjrl/HlpYt8bKTk3E6KQGHbx3G3ONzMb/rfHzS9xNUsTROgip1gho3Xr6BGs1qoNX2VrCqacJw\nfa0W+OEHsTjBhAnA558/ls7aWBQUxCIiYha02ky0aLEZtWs/XjTGUITn5eHb+HgcS0/Hm/XqYUmD\nBnCxNl+WSbVajR07duCbb75Bp06dsHz5cnTu3Llcbepz9Uj5IwWJPyRCp9Sh3rx6cJ3hiqqyp6eR\nqLRJzbR6LZusb0J5rPyx60JDQ/nmm2/S3t6eEyZMKJdZJztbnBR9+CHZowdpa0u2aiW+HjGCfP11\ncRPz00/JNWvI5cvJWbPIoUPFuJZatUgbG3FSNXs2eeAAmfW0fbcvvyQ9PUkzL0OTk8nWrUVxDM3V\nnBw6y+U8kZ5u+MbLQEJ2Agf/Opg9fuzBqIwog7evDFTSr74f735917wugunp5IIFoquul5foj28k\nBEFgQsI2yuUyxsZ+W24zTWmIyc/nWxERrOPjw4WRkbxbTHoFQyMIAnft2kU3NzcOHz6cgYGBRulD\nGaBk+LRw+tj7MGxKGBW+iid+v0qixiukot91bRf7/NTnqdcrFAquWLGCjo6O/Pjjj5mbW7I8ISEh\n4n5Wt26iYu/XTzRlnD1LPhKhXSKUSvLqVfG3NWwYWbMm2bs3+dVXYl+Fe0m+vqLJxgSbkiUhKUkc\n1FasMFybkXl5rOfry30phl2+lxe9oOc6/3WUrZLx59CfDaaQk3clU+4kZ9rh8vtCG4zr10VTTqtW\n5JEjBrff5+fH8cqVIQwJ6cLcXPOYi0gySa3mB1FRdPDx4fQi0isYg4CAAPbo0YNdunThxYsXjd4f\nSWoyNIxbE8eAFgEM6hDEhB8SqM1+eGAtiaKvcKYbkui4pSO+HfQthrcYXux9CQkJeP/99+Hr64vv\nvvsO48ePfyxHtUYDHDgAbNwIJCUB06YBAwYA3bsD1Q1cWCY/X0wh//ff4qFQAG++UYC3/ugDl42f\nAC+9ZND+MvMzcTP1JsLSwhCeHg6lWgmBAvSCHnrqC18DQP1a9dG8TnM0d2iOFo4tUFXVCIMHVMWs\nWWLlu/JwT61Gn9BQfNyoEWYb2KRmKK6nXMdrh16Du8wdW0ZuKXMmTApEzMcxSN2binZH2qFm+wqW\nL54Uv3zvvQc4O4t1bMtpViCJ5ORfEB39ARo0WIKGDT+ApaX5SwpmabXYlJCAjQkJ6Gdvjw/d3NDF\nwAXN7927h6VLl+LcuXNYsWIFpk6dCksTF8OhQGSdzULiD4lQeCvgPMkZ9ebXQ832NStnKcHjkcfx\n6flPcfnNy6UqKnDhwgUsXLgQzs7O2LhxI9q0aYOkJGDrVmDbNrGI9qJFYoEOKxOaUMPDCK/RZ7A3\n4UWMnWyDd94BOnQoW1vKAiVO3D4B/3v+hco9X5ePNk5t0MapDVrLWsOhhgOsLKxgaWEJK0urwtcA\nEJ8dj6jMqMIjIScB9WwbIi3cHb1cB2LDwhFoJWtZ6mIO6Vot+oaGYqarK95r2LBsH85EFOgKsPTs\nUhwIO4CfxvyEwc0Gl+p+XbYO4VPCoVPq0PZAW1g7VeBqRDodsGMHsHw5MHQo8PXXQP36pW5GrU5C\nRMRsaDSJcHffiZo1y/gFNiK5ej1+TErCmvh4tLaxwYdubuWufKVSqbB69Wps2LAB8+fPx4cffoia\nRij2XlrUCWok/ZiEpO1JqN64Ojr7dq5cNnpBENhrR68yZ6jUarX08vJinTrd2Lr1JdrbC5w3z2wO\nCSI7dpDt2jE9XsWvvxYDYQcOFGuLlMRFODU3ldsvbefw34fTboUdR+0exbV+a3kq6hTjlfHlMkMU\naAt4K+0Wd/gdoGz6m7T9tAGbrG/CBScW8ETkCeZpil8OK7VadgkJ4Ud37pRZDnPwT9Q/dFvnxjeP\nvVni5GgF8QUMahfEiLkR1KsrkX+3UkkuXUo6OIgbTqVIgJSR8Td9fesyOvpT6vUVPz24Wq/nz0lJ\ndA8MZLeQEB4sY7Tt0aNH6ebmxokTJ/JuBU0FK2gFph1Jq3w2+gt3L7D5hubU6cu2WZmbS370Eeng\noGfr1jvZqVN/RkdHG1jSUhAVJQa3PDDSqNXkb7+RnTqJRYZOnXr8ttTcVHoFeLHfz/1Y+5vanLB/\nAvdc32PUbI1KJdnPU+DQN67xa++V7PdzP9ZcUZOjdo/iicgTRWYNVel07BcayrciIiplrhJFvoKz\njsxio3WNeObOmademxuWSz83P8Z+G1spPytJMjaWnDqVdHEhN258asCVIGh5586H9POrz6ys86aT\n0UDoBYGHUlPZLSSErQID+WNiIgtKMLNKTEzk+PHj2bx5c549e9YEkpafSqfoh/42lNsvbS/1vYIg\npvF2cyMnTyYTEsSd6zVr1tDJyYmHDx82gsTFoNeLHjbffVfkaUEQ98qaNhXz0URHk7GKWC46uYh1\nVtbh1ENTefTWUeZrTedVkJ8vyjJkiDhoZuVn8afLP7Hz1s5s5tWMa/3WMitfdCvS6PUcde0aX7t5\ns9LnJzkZeZIN1jbg/OPzi8yXowxQ0tfFl0k/V+zUAyXmyhXRc6BZM3LPnseWlvn5cbx8+UVevTrM\n4H7xpkYQBJ7NzOSwq1fp6uvLb2Jji/TF1+v13LJlC2UyGT/++ONSpQk2N5VO0ddfU58F2oJS3RcR\n8V8JzvPnHz/v5+dHNzc3vvvuu2VOA1omfvhBTERVjCtlfj65+MswWk+YxhrLHLjkxPtMyE4wkZCP\no9WSM2aILqYZ99OlC4JAvzg/Tj4wmfYr7Tn32Fy+HHCUI69dq/Q5Sf4lKz+LMw7PYJP1TXgu+lzh\nv6efTKdcJmf6sYrhLmpQzp4Vc1l36VJYvzYt7SjlcmfGxq6k8IzVfriSk8MpYWF08PHhu7dvF1a+\nunnzJl988UX27NmT1ytTebb7VDpFv8ZvTYmvV6tFM42jo+jj/jQdnp6ezhEjRrBnz56Mi4szgLTF\ncPeumE/85s2nXhZ4L5Av73mZzqud+d7RL/ny5Ey6uZH795s3ql0QRBfUtm0f9wZNzE7koMPvsMo3\nMg76dQhDk0LNI6SROBF5gvXX1OfcY3N556c7lDvLqfB9dnLCP4YgkHv3Ut+yKW+vbEQ/77pUKHzN\nLZVRic3P5zu3b9P+/Hl2WLCAdRwd+f3331NfSSctlU7RlzTN7N274mR5zBjRTFMS9Ho9V65cSWdn\nZ/7111/lkLQYBEFcYnz99RMvScxO5KQDk9hgbQN6BXgxV/1fDIC3t5iTZuhQ0oQpYork229Fc9iV\nBxJC7k9NZQM/P0bnZXNz0Ga6rHbhG3++wViFcTJTmoOs/CyunbWW++338+CRg5XXJl9C1OoUXr7U\nm9eOtqempatov6uEM9vSEBYWRo/Ondmqf3+6HD7MQVeu8GR6eqU0Q1Y6RV8Sjh8X447WrCnbrPfi\nxYt0cXHhjz/+WPqbS8JPP4k7rUUsMXR6HTcGbqRslYwfnvnwiV4tWi25bJlYc+LYMeOIWVL++ENc\nnBw+TAYqlZTJ5bz0gNeGskDJj89+TIdvHfjB6Q8KbfiVFUEQeOfDOwxsHUh5gJxtN7flyF0jeTer\nYnpelJfs7Ev083NjdPSnoqlGpRJ/XC4u5GuvkZGR5hbRoOj1eq5fv54ymYxbt26lIAhU6/X8NSmJ\nHsHBbB0YyG0JCVRV8CRqD2ISRX/hwgW6u7uzefPm3LBhw2Pnf//9d3bo0IEdOnTg5MmTGRFRdMrh\n4oTVasVUBQ0bkvLHMyOUioiICDZp0oRffPGFYWdr9+6JWjH0cXNGcEIwu2ztwr4/9+WNlJL5e/r4\nkI0aiWkYTBzp/RCBgaRLh3zWOuXLP1OLjgK9p7zHWUdm0Xm1M9f7r6daV/FS6BaHIAi8/e5tBncK\npiZdHKjVOjW/uvAVHb915Bq/NdTqK1ZSrfKQnLybcrmMqan7Hz+ZnS2Gd8tkYt4PI9USMCWxsbEc\nMGAAe/XqVWTqFEEQeC4zk6OuXaOzXM7PoqOZVAFTQT+KSRS9h4cHL1y4wLt377JVq1aPlcby8/Oj\n4n463l9++YVTpkwptbCJiWTfvqJFxFAFr5OSktipUyfOnTuXOkOM3oJAjhol+ik/gCJfwYUnF9Jl\ntQt/Cf2l1ANLVpaYtr5dO/OtppVaLd19g1h/SRzfeOPpg8615Gsc9vswtt3cloH3DJ8HxFgIgsDb\nb99mSJcQajIfX41Fpkey/y/92XlrZwbEV65KT48iCDreufN/9PdvwpycYgq1ZGb+67NMvvkmGRNj\nEhkNiSAI/PXXX+nk5MQVK1aU6PcenpfHeRERtPfx4ZSwMAYpS1gC0gwYXdErFAp6eHgUvl+0aBGP\nHz/+xOvT0tLYsGHDogV5grBnz4qFdT7/3PC5wJRKJQcNGsSXXnqp/O5Uu3aJ2viBGcDZ6LOsv6Y+\n5xydw/S8snttCIJoEZLJyM2bTbtRqxUEDr96lXMjIpibK3D8eLJnTzEx2pPlFfjH9T/ovNqZH5z+\nwKQuomVBEARGLopkSLcQarOePGMXBIG/XvmVrt+5cvrh6UzOMX0K5vKi1Wbx6tXhDA3tT42mFDl6\n0tPFYgYODuIMv5IEyCmVSk6cOJFt27ZlaBEr7eLI1Gi4Oi6Ojfz92ePSJe5OTqa6gm3aGl3Rnz59\nmpMmTSp8/8MPP/CTTz554vVff/0133rrraIFKULYnTtFe/zp0+WR8umo1Wq+/vrr7NWrFzP+9Scs\nLcnJoqBBQSRFW/zy88vp+p0rT98xnPAREaIn3Pjxop+7KVgYGcnBV64UulHq9WISuEaNHt6kLYrk\nnGSO3zeerTa2Mlle+NIi6AVGvBXBS90vUasomVlGWaDke/+8R9kqGdf6raVGV/EjRklSpbrNgICW\njIxcVPYo14wMcdXq6EhOn16hbfghISFs1qwZ582bV+6JnE4Q+GdaGvuHhrKery+/iImpMGadCqXo\nT58+zdatWzPrCXl8AXDZsmWFx7x55+nmRoY9vdykQdDr9fzggw/o7u7O2LLYIl99lfzgA5JkUk4S\nB+wcQM9fPJmYbXi3mYIC8o03xP3e+HiDN/8QWxMS2DowsMgAk383abdvL36Fsf/mftb9ri7fPfVu\nidIqmApBLzBibgQv9bxErbL0tvfwtHAO+W0IW29qbdAB3RgoFH709XVhQsIWwzSYlSXm7XZ0FDdt\ny1Bww1gIgsCNGzdSJpNx7969Bm//Wk4O59y6RXsfH068eZPeWVkm9cw6f/78Q7rS5KabhQsXFmm6\nuXr1Kps1a/bU3PH/CqvXk//7nxgAZQqX9wdZt24dmzRpUrrcFidPihGGKhXP3DlD1+9c+dn5z8qc\nxqEkCIJYMrRePTLASOZif6WSTnI5I56S/jUsTLRWvfZa8elT0vLSOPnAZDbf0LxC2LgFvcBbs2/x\n8ouXH0v7Wqp2BIF/hv/Jxusb8+U9LzMyveLNcFNTD1AulzE9/YThG1coRD9cV1exiMPFi2YNAsnK\nyuK4cePYuXNno5cgVWi13BAfT/fAQLYJDOSme/eoNEMFLJNuxsbExBS5GRsbG8vmzZszoBiNBIAa\njZiKo1ev/6IyTY2XlxebNGlSspm9SkU2bUrdiWP87PxnBjfVFMfRo2KdiV27DNtuslrNBn5+PJJW\nvA03L08sutKyZfGmHJI8GHaQTqucuN5/vdn80wVB4K05t3i5T/mU/IOoNCp+ffFrOn7ryIUnFzI1\n10BeA+UkPn4dfX3rMTv7knE7ys8nt24VJz29eolfThPbsoOCgtikSRMuXLiQBQWli7AvD4Ig8HxW\nFl+9cYP2Pj6cGxHBkFIkjisrqankzJkmUvTe3t50d3dns2bN6OXlRZLcsmULt2wRl4izZs2ig4MD\nPTw86OHhwW7duhUtCMDhw8mRI8tWAMSQrFu3js2aNWN8cbaRZcuY+eooDtw5kP1/6W8UU01xXLsm\n1hn/6CPD/K40ej37Xr7MT0uZDG7XLtGU88MPxU/o7mTeYZetXThu7ziT+90LgsDb79zmpR6XqMsx\n/KorNTeVi04uouO3jvz64tdmM1UJgo6RkYsZGNiG+fkmjAHQ6ci9e0XbYtu2oheBkX2D/zXVODk5\ncf/+IlxFTUhiQQG/vHuXjf392Sk4mN/fu0eFEWb5J0+Ki6j33quEAVPTpxu1AlqpWLNmDZs3b857\nT+evzjoAACAASURBVKoIdfs2o5vY031dc77919tGNdUUR2oq2aePGNCYU8661Etu3+aIq1fLFCEY\nEUF27Ci6gxbnjVagLeCCEwvY1KspLyUaebb5ADHLYxjUIahIF0pDcjvjNl/d9yrrr6nPHy/9aNLv\nh06Xx+vXxzI0tD+1WjMFsAmCmJp12DAx+Gr58qe7apURlUrFadOmsX379oyKMnypyLKiFwSeysjg\n+Puz/Onh4fRVPLkcYEnJyyPfekuMJzp3PyVTpVP0FS36ePXq1WzRosXjyl4QGPhKD7p+XoteAV7m\nEe4R1GrRCaJ7d9ETrizsSk5ms4AAZpZjtFWpyHnzRK+cf/4p/vq9N/ZStkrGH4J/MLopJ25NHANa\nBlCdbDpviYD4APb5qQ/bbG7DvTf2Fpnu2ZBoNOm8dKkHw8KmUK+vGF4hvHmTnDOHtLcXM+Zdu2aQ\nZmNjY9mlSxdOnDixxKVEzUGKWs1VsbFsGRDA1oGB/DY2lgllMC0FB4sVIl977eHa1JVO0VdEVq5c\nyZYtWzLxgcQzh3/6gLIPrXj4xgEzSvY4giA6/7RpU/rStFdyciiTy3m1vEuC+/z9t5gnZ86c4mf3\nEekR7PBDB046MKnE+Y5KS8K2BPo38md+nOl9+gVB4MnIk+y2rRvbfd+O+2/uN4rCLyhIYFBQW0ZF\nvVcx8/OkpYnRtq6uYvWdw4fFkPcycP78edatW5erV6+umJ+1CARBoI9CwVn3PXaGX73KvSkpzC/G\n5qrVio/NyUn0dnsUSdEbiBUrVrBVq1ZMSkqi14VVdH3fkkFHDeSmZgS+/Va02z8h28RjZGg0bOrv\nz90GXlorlWIwpZubqPifhkqj4vTD0+mxxYNxCsO6W6X8kULfer7MizTv5o8gCDwWcYxdtnZhhx86\n8FDYIYMpKZXqNv39mzA2dqVB2jMq/1bf6dlTtEF8+aVYrb4ECILAdevW0cXFhaeNGWBjZHJ1Ov6W\nnMyBV67QwceH8yMi6K9UPvZ9iIsje/cmBwx4sheipOgNyGfLP6NsioytPnVgzIyXzS1Osfz4ozhx\nunz56dfp70e+vmNEV7R//hFNObNmid54T0IQBK72Xc16a+oZzAUz7Wga5c5y5lwzzkqhLAiCwCO3\njrDTlk702OLBQ2GHyjXDz8m5Sl/fekxI2GpAKU3E5cv/mXUmTiQvXHjibr5KpeLrr79ODw8P81aO\nMzB38/P5RUwMWwYEsKm/Pz+JjmZ4Xh6PHhXjML/55umOFpKiNxBqnZqv7H2F9T9wZi+7KsyvoDUk\nH+XgQXG55+395Gu+vnuXfS5fptbIy9/sbNF236ABeejQ0z1zjt46StkqGf+4XsQ6tRRknc+i3ElO\nZWDFzFPyrw9+121d2WpjK26/tL3UhXcUCl/K5c5MSSlbneUKQ1YWuWED6e4u2h7XrhVNPfdJTEzk\nCy+8wEmTJjHP3G55RkIQBIZkZ3Pxzdu0nZhA67oFXHQouVh7fqVT9KmpFcvmTZL52nyO3DWSY/8Y\ny7y+L3JC584cN26cYRKhmYCzZ0Vlf+TI4+cuZmXRxdeX8Sb0OT53TvS6GzTo6XVZriZfZaN1jfjZ\n+c/KNNvNuZpDuZOcmWczyyGtaRAEgedjznPY78Po+p0rV/qspCK/+GInGRl/Uy53YkaGEesrmBpB\nEEvFTZ1K1q5Njh/P0E2b6ObmZvhssxWQqCix6NfoMQIP3sni9PBw2vv40DM0lN/fu8fkItIuVDpF\nL5c7MS+vhIZlE5CnyePgXwdzwv4J1Oz8iezShQV5eRw4cCDffPPNSvOlCw4Wc9vv3v3fv6VpNGzo\n9//snXd4U+X7xu8Wyiyre0BbWkaZZU8VUBAZsgUHQxFBxYU//SrKcLNkKQoCyhJRVJCtIDuddNDd\n0tJJd9Pd7Jz798dhWOlI06RJsZ/req+TJifveZImd97xDD+e0tdFpw6oVOTWraLf/VtvVfQg+CfZ\npdkcvns4Z/86u1b+6PJUOf06+jHnUMOrdxqeHc65R+bSZp0N3z37LtOLK4/lyM39lRKJA4uK6piz\n25wpKuKxl1+mXdOm/MXGhlyxosEkU9OHX34RB2VbtlSc8cq1Wv6Rl8dno6PZ7upVjvmX6Dc4oc/I\n2M6goN7UaEzvKlWqLOWoPaM478g8qosKxAXv29G9JSUlHDhwIFf+KyWxORMZKYr9wYPiuvykiAi+\na2K/49xccXnWyUncU6hsHVKulnPukbkctHOQTtkiVVIVA3sEMm1TPefPMDAphSl888yb7LC2A2cd\nnsVLyZfuDiyysw/Q19e55hTDDRhBELh+/Xq6uLgwMDBQzKXz5pvi6GDkSDEyzwSDFGOgUIi+8V5e\n4qCsOmQaDY/m5fGZ26L/aFhYwxN6QRAYEzOPMTHzTDpaLpIXcfju4Vx0fJEY6LJ8uZhJ7B/k5OSw\na9eu/Prrr01kZe2JihJ/r57Zks9hISFmU9g7OFh0wPhHjeoKCILAjy5+RK+tXkyQVr1prJFpGDoy\nlIn/Zz6BM3WlWFHMbYHb6L3Nm72/7c2f/BZQ4uvCsrLq6xE3ZJRKJRcuXEgfH5/7azyrVGLZtTlz\nyLZtxXqihw+LARwNkLQ0sSzq9OnVOypUxh3Rb3BCT4pRfUFBvQ2XZa+WSGVSDto5iEtPLRXXhpOS\nxAx9lTimJyUl0dXV1SgZ8ozFT4GltLRVctP3ZhJMcxtBEJeWunQhR48Wq2v9m53BO+n8pTOvZdw/\n7BE0AiOnRTL6mWgK2oaxpFYbBEHg+fBlPP53S/be2o5vnnmTMbn1kNq1npFKpRw1ahSnTJnC0ppi\nOoqLyb17xQ2fDh3IBQvEWqNmkj64Js6dE2ez69bVLQ9cgxR6kiwvj6dEYseSkhrmMQYmtyyXPtt9\n+PZfb9+bUcycKfr5VkF4eDgdHBx44U48shlToFLR3d+fX/sW0MVF/I6YG2q1mB7F3V0skH47xf9d\njsUdo/16e/6ZcM8xXxDEnPJhj4ZRqzCPWYqhuXVrG/383CiTJTClMIXv//0+nb504vDdw7krZBeL\nFebpWVQbkpOT6e3tzbfffrv2zg4ZGeLi9siRoujPny+O/OvR0UBXtFry88/F2bUhZKPBCj0pbjb5\n+7tTpaqfdTipTMq+2/ty+d/L74n8pUui4tQwLTx//jwdHBwYGxtrfEP1RBAETo2M5Ju3/eVjY8U0\nx3v2mNauqlAqyW+/JV1dxdn5PzNj+qb50nGDI/df30+STPk8hdd8rumVU74hkJa2if7+nSmTVfQd\nV2vVPBF/gtN/ns52a9pxwdEFvJxyucE4CfyTkJAQuri43E2MWCdu3RJ3+x96SBT9efPIo0frr1pP\nNRQWkk8+KS5V1jZ6vSoatNCTZELC2wwPf0KsTm9EShQlHLJrSMWRvEZD9utH/qybf/KePXvo6enJ\nnBzz9PTYmp7OQcHBFcqgxcaKQvr99yY0rAZkMnLzZnGK+8QTYvCVIJAxuTF02+zGlV+vpJ+7HxUZ\n5jdyMwSpqesYEOBFubz6tNk5ZTnc6LeRPb/pyS5fdeGqi6sYm2e+A49/cubMGdrb2/P33383fOcZ\nGaJ//mOPkW3aiHWdd+4UC1HXM+Hh4obr668bdnWpwQu9VqtiaOhIpqR8YbTrlqvK+cieR7jkxJKK\nI6Fdu8QRQS1GRytWrOCwYcPqXn/WwITdzmOTWIldcXGi2O/fbwLDaoFcLv4g9epF9ukjzkTCT0bT\n83VPLj241OjJwkxBSsrnDAjoRoVC96GfIAgMuhXEt/58i85fOrPfjn5ce3UtUwrNM8hv9+7ddHR0\npK+vr/EvVlAgbgQ9/bQYiTtkiJhEJizM6MVSDh8WHYZ+/NHwfTd4oSdJuTzVaP7CCrWCT/z4BOce\nmVtRKIqLxSFkcHCt+hMEgc8++yxnzpxJrZl4tJRrNOwRGMgD1eSxiY4WX66JU3nrhCCIeXPmjCzn\nUUtfrluYxKHfjeTzfzxPtfbBWbpJTV17W+T1H3lqtBpeTL7IxScW03adLUd8P4JbA7YaPJeQPgiC\nwFWrVtHT05PxuiZlMiRKpeji9frrZNeuYirl+fPFHwIdCu7oikYj1opwdydDjJSNWxeht7h9osmx\nsLBAVabk5x9HQsLrGDQoDFZWNga5nkbQYPavswEAh586jKaWTe89+L//AXl5wJ49te5XqVRi7Nix\nGDFiBNatW2cQW+vC0hs3UKjR4GCPHrCwsKjyvOvXgfHjgR9+ACZNqkcD9UAtVSN0WCgsn+uE7Wku\n+P14OVotnI5u7u3w1+KDaGHVzNQm1on09I3IzNyBfv0uoXlzV4P0qdaqcS7pHH6J/gWnbpyCR3sP\nTO0+FdO8p6G3Q+9qPxuGRq1WY/HixYiOjsbJkyfh4OBQb9eukps3gb/+Av78E7h8GejeXfxCjB0L\nDBsGNG9e6y6Li4HnngNKS4FffwWM9TKr0867GOc3pvbUZEpCwpuMjJxmkI0mraDl3CNzOf7A+Ptz\niyQkkDY2dVrDy8/PZ9euXfndd6ZNMnUiP5/u/v6VFveujIAAMTLPnJMCahVahj4cysR37/nK5+eT\nG7co2Pal6Wz50hNc9Wm5wTa66pv09C309/ekXG68Ubdaq+bF5It888yb9Njiwc5bOnPZn8t4Mfki\nVRrjFmQpLy/npEmTOHHiRPPNIa9Uiu4w771HDh5MWluLa/yff076++uUWjkuTswdv3Sp8Ysp6SLj\nDUbotVoFr10bwPT0r+p0HUEQuOTEEj6y55HKw+qnTSO/qPueQEJCAh0dHXnmjGnykGQplXTy9eWV\nqvILVMHly+JaYmV+7KZGEATGzI1h1MyoSn3lVRo1J+6aR6flD7O9YxEnThTXRhtKDqxbt7bR39+j\nXkv/CYLA61nX+fGljzlo5yC2W9OOUw9N5bdB3/JmgWHTDUilUg4fPpzz58+nylxKyelCYaFYA/et\nt8QSam3bkhMmiDpx5cp9pRJPnBAHTLt21Y95D5TQk2LObdG/Xv/FrvfOvcchu4awRFFJ8d7z58VE\n7gaqcSmRSGhvb8/IyEiD9KcrWkHg+PBwrtAzletff4kf1H/7sJua5I+TGTwkmJryqn2stYKWr556\nlf23D+TX3+dx7FjxezlnDvnbb+Yr+hkZO277yZs2/W5uWS4PRhzk/KPz6bjBkV2/6srXTr/GY3HH\nWCDTP0Fceno6e/bsyXfeecds9q/0Ji9PTA27bJk44m/dmhw+nMI773Lt/Gi6OGno51d/5jxwQk+S\n2dk/MSCgK9Xq2ldZ3+y/md7bvJlfXolvvlYrulMaOMr1xx9/ZOfOnZmbm2vQfqtja3o6h9YxxcGd\nXNjh4QY0rA5kH8ymv7s/lVk1+6UJgsDlfy9nz296MqMkg7m55HffibPvdu1E0f/9d/MR/czM3fTz\n60iZzHg1AfRBK2gZlhXGNVfX8LF9j9H6C2v239Gfb/35Fv+I/YNSmVSnfmJiYujm5sb169cb2WIT\nUVZG+Z+XOM8nnAPa3GC6tTfp6Sl692zaRPr6GjVFwwMp9CQZF/ciY2Keq9V6/U8RP7Hjpo5MLarC\nH3nfPnLYMKO4WX344YccOXIkFfUQpRdRjStlbfnlFzF6zxROEf+kyLeIEnsJyyJrt6a75uoaem31\nquBamJND7tghVuyxthajb7duJW/cMLTVupGVtY9+fq5mlbW1KpQaJX3TfPn5lc85bv84Wn9hTZ/t\nPnzt9Gs8GHGQNwtu3vedDAgIoKOjI/eaYxi2gcjOFqVj1qzbgwetloyJEUPPX31VTOLUsiXZv7+Y\nxW/7dnFDzEAjjQdW6DWacgYG9mRm5g86nX828SwdNjgwMqeKJRSZTCxpJjFOyletVssZM2Zw/vz5\nRo1alGk07B0UxD06lmXThd27RdewqsqYGRt5ipy+zr7MP61fhPTWgK103+zOROn9ic6KisTlnIUL\nxR+0O8Esp0/XTxBlTs5h+vo6saysYeasuSP8G3w3cMYvM+j8pTMdNjhwyqEpXHN1DdftXUdbO1ue\nOHHC1KYajbAwsVTmqlXVV4GiXC5u5H79tfiB699fFP+ePcnnniO//FL0gsjOrvVg84EVepIsK4ui\nRGJb45ckOCOYduvteCXlStUnrVkjpo8zImVlZezfvz/XrVtntGu8ceMGn4qKMviPycaNogdBfQf9\nako1DOobVOeUwzuu7WDHTR0ZlxdX5TmCIKZZ+OIL8uGHxWXXYcNEx4tTp2qfWbAm8vKOUyJxeKBS\nDQuCwNSiVP4S9QsnLJ/Apm2asvni5uz+dXc+89sz3OC7geeTztdprd+cOHJEdFzQMXj+fpRKsZTi\n99+Tr71GPvKImLLBzk7M7Pfaa+Kao6+vGOxVBbpoZ4Pwo6+KzMydyMz8FgMGBMDSssV9jydIEzBq\n7yh8O+lbTPOeVnkneXlAjx6Anx/QrZs+puvMrVu3MGzYMHzzzTeYOnWqQfs+V1CAhfHxCB80CDZW\nVgbtGwBWrgROnQIuXgTatTN49/dBgYieGY2mNk3RfXf3Ovt5772+Fx9e+BB/zf0LvR1613i+XA4E\nBABXrohu1deuiR+PUaOAoUOBwYOBzp0BfcwqLPwbMTHPok+fk2jbdoger8a82blzJz7++GOcOXMG\nPXr1QFx+HEKzQhGaHYrQrFBcz74O+1b26OvYF70det9t3Wy7oVkT84+BIIG1a4FvvwWOHgUGDTJw\n59nZQFQUEBl57xgXB7RqBXh739csPD1r1M4GLfQkERPzFJo1c0HXrl9VeCy7LBsjfxiJ90e+j5cG\nvlR1J2+8AQgCsG2bPmbXmmvXrmHixIk4d+4c+vXrZ5A+C9Vq+AQH4/vu3THOxjABZf+GFN+q8HAx\npqRVK6Nc5i5JHyShWFIMn799YNnM0iB9Hoo8hLfPvo3Tz55Gf+f+tXquSgUEB4vCHxQkNoVC/JIP\nHnyvOTlVL/7FxRJERU1Hr15H0L79w3V8RebHunXrsGPHDpw7dw5dunSp9ByBAhILEhGZE4mo3ChE\n5orH1OJUeHXwQm+H3uhu1x3dbcXWzbYb2jRvU8+vpHKUSuCll4CYGODYMcDVMPFsNUMCmZmi4MfH\ni8fbzSI9/cEWegBQqwsRHNwPXbtug53dkwCAEmUJRu0dhRneM7By1Mqqn5yQAAwfDsTGAvb2+ppe\naw4fPox3330XgYGBcHJyqnN/z8XEwMbKCl937WoA66pGEIAFC4CCAnEk08xIg6+cH3OQvCoZAwIH\noJm9YS9yJPYIXjn1Ck4+cxKDXQfXqa+sLHGkf6cFB4si36dPxdarF2BtDZSUXENk5CT06HEQNjbj\nDPSKzAOSWL58OU6cOIGzZ8/CVQ8FVGgUiMuPQ1RuFOKl8YjPj0e8NB4J0gR0aNkB3Wy7oZttN3h1\n8IJnB8+7rX2L9kZ4RfeTnw9Mny5GuO7fD7RuXS+XrRFdtLPBCz0AFBf7Ijp6JgYODIFlUwdM+mkS\nvGy88O3Eb6uf8s+aBQwYAHzwgZ5W68+dqe2lS5fQosX9y0668ktuLlanpCB04EC0atLEgBZWjlot\nvm2tWgE//ggY+pIlASWIfDIS/S72Q+vexvkmnbxxEguPLcTROUcx0m2kwfq9M+uOjKzYYmOBgQMj\n8P774xAevgtt2kxB167iUpC7u+Hfw/pGq9Vi6dKlCA0NxZkzZ2Bra2vQ/gUKuFVyC/H58bghvYHk\nomQkFSYhqTAJNwtvwsrSCp4dPNG5Q2d0atsJbu3c7rZObTvBobVDnZf+4uLE1CBPPQV88QVgaZhJ\npkH4zwg9AKSkfIrCwgvYmuqGAnkhjsw5UjF/zb/x8wPmzBGnQcZeh6gEknj66adhZWWFAwcO6PVB\nzFAqMSA4GCf79MHgtm2NYGXlKBTAxImiUG3frt86daX9pikQOiwU3Xd2h+1kw4rFvzl78yzmHpmL\nX5/6FaM8Rhn1WqWl8QgLGwOZbDPi4ubgxg3gxg1xQpmTA3h4iILv4XH/bScn8xKVf6NSqTB//nzk\n5ubi2LFjaNOmfpdYSEIqlyKpMAnJhclIL0lHWnFahVamKoNrW1e4tHG516zFo3MbZzhZO8GhtQNs\nWtrA0uL+N/vvv4FnnwXWrQNeeKFeX55O1IvQX7lyBUuWLIFGo8Ebb7yB119//b5zli9fjl9++QUd\nOnTAwYMH4e3trZex1UFq8fLPnggsEOD7UhxaN6tmNEgCI0cCixcDzz+v9zXrikwmw6hRozBjxgws\nX768Vs8liQmRkRjeti1We3gYx8BqKC0FHntMzPn0xRd1709brkXYQ2FweNYBbu+61b1DHbiQfAFP\n//Y0Ds08hMc8HzPKNRSKVISFPQwPj4/h7Hy/SshkQHIykJoKpKTcO95phYWAo6O4FuziUvHo5CQu\nIzg4AHZ2xltKqwq5XI5Zs2bBysoKP//8c51mpsakXFWOzNLMuy2rLOvu7YzSDOSW5yKnLAelqlLY\ntbKDY2tHOLR2gENrB2RdfhKBByZh8Zq/MfwhNWxb2cKulR1sW9qiQ8sOaNm0Zb0mhKuMehH6/v37\nY+vWrXB3d8f48eMhkUhgZ2d39/GgoCC8/fbbOH78OP766y8cPHgQJ0+e1MvY6tgduhtfXP0MX/Ut\nx8MDjqFduxFVn/z778AnnwChoSafN2dkZGDo0KHYtm0bpk2rwjOoEr7NyMDe7Gz49u8PKxMN+fLz\ngUceEUc5776rfz8kETMnBpYtLeG917tevzhXU69i5uGZ2D99P57o8oRB+1apshEW9jBcXV9Hx45v\n6NWHUinuBWRmAhkZ4vHO7ZwcIDdXbPn5QJs2oujb2wO2tmKzsbm/tWtXsemRmBElJSWYMmUKOnbs\niD179sDKCJ5e9Y1Kq0JeeR5yy3ORVZKLr7/oiJCLLpj52R7Q5gbyZfmQyqXiUSZFoaIQAgV0aNEB\nHVp2QPsW7e/ebtu8Ldo1b1fx2EI8WjezhnUza7Rp1gbWzazRulnr6lcfasDoQl9cXIzRo0cjLCwM\nAPDGG29g/PjxmPSPPLdff/01tFot3nrrLQCAl5cXbt68qZexVXEm4QxeOPYCrrxwBTaMRWLiWxg0\nKAxNm1aySaNSibtj33wDPP64XtczNHc8cf7++2/4+PjUeP4NmQwjwsLg278/uptg2emf3LoFPPww\n8OGHwKJF+vWR+lkqpCel6HepHyxb1P+Pll+6H6b9PA0/TP0Bk7tNNkifanUBrl8fBXv72fDwqMYh\nwEAIgjj6z8sTfwAKCsQmld5/u7i4YmvSBGjfHmjbVvyxsLa+/2htLa5wtmoFkFJ8/fUEdO06EG+9\n9Q2srS3RogUqtJYtxWPz5kBT/TXMJJSXi+mFi4qAI0fEH8eqUGgUKJQXokhRhEJFIQrlhShUFKJE\nWYISZQmKlcXiUVF8974yVRlKVaUoU5Xdbc2aNIN1M2u0smqF1lat0bpZ6wq3WzZtiVZWrdDSqiVa\nNr3drMT7lg5ZWqN21ulfcO3atQrLMD179kRAQEAFoQ8KCsK8efPu/m1vb4+bN2/Cy8urLpe+S0hm\nCOb/MR/Hnj6GbrbdAHRDYeE5xMcvRs+ev9w/Oty5E/D0NBuRB4DBgwdj27ZtmDp1KgIDA+Ho6Fjl\nuRoS82Jj8bGHh8lFHgA6dgTOnhX9y9u3Fzdqa0P+sXxkfpeJAYEDTCLyADCi0wicfPYknjz0JHZM\n2oHpPabXqT+NphQRERNgYzMe7u4rDGRl9Vha3hvFV7IyWiWkGDNwR/TLysRWWlrxWFYmPp6YmIWj\nRx+Hk9NENG++Fhs3WkChEPtQKFDhtlwuzkgAUfCbNROPd1qzZmKzsrr/aGUl/kDcOf77dpMm999u\n0qT6ZmkptqpuW1qKP5Zr14r7JG++KcZSWFiIzdKy4lFsLWBp6QwLC2dYWADtLYAOdx5rClhYARZt\n/nl+xXb7vwClIINcWw65tly8rSmHQlsOuVYGhbYcCq0MSq0cSoUcMq0chVo5lNoiKLRynf7PRv+t\npRh9W+G+qqbmH3300d3bo0ePxujRo6vtO6UoBVN+noLvJn+HEZ3uLdV4eX2JkJChyMraDReXf/jQ\nl5YCn30mFhgwM+bMmYOYmBjMmDEDFy5cQPMq5tNrUlPRvmlTvOriUs8WVk3XrsDp02KdhnbtgHE6\neg6WR5UjflE8+pzug+YueqwfGJAhrkNw5rkzmHhwItSCGrN7zdarH61WjqioKbC29oGn5waTr9/W\nhIXFvZG6s3P156ampmLs2LF4550XsHz5cp1fm0YjCr5KJR7vNJVK9OJSq+/d/ud9Gk3lR61WvH3n\neOe2SiUeK2uCILZ/39ZqxR+7OzMiPz9R5Fu1AnbvvvcYWfH2P++r7G9dGnDntgXI1gBaV7j/3uMV\n7ysvvwS5/BLINgB03PzWJVK3KoqKitivX7+7f7/22ms8efJkhXO++uorbtq06e7fnp6elfZVW1Ok\nMim9t3lza0DlVePLymIokdixrCzq3p2rV5Nz59bqOvWJVqvlrFmzqsyJE1JSQgeJhLfqITmaPly9\nKqY31iVFqypfRX9Pf2YfqLrEoSm4nnWdTl868cfw2hf31GpVjIiYzOjopykIVadSbojExcWxU6dO\n/OqrutWDMFfOnBE/u4cOmdqS2qOLdtY5102/fv14+fJlJicns3v37sz7V73FwMBAjhw5kvn5+Tx4\n8CAnTZqkt7F3kKvlfPiHh/n2X29Xe15m5vcMCupFjUYmJguysSGTk3W+jimoKieOXKtlr6Ag/lhN\n7Vdz4PRpMb1xRETV52hVWoaNCatQJcqciMqJostGF34f+r3OzxEEDaOjn2ZExGRqtQ2oqIYOXL9+\nnc7OztyzZ4+pTTEK334r1kyuj/rkxqBehP7SpUv09vaml5cXt24VR9c7duzgjh077p7z3nvv0cPD\ngwMGDGBMTOVJyHQVeq2g5Zxf53DW4VkVC3pXgiAIjI5+hvHxS8SaXm+9peOrMi3p6el0dXXl5kbn\npgAAIABJREFU0aNH7973TmIiZxohYZkxOHSIdHERqzJWxo3XbjB8QjgFjfm+lvj8eHba1InfBn1b\n47mCIDAu7iWGhY0WBxUPEH5+fnRwcODhw4dNbYrB0WjE2iHe3mSieY45dKJehN5Q6Cr07559lyO/\nH0m5WrcqUGp1MQOuuDFnsrVBq7sbm2vXrtHOzo6hoaG8UlhIZ19f5iprLrphLuzcKRbr+nd648xd\nmQzsHkh1kW51bE3JzYKb9NjiwU1+m6o8RxAEJia+w+DgIXoVwzFnzp8/T3t7e54+fdrUphic0lJy\nyhRyzJhqE0M2CB44od8WuI3dv+5eeYWoaihZOpaSs60plyfraZ1p+PXXX+nasSPdjh/nsQb0I3WH\nL78ku3W7l9646KpYQKQ83kxKO+lAalEqvbZ6cc3VNZU+npLyGYOCelOl0q3aUkPh+PHjtLe356VL\nl0xtisHJyBDTwS9cKGYKbug8UEL/R+wfdP7SmUkFtaypGRREurgwLXENQ0KGNbj108HLltG2Vy+W\nm0vdu1qycqVYoTErQiwgIv2z4QliRkkGvbd5c/XF1RWWztLTv2JAQBcqFJkmtM7wHDp0iI6Ojgwy\nt6LBBuD6dbHG0BdfGKWYnEl4YIQ+ID2A9uvteS3jWu06FQRxbvbddxQELcPDJ/DmzffraGn9cTo/\nn25+fnx67lzOmjWrQRZVFgTyjaVa9mldytjP001tjt7klOWwz7d9+N659ygIArOy9tLPr1ODmyXW\nxK5du+ji4sKI6nbTGygnT4qeNQYuC21yHgihT5Qm0ulLJ56I16Mc2Z9/imsHanE9WKnMoZ+fK6XS\nv+piar0gVano6ufHCwUFVCgUHDlyJD/88ENTm1VrBEFgxFNRnO5VyLFjBcp121oxS/LL8znguwF8\n8fcJvCpxZHl5rKlNMiibNm2iu7s7b5iqgK4R+eor0bPG39/UlhieBi/0uWW57PpVV26/tr32HWq1\npI8P+fvvFe4uKLhAX19nKhQZ+ppaLzwTHc03/vGFy83NZefOnbl//34TWlV7Uj5LYfCQYKrKtHzq\nKXLqVFLVsFbPKpCceZR9t1jxmcOTqdaa/4ayLgiCwNWrV7Nbt25MM1VxYCOhVot1gHv0IJNquerb\nENAK2oYt9KXKUg7eOZgrLqzQr8MDB8Sin5UsxCUnf8LQ0EcoCOb5RT2ck8NuAQEs11QMuomKiqK9\nvT2vXr1qIstqR96xPPq5+lGRIQZ4KZXkhAnk00+Lrm0NjaIiCSUSe2bmnePjBx7njF9mUKE2z+A1\nXdFqtXzzzTfp4+PDbDOP0agtxcXi523cOLKw0NTWGJ6I7Aj6bPdpuEKv0qg44ccJXHhsoX5+4wqF\n6Nt3+XKlDwuCltevP26W6/WZCgUdJBIGFhdX+vhff/1FR0dHxsfH17NltaMsqowSOwmLAyq+DpmM\nfOwxcsECcdLVUCgpCaZEYk+p9CxJUqFWcMYvMzj+wHiWqxrmRrlarebzzz/PkSNHsvABU8LkZLJX\nL/Lllxv2DLIq9l/fT7v1dtx3fV/DFHpBELjg6AJOOjhJ/6nx5s1kFRG4d1Aqc+nn15H5+SerPa8+\nEQSBE8PDubKGOebu3bvp6enJnDt+i2aGKl/FAK8AZu3LqvTx8nKx4P1LLzUMsS8ri6KvrxPz8v6o\ncL9aq+aCowv40A8PsUheZCLr9EOhUHD69Ol8/PHHWVZWZmpzDIqfH+nsTG7d+uB41txBoVbw5ZMv\ns+tXXRmRLW6YN0ihX/73cg7dNZRlSj0/fEVFYgx+ZKQOp16lROJAuTxFv2sZmJ0ZGRxw7RqVOqjf\nypUrOWTIELNzu9SqtLz+2HUmvF1FWOxtSkrI4cPFgGVz/jLKZIn083NldvbBSh/XClq+dvo1Dvhu\nAPPKG0asQ2lpKceNG8eZM2dSYaZ5k/Tlp59IOzvRw+ZBI7kwmYN2DuKMX2awWHFvptzghP6rgK/Y\n7etudfvCfPAB+cILOp+emrqeISFDqdWaNnLipkxGO4mEUTqOrgRB4Lx58zht2jRqzGjBO/7VeJ3T\nGxQVkYMHk2+/bZ5iL5en0d/fgxkZO6s9TxAEfnD+A/bY1oNpRea9mVlQUMBhw4Zx4cKFVKvNc49K\nHwSB/Ogj0t2dDA83tTWG59SNU3TY4MCNfhvvW85ucELvutGVyYXJ+ndy65aYuKwWngOCIDAi4kkm\nJJguD45GEPhQaCg31tLjQalUcsyYMXzjjTeMZFntuPXNLQb2qF16g4ICMaBq+XLzEnulMpsBAd2Y\nllZ1+oN/s9FvIztt6sSonKiaTzYBmZmZ7Nu3L5ctW9YgcibpSnk5OWcOOXQomVX5amGDRaPVcMWF\nFXTd6MqrqZU7YTQ4ob+edb1unbz0Evm//9X6aSpVAf39PZib+3vNJxuB9ampHBUWRq0eX77CwkL2\n6tWLmzdvNoJlulNwvoASBwllCbVP6pWXR/buLY7IzAGVSsqgoD5MTv641s/9MfxHOmxwoCRVYgTL\n9CcxMZGenp789NNPHyiRT08nBw4kn3tO3Oh/kMgsyeTovaP52L7HmF1atUdUgxP6OhETIy7O6Zmh\nqLg4iBKJPWWy6teWDU1kWRntJBIm1yGSKDU1la6urvztt98MaJnuyBJklDhIWHBB/+xQ2dmir/NH\nH5l2ZK9WFzE4eDATE9/RWxD/TPiTduvteCzumIGt04+wsDA6OztXyCj7IBAQIGZJXbvWvGaDhuDc\nzXN0/tKZH138iBpt9Uuz/y2hnzaNXL++Tl3curWNQUF9qNHUjxeCUqtlv2vX+H1m3XOlhIaG0t7e\nnhJJ/Y4k1UVqBnoHMmN73QPQsrPFkf0HH5jmi6tWlzAkZARv3HitzqPeoFtBdPrSibtCdhnIOv24\ndOkS7e3t+euvv5rUDkNz4IA4rjt+3NSWGBaNVsNVF1fR+Utn/n3zb52e898ReolEzFRUx/h6QRAY\nG7uAUVGz62V6+2FSEp+MiDDYtf766y86ODgwvJ52owS1wPAnwnljqeFC5vPyxDX7//u/+hV7jaaM\noaGPMC5uMYUa6hzoSnx+PDtv6cxPL5tmueTo0aO0t7fn+fPn6/3axkKjId97j+zcWSfHugZFVmkW\nx+wdwzF7xzCrVPfNhv+G0AsCOXIkaaDqN1qtnMHBg5mautYg/VWFX1ERHX19mWXgPKk///wzXVxc\nmFgPlRQSliXw+tjrFNSGFTGplBw0SAxdrw991GhkDAt7lLGxzxtM5O+QWZJJn+0+fOXkK/WaMmH3\n7t10cnJicHBwvV3T2BQXk5Mnk6NGNajSEjrx982/6fylM1ddXFXjUs2/+W8I/bFj4nzfgC6GCkU6\nfX2dKZX+abA+/0mJWk1Pf38eNdKndceOHfT09GRGhvHy+WTuymRA1wCqCowTdlhUJGawWLLEuEFV\nWq2c4eHjGR39rNHqvBbJizhu/zhO+HFCBf9nYyAIAtesWUMPDw+zj56uDbGxZPfuYqTrg5BD/g4q\njYrvnXuPLhtdeO7mOb36ePCFXq0Wd/CMEB1RWHiFEokDZTLDj4xfiI3lorg4g/f7Tz7//HP27t2b\nBUYon1NwTvSwMXYBkZIS8qGHxLAIY4QKaLVKRkRMZlTUU0bPe6TSqLjkxBL2/rY3UwqNE6Cn0Wj4\n6quvsk+fPrx165ZRrmEKjh4V0wt/r3sJ3wZBojSRg3cO5qSDk5hblqt3Pw++0O/eLcbSG2l+L27O\n9qZGU2qwPn/LzWWXgACWGjnISRAELlu2jMOHDzdoiHtZdBkl9hIWXqqf3ChlZWJJgblz72abNgha\nrYqRkdMZGTm13orRCILATX6b6PylMwPSAwzad3l5OadOncrHHnuMRUUNKx1DVWg05IoV4vZbYKCp\nrTEsd3LVfBXwVZ33bx5soS8vJ11dRR8rIyFuzi5kVNQsg2ym3bqdsCygioRlhkar1XLBggUcP348\nlQaY7yqzlfT38K8yh42xKC8XsxBOnizeritarYpRUU8xPHwitdr6TwFwPO447dbb8Zcow1TAyM3N\n5dChQzlv3jyD/J/NgYIC8X8+atS9UpQPAsWKYj73+3Pssa0Hw7MN4zShi3ZaoqGyeTMwfDgwdKjR\nLmFhYYFu3b6BQpGG9PR1depLIPF8XBxec3XF0LZtDWRh9VhaWmL37t1o0aIF5s+fD61Wq3dfWrkW\nUVOj4DjPEU7znQxoZc20agUcOwZ06ACMGwcUFOjflyCoEBMzB4IgQ+/ev8PSsrnhDNWRJ7s/iXPz\nzuGds+/g8yufQ/yu6kdCQgKGDx+OsWPHYt++fWjWrJkBLTUNUVHA4MFAt27AuXOAg4OpLTIM/un+\n6P9df1g3s0bw4mD0dexbfxc3yE+KAaiVKdnZYqqDevAsIUmF4hZ9fV2Yn69HlavbbE5P54iQEKpN\n4GYnl8v56KOPcv78+XrlxRG0AqOeimL0M9EmjarUasl33iF79hQjImv/fAUjIqYwImKKSUby/yaz\nJJODdg7ic78/p1eqY39/fzo5OfG7774zgnWm4Y5//IEDprbEcCg1Si7/ezkdNzjySMwRg/evi3Y2\nTKF/+WVy2TLjGVMJxcUBlEjsWVJSe3e1iNJS2kkkvGnCGO2ysjKOGTNGL7G/ufwmQ0eGUis3j5zC\nGzaQbm5iMLSuaLVyRkRMYmTkdJMnsPsn5apyzj0yl32392WiVPeByx0f+VOnThnRuvpDJiMXLRIr\nfz5IScnCs8Pps92HUw9NrTaNQV14MIU+Olr8yZdKjWtQJeTmHqGvr0ut0hrLtVr2CQriHjPItqSP\n2Gd+n8kArwAqc81HHEly/37S0VG3GqCiC+UTjIp6qt42XmuDIAjcFriNDhscaqyNLAgC165dS1dX\nV167dq2eLDQu8fFk375i5bGSElNbYxg0Wg3XXl1Lu/V23BO2x6gz4QdT6CdPJjduNK4x1ZCevpmB\ngT2pVuvmdbIsIYGzoqLMJpFUeXk5x4wZw3nz5tUo9tKzUtGNMta8ct7f4fRp0e2uukGtRlPO69fH\nMTr6abMtHXkHvzQ/dtzUkSsvrKw0aEahUHD+/PkcMGAA0/VZuzJDfv5ZHLft2PHg5KtJkCZwxPcj\nOGbvGKO50v6TB0/oz58XY59NWCxBEATeuPE6w8IerXEJ4IxUyo5+fsw3s1pmuoh9SXAJJXYSFl4x\n7xJzAQGkkxO5Zcv9QqHRlDEs7FHGxMw1e5G/Q3ZpNkftGcUnfnyCUtm9WWtOTg5HjBjBWbNmPRAV\noeRy8pVXSC8vMjTU1NYYBo1Wwy3+W2i33o5bA7ZSa+Ao66p4sIReqyX79yd/MYxLWl0QBA0jI6cy\nJmZ+lSP1DIWCTr6+vGymtTirE3tZooy+zr7MPaJ/EEd9kpIiTv1ffPFe1KRKVcCQkBG30xqYT2EW\nXVBr1Xzn7Dv02OLBaxnXGB4eTnd3d65cuZLahlB7sQZiYsSv8qxZYgT0g0BEdgSH7BrCUXtGMT6/\nfiOSHyyh37dPrCxgJvM7jaacwcGDmZy8+v7HBIGjw8L4SXJyvdtVG+6I/dy5c+9WG1JmKxngFcCM\nHcZLn2AMSkvFBKYPPUSmpWUzKKgPExLeMnjumvrk1+hf2e6zdmw9vjUP/lR5KcOGhCCQ27Y9WEs1\ncrWcH57/kPbr7bkrZFe9jeL/iS5C3zD86GUy4MMPgY0bAQsLU1sDAGjSpBX69DmB7Oz9yM7eW+Gx\nz1JTYQngA3d3k9imK61atcLJkyeRl5eH6dOnoySnBBETI+A41xEuS1xMbV6tsLYGfv8deOihQgwd\nqoJU+hq8vDbBwqJhfMT/jSAISDiWgBb7W8B7kje2K7YjpSjF1GbpTXY2MGkSsG8f4OsLLFliNl9l\nvbmcchk+O3wQlx+H8JfDsWjAIlia6+dN31+RkpISTpkyhZ06deLUqVNZWnp/moC0tDSOHj2aPXv2\n5KhRo3jwYNWjEgDM+6OKJF+ff07OnKmvqUalrCyGEokD8/PFfDuXCgvp5OvLzAZUdFmlUnHuc3PZ\nt11f+s/3N5uN49pSWhpBPz9XfvPNWdrbk0cM77JcLxQWFnLKlCkcPnw409PTqRW03OC7gXbr7bj/\n+v4G9/85elT0kFq5kjSz7Sq9yC/P5+ITi+m60ZVHY4+a2hzjLt2sW7eOr732GhUKBZcuXcoNGzbc\nd05WVhbDwsJIknl5eezcuTNLqvCfAkCJfSWJsu4ERyXUb+Wn2nDHxz4p5xQ7+vnxjAlcP+uCoBUY\n+XQkF3ZZyO7duzMlxfieAoamqMiXEokDs7N/Ikleu0Z27ChWrDKj2uk1EhYWRi8vL77xxhv3pTMI\nywpjz296cvavs1kgM3yyOkNTWirum3h6kr6+pram7qi1an4T9A3t19tz6amlLJKbxwaDUYV+5syZ\nd0U8JCSEs2bNqvE5kydP5oULFyo3BGDGjgwG9QqipvQf38xXXiHffFNfM+uNgsIrPHmpA9dENay1\nVEEQmPB2AkMfCqVGpuHmzZvp6upab8VLDIFU+iclEjvm55+ucH9mppgQbfRosW68ubNnzx7a2dnx\n0KFDVZ4jU8n4+unX2WlTJ566Yb7BUmfPig5yL7zwYPjGX0q+xL7b+3L03tEGy1FjKIwq9G5ubpTf\nruhUXl5ONze3as9PSEhg586dq3QNAyAmEXshllGzb/udR0SIjtL5+fqaWW9sSEvjs4E7eFVix6Ki\nhjN8Sf4omUG9gyrklT906BDt7e158eJF0xmmI1lZ+yiROLCoqPISihoN+dln4tLBCf0zWBgVuVzO\nl156id7e3oyOjtbpOWcTz9JrqxdnHZ7FW8Xm8yuWn08uWEC6u4txDg2d1KJUzv51Nt02u/HX6F/N\nctmszkI/duxY9u7d+7527NgxdurUSWehLykp4YABA/jHH39Ua+zq1au56sNVXOy8mL+88rM4FNu2\nrcYXYWoCiotpL5EwRS6/Pbq0Z3FxkKnNqpHUNakM9A6kMvv+eIDz58/T3t6ehw8fNoFlNSMIWiYl\nfUh//84sK6tZHCUSMW3CG2+YNAzjPm7evMmBAwfyqaeeqnJZsypkKhlXXFhB23W23OK/pV4rWP0b\nQRCDn5ycxPe4ki27BkWJooQfXfyItutsufriar1yERmLixcvcvXq1XebUUf0M2bMYOjtSIfg4GDO\nrGKzVKVScdy4cdy8eXP1hvzDWHmKnL7tz7Ow83TDJiE3AvkqFT38/fl77j2f87y845RIHFhaGmZC\ny6onbVMaA7oEUJFRteqFhYWxU6dO/OCDD/RKhmYsNBoZo6JmMyRkOJVK3XPYFhSQM2aINWmNXPel\nRgRB4A8//EA7Oztu2bKlTiPF2LxYjt47mgO+G8CgW/U/wEhLEwPWe/XSLSWFOSNXy7nJbxMdNjjw\nmd+eqZfI1rpSL5uxMpmMr776aqWbsYIgcN68eVymQwKyCsaWl1NqP4G+NhepSDej4de/UAsCx16/\nzncryaKZm/sbfX2dWFZmfhWMb227RX8Pf8pTay6mnpOTwzFjxvDxxx9nvhksoSmV2QwJGcro6Kep\n1da+GLwgkNu33/PlNkX8UV5eHqdPn84+ffowIiLCIH0KgsD91/fTcYMjXz31KvPKjV9UVaUSI5Lt\n7MhPPmnYJf5UGhV3XNvBjps6cuqhqYzINsz/pT4wqtBX5V6ZkZHBiRMnkiSvXr1KCwsL+vj4sF+/\nfuzXrx/PnDlTs7GrV5OzZzN1TSpDhoaYTdbEf/O/xESOvX69ytTD2dk/0dfXmSUl5hPjnbkrk36d\n/ChL0j2Tplqt5jvvvEMPDw+GhIQY0brqKSuLpL+/B5OSVtV5rTQyUqxJO3KkmCevvjhz5gxdXFz4\nzjvvUGGENSSpTMpXT71Km3U2/OjiRyxRGH4nVBDE6p3du5OPP167LKLmhkar4YHwA/Ta6sWx+8ca\nvPJXfWBUoTc0d41NThbdKVNTKQgCo2ZHMWpWFAWNeW2C/JKTQw9//xrz2OTm/k6JxJ5S6dl6sqxq\nsvZl0c/Vj+U39FtvPHz4MO3s7PjDDz8Y2LKaubP3kZ1tuETlGg35zTfiiHTFCjH/irEoLy/n0qVL\n2alTpyo9zwxJojSRc4/MpcMGB27020iZyjApsiMjyXHjSG9vMZmcGe5N6oRcLefO4J303ubN4buH\n80KS8f8nxqJhCv3MmeI88DZahZZhY8J4Y+kNs9nxvpNfPkzHHac7hcYNKVK1JefnHPo6+bIsum4J\nsaKjo9mtWzcuWbLEKCPSfyMIWqakfEFfX0cWFV01yjUyMsS8K126kH//bfj+fX196e3tzWeeecYo\nxdqrIzInktN+nsaOmzpyZ/BOqjT6RSzl5oplIOztya++ariBT7llufzo4kd03ODIiQcn8nzSebPR\nFX1peEL/99+kh4dYheAfqIvUvOZzjSmfmn5jRKpS0SsggAeza1dEoKwsin5+bkxNXVfvH6zM7zPp\n6+TL0nDDuEIUFxdz+vTpHDBggFH97VWqfIaHT2RIyAjK5WlGu84dTpwQPXPmzycNUT4gPz+fixYt\noouLC38xcTK+gPQAjt0/ll5bvbg1YCuLFbrVLS4qIj/9VJz1vPmmScpAGIS4vDguPrGY7de256Lj\nixidW4/rdUam4Ql9r15Vxq0rMhX09/Rn5q7MerbsHhpB4BPh4VymZ5SuQpHOoKDevHHj9XrLqJj2\nZRr93PxYHmdY9zBBELh7927a2dnx448/psrAQ7zi4gD6+7szMfH/6rVYSGkp+e674urh//6nXwiH\nIAjcu3cvHR0d+frrr7PIjFI0SlIlnPPrHHZY24GvnnqVMbmVL7BLpWLKAltbct4803sp6UO5qpw/\nRfzE8QfG0369PVddXGW0Kk+mpOEJ/dix1S76ld8op6+zb9U5cYzMBzdvcnRYWJ3qvqrVhQwLG82o\nqFl6eY3oiiAIvLn8JgO9AylPM9510tPTOWHCBPr4+Nx1t60LgiAwPX0LJRJ75uVVHXdhbNLTxaUK\nGxty1Srd0+lGR0fzkUce4aBBgxgcXPuyk/XFreJbXHlhJR03OHLs/rH8I/YParQa5uSQ770nvu5F\ni+qtLLPBEASBV1Ku8MVjL7LD2g4cf2A8D0YcNNgehTnS8IReB/eHkmsllNhLWHS1fkdJv+Xm0s3P\njzkG8CHTahWMiprN0NCRVCgMH9UoaATGL4ln8MDgeikBeGcEa29vzxUrVui9dq9WFzEqaiaDgwdS\nJrtpYCv1IymJfP55cW16zRqyqpofRUVFfP/992lnZ8dt27aZVdxBdSjUCh4IP8B+24bSelVHNp/6\nJqe9eZlJyQ3DflL8/EXlRHH1xdXsvKUze37Tk+sk68wqYtiYNDyh15E7Je7KIuun0o5/cTHtJBIG\nGzBph7jJ+Cl9fR2Zn2+4nCVapZZRs6MYNiaM6uL6DTbLyMjgk08+yV69elEiqTwlQVUUFl6kv78n\n4+NfNepMR1/i4sSapo6O5Icfis5hpFiHd+3atbS3t+eCBQuYmWm6pcXaolSShw+LE2k7O3LBu1F8\n98Qn9NnuQ4cNDlx8YjH/TPiTSo35OcgXK4p5JOYIXzr+Ejtt6kT3ze58/fTrvJZxrcFvrtYWXbTT\n4vaJJsfCwgK1MSXnUA6S/peEvmf7onWP1kazK0EmwyPXr2N39+6YZGtr8P6Liq4gNvY5ODg8jc6d\nv4ClpZXefWnLtYieGQ3LFpbo+XNPWLao/9zYJHHo0CG8//778PHxweeff46+fftWeb5GU4KkpP9B\nKj2Frl2/hZ3dk/Vobe2JjQV27gQOHCDs7dOQnf0xHntMjk8/XYUePXqY2jyduHED2LUL2L8f6NUL\neOklYPp0oEWLe+fcLLiJo3FH8Xvs74jPj8dYz7EY3nE4hnUchv7O/dGiaYuqL2AESpQluJ59Hf7p\n/jiTeAYhWSEY0WkEnvB6AhO6TkB32+6waOgJ7vVEF+1ssEIPANn7s5H0XhJ6H+uNtkPaGtymHJUK\nI0JD8b6bG15yMV4hDrU6H3Fxz0OtzkfPnj+jRQuPWvehzFAianoUWvdsje67u8OiqWk/9AqFAjt2\n7MCaNWswduxYfPLJJ/Dy8qpwjlR6GjduvAwbmyfg5bUBTZu2M5G1uqNWq7Fv3z589NE62NsvgYXF\ny8jOtsYLLwAvvgh4eprawsq5eRM4dUoszhIXBzz/PLBoEdC1a83PzSjJwPnk8wjMCETArQDE5ceh\nl30vDO04FMNch6GXQy90atsJNi1t6iy2AgVkl2UjPDscYdlhYssKQ3ZZNvo49sFgl8EY7zUeoz1G\no3Uz4w3wGhIPvNADQP6JfMS/GI8eB3vAZpyNwewp02ox5vp1TLCxwSedOxus36ogBdy6tQVpaWvR\nrdsO2NvP0Pm5xZJiRM+OhuvrrnB7382sRjalpaXYvHkzvvrqK8yePRsrV66EnV0zJCa+heJiX3Tv\nvhsdOjxqajNrJD8/H3v37sX27dvh4eGBzz77DMOHDwcgjvJ37QIOHAAcHYEnngDGjwcefrjiKLk+\n0WgAPz/g5EmxFRSIFZ6efBKYOBFo1kz/vmVqGUKzQhF4KxABGQG4Ib2B9OJ0KDQKdGzb8W7r1K4T\nWlu1hqWFJSwtLGEBi7u3AUAqlyK7LBvZZdnIKstCdlk28srz0L5Fe/Rx7IMBzgPQ36k/+jv1Rzfb\nbmhi2cRA786DxX9C6AGg6GoRomdGo+u2rnCY7VBnWzQkpkZGwrFZM3zfvX6nhCUlQYiJeRodOoyF\np+cXsLKyq/Jcksj6LgvJq5Lhvc8bthMMv7RkKPLz87F27Rr88MNOPPKIgPnzp2DKlF1o2tTa1KZV\nCUn4+/tj+/btOHHiBKZMmYJXXnnlrsD/G60WCA4G/voL+PNPICoKeOghUfgffRTo1q1uAlsdeXnA\n9etAWJhow99/A507A5Mni23gQMDSyCt55apy3Cq5hfSSdPFYnA65Rg6Bwt1GUDySsG1M3PmeAAAN\nsklEQVRpCydrJzi3cYaTtROcrJ3g0NoBzZoY6U16QPnPCD0AlIWXIWJiBNxXuMP1FVe9+yGJl27c\nQIZSieO9e8PK2N+OStBoipCcvAq5uT/D3X0FXFxeuW/tXlAKSHg9AcW+xej9R2+06tqq3u3UFZIo\nLDyHpKTlkEo18PUdjoMHz6F169ZYtGgR5s6dCxsbw83G6kppaSkOHjyI7du3QyaT4eWXX8bzzz8P\n21ru0RQUAOfPi6J/5QqQng54eAA9eojN21s8ursDrVoBLVsCTaoYtCoUQH7+vZaXJ84kwsLEVlYG\n9OsH9O8vtsceA1z1/xo00oD4Twk9AMiT5Ih4PAKO8x3hvtJdr5H4xykpOJ6fj8v9+8O6qm9dPVFe\nHo3ExLegVGaiS5ctsLEZBwBQZioRPSsazZyawXufN5q2aWpSO6ujpCQQSUnLoVJlonPnz2FnNwMW\nFhYQBAGXL1/G7t27cerUKUyYMAEvvvgiRo0aBSsr/Tek9eXmzZs4deoUTp06BT8/P4wbNw6vvPIK\nHnvsMVga6MdeoQASE0WBjo0V18pjY4FbtwC5HJDJxBF/q1b3mkolCrtaDdjZ3Wu2tuIM4Y6wd+7c\n8IttN6If/zmhBwBVtgoRT0Sg7Yi26LKlCyyb6f4l/S4zE+vS0uA3YACcjDXHriUkIZUeR2Li22jd\nujccClcj6VklXF52gdsHbrCwNM9vd3l5NJKTV6C0NBgeHh/ByWkBLCwq/0EqLCzEwYMHsW/fPsTH\nx2PYsGEYPXo0Ro0ahcGDB6OZEf4XCoUCvr6+d8W9uLgYEydOxKRJkzBu3Di0bWv4zf2aIAGlUhR8\nmQwoLwesrAB7e8DaulHIG6mc/6TQA4CmSIPYBbFQ3lKi50890ap7zcsa2zIysD4tDed9fNC1lfkt\ng6hLZYjcvxolbrtg02IGvEaIwm9OkAKKii4iM/M7FBVdgpvbe3BxeRVNmrTUuY/CwkJcvXoVly5d\nwuXLl3Hjxg0MHToUDz30EDp37gxXV1d07NgRrq6uaNOmTY39yWQyxMfHIyYmBtHR0YiJiUFMTAzS\n0tLg4+ODSZMmYdKkSejfv7/BRu6NNFKf/GeFHhBHwpk7MpGyKgWeazzh9KJTlUs5G9PT8U1GBs77\n+KBzS91Fqb4ovFiI+EXxaDeyHdzWWyNP8T0yM3ehZUsvuLq+Cju7GbC0NN0MRKXKRlbWHmRl7UaT\nJtZwcXkJjo7zDOIuWVRUBIlEAn9/f6SlpeHWrVvIyMhARkYGmjRpgo4dO8LW1hYqlQoKheK+plKp\n0KVLF/Ts2RM9e/ZEr1690LNnT3Tp0sUoM4VGGqlv/tNCf4fy6HLEPBuDVl1bodvObrCyqbj++3lq\nKvZmZ+OCjw86mcoXrgo0pRok/S8J0pNSdNveDbaT720GCoIaUulxZGR8C5ksGk5OC+HisgQtWrjX\ni22kBgUF55CVtQtFRRdhbz8Lzs4voU2bwfXipUQSRUVFyMjIgFQqRfPmzdGiRYv7mrW1NZo2Nd89\njEYaqSuNQn8bQSEg6f0k5B3JQ48DPdB+VHuQxKqUFPyel4fzPj5wbt7cKNfWl4K/ChC/OB4242zg\n9aUXmravWqxksjhkZu5AdvYBtGzphfbtH0G7do+gXbuHYGVlGG8WQVCjrCwERUWXUVR0CcXFfmjV\nqjucnRfBweEZNG1a8zJKI400Yngahf5fSM9IEf9iPByedsCeZwScRDHO+fjAwYym8GXXy5DySQrK\nQsvQbWc32Dyuu1ALggIlJUEoLr6CoqIrKCkJQIsWHreF/yE0b+4OKysbWFnZomnTDrCwqOhVRBIa\nTRHU6hyoVDlQqbIhl99EcfEVFBf7oUWLzmjffjTatx+F9u0fqdbHv5FGGqkfGoW+EpTZShx8OwKO\np8vh8UpHdHvX/b7lHFNQGlKKlE9SUHqtFG7/c4PzYmc0aVU3905xFB52V6hVqiyo1VKo1VJotcVo\n0qQNrKxs0aRJm9v358LCojmaNXNEs2ZOaNbMEc2bu6F9+4fRrt3DsLIy34CsRhr5r9Io9P+iVKPB\novh4pCmVONa2GwrXZSDvSB5cX3NFp2Wdql0eMRYl10qQ+kkqSkNL4faeG5xfckaTlsb33ye10GiK\nb4t+CaysbGFl5VgrD5lGGmnE9DQK/T+Ik8kwIyoKI9q1w7auXdHitiud/KYcqZ+lQnpSio5vdoTL\nUhdYdTDuCF9bpkXBnwXI+iEL5ZHlcHvfDc4vOpsk22QjjTTSsGkU+tv8lpeHV27cwBpPTyxydq70\nHNkNGVI/S0X+H/mw7m8N28m2sJ1si1berQziRaLKU0F6Qor8o/koulyEtsPbwmG2AxznOsKyeaPA\nN9JII/rxnxd6DYn3k5Lwe14efuvVCwN1CLDRyrQoulgE6SkppCelsGhqIYr+JFu07t0aVvZWNUbb\nako0UKQqoExVQhYnQ/6JfJRdL4PN4zawm24H24m2JlkmaqSRRh48/tNCn6NSYU5MDFpYWuJgjx6w\n1SN/CkmUR5VDelKKgtMFkN+UQ52nRpPWTWDlYAUreys0c2iGpjZNoc5XQ5mqhCJVAUEloIV7C7Rw\nb4GWXi1h84QNOozt0Lg000gjjRic/6TQk8TR/Hy8mZiIF5ycsNrDA00MGMBDEpoiDdS5aqjz1FDl\nqqCWqmFla3VX3JvaNjWrnPCNNNLIg8t/TuiDS0vxdmIiCjUabO3SBY926GAg6xpppJFGzBNdtPOB\nWCi+pVTiw6QknC0sxCceHljo7GzQUXwjjTTSSEOmQQt9uVaL9Wlp2JaRgZddXHBjyBC0acxr0kgj\njTRSAb13B0tLSzF16lS4ublh2rRpKCsrq/JcrVaL/v3748knn9T3cvf6InGlqAhvJiSgS2AgEuVy\nhA4ahM89PR8Ykb906ZKpTTAbGt+LezS+F/dofC9qh95Cv337dri5uSEhIQEdO3bEjh07qjx369at\n6Nmzp94blCpBwF8FBVgSHw8XPz+8kZgIOysrXPDxwcGePeFuZlkn60rjh/geje/FPRrfi3s0vhe1\nQ+8hcFBQEFasWIHmzZtj4cKFWLNmTaXn3bp1C6dPn8aHH36ITZs2Vdvn4dxcFGk0FVquWo0LhYXo\n3qoVZtjZwW/AAHiZYc74RhpppBFzRW+hv3btGry9vQEA3t7eCAoKqvS8ZcuWYcOGDSgpKamxz1/z\n8tC+adO7zbV5czzUtCm2dOmCjmaWRriRRhpppMHAahg7dix79+59Xzt27Bg7depEuVxOkiwvL6eb\nm9t9zz9x4gRfffVVkuTFixc5efLkKq8FoLE1tsbW2BqbHq0mqh3Rnzt3rsrH9u3bh9jYWPTv3x+x\nsbEYPHjwfef4+fnh+PHjOH36NBQKBUpKSjB//nzs37//vnPNxJ2/kUYaaeSBQ+/N2KFDh+KHH36A\nXC7HDz/8gGHDht13zhdffIH09HQkJyfj559/xqOPPlqpyDfSSCONNGI89Bb6V155BWlpaejevTsy\nMjLw8ssvAwAyMzMxadKkSp/TmBagkUYaaaT+MXkKhCtXrmDJkiXQaDR444038Prrr5vSHJOxcOFC\nnDp1Cg4ODoiMjDS1OSYlPT0d8+fPR25uLuzt7bF48WI8++yzpjbLJCgUCowaNQpKpRItWrTAnDlz\nsGzZMlObZVK0Wi0GDRqEjh074sSJE6Y2x2R4eHigbdu2aNKkCaysrKp0iAHMQOj79++PrVu3wt3d\nHePHj4dEIoGd3X+vFunVq1dhbW2N+fPn/+eFPjs7G9nZ2ejXrx/y8/MxZMgQhIeHo40OaaYfRGQy\nGVq1agWlUomBAwfijz/+QJcuXUxtlsnYtGkTQkJCUFpaiuPHj5vaHJPRuXNnhISEwMam5rrSJs2b\nW1xcDAB45JFH4O7ujscffxyBgYGmNMlkPPzww+jQmIQNAODk5IR+/foBAOzs7NCrVy8EBweb2CrT\n0apVKwBAWVkZNBoNmv+HXY3vxOUsWrSo0YEDujuxmFTo/+mLDwA9e/ZEQECACS1qxNxITExEdHQ0\nhgwZYmpTTIYgCPDx8YGjoyNee+01dOrUydQmmYw7cTmWlo21HSwsLPDoo49i2rRpNc5sGt+tRsyW\n0tJSzJkzB5s3b0br1q1NbY7JsLS0RHh4OBITE/Htt98iLCzM1CaZhJMnT8LBwQH9+/dvHM0D8PX1\nRXh4ONasWYO3334b2dnZVZ5rUqEfPHgw4uLi7v4dHR1dqZtmI/891Go1Zs6ciXnz5mHq1KmmNscs\n8PDwwMSJE/+zy5t34nI6d+6MZ555BhcuXMD8+fNNbZbJcL5d/7pHjx6YMmVKtRvTJhX6du3aAf/f\nzh2jOAhEYRz/38HGxhtIIFWuYGtpJZIinQT0BDa2HiKX0FQpvIddCCoIQhqRpFjYrTbdMsv4/eop\nXjF8M/DeDF+TN13Xcb1eORwOJkuSf+D1enE8HvF9n/P5bLoco4ZhYJomAMZxpGmazR58epfz4/l8\nMs8zAH3fU9c1QRD8ut74v75VVXE6nViWhTRNNzlxAxBFEbfbjXEc8TyPoihIksR0WUa0bcvlcmG3\n27Hf7wEoy/LjRrbV/X4njmPWdcV1XfI8/77Jbd2W3+U8Hg/CMATAcRyyLPvYuzE+XikiIn9LzVgR\nEcsp6EVELKegFxGxnIJeRMRyCnoREcsp6EVELPcGkQPsdA5FLVsAAAAASUVORK5CYII=\n", |
|
190 | 190 | "text": [ |
|
191 | 191 | "<matplotlib.figure.Figure at 0x1082fcbd0>" |
|
192 | 192 | ] |
|
193 | 193 | } |
|
194 | 194 | ], |
|
195 | 195 | "prompt_number": 5 |
|
196 | 196 | } |
|
197 | 197 | ], |
|
198 | 198 | "metadata": {} |
|
199 | 199 | } |
|
200 | 200 | ] |
|
201 | 201 | } No newline at end of file |
@@ -1,1421 +1,1421 b'' | |||
|
1 | 1 | { |
|
2 | 2 | "metadata": { |
|
3 | 3 | "name": "Cell Magics" |
|
4 | 4 | }, |
|
5 | 5 | "nbformat": 3, |
|
6 | 6 | "nbformat_minor": 0, |
|
7 | 7 | "worksheets": [ |
|
8 | 8 | { |
|
9 | 9 | "cells": [ |
|
10 | 10 | { |
|
11 | 11 | "cell_type": "heading", |
|
12 | 12 | "level": 1, |
|
13 | 13 | "metadata": {}, |
|
14 | 14 | "source": [ |
|
15 | 15 | "The cell magics in IPython" |
|
16 | 16 | ] |
|
17 | 17 | }, |
|
18 | 18 | { |
|
19 | 19 | "cell_type": "markdown", |
|
20 | 20 | "metadata": {}, |
|
21 | 21 | "source": [ |
|
22 | 22 | "IPython has a system of commands we call 'magics' that provide effectively a mini command language that is orthogonal to the syntax of Python and is extensible by the user with new commands. Magics are meant to be typed interactively, so they use command-line conventions, such as using whitespace for separating arguments, dashes for options and other conventions typical of a command-line environment.\n", |
|
23 | 23 | "\n", |
|
24 | 24 | "Magics come in two kinds:\n", |
|
25 | 25 | "\n", |
|
26 | 26 | "* Line magics: these are commands prepended by one `%` character and whose arguments only extend to the end of the current line.\n", |
|
27 | 27 | "* Cell magics: these use *two* percent characters as a marker (`%%`), and they receive as argument *both* the current line where they are declared and the whole body of the cell. Note that cell magics can *only* be used as the first line in a cell, and as a general principle they can't be 'stacked' (i.e. you can only use one cell magic per cell). A few of them, because of how they operate, can be stacked, but that is something you will discover on a case by case basis.\n", |
|
28 | 28 | "\n", |
|
29 | 29 | "The `%lsmagic` magic is used to list all available magics, and it will show both line and cell magics currently defined:" |
|
30 | 30 | ] |
|
31 | 31 | }, |
|
32 | 32 | { |
|
33 | 33 | "cell_type": "code", |
|
34 | 34 | "collapsed": false, |
|
35 | 35 | "input": [ |
|
36 | 36 | "%lsmagic" |
|
37 | 37 | ], |
|
38 | 38 | "language": "python", |
|
39 | 39 | "metadata": {}, |
|
40 | 40 | "outputs": [ |
|
41 | 41 | { |
|
42 | 42 | "output_type": "stream", |
|
43 | 43 | "stream": "stdout", |
|
44 | 44 | "text": [ |
|
45 | 45 | "Available line magics:\n", |
|
46 | 46 | "%alias %alias_magic %autocall %automagic %bookmark %cd %clear %colors %config %connect_info %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %less %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %lsmagic %macro %magic %man %more %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %run %save %sc %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", |
|
47 | 47 | "\n", |
|
48 | 48 | "Available cell magics:\n", |
|
49 | 49 | "%%! %%bash %%capture %%file %%perl %%prun %%python3 %%ruby %%script %%sh %%sx %%system %%timeit\n", |
|
50 | 50 | "\n", |
|
51 | 51 | "Automagic is ON, % prefix IS NOT needed for line magics.\n" |
|
52 | 52 | ] |
|
53 | 53 | } |
|
54 | 54 | ], |
|
55 | 55 | "prompt_number": 1 |
|
56 | 56 | }, |
|
57 | 57 | { |
|
58 | 58 | "cell_type": "markdown", |
|
59 | 59 | "metadata": {}, |
|
60 | 60 | "source": [ |
|
61 | 61 | "Since in the introductory section we already covered the most frequently used line magics, we will focus here on the cell magics, which offer a great amount of power.\n", |
|
62 | 62 | "\n", |
|
63 | 63 | "Let's load the pylab support so we can use numerics/plotting at will later on." |
|
64 | 64 | ] |
|
65 | 65 | }, |
|
66 | 66 | { |
|
67 | 67 | "cell_type": "code", |
|
68 | 68 | "collapsed": false, |
|
69 | 69 | "input": [ |
|
70 | 70 | "%pylab inline" |
|
71 | 71 | ], |
|
72 | 72 | "language": "python", |
|
73 | 73 | "metadata": {}, |
|
74 | 74 | "outputs": [ |
|
75 | 75 | { |
|
76 | 76 | "output_type": "stream", |
|
77 | 77 | "stream": "stdout", |
|
78 | 78 | "text": [ |
|
79 | 79 | "\n", |
|
80 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", | |
|
80 | "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\n", | |
|
81 | 81 | "For more information, type 'help(pylab)'.\n" |
|
82 | 82 | ] |
|
83 | 83 | } |
|
84 | 84 | ], |
|
85 | 85 | "prompt_number": 8 |
|
86 | 86 | }, |
|
87 | 87 | { |
|
88 | 88 | "cell_type": "heading", |
|
89 | 89 | "level": 2, |
|
90 | 90 | "metadata": {}, |
|
91 | 91 | "source": [ |
|
92 | 92 | "<!--====-->\n", |
|
93 | 93 | "Some simple cell magics" |
|
94 | 94 | ] |
|
95 | 95 | }, |
|
96 | 96 | { |
|
97 | 97 | "cell_type": "markdown", |
|
98 | 98 | "metadata": {}, |
|
99 | 99 | "source": [ |
|
100 | 100 | "Timing the execution of code; the 'timeit' magic exists both in line and cell form:" |
|
101 | 101 | ] |
|
102 | 102 | }, |
|
103 | 103 | { |
|
104 | 104 | "cell_type": "code", |
|
105 | 105 | "collapsed": false, |
|
106 | 106 | "input": [ |
|
107 | 107 | "%timeit np.linalg.eigvals(np.random.rand(100,100))" |
|
108 | 108 | ], |
|
109 | 109 | "language": "python", |
|
110 | 110 | "metadata": {}, |
|
111 | 111 | "outputs": [ |
|
112 | 112 | { |
|
113 | 113 | "output_type": "stream", |
|
114 | 114 | "stream": "stdout", |
|
115 | 115 | "text": [ |
|
116 | 116 | "10 loops, best of 3: 20.5 ms per loop\n" |
|
117 | 117 | ] |
|
118 | 118 | } |
|
119 | 119 | ], |
|
120 | 120 | "prompt_number": 13 |
|
121 | 121 | }, |
|
122 | 122 | { |
|
123 | 123 | "cell_type": "code", |
|
124 | 124 | "collapsed": false, |
|
125 | 125 | "input": [ |
|
126 | 126 | "%%timeit a = np.random.rand(100, 100)\n", |
|
127 | 127 | "np.linalg.eigvals(a)" |
|
128 | 128 | ], |
|
129 | 129 | "language": "python", |
|
130 | 130 | "metadata": {}, |
|
131 | 131 | "outputs": [ |
|
132 | 132 | { |
|
133 | 133 | "output_type": "stream", |
|
134 | 134 | "stream": "stdout", |
|
135 | 135 | "text": [ |
|
136 | 136 | "10 loops, best of 3: 17.8 ms per loop\n" |
|
137 | 137 | ] |
|
138 | 138 | } |
|
139 | 139 | ], |
|
140 | 140 | "prompt_number": 14 |
|
141 | 141 | }, |
|
142 | 142 | { |
|
143 | 143 | "cell_type": "markdown", |
|
144 | 144 | "metadata": {}, |
|
145 | 145 | "source": [ |
|
146 | 146 | "The `%%capture` magic can be used to capture the stdout/err of any block of python code, either to discard it (if it's noise to you) or to store it in a variable for later use:" |
|
147 | 147 | ] |
|
148 | 148 | }, |
|
149 | 149 | { |
|
150 | 150 | "cell_type": "code", |
|
151 | 151 | "collapsed": false, |
|
152 | 152 | "input": [ |
|
153 | 153 | "%%capture capt\n", |
|
154 | 154 | "from __future__ import print_function\n", |
|
155 | 155 | "import sys\n", |
|
156 | 156 | "print('Hello stdout')\n", |
|
157 | 157 | "print('and stderr', file=sys.stderr)" |
|
158 | 158 | ], |
|
159 | 159 | "language": "python", |
|
160 | 160 | "metadata": {}, |
|
161 | 161 | "outputs": [], |
|
162 | 162 | "prompt_number": 30 |
|
163 | 163 | }, |
|
164 | 164 | { |
|
165 | 165 | "cell_type": "code", |
|
166 | 166 | "collapsed": false, |
|
167 | 167 | "input": [ |
|
168 | 168 | "capt.stdout, capt.stderr" |
|
169 | 169 | ], |
|
170 | 170 | "language": "python", |
|
171 | 171 | "metadata": {}, |
|
172 | 172 | "outputs": [ |
|
173 | 173 | { |
|
174 | 174 | "output_type": "pyout", |
|
175 | 175 | "prompt_number": 33, |
|
176 | 176 | "text": [ |
|
177 | 177 | "('Hello stdout\\n', 'and stderr\\n')" |
|
178 | 178 | ] |
|
179 | 179 | } |
|
180 | 180 | ], |
|
181 | 181 | "prompt_number": 33 |
|
182 | 182 | }, |
|
183 | 183 | { |
|
184 | 184 | "cell_type": "code", |
|
185 | 185 | "collapsed": false, |
|
186 | 186 | "input": [ |
|
187 | 187 | "capt.show()" |
|
188 | 188 | ], |
|
189 | 189 | "language": "python", |
|
190 | 190 | "metadata": {}, |
|
191 | 191 | "outputs": [ |
|
192 | 192 | { |
|
193 | 193 | "output_type": "stream", |
|
194 | 194 | "stream": "stdout", |
|
195 | 195 | "text": [ |
|
196 | 196 | "Hello stdout\n" |
|
197 | 197 | ] |
|
198 | 198 | }, |
|
199 | 199 | { |
|
200 | 200 | "output_type": "stream", |
|
201 | 201 | "stream": "stderr", |
|
202 | 202 | "text": [ |
|
203 | 203 | "and stderr\n" |
|
204 | 204 | ] |
|
205 | 205 | } |
|
206 | 206 | ], |
|
207 | 207 | "prompt_number": 34 |
|
208 | 208 | }, |
|
209 | 209 | { |
|
210 | 210 | "cell_type": "markdown", |
|
211 | 211 | "metadata": {}, |
|
212 | 212 | "source": [ |
|
213 | 213 | "The `%%file` magic is a very useful tool that writes the cell contents as a named file:" |
|
214 | 214 | ] |
|
215 | 215 | }, |
|
216 | 216 | { |
|
217 | 217 | "cell_type": "code", |
|
218 | 218 | "collapsed": false, |
|
219 | 219 | "input": [ |
|
220 | 220 | "%%file foo.py\n", |
|
221 | 221 | "print('Hello world')" |
|
222 | 222 | ], |
|
223 | 223 | "language": "python", |
|
224 | 224 | "metadata": {}, |
|
225 | 225 | "outputs": [ |
|
226 | 226 | { |
|
227 | 227 | "output_type": "stream", |
|
228 | 228 | "stream": "stdout", |
|
229 | 229 | "text": [ |
|
230 | 230 | "Overwriting foo.py\n" |
|
231 | 231 | ] |
|
232 | 232 | } |
|
233 | 233 | ], |
|
234 | 234 | "prompt_number": 44 |
|
235 | 235 | }, |
|
236 | 236 | { |
|
237 | 237 | "cell_type": "code", |
|
238 | 238 | "collapsed": false, |
|
239 | 239 | "input": [ |
|
240 | 240 | "%run foo" |
|
241 | 241 | ], |
|
242 | 242 | "language": "python", |
|
243 | 243 | "metadata": {}, |
|
244 | 244 | "outputs": [ |
|
245 | 245 | { |
|
246 | 246 | "output_type": "stream", |
|
247 | 247 | "stream": "stdout", |
|
248 | 248 | "text": [ |
|
249 | 249 | "Hello world\n" |
|
250 | 250 | ] |
|
251 | 251 | } |
|
252 | 252 | ], |
|
253 | 253 | "prompt_number": 45 |
|
254 | 254 | }, |
|
255 | 255 | { |
|
256 | 256 | "cell_type": "heading", |
|
257 | 257 | "level": 2, |
|
258 | 258 | "metadata": {}, |
|
259 | 259 | "source": [ |
|
260 | 260 | "<!--====-->\n", |
|
261 | 261 | "Magics for running code under other interpreters" |
|
262 | 262 | ] |
|
263 | 263 | }, |
|
264 | 264 | { |
|
265 | 265 | "cell_type": "markdown", |
|
266 | 266 | "metadata": {}, |
|
267 | 267 | "source": [ |
|
268 | 268 | "IPython has a `%%script` cell magic, which lets you run a cell in\n", |
|
269 | 269 | "a subprocess of any interpreter on your system, such as: bash, ruby, perl, zsh, R, etc.\n", |
|
270 | 270 | "\n", |
|
271 | 271 | "It can even be a script of your own, which expects input on stdin." |
|
272 | 272 | ] |
|
273 | 273 | }, |
|
274 | 274 | { |
|
275 | 275 | "cell_type": "markdown", |
|
276 | 276 | "metadata": {}, |
|
277 | 277 | "source": [ |
|
278 | 278 | "To use it, simply pass a path or shell command to the program you want to run on the `%%script` line,\n", |
|
279 | 279 | "and the rest of the cell will be run by that script, and stdout/err from the subprocess are captured and displayed." |
|
280 | 280 | ] |
|
281 | 281 | }, |
|
282 | 282 | { |
|
283 | 283 | "cell_type": "code", |
|
284 | 284 | "collapsed": false, |
|
285 | 285 | "input": [ |
|
286 | 286 | "%%script python\n", |
|
287 | 287 | "import sys\n", |
|
288 | 288 | "print 'hello from Python %s' % sys.version" |
|
289 | 289 | ], |
|
290 | 290 | "language": "python", |
|
291 | 291 | "metadata": {}, |
|
292 | 292 | "outputs": [ |
|
293 | 293 | { |
|
294 | 294 | "output_type": "stream", |
|
295 | 295 | "stream": "stdout", |
|
296 | 296 | "text": [ |
|
297 | 297 | "hello from Python 2.7.3 (default, Apr 20 2012, 22:39:59) \n", |
|
298 | 298 | "[GCC 4.6.3]\n" |
|
299 | 299 | ] |
|
300 | 300 | } |
|
301 | 301 | ], |
|
302 | 302 | "prompt_number": 46 |
|
303 | 303 | }, |
|
304 | 304 | { |
|
305 | 305 | "cell_type": "code", |
|
306 | 306 | "collapsed": false, |
|
307 | 307 | "input": [ |
|
308 | 308 | "%%script python3\n", |
|
309 | 309 | "import sys\n", |
|
310 | 310 | "print('hello from Python: %s' % sys.version)" |
|
311 | 311 | ], |
|
312 | 312 | "language": "python", |
|
313 | 313 | "metadata": {}, |
|
314 | 314 | "outputs": [ |
|
315 | 315 | { |
|
316 | 316 | "output_type": "stream", |
|
317 | 317 | "stream": "stdout", |
|
318 | 318 | "text": [ |
|
319 | 319 | "hello from Python: 3.2.3 (default, May 3 2012, 15:51:42) \n", |
|
320 | 320 | "[GCC 4.6.3]\n" |
|
321 | 321 | ] |
|
322 | 322 | } |
|
323 | 323 | ], |
|
324 | 324 | "prompt_number": 47 |
|
325 | 325 | }, |
|
326 | 326 | { |
|
327 | 327 | "cell_type": "markdown", |
|
328 | 328 | "metadata": {}, |
|
329 | 329 | "source": [ |
|
330 | 330 | "IPython also creates aliases for a few common interpreters, such as bash, ruby, perl, etc.\n", |
|
331 | 331 | "\n", |
|
332 | 332 | "These are all equivalent to `%%script <name>`" |
|
333 | 333 | ] |
|
334 | 334 | }, |
|
335 | 335 | { |
|
336 | 336 | "cell_type": "code", |
|
337 | 337 | "collapsed": false, |
|
338 | 338 | "input": [ |
|
339 | 339 | "%%ruby\n", |
|
340 | 340 | "puts \"Hello from Ruby #{RUBY_VERSION}\"" |
|
341 | 341 | ], |
|
342 | 342 | "language": "python", |
|
343 | 343 | "metadata": {}, |
|
344 | 344 | "outputs": [ |
|
345 | 345 | { |
|
346 | 346 | "output_type": "stream", |
|
347 | 347 | "stream": "stdout", |
|
348 | 348 | "text": [ |
|
349 | 349 | "Hello from Ruby 1.8.7\n" |
|
350 | 350 | ] |
|
351 | 351 | } |
|
352 | 352 | ], |
|
353 | 353 | "prompt_number": 48 |
|
354 | 354 | }, |
|
355 | 355 | { |
|
356 | 356 | "cell_type": "code", |
|
357 | 357 | "collapsed": false, |
|
358 | 358 | "input": [ |
|
359 | 359 | "%%bash\n", |
|
360 | 360 | "echo \"hello from $BASH\"" |
|
361 | 361 | ], |
|
362 | 362 | "language": "python", |
|
363 | 363 | "metadata": {}, |
|
364 | 364 | "outputs": [ |
|
365 | 365 | { |
|
366 | 366 | "output_type": "stream", |
|
367 | 367 | "stream": "stdout", |
|
368 | 368 | "text": [ |
|
369 | 369 | "hello from /bin/bash\n" |
|
370 | 370 | ] |
|
371 | 371 | } |
|
372 | 372 | ], |
|
373 | 373 | "prompt_number": 49 |
|
374 | 374 | }, |
|
375 | 375 | { |
|
376 | 376 | "cell_type": "heading", |
|
377 | 377 | "level": 2, |
|
378 | 378 | "metadata": {}, |
|
379 | 379 | "source": [ |
|
380 | 380 | "Exercise: write your own script that numbers input lines" |
|
381 | 381 | ] |
|
382 | 382 | }, |
|
383 | 383 | { |
|
384 | 384 | "cell_type": "markdown", |
|
385 | 385 | "metadata": {}, |
|
386 | 386 | "source": [ |
|
387 | 387 | "Write a file, called `lnum.py`, such that the following cell works as shown (hint: don't forget about the executable bit!): " |
|
388 | 388 | ] |
|
389 | 389 | }, |
|
390 | 390 | { |
|
391 | 391 | "cell_type": "code", |
|
392 | 392 | "collapsed": false, |
|
393 | 393 | "input": [ |
|
394 | 394 | "%%script lnum.py\n", |
|
395 | 395 | "my first line\n", |
|
396 | 396 | "my second\n", |
|
397 | 397 | "more" |
|
398 | 398 | ], |
|
399 | 399 | "language": "python", |
|
400 | 400 | "metadata": {}, |
|
401 | 401 | "outputs": [ |
|
402 | 402 | { |
|
403 | 403 | "output_type": "stream", |
|
404 | 404 | "stream": "stdout", |
|
405 | 405 | "text": [ |
|
406 | 406 | "1 : my first line\n", |
|
407 | 407 | "2 : my second\n", |
|
408 | 408 | "3 : more \n", |
|
409 | 409 | "---- END ---\n" |
|
410 | 410 | ] |
|
411 | 411 | } |
|
412 | 412 | ], |
|
413 | 413 | "prompt_number": 97 |
|
414 | 414 | }, |
|
415 | 415 | { |
|
416 | 416 | "cell_type": "heading", |
|
417 | 417 | "level": 2, |
|
418 | 418 | "metadata": {}, |
|
419 | 419 | "source": [ |
|
420 | 420 | "Capturing output" |
|
421 | 421 | ] |
|
422 | 422 | }, |
|
423 | 423 | { |
|
424 | 424 | "cell_type": "markdown", |
|
425 | 425 | "metadata": {}, |
|
426 | 426 | "source": [ |
|
427 | 427 | "You can also capture stdout/err from these subprocesses into Python variables, instead of letting them go directly to stdout/err" |
|
428 | 428 | ] |
|
429 | 429 | }, |
|
430 | 430 | { |
|
431 | 431 | "cell_type": "code", |
|
432 | 432 | "collapsed": false, |
|
433 | 433 | "input": [ |
|
434 | 434 | "%%bash\n", |
|
435 | 435 | "echo \"hi, stdout\"\n", |
|
436 | 436 | "echo \"hello, stderr\" >&2\n" |
|
437 | 437 | ], |
|
438 | 438 | "language": "python", |
|
439 | 439 | "metadata": {}, |
|
440 | 440 | "outputs": [ |
|
441 | 441 | { |
|
442 | 442 | "output_type": "stream", |
|
443 | 443 | "stream": "stdout", |
|
444 | 444 | "text": [ |
|
445 | 445 | "hi, stdout\n" |
|
446 | 446 | ] |
|
447 | 447 | }, |
|
448 | 448 | { |
|
449 | 449 | "output_type": "stream", |
|
450 | 450 | "stream": "stderr", |
|
451 | 451 | "text": [ |
|
452 | 452 | "hello, stderr\n" |
|
453 | 453 | ] |
|
454 | 454 | } |
|
455 | 455 | ], |
|
456 | 456 | "prompt_number": 98 |
|
457 | 457 | }, |
|
458 | 458 | { |
|
459 | 459 | "cell_type": "code", |
|
460 | 460 | "collapsed": false, |
|
461 | 461 | "input": [ |
|
462 | 462 | "%%bash --out output --err error\n", |
|
463 | 463 | "echo \"hi, stdout\"\n", |
|
464 | 464 | "echo \"hello, stderr\" >&2" |
|
465 | 465 | ], |
|
466 | 466 | "language": "python", |
|
467 | 467 | "metadata": {}, |
|
468 | 468 | "outputs": [], |
|
469 | 469 | "prompt_number": 99 |
|
470 | 470 | }, |
|
471 | 471 | { |
|
472 | 472 | "cell_type": "code", |
|
473 | 473 | "collapsed": false, |
|
474 | 474 | "input": [ |
|
475 | 475 | "print(error)\n", |
|
476 | 476 | "print(output)" |
|
477 | 477 | ], |
|
478 | 478 | "language": "python", |
|
479 | 479 | "metadata": {}, |
|
480 | 480 | "outputs": [ |
|
481 | 481 | { |
|
482 | 482 | "output_type": "stream", |
|
483 | 483 | "stream": "stdout", |
|
484 | 484 | "text": [ |
|
485 | 485 | "hello, stderr\n", |
|
486 | 486 | "\n", |
|
487 | 487 | "hi, stdout\n", |
|
488 | 488 | "\n" |
|
489 | 489 | ] |
|
490 | 490 | } |
|
491 | 491 | ], |
|
492 | 492 | "prompt_number": 100 |
|
493 | 493 | }, |
|
494 | 494 | { |
|
495 | 495 | "cell_type": "heading", |
|
496 | 496 | "level": 2, |
|
497 | 497 | "metadata": {}, |
|
498 | 498 | "source": [ |
|
499 | 499 | "Background Scripts" |
|
500 | 500 | ] |
|
501 | 501 | }, |
|
502 | 502 | { |
|
503 | 503 | "cell_type": "markdown", |
|
504 | 504 | "metadata": {}, |
|
505 | 505 | "source": [ |
|
506 | 506 | "These scripts can be run in the background, by adding the `--bg` flag.\n", |
|
507 | 507 | "\n", |
|
508 | 508 | "When you do this, output is discarded unless you use the `--out/err`\n", |
|
509 | 509 | "flags to store output as above." |
|
510 | 510 | ] |
|
511 | 511 | }, |
|
512 | 512 | { |
|
513 | 513 | "cell_type": "code", |
|
514 | 514 | "collapsed": false, |
|
515 | 515 | "input": [ |
|
516 | 516 | "%%ruby --bg --out ruby_lines\n", |
|
517 | 517 | "for n in 1...10\n", |
|
518 | 518 | " sleep 1\n", |
|
519 | 519 | " puts \"line #{n}\"\n", |
|
520 | 520 | " STDOUT.flush\n", |
|
521 | 521 | "end" |
|
522 | 522 | ], |
|
523 | 523 | "language": "python", |
|
524 | 524 | "metadata": {}, |
|
525 | 525 | "outputs": [ |
|
526 | 526 | { |
|
527 | 527 | "output_type": "stream", |
|
528 | 528 | "stream": "stdout", |
|
529 | 529 | "text": [ |
|
530 | 530 | "Starting job # 0 in a separate thread.\n" |
|
531 | 531 | ] |
|
532 | 532 | } |
|
533 | 533 | ], |
|
534 | 534 | "prompt_number": 22 |
|
535 | 535 | }, |
|
536 | 536 | { |
|
537 | 537 | "cell_type": "markdown", |
|
538 | 538 | "metadata": {}, |
|
539 | 539 | "source": [ |
|
540 | 540 | "When you do store output of a background thread, these are the stdout/err *pipes*,\n", |
|
541 | 541 | "rather than the text of the output." |
|
542 | 542 | ] |
|
543 | 543 | }, |
|
544 | 544 | { |
|
545 | 545 | "cell_type": "code", |
|
546 | 546 | "collapsed": false, |
|
547 | 547 | "input": [ |
|
548 | 548 | "ruby_lines" |
|
549 | 549 | ], |
|
550 | 550 | "language": "python", |
|
551 | 551 | "metadata": {}, |
|
552 | 552 | "outputs": [ |
|
553 | 553 | { |
|
554 | 554 | "output_type": "pyout", |
|
555 | 555 | "prompt_number": 23, |
|
556 | 556 | "text": [ |
|
557 | 557 | "<open file '<fdopen>', mode 'rb' at 0x2ed8ed0>" |
|
558 | 558 | ] |
|
559 | 559 | } |
|
560 | 560 | ], |
|
561 | 561 | "prompt_number": 23 |
|
562 | 562 | }, |
|
563 | 563 | { |
|
564 | 564 | "cell_type": "code", |
|
565 | 565 | "collapsed": false, |
|
566 | 566 | "input": [ |
|
567 | 567 | "print(ruby_lines.read())" |
|
568 | 568 | ], |
|
569 | 569 | "language": "python", |
|
570 | 570 | "metadata": {}, |
|
571 | 571 | "outputs": [ |
|
572 | 572 | { |
|
573 | 573 | "output_type": "stream", |
|
574 | 574 | "stream": "stdout", |
|
575 | 575 | "text": [ |
|
576 | 576 | "line 1\n", |
|
577 | 577 | "line 2\n", |
|
578 | 578 | "line 3\n", |
|
579 | 579 | "line 4\n", |
|
580 | 580 | "line 5\n", |
|
581 | 581 | "line 6\n", |
|
582 | 582 | "line 7\n", |
|
583 | 583 | "line 8\n", |
|
584 | 584 | "line 9\n", |
|
585 | 585 | "\n" |
|
586 | 586 | ] |
|
587 | 587 | } |
|
588 | 588 | ], |
|
589 | 589 | "prompt_number": 24 |
|
590 | 590 | }, |
|
591 | 591 | { |
|
592 | 592 | "cell_type": "heading", |
|
593 | 593 | "level": 1, |
|
594 | 594 | "metadata": {}, |
|
595 | 595 | "source": [ |
|
596 | 596 | "Cython Magic Functions Extension" |
|
597 | 597 | ] |
|
598 | 598 | }, |
|
599 | 599 | { |
|
600 | 600 | "cell_type": "heading", |
|
601 | 601 | "level": 2, |
|
602 | 602 | "metadata": {}, |
|
603 | 603 | "source": [ |
|
604 | 604 | "Loading the extension" |
|
605 | 605 | ] |
|
606 | 606 | }, |
|
607 | 607 | { |
|
608 | 608 | "cell_type": "markdown", |
|
609 | 609 | "metadata": {}, |
|
610 | 610 | "source": [ |
|
611 | 611 | "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:" |
|
612 | 612 | ] |
|
613 | 613 | }, |
|
614 | 614 | { |
|
615 | 615 | "cell_type": "code", |
|
616 | 616 | "collapsed": false, |
|
617 | 617 | "input": [ |
|
618 | 618 | "%load_ext cythonmagic" |
|
619 | 619 | ], |
|
620 | 620 | "language": "python", |
|
621 | 621 | "metadata": {}, |
|
622 | 622 | "outputs": [], |
|
623 | 623 | "prompt_number": 1 |
|
624 | 624 | }, |
|
625 | 625 | { |
|
626 | 626 | "cell_type": "markdown", |
|
627 | 627 | "metadata": {}, |
|
628 | 628 | "source": [ |
|
629 | 629 | "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." |
|
630 | 630 | ] |
|
631 | 631 | }, |
|
632 | 632 | { |
|
633 | 633 | "cell_type": "code", |
|
634 | 634 | "collapsed": false, |
|
635 | 635 | "input": [ |
|
636 | 636 | "%%cython_pyximport foo\n", |
|
637 | 637 | "def f(x):\n", |
|
638 | 638 | " return 4.0*x" |
|
639 | 639 | ], |
|
640 | 640 | "language": "python", |
|
641 | 641 | "metadata": {}, |
|
642 | 642 | "outputs": [], |
|
643 | 643 | "prompt_number": 4 |
|
644 | 644 | }, |
|
645 | 645 | { |
|
646 | 646 | "cell_type": "code", |
|
647 | 647 | "collapsed": false, |
|
648 | 648 | "input": [ |
|
649 | 649 | "f(10)" |
|
650 | 650 | ], |
|
651 | 651 | "language": "python", |
|
652 | 652 | "metadata": {}, |
|
653 | 653 | "outputs": [ |
|
654 | 654 | { |
|
655 | 655 | "output_type": "pyout", |
|
656 | 656 | "prompt_number": 5, |
|
657 | 657 | "text": [ |
|
658 | 658 | "40.0" |
|
659 | 659 | ] |
|
660 | 660 | } |
|
661 | 661 | ], |
|
662 | 662 | "prompt_number": 5 |
|
663 | 663 | }, |
|
664 | 664 | { |
|
665 | 665 | "cell_type": "heading", |
|
666 | 666 | "level": 2, |
|
667 | 667 | "metadata": {}, |
|
668 | 668 | "source": [ |
|
669 | 669 | "The %cython magic" |
|
670 | 670 | ] |
|
671 | 671 | }, |
|
672 | 672 | { |
|
673 | 673 | "cell_type": "markdown", |
|
674 | 674 | "metadata": {}, |
|
675 | 675 | "source": [ |
|
676 | 676 | "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", |
|
677 | 677 | "\n", |
|
678 | 678 | "Here is a simple example of a Black-Scholes options pricing algorithm written in Cython:" |
|
679 | 679 | ] |
|
680 | 680 | }, |
|
681 | 681 | { |
|
682 | 682 | "cell_type": "code", |
|
683 | 683 | "collapsed": false, |
|
684 | 684 | "input": [ |
|
685 | 685 | "%%cython\n", |
|
686 | 686 | "cimport cython\n", |
|
687 | 687 | "from libc.math cimport exp, sqrt, pow, log, erf\n", |
|
688 | 688 | "\n", |
|
689 | 689 | "@cython.cdivision(True)\n", |
|
690 | 690 | "cdef double std_norm_cdf(double x) nogil:\n", |
|
691 | 691 | " return 0.5*(1+erf(x/sqrt(2.0)))\n", |
|
692 | 692 | "\n", |
|
693 | 693 | "@cython.cdivision(True)\n", |
|
694 | 694 | "def black_scholes(double s, double k, double t, double v,\n", |
|
695 | 695 | " double rf, double div, double cp):\n", |
|
696 | 696 | " \"\"\"Price an option using the Black-Scholes model.\n", |
|
697 | 697 | " \n", |
|
698 | 698 | " s : initial stock price\n", |
|
699 | 699 | " k : strike price\n", |
|
700 | 700 | " t : expiration time\n", |
|
701 | 701 | " v : volatility\n", |
|
702 | 702 | " rf : risk-free rate\n", |
|
703 | 703 | " div : dividend\n", |
|
704 | 704 | " cp : +1/-1 for call/put\n", |
|
705 | 705 | " \"\"\"\n", |
|
706 | 706 | " cdef double d1, d2, optprice\n", |
|
707 | 707 | " with nogil:\n", |
|
708 | 708 | " d1 = (log(s/k)+(rf-div+0.5*pow(v,2))*t)/(v*sqrt(t))\n", |
|
709 | 709 | " d2 = d1 - v*sqrt(t)\n", |
|
710 | 710 | " optprice = cp*s*exp(-div*t)*std_norm_cdf(cp*d1) - \\\n", |
|
711 | 711 | " cp*k*exp(-rf*t)*std_norm_cdf(cp*d2)\n", |
|
712 | 712 | " return optprice" |
|
713 | 713 | ], |
|
714 | 714 | "language": "python", |
|
715 | 715 | "metadata": {}, |
|
716 | 716 | "outputs": [], |
|
717 | 717 | "prompt_number": 6 |
|
718 | 718 | }, |
|
719 | 719 | { |
|
720 | 720 | "cell_type": "code", |
|
721 | 721 | "collapsed": false, |
|
722 | 722 | "input": [ |
|
723 | 723 | "black_scholes(100.0, 100.0, 1.0, 0.3, 0.03, 0.0, -1)" |
|
724 | 724 | ], |
|
725 | 725 | "language": "python", |
|
726 | 726 | "metadata": {}, |
|
727 | 727 | "outputs": [ |
|
728 | 728 | { |
|
729 | 729 | "output_type": "pyout", |
|
730 | 730 | "prompt_number": 7, |
|
731 | 731 | "text": [ |
|
732 | 732 | "10.327861752731728" |
|
733 | 733 | ] |
|
734 | 734 | } |
|
735 | 735 | ], |
|
736 | 736 | "prompt_number": 7 |
|
737 | 737 | }, |
|
738 | 738 | { |
|
739 | 739 | "cell_type": "code", |
|
740 | 740 | "collapsed": false, |
|
741 | 741 | "input": [ |
|
742 | 742 | "%timeit black_scholes(100.0, 100.0, 1.0, 0.3, 0.03, 0.0, -1)" |
|
743 | 743 | ], |
|
744 | 744 | "language": "python", |
|
745 | 745 | "metadata": {}, |
|
746 | 746 | "outputs": [ |
|
747 | 747 | { |
|
748 | 748 | "output_type": "stream", |
|
749 | 749 | "stream": "stdout", |
|
750 | 750 | "text": [ |
|
751 | 751 | "1000000 loops, best of 3: 821 ns per loop\n" |
|
752 | 752 | ] |
|
753 | 753 | } |
|
754 | 754 | ], |
|
755 | 755 | "prompt_number": 8 |
|
756 | 756 | }, |
|
757 | 757 | { |
|
758 | 758 | "cell_type": "markdown", |
|
759 | 759 | "metadata": {}, |
|
760 | 760 | "source": [ |
|
761 | 761 | "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:" |
|
762 | 762 | ] |
|
763 | 763 | }, |
|
764 | 764 | { |
|
765 | 765 | "cell_type": "code", |
|
766 | 766 | "collapsed": false, |
|
767 | 767 | "input": [ |
|
768 | 768 | "%%cython -lm\n", |
|
769 | 769 | "from libc.math cimport sin\n", |
|
770 | 770 | "print 'sin(1)=', sin(1)" |
|
771 | 771 | ], |
|
772 | 772 | "language": "python", |
|
773 | 773 | "metadata": {}, |
|
774 | 774 | "outputs": [ |
|
775 | 775 | { |
|
776 | 776 | "output_type": "stream", |
|
777 | 777 | "stream": "stdout", |
|
778 | 778 | "text": [ |
|
779 | 779 | "sin(1)= 0.841470984808\n" |
|
780 | 780 | ] |
|
781 | 781 | } |
|
782 | 782 | ], |
|
783 | 783 | "prompt_number": 9 |
|
784 | 784 | }, |
|
785 | 785 | { |
|
786 | 786 | "cell_type": "markdown", |
|
787 | 787 | "metadata": {}, |
|
788 | 788 | "source": [ |
|
789 | 789 | "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." |
|
790 | 790 | ] |
|
791 | 791 | }, |
|
792 | 792 | { |
|
793 | 793 | "cell_type": "heading", |
|
794 | 794 | "level": 1, |
|
795 | 795 | "metadata": {}, |
|
796 | 796 | "source": [ |
|
797 | 797 | "Rmagic Functions Extension" |
|
798 | 798 | ] |
|
799 | 799 | }, |
|
800 | 800 | { |
|
801 | 801 | "cell_type": "markdown", |
|
802 | 802 | "metadata": {}, |
|
803 | 803 | "source": [ |
|
804 | 804 | "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:" |
|
805 | 805 | ] |
|
806 | 806 | }, |
|
807 | 807 | { |
|
808 | 808 | "cell_type": "code", |
|
809 | 809 | "collapsed": true, |
|
810 | 810 | "input": [ |
|
811 | 811 | "%load_ext rmagic " |
|
812 | 812 | ], |
|
813 | 813 | "language": "python", |
|
814 | 814 | "metadata": {}, |
|
815 | 815 | "outputs": [], |
|
816 | 816 | "prompt_number": 101 |
|
817 | 817 | }, |
|
818 | 818 | { |
|
819 | 819 | "cell_type": "markdown", |
|
820 | 820 | "metadata": {}, |
|
821 | 821 | "source": [ |
|
822 | 822 | "A typical use case one imagines is having some numpy arrays, wanting to compute some statistics of interest on these\n", |
|
823 | 823 | " arrays and return the result back to python. Let's suppose we just want to fit a simple linear model to a scatterplot." |
|
824 | 824 | ] |
|
825 | 825 | }, |
|
826 | 826 | { |
|
827 | 827 | "cell_type": "code", |
|
828 | 828 | "collapsed": false, |
|
829 | 829 | "input": [ |
|
830 | 830 | "import numpy as np\n", |
|
831 | 831 | "import pylab\n", |
|
832 | 832 | "X = np.array([0,1,2,3,4])\n", |
|
833 | 833 | "Y = np.array([3,5,4,6,7])\n", |
|
834 | 834 | "pylab.scatter(X, Y)" |
|
835 | 835 | ], |
|
836 | 836 | "language": "python", |
|
837 | 837 | "metadata": {}, |
|
838 | 838 | "outputs": [ |
|
839 | 839 | { |
|
840 | 840 | "output_type": "pyout", |
|
841 | 841 | "prompt_number": 102, |
|
842 | 842 | "text": [ |
|
843 | 843 | "<matplotlib.collections.PathCollection at 0x49f83d0>" |
|
844 | 844 | ] |
|
845 | 845 | }, |
|
846 | 846 | { |
|
847 | 847 | "output_type": "display_data", |
|
848 | 848 | "png": "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\nKyutYcOG2T2lSzQ0NFhVVVWWZVlWY2OjNXTo0Lj672dZltXc3GxZlmVdvnzZys3NtXbv3m3zouj6\ny1/+Ys2YMcMqKiqye0rUpaWlWT/88ENEx0blR70zMjI0dOjQaJzKCBUVFbrrrruUlpamxMRETZs2\nTRs3brR7VtTk5eXplltusXtGl+kO79/v2bOnJCkQCCgYDCo5OdnmRdFz/Phxbd26VXPmzInbNyFE\nel38WxxXceLECaWmpl75/ZAhQ3TixAkbF+F6xev799va2pSdna2BAwdq7Nixcrvddk+Kmvnz52vF\nihVKSIjPPDkcDuXn5ysnJ0dr164NeWzYt9n9v4KCAp06dep3ny8pKYm750S8tzs+NDU1aerUqVq1\napWSkpLsnhNVCQkJqq6u1vnz51VYWCifzyev12v3rE7bsmWLBgwYII/HE7c/6l1WVqbBgwfrzJkz\nKigoUEZGhvLy8q56bMSB3rFjR9QGmi4lJUX19fVXfl9fX68hQ4bYuAgdFe79+/GiT58+mjhxovbt\n2xcXgd67d682bdqkrVu3qqWlRRcuXNCsWbO0fv16u6dFzeDBgyVJ/fv31+TJk1VRUXHNQEf9zxDx\n8MwoJydHR48eVV1dnQKBgD788EM99thjds9ChCzL0rPPPiu326158+bZPSfqzp49q3PnzkmSLl68\nqB07dsjj8di8KjpKSkpUX1+v2tpabdiwQePGjYurOPv9fjU2NkqSmpubtX379pDvpopKoD/77DOl\npqaqvLxcEydO1IQJE6JxWtu4XC6tWbNGhYWFcrvdeuKJJ5SZmWn3rKiZPn26Ro8erSNHjig1NVXr\n1q2ze1JUlZWV6b333tPOnTvl8Xjk8Xi0bds2u2dFTUNDg8aNG6fs7Gzl5uaqqKhI48ePt3tWl4i3\nx42nT59WXl7elf92jz76qB566KFrHh/Rv8UBAIi9+PxrUgCIAwQaAAxFoAHAUAQaAAxFoAHAUAQa\nAAz1vw0tF27Rt+wZAAAAAElFTkSuQmCC\n" |
|
849 | 849 | } |
|
850 | 850 | ], |
|
851 | 851 | "prompt_number": 102 |
|
852 | 852 | }, |
|
853 | 853 | { |
|
854 | 854 | "cell_type": "markdown", |
|
855 | 855 | "metadata": {}, |
|
856 | 856 | "source": [ |
|
857 | 857 | "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." |
|
858 | 858 | ] |
|
859 | 859 | }, |
|
860 | 860 | { |
|
861 | 861 | "cell_type": "code", |
|
862 | 862 | "collapsed": false, |
|
863 | 863 | "input": [ |
|
864 | 864 | "%Rpush X Y\n", |
|
865 | 865 | "%R lm(Y~X)$coef" |
|
866 | 866 | ], |
|
867 | 867 | "language": "python", |
|
868 | 868 | "metadata": {}, |
|
869 | 869 | "outputs": [ |
|
870 | 870 | { |
|
871 | 871 | "output_type": "pyout", |
|
872 | 872 | "prompt_number": 103, |
|
873 | 873 | "text": [ |
|
874 | 874 | "array([ 3.2, 0.9])" |
|
875 | 875 | ] |
|
876 | 876 | } |
|
877 | 877 | ], |
|
878 | 878 | "prompt_number": 103 |
|
879 | 879 | }, |
|
880 | 880 | { |
|
881 | 881 | "cell_type": "markdown", |
|
882 | 882 | "metadata": {}, |
|
883 | 883 | "source": [ |
|
884 | 884 | "It is also possible to return more than one value with %R." |
|
885 | 885 | ] |
|
886 | 886 | }, |
|
887 | 887 | { |
|
888 | 888 | "cell_type": "code", |
|
889 | 889 | "collapsed": false, |
|
890 | 890 | "input": [ |
|
891 | 891 | "%R resid(lm(Y~X)); coef(lm(X~Y))" |
|
892 | 892 | ], |
|
893 | 893 | "language": "python", |
|
894 | 894 | "metadata": {}, |
|
895 | 895 | "outputs": [ |
|
896 | 896 | { |
|
897 | 897 | "output_type": "pyout", |
|
898 | 898 | "prompt_number": 104, |
|
899 | 899 | "text": [ |
|
900 | 900 | "array([-2.5, 0.9])" |
|
901 | 901 | ] |
|
902 | 902 | } |
|
903 | 903 | ], |
|
904 | 904 | "prompt_number": 104 |
|
905 | 905 | }, |
|
906 | 906 | { |
|
907 | 907 | "cell_type": "markdown", |
|
908 | 908 | "metadata": {}, |
|
909 | 909 | "source": [ |
|
910 | 910 | "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", |
|
911 | 911 | "the *coef(lm(X~Y))*. To pull other variables from R, there is one more magic." |
|
912 | 912 | ] |
|
913 | 913 | }, |
|
914 | 914 | { |
|
915 | 915 | "cell_type": "markdown", |
|
916 | 916 | "metadata": {}, |
|
917 | 917 | "source": [ |
|
918 | 918 | "There are two more line magics, %Rpull and %Rget. Both are useful after some R code has been executed and there are variables\n", |
|
919 | 919 | "in the rpy2 namespace that one would like to retrieve. The main difference is that one\n", |
|
920 | 920 | " returns the value (%Rget), while the other pulls it to self.shell.user_ns (%Rpull). Imagine we've stored the results\n", |
|
921 | 921 | "of some calculation in the variable \"a\" in rpy2's namespace. By using the %R magic, we can obtain these results and\n", |
|
922 | 922 | "store them in b. We can also pull them directly to user_ns with %Rpull. They are both views on the same data." |
|
923 | 923 | ] |
|
924 | 924 | }, |
|
925 | 925 | { |
|
926 | 926 | "cell_type": "code", |
|
927 | 927 | "collapsed": false, |
|
928 | 928 | "input": [ |
|
929 | 929 | "b = %R a=resid(lm(Y~X))\n", |
|
930 | 930 | "%Rpull a\n", |
|
931 | 931 | "print(a)\n", |
|
932 | 932 | "assert id(b.data) == id(a.data)\n", |
|
933 | 933 | "%R -o a" |
|
934 | 934 | ], |
|
935 | 935 | "language": "python", |
|
936 | 936 | "metadata": {}, |
|
937 | 937 | "outputs": [ |
|
938 | 938 | { |
|
939 | 939 | "output_type": "stream", |
|
940 | 940 | "stream": "stdout", |
|
941 | 941 | "text": [ |
|
942 | 942 | "[-0.2 0.9 -1. 0.1 0.2]\n" |
|
943 | 943 | ] |
|
944 | 944 | } |
|
945 | 945 | ], |
|
946 | 946 | "prompt_number": 6 |
|
947 | 947 | }, |
|
948 | 948 | { |
|
949 | 949 | "cell_type": "heading", |
|
950 | 950 | "level": 2, |
|
951 | 951 | "metadata": {}, |
|
952 | 952 | "source": [ |
|
953 | 953 | "Plotting and capturing output" |
|
954 | 954 | ] |
|
955 | 955 | }, |
|
956 | 956 | { |
|
957 | 957 | "cell_type": "markdown", |
|
958 | 958 | "metadata": {}, |
|
959 | 959 | "source": [ |
|
960 | 960 | "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." |
|
961 | 961 | ] |
|
962 | 962 | }, |
|
963 | 963 | { |
|
964 | 964 | "cell_type": "code", |
|
965 | 965 | "collapsed": false, |
|
966 | 966 | "input": [ |
|
967 | 967 | "from __future__ import print_function\n", |
|
968 | 968 | "v1 = %R plot(X,Y); print(summary(lm(Y~X))); vv=mean(X)*mean(Y)\n", |
|
969 | 969 | "print('v1 is:', v1)\n", |
|
970 | 970 | "v2 = %R mean(X)*mean(Y)\n", |
|
971 | 971 | "print('v2 is:', v2)" |
|
972 | 972 | ], |
|
973 | 973 | "language": "python", |
|
974 | 974 | "metadata": {}, |
|
975 | 975 | "outputs": [ |
|
976 | 976 | { |
|
977 | 977 | "output_type": "display_data", |
|
978 | 978 | "text": [ |
|
979 | 979 | "\n", |
|
980 | 980 | "Call:\n", |
|
981 | 981 | "lm(formula = Y ~ X)\n", |
|
982 | 982 | "\n", |
|
983 | 983 | "Residuals:\n", |
|
984 | 984 | " 1 2 3 4 5 \n", |
|
985 | 985 | "-0.2 0.9 -1.0 0.1 0.2 \n", |
|
986 | 986 | "\n", |
|
987 | 987 | "Coefficients:\n", |
|
988 | 988 | " Estimate Std. Error t value Pr(>|t|) \n", |
|
989 | 989 | "(Intercept) 3.2000 0.6164 5.191 0.0139 *\n", |
|
990 | 990 | "X 0.9000 0.2517 3.576 0.0374 *\n", |
|
991 | 991 | "---\n", |
|
992 | 992 | "Signif. codes: 0 \u2018***\u2019 0.001 \u2018**\u2019 0.01 \u2018*\u2019 0.05 \u2018.\u2019 0.1 \u2018 \u2019 1 \n", |
|
993 | 993 | "\n", |
|
994 | 994 | "Residual standard error: 0.7958 on 3 degrees of freedom\n", |
|
995 | 995 | "Multiple R-squared: 0.81,\tAdjusted R-squared: 0.7467 \n", |
|
996 | 996 | "F-statistic: 12.79 on 1 and 3 DF, p-value: 0.03739 \n", |
|
997 | 997 | "\n" |
|
998 | 998 | ] |
|
999 | 999 | }, |
|
1000 | 1000 | { |
|
1001 | 1001 | "output_type": "display_data", |
|
1002 | 1002 | "png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAMAAABKCk6nAAACo1BMVEUAAAABAQECAgIDAwMEBAQF\nBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQWFhYXFxcZGRka\nGhobGxsdHR0eHh4fHx8hISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKiorKystLS0uLi4vLy8x\nMTEyMjIzMzM2NjY3Nzc4ODg5OTk6Ojo7Ozs8PDw9PT0+Pj4/Pz9AQEBBQUFDQ0NERERFRUVGRkZH\nR0dISEhJSUlKSkpLS0tMTExNTU1OTk5PT09QUFBRUVFSUlJUVFRVVVVWVlZXV1dYWFhZWVlaWlpb\nW1tcXFxeXl5fX19gYGBhYWFiYmJjY2NkZGRlZWVmZmZnZ2doaGhpaWlqampra2tsbGxubm5vb29w\ncHBxcXFycnJ0dHR1dXV2dnZ3d3d4eHh6enp7e3t8fHx9fX1+fn6AgICBgYGDg4OFhYWGhoaHh4eI\niIiJiYmKioqLi4uNjY2Ojo6Pj4+QkJCRkZGUlJSVlZWXl5eYmJiZmZmampqbm5ucnJyenp6fn5+g\noKCioqKjo6OkpKSlpaWoqKipqamqqqqrq6uurq6vr6+wsLCxsbGysrKzs7O0tLS1tbW2tra3t7e4\nuLi6urq7u7u8vLy9vb2/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fJycnKysrLy8vMzMzNzc3P\nz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi\n4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT1\n9fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7///9dYsGyAAALXElEQVR4nO3c+5uUdRnH8TtI\nRZTAU0lQSpoHEhUE3TQVMkpkMUEBxVILTxlZZqFoJOrioRPYQTNTCBURoUwT1BRXWU/sbgKisMgy\n3z+l2f1h2Z1hcWaf556b/Vzv1w+jPDN8n4+8L2d3YS8sQZpFD4Avix4AXxY9AL4segB8WfQA+LLo\nAfBl0QPgy6IHwJdFD4Avix4AXxY9AL4segB8WfQA+LLoAfBl0QPgy6IHwJdFD4Avix4AXxY9AL4s\n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\nrkJggg==\n" |
|
1003 | 1003 | }, |
|
1004 | 1004 | { |
|
1005 | 1005 | "output_type": "stream", |
|
1006 | 1006 | "stream": "stdout", |
|
1007 | 1007 | "text": [ |
|
1008 | 1008 | "v1 is: [ 10.]\n", |
|
1009 | 1009 | "v2 is: [ 10.]\n" |
|
1010 | 1010 | ] |
|
1011 | 1011 | } |
|
1012 | 1012 | ], |
|
1013 | 1013 | "prompt_number": 105 |
|
1014 | 1014 | }, |
|
1015 | 1015 | { |
|
1016 | 1016 | "cell_type": "heading", |
|
1017 | 1017 | "level": 2, |
|
1018 | 1018 | "metadata": {}, |
|
1019 | 1019 | "source": [ |
|
1020 | 1020 | "Cell level magic" |
|
1021 | 1021 | ] |
|
1022 | 1022 | }, |
|
1023 | 1023 | { |
|
1024 | 1024 | "cell_type": "markdown", |
|
1025 | 1025 | "metadata": {}, |
|
1026 | 1026 | "source": [ |
|
1027 | 1027 | "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", |
|
1028 | 1028 | "use before returning to python. This is the cell-level magic.\n", |
|
1029 | 1029 | "\n", |
|
1030 | 1030 | "\n", |
|
1031 | 1031 | "For the cell level magic, inputs can be passed via the -i or --inputs argument in the line. These variables are copied \n", |
|
1032 | 1032 | "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", |
|
1033 | 1033 | "\n", |
|
1034 | 1034 | "We can redo the above calculations in one ipython cell. We might also want to add some output such as a summary\n", |
|
1035 | 1035 | " from R or perhaps the standard plotting diagnostics of the lm." |
|
1036 | 1036 | ] |
|
1037 | 1037 | }, |
|
1038 | 1038 | { |
|
1039 | 1039 | "cell_type": "code", |
|
1040 | 1040 | "collapsed": false, |
|
1041 | 1041 | "input": [ |
|
1042 | 1042 | "%%R -i X,Y -o XYcoef\n", |
|
1043 | 1043 | "XYlm = lm(Y~X)\n", |
|
1044 | 1044 | "XYcoef = coef(XYlm)\n", |
|
1045 | 1045 | "print(summary(XYlm))\n", |
|
1046 | 1046 | "par(mfrow=c(2,2))\n", |
|
1047 | 1047 | "plot(XYlm)" |
|
1048 | 1048 | ], |
|
1049 | 1049 | "language": "python", |
|
1050 | 1050 | "metadata": {}, |
|
1051 | 1051 | "outputs": [ |
|
1052 | 1052 | { |
|
1053 | 1053 | "output_type": "display_data", |
|
1054 | 1054 | "text": [ |
|
1055 | 1055 | "\n", |
|
1056 | 1056 | "Call:\n", |
|
1057 | 1057 | "lm(formula = Y ~ X)\n", |
|
1058 | 1058 | "\n", |
|
1059 | 1059 | "Residuals:\n", |
|
1060 | 1060 | " 1 2 3 4 5 \n", |
|
1061 | 1061 | "-0.2 0.9 -1.0 0.1 0.2 \n", |
|
1062 | 1062 | "\n", |
|
1063 | 1063 | "Coefficients:\n", |
|
1064 | 1064 | " Estimate Std. Error t value Pr(>|t|) \n", |
|
1065 | 1065 | "(Intercept) 3.2000 0.6164 5.191 0.0139 *\n", |
|
1066 | 1066 | "X 0.9000 0.2517 3.576 0.0374 *\n", |
|
1067 | 1067 | "---\n", |
|
1068 | 1068 | "Signif. codes: 0 \u2018***\u2019 0.001 \u2018**\u2019 0.01 \u2018*\u2019 0.05 \u2018.\u2019 0.1 \u2018 \u2019 1 \n", |
|
1069 | 1069 | "\n", |
|
1070 | 1070 | "Residual standard error: 0.7958 on 3 degrees of freedom\n", |
|
1071 | 1071 | "Multiple R-squared: 0.81,\tAdjusted R-squared: 0.7467 \n", |
|
1072 | 1072 | "F-statistic: 12.79 on 1 and 3 DF, p-value: 0.03739 \n", |
|
1073 | 1073 | "\n" |
|
1074 | 1074 | ] |
|
1075 | 1075 | }, |
|
1076 | 1076 | { |
|
1077 | 1077 | "output_type": "display_data", |
|
1078 | 1078 | "png": "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\n" |
|
1079 | 1079 | } |
|
1080 | 1080 | ], |
|
1081 | 1081 | "prompt_number": 16 |
|
1082 | 1082 | }, |
|
1083 | 1083 | { |
|
1084 | 1084 | "cell_type": "heading", |
|
1085 | 1085 | "level": 1, |
|
1086 | 1086 | "metadata": {}, |
|
1087 | 1087 | "source": [ |
|
1088 | 1088 | "octavemagic: Octave inside IPython" |
|
1089 | 1089 | ] |
|
1090 | 1090 | }, |
|
1091 | 1091 | { |
|
1092 | 1092 | "cell_type": "markdown", |
|
1093 | 1093 | "metadata": {}, |
|
1094 | 1094 | "source": [ |
|
1095 | 1095 | "The `octavemagic` extension provides the ability to interact with Octave. It depends on the `oct2py` and `h5py` packages,\n", |
|
1096 | 1096 | "which may be installed using `easy_install`. It has been closely modeled after the R extension, so many of its names and usage patterns are the same.\n", |
|
1097 | 1097 | "\n", |
|
1098 | 1098 | "To enable the extension, load it as follows:" |
|
1099 | 1099 | ] |
|
1100 | 1100 | }, |
|
1101 | 1101 | { |
|
1102 | 1102 | "cell_type": "code", |
|
1103 | 1103 | "collapsed": false, |
|
1104 | 1104 | "input": [ |
|
1105 | 1105 | "%load_ext octavemagic" |
|
1106 | 1106 | ], |
|
1107 | 1107 | "language": "python", |
|
1108 | 1108 | "metadata": {}, |
|
1109 | 1109 | "outputs": [], |
|
1110 | 1110 | "prompt_number": 109 |
|
1111 | 1111 | }, |
|
1112 | 1112 | { |
|
1113 | 1113 | "cell_type": "heading", |
|
1114 | 1114 | "level": 2, |
|
1115 | 1115 | "metadata": {}, |
|
1116 | 1116 | "source": [ |
|
1117 | 1117 | "Overview" |
|
1118 | 1118 | ] |
|
1119 | 1119 | }, |
|
1120 | 1120 | { |
|
1121 | 1121 | "cell_type": "markdown", |
|
1122 | 1122 | "metadata": {}, |
|
1123 | 1123 | "source": [ |
|
1124 | 1124 | "Loading the extension enables three magic functions: `%octave`, `%octave_push`, and `%octave_pull`.\n", |
|
1125 | 1125 | "\n", |
|
1126 | 1126 | "The first is for executing one or more lines of Octave, while the latter allow moving variables between the Octave and Python workspace.\n", |
|
1127 | 1127 | "Here you see an example of how to execute a single line of Octave, and how to transfer the generated value back to Python:" |
|
1128 | 1128 | ] |
|
1129 | 1129 | }, |
|
1130 | 1130 | { |
|
1131 | 1131 | "cell_type": "code", |
|
1132 | 1132 | "collapsed": false, |
|
1133 | 1133 | "input": [ |
|
1134 | 1134 | "x = %octave [1 2; 3 4];\n", |
|
1135 | 1135 | "x" |
|
1136 | 1136 | ], |
|
1137 | 1137 | "language": "python", |
|
1138 | 1138 | "metadata": {}, |
|
1139 | 1139 | "outputs": [ |
|
1140 | 1140 | { |
|
1141 | 1141 | "output_type": "pyout", |
|
1142 | 1142 | "prompt_number": 110, |
|
1143 | 1143 | "text": [ |
|
1144 | 1144 | "array([[ 1., 2.],\n", |
|
1145 | 1145 | " [ 3., 4.]])" |
|
1146 | 1146 | ] |
|
1147 | 1147 | } |
|
1148 | 1148 | ], |
|
1149 | 1149 | "prompt_number": 110 |
|
1150 | 1150 | }, |
|
1151 | 1151 | { |
|
1152 | 1152 | "cell_type": "code", |
|
1153 | 1153 | "collapsed": false, |
|
1154 | 1154 | "input": [ |
|
1155 | 1155 | "a = [1, 2, 3]\n", |
|
1156 | 1156 | "\n", |
|
1157 | 1157 | "%octave_push a\n", |
|
1158 | 1158 | "%octave a = a * 2;\n", |
|
1159 | 1159 | "%octave_pull a\n", |
|
1160 | 1160 | "a" |
|
1161 | 1161 | ], |
|
1162 | 1162 | "language": "python", |
|
1163 | 1163 | "metadata": {}, |
|
1164 | 1164 | "outputs": [ |
|
1165 | 1165 | { |
|
1166 | 1166 | "output_type": "pyout", |
|
1167 | 1167 | "prompt_number": 111, |
|
1168 | 1168 | "text": [ |
|
1169 | 1169 | "array([[2, 4, 6]])" |
|
1170 | 1170 | ] |
|
1171 | 1171 | } |
|
1172 | 1172 | ], |
|
1173 | 1173 | "prompt_number": 111 |
|
1174 | 1174 | }, |
|
1175 | 1175 | { |
|
1176 | 1176 | "cell_type": "markdown", |
|
1177 | 1177 | "metadata": {}, |
|
1178 | 1178 | "source": [ |
|
1179 | 1179 | "When using the cell magic, `%%octave` (note the double `%`), multiple lines of Octave can be executed together. Unlike\n", |
|
1180 | 1180 | "with the single cell magic, no value is returned, so we use the `-i` and `-o` flags to specify input and output variables." |
|
1181 | 1181 | ] |
|
1182 | 1182 | }, |
|
1183 | 1183 | { |
|
1184 | 1184 | "cell_type": "code", |
|
1185 | 1185 | "collapsed": false, |
|
1186 | 1186 | "input": [ |
|
1187 | 1187 | "%%octave -i x -o y\n", |
|
1188 | 1188 | "y = x + 3;" |
|
1189 | 1189 | ], |
|
1190 | 1190 | "language": "python", |
|
1191 | 1191 | "metadata": {}, |
|
1192 | 1192 | "outputs": [], |
|
1193 | 1193 | "prompt_number": 116 |
|
1194 | 1194 | }, |
|
1195 | 1195 | { |
|
1196 | 1196 | "cell_type": "code", |
|
1197 | 1197 | "collapsed": false, |
|
1198 | 1198 | "input": [ |
|
1199 | 1199 | "y" |
|
1200 | 1200 | ], |
|
1201 | 1201 | "language": "python", |
|
1202 | 1202 | "metadata": {}, |
|
1203 | 1203 | "outputs": [ |
|
1204 | 1204 | { |
|
1205 | 1205 | "output_type": "pyout", |
|
1206 | 1206 | "prompt_number": 117, |
|
1207 | 1207 | "text": [ |
|
1208 | 1208 | "array([[ 4., 5.],\n", |
|
1209 | 1209 | " [ 6., 7.]])" |
|
1210 | 1210 | ] |
|
1211 | 1211 | } |
|
1212 | 1212 | ], |
|
1213 | 1213 | "prompt_number": 117 |
|
1214 | 1214 | }, |
|
1215 | 1215 | { |
|
1216 | 1216 | "cell_type": "heading", |
|
1217 | 1217 | "level": 2, |
|
1218 | 1218 | "metadata": {}, |
|
1219 | 1219 | "source": [ |
|
1220 | 1220 | "Plotting" |
|
1221 | 1221 | ] |
|
1222 | 1222 | }, |
|
1223 | 1223 | { |
|
1224 | 1224 | "cell_type": "markdown", |
|
1225 | 1225 | "metadata": {}, |
|
1226 | 1226 | "source": [ |
|
1227 | 1227 | "Plot output is automatically captured and displayed, and using the `-f` flag you may choose its format (currently, `png` and `svg` are supported)." |
|
1228 | 1228 | ] |
|
1229 | 1229 | }, |
|
1230 | 1230 | { |
|
1231 | 1231 | "cell_type": "code", |
|
1232 | 1232 | "collapsed": false, |
|
1233 | 1233 | "input": [ |
|
1234 | 1234 | "%%octave -f svg\n", |
|
1235 | 1235 | "\n", |
|
1236 | 1236 | "p = [12 -2.5 -8 -0.1 8];\n", |
|
1237 | 1237 | "x = 0:0.01:1;\n", |
|
1238 | 1238 | "\n", |
|
1239 | 1239 | "polyout(p, 'x')\n", |
|
1240 | 1240 | "plot(x, polyval(p, x));" |
|
1241 | 1241 | ], |
|
1242 | 1242 | "language": "python", |
|
1243 | 1243 | "metadata": {}, |
|
1244 | 1244 | "outputs": [ |
|
1245 | 1245 | { |
|
1246 | 1246 | "output_type": "display_data", |
|
1247 | 1247 | "text": [ |
|
1248 | 1248 | "12*x^4 - 2.5*x^3 - 8*x^2 - 0.1*x^1 + 8" |
|
1249 | 1249 | ] |
|
1250 | 1250 | }, |
|
1251 | 1251 | { |
|
1252 | 1252 | "output_type": "display_data", |
|
1253 | 1253 | "svg": [ |
|
1254 | 1254 | "<svg height=\"240px\" viewBox=\"0 0 400 240\" width=\"400px\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", |
|
1255 | 1255 | "\n", |
|
1256 | 1256 | "<desc>Produced by GNUPLOT 4.4 patchlevel 3 </desc>\n", |
|
1257 | 1257 | "\n", |
|
1258 | 1258 | "<defs>\n", |
|
1259 | 1259 | "\n", |
|
1260 | 1260 | "\t<circle id=\"gpDot\" r=\"0.5\" stroke-width=\"0.5\"/>\n", |
|
1261 | 1261 | "\t<path d=\"M-1,0 h2 M0,-1 v2\" id=\"gpPt0\" stroke=\"currentColor\" stroke-width=\"0.222\"/>\n", |
|
1262 | 1262 | "\t<path d=\"M-1,-1 L1,1 M1,-1 L-1,1\" id=\"gpPt1\" stroke=\"currentColor\" stroke-width=\"0.222\"/>\n", |
|
1263 | 1263 | "\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.222\"/>\n", |
|
1264 | 1264 | "\t<rect height=\"2\" id=\"gpPt3\" stroke=\"currentColor\" stroke-width=\"0.222\" width=\"2\" x=\"-1\" y=\"-1\"/>\n", |
|
1265 | 1265 | "\t<rect fill=\"currentColor\" height=\"2\" id=\"gpPt4\" stroke=\"currentColor\" stroke-width=\"0.222\" width=\"2\" x=\"-1\" y=\"-1\"/>\n", |
|
1266 | 1266 | "\t<circle cx=\"0\" cy=\"0\" id=\"gpPt5\" r=\"1\" stroke=\"currentColor\" stroke-width=\"0.222\"/>\n", |
|
1267 | 1267 | "\t<use fill=\"currentColor\" id=\"gpPt6\" stroke=\"none\" xlink:href=\"#gpPt5\"/>\n", |
|
1268 | 1268 | "\t<path d=\"M0,-1.33 L-1.33,0.67 L1.33,0.67 z\" id=\"gpPt7\" stroke=\"currentColor\" stroke-width=\"0.222\"/>\n", |
|
1269 | 1269 | "\t<use fill=\"currentColor\" id=\"gpPt8\" stroke=\"none\" xlink:href=\"#gpPt7\"/>\n", |
|
1270 | 1270 | "\t<use id=\"gpPt9\" stroke=\"currentColor\" transform=\"rotate(180)\" xlink:href=\"#gpPt7\"/>\n", |
|
1271 | 1271 | "\t<use fill=\"currentColor\" id=\"gpPt10\" stroke=\"none\" xlink:href=\"#gpPt9\"/>\n", |
|
1272 | 1272 | "\t<use id=\"gpPt11\" stroke=\"currentColor\" transform=\"rotate(45)\" xlink:href=\"#gpPt3\"/>\n", |
|
1273 | 1273 | "\t<use fill=\"currentColor\" id=\"gpPt12\" stroke=\"none\" xlink:href=\"#gpPt11\"/>\n", |
|
1274 | 1274 | "</defs>\n", |
|
1275 | 1275 | "<g style=\"fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter\">\n", |
|
1276 | 1276 | "</g>\n", |
|
1277 | 1277 | "<g style=\"fill:none; color:white; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">\n", |
|
1278 | 1278 | "</g>\n", |
|
1279 | 1279 | "<g style=\"fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">\n", |
|
1280 | 1280 | "\t<path d=\"M52.0,213.6 L64.5,213.6 M361.9,213.6 L349.4,213.6 \"/>\n", |
|
1281 | 1281 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:end\" transform=\"translate(43.7,218.1)\">\n", |
|
1282 | 1282 | "\t\t<text><tspan>6</tspan>\n", |
|
1283 | 1283 | "\t\t</text>\n", |
|
1284 | 1284 | "\t</g>\n", |
|
1285 | 1285 | "\t<path d=\"M52.0,185.7 L64.5,185.7 M361.9,185.7 L349.4,185.7 \"/>\n", |
|
1286 | 1286 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:end\" transform=\"translate(43.7,190.2)\">\n", |
|
1287 | 1287 | "\t\t<text><tspan>6.5</tspan>\n", |
|
1288 | 1288 | "\t\t</text>\n", |
|
1289 | 1289 | "\t</g>\n", |
|
1290 | 1290 | "\t<path d=\"M52.0,157.7 L64.5,157.7 M361.9,157.7 L349.4,157.7 \"/>\n", |
|
1291 | 1291 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:end\" transform=\"translate(43.7,162.2)\">\n", |
|
1292 | 1292 | "\t\t<text><tspan>7</tspan>\n", |
|
1293 | 1293 | "\t\t</text>\n", |
|
1294 | 1294 | "\t</g>\n", |
|
1295 | 1295 | "\t<path d=\"M52.0,129.8 L64.5,129.8 M361.9,129.8 L349.4,129.8 \"/>\n", |
|
1296 | 1296 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:end\" transform=\"translate(43.7,134.3)\">\n", |
|
1297 | 1297 | "\t\t<text><tspan>7.5</tspan>\n", |
|
1298 | 1298 | "\t\t</text>\n", |
|
1299 | 1299 | "\t</g>\n", |
|
1300 | 1300 | "\t<path d=\"M52.0,101.9 L64.5,101.9 M361.9,101.9 L349.4,101.9 \"/>\n", |
|
1301 | 1301 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:end\" transform=\"translate(43.7,106.4)\">\n", |
|
1302 | 1302 | "\t\t<text><tspan>8</tspan>\n", |
|
1303 | 1303 | "\t\t</text>\n", |
|
1304 | 1304 | "\t</g>\n", |
|
1305 | 1305 | "\t<path d=\"M52.0,74.0 L64.5,74.0 M361.9,74.0 L349.4,74.0 \"/>\n", |
|
1306 | 1306 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:end\" transform=\"translate(43.7,78.5)\">\n", |
|
1307 | 1307 | "\t\t<text><tspan>8.5</tspan>\n", |
|
1308 | 1308 | "\t\t</text>\n", |
|
1309 | 1309 | "\t</g>\n", |
|
1310 | 1310 | "\t<path d=\"M52.0,46.0 L64.5,46.0 M361.9,46.0 L349.4,46.0 \"/>\n", |
|
1311 | 1311 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:end\" transform=\"translate(43.7,50.5)\">\n", |
|
1312 | 1312 | "\t\t<text><tspan>9</tspan>\n", |
|
1313 | 1313 | "\t\t</text>\n", |
|
1314 | 1314 | "\t</g>\n", |
|
1315 | 1315 | "\t<path d=\"M52.0,18.1 L64.5,18.1 M361.9,18.1 L349.4,18.1 \"/>\n", |
|
1316 | 1316 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:end\" transform=\"translate(43.7,22.6)\">\n", |
|
1317 | 1317 | "\t\t<text><tspan>9.5</tspan>\n", |
|
1318 | 1318 | "\t\t</text>\n", |
|
1319 | 1319 | "\t</g>\n", |
|
1320 | 1320 | "\t<path d=\"M52.0,213.6 L52.0,201.1 M52.0,18.1 L52.0,30.6 \"/>\n", |
|
1321 | 1321 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:middle\" transform=\"translate(52.0,236.1)\">\n", |
|
1322 | 1322 | "\t\t<text><tspan>0</tspan>\n", |
|
1323 | 1323 | "\t\t</text>\n", |
|
1324 | 1324 | "\t</g>\n", |
|
1325 | 1325 | "\t<path d=\"M114.0,213.6 L114.0,201.1 M114.0,18.1 L114.0,30.6 \"/>\n", |
|
1326 | 1326 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:middle\" transform=\"translate(114.0,236.1)\">\n", |
|
1327 | 1327 | "\t\t<text><tspan>0.2</tspan>\n", |
|
1328 | 1328 | "\t\t</text>\n", |
|
1329 | 1329 | "\t</g>\n", |
|
1330 | 1330 | "\t<path d=\"M176.0,213.6 L176.0,201.1 M176.0,18.1 L176.0,30.6 \"/>\n", |
|
1331 | 1331 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:middle\" transform=\"translate(176.0,236.1)\">\n", |
|
1332 | 1332 | "\t\t<text><tspan>0.4</tspan>\n", |
|
1333 | 1333 | "\t\t</text>\n", |
|
1334 | 1334 | "\t</g>\n", |
|
1335 | 1335 | "\t<path d=\"M237.9,213.6 L237.9,201.1 M237.9,18.1 L237.9,30.6 \"/>\n", |
|
1336 | 1336 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:middle\" transform=\"translate(237.9,236.1)\">\n", |
|
1337 | 1337 | "\t\t<text><tspan>0.6</tspan>\n", |
|
1338 | 1338 | "\t\t</text>\n", |
|
1339 | 1339 | "\t</g>\n", |
|
1340 | 1340 | "\t<path d=\"M299.9,213.6 L299.9,201.1 M299.9,18.1 L299.9,30.6 \"/>\n", |
|
1341 | 1341 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:middle\" transform=\"translate(299.9,236.1)\">\n", |
|
1342 | 1342 | "\t\t<text><tspan>0.8</tspan>\n", |
|
1343 | 1343 | "\t\t</text>\n", |
|
1344 | 1344 | "\t</g>\n", |
|
1345 | 1345 | "\t<path d=\"M361.9,213.6 L361.9,201.1 M361.9,18.1 L361.9,30.6 \"/>\n", |
|
1346 | 1346 | "\t<g style=\"stroke:none; fill:rgb(0,0,0); font-family:Arial; font-size:12.00pt; text-anchor:middle\" transform=\"translate(361.9,236.1)\">\n", |
|
1347 | 1347 | "\t\t<text><tspan>1</tspan>\n", |
|
1348 | 1348 | "\t\t</text>\n", |
|
1349 | 1349 | "\t</g>\n", |
|
1350 | 1350 | "\t<path d=\"M52.0,18.1 L52.0,213.6 L361.9,213.6 L361.9,18.1 L52.0,18.1 Z \"/>\n", |
|
1351 | 1351 | "</g>\n", |
|
1352 | 1352 | "\t<a xlink:title=\"Plot #1\">\n", |
|
1353 | 1353 | "<g style=\"fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">\n", |
|
1354 | 1354 | "\t<path d=\"M52.0,101.9 L55.1,102.0 L58.2,102.2 L61.3,102.5 L64.4,102.8 L67.5,103.3 L70.6,103.9 L73.7,104.5 L76.8,105.2 L79.9,106.1 L83.0,107.0 L86.1,108.0 L89.2,109.1 L92.3,110.3 L95.4,111.6 L98.5,112.9 L101.6,114.4 L104.7,115.9 L107.8,117.5 L110.9,119.2 L114.0,120.9 L117.1,122.8 L120.2,124.7 L123.3,126.6 L126.4,128.7 L129.5,130.8 L132.6,132.9 L135.7,135.2 L138.8,137.4 L141.9,139.8 L145.0,142.1 L148.1,144.5 L151.2,147.0 L154.3,149.5 L157.4,152.0 L160.5,154.5 L163.6,157.1 L166.7,159.6 L169.8,162.2 L172.9,164.8 L176.0,167.4 L179.1,170.0 L182.2,172.5 L185.3,175.1 L188.4,177.6 L191.5,180.1 L194.6,182.6 L197.7,185.0 L200.8,187.4 L203.9,189.7 L207.0,192.0 L210.0,194.1 L213.1,196.2 L216.2,198.3 L219.3,200.2 L222.4,202.0 L225.5,203.8 L228.6,205.4 L231.7,206.8 L234.8,208.2 L237.9,209.4 L241.0,210.5 L244.1,211.4 L247.2,212.1 L250.3,212.6 L253.4,213.0 L256.5,213.2 L259.6,213.2 L262.7,212.9 L265.8,212.4 L268.9,211.7 L272.0,210.8 L275.1,209.5 L278.2,208.1 L281.3,206.3 L284.4,204.3 L287.5,201.9 L290.6,199.3 L293.7,196.3 L296.8,193.0 L299.9,189.3 L303.0,185.3 L306.1,180.9 L309.2,176.1 L312.3,170.9 L315.4,165.4 L318.5,159.4 L321.6,152.9 L324.7,146.0 L327.8,138.7 L330.9,130.9 L334.0,122.6 L337.1,113.8 L340.2,104.5 L343.3,94.6 L346.4,84.3 L349.5,73.3 L352.6,61.8 L355.7,49.7 L358.8,37.0 L361.9,23.7 \" stroke=\"rgb( 0, 0, 255)\"/>\n", |
|
1355 | 1355 | "</g>\n", |
|
1356 | 1356 | "\t</a>\n", |
|
1357 | 1357 | "<g style=\"fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter\">\n", |
|
1358 | 1358 | "</g>\n", |
|
1359 | 1359 | "</svg>" |
|
1360 | 1360 | ] |
|
1361 | 1361 | } |
|
1362 | 1362 | ], |
|
1363 | 1363 | "prompt_number": 118 |
|
1364 | 1364 | }, |
|
1365 | 1365 | { |
|
1366 | 1366 | "cell_type": "markdown", |
|
1367 | 1367 | "metadata": {}, |
|
1368 | 1368 | "source": [ |
|
1369 | 1369 | "The plot size is adjusted using the `-s` flag:" |
|
1370 | 1370 | ] |
|
1371 | 1371 | }, |
|
1372 | 1372 | { |
|
1373 | 1373 | "cell_type": "code", |
|
1374 | 1374 | "collapsed": false, |
|
1375 | 1375 | "input": [ |
|
1376 | 1376 | "%%octave -s 500,500\n", |
|
1377 | 1377 | "\n", |
|
1378 | 1378 | "# butterworth filter, order 2, cutoff pi/2 radians\n", |
|
1379 | 1379 | "b = [0.292893218813452 0.585786437626905 0.292893218813452];\n", |
|
1380 | 1380 | "a = [1 0 0.171572875253810];\n", |
|
1381 | 1381 | "freqz(b, a, 32);" |
|
1382 | 1382 | ], |
|
1383 | 1383 | "language": "python", |
|
1384 | 1384 | "metadata": {}, |
|
1385 | 1385 | "outputs": [ |
|
1386 | 1386 | { |
|
1387 | 1387 | "output_type": "display_data", |
|
1388 | 1388 | "png": "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\nFaCsDL6+YG8PPJfzQBBeyMN3p7W1VSLekZa1Hb2iZtw4CAqCsLDa6GhoboavvoKICOC8GCVqRs7n\nLFmv2JCH4F5WViYR70jL2o5esXnpdJg/H7Zvh7g40NSEHTsgMhJSUoDFEq1XhK2jV+zgmDuCyAAE\nATduwB9/QEcH6OvD3Lkwbpyk+4S8irQFIhxzRxAZgEL5Z2i+qQny8uD4cejshGnTwMMDZ80jbwCD\nO4LIGFpasGQJAACbDSUlsHs3NDWBvj4sXgxjx0q6c4jUIA9j7vn5+RLxjrSs7eiVNq+CAtjaQmQk\nxMWBlxf8+it89RXEx0NJiWi9wmWkecWGPIy5R0ZG7ty5U/xeucnajl558ra1QU4OkJMM3nsP3NzA\nwEAcXoGRGy+OuQsfOp0uEe9Iy9qOXpnwqqnB4sWweDEAAIsFRUVQUQHt7TB+PPj4/PMerNC9AjPS\nvGJDHoI7giBvREcHlix5MUBfVQVZWVBVBQQB06aBlxcMtiIfItvIw5j7oAu+i4hz586hF72y4jUx\ngaAgiIuDmBjQ0oLvvoOYGNi9G27cgP5+EXoHZaR5xYY83Ll3dHRIxDvSsrajVz68NBq4uoKrKwBA\nRwdcugTffAP9/XDz5hgGA2bOBCUlkfoHIq+fs8SRhweq0vYcA0FkkefP4fJl+OsvaG8HbW2YMwem\nTMHFbYaAtAUiIf/T1dfXr1u3zs7OTkVFhUKh1NTUcNfm5uZSXmXAMw0Wi7VixQotLS0Gg+Hl5VVZ\nWSnc7iEI8jZUVcHNDb78EuLiIDAQbt+GrVshJgYOHYI7dyTdOWToCHlYpqqqKj09ffr06XZ2dgUF\nBW88JiEhwfDlqqbKXK/W9fb2enh4sFis+Ph4BoMRGxvr7OxcVlamq6sr3E4iCMIbfX0IDHyx/ewZ\n/Pe/kJEBfX1ApcKMGTBrFqioSLR/CD8IN/cHm80mNxITEwGgurqauzYnJwcAbt68+cZzU1NTASA/\nP58sPnr0iEqlbtiwYVCpra3tsDotKHKTtR296OXT295O5OQQ27YRGzcSGzcSP/9MPHkiDq8oELpX\n2jIxiWrM/dtvvw0NDa2urjY2NubszM3NdXd3v3nzpomJCTluw32Kn5/flStX6urqOHvmzZt39+7d\nQSfDSNtQF4KMBNrb4dIluHwZWlpAWRlsbMDeHoyMJN0tySFtgUgCs2UcHBxaW1vpdLqnp+euXbtM\n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\n3r33339fXV3dxsampKREQ0PD2NgYAFpaWkpLS52cnMjDioqKrK2tyUuoqalpaWmxsbEhqzIzMxcs\nWEBuD2ghIyNDWVl5OC0I1oeKigrSK5Sr4L8FgiBIr9A/Sd4t1NTUkF6hf5K8WygsLFRWVhb1v+br\nLWRnZysrK4vzG0W2kJ2d3dnZKc5vFNlCdnZ2ZWWlOL9RZAvZ2dnnzp0bUgslJSUPHz58PcKQ25Ja\nmP6tEIJy+fLlt7XT1dXl6emprq7+999/c+8fP368p6cn956IiAgKhdLR0TFoLYIgCMI/gt+5W1hY\nFBcXv76/p6fnww8/vHjx4h9//DFlypQBp1y9epV7T3l5uYmJiYqKyqC1CIIgCP8IPuaupqbmwAW5\ns6+vb9myZXl5eVlZWXZ2dgNO8fX1raurKyoqIot1dXV5eXmcn0W8axEEQRD+EfJ67p988smBAweC\ngoLc3d05O83MzMhBrt7eXltb26dPn27fvl1VVTU2NrahoaG0tFRPT2/QWgRBEGQICHeUZ8BcRpLg\n4GDOAY8fPw4ICNDQ0KDT6R4eHhUVFdyn865FEARB+EQeMjEhCIIgA8BVIREEQeQQDO4IgiByCAZ3\nBEEQOQSDO4IgiByCwR1BEEQOweCOIAgih8hwcBdDTj7+FfX19evWrbOzs1NRUaFQKDU1NeLxDprX\nUETeixcv+vj4jB07lkaj6enp+fr6Dlg6QkRebvz8/CgUyscffywGb25uLuVVhrNK1FCv9+zZs46O\njgwGQ11d3c7OjvMWt+i8CxcupLzGjBkzRO0FgKKiIldX13feeWf06NHTp08/fvy4YNKheouLi52c\nnOh0uqam5rJlyzhZKGQYSU+0F5Cenh5ra2s9Pb0DBw6kp6dbWVnp6Og8fvxYUori4mIdHR1vb28y\n2Uh1dbV4vE5OTjY2Nlu3bk1NTY2MjKTT6e+9996zZ89E7T169OiHH364c+fO1NTUuLg4ExMTKpU6\nYJ04UXg5ZGZmamlpUanUjz76SADpUL05OTkAkJCQkPGS06dPi8FLEMS+ffsAwN3dPTExMTk5OTg4\n+MSJE6L2Xrp0KYOLuLg4AIiKihK19+rVq1Qqddq0aWlpaSdPniRXC09LSxO196+//lJSUpoxY8ax\nY8d+/PFHQ0NDMzOztrY2AbzSg6wG99TUVADIz88ni48ePaJSqRs2bJCUgs1mkxuJiYnDDO5D8t6+\n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\nY2RHRMr/A5YdmP24XbLsAAAAAElFTkSuQmCC\n" |
|
1389 | 1389 | } |
|
1390 | 1390 | ], |
|
1391 | 1391 | "prompt_number": 119 |
|
1392 | 1392 | }, |
|
1393 | 1393 | { |
|
1394 | 1394 | "cell_type": "code", |
|
1395 | 1395 | "collapsed": false, |
|
1396 | 1396 | "input": [ |
|
1397 | 1397 | "%%octave -s 600,200 -f png\n", |
|
1398 | 1398 | "\n", |
|
1399 | 1399 | "subplot(121);\n", |
|
1400 | 1400 | "[x, y] = meshgrid(0:0.1:3);\n", |
|
1401 | 1401 | "r = sin(x - 0.5).^2 + cos(y - 0.5).^2;\n", |
|
1402 | 1402 | "surf(x, y, r);\n", |
|
1403 | 1403 | "\n", |
|
1404 | 1404 | "subplot(122);\n", |
|
1405 | 1405 | "sombrero()" |
|
1406 | 1406 | ], |
|
1407 | 1407 | "language": "python", |
|
1408 | 1408 | "metadata": {}, |
|
1409 | 1409 | "outputs": [ |
|
1410 | 1410 | { |
|
1411 | 1411 | "output_type": "display_data", |
|
1412 | 1412 | "png": "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\nFhMTs2bNmrCwsIiIiA0bzCthiQAAEHhJREFUNtTI10Z1R5jaCNLWKKjuP4gavvI3b94cNGhQYGDg\nj08zWz7+9ebNmwcOHPjBDajAkydPvLy8pk+fXkHmPjExcdu2bWFhYatWrQoPD9fguqIaWkK/Or8N\nYa1QxRBWoPIcQigUxsXFBQYGfnMULJVKk5KSJkyYoGKnlEql4eHh5etU2xBKJBI/P7/yM7DHjx+r\n7iauOm/evFmwYMGECRPkLrUBAQE+Pj7qrfBUprrMzLUUpFUjqO4/hXpBYzKZ7ObNm0FBQX/99ZcG\n1c6qJCIi4psi7IWFhT9mXbRKcnNzw8LCvL29g4OD58yZM2fOnGHDhml8MFol/4Vlj99eoz+a7t27\nm5mZ3bp1a9q0aUlJSampqQKB4N27d2vWrLl165ajo2PXrl0XLlxYPiHfhw8fVqxYUa9ePQqF0rZt\n29DQUCMjI1WuRaFQ/P395a9Jkrx7926NmvrmzZuTJ0/OmjULAJVK3bhxY/lPbWxsFOkeCwsL5Qsp\ntUEikcTHx9+6dSszM7O4uNjc3DwgIKCWdVbg9u3bAFq2bFnhuiNGjLhy5UpsbGznzp2/2Uga7f/f\nNefPn//06dP48eM1285/GXp6egUFBeWP5OfnEwShPLUnQRBdu3bt2rXrmzdvfHx86HR6eHi4np6e\nplq1dOnSOXPmMBgMANOmTftm+ZcvX757927YsGGaaoDq3L9/Pz4+vrCw8P3795aWljNmzPiR6R7l\nj6ykpKQfdsUfz78nMe8/wvr16/39/d+9e9ewYUPVzzIxMTEyMsrIyOjQoQOfz7927Vr5GlJTUw8d\nOsTj8QwNDbOzsyUSiaGhobGxceV4xBohlUqPHj368uVL5Yl579279/XrVzc3txpVvmrVqvj4+LCw\nsFatWtW0YRkZGbGxsRcuXDAxMRk4cKCFhcX69evLDxGU/LbynLHljxgYGFQX+FFdZmZvb+9du3b5\n+PiUr6pJkyatW7cGcOnSJRcXl/37948aNQpA3759jY2NbW1teTze/fv3d+7caWhoeP/+/RqFE/zX\nGDJkSFJSUkZGhuKIi4vLy5cvX79+rXolmZmZe/fuLS0t9fPzMzY2VqMZBQUFt2/fdnV1lb/Ny8tT\nhE/UlOzsbB6PVyH/s2bJz8+/fPnyqVOnhELhiBEjevXqVV1C4Ozs7MDAwPPnzyvSLKudhro6TExM\nWrRocfnyZc1W+xPxT09Jf21UWRqtUphj/vz5yms4fvy4lZWVv7+/BuUZyf8tjYpEooMHDyp2JRMS\nEhSLVDk5OWrvtN+8eTMkJESVhANlZWXR0dFdunSZPn36vn37ymu6Kk9jVgHVdV6UOMJoXJD2NxXY\ns2cPAEUMiTx8IiAgQI2qcnJyxowZM3jw4AobZtWRn5+v6EJFRUWaSgyZmpr6PWSYxGJxXFzcwIED\nvby8Nm7cqCTJkYLvkdhPs1pCvwS/DaE6KA+RqVFSC+WmNCsra/Xq1cHBwRV8XtRGsUdYPlnS3bt3\nNWhu9+3b5+bmtn///sr7nTdv3hwxYkRISIg8sKlK13D1YjSVN0ltR5jfaARNBY1VVjzR0dGpXEwm\nk7148WLLli0hISE+Pj7fNfWERCIJDQ2tpVPlhw8fxo0bFxoaumrVqri4uBrdjN8jsZ9GtIR+LX7v\nEaqDVCotv1Xg6+sLwNXVVT50kslkUqlUJpPJP62NMIehoeHMmTOLioq8vb319PQCAgIqyKDUtNmK\n1/J8hwwGQygUXrt2zc7OTu1qKzB27NixY8c+evRo7dq1urq69vb2ly9fzsnJodFoLVq0mDZtmvJ9\nOAqFosZFq9N5QVXCQL/5wdDp9Li4uICAgICAAPny3eHDh1Xc566MQvFEIpEcOXLEw8NjxowZnTt3\nzsvLO3fu3KNHj9LS0pycnCZMmMDlcjX6PaqASqU6Oztv3LhRX1/f29tb9TXboqKiQ4cOZWVlCQQC\nCwuLUaNG9e7dW43OHx0dbWJiIl8+AWBqauro6Hj69Ok1a9bUtCoFtdcS+vX4py3xfx3V/U5LSko2\nbtz4559/XrlyRY0LZWRkLFu2rEqvUU1NNxXI1V6Cg4OHDh3arVu3qKgoNSpRO0azfIEaZWb+zU9O\nlQsA8hgkMzMzDw+PpKSkf8qxs7i4eMuWLWPGjFGeR+z69eurVq0KCQlZuXLl6tWrax8r+bMl9vtF\n+T0j/GXgcDh+fn5isdjb23vHjh3e3t6Ojo7VFebz+fHx8ceOHXNwcBg3bhwAU1PT+fPnV+kpY25u\nLn8RExOzfPnyyMjIRo0aqdHCjx8/xsTE5Ofnp6amduvWbc6cOWw2u0KZT58+hYWFqegL8020tbX9\n/Py6devG4XCSk5PDw8Pt7e1TU1MVs43JkyefOnXKx8cnJyfn+PHj8oMKR5jf/KKUXwCgUCj9+/fv\n37//2rVrV69e7erq6unp+SOdKuVwudzJkycPGjQoMjLy+vXrHh4eir3ngoKCuLi4tLS0jx8/8ni8\nuXPn1qlTR1PXzcvLq9CZ9fT0SJLMz89Xe879X+SftsT/dSrMeyqI9D979qzKs6RSqULDWoGBgUFc\nXNygQYN8fHx27txZ5U77N+MI8/PzIyMj/f39ExISVGm/QCCQT/66deu2evXqt2/fKi+vui+MRmI0\nlTvC/ObXQhXFk5s3b06fPj0oKKg2eZtriUgk2r9/f58+fTw8PNzc3AIDA1Vxe1GPny2x3y/K7xnh\nT0Rlkf6ePXs+evSoslQ8hUKR7+r169ePIIiPHz82btxYS0ursLBw69atqkjLV4euru7o0aM9PDz2\n7Nnj7e29bNmy/v37Vy52//79ixcvnj17dtSoUfb29sHBwYsXL1alfnt7+y9fvgBYv3698sQdalA5\n4OnJkyeavcRv/kG+uQAAQB56eODAAV9f3+bNm0+bNk1bW/uHtVC+KHL48GEHB4cZM2aYm5tXORTT\nIOrFaP6mAr8N4U/EoUOHHj58ePXqVflsyd7evnHjxqtXr1ay771q1SobG5sdO3a8evVKIBA4Ojpq\n5Aag0+k+Pj7e3t7nz58PCAhwcHBwc3MrLCw8cODAlStXOnXq1LhxYx8fn/nz59e0ZvV8YVRHIpFU\n6TLzm18LqVRaXFyseCvv1R07duzYsaP8iHxRoUePHhEREWFhYRVOHz169OjRo9+9excREZGdnT1j\nxozGjRt/p6YKhcKLFy9u3LixXbt2FhYWvXv39vHxUVK+RsGv38Ta2rpCqPuTJ08sLCy+a4zjv4/f\nhvCfgSTJEydOAHj48CGA2NjYunXr7tmzRw0HMD6f7+3tTRDErl27goODDQ0Np0yZohFzSKFQXF1d\ni4qKNmzY4OfnN3v27B49eowdO/ZHDrGV81vn5d9KUlJSee9isirdj28qnjRq1CgoKOj69evbt2/X\n0tL6448/TE1NNdXCuLi4M2fO1KlTx8DAwM7Obu/evSYmJqqfrqlsfz9dYr9fk9+G8J+hygAMDofT\npUuX8sVsbGwuXLggEAjKK66Vp2vXroWFhWw229nZefXq1RMnTkxPT1+wYEF8fHxkZGTbtm3Va15K\nSsqdO3dycnK4XK6Ojs6WLVuaNGmiXlU1pcohgpGRkfyXqaDz4ubmVkHnpUGDBtOnT/8xTf3N98Pa\n2vrmzZvfLKbKAkCPHj169OhRVFS0Z8+e7du3BwcHe3h4qNeqjIyMK1eufPjwgclkamtry/cF1Kuq\nT58+CoXC2uDp6RkeHj5q1KjQ0FAOh7Ns2TIdHZ2ZM2fWvub/Fv/wHuVvylGjfW/lCvGxsbFOTk6d\nOnWqkJtCibNMcXGx3O1lzpw548aNU2R+UdF/h6wq3tnAwKC6wtX5wihPY/Zb5+W/TO0VT9LS0oYN\nG2Zra7tnzx4VTxEKhTdu3JDfFxMmTDh79qzql6sSjWT7K89PldjvF+W3IfyJqI0DmMJhsrzdcnBw\ncHFxMTMzO3r0qLxYZUN47dq14cOH29vbt2zZMikpqUJgU40EnFQXPCPVcgr9zX8cNRRPMjMzp06d\namdnJ19Tkfe30tJSHx8fIyOj6dOnVzfOe/bs2aRJk3r06NGqVatjx45pMP3FfzDb38/Pb0P4E9Gs\nWTNnZ+fyR+SxsSpm4DMzM3NwcKhstxISEiZPntyuXbtdu3bJDeGHDx/8/f07duzYokULf39/JWl1\nayTgpKLgmZzfhvA3NUWNBQAl4Tr5+fmzZs1isVhcLnfHjh1Hjx61sbHhcrndunUzMTEZPXr0dxJh\n+A9m+/v5+W0IfyIGDx5sampa/ki/fv0aN26s4unGxsZWVlbV2a3CwsIxY8YwGAxLS0snJ6dNmzap\noj0xZMgQExMTFZtUozWf34bwNz8A5dK18nGep6envr5+/fr17e3tqVSqr6+vpq4ukUjyy1Flmf9C\ntr+fn+/ry/6bGjFgwICPHz/Kbwz8zwGsuuxLEomk/Fu5w6RMJqvS7xSAtrb2/v37s7Kynj9/fvHi\nRV9f3+occMrz9OnTCoFQNjY2/6+9uwdpHYoCON4H1aVVUBBdhM6KLg6idFUKcSoUiiKIi6CbAScH\nN0dxEXRQERWUbH6AgqMI6qIgLlbEJSj4MQqt9A2XF0LSxuQl1pj7/21NcqkIh5Pej3Pu7+8/Pj6q\nDUmn04lEIplMZrPZQqFguVsulzVN0zTN2AujaZpoEwgEzvm4jijUubm5qev63d3d6enp4ODg0dFR\nUN9+cXHRZFLxGRm6/YUfiTBERkZGurq6hoeH19bWdnd3FUUxbwA7Pj6Ox+Pb29vi49DQ0Pj4+OLi\n4urq6tTUVDabbW9vL5VKznnLHo3Pz8+jo6PNzc3JZDKTydze3prvvr6+WoYYBZzsf78477yysrK/\nvz8zM3NyctLf36/ruvkZsV02l8uJl/HJyclcLjc/P+/xXwUEwHjPq6+vTyQSsVgslUoVCoXe3l5R\nwu3h4cEyxDleLMTeV0O1xzj8+uM4PhEizkX63TS16O7urpa3KhYedF/Lxg03553j8XiZXtAIB3uh\nTtGhpbGxsa+vz175yGu8NDQ0pNNpy0UOv4YQiTBcWltbt7a2Kt7KZDLmFKKqqqqqPr/uy1o2fgo4\nMeeDWqpYjMYrUYB+Y2NjZ2fHngj/o/aTHYdfQ4ip0UjxmreqNTMzHujs7Ly5uTEP8VTAiTkf1Iyb\nBTkLe7y8v7/7iRc3BgYGrq+v5+bmJiYm9vb2xsbGzs/PI97tL/RIhJHiNW99uRfG//6dAFv+Ag5c\nLshZhgQbL26oqnp5efn29lYsFh8fH5eXl9va2twPx3cgEUaKp7wVc7EXxv/+HeZ8UBtiQc7gZkjg\n8YJfijXCSAm88KD//TvM+eAHlauXrv38/FQUpaOjI5/Pz87OtrS0UKhTXj93hBHfwlPhQZ+1bICQ\ncyhde3Z2Zr5oiZeKB/CJl6jiF2HUOOw7taOZGaLN4biOpcGFm9lU4iWqWCOUmtc1EiAyarCmiN/i\nT7XXJcigWCz29PS8vLwYa4q6rl9dXVU8fQ9EXvnfmuLBwcH6+vrS0pK5HSbxElUkQtk9PT1NT08f\nHh6KvTALCwuicjcgoVKpVFdXZ7moKIrofRgjXiKKRAgAkBprhAAAqZEIAQBSIxECAKRGIgQASI1E\nCACQGokQACA1EiEAQGokQgCA1P4CasZOMJR81Q8AAAAASUVORK5CYII=\n" |
|
1413 | 1413 | } |
|
1414 | 1414 | ], |
|
1415 | 1415 | "prompt_number": 120 |
|
1416 | 1416 | } |
|
1417 | 1417 | ], |
|
1418 | 1418 | "metadata": {} |
|
1419 | 1419 | } |
|
1420 | 1420 | ] |
|
1421 | 1421 | } No newline at end of file |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
|
1 | NO CONTENT: modified file | |
The requested commit or file is too big and content was truncated. Show full diff |
General Comments 0
You need to be logged in to leave comments.
Login now