##// END OF EJS Templates
Merge pull request #1331 from ellisonbg/celltypes...
Brian E. Granger -
r6037:069f64e8 merge
parent child Browse files
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -0,0 +1,74 b''
1 """The main API for the v2 notebook format.
2
3 Authors:
4
5 * Brian Granger
6 """
7
8 #-----------------------------------------------------------------------------
9 # Copyright (C) 2008-2011 The IPython Development Team
10 #
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
14
15 #-----------------------------------------------------------------------------
16 # Imports
17 #-----------------------------------------------------------------------------
18
19 from .nbbase import (
20 NotebookNode,
21 new_code_cell, new_text_cell, new_notebook, new_output, new_worksheet,
22 new_metadata, new_author, new_heading_cell
23 )
24
25 from .nbjson import reads as reads_json, writes as writes_json
26 from .nbjson import reads as read_json, writes as write_json
27 from .nbjson import to_notebook as to_notebook_json
28
29 from .nbpy import reads as reads_py, writes as writes_py
30 from .nbpy import reads as read_py, writes as write_py
31 from .nbpy import to_notebook as to_notebook_py
32
33 from .convert import convert_to_this_nbformat
34
35 #-----------------------------------------------------------------------------
36 # Code
37 #-----------------------------------------------------------------------------
38
39 def parse_filename(fname):
40 """Parse a notebook filename.
41
42 This function takes a notebook filename and returns the notebook
43 format (json/py) and the notebook name. This logic can be
44 summarized as follows:
45
46 * notebook.ipynb -> (notebook.ipynb, notebook, json)
47 * notebook.json -> (notebook.json, notebook, json)
48 * notebook.py -> (notebook.py, notebook, py)
49 * notebook -> (notebook.ipynb, notebook, json)
50
51 Parameters
52 ----------
53 fname : unicode
54 The notebook filename. The filename can use a specific filename
55 extention (.ipynb, .json, .py) or none, in which case .ipynb will
56 be assumed.
57
58 Returns
59 -------
60 (fname, name, format) : (unicode, unicode, unicode)
61 The filename, notebook name and format.
62 """
63 if fname.endswith(u'.ipynb'):
64 format = u'json'
65 elif fname.endswith(u'.json'):
66 format = u'json'
67 elif fname.endswith(u'.py'):
68 format = u'py'
69 else:
70 fname = fname + u'.ipynb'
71 format = u'json'
72 name = fname.split('.')[0]
73 return fname, name, format
74
@@ -0,0 +1,48 b''
1 """Code for converting notebooks to and from the v2 format.
2
3 Authors:
4
5 * Brian Granger
6 """
7
8 #-----------------------------------------------------------------------------
9 # Copyright (C) 2008-2011 The IPython Development Team
10 #
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
14
15 #-----------------------------------------------------------------------------
16 # Imports
17 #-----------------------------------------------------------------------------
18
19 from .nbbase import (
20 new_code_cell, new_text_cell, new_worksheet, new_notebook, new_output
21 )
22
23 from IPython.nbformat import v2
24
25 #-----------------------------------------------------------------------------
26 # Code
27 #-----------------------------------------------------------------------------
28
29 def convert_to_this_nbformat(nb, orig_version=2):
30 """Convert a notebook to the v2 format.
31
32 Parameters
33 ----------
34 nb : NotebookNode
35 The Python representation of the notebook to convert.
36 orig_version : int
37 The original version of the notebook to convert.
38 """
39 if orig_version == 1:
40 nb = v2.convert_to_this_nbformat(nb)
41 orig_version = 2
42 if orig_version == 2:
43 return nb
44 elif orig_version == 3:
45 return nb
46 else:
47 raise ValueError('Cannot convert a notebook from v%s to v3' % orig_version)
48
@@ -0,0 +1,191 b''
1 """The basic dict based notebook format.
2
3 The Python representation of a notebook is a nested structure of
4 dictionary subclasses that support attribute access
5 (IPython.utils.ipstruct.Struct). The functions in this module are merely
6 helpers to build the structs in the right form.
7
8 Authors:
9
10 * Brian Granger
11 """
12
13 #-----------------------------------------------------------------------------
14 # Copyright (C) 2008-2011 The IPython Development Team
15 #
16 # Distributed under the terms of the BSD License. The full license is in
17 # the file COPYING, distributed as part of this software.
18 #-----------------------------------------------------------------------------
19
20 #-----------------------------------------------------------------------------
21 # Imports
22 #-----------------------------------------------------------------------------
23
24 import pprint
25 import uuid
26
27 from IPython.utils.ipstruct import Struct
28
29 #-----------------------------------------------------------------------------
30 # Code
31 #-----------------------------------------------------------------------------
32
33 class NotebookNode(Struct):
34 pass
35
36
37 def from_dict(d):
38 if isinstance(d, dict):
39 newd = NotebookNode()
40 for k,v in d.items():
41 newd[k] = from_dict(v)
42 return newd
43 elif isinstance(d, (tuple, list)):
44 return [from_dict(i) for i in d]
45 else:
46 return d
47
48
49 def new_output(output_type=None, output_text=None, output_png=None,
50 output_html=None, output_svg=None, output_latex=None, output_json=None,
51 output_javascript=None, output_jpeg=None, prompt_number=None,
52 etype=None, evalue=None, traceback=None):
53 """Create a new code cell with input and output"""
54 output = NotebookNode()
55 if output_type is not None:
56 output.output_type = unicode(output_type)
57
58 if output_type != 'pyerr':
59 if output_text is not None:
60 output.text = unicode(output_text)
61 if output_png is not None:
62 output.png = bytes(output_png)
63 if output_jpeg is not None:
64 output.jpeg = bytes(output_jpeg)
65 if output_html is not None:
66 output.html = unicode(output_html)
67 if output_svg is not None:
68 output.svg = unicode(output_svg)
69 if output_latex is not None:
70 output.latex = unicode(output_latex)
71 if output_json is not None:
72 output.json = unicode(output_json)
73 if output_javascript is not None:
74 output.javascript = unicode(output_javascript)
75
76 if output_type == u'pyout':
77 if prompt_number is not None:
78 output.prompt_number = int(prompt_number)
79
80 if output_type == u'pyerr':
81 if etype is not None:
82 output.etype = unicode(etype)
83 if evalue is not None:
84 output.evalue = unicode(evalue)
85 if traceback is not None:
86 output.traceback = [unicode(frame) for frame in list(traceback)]
87
88 return output
89
90
91 def new_code_cell(input=None, prompt_number=None, outputs=None,
92 language=u'python', collapsed=False):
93 """Create a new code cell with input and output"""
94 cell = NotebookNode()
95 cell.cell_type = u'code'
96 if language is not None:
97 cell.language = unicode(language)
98 if input is not None:
99 cell.input = unicode(input)
100 if prompt_number is not None:
101 cell.prompt_number = int(prompt_number)
102 if outputs is None:
103 cell.outputs = []
104 else:
105 cell.outputs = outputs
106 if collapsed is not None:
107 cell.collapsed = bool(collapsed)
108
109 return cell
110
111 def new_text_cell(cell_type, source=None, rendered=None):
112 """Create a new text cell."""
113 cell = NotebookNode()
114 if source is not None:
115 cell.source = unicode(source)
116 if rendered is not None:
117 cell.rendered = unicode(rendered)
118 cell.cell_type = cell_type
119 return cell
120
121
122 def new_heading_cell(source=None, rendered=None, level=1):
123 """Create a new section cell with a given integer level."""
124 cell = NotebookNode()
125 cell.cell_type = u'heading'
126 if source is not None:
127 cell.source = unicode(source)
128 if rendered is not None:
129 cell.rendered = unicode(rendered)
130 cell.level = int(level)
131 return cell
132
133
134 def new_worksheet(name=None, cells=None):
135 """Create a worksheet by name with with a list of cells."""
136 ws = NotebookNode()
137 if name is not None:
138 ws.name = unicode(name)
139 if cells is None:
140 ws.cells = []
141 else:
142 ws.cells = list(cells)
143 return ws
144
145
146 def new_notebook(metadata=None, worksheets=None):
147 """Create a notebook by name, id and a list of worksheets."""
148 nb = NotebookNode()
149 nb.nbformat = 3
150 if worksheets is None:
151 nb.worksheets = []
152 else:
153 nb.worksheets = list(worksheets)
154 if metadata is None:
155 nb.metadata = new_metadata()
156 else:
157 nb.metadata = NotebookNode(metadata)
158 return nb
159
160
161 def new_metadata(name=None, authors=None, license=None, created=None,
162 modified=None, gistid=None):
163 """Create a new metadata node."""
164 metadata = NotebookNode()
165 if name is not None:
166 metadata.name = unicode(name)
167 if authors is not None:
168 metadata.authors = list(authors)
169 if created is not None:
170 metadata.created = unicode(created)
171 if modified is not None:
172 metadata.modified = unicode(modified)
173 if license is not None:
174 metadata.license = unicode(license)
175 if gistid is not None:
176 metadata.gistid = unicode(gistid)
177 return metadata
178
179 def new_author(name=None, email=None, affiliation=None, url=None):
180 """Create a new author."""
181 author = NotebookNode()
182 if name is not None:
183 author.name = unicode(name)
184 if email is not None:
185 author.email = unicode(email)
186 if affiliation is not None:
187 author.affiliation = unicode(affiliation)
188 if url is not None:
189 author.url = unicode(url)
190 return author
191
@@ -0,0 +1,70 b''
1 """Read and write notebooks in JSON format.
2
3 Authors:
4
5 * Brian Granger
6 """
7
8 #-----------------------------------------------------------------------------
9 # Copyright (C) 2008-2011 The IPython Development Team
10 #
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
14
15 #-----------------------------------------------------------------------------
16 # Imports
17 #-----------------------------------------------------------------------------
18
19 import copy
20 import json
21
22 from .nbbase import from_dict
23 from .rwbase import (
24 NotebookReader, NotebookWriter, restore_bytes, rejoin_lines, split_lines
25 )
26
27 #-----------------------------------------------------------------------------
28 # Code
29 #-----------------------------------------------------------------------------
30
31 class BytesEncoder(json.JSONEncoder):
32 """A JSON encoder that accepts b64 (and other *ascii*) bytestrings."""
33 def default(self, obj):
34 if isinstance(obj, bytes):
35 return obj.decode('ascii')
36 return json.JSONEncoder.default(self, obj)
37
38
39 class JSONReader(NotebookReader):
40
41 def reads(self, s, **kwargs):
42 nb = json.loads(s, **kwargs)
43 nb = self.to_notebook(nb, **kwargs)
44 return nb
45
46 def to_notebook(self, d, **kwargs):
47 return restore_bytes(rejoin_lines(from_dict(d)))
48
49
50 class JSONWriter(NotebookWriter):
51
52 def writes(self, nb, **kwargs):
53 kwargs['cls'] = BytesEncoder
54 kwargs['indent'] = 1
55 kwargs['sort_keys'] = True
56 kwargs['separators'] = (',',': ')
57 if kwargs.pop('split_lines', True):
58 nb = split_lines(copy.deepcopy(nb))
59 return json.dumps(nb, **kwargs)
60
61
62 _reader = JSONReader()
63 _writer = JSONWriter()
64
65 reads = _reader.reads
66 read = _reader.read
67 to_notebook = _reader.to_notebook
68 write = _writer.write
69 writes = _writer.writes
70
@@ -0,0 +1,200 b''
1 """Read and write notebooks as regular .py files.
2
3 Authors:
4
5 * Brian Granger
6 """
7
8 #-----------------------------------------------------------------------------
9 # Copyright (C) 2008-2011 The IPython Development Team
10 #
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
14
15 #-----------------------------------------------------------------------------
16 # Imports
17 #-----------------------------------------------------------------------------
18
19 import re
20 from .rwbase import NotebookReader, NotebookWriter
21 from .nbbase import (
22 new_code_cell, new_text_cell, new_worksheet,
23 new_notebook, new_heading_cell
24 )
25
26 #-----------------------------------------------------------------------------
27 # Code
28 #-----------------------------------------------------------------------------
29
30 _encoding_declaration_re = re.compile(r"^#.*coding[:=]\s*([-\w.]+)")
31
32 class PyReaderError(Exception):
33 pass
34
35
36 class PyReader(NotebookReader):
37
38 def reads(self, s, **kwargs):
39 return self.to_notebook(s,**kwargs)
40
41 def to_notebook(self, s, **kwargs):
42 lines = s.splitlines()
43 cells = []
44 cell_lines = []
45 kwargs = {}
46 state = u'codecell'
47 for line in lines:
48 if line.startswith(u'# <nbformat>') or _encoding_declaration_re.match(line):
49 pass
50 elif line.startswith(u'# <codecell>'):
51 cell = self.new_cell(state, cell_lines, **kwargs)
52 if cell is not None:
53 cells.append(cell)
54 state = u'codecell'
55 cell_lines = []
56 kwargs = {}
57 elif line.startswith(u'# <htmlcell>'):
58 cell = self.new_cell(state, cell_lines, **kwargs)
59 if cell is not None:
60 cells.append(cell)
61 state = u'htmlcell'
62 cell_lines = []
63 kwargs = {}
64 elif line.startswith(u'# <markdowncell>'):
65 cell = self.new_cell(state, cell_lines, **kwargs)
66 if cell is not None:
67 cells.append(cell)
68 state = u'markdowncell'
69 cell_lines = []
70 kwargs = {}
71 elif line.startswith(u'# <plaintextcell>'):
72 cell = self.new_cell(state, cell_lines, **kwargs)
73 if cell is not None:
74 cells.append(cell)
75 state = u'plaintextcell'
76 cell_lines = []
77 kwargs = {}
78 elif line.startswith(u'# <headingcell'):
79 cell = self.new_cell(state, cell_lines, **kwargs)
80 if cell is not None:
81 cells.append(cell)
82 cell_lines = []
83 m = re.match(r'# <headingcell level=(?P<level>\d)>',line)
84 if m is not None:
85 state = u'headingcell'
86 kwargs = {}
87 kwargs['level'] = int(m.group('level'))
88 else:
89 state = u'codecell'
90 kwargs = {}
91 cell_lines = []
92 else:
93 cell_lines.append(line)
94 if cell_lines and state == u'codecell':
95 cell = self.new_cell(state, cell_lines)
96 if cell is not None:
97 cells.append(cell)
98 ws = new_worksheet(cells=cells)
99 nb = new_notebook(worksheets=[ws])
100 return nb
101
102 def new_cell(self, state, lines, **kwargs):
103 if state == u'codecell':
104 input = u'\n'.join(lines)
105 input = input.strip(u'\n')
106 if input:
107 return new_code_cell(input=input)
108 elif state == u'htmlcell':
109 text = self._remove_comments(lines)
110 if text:
111 return new_text_cell(u'html',source=text)
112 elif state == u'markdowncell':
113 text = self._remove_comments(lines)
114 if text:
115 return new_text_cell(u'markdown',source=text)
116 elif state == u'plaintextcell':
117 text = self._remove_comments(lines)
118 if text:
119 return new_text_cell(u'plaintext',source=text)
120 elif state == u'headingcell':
121 text = self._remove_comments(lines)
122 level = kwargs.get('level',1)
123 if text:
124 return new_heading_cell(source=text,level=level)
125
126 def _remove_comments(self, lines):
127 new_lines = []
128 for line in lines:
129 if line.startswith(u'#'):
130 new_lines.append(line[2:])
131 else:
132 new_lines.append(line)
133 text = u'\n'.join(new_lines)
134 text = text.strip(u'\n')
135 return text
136
137 def split_lines_into_blocks(self, lines):
138 if len(lines) == 1:
139 yield lines[0]
140 raise StopIteration()
141 import ast
142 source = '\n'.join(lines)
143 code = ast.parse(source)
144 starts = [x.lineno-1 for x in code.body]
145 for i in range(len(starts)-1):
146 yield '\n'.join(lines[starts[i]:starts[i+1]]).strip('\n')
147 yield '\n'.join(lines[starts[-1]:]).strip('\n')
148
149
150 class PyWriter(NotebookWriter):
151
152 def writes(self, nb, **kwargs):
153 lines = [u'# -*- coding: utf-8 -*-']
154 lines.extend([u'# <nbformat>2</nbformat>',''])
155 for ws in nb.worksheets:
156 for cell in ws.cells:
157 if cell.cell_type == u'code':
158 input = cell.get(u'input')
159 if input is not None:
160 lines.extend([u'# <codecell>',u''])
161 lines.extend(input.splitlines())
162 lines.append(u'')
163 elif cell.cell_type == u'html':
164 input = cell.get(u'source')
165 if input is not None:
166 lines.extend([u'# <htmlcell>',u''])
167 lines.extend([u'# ' + line for line in input.splitlines()])
168 lines.append(u'')
169 elif cell.cell_type == u'markdown':
170 input = cell.get(u'source')
171 if input is not None:
172 lines.extend([u'# <markdowncell>',u''])
173 lines.extend([u'# ' + line for line in input.splitlines()])
174 lines.append(u'')
175 elif cell.cell_type == u'plaintext':
176 input = cell.get(u'source')
177 if input is not None:
178 lines.extend([u'# <plaintextcell>',u''])
179 lines.extend([u'# ' + line for line in input.splitlines()])
180 lines.append(u'')
181 elif cell.cell_type == u'heading':
182 input = cell.get(u'source')
183 level = cell.get(u'level',1)
184 if input is not None:
185 lines.extend([u'# <headingcell level=%s>' % level,u''])
186 lines.extend([u'# ' + line for line in input.splitlines()])
187 lines.append(u'')
188 lines.append('')
189 return unicode('\n'.join(lines))
190
191
192 _reader = PyReader()
193 _writer = PyWriter()
194
195 reads = _reader.reads
196 read = _reader.read
197 to_notebook = _reader.to_notebook
198 write = _writer.write
199 writes = _writer.writes
200
@@ -0,0 +1,165 b''
1 """Base classes and utilities for readers and writers.
2
3 Authors:
4
5 * Brian Granger
6 """
7
8 #-----------------------------------------------------------------------------
9 # Copyright (C) 2008-2011 The IPython Development Team
10 #
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
14
15 #-----------------------------------------------------------------------------
16 # Imports
17 #-----------------------------------------------------------------------------
18
19 from base64 import encodestring, decodestring
20 import pprint
21
22 from IPython.utils.py3compat import str_to_bytes
23
24 #-----------------------------------------------------------------------------
25 # Code
26 #-----------------------------------------------------------------------------
27
28 def restore_bytes(nb):
29 """Restore bytes of image data from unicode-only formats.
30
31 Base64 encoding is handled elsewhere. Bytes objects in the notebook are
32 always b64-encoded. We DO NOT encode/decode around file formats.
33 """
34 for ws in nb.worksheets:
35 for cell in ws.cells:
36 if cell.cell_type == 'code':
37 for output in cell.outputs:
38 if 'png' in output:
39 output.png = str_to_bytes(output.png, 'ascii')
40 if 'jpeg' in output:
41 output.jpeg = str_to_bytes(output.jpeg, 'ascii')
42 return nb
43
44 # output keys that are likely to have multiline values
45 _multiline_outputs = ['text', 'html', 'svg', 'latex', 'javascript', 'json']
46
47 def rejoin_lines(nb):
48 """rejoin multiline text into strings
49
50 For reversing effects of ``split_lines(nb)``.
51
52 This only rejoins lines that have been split, so if text objects were not split
53 they will pass through unchanged.
54
55 Used when reading JSON files that may have been passed through split_lines.
56 """
57 for ws in nb.worksheets:
58 for cell in ws.cells:
59 if cell.cell_type == 'code':
60 if 'input' in cell and isinstance(cell.input, list):
61 cell.input = u'\n'.join(cell.input)
62 for output in cell.outputs:
63 for key in _multiline_outputs:
64 item = output.get(key, None)
65 if isinstance(item, list):
66 output[key] = u'\n'.join(item)
67 else: # text, heading cell
68 for key in ['source', 'rendered']:
69 item = cell.get(key, None)
70 if isinstance(item, list):
71 cell[key] = u'\n'.join(item)
72 return nb
73
74
75 def split_lines(nb):
76 """split likely multiline text into lists of strings
77
78 For file output more friendly to line-based VCS. ``rejoin_lines(nb)`` will
79 reverse the effects of ``split_lines(nb)``.
80
81 Used when writing JSON files.
82 """
83 for ws in nb.worksheets:
84 for cell in ws.cells:
85 if cell.cell_type == 'code':
86 if 'input' in cell and isinstance(cell.input, basestring):
87 cell.input = cell.input.splitlines()
88 for output in cell.outputs:
89 for key in _multiline_outputs:
90 item = output.get(key, None)
91 if isinstance(item, basestring):
92 output[key] = item.splitlines()
93 else: # text, heading cell
94 for key in ['source', 'rendered']:
95 item = cell.get(key, None)
96 if isinstance(item, basestring):
97 cell[key] = item.splitlines()
98 return nb
99
100 # b64 encode/decode are never actually used, because all bytes objects in
101 # the notebook are already b64-encoded, and we don't need/want to double-encode
102
103 def base64_decode(nb):
104 """Restore all bytes objects in the notebook from base64-encoded strings.
105
106 Note: This is never used
107 """
108 for ws in nb.worksheets:
109 for cell in ws.cells:
110 if cell.cell_type == 'code':
111 for output in cell.outputs:
112 if 'png' in output:
113 if isinstance(output.png, unicode):
114 output.png = output.png.encode('ascii')
115 output.png = decodestring(output.png)
116 if 'jpeg' in output:
117 if isinstance(output.jpeg, unicode):
118 output.jpeg = output.jpeg.encode('ascii')
119 output.jpeg = decodestring(output.jpeg)
120 return nb
121
122
123 def base64_encode(nb):
124 """Base64 encode all bytes objects in the notebook.
125
126 These will be b64-encoded unicode strings
127
128 Note: This is never used
129 """
130 for ws in nb.worksheets:
131 for cell in ws.cells:
132 if cell.cell_type == 'code':
133 for output in cell.outputs:
134 if 'png' in output:
135 output.png = encodestring(output.png).decode('ascii')
136 if 'jpeg' in output:
137 output.jpeg = encodestring(output.jpeg).decode('ascii')
138 return nb
139
140
141 class NotebookReader(object):
142 """A class for reading notebooks."""
143
144 def reads(self, s, **kwargs):
145 """Read a notebook from a string."""
146 raise NotImplementedError("loads must be implemented in a subclass")
147
148 def read(self, fp, **kwargs):
149 """Read a notebook from a file like object"""
150 return self.read(fp.read(), **kwargs)
151
152
153 class NotebookWriter(object):
154 """A class for writing notebooks."""
155
156 def writes(self, nb, **kwargs):
157 """Write a notebook to a string."""
158 raise NotImplementedError("loads must be implemented in a subclass")
159
160 def write(self, nb, fp, **kwargs):
161 """Write a notebook to a file like object"""
162 return fp.write(self.writes(nb,**kwargs))
163
164
165
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
@@ -0,0 +1,127 b''
1 import os
2 from base64 import encodestring
3
4 from ..nbbase import (
5 NotebookNode,
6 new_code_cell, new_text_cell, new_worksheet, new_notebook, new_output,
7 new_metadata, new_author, new_heading_cell
8 )
9
10 # some random base64-encoded *bytes*
11 png = encodestring(os.urandom(5))
12 jpeg = encodestring(os.urandom(6))
13
14 ws = new_worksheet(name='worksheet1')
15
16 ws.cells.append(new_text_cell(
17 u'html',
18 source='Some NumPy Examples',
19 rendered='Some NumPy Examples'
20 ))
21
22
23 ws.cells.append(new_code_cell(
24 input='import numpy',
25 prompt_number=1,
26 collapsed=False
27 ))
28
29 ws.cells.append(new_text_cell(
30 u'markdown',
31 source='A random array',
32 rendered='A random array'
33 ))
34
35 ws.cells.append(new_text_cell(
36 u'plaintext',
37 source='A random array',
38 ))
39
40 ws.cells.append(new_heading_cell(
41 u'My Heading',
42 level=2
43 ))
44
45 ws.cells.append(new_code_cell(
46 input='a = numpy.random.rand(100)',
47 prompt_number=2,
48 collapsed=True
49 ))
50
51 ws.cells.append(new_code_cell(
52 input='print a',
53 prompt_number=3,
54 collapsed=False,
55 outputs=[new_output(
56 output_type=u'pyout',
57 output_text=u'<array a>',
58 output_html=u'The HTML rep',
59 output_latex=u'$a$',
60 output_png=png,
61 output_jpeg=jpeg,
62 output_svg=u'<svg>',
63 output_json=u'json data',
64 output_javascript=u'var i=0;',
65 prompt_number=3
66 ),new_output(
67 output_type=u'display_data',
68 output_text=u'<array a>',
69 output_html=u'The HTML rep',
70 output_latex=u'$a$',
71 output_png=png,
72 output_jpeg=jpeg,
73 output_svg=u'<svg>',
74 output_json=u'json data',
75 output_javascript=u'var i=0;'
76 ),new_output(
77 output_type=u'pyerr',
78 etype=u'NameError',
79 evalue=u'NameError was here',
80 traceback=[u'frame 0', u'frame 1', u'frame 2']
81 )]
82 ))
83
84 authors = [new_author(name='Bart Simpson',email='bsimpson@fox.com',
85 affiliation=u'Fox',url=u'http://www.fox.com')]
86 md = new_metadata(name=u'My Notebook',license=u'BSD',created=u'8601_goes_here',
87 modified=u'8601_goes_here',gistid=u'21341231',authors=authors)
88
89 nb0 = new_notebook(
90 worksheets=[ws, new_worksheet(name='worksheet2')],
91 metadata=md
92 )
93
94 nb0_py = """# -*- coding: utf-8 -*-
95 # <nbformat>2</nbformat>
96
97 # <htmlcell>
98
99 # Some NumPy Examples
100
101 # <codecell>
102
103 import numpy
104
105 # <markdowncell>
106
107 # A random array
108
109 # <plaintextcell>
110
111 # A random array
112
113 # <headingcell level=2>
114
115 # My Heading
116
117 # <codecell>
118
119 a = numpy.random.rand(100)
120
121 # <codecell>
122
123 print a
124
125 """
126
127
@@ -0,0 +1,34 b''
1 import pprint
2 from unittest import TestCase
3
4 from ..nbjson import reads, writes
5 from .nbexamples import nb0
6
7
8 class TestJSON(TestCase):
9
10 def test_roundtrip(self):
11 s = writes(nb0)
12 # print
13 # print pprint.pformat(nb0,indent=2)
14 # print
15 # print pprint.pformat(reads(s),indent=2)
16 # print
17 # print s
18 self.assertEquals(reads(s),nb0)
19
20 def test_roundtrip_nosplit(self):
21 """Ensure that multiline blobs are still readable"""
22 # ensures that notebooks written prior to splitlines change
23 # are still readable.
24 s = writes(nb0, split_lines=False)
25 self.assertEquals(reads(s),nb0)
26
27 def test_roundtrip_split(self):
28 """Ensure that splitting multiline blocks is safe"""
29 # This won't differ from test_roundtrip unless the default changes
30 s = writes(nb0, split_lines=True)
31 self.assertEquals(reads(s),nb0)
32
33
34
@@ -0,0 +1,136 b''
1 from unittest import TestCase
2
3 from ..nbbase import (
4 NotebookNode,
5 new_code_cell, new_text_cell, new_worksheet, new_notebook, new_output,
6 new_author, new_metadata, new_heading_cell
7 )
8
9 class TestCell(TestCase):
10
11 def test_empty_code_cell(self):
12 cc = new_code_cell()
13 self.assertEquals(cc.cell_type,u'code')
14 self.assertEquals(u'input' not in cc, True)
15 self.assertEquals(u'prompt_number' not in cc, True)
16 self.assertEquals(cc.outputs, [])
17 self.assertEquals(cc.collapsed, False)
18
19 def test_code_cell(self):
20 cc = new_code_cell(input='a=10', prompt_number=0, collapsed=True)
21 cc.outputs = [new_output(output_type=u'pyout',
22 output_svg=u'foo',output_text=u'10',prompt_number=0)]
23 self.assertEquals(cc.input, u'a=10')
24 self.assertEquals(cc.prompt_number, 0)
25 self.assertEquals(cc.language, u'python')
26 self.assertEquals(cc.outputs[0].svg, u'foo')
27 self.assertEquals(cc.outputs[0].text, u'10')
28 self.assertEquals(cc.outputs[0].prompt_number, 0)
29 self.assertEquals(cc.collapsed, True)
30
31 def test_pyerr(self):
32 o = new_output(output_type=u'pyerr', etype=u'NameError',
33 evalue=u'Name not found', traceback=[u'frame 0', u'frame 1', u'frame 2']
34 )
35 self.assertEquals(o.output_type, u'pyerr')
36 self.assertEquals(o.etype, u'NameError')
37 self.assertEquals(o.evalue, u'Name not found')
38 self.assertEquals(o.traceback, [u'frame 0', u'frame 1', u'frame 2'])
39
40 def test_empty_html_cell(self):
41 tc = new_text_cell(u'html')
42 self.assertEquals(tc.cell_type, u'html')
43 self.assertEquals(u'source' not in tc, True)
44 self.assertEquals(u'rendered' not in tc, True)
45
46 def test_html_cell(self):
47 tc = new_text_cell(u'html', 'hi', 'hi')
48 self.assertEquals(tc.source, u'hi')
49 self.assertEquals(tc.rendered, u'hi')
50
51 def test_empty_markdown_cell(self):
52 tc = new_text_cell(u'markdown')
53 self.assertEquals(tc.cell_type, u'markdown')
54 self.assertEquals(u'source' not in tc, True)
55 self.assertEquals(u'rendered' not in tc, True)
56
57 def test_markdown_cell(self):
58 tc = new_text_cell(u'markdown', 'hi', 'hi')
59 self.assertEquals(tc.source, u'hi')
60 self.assertEquals(tc.rendered, u'hi')
61
62 def test_empty_plaintext_cell(self):
63 tc = new_text_cell(u'plaintext')
64 self.assertEquals(tc.cell_type, u'plaintext')
65 self.assertEquals(u'source' not in tc, True)
66 self.assertEquals(u'rendered' not in tc, True)
67
68 def test_plaintext_cell(self):
69 tc = new_text_cell(u'plaintext', 'hi', 'hi')
70 self.assertEquals(tc.source, u'hi')
71 self.assertEquals(tc.rendered, u'hi')
72
73 def test_empty_heading_cell(self):
74 tc = new_heading_cell()
75 self.assertEquals(tc.cell_type, u'heading')
76 self.assertEquals(u'source' not in tc, True)
77 self.assertEquals(u'rendered' not in tc, True)
78
79 def test_heading_cell(self):
80 tc = new_heading_cell(u'hi', u'hi', level=2)
81 self.assertEquals(tc.source, u'hi')
82 self.assertEquals(tc.rendered, u'hi')
83 self.assertEquals(tc.level, 2)
84
85
86 class TestWorksheet(TestCase):
87
88 def test_empty_worksheet(self):
89 ws = new_worksheet()
90 self.assertEquals(ws.cells,[])
91 self.assertEquals(u'name' not in ws, True)
92
93 def test_worksheet(self):
94 cells = [new_code_cell(), new_text_cell(u'html')]
95 ws = new_worksheet(cells=cells,name=u'foo')
96 self.assertEquals(ws.cells,cells)
97 self.assertEquals(ws.name,u'foo')
98
99 class TestNotebook(TestCase):
100
101 def test_empty_notebook(self):
102 nb = new_notebook()
103 self.assertEquals(nb.worksheets, [])
104 self.assertEquals(nb.metadata, NotebookNode())
105 self.assertEquals(nb.nbformat,2)
106
107 def test_notebook(self):
108 worksheets = [new_worksheet(),new_worksheet()]
109 metadata = new_metadata(name=u'foo')
110 nb = new_notebook(metadata=metadata,worksheets=worksheets)
111 self.assertEquals(nb.metadata.name,u'foo')
112 self.assertEquals(nb.worksheets,worksheets)
113 self.assertEquals(nb.nbformat,2)
114
115 class TestMetadata(TestCase):
116
117 def test_empty_metadata(self):
118 md = new_metadata()
119 self.assertEquals(u'name' not in md, True)
120 self.assertEquals(u'authors' not in md, True)
121 self.assertEquals(u'license' not in md, True)
122 self.assertEquals(u'saved' not in md, True)
123 self.assertEquals(u'modified' not in md, True)
124 self.assertEquals(u'gistid' not in md, True)
125
126 def test_metadata(self):
127 authors = [new_author(name='Bart Simpson',email='bsimpson@fox.com')]
128 md = new_metadata(name=u'foo',license=u'BSD',created=u'today',
129 modified=u'now',gistid=u'21341231',authors=authors)
130 self.assertEquals(md.name, u'foo')
131 self.assertEquals(md.license, u'BSD')
132 self.assertEquals(md.created, u'today')
133 self.assertEquals(md.modified, u'now')
134 self.assertEquals(md.gistid, u'21341231')
135 self.assertEquals(md.authors, authors)
136
@@ -0,0 +1,17 b''
1 from unittest import TestCase
2
3 from ..nbbase import (
4 NotebookNode,
5 new_code_cell, new_text_cell, new_worksheet, new_notebook
6 )
7
8 from ..nbpy import reads, writes
9 from .nbexamples import nb0, nb0_py
10
11
12 class TestPy(TestCase):
13
14 def test_write(self):
15 s = writes(nb0)
16 self.assertEquals(s,nb0_py)
17
@@ -824,6 +824,8 b' var IPython = (function (IPython) {'
824 if (data.collapsed !== undefined) {
824 if (data.collapsed !== undefined) {
825 if (data.collapsed) {
825 if (data.collapsed) {
826 this.collapse();
826 this.collapse();
827 } else {
828 this.expand();
827 };
829 };
828 };
830 };
829 };
831 };
@@ -129,6 +129,27 b' var IPython = (function (IPython) {'
129 this.element.find('#to_markdown').click(function () {
129 this.element.find('#to_markdown').click(function () {
130 IPython.notebook.to_markdown();
130 IPython.notebook.to_markdown();
131 });
131 });
132 this.element.find('#to_plaintext').click(function () {
133 IPython.notebook.to_plaintext();
134 });
135 this.element.find('#to_heading1').click(function () {
136 IPython.notebook.to_heading(undefined, 1);
137 });
138 this.element.find('#to_heading2').click(function () {
139 IPython.notebook.to_heading(undefined, 2);
140 });
141 this.element.find('#to_heading3').click(function () {
142 IPython.notebook.to_heading(undefined, 3);
143 });
144 this.element.find('#to_heading4').click(function () {
145 IPython.notebook.to_heading(undefined, 4);
146 });
147 this.element.find('#to_heading5').click(function () {
148 IPython.notebook.to_heading(undefined, 5);
149 });
150 this.element.find('#to_heading6').click(function () {
151 IPython.notebook.to_heading(undefined, 6);
152 });
132 this.element.find('#toggle_output').click(function () {
153 this.element.find('#toggle_output').click(function () {
133 IPython.notebook.toggle_output();
154 IPython.notebook.toggle_output();
134 });
155 });
@@ -136,7 +136,42 b' var IPython = (function (IPython) {'
136 that.control_key_active = false;
136 that.control_key_active = false;
137 return false;
137 return false;
138 } else if (event.which === 84 && that.control_key_active) {
138 } else if (event.which === 84 && that.control_key_active) {
139 // Toggle output = t
139 // To Plaintext = t
140 that.to_plaintext();
141 that.control_key_active = false;
142 return false;
143 } else if (event.which === 49 && that.control_key_active) {
144 // To Heading 1 = 1
145 that.to_heading(undefined, 1);
146 that.control_key_active = false;
147 return false;
148 } else if (event.which === 50 && that.control_key_active) {
149 // To Heading 2 = 2
150 that.to_heading(undefined, 2);
151 that.control_key_active = false;
152 return false;
153 } else if (event.which === 51 && that.control_key_active) {
154 // To Heading 3 = 3
155 that.to_heading(undefined, 3);
156 that.control_key_active = false;
157 return false;
158 } else if (event.which === 52 && that.control_key_active) {
159 // To Heading 4 = 4
160 that.to_heading(undefined, 4);
161 that.control_key_active = false;
162 return false;
163 } else if (event.which === 53 && that.control_key_active) {
164 // To Heading 5 = 5
165 that.to_heading(undefined, 5);
166 that.control_key_active = false;
167 return false;
168 } else if (event.which === 54 && that.control_key_active) {
169 // To Heading 6 = 6
170 that.to_heading(undefined, 6);
171 that.control_key_active = false;
172 return false;
173 } else if (event.which === 79 && that.control_key_active) {
174 // Toggle output = o
140 that.toggle_output();
175 that.toggle_output();
141 that.control_key_active = false;
176 that.control_key_active = false;
142 return false;
177 return false;
@@ -366,7 +401,11 b' var IPython = (function (IPython) {'
366 };
401 };
367 var cell = this.get_cell(index)
402 var cell = this.get_cell(index)
368 cell.select();
403 cell.select();
369 IPython.toolbar.set_cell_type(cell.cell_type);
404 if (cell.cell_type === 'heading') {
405 IPython.toolbar.set_cell_type(cell.cell_type+cell.level);
406 } else {
407 IPython.toolbar.set_cell_type(cell.cell_type)
408 }
370 };
409 };
371 return this;
410 return this;
372 };
411 };
@@ -467,15 +506,19 b' var IPython = (function (IPython) {'
467 // type = ('code','html','markdown')
506 // type = ('code','html','markdown')
468 // index = cell index or undefined to insert below selected
507 // index = cell index or undefined to insert below selected
469 index = this.index_or_selected(index);
508 index = this.index_or_selected(index);
509 var cell = null;
470 if (this.ncells() === 0 || this.is_valid_cell_index(index)) {
510 if (this.ncells() === 0 || this.is_valid_cell_index(index)) {
471 var cell = null;
472 if (type === 'code') {
511 if (type === 'code') {
473 var cell = new IPython.CodeCell(this);
512 cell = new IPython.CodeCell(this);
474 cell.set_input_prompt();
513 cell.set_input_prompt();
475 } else if (type === 'markdown') {
514 } else if (type === 'markdown') {
476 var cell = new IPython.MarkdownCell(this);
515 cell = new IPython.MarkdownCell(this);
477 } else if (type === 'html') {
516 } else if (type === 'html') {
478 var cell = new IPython.HTMLCell(this);
517 cell = new IPython.HTMLCell(this);
518 } else if (type === 'plaintext') {
519 cell = new IPython.PlaintextCell(this);
520 } else if (type === 'heading') {
521 cell = new IPython.HeadingCell(this);
479 };
522 };
480 if (cell !== null) {
523 if (cell !== null) {
481 if (this.ncells() === 0) {
524 if (this.ncells() === 0) {
@@ -489,6 +532,7 b' var IPython = (function (IPython) {'
489 return cell;
532 return cell;
490 };
533 };
491 };
534 };
535 return cell;
492 };
536 };
493
537
494
538
@@ -496,15 +540,19 b' var IPython = (function (IPython) {'
496 // type = ('code','html','markdown')
540 // type = ('code','html','markdown')
497 // index = cell index or undefined to insert above selected
541 // index = cell index or undefined to insert above selected
498 index = this.index_or_selected(index);
542 index = this.index_or_selected(index);
543 var cell = null;
499 if (this.ncells() === 0 || this.is_valid_cell_index(index)) {
544 if (this.ncells() === 0 || this.is_valid_cell_index(index)) {
500 var cell = null;
501 if (type === 'code') {
545 if (type === 'code') {
502 var cell = new IPython.CodeCell(this);
546 cell = new IPython.CodeCell(this);
503 cell.set_input_prompt();
547 cell.set_input_prompt();
504 } else if (type === 'markdown') {
548 } else if (type === 'markdown') {
505 var cell = new IPython.MarkdownCell(this);
549 cell = new IPython.MarkdownCell(this);
506 } else if (type === 'html') {
550 } else if (type === 'html') {
507 var cell = new IPython.HTMLCell(this);
551 cell = new IPython.HTMLCell(this);
552 } else if (type === 'plaintext') {
553 cell = new IPython.PlaintextCell(this);
554 } else if (type === 'heading') {
555 cell = new IPython.HeadingCell(this);
508 };
556 };
509 if (cell !== null) {
557 if (cell !== null) {
510 if (this.ncells() === 0) {
558 if (this.ncells() === 0) {
@@ -518,6 +566,7 b' var IPython = (function (IPython) {'
518 return cell;
566 return cell;
519 };
567 };
520 };
568 };
569 return cell;
521 };
570 };
522
571
523
572
@@ -534,8 +583,8 b' var IPython = (function (IPython) {'
534 }
583 }
535 target_cell.set_text(text);
584 target_cell.set_text(text);
536 source_element.remove();
585 source_element.remove();
586 this.dirty = true;
537 };
587 };
538 this.dirty = true;
539 };
588 };
540 };
589 };
541
590
@@ -545,19 +594,16 b' var IPython = (function (IPython) {'
545 if (this.is_valid_cell_index(i)) {
594 if (this.is_valid_cell_index(i)) {
546 var source_element = this.get_cell_element(i);
595 var source_element = this.get_cell_element(i);
547 var source_cell = source_element.data("cell");
596 var source_cell = source_element.data("cell");
548 var target_cell = null;
549 if (!(source_cell instanceof IPython.MarkdownCell)) {
597 if (!(source_cell instanceof IPython.MarkdownCell)) {
550 target_cell = this.insert_cell_below('markdown',i);
598 target_cell = this.insert_cell_below('markdown',i);
551 var text = source_cell.get_text();
599 var text = source_cell.get_text();
552 if (text === source_cell.placeholder) {
600 if (text === source_cell.placeholder) {
553 text = '';
601 text = '';
554 };
602 };
555 if (target_cell !== null) {
603 // The edit must come before the set_text.
556 // The edit must come before the set_text.
604 target_cell.edit();
557 target_cell.edit();
605 target_cell.set_text(text);
558 target_cell.set_text(text);
606 source_element.remove();
559 source_element.remove();
560 }
561 this.dirty = true;
607 this.dirty = true;
562 };
608 };
563 };
609 };
@@ -576,14 +622,61 b' var IPython = (function (IPython) {'
576 if (text === source_cell.placeholder) {
622 if (text === source_cell.placeholder) {
577 text = '';
623 text = '';
578 };
624 };
579 if (target_cell !== null) {
625 // The edit must come before the set_text.
580 // The edit must come before the set_text.
626 target_cell.edit();
581 target_cell.edit();
627 target_cell.set_text(text);
582 target_cell.set_text(text);
628 source_element.remove();
583 source_element.remove();
629 this.dirty = true;
584 }
630 };
631 };
632 };
633
634
635 Notebook.prototype.to_plaintext = function (index) {
636 var i = this.index_or_selected(index);
637 if (this.is_valid_cell_index(i)) {
638 var source_element = this.get_cell_element(i);
639 var source_cell = source_element.data("cell");
640 var target_cell = null;
641 if (!(source_cell instanceof IPython.PlaintextCell)) {
642 target_cell = this.insert_cell_below('plaintext',i);
643 var text = source_cell.get_text();
644 if (text === source_cell.placeholder) {
645 text = '';
646 };
647 // The edit must come before the set_text.
648 target_cell.edit();
649 target_cell.set_text(text);
650 source_element.remove();
651 this.dirty = true;
652 };
653 };
654 };
655
656
657 Notebook.prototype.to_heading = function (index, level) {
658 level = level || 1;
659 var i = this.index_or_selected(index);
660 if (this.is_valid_cell_index(i)) {
661 var source_element = this.get_cell_element(i);
662 var source_cell = source_element.data("cell");
663 var target_cell = null;
664 if (source_cell instanceof IPython.HeadingCell) {
665 source_cell.set_level(level);
666 } else {
667 target_cell = this.insert_cell_below('heading',i);
668 var text = source_cell.get_text();
669 if (text === source_cell.placeholder) {
670 text = '';
671 };
672 // The edit must come before the set_text.
673 target_cell.set_level(level);
674 target_cell.edit();
675 target_cell.set_text(text);
676 source_element.remove();
585 this.dirty = true;
677 this.dirty = true;
586 };
678 };
679 IPython.toolbar.set_cell_type("heading"+level);
587 };
680 };
588 };
681 };
589
682
@@ -1098,7 +1191,7 b' var IPython = (function (IPython) {'
1098 // We may want to move the name/id/nbformat logic inside toJSON?
1191 // We may want to move the name/id/nbformat logic inside toJSON?
1099 var data = this.toJSON();
1192 var data = this.toJSON();
1100 data.metadata.name = nbname;
1193 data.metadata.name = nbname;
1101 data.nbformat = 2;
1194 data.nbformat = 3;
1102 // We do the call with settings so we can set cache to false.
1195 // We do the call with settings so we can set cache to false.
1103 var settings = {
1196 var settings = {
1104 processData : false,
1197 processData : false,
@@ -34,13 +34,15 b' var IPython = (function (IPython) {'
34 {key: 'Ctrl-m d', help: 'delete cell'},
34 {key: 'Ctrl-m d', help: 'delete cell'},
35 {key: 'Ctrl-m a', help: 'insert cell above'},
35 {key: 'Ctrl-m a', help: 'insert cell above'},
36 {key: 'Ctrl-m b', help: 'insert cell below'},
36 {key: 'Ctrl-m b', help: 'insert cell below'},
37 {key: 'Ctrl-m t', help: 'toggle output'},
37 {key: 'Ctrl-m o', help: 'toggle output'},
38 {key: 'Ctrl-m l', help: 'toggle line numbers'},
38 {key: 'Ctrl-m l', help: 'toggle line numbers'},
39 {key: 'Ctrl-m s', help: 'save notebook'},
39 {key: 'Ctrl-m s', help: 'save notebook'},
40 {key: 'Ctrl-m j', help: 'move cell down'},
40 {key: 'Ctrl-m j', help: 'move cell down'},
41 {key: 'Ctrl-m k', help: 'move cell up'},
41 {key: 'Ctrl-m k', help: 'move cell up'},
42 {key: 'Ctrl-m y', help: 'code cell'},
42 {key: 'Ctrl-m y', help: 'code cell'},
43 {key: 'Ctrl-m m', help: 'markdown cell'},
43 {key: 'Ctrl-m m', help: 'markdown cell'},
44 {key: 'Ctrl-m t', help: 'plaintext cell'},
45 {key: 'Ctrl-m 1-6', help: 'heading 1-6 cell'},
44 {key: 'Ctrl-m p', help: 'select previous'},
46 {key: 'Ctrl-m p', help: 'select previous'},
45 {key: 'Ctrl-m n', help: 'select next'},
47 {key: 'Ctrl-m n', help: 'select next'},
46 {key: 'Ctrl-m i', help: 'interrupt kernel'},
48 {key: 'Ctrl-m i', help: 'interrupt kernel'},
@@ -237,49 +237,109 b' var IPython = (function (IPython) {'
237 };
237 };
238
238
239
239
240 // RSTCell
240 // PlaintextCell
241
241
242 var RSTCell = function (notebook) {
242 var PlaintextCell = function (notebook) {
243 this.placeholder = "Type *ReStructured Text* and LaTeX: $\\alpha^2$";
243 this.placeholder = "Type plain text and LaTeX: $\\alpha^2$";
244 this.code_mirror_mode = 'rst';
244 IPython.TextCell.apply(this, arguments);
245 IPython.TextCell.apply(this, arguments);
245 this.cell_type = 'rst';
246 this.cell_type = 'plaintext';
246 };
247 };
247
248
248
249
249 RSTCell.prototype = new TextCell();
250 PlaintextCell.prototype = new TextCell();
250
251
251
252
252 RSTCell.prototype.render = function () {
253 PlaintextCell.prototype.render = function () {
253 if (this.rendered === false) {
254 this.rendered = true;
254 var text = this.get_text();
255 this.edit();
255 if (text === "") { text = this.placeholder; }
256 };
256 var settings = {
257
257 processData : false,
258
258 cache : false,
259 PlaintextCell.prototype.select = function () {
259 type : "POST",
260 IPython.Cell.prototype.select.apply(this);
260 data : text,
261 this.code_mirror.refresh();
261 headers : {'Content-Type': 'application/x-rst'},
262 this.code_mirror.focus();
262 success : $.proxy(this.handle_render,this)
263 };
263 };
264
264 $.ajax("/rstservice/render", settings);
265
265 this.element.find('div.text_cell_input').hide();
266 PlaintextCell.prototype.at_top = function () {
266 this.element.find("div.text_cell_render").show();
267 var cursor = this.code_mirror.getCursor();
267 this.set_rendered("Rendering...");
268 if (cursor.line === 0) {
269 return true;
270 } else {
271 return false;
268 }
272 }
269 };
273 };
270
274
271
275
272 RSTCell.prototype.handle_render = function (data, status, xhr) {
276 PlaintextCell.prototype.at_bottom = function () {
273 this.set_rendered(data);
277 var cursor = this.code_mirror.getCursor();
274 this.typeset();
278 if (cursor.line === (this.code_mirror.lineCount()-1)) {
275 this.rendered = true;
279 return true;
280 } else {
281 return false;
282 }
276 };
283 };
277
284
278
285
286 // HTMLCell
287
288 var HeadingCell = function (notebook) {
289 this.placeholder = "Type Heading Here";
290 IPython.TextCell.apply(this, arguments);
291 this.cell_type = 'heading';
292 this.level = 1;
293 };
294
295
296 HeadingCell.prototype = new TextCell();
297
298
299 HeadingCell.prototype.set_level = function (level) {
300 this.level = level;
301 if (this.rendered) {
302 this.rendered = false;
303 this.render();
304 };
305 };
306
307
308 HeadingCell.prototype.get_level = function () {
309 return this.level;
310 };
311
312
313 HeadingCell.prototype.set_rendered = function (text) {
314 var r = this.element.find("div.text_cell_render");
315 r.empty();
316 r.append($('<h'+this.level+'/>').html(text));
317 };
318
319
320 HeadingCell.prototype.get_rendered = function () {
321 var r = this.element.find("div.text_cell_render");
322 return r.children().first().html();
323 };
324
325
326 HeadingCell.prototype.render = function () {
327 if (this.rendered === false) {
328 var text = this.get_text();
329 if (text === "") { text = this.placeholder; }
330 this.set_rendered(text);
331 this.typeset();
332 this.element.find('div.text_cell_input').hide();
333 this.element.find("div.text_cell_render").show();
334 this.rendered = true;
335 };
336 };
337
279 IPython.TextCell = TextCell;
338 IPython.TextCell = TextCell;
280 IPython.HTMLCell = HTMLCell;
339 IPython.HTMLCell = HTMLCell;
281 IPython.MarkdownCell = MarkdownCell;
340 IPython.MarkdownCell = MarkdownCell;
282 IPython.RSTCell = RSTCell;
341 IPython.PlaintextCell = PlaintextCell;
342 IPython.HeadingCell = HeadingCell;
283
343
284
344
285 return IPython;
345 return IPython;
@@ -108,6 +108,20 b' var IPython = (function (IPython) {'
108 IPython.notebook.to_code();
108 IPython.notebook.to_code();
109 } else if (cell_type === 'markdown') {
109 } else if (cell_type === 'markdown') {
110 IPython.notebook.to_markdown();
110 IPython.notebook.to_markdown();
111 } else if (cell_type === 'plaintext') {
112 IPython.notebook.to_plaintext();
113 } else if (cell_type === 'heading1') {
114 IPython.notebook.to_heading(undefined, 1);
115 } else if (cell_type === 'heading2') {
116 IPython.notebook.to_heading(undefined, 2);
117 } else if (cell_type === 'heading3') {
118 IPython.notebook.to_heading(undefined, 3);
119 } else if (cell_type === 'heading4') {
120 IPython.notebook.to_heading(undefined, 4);
121 } else if (cell_type === 'heading5') {
122 IPython.notebook.to_heading(undefined, 5);
123 } else if (cell_type === 'heading6') {
124 IPython.notebook.to_heading(undefined, 6);
111 };
125 };
112 });
126 });
113
127
@@ -117,8 +117,15 b''
117 <li id="run_cell_in_place"><a href="#">Run in Place</a></li>
117 <li id="run_cell_in_place"><a href="#">Run in Place</a></li>
118 <li id="run_all_cells"><a href="#">Run All</a></li>
118 <li id="run_all_cells"><a href="#">Run All</a></li>
119 <hr/>
119 <hr/>
120 <li id="to_code"><a href="#">Code Cell</a></li>
120 <li id="to_code"><a href="#">Code</a></li>
121 <li id="to_markdown"><a href="#">Markdown Cell</a></li>
121 <li id="to_markdown"><a href="#">Markdown </a></li>
122 <li id="to_plaintext"><a href="#">Plaintext</a></li>
123 <li id="to_heading1"><a href="#">Heading 1</a></li>
124 <li id="to_heading2"><a href="#">Heading 2</a></li>
125 <li id="to_heading3"><a href="#">Heading 3</a></li>
126 <li id="to_heading4"><a href="#">Heading 4</a></li>
127 <li id="to_heading5"><a href="#">Heading 5</a></li>
128 <li id="to_heading6"><a href="#">Heading 6</a></li>
122 <hr/>
129 <hr/>
123 <li id="toggle_output"><a href="#">Toggle Output</a></li>
130 <li id="toggle_output"><a href="#">Toggle Output</a></li>
124 <li id="clear_all_output"><a href="#">Clear All Output</a></li>
131 <li id="clear_all_output"><a href="#">Clear All Output</a></li>
@@ -173,6 +180,13 b''
173 <select id="cell_type">
180 <select id="cell_type">
174 <option value="code">Code</option>
181 <option value="code">Code</option>
175 <option value="markdown">Markdown</option>
182 <option value="markdown">Markdown</option>
183 <option value="plaintext">Plaintext</option>
184 <option value="heading1">Heading 1</option>
185 <option value="heading2">Heading 2</option>
186 <option value="heading3">Heading 3</option>
187 <option value="heading4">Heading 4</option>
188 <option value="heading5">Heading 5</option>
189 <option value="heading6">Heading 6</option>
176 </select>
190 </select>
177 </span>
191 </span>
178
192
@@ -21,20 +21,21 b' import json'
21 from xml.etree import ElementTree as ET
21 from xml.etree import ElementTree as ET
22 import re
22 import re
23
23
24 from IPython.nbformat import v3
24 from IPython.nbformat import v2
25 from IPython.nbformat import v2
25 from IPython.nbformat import v1
26 from IPython.nbformat import v1
26
27
27 from IPython.nbformat.v2 import (
28 from IPython.nbformat.v3 import (
28 NotebookNode,
29 NotebookNode,
29 new_code_cell, new_text_cell, new_notebook, new_output, new_worksheet,
30 new_code_cell, new_text_cell, new_notebook, new_output, new_worksheet,
30 parse_filename, new_metadata, new_author
31 parse_filename, new_metadata, new_author, new_heading_cell
31 )
32 )
32
33
33 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
34 # Code
35 # Code
35 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
36
37
37 current_nbformat = 2
38 current_nbformat = 3
38
39
39
40
40 class NBFormatError(Exception):
41 class NBFormatError(Exception):
@@ -48,17 +49,6 b' def parse_json(s, **kwargs):'
48 return nbformat, d
49 return nbformat, d
49
50
50
51
51 def parse_xml(s, **kwargs):
52 """Parse a string into a (nbformat, etree) tuple."""
53 root = ET.fromstring(s)
54 nbformat_e = root.find('nbformat')
55 if nbformat_e is not None:
56 nbformat = int(nbformat_e.text)
57 else:
58 raise NBFormatError('No nbformat version found')
59 return nbformat, root
60
61
62 def parse_py(s, **kwargs):
52 def parse_py(s, **kwargs):
63 """Parse a string into a (nbformat, string) tuple."""
53 """Parse a string into a (nbformat, string) tuple."""
64 pattern = r'# <nbformat>(?P<nbformat>\d+)</nbformat>'
54 pattern = r'# <nbformat>(?P<nbformat>\d+)</nbformat>'
@@ -66,7 +56,7 b' def parse_py(s, **kwargs):'
66 if m is not None:
56 if m is not None:
67 nbformat = int(m.group('nbformat'))
57 nbformat = int(m.group('nbformat'))
68 else:
58 else:
69 nbformat = 2
59 nbformat = 3
70 return nbformat, s
60 return nbformat, s
71
61
72
62
@@ -75,26 +65,19 b' def reads_json(s, **kwargs):'
75 nbformat, d = parse_json(s, **kwargs)
65 nbformat, d = parse_json(s, **kwargs)
76 if nbformat == 1:
66 if nbformat == 1:
77 nb = v1.to_notebook_json(d, **kwargs)
67 nb = v1.to_notebook_json(d, **kwargs)
78 nb = v2.convert_to_this_nbformat(nb, orig_version=1)
68 nb = v3.convert_to_this_nbformat(nb, orig_version=1)
79 elif nbformat == 2:
69 elif nbformat == 2:
80 nb = v2.to_notebook_json(d, **kwargs)
70 nb = v2.to_notebook_json(d, **kwargs)
71 nb = v3.convert_to_this_nbformat(nb, orig_version=2)
72 elif nbformat == 3:
73 nb = v3.to_notebook_json(d, **kwargs)
81 else:
74 else:
82 raise NBFormatError('Unsupported JSON nbformat version: %i' % nbformat)
75 raise NBFormatError('Unsupported JSON nbformat version: %i' % nbformat)
83 return nb
76 return nb
84
77
85
78
86 def writes_json(nb, **kwargs):
79 def writes_json(nb, **kwargs):
87 return v2.writes_json(nb, **kwargs)
80 return v3.writes_json(nb, **kwargs)
88
89
90 def reads_xml(s, **kwargs):
91 """Read an XML notebook from a string and return the NotebookNode object."""
92 nbformat, root = parse_xml(s, **kwargs)
93 if nbformat == 2:
94 nb = v2.to_notebook_xml(root, **kwargs)
95 else:
96 raise NBFormatError('Unsupported XML nbformat version: %i' % nbformat)
97 return nb
98
81
99
82
100 def reads_py(s, **kwargs):
83 def reads_py(s, **kwargs):
@@ -102,13 +85,15 b' def reads_py(s, **kwargs):'
102 nbformat, s = parse_py(s, **kwargs)
85 nbformat, s = parse_py(s, **kwargs)
103 if nbformat == 2:
86 if nbformat == 2:
104 nb = v2.to_notebook_py(s, **kwargs)
87 nb = v2.to_notebook_py(s, **kwargs)
88 elif nbformat == 3:
89 nb = v3.to_notebook_py(s, **kwargs)
105 else:
90 else:
106 raise NBFormatError('Unsupported PY nbformat version: %i' % nbformat)
91 raise NBFormatError('Unsupported PY nbformat version: %i' % nbformat)
107 return nb
92 return nb
108
93
109
94
110 def writes_py(nb, **kwargs):
95 def writes_py(nb, **kwargs):
111 return v2.writes_py(nb, **kwargs)
96 return v3.writes_py(nb, **kwargs)
112
97
113
98
114 # High level API
99 # High level API
@@ -133,9 +118,7 b' def reads(s, format, **kwargs):'
133 The notebook that was read.
118 The notebook that was read.
134 """
119 """
135 format = unicode(format)
120 format = unicode(format)
136 if format == u'xml':
121 if format == u'json' or format == u'ipynb':
137 return reads_xml(s, **kwargs)
138 elif format == u'json' or format == u'ipynb':
139 return reads_json(s, **kwargs)
122 return reads_json(s, **kwargs)
140 elif format == u'py':
123 elif format == u'py':
141 return reads_py(s, **kwargs)
124 return reads_py(s, **kwargs)
@@ -161,9 +144,7 b' def writes(nb, format, **kwargs):'
161 The notebook string.
144 The notebook string.
162 """
145 """
163 format = unicode(format)
146 format = unicode(format)
164 if format == u'xml':
147 if format == u'json' or format == u'ipynb':
165 raise NotImplementedError('Write to XML files is not implemented.')
166 elif format == u'json' or format == u'ipynb':
167 return writes_json(nb, **kwargs)
148 return writes_json(nb, **kwargs)
168 elif format == u'py':
149 elif format == u'py':
169 return writes_py(nb, **kwargs)
150 return writes_py(nb, **kwargs)
This diff has been collapsed as it changes many lines, (1330 lines changed) Show them Hide them
@@ -1,959 +1,959 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "00_notebook_tour"
3 "name": "00_notebook_tour"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "# A brief tour of the IPython notebook",
12 "# A brief tour of the IPython notebook",
13 "",
13 "",
14 "This document will give you a brief tour of the capabilities of the IPython notebook. ",
14 "This document will give you a brief tour of the capabilities of the IPython notebook. ",
15 "You can view its contents by scrolling around, or execute each cell by typing `Shift-Enter`.",
15 "You can view its contents by scrolling around, or execute each cell by typing `Shift-Enter`.",
16 "After you conclude this brief high-level tour, you should read the accompanying notebook ",
16 "After you conclude this brief high-level tour, you should read the accompanying notebook ",
17 "titled `01_notebook_introduction`, which takes a more step-by-step approach to the features of the",
17 "titled `01_notebook_introduction`, which takes a more step-by-step approach to the features of the",
18 "system. ",
18 "system. ",
19 "",
19 "",
20 "The rest of the notebooks in this directory illustrate various other aspects and ",
20 "The rest of the notebooks in this directory illustrate various other aspects and ",
21 "capabilities of the IPython notebook; some of them may require additional libraries to be executed.",
21 "capabilities of the IPython notebook; some of them may require additional libraries to be executed.",
22 "",
22 "",
23 "**NOTE:** This notebook *must* be run from its own directory, so you must ``cd``",
23 "**NOTE:** This notebook *must* be run from its own directory, so you must ``cd``",
24 "to this directory and then start the notebook, but do *not* use the ``--notebook-dir``",
24 "to this directory and then start the notebook, but do *not* use the ``--notebook-dir``",
25 "option to run it from another location.",
25 "option to run it from another location.",
26 "",
26 "",
27 "The first thing you need to know is that you are still controlling the same old IPython you're used to,",
27 "The first thing you need to know is that you are still controlling the same old IPython you're used to,",
28 "so things like shell aliases and magic commands still work:"
28 "so things like shell aliases and magic commands still work:"
29 ]
29 ]
30 },
30 },
31 {
31 {
32 "cell_type": "code",
32 "cell_type": "code",
33 "collapsed": false,
33 "collapsed": false,
34 "input": [
34 "input": [
35 "pwd"
35 "pwd"
36 ],
36 ],
37 "language": "python",
37 "language": "python",
38 "outputs": [
38 "outputs": [
39 {
39 {
40 "output_type": "pyout",
40 "output_type": "pyout",
41 "prompt_number": 1,
41 "prompt_number": 1,
42 "text": [
42 "text": [
43 "u'/home/fperez/ipython/ipython/docs/examples/notebooks'"
43 "u'/home/fperez/ipython/ipython/docs/examples/notebooks'"
44 ]
44 ]
45 }
45 }
46 ],
46 ],
47 "prompt_number": 1
47 "prompt_number": 1
48 },
48 },
49 {
49 {
50 "cell_type": "code",
50 "cell_type": "code",
51 "collapsed": false,
51 "collapsed": false,
52 "input": [
52 "input": [
53 "ls"
53 "ls"
54 ],
54 ],
55 "language": "python",
55 "language": "python",
56 "outputs": [
56 "outputs": [
57 {
57 {
58 "output_type": "stream",
58 "output_type": "stream",
59 "stream": "stdout",
59 "stream": "stdout",
60 "text": [
60 "text": [
61 "00_notebook_tour.ipynb python-logo.svg",
61 "00_notebook_tour.ipynb python-logo.svg",
62 "01_notebook_introduction.ipynb sympy.ipynb",
62 "01_notebook_introduction.ipynb sympy.ipynb",
63 "animation.m4v sympy_quantum_computing.ipynb",
63 "animation.m4v sympy_quantum_computing.ipynb",
64 "display_protocol.ipynb trapezoid_rule.ipynb",
64 "display_protocol.ipynb trapezoid_rule.ipynb",
65 "formatting.ipynb"
65 "formatting.ipynb"
66 ]
66 ]
67 }
67 }
68 ],
68 ],
69 "prompt_number": 2
69 "prompt_number": 2
70 },
70 },
71 {
71 {
72 "cell_type": "code",
72 "cell_type": "code",
73 "collapsed": false,
73 "collapsed": false,
74 "input": [
74 "input": [
75 "message = 'The IPython notebook is great!'",
75 "message = 'The IPython notebook is great!'",
76 "# note: the echo command does not run on Windows, it's a unix command.",
76 "# note: the echo command does not run on Windows, it's a unix command.",
77 "!echo $message"
77 "!echo $message"
78 ],
78 ],
79 "language": "python",
79 "language": "python",
80 "outputs": [
80 "outputs": [
81 {
81 {
82 "output_type": "stream",
82 "output_type": "stream",
83 "stream": "stdout",
83 "stream": "stdout",
84 "text": [
84 "text": [
85 "The IPython notebook is great!"
85 "The IPython notebook is great!"
86 ]
86 ]
87 }
87 }
88 ],
88 ],
89 "prompt_number": 3
89 "prompt_number": 3
90 },
90 },
91 {
91 {
92 "cell_type": "markdown",
92 "cell_type": "markdown",
93 "source": [
93 "source": [
94 "Plots with matplotlib: do *not* execute the next below if you do not have matplotlib installed or didn't start up ",
94 "Plots with matplotlib: do *not* execute the next below if you do not have matplotlib installed or didn't start up ",
95 "this notebook with the `--pylab` option, as the code will not work."
95 "this notebook with the `--pylab` option, as the code will not work."
96 ]
96 ]
97 },
97 },
98 {
98 {
99 "cell_type": "code",
99 "cell_type": "code",
100 "collapsed": false,
100 "collapsed": false,
101 "input": [
101 "input": [
102 "x = linspace(0, 3*pi, 500)",
102 "x = linspace(0, 3*pi, 500)",
103 "plot(x, sin(x**2))",
103 "plot(x, sin(x**2))",
104 "title('A simple chirp');"
104 "title('A simple chirp');"
105 ],
105 ],
106 "language": "python",
106 "language": "python",
107 "outputs": [
107 "outputs": [
108 {
108 {
109 "output_type": "display_data",
109 "output_type": "display_data",
110 "png": "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\n"
110 "png": "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\n"
111 }
111 }
112 ],
112 ],
113 "prompt_number": 4
113 "prompt_number": 4
114 },
114 },
115 {
115 {
116 "cell_type": "markdown",
116 "cell_type": "markdown",
117 "source": [
117 "source": [
118 "You can paste blocks of input with prompt markers, such as those from",
118 "You can paste blocks of input with prompt markers, such as those from",
119 "[the official Python tutorial](http://docs.python.org/tutorial/interpreter.html#interactive-mode)"
119 "[the official Python tutorial](http://docs.python.org/tutorial/interpreter.html#interactive-mode)"
120 ]
120 ]
121 },
121 },
122 {
122 {
123 "cell_type": "code",
123 "cell_type": "code",
124 "collapsed": false,
124 "collapsed": false,
125 "input": [
125 "input": [
126 ">>> the_world_is_flat = 1",
126 ">>> the_world_is_flat = 1",
127 ">>> if the_world_is_flat:",
127 ">>> if the_world_is_flat:",
128 "... print \"Be careful not to fall off!\""
128 "... print \"Be careful not to fall off!\""
129 ],
129 ],
130 "language": "python",
130 "language": "python",
131 "outputs": [
131 "outputs": [
132 {
132 {
133 "output_type": "stream",
133 "output_type": "stream",
134 "stream": "stdout",
134 "stream": "stdout",
135 "text": [
135 "text": [
136 "Be careful not to fall off!"
136 "Be careful not to fall off!"
137 ]
137 ]
138 }
138 }
139 ],
139 ],
140 "prompt_number": 5
140 "prompt_number": 5
141 },
141 },
142 {
142 {
143 "cell_type": "markdown",
143 "cell_type": "markdown",
144 "source": [
144 "source": [
145 "Errors are shown in informative ways:"
145 "Errors are shown in informative ways:"
146 ]
146 ]
147 },
147 },
148 {
148 {
149 "cell_type": "code",
149 "cell_type": "code",
150 "collapsed": false,
150 "collapsed": false,
151 "input": [
151 "input": [
152 "%run non_existent_file"
152 "%run non_existent_file"
153 ],
153 ],
154 "language": "python",
154 "language": "python",
155 "outputs": [
155 "outputs": [
156 {
156 {
157 "output_type": "stream",
157 "output_type": "stream",
158 "stream": "stderr",
158 "stream": "stderr",
159 "text": [
159 "text": [
160 "ERROR: File `non_existent_file.py` not found."
160 "ERROR: File `non_existent_file.py` not found."
161 ]
161 ]
162 }
162 }
163 ],
163 ],
164 "prompt_number": 6
164 "prompt_number": 6
165 },
165 },
166 {
166 {
167 "cell_type": "code",
167 "cell_type": "code",
168 "collapsed": false,
168 "collapsed": false,
169 "input": [
169 "input": [
170 "x = 1",
170 "x = 1",
171 "y = 4",
171 "y = 4",
172 "z = y/(1-x)"
172 "z = y/(1-x)"
173 ],
173 ],
174 "language": "python",
174 "language": "python",
175 "outputs": [
175 "outputs": [
176 {
176 {
177 "ename": "ZeroDivisionError",
177 "ename": "ZeroDivisionError",
178 "evalue": "integer division or modulo by zero",
178 "evalue": "integer division or modulo by zero",
179 "output_type": "pyerr",
179 "output_type": "pyerr",
180 "traceback": [
180 "traceback": [
181 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)",
181 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)",
182 "\u001b[0;32m/home/fperez/ipython/ipython/docs/examples/notebooks/<ipython-input-7-dc39888fd1d2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mz\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
182 "\u001b[0;32m/home/fperez/ipython/ipython/docs/examples/notebooks/<ipython-input-7-dc39888fd1d2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mz\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
183 "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero"
183 "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero"
184 ]
184 ]
185 }
185 }
186 ],
186 ],
187 "prompt_number": 7
187 "prompt_number": 7
188 },
188 },
189 {
189 {
190 "cell_type": "markdown",
190 "cell_type": "markdown",
191 "source": [
191 "source": [
192 "When IPython needs to display additional information (such as providing details on an object via `x?`",
192 "When IPython needs to display additional information (such as providing details on an object via `x?`",
193 "it will automatically invoke a pager at the bottom of the screen:"
193 "it will automatically invoke a pager at the bottom of the screen:"
194 ]
194 ]
195 },
195 },
196 {
196 {
197 "cell_type": "code",
197 "cell_type": "code",
198 "collapsed": true,
198 "collapsed": true,
199 "input": [
199 "input": [
200 "magic"
200 "magic"
201 ],
201 ],
202 "language": "python",
202 "language": "python",
203 "outputs": [],
203 "outputs": [],
204 "prompt_number": 8
204 "prompt_number": 8
205 },
205 },
206 {
206 {
207 "cell_type": "markdown",
207 "cell_type": "markdown",
208 "source": [
208 "source": [
209 "## Non-blocking output of kernel",
209 "## Non-blocking output of kernel",
210 "",
210 "",
211 "If you execute the next cell, you will see the output arriving as it is generated, not all at the end."
211 "If you execute the next cell, you will see the output arriving as it is generated, not all at the end."
212 ]
212 ]
213 },
213 },
214 {
214 {
215 "cell_type": "code",
215 "cell_type": "code",
216 "collapsed": false,
216 "collapsed": false,
217 "input": [
217 "input": [
218 "import time, sys",
218 "import time, sys",
219 "for i in range(8):",
219 "for i in range(8):",
220 " print i,",
220 " print i,",
221 " time.sleep(0.5)"
221 " time.sleep(0.5)"
222 ],
222 ],
223 "language": "python",
223 "language": "python",
224 "outputs": [
224 "outputs": [
225 {
225 {
226 "output_type": "stream",
226 "output_type": "stream",
227 "stream": "stdout",
227 "stream": "stdout",
228 "text": [
228 "text": [
229 "0 "
229 "0 "
230 ]
230 ]
231 },
231 },
232 {
232 {
233 "output_type": "stream",
233 "output_type": "stream",
234 "stream": "stdout",
234 "stream": "stdout",
235 "text": [
235 "text": [
236 "1 "
236 "1 "
237 ]
237 ]
238 },
238 },
239 {
239 {
240 "output_type": "stream",
240 "output_type": "stream",
241 "stream": "stdout",
241 "stream": "stdout",
242 "text": [
242 "text": [
243 "2 "
243 "2 "
244 ]
244 ]
245 },
245 },
246 {
246 {
247 "output_type": "stream",
247 "output_type": "stream",
248 "stream": "stdout",
248 "stream": "stdout",
249 "text": [
249 "text": [
250 "3 "
250 "3 "
251 ]
251 ]
252 },
252 },
253 {
253 {
254 "output_type": "stream",
254 "output_type": "stream",
255 "stream": "stdout",
255 "stream": "stdout",
256 "text": [
256 "text": [
257 "4 "
257 "4 "
258 ]
258 ]
259 },
259 },
260 {
260 {
261 "output_type": "stream",
261 "output_type": "stream",
262 "stream": "stdout",
262 "stream": "stdout",
263 "text": [
263 "text": [
264 "5 "
264 "5 "
265 ]
265 ]
266 },
266 },
267 {
267 {
268 "output_type": "stream",
268 "output_type": "stream",
269 "stream": "stdout",
269 "stream": "stdout",
270 "text": [
270 "text": [
271 "6 "
271 "6 "
272 ]
272 ]
273 },
273 },
274 {
274 {
275 "output_type": "stream",
275 "output_type": "stream",
276 "stream": "stdout",
276 "stream": "stdout",
277 "text": [
277 "text": [
278 "7"
278 "7"
279 ]
279 ]
280 }
280 }
281 ],
281 ],
282 "prompt_number": 9
282 "prompt_number": 9
283 },
283 },
284 {
284 {
285 "cell_type": "markdown",
285 "cell_type": "markdown",
286 "source": [
286 "source": [
287 "## Clean crash and restart",
287 "## Clean crash and restart",
288 "",
288 "",
289 "We call the low-level system libc.time routine with the wrong argument via",
289 "We call the low-level system libc.time routine with the wrong argument via",
290 "ctypes to segfault the Python interpreter:"
290 "ctypes to segfault the Python interpreter:"
291 ]
291 ]
292 },
292 },
293 {
293 {
294 "cell_type": "code",
294 "cell_type": "code",
295 "collapsed": true,
295 "collapsed": true,
296 "input": [
296 "input": [
297 "from ctypes import CDLL",
297 "from ctypes import CDLL",
298 "# This will crash a linux system; equivalent calls can be made on Windows or Mac",
298 "# This will crash a linux system; equivalent calls can be made on Windows or Mac",
299 "libc = CDLL(\"libc.so.6\") ",
299 "libc = CDLL(\"libc.so.6\") ",
300 "libc.time(-1) # BOOM!!"
300 "libc.time(-1) # BOOM!!"
301 ],
301 ],
302 "language": "python",
302 "language": "python",
303 "outputs": [],
303 "outputs": [],
304 "prompt_number": "*"
304 "prompt_number": "*"
305 },
305 },
306 {
306 {
307 "cell_type": "markdown",
307 "cell_type": "markdown",
308 "source": [
308 "source": [
309 "## Markdown cells can contain formatted text and code",
309 "## Markdown cells can contain formatted text and code",
310 "",
310 "",
311 "You can *italicize*, **boldface**",
311 "You can *italicize*, **boldface**",
312 "",
312 "",
313 "* build",
313 "* build",
314 "* lists",
314 "* lists",
315 "",
315 "",
316 "and embed code meant for illustration instead of execution in Python:",
316 "and embed code meant for illustration instead of execution in Python:",
317 "",
317 "",
318 " def f(x):",
318 " def f(x):",
319 " \"\"\"a docstring\"\"\"",
319 " \"\"\"a docstring\"\"\"",
320 " return x**2",
320 " return x**2",
321 "",
321 "",
322 "or other languages:",
322 "or other languages:",
323 "",
323 "",
324 " if (i=0; i<n; i++) {",
324 " if (i=0; i<n; i++) {",
325 " printf(\"hello %d\\n\", i);",
325 " printf(\"hello %d\\n\", i);",
326 " x += 4;",
326 " x += 4;",
327 " }"
327 " }"
328 ]
328 ]
329 },
329 },
330 {
330 {
331 "cell_type": "markdown",
331 "cell_type": "markdown",
332 "source": [
332 "source": [
333 "Courtesy of MathJax, you can include mathematical expressions both inline: ",
333 "Courtesy of MathJax, you can include mathematical expressions both inline: ",
334 "$e^{i\\pi} + 1 = 0$ and displayed:",
334 "$e^{i\\pi} + 1 = 0$ and displayed:",
335 "",
335 "",
336 "$$e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$$"
336 "$$e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$$"
337 ]
337 ]
338 },
338 },
339 {
339 {
340 "cell_type": "markdown",
340 "cell_type": "markdown",
341 "source": [
341 "source": [
342 "## Rich displays: include anyting a browser can show",
342 "## Rich displays: include anyting a browser can show",
343 "",
343 "",
344 "Note that we have an actual protocol for this, see the `display_protocol` notebook for further details.",
344 "Note that we have an actual protocol for this, see the `display_protocol` notebook for further details.",
345 "",
345 "",
346 "### Images"
346 "### Images"
347 ]
347 ]
348 },
348 },
349 {
349 {
350 "cell_type": "code",
350 "cell_type": "code",
351 "collapsed": false,
351 "collapsed": false,
352 "input": [
352 "input": [
353 "from IPython.core.display import Image",
353 "from IPython.core.display import Image",
354 "Image(filename='../../source/_static/logo.png')"
354 "Image(filename='../../source/_static/logo.png')"
355 ],
355 ],
356 "language": "python",
356 "language": "python",
357 "outputs": [
357 "outputs": [
358 {
358 {
359 "output_type": "pyout",
359 "output_type": "pyout",
360 "png": "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\n",
360 "png": "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\n",
361 "prompt_number": 1,
361 "prompt_number": 1,
362 "text": [
362 "text": [
363 "&lt;IPython.core.display.Image at 0x41d4690&gt;"
363 "&lt;IPython.core.display.Image at 0x41d4690&gt;"
364 ]
364 ]
365 }
365 }
366 ],
366 ],
367 "prompt_number": 1
367 "prompt_number": 1
368 },
368 },
369 {
369 {
370 "cell_type": "markdown",
370 "cell_type": "markdown",
371 "source": [
371 "source": [
372 "An image can also be displayed from raw data or a url"
372 "An image can also be displayed from raw data or a url"
373 ]
373 ]
374 },
374 },
375 {
375 {
376 "cell_type": "code",
376 "cell_type": "code",
377 "collapsed": false,
377 "collapsed": false,
378 "input": [
378 "input": [
379 "Image('http://python.org/images/python-logo.gif')"
379 "Image('http://python.org/images/python-logo.gif')"
380 ],
380 ],
381 "language": "python",
381 "language": "python",
382 "outputs": [
382 "outputs": [
383 {
383 {
384 "html": [
384 "html": [
385 "<img src=\"http://python.org/images/python-logo.gif\" />"
385 "<img src=\"http://python.org/images/python-logo.gif\" />"
386 ],
386 ],
387 "output_type": "pyout",
387 "output_type": "pyout",
388 "prompt_number": 2,
388 "prompt_number": 2,
389 "text": [
389 "text": [
390 "&lt;IPython.core.display.Image at 0x41d4550&gt;"
390 "&lt;IPython.core.display.Image at 0x41d4550&gt;"
391 ]
391 ]
392 }
392 }
393 ],
393 ],
394 "prompt_number": 2
394 "prompt_number": 2
395 },
395 },
396 {
396 {
397 "cell_type": "markdown",
397 "cell_type": "markdown",
398 "source": [
398 "source": [
399 "SVG images are also supported out of the box (since modern browsers do a good job of rendering them):"
399 "SVG images are also supported out of the box (since modern browsers do a good job of rendering them):"
400 ]
400 ]
401 },
401 },
402 {
402 {
403 "cell_type": "code",
403 "cell_type": "code",
404 "collapsed": false,
404 "collapsed": false,
405 "input": [
405 "input": [
406 "from IPython.core.display import SVG",
406 "from IPython.core.display import SVG",
407 "SVG(filename='python-logo.svg')"
407 "SVG(filename='python-logo.svg')"
408 ],
408 ],
409 "language": "python",
409 "language": "python",
410 "outputs": [
410 "outputs": [
411 {
411 {
412 "output_type": "pyout",
412 "output_type": "pyout",
413 "prompt_number": 3,
413 "prompt_number": 3,
414 "svg": [
414 "svg": [
415 "<svg height=\"115.02pt\" id=\"svg2\" inkscape:version=\"0.43\" sodipodi:docbase=\"/home/sdeibel\" sodipodi:docname=\"logo-python-generic.svg\" sodipodi:version=\"0.32\" version=\"1.0\" width=\"388.84pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://web.resource.org/cc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">",
415 "<svg height=\"115.02pt\" id=\"svg2\" inkscape:version=\"0.43\" sodipodi:docbase=\"/home/sdeibel\" sodipodi:docname=\"logo-python-generic.svg\" sodipodi:version=\"0.32\" version=\"1.0\" width=\"388.84pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://web.resource.org/cc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">",
416 " <metadata id=\"metadata2193\">",
416 " <metadata id=\"metadata2193\">",
417 " <rdf:RDF>",
417 " <rdf:RDF>",
418 " <cc:Work rdf:about=\"\">",
418 " <cc:Work rdf:about=\"\">",
419 " <dc:format>image/svg+xml</dc:format>",
419 " <dc:format>image/svg+xml</dc:format>",
420 " <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>",
420 " <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>",
421 " </cc:Work>",
421 " </cc:Work>",
422 " </rdf:RDF>",
422 " </rdf:RDF>",
423 " </metadata>",
423 " </metadata>",
424 " <sodipodi:namedview bordercolor=\"#666666\" borderopacity=\"1.0\" id=\"base\" inkscape:current-layer=\"svg2\" inkscape:cx=\"243.02499\" inkscape:cy=\"71.887497\" inkscape:pageopacity=\"0.0\" inkscape:pageshadow=\"2\" inkscape:window-height=\"543\" inkscape:window-width=\"791\" inkscape:window-x=\"0\" inkscape:window-y=\"0\" inkscape:zoom=\"1.4340089\" pagecolor=\"#ffffff\"/>",
424 " <sodipodi:namedview bordercolor=\"#666666\" borderopacity=\"1.0\" id=\"base\" inkscape:current-layer=\"svg2\" inkscape:cx=\"243.02499\" inkscape:cy=\"71.887497\" inkscape:pageopacity=\"0.0\" inkscape:pageshadow=\"2\" inkscape:window-height=\"543\" inkscape:window-width=\"791\" inkscape:window-x=\"0\" inkscape:window-y=\"0\" inkscape:zoom=\"1.4340089\" pagecolor=\"#ffffff\"/>",
425 " <defs id=\"defs4\">",
425 " <defs id=\"defs4\">",
426 " <linearGradient id=\"linearGradient2795\">",
426 " <linearGradient id=\"linearGradient2795\">",
427 " <stop id=\"stop2797\" offset=\"0\" style=\"stop-color:#b8b8b8;stop-opacity:0.49803922\"/>",
427 " <stop id=\"stop2797\" offset=\"0\" style=\"stop-color:#b8b8b8;stop-opacity:0.49803922\"/>",
428 " <stop id=\"stop2799\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>",
428 " <stop id=\"stop2799\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>",
429 " </linearGradient>",
429 " </linearGradient>",
430 " <linearGradient id=\"linearGradient2787\">",
430 " <linearGradient id=\"linearGradient2787\">",
431 " <stop id=\"stop2789\" offset=\"0\" style=\"stop-color:#7f7f7f;stop-opacity:0.5\"/>",
431 " <stop id=\"stop2789\" offset=\"0\" style=\"stop-color:#7f7f7f;stop-opacity:0.5\"/>",
432 " <stop id=\"stop2791\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>",
432 " <stop id=\"stop2791\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>",
433 " </linearGradient>",
433 " </linearGradient>",
434 " <linearGradient id=\"linearGradient3676\">",
434 " <linearGradient id=\"linearGradient3676\">",
435 " <stop id=\"stop3678\" offset=\"0\" style=\"stop-color:#b2b2b2;stop-opacity:0.5\"/>",
435 " <stop id=\"stop3678\" offset=\"0\" style=\"stop-color:#b2b2b2;stop-opacity:0.5\"/>",
436 " <stop id=\"stop3680\" offset=\"1\" style=\"stop-color:#b3b3b3;stop-opacity:0\"/>",
436 " <stop id=\"stop3680\" offset=\"1\" style=\"stop-color:#b3b3b3;stop-opacity:0\"/>",
437 " </linearGradient>",
437 " </linearGradient>",
438 " <linearGradient id=\"linearGradient3236\">",
438 " <linearGradient id=\"linearGradient3236\">",
439 " <stop id=\"stop3244\" offset=\"0\" style=\"stop-color:#f4f4f4;stop-opacity:1\"/>",
439 " <stop id=\"stop3244\" offset=\"0\" style=\"stop-color:#f4f4f4;stop-opacity:1\"/>",
440 " <stop id=\"stop3240\" offset=\"1\" style=\"stop-color:#ffffff;stop-opacity:1\"/>",
440 " <stop id=\"stop3240\" offset=\"1\" style=\"stop-color:#ffffff;stop-opacity:1\"/>",
441 " </linearGradient>",
441 " </linearGradient>",
442 " <linearGradient id=\"linearGradient4671\">",
442 " <linearGradient id=\"linearGradient4671\">",
443 " <stop id=\"stop4673\" offset=\"0\" style=\"stop-color:#ffd43b;stop-opacity:1\"/>",
443 " <stop id=\"stop4673\" offset=\"0\" style=\"stop-color:#ffd43b;stop-opacity:1\"/>",
444 " <stop id=\"stop4675\" offset=\"1\" style=\"stop-color:#ffe873;stop-opacity:1\"/>",
444 " <stop id=\"stop4675\" offset=\"1\" style=\"stop-color:#ffe873;stop-opacity:1\"/>",
445 " </linearGradient>",
445 " </linearGradient>",
446 " <linearGradient id=\"linearGradient4689\">",
446 " <linearGradient id=\"linearGradient4689\">",
447 " <stop id=\"stop4691\" offset=\"0\" style=\"stop-color:#5a9fd4;stop-opacity:1\"/>",
447 " <stop id=\"stop4691\" offset=\"0\" style=\"stop-color:#5a9fd4;stop-opacity:1\"/>",
448 " <stop id=\"stop4693\" offset=\"1\" style=\"stop-color:#306998;stop-opacity:1\"/>",
448 " <stop id=\"stop4693\" offset=\"1\" style=\"stop-color:#306998;stop-opacity:1\"/>",
449 " </linearGradient>",
449 " </linearGradient>",
450 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2987\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
450 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2987\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
451 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2990\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
451 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2990\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
452 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2587\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
452 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2587\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
453 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2589\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
453 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2589\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
454 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2248\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
454 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2248\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
455 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2250\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
455 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2250\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
456 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2255\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
456 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2255\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
457 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2258\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"76.176224\" y2=\"76.313133\"/>",
457 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2258\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"76.176224\" y2=\"76.313133\"/>",
458 " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(1,0,0,0.177966,0,108.7434)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient2801\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>",
458 " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(1,0,0,0.177966,0,108.7434)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient2801\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>",
459 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1475\" x1=\"150.96111\" x2=\"112.03144\" xlink:href=\"#linearGradient4671\" y1=\"192.35176\" y2=\"137.27299\"/>",
459 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1475\" x1=\"150.96111\" x2=\"112.03144\" xlink:href=\"#linearGradient4671\" y1=\"192.35176\" y2=\"137.27299\"/>",
460 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1478\" x1=\"26.648937\" x2=\"135.66525\" xlink:href=\"#linearGradient4689\" y1=\"20.603781\" y2=\"114.39767\"/>",
460 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1478\" x1=\"26.648937\" x2=\"135.66525\" xlink:href=\"#linearGradient4689\" y1=\"20.603781\" y2=\"114.39767\"/>",
461 " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient1480\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>",
461 " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient1480\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>",
462 " </defs>",
462 " </defs>",
463 " <g id=\"g2303\">",
463 " <g id=\"g2303\">",
464 " <path d=\"M 184.61344,61.929363 C 184.61344,47.367213 180.46118,39.891193 172.15666,39.481813 C 168.85239,39.325863 165.62611,39.852203 162.48754,41.070593 C 159.98254,41.967323 158.2963,42.854313 157.40931,43.751043 L 157.40931,78.509163 C 162.72147,81.842673 167.43907,83.392453 171.55234,83.148783 C 180.25649,82.573703 184.61344,75.507063 184.61344,61.929363 z M 194.85763,62.533683 C 194.85763,69.931723 193.12265,76.072393 189.63319,80.955683 C 185.7441,86.482283 180.35396,89.328433 173.46277,89.484393 C 168.26757,89.650093 162.91642,88.022323 157.40931,84.610843 L 157.40931,116.20116 L 148.50047,113.02361 L 148.50047,42.903043 C 149.96253,41.109583 151.84372,39.569543 154.12454,38.263433 C 159.42696,35.173603 165.86978,33.584823 173.45302,33.506853 L 173.57973,33.633563 C 180.50991,33.545833 185.85132,36.391993 189.60395,42.162263 C 193.10315,47.454933 194.85763,54.238913 194.85763,62.533683 z \" id=\"path46\" style=\"fill:#646464;fill-opacity:1\"/>",
464 " <path d=\"M 184.61344,61.929363 C 184.61344,47.367213 180.46118,39.891193 172.15666,39.481813 C 168.85239,39.325863 165.62611,39.852203 162.48754,41.070593 C 159.98254,41.967323 158.2963,42.854313 157.40931,43.751043 L 157.40931,78.509163 C 162.72147,81.842673 167.43907,83.392453 171.55234,83.148783 C 180.25649,82.573703 184.61344,75.507063 184.61344,61.929363 z M 194.85763,62.533683 C 194.85763,69.931723 193.12265,76.072393 189.63319,80.955683 C 185.7441,86.482283 180.35396,89.328433 173.46277,89.484393 C 168.26757,89.650093 162.91642,88.022323 157.40931,84.610843 L 157.40931,116.20116 L 148.50047,113.02361 L 148.50047,42.903043 C 149.96253,41.109583 151.84372,39.569543 154.12454,38.263433 C 159.42696,35.173603 165.86978,33.584823 173.45302,33.506853 L 173.57973,33.633563 C 180.50991,33.545833 185.85132,36.391993 189.60395,42.162263 C 193.10315,47.454933 194.85763,54.238913 194.85763,62.533683 z \" id=\"path46\" style=\"fill:#646464;fill-opacity:1\"/>",
465 " <path d=\"M 249.30487,83.265743 C 249.30487,93.188283 248.31067,100.05998 246.32227,103.88084 C 244.32411,107.7017 240.52275,110.75254 234.90842,113.02361 C 230.35653,114.81707 225.43425,115.79178 220.15133,115.95748 L 218.67952,110.34316 C 224.05016,109.61213 227.83204,108.88109 230.02513,108.15006 C 234.34309,106.688 237.30621,104.44617 238.93397,101.44406 C 240.24008,98.997543 240.88339,94.328693 240.88339,87.418003 L 240.88339,85.098203 C 234.79146,87.866373 228.40711,89.240713 221.73036,89.240713 C 217.34417,89.240713 213.47457,87.866373 210.14107,85.098203 C 206.39818,82.086343 204.52674,78.265483 204.52674,73.635623 L 204.52674,36.557693 L 213.43558,33.506853 L 213.43558,70.828453 C 213.43558,74.815013 214.7222,77.885353 217.29543,80.039463 C 219.86866,82.193563 223.20217,83.226753 227.2862,83.148783 C 231.37023,83.061053 235.74667,81.482023 240.39603,78.392203 L 240.39603,34.851953 L 249.30487,34.851953 L 249.30487,83.265743 z \" id=\"path48\" style=\"fill:#646464;fill-opacity:1\"/>",
465 " <path d=\"M 249.30487,83.265743 C 249.30487,93.188283 248.31067,100.05998 246.32227,103.88084 C 244.32411,107.7017 240.52275,110.75254 234.90842,113.02361 C 230.35653,114.81707 225.43425,115.79178 220.15133,115.95748 L 218.67952,110.34316 C 224.05016,109.61213 227.83204,108.88109 230.02513,108.15006 C 234.34309,106.688 237.30621,104.44617 238.93397,101.44406 C 240.24008,98.997543 240.88339,94.328693 240.88339,87.418003 L 240.88339,85.098203 C 234.79146,87.866373 228.40711,89.240713 221.73036,89.240713 C 217.34417,89.240713 213.47457,87.866373 210.14107,85.098203 C 206.39818,82.086343 204.52674,78.265483 204.52674,73.635623 L 204.52674,36.557693 L 213.43558,33.506853 L 213.43558,70.828453 C 213.43558,74.815013 214.7222,77.885353 217.29543,80.039463 C 219.86866,82.193563 223.20217,83.226753 227.2862,83.148783 C 231.37023,83.061053 235.74667,81.482023 240.39603,78.392203 L 240.39603,34.851953 L 249.30487,34.851953 L 249.30487,83.265743 z \" id=\"path48\" style=\"fill:#646464;fill-opacity:1\"/>",
466 " <path d=\"M 284.08249,88.997033 C 283.02006,89.084753 282.04535,89.123743 281.14862,89.123743 C 276.10937,89.123743 272.18129,87.924853 269.37413,85.517323 C 266.57671,83.109793 265.17314,79.786033 265.17314,75.546053 L 265.17314,40.456523 L 259.07146,40.456523 L 259.07146,34.851953 L 265.17314,34.851953 L 265.17314,19.968143 L 274.07223,16.800333 L 274.07223,34.851953 L 284.08249,34.851953 L 284.08249,40.456523 L 274.07223,40.456523 L 274.07223,75.302373 C 274.07223,78.645623 274.96896,81.014163 276.76243,82.398253 C 278.30247,83.538663 280.74899,84.191723 284.08249,84.357423 L 284.08249,88.997033 z \" id=\"path50\" style=\"fill:#646464;fill-opacity:1\"/>",
466 " <path d=\"M 284.08249,88.997033 C 283.02006,89.084753 282.04535,89.123743 281.14862,89.123743 C 276.10937,89.123743 272.18129,87.924853 269.37413,85.517323 C 266.57671,83.109793 265.17314,79.786033 265.17314,75.546053 L 265.17314,40.456523 L 259.07146,40.456523 L 259.07146,34.851953 L 265.17314,34.851953 L 265.17314,19.968143 L 274.07223,16.800333 L 274.07223,34.851953 L 284.08249,34.851953 L 284.08249,40.456523 L 274.07223,40.456523 L 274.07223,75.302373 C 274.07223,78.645623 274.96896,81.014163 276.76243,82.398253 C 278.30247,83.538663 280.74899,84.191723 284.08249,84.357423 L 284.08249,88.997033 z \" id=\"path50\" style=\"fill:#646464;fill-opacity:1\"/>",
467 " <path d=\"M 338.02288,88.266003 L 329.11404,88.266003 L 329.11404,53.878273 C 329.11404,50.379063 328.29528,47.367213 326.66753,44.852463 C 324.78634,42.006313 322.17411,40.583233 318.82112,40.583233 C 314.73708,40.583233 309.6296,42.737343 303.4987,47.045563 L 303.4987,88.266003 L 294.58985,88.266003 L 294.58985,6.0687929 L 303.4987,3.2616329 L 303.4987,40.700203 C 309.191,36.557693 315.40963,34.481563 322.16436,34.481563 C 326.88196,34.481563 330.70282,36.070333 333.62694,39.238143 C 336.56082,42.405943 338.02288,46.353513 338.02288,51.071103 L 338.02288,88.266003 L 338.02288,88.266003 z \" id=\"path52\" style=\"fill:#646464;fill-opacity:1\"/>",
467 " <path d=\"M 338.02288,88.266003 L 329.11404,88.266003 L 329.11404,53.878273 C 329.11404,50.379063 328.29528,47.367213 326.66753,44.852463 C 324.78634,42.006313 322.17411,40.583233 318.82112,40.583233 C 314.73708,40.583233 309.6296,42.737343 303.4987,47.045563 L 303.4987,88.266003 L 294.58985,88.266003 L 294.58985,6.0687929 L 303.4987,3.2616329 L 303.4987,40.700203 C 309.191,36.557693 315.40963,34.481563 322.16436,34.481563 C 326.88196,34.481563 330.70282,36.070333 333.62694,39.238143 C 336.56082,42.405943 338.02288,46.353513 338.02288,51.071103 L 338.02288,88.266003 L 338.02288,88.266003 z \" id=\"path52\" style=\"fill:#646464;fill-opacity:1\"/>",
468 " <path d=\"M 385.37424,60.525783 C 385.37424,54.930953 384.31182,50.310833 382.19669,46.655673 C 379.68195,42.201253 375.77337,39.852203 370.49044,39.608523 C 360.72386,40.173863 355.85032,47.172273 355.85032,60.584263 C 355.85032,66.734683 356.86401,71.871393 358.91089,75.994413 C 361.52312,81.248093 365.44145,83.840823 370.66589,83.753103 C 380.47146,83.675123 385.37424,75.935933 385.37424,60.525783 z M 395.13109,60.584263 C 395.13109,68.547643 393.09395,75.175663 389.02941,80.468333 C 384.5555,86.394563 378.37584,89.367423 370.49044,89.367423 C 362.67328,89.367423 356.58135,86.394563 352.18541,80.468333 C 348.19885,75.175663 346.21044,68.547643 346.21044,60.584263 C 346.21044,53.098503 348.36455,46.801883 352.67276,41.674913 C 357.22466,36.236033 363.20937,33.506853 370.6074,33.506853 C 378.00545,33.506853 384.02914,36.236033 388.66877,41.674913 C 392.97697,46.801883 395.13109,53.098503 395.13109,60.584263 z \" id=\"path54\" style=\"fill:#646464;fill-opacity:1\"/>",
468 " <path d=\"M 385.37424,60.525783 C 385.37424,54.930953 384.31182,50.310833 382.19669,46.655673 C 379.68195,42.201253 375.77337,39.852203 370.49044,39.608523 C 360.72386,40.173863 355.85032,47.172273 355.85032,60.584263 C 355.85032,66.734683 356.86401,71.871393 358.91089,75.994413 C 361.52312,81.248093 365.44145,83.840823 370.66589,83.753103 C 380.47146,83.675123 385.37424,75.935933 385.37424,60.525783 z M 395.13109,60.584263 C 395.13109,68.547643 393.09395,75.175663 389.02941,80.468333 C 384.5555,86.394563 378.37584,89.367423 370.49044,89.367423 C 362.67328,89.367423 356.58135,86.394563 352.18541,80.468333 C 348.19885,75.175663 346.21044,68.547643 346.21044,60.584263 C 346.21044,53.098503 348.36455,46.801883 352.67276,41.674913 C 357.22466,36.236033 363.20937,33.506853 370.6074,33.506853 C 378.00545,33.506853 384.02914,36.236033 388.66877,41.674913 C 392.97697,46.801883 395.13109,53.098503 395.13109,60.584263 z \" id=\"path54\" style=\"fill:#646464;fill-opacity:1\"/>",
469 " <path d=\"M 446.20583,88.266003 L 437.29699,88.266003 L 437.29699,51.928853 C 437.29699,47.942293 436.0981,44.832973 433.70032,42.591133 C 431.30253,40.359053 428.10549,39.277123 424.11893,39.364853 C 419.8887,39.442833 415.86314,40.826913 412.04229,43.507363 L 412.04229,88.266003 L 403.13345,88.266003 L 403.13345,42.405943 C 408.26042,38.672813 412.97801,36.236033 417.28621,35.095623 C 421.35076,34.033193 424.93769,33.506853 428.02752,33.506853 C 430.14264,33.506853 432.13104,33.711543 434.00248,34.120913 C 437.50169,34.929923 440.34783,36.430973 442.54093,38.633823 C 444.98744,41.070593 446.20583,43.994723 446.20583,47.415943 L 446.20583,88.266003 z \" id=\"path56\" style=\"fill:#646464;fill-opacity:1\"/>",
469 " <path d=\"M 446.20583,88.266003 L 437.29699,88.266003 L 437.29699,51.928853 C 437.29699,47.942293 436.0981,44.832973 433.70032,42.591133 C 431.30253,40.359053 428.10549,39.277123 424.11893,39.364853 C 419.8887,39.442833 415.86314,40.826913 412.04229,43.507363 L 412.04229,88.266003 L 403.13345,88.266003 L 403.13345,42.405943 C 408.26042,38.672813 412.97801,36.236033 417.28621,35.095623 C 421.35076,34.033193 424.93769,33.506853 428.02752,33.506853 C 430.14264,33.506853 432.13104,33.711543 434.00248,34.120913 C 437.50169,34.929923 440.34783,36.430973 442.54093,38.633823 C 444.98744,41.070593 446.20583,43.994723 446.20583,47.415943 L 446.20583,88.266003 z \" id=\"path56\" style=\"fill:#646464;fill-opacity:1\"/>",
470 " <path d=\"M 60.510156,6.3979729 C 55.926503,6.4192712 51.549217,6.8101906 47.697656,7.4917229 C 36.35144,9.4962267 34.291407,13.691825 34.291406,21.429223 L 34.291406,31.647973 L 61.103906,31.647973 L 61.103906,35.054223 L 34.291406,35.054223 L 24.228906,35.054223 C 16.436447,35.054223 9.6131468,39.73794 7.4789058,48.647973 C 5.0170858,58.860939 4.9078907,65.233996 7.4789058,75.897973 C 9.3848341,83.835825 13.936449,89.491721 21.728906,89.491723 L 30.947656,89.491723 L 30.947656,77.241723 C 30.947656,68.391821 38.6048,60.585475 47.697656,60.585473 L 74.478906,60.585473 C 81.933857,60.585473 87.885159,54.447309 87.885156,46.960473 L 87.885156,21.429223 C 87.885156,14.162884 81.755176,8.7044455 74.478906,7.4917229 C 69.872919,6.7249976 65.093809,6.3766746 60.510156,6.3979729 z M 46.010156,14.616723 C 48.779703,14.616723 51.041406,16.915369 51.041406,19.741723 C 51.041404,22.558059 48.779703,24.835473 46.010156,24.835473 C 43.23068,24.835472 40.978906,22.558058 40.978906,19.741723 C 40.978905,16.91537 43.23068,14.616723 46.010156,14.616723 z \" id=\"path1948\" style=\"fill:url(#linearGradient1478);fill-opacity:1\"/>",
470 " <path d=\"M 60.510156,6.3979729 C 55.926503,6.4192712 51.549217,6.8101906 47.697656,7.4917229 C 36.35144,9.4962267 34.291407,13.691825 34.291406,21.429223 L 34.291406,31.647973 L 61.103906,31.647973 L 61.103906,35.054223 L 34.291406,35.054223 L 24.228906,35.054223 C 16.436447,35.054223 9.6131468,39.73794 7.4789058,48.647973 C 5.0170858,58.860939 4.9078907,65.233996 7.4789058,75.897973 C 9.3848341,83.835825 13.936449,89.491721 21.728906,89.491723 L 30.947656,89.491723 L 30.947656,77.241723 C 30.947656,68.391821 38.6048,60.585475 47.697656,60.585473 L 74.478906,60.585473 C 81.933857,60.585473 87.885159,54.447309 87.885156,46.960473 L 87.885156,21.429223 C 87.885156,14.162884 81.755176,8.7044455 74.478906,7.4917229 C 69.872919,6.7249976 65.093809,6.3766746 60.510156,6.3979729 z M 46.010156,14.616723 C 48.779703,14.616723 51.041406,16.915369 51.041406,19.741723 C 51.041404,22.558059 48.779703,24.835473 46.010156,24.835473 C 43.23068,24.835472 40.978906,22.558058 40.978906,19.741723 C 40.978905,16.91537 43.23068,14.616723 46.010156,14.616723 z \" id=\"path1948\" style=\"fill:url(#linearGradient1478);fill-opacity:1\"/>",
471 " <path d=\"M 91.228906,35.054223 L 91.228906,46.960473 C 91.228906,56.191228 83.403011,63.960472 74.478906,63.960473 L 47.697656,63.960473 C 40.361823,63.960473 34.291407,70.238956 34.291406,77.585473 L 34.291406,103.11672 C 34.291406,110.38306 40.609994,114.65704 47.697656,116.74172 C 56.184987,119.23733 64.323893,119.68835 74.478906,116.74172 C 81.229061,114.78733 87.885159,110.85411 87.885156,103.11672 L 87.885156,92.897973 L 61.103906,92.897973 L 61.103906,89.491723 L 87.885156,89.491723 L 101.29141,89.491723 C 109.08387,89.491723 111.98766,84.056315 114.69765,75.897973 C 117.49698,67.499087 117.37787,59.422197 114.69765,48.647973 C 112.77187,40.890532 109.09378,35.054223 101.29141,35.054223 L 91.228906,35.054223 z M 76.166406,99.710473 C 78.945884,99.710476 81.197656,101.98789 81.197656,104.80422 C 81.197654,107.63057 78.945881,109.92922 76.166406,109.92922 C 73.396856,109.92922 71.135156,107.63057 71.135156,104.80422 C 71.135158,101.98789 73.396853,99.710473 76.166406,99.710473 z \" id=\"path1950\" style=\"fill:url(#linearGradient1475);fill-opacity:1\"/>",
471 " <path d=\"M 91.228906,35.054223 L 91.228906,46.960473 C 91.228906,56.191228 83.403011,63.960472 74.478906,63.960473 L 47.697656,63.960473 C 40.361823,63.960473 34.291407,70.238956 34.291406,77.585473 L 34.291406,103.11672 C 34.291406,110.38306 40.609994,114.65704 47.697656,116.74172 C 56.184987,119.23733 64.323893,119.68835 74.478906,116.74172 C 81.229061,114.78733 87.885159,110.85411 87.885156,103.11672 L 87.885156,92.897973 L 61.103906,92.897973 L 61.103906,89.491723 L 87.885156,89.491723 L 101.29141,89.491723 C 109.08387,89.491723 111.98766,84.056315 114.69765,75.897973 C 117.49698,67.499087 117.37787,59.422197 114.69765,48.647973 C 112.77187,40.890532 109.09378,35.054223 101.29141,35.054223 L 91.228906,35.054223 z M 76.166406,99.710473 C 78.945884,99.710476 81.197656,101.98789 81.197656,104.80422 C 81.197654,107.63057 78.945881,109.92922 76.166406,109.92922 C 73.396856,109.92922 71.135156,107.63057 71.135156,104.80422 C 71.135158,101.98789 73.396853,99.710473 76.166406,99.710473 z \" id=\"path1950\" style=\"fill:url(#linearGradient1475);fill-opacity:1\"/>",
472 " <path d=\"M 463.5544,26.909383 L 465.11635,26.909383 L 465.11635,17.113143 L 468.81648,17.113143 L 468.81648,15.945483 L 459.85427,15.945483 L 459.85427,17.113143 L 463.5544,17.113143 L 463.5544,26.909383 M 470.20142,26.909383 L 471.53589,26.909383 L 471.53589,17.962353 L 474.4323,26.908259 L 475.91799,26.908259 L 478.93615,17.992683 L 478.93615,26.909383 L 480.39194,26.909383 L 480.39194,15.945483 L 478.46605,15.945483 L 475.16774,25.33834 L 472.35477,15.945483 L 470.20142,15.945483 L 470.20142,26.909383\" id=\"text3004\" style=\"font-size:15.16445827px;font-style:normal;font-weight:normal;line-height:125%;fill:#646464;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans\"/>",
472 " <path d=\"M 463.5544,26.909383 L 465.11635,26.909383 L 465.11635,17.113143 L 468.81648,17.113143 L 468.81648,15.945483 L 459.85427,15.945483 L 459.85427,17.113143 L 463.5544,17.113143 L 463.5544,26.909383 M 470.20142,26.909383 L 471.53589,26.909383 L 471.53589,17.962353 L 474.4323,26.908259 L 475.91799,26.908259 L 478.93615,17.992683 L 478.93615,26.909383 L 480.39194,26.909383 L 480.39194,15.945483 L 478.46605,15.945483 L 475.16774,25.33834 L 472.35477,15.945483 L 470.20142,15.945483 L 470.20142,26.909383\" id=\"text3004\" style=\"font-size:15.16445827px;font-style:normal;font-weight:normal;line-height:125%;fill:#646464;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans\"/>",
473 " <path d=\"M 110.46717 132.28575 A 48.948284 8.6066771 0 1 1 12.570599,132.28575 A 48.948284 8.6066771 0 1 1 110.46717 132.28575 z\" id=\"path1894\" style=\"opacity:0.44382019;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" transform=\"matrix(0.73406,0,0,0.809524,16.24958,27.00935)\"/>",
473 " <path d=\"M 110.46717 132.28575 A 48.948284 8.6066771 0 1 1 12.570599,132.28575 A 48.948284 8.6066771 0 1 1 110.46717 132.28575 z\" id=\"path1894\" style=\"opacity:0.44382019;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" transform=\"matrix(0.73406,0,0,0.809524,16.24958,27.00935)\"/>",
474 " </g>",
474 " </g>",
475 "</svg>"
475 "</svg>"
476 ],
476 ],
477 "text": [
477 "text": [
478 "&lt;IPython.core.display.SVG at 0x41d4910&gt;"
478 "&lt;IPython.core.display.SVG at 0x41d4910&gt;"
479 ]
479 ]
480 }
480 }
481 ],
481 ],
482 "prompt_number": 3
482 "prompt_number": 3
483 },
483 },
484 {
484 {
485 "cell_type": "markdown",
485 "cell_type": "markdown",
486 "source": [
486 "source": [
487 "### Video"
487 "### Video"
488 ]
488 ]
489 },
489 },
490 {
490 {
491 "cell_type": "markdown",
491 "cell_type": "markdown",
492 "source": [
492 "source": [
493 "And more exotic objects can also be displayed, as long as their representation supports ",
493 "And more exotic objects can also be displayed, as long as their representation supports ",
494 "the IPython display protocol.",
494 "the IPython display protocol.",
495 "",
495 "",
496 "For example, videos hosted externally on YouTube are easy to load (and writing a similar wrapper for other",
496 "For example, videos hosted externally on YouTube are easy to load (and writing a similar wrapper for other",
497 "hosted content is trivial):"
497 "hosted content is trivial):"
498 ]
498 ]
499 },
499 },
500 {
500 {
501 "cell_type": "code",
501 "cell_type": "code",
502 "collapsed": false,
502 "collapsed": false,
503 "input": [
503 "input": [
504 "from IPython.lib.display import YouTubeVideo",
504 "from IPython.lib.display import YouTubeVideo",
505 "# a talk about IPython at Sage Days at U. Washington, Seattle.",
505 "# a talk about IPython at Sage Days at U. Washington, Seattle.",
506 "# Video credit: William Stein.",
506 "# Video credit: William Stein.",
507 "YouTubeVideo('1j_HxD4iLn8')"
507 "YouTubeVideo('1j_HxD4iLn8')"
508 ],
508 ],
509 "language": "python",
509 "language": "python",
510 "outputs": [
510 "outputs": [
511 {
511 {
512 "html": [
512 "html": [
513 "",
513 "",
514 " <iframe",
514 " <iframe",
515 " width=\"400\"",
515 " width=\"400\"",
516 " height=\"300\"",
516 " height=\"300\"",
517 " src=\"http://www.youtube.com/embed/1j_HxD4iLn8\"",
517 " src=\"http://www.youtube.com/embed/1j_HxD4iLn8\"",
518 " frameborder=\"0\"",
518 " frameborder=\"0\"",
519 " allowfullscreen",
519 " allowfullscreen",
520 " ></iframe>",
520 " ></iframe>",
521 " "
521 " "
522 ],
522 ],
523 "output_type": "pyout",
523 "output_type": "pyout",
524 "prompt_number": 4,
524 "prompt_number": 4,
525 "text": [
525 "text": [
526 "&lt;IPython.lib.display.YouTubeVideo at 0x41d4310&gt;"
526 "&lt;IPython.lib.display.YouTubeVideo at 0x41d4310&gt;"
527 ]
527 ]
528 }
528 }
529 ],
529 ],
530 "prompt_number": 4
530 "prompt_number": 4
531 },
531 },
532 {
532 {
533 "cell_type": "markdown",
533 "cell_type": "markdown",
534 "source": [
534 "source": [
535 "Using the nascent video capabilities of modern browsers, you may also be able to display local",
535 "Using the nascent video capabilities of modern browsers, you may also be able to display local",
536 "videos. At the moment this doesn't work very well in all browsers, so it may or may not work for you;",
536 "videos. At the moment this doesn't work very well in all browsers, so it may or may not work for you;",
537 "we will continue testing this and looking for ways to make it more robust. ",
537 "we will continue testing this and looking for ways to make it more robust. ",
538 "",
538 "",
539 "The following cell loads a local file called `animation.m4v`, encodes the raw video as base64 for http",
539 "The following cell loads a local file called `animation.m4v`, encodes the raw video as base64 for http",
540 "transport, and uses the HTML5 video tag to load it. On Chrome 15 it works correctly, displaying a control",
540 "transport, and uses the HTML5 video tag to load it. On Chrome 15 it works correctly, displaying a control",
541 "bar at the bottom with a play/pause button and a location slider."
541 "bar at the bottom with a play/pause button and a location slider."
542 ]
542 ]
543 },
543 },
544 {
544 {
545 "cell_type": "code",
545 "cell_type": "code",
546 "collapsed": false,
546 "collapsed": false,
547 "input": [
547 "input": [
548 "from IPython.core.display import HTML",
548 "from IPython.core.display import HTML",
549 "video = open(\"animation.m4v\", \"rb\").read()",
549 "video = open(\"animation.m4v\", \"rb\").read()",
550 "video_encoded = video.encode(\"base64\")",
550 "video_encoded = video.encode(\"base64\")",
551 "video_tag = '<video controls alt=\"test\" src=\"data:video/x-m4v;base64,{0}\">'.format(video_encoded)",
551 "video_tag = '<video controls alt=\"test\" src=\"data:video/x-m4v;base64,{0}\">'.format(video_encoded)",
552 "HTML(data=video_tag)"
552 "HTML(data=video_tag)"
553 ],
553 ],
554 "language": "python",
554 "language": "python",
555 "outputs": [
555 "outputs": [
556 {
556 {
557 "html": [
557 "html": [
558 "<video controls alt=\"test\" src=\"data:video/x-m4v;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAqiW1kYXQAAAKMBgX//4jcRem9",
558 "<video controls alt=\"test\" src=\"data:video/x-m4v;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAqiW1kYXQAAAKMBgX//4jcRem9",
559 "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTE4IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv",
559 "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTE4IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv",
560 "cHlsZWZ0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w",
560 "cHlsZWZ0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w",
561 "dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o",
561 "dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o",
562 "ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2",
562 "ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2",
563 "IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0",
563 "IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0",
564 "X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBu",
564 "X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBu",
565 "cj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9p",
565 "cj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9p",
566 "bnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEg",
566 "bnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEg",
567 "d2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBz",
567 "d2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBz",
568 "Y2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9",
568 "Y2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9",
569 "MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89",
569 "MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89",
570 "MS40MCBhcT0xOjEuMDAAgAAACqVliIQAV/0TAAI/3gU2tIW7KawwaCmQGTGHKmuYAAADACBcshU+",
570 "MS40MCBhcT0xOjEuMDAAgAAACqVliIQAV/0TAAI/3gU2tIW7KawwaCmQGTGHKmuYAAADACBcshU+",
571 "yICkgAA14AHowiEeT6ei7v7h3Hu0i2fpUBLGBIkbCMP3Vfz+9BVGCDXnw9Uv5o3iN030tb7eq6rs",
571 "yICkgAA14AHowiEeT6ei7v7h3Hu0i2fpUBLGBIkbCMP3Vfz+9BVGCDXnw9Uv5o3iN030tb7eq6rs",
572 "EEhHs2azbdTiE9Csz5Zm6SiUWRdmB43hbD5i6syATuODUJd7LM3d9cbFpc7zFlu5y3vUmNGd6urp",
572 "EEhHs2azbdTiE9Csz5Zm6SiUWRdmB43hbD5i6syATuODUJd7LM3d9cbFpc7zFlu5y3vUmNGd6urp",
573 "vKKT9iyleIyTuR1sVS431DhevGfkUllVeIznYUe2USoMW1tufETjyRdmGldN6eNlhAOsGAH4z+Hk",
573 "vKKT9iyleIyTuR1sVS431DhevGfkUllVeIznYUe2USoMW1tufETjyRdmGldN6eNlhAOsGAH4z+Hk",
574 "rwKecPPU7Q5T4gDAIxj9hW84jVExMTSTHxkPTq1I4OotgUxURCGTsw60k/ezPNmNg38j1bqaGmPc",
574 "rwKecPPU7Q5T4gDAIxj9hW84jVExMTSTHxkPTq1I4OotgUxURCGTsw60k/ezPNmNg38j1bqaGmPc",
575 "ruDKEIBDsK5qEytFB90Q68s0h2wmlf2KXd5bleBefiK+/p47ZsyUO4IdlW25rRy+HLjt6wQXfYee",
575 "ruDKEIBDsK5qEytFB90Q68s0h2wmlf2KXd5bleBefiK+/p47ZsyUO4IdlW25rRy+HLjt6wQXfYee",
576 "3IkiQOoOK+U7u/lxcl78zfxwIoEMjUUSKNZjkp8clnmecDDJ3Kz+viF7bPklk7N6QRyizAKPIIpn",
576 "3IkiQOoOK+U7u/lxcl78zfxwIoEMjUUSKNZjkp8clnmecDDJ3Kz+viF7bPklk7N6QRyizAKPIIpn",
577 "NJUuMWQmqeL2Or6cr4D0/0tOym+4tficxmhuEONKUtO2pPn3hRjMllkd12tXp70fLTfxy0dwB70M",
577 "NJUuMWQmqeL2Or6cr4D0/0tOym+4tficxmhuEONKUtO2pPn3hRjMllkd12tXp70fLTfxy0dwB70M",
578 "L9iLEcItHb7zVupHlP5RxdvecpREw+OsIPr9KWilIesNE19jgIbT+TkiRBjOoKvUuwcQnKg7fOTH",
578 "L9iLEcItHb7zVupHlP5RxdvecpREw+OsIPr9KWilIesNE19jgIbT+TkiRBjOoKvUuwcQnKg7fOTH",
579 "VoLvnKuAfea+oujEdm1Rwd2tEOnkF+ZC11WaNQsiNR/eJ9EnUXjXDYGfhB+Oe7qj8nYTT+eOXg1c",
579 "VoLvnKuAfea+oujEdm1Rwd2tEOnkF+ZC11WaNQsiNR/eJ9EnUXjXDYGfhB+Oe7qj8nYTT+eOXg1c",
580 "uJNgLXEs4vOheWEjQOqfIWMQc3DmTof5s0ksBmUQ3PQ+UHPxZSnmOEZB+j6xT3wbm7HGzDjWtSg1",
580 "uJNgLXEs4vOheWEjQOqfIWMQc3DmTof5s0ksBmUQ3PQ+UHPxZSnmOEZB+j6xT3wbm7HGzDjWtSg1",
581 "SjTxd1EiJ8xA4SIxxR8WIKLg+TwFxJNS7Laxq7Uglu3AkXe82P1JCdJX5PsbFbxuDbuJgakzRcTw",
581 "SjTxd1EiJ8xA4SIxxR8WIKLg+TwFxJNS7Laxq7Uglu3AkXe82P1JCdJX5PsbFbxuDbuJgakzRcTw",
582 "MLLSKCiizS/eCW0uJed/lev9yb80kKlVET4S219cn/zhkpeDV83cHYOr+sJQKDRk/Wh2c7fsuxfx",
582 "MLLSKCiizS/eCW0uJed/lev9yb80kKlVET4S219cn/zhkpeDV83cHYOr+sJQKDRk/Wh2c7fsuxfx",
583 "aEH/6reSmvFDsAnXAyPXliJ3G4VG3OkEM5K5WyGGrBizZbTrdGsBnzj5VSGGOJdCKuRrUluw/8es",
583 "aEH/6reSmvFDsAnXAyPXliJ3G4VG3OkEM5K5WyGGrBizZbTrdGsBnzj5VSGGOJdCKuRrUluw/8es",
584 "2vYRPs9BcTqAqvHk9M52SSIf+1T6L53EZP8VbtXB+G29CMW4xVCK/B/YDjaNmqMwJ61dapugjnWJ",
584 "2vYRPs9BcTqAqvHk9M52SSIf+1T6L53EZP8VbtXB+G29CMW4xVCK/B/YDjaNmqMwJ61dapugjnWJ",
585 "fqeXlGGa3Ch3aA7gi30T8PucNRBjLK3lF67ZDDvkWXRQXd+VMnKWHkBbCkQ/F/fMuNpHO3C00Y2p",
585 "fqeXlGGa3Ch3aA7gi30T8PucNRBjLK3lF67ZDDvkWXRQXd+VMnKWHkBbCkQ/F/fMuNpHO3C00Y2p",
586 "ljna1qImBhVMvPe0F7Qx7G/YyxLRzhyUU8e23HGzp0agtNJRbydbrPV+TqJMSifJMNcZIf8wkdnC",
586 "ljna1qImBhVMvPe0F7Qx7G/YyxLRzhyUU8e23HGzp0agtNJRbydbrPV+TqJMSifJMNcZIf8wkdnC",
587 "3/xdpcXnLf2Ye3Kbd0o7utciTG+q5h6WTEk+PaNbXLLA0YyZ2VnLTcyV1QTS76aNCbV9Q1/OQ7QU",
587 "3/xdpcXnLf2Ye3Kbd0o7utciTG+q5h6WTEk+PaNbXLLA0YyZ2VnLTcyV1QTS76aNCbV9Q1/OQ7QU",
588 "81Gg0hPa9aSiscGary6jLVwDQaik4zLsi7jPqgPVdup7pwx7uJDqRCVcVi5QoZFp/GHdex5sJTF6",
588 "81Gg0hPa9aSiscGary6jLVwDQaik4zLsi7jPqgPVdup7pwx7uJDqRCVcVi5QoZFp/GHdex5sJTF6",
589 "9A6sja69/NLkFIWNSIeRcuGahXpF+wZeYIrqJv975s1TKYKAvp1WtzgtgWNkcbzCtROqf8rPtlAI",
589 "9A6sja69/NLkFIWNSIeRcuGahXpF+wZeYIrqJv975s1TKYKAvp1WtzgtgWNkcbzCtROqf8rPtlAI",
590 "xkX8GLcEo9zfExyfimeXQ64qfFxEy0IMy2Hsxau9fSMqUnIjntuVVjCQtBL+94gx1RZLndE6wROV",
590 "xkX8GLcEo9zfExyfimeXQ64qfFxEy0IMy2Hsxau9fSMqUnIjntuVVjCQtBL+94gx1RZLndE6wROV",
591 "Tq/wHwHrQzo9QL9cpPqPFJjiZ/NGZIFuudS+wsBFe6Hu8Oitf5zToLqLdtU4Smwh4ne3JsiT9lOz",
591 "Tq/wHwHrQzo9QL9cpPqPFJjiZ/NGZIFuudS+wsBFe6Hu8Oitf5zToLqLdtU4Smwh4ne3JsiT9lOz",
592 "N+4PPw3VSx9l5FppVwdKUWELw1dYpCOppyVWlJ3YQ8H4FQQM8EcYMG9N3Bxu79y1J1ikuvuhMmLQ",
592 "N+4PPw3VSx9l5FppVwdKUWELw1dYpCOppyVWlJ3YQ8H4FQQM8EcYMG9N3Bxu79y1J1ikuvuhMmLQ",
593 "lehLTbguhbix74hd1VIQC8EjHmOZSSWbssulYwPbr6FF49tifk6PymJvulR9/u+2585HkRfbxveG",
593 "lehLTbguhbix74hd1VIQC8EjHmOZSSWbssulYwPbr6FF49tifk6PymJvulR9/u+2585HkRfbxveG",
594 "eWCz0ix1pIVfaNpESKmtLy/0mcbMg9hYDz2werz9oe0lT2BiMV6uAin6RaQcT8Vk9MPctfwae+gk",
594 "eWCz0ix1pIVfaNpESKmtLy/0mcbMg9hYDz2werz9oe0lT2BiMV6uAin6RaQcT8Vk9MPctfwae+gk",
595 "vtnZA/sOBk8MbpylaHqc0KIVHhhLFMNnkOFiucjtGo/JWTa/F6g8wWeow5ZuIJUORaYHWqegZbTg",
595 "vtnZA/sOBk8MbpylaHqc0KIVHhhLFMNnkOFiucjtGo/JWTa/F6g8wWeow5ZuIJUORaYHWqegZbTg",
596 "M9dCsYYsfZGjjVMuSlDIvpYvIvFFooGPC7Ye2Jfawmq4Ut7EL/nv/dyAd2HRc5msmUhzeu/XpX3r",
596 "M9dCsYYsfZGjjVMuSlDIvpYvIvFFooGPC7Ye2Jfawmq4Ut7EL/nv/dyAd2HRc5msmUhzeu/XpX3r",
597 "VlzRmf9/Qan8Dbve3QfW1Ym0o5J/KAc3z1VBho7JBr5PgCL68RiD9jZHN0VvsT4gzsEjNlW3D91U",
597 "VlzRmf9/Qan8Dbve3QfW1Ym0o5J/KAc3z1VBho7JBr5PgCL68RiD9jZHN0VvsT4gzsEjNlW3D91U",
598 "y4RduaodBFoNTzXwlfUYULBzdiTbH75l/UmVMC4TKeTWhNzw2UezaqeGd8at3WSY7W/VR3+hvZHD",
598 "y4RduaodBFoNTzXwlfUYULBzdiTbH75l/UmVMC4TKeTWhNzw2UezaqeGd8at3WSY7W/VR3+hvZHD",
599 "pkIjgKuNNH0DsCRa/Kk56XQoHIyvvUH/eNekNvziReqS4qgLnXUT4BRGt2BOtCifI6+X/DGHUOmW",
599 "pkIjgKuNNH0DsCRa/Kk56XQoHIyvvUH/eNekNvziReqS4qgLnXUT4BRGt2BOtCifI6+X/DGHUOmW",
600 "lX7TN5b4pw5U7jwfwshtbhGZM49T8JMk15Mzrc7tM6J11TYxb5R3mQhZ8TZumJ0bMJXPM69HFyih",
600 "lX7TN5b4pw5U7jwfwshtbhGZM49T8JMk15Mzrc7tM6J11TYxb5R3mQhZ8TZumJ0bMJXPM69HFyih",
601 "r5dJSEJMycxJVUh6NTQALUOoRTHIOwE+FpWI6feTv1SiZ0YpYe5DbkYJJbN7zAHbAKw25XvqR2mA",
601 "r5dJSEJMycxJVUh6NTQALUOoRTHIOwE+FpWI6feTv1SiZ0YpYe5DbkYJJbN7zAHbAKw25XvqR2mA",
602 "jQmOlsfX/tK8DPjP/8h5/xgAF4EUbj1tOnQCBQL8jk9vHtfsXncsprww4Z+P/Z/UrKifuFyEpBWN",
602 "jQmOlsfX/tK8DPjP/8h5/xgAF4EUbj1tOnQCBQL8jk9vHtfsXncsprww4Z+P/Z/UrKifuFyEpBWN",
603 "8kLpF7yywE2iYdDruV9+/qKR8rC9ozNKyqQNIwtxrzYkWpE5t8K7gG4JFnrHona/Rp8dOX6VW41+",
603 "8kLpF7yywE2iYdDruV9+/qKR8rC9ozNKyqQNIwtxrzYkWpE5t8K7gG4JFnrHona/Rp8dOX6VW41+",
604 "jb5LB1LEtE8MwjLp3RCUOq/+6yLzaOEgBTqzvEjDeFpg/u9DMHMr4/2TOchfjg7dl+uQ6Gsx+4Ia",
604 "jb5LB1LEtE8MwjLp3RCUOq/+6yLzaOEgBTqzvEjDeFpg/u9DMHMr4/2TOchfjg7dl+uQ6Gsx+4Ia",
605 "9W7vivG95027p25eKL0nHvx/OqmAQEZYJL/JO58lOj0zPdJxrQ5dZksjMISzVZNn7DsxqE3zgBBu",
605 "9W7vivG95027p25eKL0nHvx/OqmAQEZYJL/JO58lOj0zPdJxrQ5dZksjMISzVZNn7DsxqE3zgBBu",
606 "Nzk50R8lTK3U8P12QiOAQYSTeGlYlkvfeofrfO1AitEj02m9aUkxTFd1ZZJoLQT2d3zEU5PmE4lx",
606 "Nzk50R8lTK3U8P12QiOAQYSTeGlYlkvfeofrfO1AitEj02m9aUkxTFd1ZZJoLQT2d3zEU5PmE4lx",
607 "MVfL5ttNnIbqfcIU2RJKNWqdw77xfjfrNc/eNpRKPZ/6z50LzBprgjzBHRfKgSWWkDxHrX0aTbgw",
607 "MVfL5ttNnIbqfcIU2RJKNWqdw77xfjfrNc/eNpRKPZ/6z50LzBprgjzBHRfKgSWWkDxHrX0aTbgw",
608 "QFwd51+PoUWH4DkQg26uGslF5Hn3hB58+fkeLTosTANOIBNAeFZtTc4PIaLHw759zae7scY55xcT",
608 "QFwd51+PoUWH4DkQg26uGslF5Hn3hB58+fkeLTosTANOIBNAeFZtTc4PIaLHw759zae7scY55xcT",
609 "abzlilYIftst2RZ6ntsRC3zFxduCKvL6wLfYT+TiIWJn5P7sTwZwXuSzXY+9Q3xMZ5o4Xcpz6vD9",
609 "abzlilYIftst2RZ6ntsRC3zFxduCKvL6wLfYT+TiIWJn5P7sTwZwXuSzXY+9Q3xMZ5o4Xcpz6vD9",
610 "FtTjzS69iefEYt4pXiDrZUo4ePGiLeoIFIwYB/v6GXdmG5VLLk+eKbOc9AmsX2zmvqtcvDRGQbzu",
610 "FtTjzS69iefEYt4pXiDrZUo4ePGiLeoIFIwYB/v6GXdmG5VLLk+eKbOc9AmsX2zmvqtcvDRGQbzu",
611 "gXbH/kTH/lkNPBTmqN3ZJODUEXVohPEJ6th0xna0EVleB73Q3eNvaVUvhlJbjs3D/T17FRCebN7A",
611 "gXbH/kTH/lkNPBTmqN3ZJODUEXVohPEJ6th0xna0EVleB73Q3eNvaVUvhlJbjs3D/T17FRCebN7A",
612 "OXvzzbLE/I5kNfEmJcv4dxtIeo2uQ/z9ohSpiZzbDj1u40nJRyJxUK60wEv0nA9f/NuJ6/PEyU0b",
612 "OXvzzbLE/I5kNfEmJcv4dxtIeo2uQ/z9ohSpiZzbDj1u40nJRyJxUK60wEv0nA9f/NuJ6/PEyU0b",
613 "kK16z2KH12k3Lc4+1f5fawIzkK2qJRB4wnj8VHhUW9mbJhs9vgfFmU3xrXSShY67Ygb+gYNPxxtn",
613 "kK16z2KH12k3Lc4+1f5fawIzkK2qJRB4wnj8VHhUW9mbJhs9vgfFmU3xrXSShY67Ygb+gYNPxxtn",
614 "4K/9eTSwIA9fv/nR33lA2lZoXALRUTmOZIl3R0gAM5h6oX1y1thIyqViBK95VZc8Pvy7G3O90M9S",
614 "4K/9eTSwIA9fv/nR33lA2lZoXALRUTmOZIl3R0gAM5h6oX1y1thIyqViBK95VZc8Pvy7G3O90M9S",
615 "4zkpyFQ36jrMazvMveMA4d39fvoaC7p90quiJfjI4yrl+ECVkCJL5MxRSa+iVcIL7Xbl0jVaGhZI",
615 "4zkpyFQ36jrMazvMveMA4d39fvoaC7p90quiJfjI4yrl+ECVkCJL5MxRSa+iVcIL7Xbl0jVaGhZI",
616 "cMYmcGOBbLzhJgloM1x1zFnnj3ggJRFAM8yNnXxhavk+mA18JC+y3lqGsp6vPReRxGlGHMou17L4",
616 "cMYmcGOBbLzhJgloM1x1zFnnj3ggJRFAM8yNnXxhavk+mA18JC+y3lqGsp6vPReRxGlGHMou17L4",
617 "It070LzkoeCzarpv8Apw59smdS5KN9qVN1WgeL7OSN8BHg94ubCvS7DW6H3/PbtRB62jFLsBhUV5",
617 "It070LzkoeCzarpv8Apw59smdS5KN9qVN1WgeL7OSN8BHg94ubCvS7DW6H3/PbtRB62jFLsBhUV5",
618 "YqCIbIN5VZ81AAACpUGaIWxFfwAru8x8uT3FuOjrAeSWXmAWqq9jCNGE+N5AOv//9//xjk4uBAcA",
618 "YqCIbIN5VZ81AAACpUGaIWxFfwAru8x8uT3FuOjrAeSWXmAWqq9jCNGE+N5AOv//9//xjk4uBAcA",
619 "DN96c97AVGmzRtnWwPsgcCbLrVdQJgbKp4QSmPwQnVhv0hXyBjeFWWlcvx70urEN3FK6/lvk2tQe",
619 "DN96c97AVGmzRtnWwPsgcCbLrVdQJgbKp4QSmPwQnVhv0hXyBjeFWWlcvx70urEN3FK6/lvk2tQe",
620 "ZgbtlbzXluvTfnSj/Ctz7vZ+O1FjhDzzdpL7uLzewzCIW5VWLAEKUVuS2J6wNk6MR7UblcEd4EtO",
620 "ZgbtlbzXluvTfnSj/Ctz7vZ+O1FjhDzzdpL7uLzewzCIW5VWLAEKUVuS2J6wNk6MR7UblcEd4EtO",
621 "Y+R4/qJgfojCsfRvA0oC5dc41Vd0erZbSkrmPTjLCn815bxlchUJMS8gQD5hJNwoKHvNLNwn7XKu",
621 "Y+R4/qJgfojCsfRvA0oC5dc41Vd0erZbSkrmPTjLCn815bxlchUJMS8gQD5hJNwoKHvNLNwn7XKu",
622 "TtYIhH2wVNZvDWgzCjlPeQajnrcMsb6bZYJvNJU8HuGHvm50r7VG8qifEwmuyegAZXojh5Ul5Vvj",
622 "TtYIhH2wVNZvDWgzCjlPeQajnrcMsb6bZYJvNJU8HuGHvm50r7VG8qifEwmuyegAZXojh5Ul5Vvj",
623 "DW7kSAZyw8a7I6mHY3FZHd+OA3V4JZMbNliI3Tj1L6+MKTmilVialmyZagRtEMeKRdtxUPd3vVEt",
623 "DW7kSAZyw8a7I6mHY3FZHd+OA3V4JZMbNliI3Tj1L6+MKTmilVialmyZagRtEMeKRdtxUPd3vVEt",
624 "rOBVIVYWdgAGA7HmZiHQUQNxLkWxbLyWVlrh5EM0Do2NdbclHxxArz90d+MSVeUOIXQ/4V9quq8C",
624 "rOBVIVYWdgAGA7HmZiHQUQNxLkWxbLyWVlrh5EM0Do2NdbclHxxArz90d+MSVeUOIXQ/4V9quq8C",
625 "8qVflo1gPtPMkjO2/UrdOYqhY404ReObOu/fdp4hAEDq6jhy64vOeT7XUK/Onq0rXTldtA6kvgQa",
625 "8qVflo1gPtPMkjO2/UrdOYqhY404ReObOu/fdp4hAEDq6jhy64vOeT7XUK/Onq0rXTldtA6kvgQa",
626 "Jg+mgYSR9hfXtMbOUSLgLj/RmBSO8aAMHuJJZqf1tCM5pZ9eYUsrHmy+/z2NGalon0//uF6+33bQ",
626 "Jg+mgYSR9hfXtMbOUSLgLj/RmBSO8aAMHuJJZqf1tCM5pZ9eYUsrHmy+/z2NGalon0//uF6+33bQ",
627 "zT/RLRfBbYTjy9QrJqHLlw46lggWPGkHuPKSqk/CB7U4pNPXUbR0DdcJy9Db00wCzVzxVc6h7jfC",
627 "zT/RLRfBbYTjy9QrJqHLlw46lggWPGkHuPKSqk/CB7U4pNPXUbR0DdcJy9Db00wCzVzxVc6h7jfC",
628 "FgiL2Y0HVqd6bgIaVUqn/gJCEyCDVplnzebv0gg3XwMJAGu639lHu7rEvxTp1smIYjWp9R5L4Ssp",
628 "FgiL2Y0HVqd6bgIaVUqn/gJCEyCDVplnzebv0gg3XwMJAGu639lHu7rEvxTp1smIYjWp9R5L4Ssp",
629 "VvS07Nb+Smk1FgsMp1K3EMUT8X2Fty4VG54/Ec6bE8tNVw4/QV1VzBw7Px2/2eEhhUS+FMfbHAlD",
629 "VvS07Nb+Smk1FgsMp1K3EMUT8X2Fty4VG54/Ec6bE8tNVw4/QV1VzBw7Px2/2eEhhUS+FMfbHAlD",
630 "28x00jRgAAACW0GaQjwhkymEVwArOUkEOhoFqiELtH8wgecFLiUq6WqmwAP7iGEwbYzfnHacfqUN",
630 "28x00jRgAAACW0GaQjwhkymEVwArOUkEOhoFqiELtH8wgecFLiUq6WqmwAP7iGEwbYzfnHacfqUN",
631 "XAfD+CGR2ap0lAHL25ipuYtd5j2O0PU/MpaWPG/n2y5OkfTzaOpotaR5tWjN55B2XblVVqsFfBC/",
631 "XAfD+CGR2ap0lAHL25ipuYtd5j2O0PU/MpaWPG/n2y5OkfTzaOpotaR5tWjN55B2XblVVqsFfBC/",
632 "mvsiPvCBWUHFChacdY5whj5mP5rqQ0dqLJCsWjrs4TWnIbL2V/Iwfj3hwI35jfo1JkTOeR+8GhOd",
632 "mvsiPvCBWUHFChacdY5whj5mP5rqQ0dqLJCsWjrs4TWnIbL2V/Iwfj3hwI35jfo1JkTOeR+8GhOd",
633 "ma9rgiKWafCbQyhYMTDmVdvhND60Flm97EDSTjF0OC+0gD9b8Yn4tNeHipCa/aWyt0n79bMmjfcj",
633 "ma9rgiKWafCbQyhYMTDmVdvhND60Flm97EDSTjF0OC+0gD9b8Yn4tNeHipCa/aWyt0n79bMmjfcj",
634 "ntBCPjrcB5ecRTpfGHbEHy1IRj2cjkGXKC+VYoYJXBp4rd4cMd8ygLCk5nBSd8/cTaKNRjdBscOe",
634 "ntBCPjrcB5ecRTpfGHbEHy1IRj2cjkGXKC+VYoYJXBp4rd4cMd8ygLCk5nBSd8/cTaKNRjdBscOe",
635 "TXG6QEjSxj9/2pVwx9DMRVtWQR0BSaAcQcZ8W2KPSaeRC4QwmNMu2xx25CSyrDiq2rFSK/JJtmvo",
635 "TXG6QEjSxj9/2pVwx9DMRVtWQR0BSaAcQcZ8W2KPSaeRC4QwmNMu2xx25CSyrDiq2rFSK/JJtmvo",
636 "IjAKq0ciEXoOgw+Ke+Ylb7ULKCS3k1p/613UNRp450uSq5b7CAHo7S0b7fBMLfNmwSjRYEhLlo0H",
636 "IjAKq0ciEXoOgw+Ke+Ylb7ULKCS3k1p/613UNRp450uSq5b7CAHo7S0b7fBMLfNmwSjRYEhLlo0H",
637 "UaRe/I+IX2Z6XdZH9Hty/399ZA1PwZGC6EfvUJIf7CBeaxv7cu6IT2/s0zPRGthpvXpYw6A7P4Ww",
637 "UaRe/I+IX2Z6XdZH9Hty/399ZA1PwZGC6EfvUJIf7CBeaxv7cu6IT2/s0zPRGthpvXpYw6A7P4Ww",
638 "z5C4V98KnIUNUanadqabKP6eXWhvbvcQHxAjiOOiKZgXZplZW2g+B2NNyJSLiR+g48DqvWR6t9S2",
638 "z5C4V98KnIUNUanadqabKP6eXWhvbvcQHxAjiOOiKZgXZplZW2g+B2NNyJSLiR+g48DqvWR6t9S2",
639 "aGfFjdOW1Gi6oTtZ1d4p5XIslAr8mryeZ6+htSSQe4AcfVt7k+V6mOthBCYtr/LEU4ZHtl0mW987",
639 "aGfFjdOW1Gi6oTtZ1d4p5XIslAr8mryeZ6+htSSQe4AcfVt7k+V6mOthBCYtr/LEU4ZHtl0mW987",
640 "6PK8mRFAaT8DJOUFVz1lPfzRApuPggkkyq+UMvyfKTUbCk7/DpfX8Y4s4QAAAg9BmmNJ4Q8mUwIr",
640 "6PK8mRFAaT8DJOUFVz1lPfzRApuPggkkyq+UMvyfKTUbCk7/DpfX8Y4s4QAAAg9BmmNJ4Q8mUwIr",
641 "/wAsWUPjZw3ksgRsxZ6n4fQjprPbkj2aUh30y0bZJnLmiXnWskvOGnCPwBnG9dEhatwX3hoxk7BN",
641 "/wAsWUPjZw3ksgRsxZ6n4fQjprPbkj2aUh30y0bZJnLmiXnWskvOGnCPwBnG9dEhatwX3hoxk7BN",
642 "yG+wQ4emZUpcVzcWl2T9nKQB1euucuZWHTg7TCtM/iHyfPO2vbmGsfzs70b/egIbywUH4y4BQSL1",
642 "yG+wQ4emZUpcVzcWl2T9nKQB1euucuZWHTg7TCtM/iHyfPO2vbmGsfzs70b/egIbywUH4y4BQSL1",
643 "nWc1SmpHm2zHMBcUjYLDZ5gL5vdfxn0V8FFw66G88c/LN4I5icUa7xf4fcSBKywU0ajbp1P+aJYj",
643 "nWc1SmpHm2zHMBcUjYLDZ5gL5vdfxn0V8FFw66G88c/LN4I5icUa7xf4fcSBKywU0ajbp1P+aJYj",
644 "BgWT6Ggu0MDLDNl54tfqd42lKosQtM1aif4WXAZFP5Ww3vrQ1rH9+utSYxqZd6N6gGtNbSNMcVia",
644 "BgWT6Ggu0MDLDNl54tfqd42lKosQtM1aif4WXAZFP5Ww3vrQ1rH9+utSYxqZd6N6gGtNbSNMcVia",
645 "Kn5LcnjsbBi3T3EmGqshEbcme8VHKwR3kSfBOAprrIsv6K8R+X6az+MD23rWka/2v64m1qM69D7X",
645 "Kn5LcnjsbBi3T3EmGqshEbcme8VHKwR3kSfBOAprrIsv6K8R+X6az+MD23rWka/2v64m1qM69D7X",
646 "a+Kcs/n0KLCJdTilyaGadopLeaAn3eYvWTeHcucMM1Fp1KgHD1tiFeO6HvobLkZlRximsA3/7Mio",
646 "a+Kcs/n0KLCJdTilyaGadopLeaAn3eYvWTeHcucMM1Fp1KgHD1tiFeO6HvobLkZlRximsA3/7Mio",
647 "hYklLIcJrZL22BH+6W9d6kZsYIsej9RM681nU6mWNjepBAfAfTbrGRrVB/h2DxC5B8YyRjgSIzQj",
647 "hYklLIcJrZL22BH+6W9d6kZsYIsej9RM681nU6mWNjepBAfAfTbrGRrVB/h2DxC5B8YyRjgSIzQj",
648 "NYrse0rzChqbrsLl7mQ7W+1bsNKze5//9ZIa8rSsF+BXh/vgoRTDkPW/ws95B7VPCZEFChfX0icw",
648 "NYrse0rzChqbrsLl7mQ7W+1bsNKze5//9ZIa8rSsF+BXh/vgoRTDkPW/ws95B7VPCZEFChfX0icw",
649 "+tpcpN/q7NY87tUn4vESdSiMMlyhKklMjQu/G51J69ZRQLs2oUO6YfoJFqliy4qCFCrf8SZE9Fc6",
649 "+tpcpN/q7NY87tUn4vESdSiMMlyhKklMjQu/G51J69ZRQLs2oUO6YfoJFqliy4qCFCrf8SZE9Fc6",
650 "DcCagAAAAodBmoRJ4Q8mUwIr/wArPWF/KOw78THwadfPqhJO0CnmR/M74/XYZLqVYKlNcEaYauf+",
650 "DcCagAAAAodBmoRJ4Q8mUwIr/wArPWF/KOw78THwadfPqhJO0CnmR/M74/XYZLqVYKlNcEaYauf+",
651 "vrRUDJPmu75sMKy2Y+Bnslc/iAISSyWtw/h/3CF8fE5ZrbrwSNst+MSyCoNWP+8imtoX2eyojpdC",
651 "vrRUDJPmu75sMKy2Y+Bnslc/iAISSyWtw/h/3CF8fE5ZrbrwSNst+MSyCoNWP+8imtoX2eyojpdC",
652 "k8YP5K+cbK4SJPCkZXbYqSXYk7hO8AdSemBHgXKWiZ+UOr802aJo+98ZOIjX9hWL9bo31Gqx7cy4",
652 "k8YP5K+cbK4SJPCkZXbYqSXYk7hO8AdSemBHgXKWiZ+UOr802aJo+98ZOIjX9hWL9bo31Gqx7cy4",
653 "ZG+W/ar/WGlzDa1xPWnPRsEdrIcZlEVGV/jGmbirkxw1lyUYoqj8Vv7Bxube9XPQlBkXOV6Lc1LT",
653 "ZG+W/ar/WGlzDa1xPWnPRsEdrIcZlEVGV/jGmbirkxw1lyUYoqj8Vv7Bxube9XPQlBkXOV6Lc1LT",
654 "2IzNq0V7WwVhF0kA6yxfAsFxc9krNEH8vGGntTWI608ovjatXc/CKKXw7AjJSftlTcLI0hIIGXbR",
654 "2IzNq0V7WwVhF0kA6yxfAsFxc9krNEH8vGGntTWI608ovjatXc/CKKXw7AjJSftlTcLI0hIIGXbR",
655 "Ur0NCYNp7M4cVd/n73Rjetnixz4SAKpcz/P47UsijZG7T3SxzK2D79WS42aEalc12hQwCZ01LfmF",
655 "Ur0NCYNp7M4cVd/n73Rjetnixz4SAKpcz/P47UsijZG7T3SxzK2D79WS42aEalc12hQwCZ01LfmF",
656 "/H2mmGEvOzPBie1D0YT7Jh19vxa4Dd3SQ1FrDfmSUpvv4DjbYcZ2PrPpFpWtMjWqHBeoyMiZf6RP",
656 "/H2mmGEvOzPBie1D0YT7Jh19vxa4Dd3SQ1FrDfmSUpvv4DjbYcZ2PrPpFpWtMjWqHBeoyMiZf6RP",
657 "3EfYR6z9jsVNIIHxM0bzzBQF8eeYkPgDySydxPXv9Izo+QUY94N8kWi16fI6eZSDc1G0Yo0L91jc",
657 "3EfYR6z9jsVNIIHxM0bzzBQF8eeYkPgDySydxPXv9Izo+QUY94N8kWi16fI6eZSDc1G0Yo0L91jc",
658 "RQuDMGGS7B2zuf/0GbJyRhUO48UbMrqnILMrbQg1LF00Q3pH9nbGEK/RRQpRN3T/J/4IZQjwW2Ft",
658 "RQuDMGGS7B2zuf/0GbJyRhUO48UbMrqnILMrbQg1LF00Q3pH9nbGEK/RRQpRN3T/J/4IZQjwW2Ft",
659 "2ipWGztg1Jn9I4DmffKS60QC+JQcyakdVON6zDcKttIKlqeTcmAi4xzmo4QXa2dRKleS+fs3EtTd",
659 "2ipWGztg1Jn9I4DmffKS60QC+JQcyakdVON6zDcKttIKlqeTcmAi4xzmo4QXa2dRKleS+fs3EtTd",
660 "BBtony2wK9T2Imj+NCziOSEL7Q7VuIU8kclUHrJJsSneFcxGRgIgGGUEQM8/pklwTOqab7mMmJeR",
660 "BBtony2wK9T2Imj+NCziOSEL7Q7VuIU8kclUHrJJsSneFcxGRgIgGGUEQM8/pklwTOqab7mMmJeR",
661 "iaBrjJDEnDpkR4Vz3qXxgyn4/5x24FuTMNVPwQAAAhtBmqVJ4Q8mUwIr/wApcLwPT0/Xh9UdWqWX",
661 "iaBrjJDEnDpkR4Vz3qXxgyn4/5x24FuTMNVPwQAAAhtBmqVJ4Q8mUwIr/wApcLwPT0/Xh9UdWqWX",
662 "Is8Wbj5K1hivmN6qIQnq+aolcegdlM/63MbHsdC6xYZC1e/Q8UjQCt9N/Ejqwms8DzeWv2qxskel",
662 "Is8Wbj5K1hivmN6qIQnq+aolcegdlM/63MbHsdC6xYZC1e/Q8UjQCt9N/Ejqwms8DzeWv2qxskel",
663 "iZH0kt1QWkErWSEodq7V0ZNksctLkMGWayX33gBT368EehfIeGDolBZoqIbJfb4nqcfU+ev4OzVv",
663 "iZH0kt1QWkErWSEodq7V0ZNksctLkMGWayX33gBT368EehfIeGDolBZoqIbJfb4nqcfU+ev4OzVv",
664 "9zVqWyLck315GFmXxQKIM8pICQc8Q5es34LH1+DmnMnW8kQpVGrztQcDXhjCU3F0fOgoSsXSVWCj",
664 "9zVqWyLck315GFmXxQKIM8pICQc8Q5es34LH1+DmnMnW8kQpVGrztQcDXhjCU3F0fOgoSsXSVWCj",
665 "c6XKqGbCwQDfJUxCfXfIT6YmQoPpVp1mpGy1wQypXus9z0bScDpyDu23hViYDntdj1O45ea0znKZ",
665 "c6XKqGbCwQDfJUxCfXfIT6YmQoPpVp1mpGy1wQypXus9z0bScDpyDu23hViYDntdj1O45ea0znKZ",
666 "kj1+tLHbBtqAGJ1WTcbGlF6Vya6hQhEsiiZUIC2fRxIj8/wEXCICIbr0gZ/m6gcOhE10tenvE7iy",
666 "kj1+tLHbBtqAGJ1WTcbGlF6Vya6hQhEsiiZUIC2fRxIj8/wEXCICIbr0gZ/m6gcOhE10tenvE7iy",
667 "+BKY81wLWrnzos3S6FWxYtmCRes+LLhNGOKWRuQo6SyePH2OZ90xZm8oA1MuTe3V59euVNxjAt0F",
667 "+BKY81wLWrnzos3S6FWxYtmCRes+LLhNGOKWRuQo6SyePH2OZ90xZm8oA1MuTe3V59euVNxjAt0F",
668 "LkAc9TEiFhP/8CB+gA8mF+A8h1U01f4DVX55GzCH51jHI2xUS0L9GtsHoBxLPLK/NNel8zcnwG4X",
668 "LkAc9TEiFhP/8CB+gA8mF+A8h1U01f4DVX55GzCH51jHI2xUS0L9GtsHoBxLPLK/NNel8zcnwG4X",
669 "+UusfcfEb5hh+ffnXteCE9vRGbs2n9wYW0xA3ZicklfadmWKUtMiHYBfkMSULWnkBQr4CXxjpYOs",
669 "+UusfcfEb5hh+ffnXteCE9vRGbs2n9wYW0xA3ZicklfadmWKUtMiHYBfkMSULWnkBQr4CXxjpYOs",
670 "6ygeEoA5+5B0B1SZObgZ42wWqddyyYE0NfwQAl75tfdJGqOa7OMHwBYNeatJaJK0zT2+bFaw2qWC",
670 "6ygeEoA5+5B0B1SZObgZ42wWqddyyYE0NfwQAl75tfdJGqOa7OMHwBYNeatJaJK0zT2+bFaw2qWC",
671 "WwAAAitBmsZJ4Q8mUwIr/wAstkdsayRXchoFk703izqzduZ5WsyXriI9cfUdMUWvm0iGHwYIrUuj",
671 "WwAAAitBmsZJ4Q8mUwIr/wAstkdsayRXchoFk703izqzduZ5WsyXriI9cfUdMUWvm0iGHwYIrUuj",
672 "vz3Yjou+JLwv9df2kt7MJo8u+3P5CjEKbwlz4vkE5AHTAbgXn3+Xc/MMJLgW5cm7iX3KiGNnBpbp",
672 "vz3Yjou+JLwv9df2kt7MJo8u+3P5CjEKbwlz4vkE5AHTAbgXn3+Xc/MMJLgW5cm7iX3KiGNnBpbp",
673 "hhwJRlb3u91NRDr0d1IR2up/z7lKxE7XPAPFe0siPMYVlIqWNSn5KqLABPeuxxbOsvMEb27/nH1L",
673 "hhwJRlb3u91NRDr0d1IR2up/z7lKxE7XPAPFe0siPMYVlIqWNSn5KqLABPeuxxbOsvMEb27/nH1L",
674 "UVM8I2F95c1I3Lv1SpkhZXjs1JsmS9X7gsoTxkXyShGC2+zRJSGUbhCPo/q1XSFMHQyMWJ79FKPQ",
674 "UVM8I2F95c1I3Lv1SpkhZXjs1JsmS9X7gsoTxkXyShGC2+zRJSGUbhCPo/q1XSFMHQyMWJ79FKPQ",
675 "SL/RpVsacN2bYwdKo4TFBw1SsKq/L1iOmqMI+4Gxnbbjojdk0ek0JIcDb4bHv1czxchF7FX1Ym8H",
675 "SL/RpVsacN2bYwdKo4TFBw1SsKq/L1iOmqMI+4Gxnbbjojdk0ek0JIcDb4bHv1czxchF7FX1Ym8H",
676 "6IpPuE8CeNKjzQ1a1wqhEu+wl1N0x3Y37ZryCCKJRkxj0FT7bOoH3L38/yMUuh/v3aCmxY4eCkyk",
676 "6IpPuE8CeNKjzQ1a1wqhEu+wl1N0x3Y37ZryCCKJRkxj0FT7bOoH3L38/yMUuh/v3aCmxY4eCkyk",
677 "b2p6ZrYMFE044anM/nMjmbErMibfRFuCz58Io1rBlF7JfkIz0R2/5vjUMVskcdbX2mm7DntncOsW",
677 "b2p6ZrYMFE044anM/nMjmbErMibfRFuCz58Io1rBlF7JfkIz0R2/5vjUMVskcdbX2mm7DntncOsW",
678 "DIdg/XVmgsC9CzVzUyq4VsS/sk97lJggcddpWLNw/29egz8iLyzWHOAXCvl2fTIPkviYAOQXfVhZ",
678 "DIdg/XVmgsC9CzVzUyq4VsS/sk97lJggcddpWLNw/29egz8iLyzWHOAXCvl2fTIPkviYAOQXfVhZ",
679 "UQdxsyJUNFMTiALrZCmoQLMp2LmDbfbW8JQriDeR3fVz6P1sjT8C2yEDvzkCn7sh0aTBK+sx7BKH",
679 "UQdxsyJUNFMTiALrZCmoQLMp2LmDbfbW8JQriDeR3fVz6P1sjT8C2yEDvzkCn7sh0aTBK+sx7BKH",
680 "1nb4320+caQepQj4TCJtCeNXjdrVcNEnjvwlcRJwFT1pT+Y7HREbHnT71XYNh4EAAAGEQZrnSeEP",
680 "1nb4320+caQepQj4TCJtCeNXjdrVcNEnjvwlcRJwFT1pT+Y7HREbHnT71XYNh4EAAAGEQZrnSeEP",
681 "JlMCK/8AKIjxcI58rm/ML255fOJW1zbznFna7lfgMQrka7OTPPsvVAV4EJXye/Uxiu9dlftmRypJ",
681 "JlMCK/8AKIjxcI58rm/ML255fOJW1zbznFna7lfgMQrka7OTPPsvVAV4EJXye/Uxiu9dlftmRypJ",
682 "qfDot3xwDe8lX/qAVf6pBkSlUsaLyBYtww/SUSa1bGl1JvrJCN7FXCCXbLd5R4PoYlPiDIm/DQH2",
682 "qfDot3xwDe8lX/qAVf6pBkSlUsaLyBYtww/SUSa1bGl1JvrJCN7FXCCXbLd5R4PoYlPiDIm/DQH2",
683 "puO0StIWmrR77Isc/J1pRvdu5+mQa/n0SEHUeM2KkoRzCznfD9zaaRO7BDtvC9SYIT0uYZxrwTjx",
683 "puO0StIWmrR77Isc/J1pRvdu5+mQa/n0SEHUeM2KkoRzCznfD9zaaRO7BDtvC9SYIT0uYZxrwTjx",
684 "Q7N7UERTrYG0P+vRLAhxkfohFIYl3HXyjPOvnlbUFP2oiiy6nkUFuaIyQcJawJv3GU8k4ObcKsC1",
684 "Q7N7UERTrYG0P+vRLAhxkfohFIYl3HXyjPOvnlbUFP2oiiy6nkUFuaIyQcJawJv3GU8k4ObcKsC1",
685 "cNDXjSpsyQRrxLFaCCjke4mikyt7vs0iN0bnrNWv9HXruG9zOFEOer1ggIFTsT1Eos5CXRkgja5H",
685 "cNDXjSpsyQRrxLFaCCjke4mikyt7vs0iN0bnrNWv9HXruG9zOFEOer1ggIFTsT1Eos5CXRkgja5H",
686 "N4QUM6MhWpc5du/HgBIH8ANFcoo2kJpqcadw9r/0qk25X91MQSDJQiH8Hny2dQhqR+LFWEawiW75",
686 "N4QUM6MhWpc5du/HgBIH8ANFcoo2kJpqcadw9r/0qk25X91MQSDJQiH8Hny2dQhqR+LFWEawiW75",
687 "3SJhn0ngZcv/mPj3mwcHv1SL9ErBqAjm4JGiDetPKYtFwANYY11OyQAAAVdBmwhJ4Q8mUwIr/wAr",
687 "3SJhn0ngZcv/mPj3mwcHv1SL9ErBqAjm4JGiDetPKYtFwANYY11OyQAAAVdBmwhJ4Q8mUwIr/wAr",
688 "Ox5HV2505jRePGgMxptW4PGIHEszV1xGZS+flSkF+aq30AaqO7u6XK9jJsuWXTfYCRQTn1bZfFQ2",
688 "Ox5HV2505jRePGgMxptW4PGIHEszV1xGZS+flSkF+aq30AaqO7u6XK9jJsuWXTfYCRQTn1bZfFQ2",
689 "2DbO5DXAxK/TUmbQleCflFzeS6/czxkL4PJ8AwOs2U+oehekgCZC8gZyHHaQSaKbNJ46gTjNsLy8",
689 "2DbO5DXAxK/TUmbQleCflFzeS6/czxkL4PJ8AwOs2U+oehekgCZC8gZyHHaQSaKbNJ46gTjNsLy8",
690 "4ACQ5uNt11TPuCPqPTuh+schdw9S+/lU/6m+EyaqGZ49wDFPiBFBYXglQQBjyP9k/rqq0xL7SiLj",
690 "4ACQ5uNt11TPuCPqPTuh+schdw9S+/lU/6m+EyaqGZ49wDFPiBFBYXglQQBjyP9k/rqq0xL7SiLj",
691 "pe4riYg8SFUuUtOzPdWHyvxnI7Ug/0VLPGAAhgMISUnqe01d5QFf36yHpwMAHexjAZFIGQHAFaut",
691 "pe4riYg8SFUuUtOzPdWHyvxnI7Ug/0VLPGAAhgMISUnqe01d5QFf36yHpwMAHexjAZFIGQHAFaut",
692 "uMuEw6HzUZVzNdeHYxvEYOGkTo007bLwbuf/nxzrywGOxlRTYJLRdYI0mk0SdN3+LeTv1RIJwv21",
692 "uMuEw6HzUZVzNdeHYxvEYOGkTo007bLwbuf/nxzrywGOxlRTYJLRdYI0mk0SdN3+LeTv1RIJwv21",
693 "+e9rT5iFOTCgzeQoekEWXLYz0X8YLq5bVCtijP7/T7w1Ck71j0aqfrEn6wtIAAABNUGbKUnhDyZT",
693 "+e9rT5iFOTCgzeQoekEWXLYz0X8YLq5bVCtijP7/T7w1Ck71j0aqfrEn6wtIAAABNUGbKUnhDyZT",
694 "Aiv/ACcySi7VBgOid6qZNXvhh/JsllHkMLLq0yNbQTqv/Wk2EBoSKICZwFwAD0WRzhvvReCGirep",
694 "Aiv/ACcySi7VBgOid6qZNXvhh/JsllHkMLLq0yNbQTqv/Wk2EBoSKICZwFwAD0WRzhvvReCGirep",
695 "1Fe4bxjm49/UR+OYrXRmHR18T0C83AUVeBk7KvDZmb/eHzuzEN4yfXucr/NWFJl+USVMY4r4UQ9C",
695 "1Fe4bxjm49/UR+OYrXRmHR18T0C83AUVeBk7KvDZmb/eHzuzEN4yfXucr/NWFJl+USVMY4r4UQ9C",
696 "ayrfEY9v6AQ6mzAdLy2UMfFxrRJ99g/Rfl8qx+m4jIZNjlrTaThzJ/3OpVmAliDfxVyg8+CVIlI3",
696 "ayrfEY9v6AQ6mzAdLy2UMfFxrRJ99g/Rfl8qx+m4jIZNjlrTaThzJ/3OpVmAliDfxVyg8+CVIlI3",
697 "1IykiwQrXcebgajG+av8XU1SfyAG5ibvwbtdSAxkGBcJWL387V+uTdY56w3KN2vBtoQpVKD2zb3y",
697 "1IykiwQrXcebgajG+av8XU1SfyAG5ibvwbtdSAxkGBcJWL387V+uTdY56w3KN2vBtoQpVKD2zb3y",
698 "azIcATZ02upwIytNcM/rpaLCdMb1myWcikE25agzLhDhOS+4zwjYz2DnW6VY0gFBAPsphhsUMnau",
698 "azIcATZ02upwIytNcM/rpaLCdMb1myWcikE25agzLhDhOS+4zwjYz2DnW6VY0gFBAPsphhsUMnau",
699 "VVdUVHzCTSdvzEve/H8q4AAAAVdBm0pJ4Q8mUwIr/wAo+x5XKuiN1am7SkJKSMonFZDPU3f5XFcD",
699 "VVdUVHzCTSdvzEve/H8q4AAAAVdBm0pJ4Q8mUwIr/wAo+x5XKuiN1am7SkJKSMonFZDPU3f5XFcD",
700 "QSs0FLVq2idfsKwuIkt1mxIq8NgMHpzofTnDHqs/WedvAmhBgL0N5azdQa5MNKG2rJ4IAvGQY/uF",
700 "QSs0FLVq2idfsKwuIkt1mxIq8NgMHpzofTnDHqs/WedvAmhBgL0N5azdQa5MNKG2rJ4IAvGQY/uF",
701 "m3jKQAKzvhSS01gO1oIfizF817z9IShS4QK2WT0PeFPELqLSpED8eNOpVTR96vmwpk/WBKRVJdTQ",
701 "m3jKQAKzvhSS01gO1oIfizF817z9IShS4QK2WT0PeFPELqLSpED8eNOpVTR96vmwpk/WBKRVJdTQ",
702 "JzjiCQ5pgEwjtvk7KqoS0+lwXSbvIrXkYm8DignEts3DLNoLHrPjXlQmbIop76JZSyJEtB+91GrL",
702 "JzjiCQ5pgEwjtvk7KqoS0+lwXSbvIrXkYm8DignEts3DLNoLHrPjXlQmbIop76JZSyJEtB+91GrL",
703 "wo6Km5GeebyA2E6qGL3xSkpppej/ruoFprSKrH60UMbrq/SK7eCo+1QFoySPQmqDFsMGiQFqvtld",
703 "wo6Km5GeebyA2E6qGL3xSkpppej/ruoFprSKrH60UMbrq/SK7eCo+1QFoySPQmqDFsMGiQFqvtld",
704 "5BXDYdVI4yRaoyN7Y7wi83HRC6eVazuHU9OtIY3xJJApBWq1aJOsYwc38aTC3ee863Aa/4n9Lk4D",
704 "5BXDYdVI4yRaoyN7Y7wi83HRC6eVazuHU9OtIY3xJJApBWq1aJOsYwc38aTC3ee863Aa/4n9Lk4D",
705 "AtyFYHNZjB5m2e2vk8G2Gny9YFlBAAABQEGba0nhDyZTAiv/ACoZSZQfHxhfQxEqOBQrP+L3Dmgv",
705 "AtyFYHNZjB5m2e2vk8G2Gny9YFlBAAABQEGba0nhDyZTAiv/ACoZSZQfHxhfQxEqOBQrP+L3Dmgv",
706 "HSJQtB1iVkcLTxm+vagLHBLG91OGnopwrr7gT/loDypIhoRxjcwAAOeg/jN4WBbXzCJtnWGGllUC",
706 "HSJQtB1iVkcLTxm+vagLHBLG91OGnopwrr7gT/loDypIhoRxjcwAAOeg/jN4WBbXzCJtnWGGllUC",
707 "SdtUZQzKOSp9iM4yX18C6jrY4Sq6R9PUV/lEGNveJR4gw4FMve7110XdEPL1O2VTdHvdqeANyaq0",
707 "SdtUZQzKOSp9iM4yX18C6jrY4Sq6R9PUV/lEGNveJR4gw4FMve7110XdEPL1O2VTdHvdqeANyaq0",
708 "nLdEmtXnrzvdrFlBaUvmaR4EdlkqGkvkZKWJej8Vq+msbKa7JdbxjwZtRufiyGfD/NVqMgSrYRzw",
708 "nLdEmtXnrzvdrFlBaUvmaR4EdlkqGkvkZKWJej8Vq+msbKa7JdbxjwZtRufiyGfD/NVqMgSrYRzw",
709 "9z/a8Zwbr+9+19CxlWD5bCuAEfPmjY6kZJE2L/CQI6+tnCBTXOmWZtZMBoCLGOf7G2uAC3+kFlbo",
709 "9z/a8Zwbr+9+19CxlWD5bCuAEfPmjY6kZJE2L/CQI6+tnCBTXOmWZtZMBoCLGOf7G2uAC3+kFlbo",
710 "h9as5WCkO6+iqXq29dyhKnsHInorRYsPlgxIXyU1Om/Kyhj1DJV0Am9WJK3Dln0zNUH0q6ZTOnZc",
710 "h9as5WCkO6+iqXq29dyhKnsHInorRYsPlgxIXyU1Om/Kyhj1DJV0Am9WJK3Dln0zNUH0q6ZTOnZc",
711 "FD36AAABYkGbjEnhDyZTAiv/ACcwdIOLRFfoGK2ZkKsvgMwG0m0qsY0vMLPSzefc+ebp/aztyF7M",
711 "FD36AAABYkGbjEnhDyZTAiv/ACcwdIOLRFfoGK2ZkKsvgMwG0m0qsY0vMLPSzefc+ebp/aztyF7M",
712 "lsBz/fBeNtxFBcsKgR4pf65GvdfOMHah0ltZ918sMDmXUEZMeRHy/xpnWpTLeGz6uTs/7MATPmU5",
712 "lsBz/fBeNtxFBcsKgR4pf65GvdfOMHah0ltZ918sMDmXUEZMeRHy/xpnWpTLeGz6uTs/7MATPmU5",
713 "BgHbT/DkD8QeaZnFAzidyFCXDz2l/jaKhEdgqipbB2pH0+fQ039r05z9axxEWGmaLQjg6x9+po1o",
713 "BgHbT/DkD8QeaZnFAzidyFCXDz2l/jaKhEdgqipbB2pH0+fQ039r05z9axxEWGmaLQjg6x9+po1o",
714 "24yhkVO7m03YwWmPyCgy8cOwrvRyJkXJpRN4m8ZBS1zwY80HeN/VyMQQJSMwsTo7R1XMerSFuyx0",
714 "24yhkVO7m03YwWmPyCgy8cOwrvRyJkXJpRN4m8ZBS1zwY80HeN/VyMQQJSMwsTo7R1XMerSFuyx0",
715 "nz+8qOuhiqykc2ohCCsXia/+kIKbJ5Vs+cbWtvkqBKIDSfU7FhAd3GjcY/xar0EVmi6wWFTugAog",
715 "nz+8qOuhiqykc2ohCCsXia/+kIKbJ5Vs+cbWtvkqBKIDSfU7FhAd3GjcY/xar0EVmi6wWFTugAog",
716 "R3I7mTrQDdlTAqYgqO7Gn5NMXQVHu2i1zhFSdo9GjMbeGnbkJwsFbQ2XkoKRIDpuW7AewC9AEBt0",
716 "R3I7mTrQDdlTAqYgqO7Gn5NMXQVHu2i1zhFSdo9GjMbeGnbkJwsFbQ2XkoKRIDpuW7AewC9AEBt0",
717 "Ox/Ah6dGXfXO1jl8pEApj2RFmgAAAPlBm61J4Q8mUwIr/wAlR+eW/VZ7bSrmwwMA62G05DZ7p/5F",
717 "Ox/Ah6dGXfXO1jl8pEApj2RFmgAAAPlBm61J4Q8mUwIr/wAlR+eW/VZ7bSrmwwMA62G05DZ7p/5F",
718 "UugsSsQdonUq6abtbU5hjFr+I1lPgoiV5c3CkTQZS+K5zivdo+Ti2P4K90xXANp8dSMAu85uJIOC",
718 "UugsSsQdonUq6abtbU5hjFr+I1lPgoiV5c3CkTQZS+K5zivdo+Ti2P4K90xXANp8dSMAu85uJIOC",
719 "Qn2TXbEnNDifLB+3V84ht5tj4lvTaZx317BcliV8D5v2zZQW8RO1mUbuJEBItst8E7hfE+ZXj7tf",
719 "Qn2TXbEnNDifLB+3V84ht5tj4lvTaZx317BcliV8D5v2zZQW8RO1mUbuJEBItst8E7hfE+ZXj7tf",
720 "DxNZPTvtpFyUv0fH1cTg1pr2VLy0d0zQLiA58dg+GkRvR1/hs2LyifBgHcj6eTWz0vsypVn9iPXR",
720 "DxNZPTvtpFyUv0fH1cTg1pr2VLy0d0zQLiA58dg+GkRvR1/hs2LyifBgHcj6eTWz0vsypVn9iPXR",
721 "H/unJ6i8cfFL69NO24tQ9QQB+nDFhoP2cRhkAvhHwn56n5PppBD/oxni2f8AAAE9QZvOSeEPJlMC",
721 "H/unJ6i8cfFL69NO24tQ9QQB+nDFhoP2cRhkAvhHwn56n5PppBD/oxni2f8AAAE9QZvOSeEPJlMC",
722 "K/8AJjAXVGf+Kj2XNJnFeKC/gr7dJDTC2ngpd4WeAHlg04GuJKnn9hAmiECxxo9qM1IYMRiB85t6",
722 "K/8AJjAXVGf+Kj2XNJnFeKC/gr7dJDTC2ngpd4WeAHlg04GuJKnn9hAmiECxxo9qM1IYMRiB85t6",
723 "gALnlm9sRqGmioyzAm18RJndc9Ah8RlpGzr+44a6ntRaPx0cIwNIWAA8buL2JP00dmfjNqEiAlCa",
723 "gALnlm9sRqGmioyzAm18RJndc9Ah8RlpGzr+44a6ntRaPx0cIwNIWAA8buL2JP00dmfjNqEiAlCa",
724 "8OdV8FQxjp1vDXsGcAGF3Qbd62KEpkimeI3wH2nuXpbDHm8/ZKOR49s5ifUCkxCoJpfp43aC0lTz",
724 "8OdV8FQxjp1vDXsGcAGF3Qbd62KEpkimeI3wH2nuXpbDHm8/ZKOR49s5ifUCkxCoJpfp43aC0lTz",
725 "h2NXpcfVw6h0QnK8G60R4ZAxOxaJB7c0nn8ixXSU2JVY24EtGMF53nxJnHfzUheewUfBOGYSxeo8",
725 "h2NXpcfVw6h0QnK8G60R4ZAxOxaJB7c0nn8ixXSU2JVY24EtGMF53nxJnHfzUheewUfBOGYSxeo8",
726 "oK7oUCqX4rztzDwoc2QywNqQUJUkFrqIN+sb5ecYvX24Zujn+ZzTW6UDAF3R6WdNyJyRAremgC8s",
726 "oK7oUCqX4rztzDwoc2QywNqQUJUkFrqIN+sb5ecYvX24Zujn+ZzTW6UDAF3R6WdNyJyRAremgC8s",
727 "pSflTqygQNGfHyGkfIEEJJaFo/pBCBkAAAEWQZvvSeEPJlMCK/8AKI41fuekXG59Knbw4Y6YJrit",
727 "pSflTqygQNGfHyGkfIEEJJaFo/pBCBkAAAEWQZvvSeEPJlMCK/8AKI41fuekXG59Knbw4Y6YJrit",
728 "sh9VtQgc3QKvVmxrzzo7f4aXn8N74eyP4b2lV1Z2Q+rohxps7EHTkOY9jLdqxI3MXe7je4g2qepz",
728 "sh9VtQgc3QKvVmxrzzo7f4aXn8N74eyP4b2lV1Z2Q+rohxps7EHTkOY9jLdqxI3MXe7je4g2qepz",
729 "71+hY+jYdX+9LO0kA0Zg3NfyAlIRX7k6c/YHAZNtNaGZgTBMqiPgmEjiJH9Luk7shbgr+srfwiYw",
729 "71+hY+jYdX+9LO0kA0Zg3NfyAlIRX7k6c/YHAZNtNaGZgTBMqiPgmEjiJH9Luk7shbgr+srfwiYw",
730 "BX9rdS3fQNNFwcT8orQC+F60LAY9+GbFo2Sw3Ld4Tw9jq9yJtrY8RtHAdzytyek/mv2+j2TbTvAQ",
730 "BX9rdS3fQNNFwcT8orQC+F60LAY9+GbFo2Sw3Ld4Tw9jq9yJtrY8RtHAdzytyek/mv2+j2TbTvAQ",
731 "KbbCYtdC8E/KtR4V5ZTSScr5Wb63vmbw7UpddEXYvl55pARyyvMxWNSh3Li4GF8Jk5JBi5B5ASQw",
731 "KbbCYtdC8E/KtR4V5ZTSScr5Wb63vmbw7UpddEXYvl55pARyyvMxWNSh3Li4GF8Jk5JBi5B5ASQw",
732 "xCMYpX5hkAMc+d8tl2bT+IEvUTsAAAElQZoQSeEPJlMCK/8AJIAzFZs00JJ0yfm8CZiew4xWdArL",
732 "xCMYpX5hkAMc+d8tl2bT+IEvUTsAAAElQZoQSeEPJlMCK/8AJIAzFZs00JJ0yfm8CZiew4xWdArL",
733 "klEvBVXo/+ukPLu3XP9HFOfsme3T6BJEKmPPgZw/Lxnraq6Sl2kLVW19YU1qmqgfv+80LkZaWU5g",
733 "klEvBVXo/+ukPLu3XP9HFOfsme3T6BJEKmPPgZw/Lxnraq6Sl2kLVW19YU1qmqgfv+80LkZaWU5g",
734 "RAH4hqyo3bFYcbuY2SC3IW5Wm69gtYyAXOdbAYSEHA16fvCeRQjHEsxKVndJdrRAlrGHsKgUBQ3U",
734 "RAH4hqyo3bFYcbuY2SC3IW5Wm69gtYyAXOdbAYSEHA16fvCeRQjHEsxKVndJdrRAlrGHsKgUBQ3U",
735 "p/ZXIy1vkdFOfKSjpuZnswkuqr8NZI5tJ/dnBSErBTNWPaNwWV7nNomC0EYVGo+geGBhLXzaLw0U",
735 "p/ZXIy1vkdFOfKSjpuZnswkuqr8NZI5tJ/dnBSErBTNWPaNwWV7nNomC0EYVGo+geGBhLXzaLw0U",
736 "AOCYGjiPc3803BDw1GLoLIXjrIFJxwRfBNIAXYZAglu30oYzhpAfRWSprkeULMWYJTlWvbUQ5CNe",
736 "AOCYGjiPc3803BDw1GLoLIXjrIFJxwRfBNIAXYZAglu30oYzhpAfRWSprkeULMWYJTlWvbUQ5CNe",
737 "wSZssuDWIRAc3w8AcFaywwn+YSGhtR8VI1OGjYkfBbcAAAD8QZoxSeEPJlMCK/8AJdokjCUETRw/",
737 "wSZssuDWIRAc3w8AcFaywwn+YSGhtR8VI1OGjYkfBbcAAAD8QZoxSeEPJlMCK/8AJdokjCUETRw/",
738 "nciVPtaZQSBP/VxAQSITASEzlJBl9Na1r0DJhLOz279+KQLtl/xHZ8vAKc528mTMTqtWs4sFbeVg",
738 "nciVPtaZQSBP/VxAQSITASEzlJBl9Na1r0DJhLOz279+KQLtl/xHZ8vAKc528mTMTqtWs4sFbeVg",
739 "HWyBpHcHEtgTzjIqEinp/MPuUXF5poo8YLSSMFn9Ozx2FbU5/Kh9A39oN9NHQflVxV1NA6yT/84H",
739 "HWyBpHcHEtgTzjIqEinp/MPuUXF5poo8YLSSMFn9Ozx2FbU5/Kh9A39oN9NHQflVxV1NA6yT/84H",
740 "HyfMtfdSMS8KTvAEE2lDs14VQayNs5ctjXboQT7xMBf5OLj6thhPvgaDrFB2o/PV9ouK147lruWT",
740 "HyfMtfdSMS8KTvAEE2lDs14VQayNs5ctjXboQT7xMBf5OLj6thhPvgaDrFB2o/PV9ouK147lruWT",
741 "P2mkoA9oDIMYW1pcBx4yyV/t9GOPZ3aXneMUb2fFmUCX43BjXfUDMaa4GO2/Ankj3UEQwDxA7ZlN",
741 "P2mkoA9oDIMYW1pcBx4yyV/t9GOPZ3aXneMUb2fFmUCX43BjXfUDMaa4GO2/Ankj3UEQwDxA7ZlN",
742 "UQK2AAAA4UGaUknhDyZTAiv/ACJHv33I08bkhybYiJ/JiiheW5zMPBu4n5CxGr3frhE7TkLh0vPk",
742 "UQK2AAAA4UGaUknhDyZTAiv/ACJHv33I08bkhybYiJ/JiiheW5zMPBu4n5CxGr3frhE7TkLh0vPk",
743 "tM8m/AhaDiJisdk5QXNe/4WmxEDSAyaVi4eUVu0iHT2ly/KNTGqiORqA2oKpTjh84nYbrpXwnGv9",
743 "tM8m/AhaDiJisdk5QXNe/4WmxEDSAyaVi4eUVu0iHT2ly/KNTGqiORqA2oKpTjh84nYbrpXwnGv9",
744 "SOf/34Z06xN6Yo3t35UZrP8nlcs/63GtnEmnUwVZHBYfPM6bs5M5AeBfAQ/9mIqu7vnEst+5O2wp",
744 "SOf/34Z06xN6Yo3t35UZrP8nlcs/63GtnEmnUwVZHBYfPM6bs5M5AeBfAQ/9mIqu7vnEst+5O2wp",
745 "PjzdItjwGCZ2ApHVjGnYYFomlA9nm6AXnxNIWHIsDgxCk3zx+6QbXipu/CWLG1Wf0WIbt4C0JPVl",
745 "PjzdItjwGCZ2ApHVjGnYYFomlA9nm6AXnxNIWHIsDgxCk3zx+6QbXipu/CWLG1Wf0WIbt4C0JPVl",
746 "3TEb0QAAAMlBmnNJ4Q8mUwIr/wAVV64OfTKmlktYOqZHH1W1DhPy/X/6sD4T6hRdzfOgNtTOX2Ic",
746 "3TEb0QAAAMlBmnNJ4Q8mUwIr/wAVV64OfTKmlktYOqZHH1W1DhPy/X/6sD4T6hRdzfOgNtTOX2Ic",
747 "kRJHshfBQVkJIzns079io6kpJFCcS3VD4zrWCn/dNaGV0kWTpFBRuusfn8F0C0R/EhsQeyTsdZft",
747 "kRJHshfBQVkJIzns079io6kpJFCcS3VD4zrWCn/dNaGV0kWTpFBRuusfn8F0C0R/EhsQeyTsdZft",
748 "EkLGb5tq+nrir3vfmeb7rjmWJRXkIrTEKu8pIuAd+4FBGp8ARgGe80Jqpp//s1433HqBFqXsIFJT",
748 "EkLGb5tq+nrir3vfmeb7rjmWJRXkIrTEKu8pIuAd+4FBGp8ARgGe80Jqpp//s1433HqBFqXsIFJT",
749 "mU8j/toF9HyueI1Ea4uvsQ6NANGcYCbOAKCmbNiwABMCFaiUTMAAAAPSbW9vdgAAAGxtdmhkAAAA",
749 "mU8j/toF9HyueI1Ea4uvsQ6NANGcYCbOAKCmbNiwABMCFaiUTMAAAAPSbW9vdgAAAGxtdmhkAAAA",
750 "AHwlsIB8JbCAAAAD6AAAAyAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA",
750 "AHwlsIB8JbCAAAAD6AAAAyAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA",
751 "AAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAv10cmFrAAAAXHRraGQA",
751 "AAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAv10cmFrAAAAXHRraGQA",
752 "AAAPfCWwgHwlsIAAAAABAAAAAAAAAyAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB",
752 "AAAPfCWwgHwlsIAAAAABAAAAAAAAAyAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB",
753 "AAAAAAAAAAAAAAAAAABAAAAAAY4AAAGGAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAMgAAAA",
753 "AAAAAAAAAAAAAAAAAABAAAAAAY4AAAGGAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAMgAAAA",
754 "AgABAAAAAAJ1bWRpYQAAACBtZGhkAAAAAHwlsIB8JbCAAAAAGQAAABRVxAAAAAAALWhkbHIAAAAA",
754 "AgABAAAAAAJ1bWRpYQAAACBtZGhkAAAAAHwlsIB8JbCAAAAAGQAAABRVxAAAAAAALWhkbHIAAAAA",
755 "AAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACIG1pbmYAAAAUdm1oZAAAAAEAAAAA",
755 "AAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACIG1pbmYAAAAUdm1oZAAAAAEAAAAA",
756 "AAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAeBzdGJsAAAAtHN0c2QA",
756 "AAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAeBzdGJsAAAAtHN0c2QA",
757 "AAAAAAAAAQAAAKRhdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAY4BhgBIAAAASAAAAAAAAAAB",
757 "AAAAAAAAAQAAAKRhdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAY4BhgBIAAAASAAAAAAAAAAB",
758 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAAMmF2Y0MBZAAV/+EAGWdkABWs",
758 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAAMmF2Y0MBZAAV/+EAGWdkABWs",
759 "2UGQz6mhAAADAAEAAAMAMg8WLZYBAAZo6+PLIsAAAAAcdXVpZGtoQPJfJE/FujmlG88DI/MAAAAA",
759 "2UGQz6mhAAADAAEAAAMAMg8WLZYBAAZo6+PLIsAAAAAcdXVpZGtoQPJfJE/FujmlG88DI/MAAAAA",
760 "AAAAGHN0dHMAAAAAAAAAAQAAABQAAAABAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAA",
760 "AAAAGHN0dHMAAAAAAAAAAQAAABQAAAABAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAA",
761 "AAABAAAAFAAAAAIAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAZHN0c3oAAAAAAAAAAAAA",
761 "AAABAAAAFAAAAAIAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAZHN0c3oAAAAAAAAAAAAA",
762 "ABQAAA05AAACqQAAAl8AAAITAAACiwAAAh8AAAIvAAABiAAAAVsAAAE5AAABWwAAAUQAAAFmAAAA",
762 "ABQAAA05AAACqQAAAl8AAAITAAACiwAAAh8AAAIvAAABiAAAAVsAAAE5AAABWwAAAUQAAAFmAAAA",
763 "/QAAAUEAAAEaAAABKQAAAQAAAADlAAAAzQAAAGBzdGNvAAAAAAAAABQAAAAsAAANZQAAEA4AABJt",
763 "/QAAAUEAAAEaAAABKQAAAQAAAADlAAAAzQAAAGBzdGNvAAAAAAAAABQAAAAsAAANZQAAEA4AABJt",
764 "AAAUgAAAFwsAABkqAAAbWQAAHOEAAB48AAAfdQAAINAAACIUAAAjegAAJHcAACW4AAAm0gAAJ/sA",
764 "AAAUgAAAFwsAABkqAAAbWQAAHOEAAB48AAAfdQAAINAAACIUAAAjegAAJHcAACW4AAAm0gAAJ/sA",
765 "ACj7AAAp4AAAAGF1ZHRhAAAAWW1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAA",
765 "ACj7AAAp4AAAAGF1ZHRhAAAAWW1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAA",
766 "AAAAAAAALGlsc3QAAAAkqXRvbwAAABxkYXRhAAAAAQAAAABMYXZmNTIuMTExLjA=",
766 "AAAAAAAALGlsc3QAAAAkqXRvbwAAABxkYXRhAAAAAQAAAABMYXZmNTIuMTExLjA=",
767 "\">"
767 "\">"
768 ],
768 ],
769 "output_type": "pyout",
769 "output_type": "pyout",
770 "prompt_number": 5,
770 "prompt_number": 5,
771 "text": [
771 "text": [
772 "&lt;IPython.core.display.HTML at 0x423a550&gt;"
772 "&lt;IPython.core.display.HTML at 0x423a550&gt;"
773 ]
773 ]
774 }
774 }
775 ],
775 ],
776 "prompt_number": 5
776 "prompt_number": 5
777 },
777 },
778 {
778 {
779 "cell_type": "markdown",
779 "cell_type": "markdown",
780 "source": [
780 "source": [
781 "## Local Files",
781 "## Local Files",
782 "",
782 "",
783 "The above examples embed images and video from the notebook filesystem in the output",
783 "The above examples embed images and video from the notebook filesystem in the output",
784 "areas of code cells. It is also possible to request these files directly in markdown cells",
784 "areas of code cells. It is also possible to request these files directly in markdown cells",
785 "if they reside in the notebook directory via relative urls prefixed with `files/`:",
785 "if they reside in the notebook directory via relative urls prefixed with `files/`:",
786 "",
786 "",
787 " files/[subdirectory/]<filename>",
787 " files/[subdirectory/]<filename>",
788 "",
788 "",
789 "",
789 "",
790 "For example, in the example notebook folder, we have the Python logo, addressed as:",
790 "For example, in the example notebook folder, we have the Python logo, addressed as:",
791 "",
791 "",
792 " <img src=\"files/python-logo.svg\" />",
792 " <img src=\"files/python-logo.svg\" />",
793 "",
793 "",
794 "<img src=\"/files/python-logo.svg\" />",
794 "<img src=\"/files/python-logo.svg\" />",
795 "",
795 "",
796 "and a video with the HTML5 video tag:",
796 "and a video with the HTML5 video tag:",
797 "",
797 "",
798 " <video controls src=\"files/animation.m4v\" />",
798 " <video controls src=\"files/animation.m4v\" />",
799 "",
799 "",
800 "<video controls src=\"/files/animation.m4v\" />",
800 "<video controls src=\"/files/animation.m4v\" />",
801 "",
801 "",
802 "These do not embed the data into the notebook file,",
802 "These do not embed the data into the notebook file,",
803 "and require that the files exist when you are viewing the notebook.",
803 "and require that the files exist when you are viewing the notebook.",
804 "",
804 "",
805 "### Security of local files",
805 "### Security of local files",
806 "",
806 "",
807 "Note that this means that the IPython notebook server also acts as a generic file server",
807 "Note that this means that the IPython notebook server also acts as a generic file server",
808 "for files inside the same tree as your notebooks. Access is not granted outside the",
808 "for files inside the same tree as your notebooks. Access is not granted outside the",
809 "notebook folder so you have strict control over what files are visible, but for this",
809 "notebook folder so you have strict control over what files are visible, but for this",
810 "reason it is highly recommended that you do not run the notebook server with a notebook",
810 "reason it is highly recommended that you do not run the notebook server with a notebook",
811 "directory at a high level in your filesystem (e.g. your home directory).",
811 "directory at a high level in your filesystem (e.g. your home directory).",
812 "",
812 "",
813 "When you run the notebook in a password-protected manner, local file access is restricted",
813 "When you run the notebook in a password-protected manner, local file access is restricted",
814 "to authenticated users unless read-only views are active."
814 "to authenticated users unless read-only views are active."
815 ]
815 ]
816 },
816 },
817 {
817 {
818 "cell_type": "markdown",
818 "cell_type": "markdown",
819 "source": [
819 "source": [
820 "### External sites",
820 "### External sites",
821 "",
821 "",
822 "You can even embed an entire page from another site in an iframe; for example this is today's Wikipedia",
822 "You can even embed an entire page from another site in an iframe; for example this is today's Wikipedia",
823 "page for mobile users:"
823 "page for mobile users:"
824 ]
824 ]
825 },
825 },
826 {
826 {
827 "cell_type": "code",
827 "cell_type": "code",
828 "collapsed": false,
828 "collapsed": false,
829 "input": [
829 "input": [
830 "HTML('<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>')"
830 "HTML('<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>')"
831 ],
831 ],
832 "language": "python",
832 "language": "python",
833 "outputs": [
833 "outputs": [
834 {
834 {
835 "html": [
835 "html": [
836 "<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>"
836 "<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>"
837 ],
837 ],
838 "output_type": "pyout",
838 "output_type": "pyout",
839 "prompt_number": 6,
839 "prompt_number": 6,
840 "text": [
840 "text": [
841 "&lt;IPython.core.display.HTML at 0x41d4710&gt;"
841 "&lt;IPython.core.display.HTML at 0x41d4710&gt;"
842 ]
842 ]
843 }
843 }
844 ],
844 ],
845 "prompt_number": 6
845 "prompt_number": 6
846 },
846 },
847 {
847 {
848 "cell_type": "markdown",
848 "cell_type": "markdown",
849 "source": [
849 "source": [
850 "### Mathematics",
850 "### Mathematics",
851 "",
851 "",
852 "And we also support the display of mathematical expressions typeset in LaTeX, which is rendered",
852 "And we also support the display of mathematical expressions typeset in LaTeX, which is rendered",
853 "in the browser thanks to the [MathJax library](http://mathjax.org). ",
853 "in the browser thanks to the [MathJax library](http://mathjax.org). ",
854 "",
854 "",
855 "Note that this is *different* from the above examples. Above we were typing mathematical expressions",
855 "Note that this is *different* from the above examples. Above we were typing mathematical expressions",
856 "in Markdown cells (along with normal text) and letting the browser render them; now we are displaying",
856 "in Markdown cells (along with normal text) and letting the browser render them; now we are displaying",
857 "the output of a Python computation as a LaTeX expression wrapped by the `Math()` object so the browser",
857 "the output of a Python computation as a LaTeX expression wrapped by the `Math()` object so the browser",
858 "renders it:"
858 "renders it:"
859 ]
859 ]
860 },
860 },
861 {
861 {
862 "cell_type": "code",
862 "cell_type": "code",
863 "collapsed": false,
863 "collapsed": false,
864 "input": [
864 "input": [
865 "from IPython.core.display import Math",
865 "from IPython.core.display import Math",
866 "Math(r'$F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx$')"
866 "Math(r'$F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx$')"
867 ],
867 ],
868 "language": "python",
868 "language": "python",
869 "outputs": [
869 "outputs": [
870 {
870 {
871 "latex": [
871 "latex": [
872 "$F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx$"
872 "$F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx$"
873 ],
873 ],
874 "output_type": "pyout",
874 "output_type": "pyout",
875 "prompt_number": 8,
875 "prompt_number": 8,
876 "text": [
876 "text": [
877 "&lt;IPython.core.display.Math at 0x45840d0&gt;"
877 "&lt;IPython.core.display.Math at 0x45840d0&gt;"
878 ]
878 ]
879 }
879 }
880 ],
880 ],
881 "prompt_number": 8
881 "prompt_number": 8
882 },
882 },
883 {
883 {
884 "cell_type": "markdown",
884 "cell_type": "markdown",
885 "source": [
885 "source": [
886 "# Loading external codes",
886 "# Loading external codes",
887 "* Drag and drop a ``.py`` in the dashboard",
887 "* Drag and drop a ``.py`` in the dashboard",
888 "* Use ``%loadpy`` with any local or remote url: [the Matplotlib Gallery!](http://matplotlib.sourceforge.net/gallery.html)",
888 "* Use ``%loadpy`` with any local or remote url: [the Matplotlib Gallery!](http://matplotlib.sourceforge.net/gallery.html)",
889 "",
889 "",
890 "In this notebook we've kept the output saved so you can see the result, but you should run the next",
890 "In this notebook we've kept the output saved so you can see the result, but you should run the next",
891 "cell yourself (with an active internet connection)."
891 "cell yourself (with an active internet connection)."
892 ]
892 ]
893 },
893 },
894 {
894 {
895 "cell_type": "code",
895 "cell_type": "code",
896 "collapsed": true,
896 "collapsed": true,
897 "input": [
897 "input": [
898 "%loadpy http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/integral_demo.py"
898 "%loadpy http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/integral_demo.py"
899 ],
899 ],
900 "language": "python",
900 "language": "python",
901 "outputs": [],
901 "outputs": [],
902 "prompt_number": 8
902 "prompt_number": 8
903 },
903 },
904 {
904 {
905 "cell_type": "code",
905 "cell_type": "code",
906 "collapsed": false,
906 "collapsed": false,
907 "input": [
907 "input": [
908 "#!/usr/bin/env python",
908 "#!/usr/bin/env python",
909 "",
909 "",
910 "# implement the example graphs/integral from pyx",
910 "# implement the example graphs/integral from pyx",
911 "from pylab import *",
911 "from pylab import *",
912 "from matplotlib.patches import Polygon",
912 "from matplotlib.patches import Polygon",
913 "",
913 "",
914 "def func(x):",
914 "def func(x):",
915 " return (x-3)*(x-5)*(x-7)+85",
915 " return (x-3)*(x-5)*(x-7)+85",
916 "",
916 "",
917 "ax = subplot(111)",
917 "ax = subplot(111)",
918 "",
918 "",
919 "a, b = 2, 9 # integral area",
919 "a, b = 2, 9 # integral area",
920 "x = arange(0, 10, 0.01)",
920 "x = arange(0, 10, 0.01)",
921 "y = func(x)",
921 "y = func(x)",
922 "plot(x, y, linewidth=1)",
922 "plot(x, y, linewidth=1)",
923 "",
923 "",
924 "# make the shaded region",
924 "# make the shaded region",
925 "ix = arange(a, b, 0.01)",
925 "ix = arange(a, b, 0.01)",
926 "iy = func(ix)",
926 "iy = func(ix)",
927 "verts = [(a,0)] + zip(ix,iy) + [(b,0)]",
927 "verts = [(a,0)] + zip(ix,iy) + [(b,0)]",
928 "poly = Polygon(verts, facecolor='0.8', edgecolor='k')",
928 "poly = Polygon(verts, facecolor='0.8', edgecolor='k')",
929 "ax.add_patch(poly)",
929 "ax.add_patch(poly)",
930 "",
930 "",
931 "text(0.5 * (a + b), 30,",
931 "text(0.5 * (a + b), 30,",
932 " r\"$\\int_a^b f(x)\\mathrm{d}x$\", horizontalalignment='center',",
932 " r\"$\\int_a^b f(x)\\mathrm{d}x$\", horizontalalignment='center',",
933 " fontsize=20)",
933 " fontsize=20)",
934 "",
934 "",
935 "axis([0,10, 0, 180])",
935 "axis([0,10, 0, 180])",
936 "figtext(0.9, 0.05, 'x')",
936 "figtext(0.9, 0.05, 'x')",
937 "figtext(0.1, 0.9, 'y')",
937 "figtext(0.1, 0.9, 'y')",
938 "ax.set_xticks((a,b))",
938 "ax.set_xticks((a,b))",
939 "ax.set_xticklabels(('a','b'))",
939 "ax.set_xticklabels(('a','b'))",
940 "ax.set_yticks([])",
940 "ax.set_yticks([])",
941 "show()"
941 "show()"
942 ],
942 ],
943 "language": "python",
943 "language": "python",
944 "outputs": [
944 "outputs": [
945 {
945 {
946 "output_type": "display_data",
946 "output_type": "display_data",
947 "png": "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\nSUVORK5CYII=\n"
947 "png": "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\nSUVORK5CYII=\n"
948 }
948 }
949 ],
949 ],
950 "prompt_number": 9
950 "prompt_number": 9
951 },
951 },
952 {
952 {
953 "cell_type": "code",
953 "cell_type": "code",
954 "collapsed": true,
954 "collapsed": true,
955 "input": [],
955 "input": [],
956 "language": "python",
956 "language": "python",
957 "outputs": []
957 "outputs": []
958 }
958 }
959 ]
959 ]
This diff has been collapsed as it changes many lines, (580 lines changed) Show them Hide them
@@ -1,416 +1,416 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "01_notebook_introduction"
3 "name": "01_notebook_introduction"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "# An introduction to the IPython notebook",
12 "# An introduction to the IPython notebook",
13 "",
13 "",
14 "The IPython web notebook is a frontend that allows for new modes",
14 "The IPython web notebook is a frontend that allows for new modes",
15 "of interaction with IPython: this web-based interface allows you to execute Python and IPython",
15 "of interaction with IPython: this web-based interface allows you to execute Python and IPython",
16 "commands in each input cell just like you would at the IPython terminal or Qt console, but you can",
16 "commands in each input cell just like you would at the IPython terminal or Qt console, but you can",
17 "also save an entire session as a document in a file with the `.ipynb` extension.",
17 "also save an entire session as a document in a file with the `.ipynb` extension.",
18 "",
18 "",
19 "The document you are reading now is precisely an example of one such notebook, and we will show you",
19 "The document you are reading now is precisely an example of one such notebook, and we will show you",
20 "here how to best use this new interface.",
20 "here how to best use this new interface.",
21 "",
21 "",
22 "The first thing to understand is that a notebook consists of a sequence of 'cells' that can contain ",
22 "The first thing to understand is that a notebook consists of a sequence of 'cells' that can contain ",
23 "either text (such as this one) or code meant for execution (such as the next one):",
23 "either text (such as this one) or code meant for execution (such as the next one):",
24 "",
24 "",
25 "* Text cells can be written using [Markdown syntax](http://daringfireball.net/projects/markdown/syntax) ",
25 "* Text cells can be written using [Markdown syntax](http://daringfireball.net/projects/markdown/syntax) ",
26 "(in a future release we will also provide support for reStructuredText and Sphinx integration, and we ",
26 "(in a future release we will also provide support for reStructuredText and Sphinx integration, and we ",
27 "welcome help from interested contributors to make that happen).",
27 "welcome help from interested contributors to make that happen).",
28 "",
28 "",
29 "* Code cells take IPython input (i.e. Python code, `%magics`, `!system calls`, etc) like IPython at",
29 "* Code cells take IPython input (i.e. Python code, `%magics`, `!system calls`, etc) like IPython at",
30 "the terminal or at the Qt Console. The only difference is that in order to execute a cell, you *must*",
30 "the terminal or at the Qt Console. The only difference is that in order to execute a cell, you *must*",
31 "use `Shift-Enter`, as pressing `Enter` will add a new line of text to the cell. When you type ",
31 "use `Shift-Enter`, as pressing `Enter` will add a new line of text to the cell. When you type ",
32 "`Shift-Enter`, the cell content is executed, output displayed and a new cell is created below. Try",
32 "`Shift-Enter`, the cell content is executed, output displayed and a new cell is created below. Try",
33 "it now by putting your cursor on the next cell and typing `Shift-Enter`:"
33 "it now by putting your cursor on the next cell and typing `Shift-Enter`:"
34 ]
34 ]
35 },
35 },
36 {
36 {
37 "cell_type": "code",
37 "cell_type": "code",
38 "collapsed": false,
38 "collapsed": false,
39 "input": [
39 "input": [
40 "\"This is the new IPython notebook\""
40 "\"This is the new IPython notebook\""
41 ],
41 ],
42 "language": "python",
42 "language": "python",
43 "outputs": [
43 "outputs": [
44 {
44 {
45 "output_type": "pyout",
45 "output_type": "pyout",
46 "prompt_number": 1,
46 "prompt_number": 1,
47 "text": [
47 "text": [
48 "'This is the new IPython notebook'"
48 "'This is the new IPython notebook'"
49 ]
49 ]
50 }
50 }
51 ],
51 ],
52 "prompt_number": 1
52 "prompt_number": 1
53 },
53 },
54 {
54 {
55 "cell_type": "markdown",
55 "cell_type": "markdown",
56 "source": [
56 "source": [
57 "You can re-execute the same cell over and over as many times as you want. Simply put your",
57 "You can re-execute the same cell over and over as many times as you want. Simply put your",
58 "cursor in the cell again, edit at will, and type `Shift-Enter` to execute. ",
58 "cursor in the cell again, edit at will, and type `Shift-Enter` to execute. ",
59 "",
59 "",
60 "**Tip:** A cell can also be executed",
60 "**Tip:** A cell can also be executed",
61 "*in-place*, where IPython executes its content but leaves the cursor in the same cell. This is done by",
61 "*in-place*, where IPython executes its content but leaves the cursor in the same cell. This is done by",
62 "typing `Ctrl-Enter` instead, and is useful if you want to quickly run a command to check something ",
62 "typing `Ctrl-Enter` instead, and is useful if you want to quickly run a command to check something ",
63 "before tping the real content you want to leave in the cell. For example, in the next cell, try issuing",
63 "before tping the real content you want to leave in the cell. For example, in the next cell, try issuing",
64 "several system commands in-place with `Ctrl-Enter`, such as `pwd` and then `ls`:"
64 "several system commands in-place with `Ctrl-Enter`, such as `pwd` and then `ls`:"
65 ]
65 ]
66 },
66 },
67 {
67 {
68 "cell_type": "code",
68 "cell_type": "code",
69 "collapsed": false,
69 "collapsed": false,
70 "input": [
70 "input": [
71 "ls"
71 "ls"
72 ],
72 ],
73 "language": "python",
73 "language": "python",
74 "outputs": [
74 "outputs": [
75 {
75 {
76 "output_type": "stream",
76 "output_type": "stream",
77 "stream": "stdout",
77 "stream": "stdout",
78 "text": [
78 "text": [
79 "00_notebook_tour.ipynb formatting.ipynb sympy_quantum_computing.ipynb",
79 "00_notebook_tour.ipynb formatting.ipynb sympy_quantum_computing.ipynb",
80 "01_notebook_introduction.ipynb python-logo.svg trapezoid_rule.ipynb",
80 "01_notebook_introduction.ipynb python-logo.svg trapezoid_rule.ipynb",
81 "display_protocol.ipynb sympy.ipynb"
81 "display_protocol.ipynb sympy.ipynb"
82 ]
82 ]
83 }
83 }
84 ],
84 ],
85 "prompt_number": 2
85 "prompt_number": 2
86 },
86 },
87 {
87 {
88 "cell_type": "markdown",
88 "cell_type": "markdown",
89 "source": [
89 "source": [
90 "In a cell, you can type anything from a single python expression to an arbitrarily long amount of code ",
90 "In a cell, you can type anything from a single python expression to an arbitrarily long amount of code ",
91 "(although for reasons of readability, you should probably limit this to a few dozen lines):"
91 "(although for reasons of readability, you should probably limit this to a few dozen lines):"
92 ]
92 ]
93 },
93 },
94 {
94 {
95 "cell_type": "code",
95 "cell_type": "code",
96 "collapsed": false,
96 "collapsed": false,
97 "input": [
97 "input": [
98 "def f(x):",
98 "def f(x):",
99 " \"\"\"My function",
99 " \"\"\"My function",
100 " x : parameter\"\"\"",
100 " x : parameter\"\"\"",
101 " ",
101 " ",
102 " return x+1",
102 " return x+1",
103 "",
103 "",
104 "print \"f(3) = \", f(3)"
104 "print \"f(3) = \", f(3)"
105 ],
105 ],
106 "language": "python",
106 "language": "python",
107 "outputs": [
107 "outputs": [
108 {
108 {
109 "output_type": "stream",
109 "output_type": "stream",
110 "stream": "stdout",
110 "stream": "stdout",
111 "text": [
111 "text": [
112 "f(3) = 4"
112 "f(3) = 4"
113 ]
113 ]
114 }
114 }
115 ],
115 ],
116 "prompt_number": 3
116 "prompt_number": 3
117 },
117 },
118 {
118 {
119 "cell_type": "markdown",
119 "cell_type": "markdown",
120 "source": [
120 "source": [
121 "## User interface",
121 "## User interface",
122 "",
122 "",
123 "When you start a new notebook server with `ipython notebook`, your",
123 "When you start a new notebook server with `ipython notebook`, your",
124 "browser should open into the *Dashboard*, a page listing all notebooks",
124 "browser should open into the *Dashboard*, a page listing all notebooks",
125 "available in the current directory as well as letting you create new",
125 "available in the current directory as well as letting you create new",
126 "notebooks. In this page, you can also drag and drop existing `.py` files",
126 "notebooks. In this page, you can also drag and drop existing `.py` files",
127 "over the file list to import them as notebooks (see the manual for ",
127 "over the file list to import them as notebooks (see the manual for ",
128 "[further details on how these files are ",
128 "[further details on how these files are ",
129 "interpreted](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html)).",
129 "interpreted](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html)).",
130 "",
130 "",
131 "Once you open an existing notebook (like this one) or create a new one,",
131 "Once you open an existing notebook (like this one) or create a new one,",
132 "you are in the main notebook interface, which consists of a main editing",
132 "you are in the main notebook interface, which consists of a main editing",
133 "area (where these cells are contained) as well as a collapsible left panel, ",
133 "area (where these cells are contained) as well as a collapsible left panel, ",
134 "a permanent header area at the top, and a pager that rises from the",
134 "a permanent header area at the top, and a pager that rises from the",
135 "bottom when needed and can be collapsed again."
135 "bottom when needed and can be collapsed again."
136 ]
136 ]
137 },
137 },
138 {
138 {
139 "cell_type": "markdown",
139 "cell_type": "markdown",
140 "source": [
140 "source": [
141 "### Main editing area",
141 "### Main editing area",
142 "",
142 "",
143 "Here, you can move with the arrow keys or using the ",
143 "Here, you can move with the arrow keys or using the ",
144 "scroll bars. The cursor enters code cells immediately, but only selects",
144 "scroll bars. The cursor enters code cells immediately, but only selects",
145 "text (markdown) cells without entering in them; to enter a text cell,",
145 "text (markdown) cells without entering in them; to enter a text cell,",
146 "use `Enter`, and `Shift-Enter` to exit it again (just like to execute a ",
146 "use `Enter`, and `Shift-Enter` to exit it again (just like to execute a ",
147 "code cell)."
147 "code cell)."
148 ]
148 ]
149 },
149 },
150 {
150 {
151 "cell_type": "markdown",
151 "cell_type": "markdown",
152 "source": [
152 "source": [
153 "### Left panel",
153 "### Left panel",
154 "",
154 "",
155 "This panel contains a number of panes that can be",
155 "This panel contains a number of panes that can be",
156 "collapsed vertically by clicking on their title bar, and the whole panel",
156 "collapsed vertically by clicking on their title bar, and the whole panel",
157 "can also be collapsed by clicking on the vertical divider (note that you",
157 "can also be collapsed by clicking on the vertical divider (note that you",
158 "can not *drag* the divider, for now you can only click on it).",
158 "can not *drag* the divider, for now you can only click on it).",
159 "",
159 "",
160 "The *Notebook* section contains actions that pertain to the whole notebook,",
160 "The *Notebook* section contains actions that pertain to the whole notebook,",
161 "such as downloading the current notebook either in its original format",
161 "such as downloading the current notebook either in its original format",
162 "or as a `.py` script, and printing it. When you click the `Print` button,",
162 "or as a `.py` script, and printing it. When you click the `Print` button,",
163 "a new HTML page opens with a static copy of the notebook; you can then",
163 "a new HTML page opens with a static copy of the notebook; you can then",
164 "use your web browser's mechanisms to save or print this file.",
164 "use your web browser's mechanisms to save or print this file.",
165 "",
165 "",
166 "The *Cell* section lets you manipulate individual cells, and the names should ",
166 "The *Cell* section lets you manipulate individual cells, and the names should ",
167 "be fairly self-explanatory.",
167 "be fairly self-explanatory.",
168 "",
168 "",
169 "The *Kernel* section lets you signal the kernel executing your code. ",
169 "The *Kernel* section lets you signal the kernel executing your code. ",
170 "`Interrupt` does the equivalent of hitting `Ctrl-C` at a terminal, and",
170 "`Interrupt` does the equivalent of hitting `Ctrl-C` at a terminal, and",
171 "`Restart` fully kills the kernel process and starts a fresh one. Obviously",
171 "`Restart` fully kills the kernel process and starts a fresh one. Obviously",
172 "this means that all your previous variables are destroyed, but it also",
172 "this means that all your previous variables are destroyed, but it also",
173 "makes it easy to get a fresh kernel in which to re-execute a notebook, perhaps",
173 "makes it easy to get a fresh kernel in which to re-execute a notebook, perhaps",
174 "after changing an extension module for which Python's `reload` mechanism",
174 "after changing an extension module for which Python's `reload` mechanism",
175 "does not work. If you check the 'Kill kernel upon exit' box, when you ",
175 "does not work. If you check the 'Kill kernel upon exit' box, when you ",
176 "close the page IPython will automatically shut down the running kernel;",
176 "close the page IPython will automatically shut down the running kernel;",
177 "otherwise the kernels won't close until you stop the whole ",
177 "otherwise the kernels won't close until you stop the whole ",
178 "",
178 "",
179 "The *Help* section contains links to the documentation of some projects",
179 "The *Help* section contains links to the documentation of some projects",
180 "closely related to IPython as well as the minimal keybindings you need to",
180 "closely related to IPython as well as the minimal keybindings you need to",
181 "know. But you should use `Ctrl-m h` (or click the `QuickHelp` button at",
181 "know. But you should use `Ctrl-m h` (or click the `QuickHelp` button at",
182 "the top) and learn some of the other keybindings, as it will make your ",
182 "the top) and learn some of the other keybindings, as it will make your ",
183 "workflow much more fluid and efficient.",
183 "workflow much more fluid and efficient.",
184 "",
184 "",
185 "The *Configuration* section at the bottom lets you change some values",
185 "The *Configuration* section at the bottom lets you change some values",
186 "related to the display of tooltips and the behavior of the tab completer."
186 "related to the display of tooltips and the behavior of the tab completer."
187 ]
187 ]
188 },
188 },
189 {
189 {
190 "cell_type": "markdown",
190 "cell_type": "markdown",
191 "source": [
191 "source": [
192 "### Header bar",
192 "### Header bar",
193 "",
193 "",
194 "The header area at the top allows you to rename an existing ",
194 "The header area at the top allows you to rename an existing ",
195 "notebook and open up a short help tooltip. This area also indicates",
195 "notebook and open up a short help tooltip. This area also indicates",
196 "with a red **Busy** mark on the right whenever the kernel is busy executing",
196 "with a red **Busy** mark on the right whenever the kernel is busy executing",
197 "code."
197 "code."
198 ]
198 ]
199 },
199 },
200 {
200 {
201 "cell_type": "markdown",
201 "cell_type": "markdown",
202 "source": [
202 "source": [
203 "### The pager at the bottom",
203 "### The pager at the bottom",
204 "",
204 "",
205 "Whenever IPython needs to display additional ",
205 "Whenever IPython needs to display additional ",
206 "information, such as when you type `somefunction?` in a cell, the notebook",
206 "information, such as when you type `somefunction?` in a cell, the notebook",
207 "opens a pane at the bottom where this information is shown. You can keep",
207 "opens a pane at the bottom where this information is shown. You can keep",
208 "this pager pane open for reference (it doesn't block input in the main area)",
208 "this pager pane open for reference (it doesn't block input in the main area)",
209 "or dismiss it by clicking on its divider bar."
209 "or dismiss it by clicking on its divider bar."
210 ]
210 ]
211 },
211 },
212 {
212 {
213 "cell_type": "markdown",
213 "cell_type": "markdown",
214 "source": [
214 "source": [
215 "### Tab completion and tooltips",
215 "### Tab completion and tooltips",
216 "",
216 "",
217 "The notebook uses the same underlying machinery for tab completion that ",
217 "The notebook uses the same underlying machinery for tab completion that ",
218 "IPython uses at the terminal, but displays the information differently.",
218 "IPython uses at the terminal, but displays the information differently.",
219 "Whey you complete with the `Tab` key, IPython shows a drop list with all",
219 "Whey you complete with the `Tab` key, IPython shows a drop list with all",
220 "available completions. If you type more characters while this list is open,",
220 "available completions. If you type more characters while this list is open,",
221 "IPython automatically eliminates from the list options that don't match the",
221 "IPython automatically eliminates from the list options that don't match the",
222 "new characters; once there is only one option left you can hit `Tab` once",
222 "new characters; once there is only one option left you can hit `Tab` once",
223 "more (or `Enter`) to complete. You can also select the completion you",
223 "more (or `Enter`) to complete. You can also select the completion you",
224 "want with the arrow keys or the mouse, and then hit `Enter`.",
224 "want with the arrow keys or the mouse, and then hit `Enter`.",
225 "",
225 "",
226 "In addition, if you hit `Tab` inside of open parentheses, IPython will ",
226 "In addition, if you hit `Tab` inside of open parentheses, IPython will ",
227 "search for the docstring of the last object left of the parens and will",
227 "search for the docstring of the last object left of the parens and will",
228 "display it on a tooltip. For example, type `list(<TAB>` and you will",
228 "display it on a tooltip. For example, type `list(<TAB>` and you will",
229 "see the docstring for the builtin `list` constructor:"
229 "see the docstring for the builtin `list` constructor:"
230 ]
230 ]
231 },
231 },
232 {
232 {
233 "cell_type": "code",
233 "cell_type": "code",
234 "collapsed": true,
234 "collapsed": true,
235 "input": [
235 "input": [
236 "# Position your cursor after the ( and hit the Tab key:",
236 "# Position your cursor after the ( and hit the Tab key:",
237 "list("
237 "list("
238 ],
238 ],
239 "language": "python",
239 "language": "python",
240 "outputs": []
240 "outputs": []
241 },
241 },
242 {
242 {
243 "cell_type": "markdown",
243 "cell_type": "markdown",
244 "source": [
244 "source": [
245 "## The frontend/kernel model",
245 "## The frontend/kernel model",
246 "",
246 "",
247 "The IPython notebook works on a client/server model where an *IPython kernel*",
247 "The IPython notebook works on a client/server model where an *IPython kernel*",
248 "starts in a separate process and acts as a server to executes the code you type,",
248 "starts in a separate process and acts as a server to executes the code you type,",
249 "while the web browser provides acts as a client, providing a front end environment",
249 "while the web browser provides acts as a client, providing a front end environment",
250 "for you to type. But one kernel is capable of simultaneously talking to more than",
250 "for you to type. But one kernel is capable of simultaneously talking to more than",
251 "one client, and they do not all need to be of the same kind. All IPython frontends",
251 "one client, and they do not all need to be of the same kind. All IPython frontends",
252 "are capable of communicating with a kernel, and any number of them can be active",
252 "are capable of communicating with a kernel, and any number of them can be active",
253 "at the same time. In addition to allowing you to have, for example, more than one",
253 "at the same time. In addition to allowing you to have, for example, more than one",
254 "browser session active, this lets you connect clients with different user interface features.",
254 "browser session active, this lets you connect clients with different user interface features.",
255 "",
255 "",
256 "For example, you may want to connect a Qt console to your kernel and use it as a help",
256 "For example, you may want to connect a Qt console to your kernel and use it as a help",
257 "browser, calling `??` on objects in the Qt console (whose pager is more flexible than the",
257 "browser, calling `??` on objects in the Qt console (whose pager is more flexible than the",
258 "one in the notebook). You can start a new Qt console connected to your current kernel by ",
258 "one in the notebook). You can start a new Qt console connected to your current kernel by ",
259 "using the `%qtconsole` magic, this will automatically detect the necessary connection",
259 "using the `%qtconsole` magic, this will automatically detect the necessary connection",
260 "information.",
260 "information.",
261 "",
261 "",
262 "If you want to open one manually, or want to open a text console from a terminal, you can ",
262 "If you want to open one manually, or want to open a text console from a terminal, you can ",
263 "get your kernel's connection information with the `%connect_info` magic:"
263 "get your kernel's connection information with the `%connect_info` magic:"
264 ]
264 ]
265 },
265 },
266 {
266 {
267 "cell_type": "code",
267 "cell_type": "code",
268 "collapsed": false,
268 "collapsed": false,
269 "input": [
269 "input": [
270 "%connect_info"
270 "%connect_info"
271 ],
271 ],
272 "language": "python",
272 "language": "python",
273 "outputs": [
273 "outputs": [
274 {
274 {
275 "output_type": "stream",
275 "output_type": "stream",
276 "stream": "stdout",
276 "stream": "stdout",
277 "text": [
277 "text": [
278 "{",
278 "{",
279 " \"stdin_port\": 53970, ",
279 " \"stdin_port\": 53970, ",
280 " \"ip\": \"127.0.0.1\", ",
280 " \"ip\": \"127.0.0.1\", ",
281 " \"hb_port\": 53971, ",
281 " \"hb_port\": 53971, ",
282 " \"key\": \"30daac61-6b73-4bae-a7d9-9dca538794d5\", ",
282 " \"key\": \"30daac61-6b73-4bae-a7d9-9dca538794d5\", ",
283 " \"shell_port\": 53968, ",
283 " \"shell_port\": 53968, ",
284 " \"iopub_port\": 53969",
284 " \"iopub_port\": 53969",
285 "}",
285 "}",
286 "",
286 "",
287 "Paste the above JSON into a file, and connect with:",
287 "Paste the above JSON into a file, and connect with:",
288 " $> ipython <app> --existing <file>",
288 " $> ipython <app> --existing <file>",
289 "or, if you are local, you can connect with just:",
289 "or, if you are local, you can connect with just:",
290 " $> ipython <app> --existing kernel-dd85d1cc-c335-44f4-bed8-f1a2173a819a.json ",
290 " $> ipython <app> --existing kernel-dd85d1cc-c335-44f4-bed8-f1a2173a819a.json ",
291 "or even just:",
291 "or even just:",
292 " $> ipython <app> --existing ",
292 " $> ipython <app> --existing ",
293 "if this is the most recent IPython session you have started."
293 "if this is the most recent IPython session you have started."
294 ]
294 ]
295 }
295 }
296 ],
296 ],
297 "prompt_number": 4
297 "prompt_number": 4
298 },
298 },
299 {
299 {
300 "cell_type": "markdown",
300 "cell_type": "markdown",
301 "source": [
301 "source": [
302 "## The kernel's `raw_input` and `%debug`",
302 "## The kernel's `raw_input` and `%debug`",
303 "",
303 "",
304 "The one feature the notebook currently doesn't support as a client is the ability to send data to the kernel's",
304 "The one feature the notebook currently doesn't support as a client is the ability to send data to the kernel's",
305 "standard input socket. That is, if the kernel requires information to be typed interactively by calling the",
305 "standard input socket. That is, if the kernel requires information to be typed interactively by calling the",
306 "builtin `raw_input` function, the notebook will be blocked. This happens for example if you run a script",
306 "builtin `raw_input` function, the notebook will be blocked. This happens for example if you run a script",
307 "that queries interactively for parameters, and very importantly, is how the interactive IPython debugger that ",
307 "that queries interactively for parameters, and very importantly, is how the interactive IPython debugger that ",
308 "activates when you type `%debug` works.",
308 "activates when you type `%debug` works.",
309 "",
309 "",
310 "So, in order to be able to use `%debug` or anything else that requires `raw_input`, you can either use a Qt ",
310 "So, in order to be able to use `%debug` or anything else that requires `raw_input`, you can either use a Qt ",
311 "console or a terminal console:",
311 "console or a terminal console:",
312 "",
312 "",
313 "- From the notebook, typing `%qtconsole` finds all the necessary connection data for you.",
313 "- From the notebook, typing `%qtconsole` finds all the necessary connection data for you.",
314 "- From the terminal, first type `%connect_info` while still in the notebook, and then copy and paste the ",
314 "- From the terminal, first type `%connect_info` while still in the notebook, and then copy and paste the ",
315 "resulting information, using `qtconsole` or `console` depending on which type of client you want."
315 "resulting information, using `qtconsole` or `console` depending on which type of client you want."
316 ]
316 ]
317 },
317 },
318 {
318 {
319 "cell_type": "markdown",
319 "cell_type": "markdown",
320 "source": [
320 "source": [
321 "## Display of complex objects",
321 "## Display of complex objects",
322 "",
322 "",
323 "As the 'tour' notebook shows, the IPython notebook has fairly sophisticated display capabilities. In addition",
323 "As the 'tour' notebook shows, the IPython notebook has fairly sophisticated display capabilities. In addition",
324 "to the examples there, you can study the `display_protocol` notebook in this same examples folder, to ",
324 "to the examples there, you can study the `display_protocol` notebook in this same examples folder, to ",
325 "learn how to customize arbitrary objects (in your own code or external libraries) to display in the notebook",
325 "learn how to customize arbitrary objects (in your own code or external libraries) to display in the notebook",
326 "in any way you want, including graphical forms or mathematical expressions."
326 "in any way you want, including graphical forms or mathematical expressions."
327 ]
327 ]
328 },
328 },
329 {
329 {
330 "cell_type": "markdown",
330 "cell_type": "markdown",
331 "source": [
331 "source": [
332 "## Plotting support",
332 "## Plotting support",
333 "",
333 "",
334 "As we've explained already, the notebook is just another frontend talking to the same IPython kernel that",
334 "As we've explained already, the notebook is just another frontend talking to the same IPython kernel that",
335 "you're already familiar with, so the same options for plotting support apply.",
335 "you're already familiar with, so the same options for plotting support apply.",
336 "",
336 "",
337 "If you start the notebook with `--pylab`, you will get matplotlib's floating, interactive windows and you",
337 "If you start the notebook with `--pylab`, you will get matplotlib's floating, interactive windows and you",
338 "can call the `display` function to paste figures into the notebook document. If you start it with ",
338 "can call the `display` function to paste figures into the notebook document. If you start it with ",
339 "`--pylab inline`, all plots will appear inline automatically. In this regard, the notebook works identically",
339 "`--pylab inline`, all plots will appear inline automatically. In this regard, the notebook works identically",
340 "to the Qt console.",
340 "to the Qt console.",
341 "",
341 "",
342 "Note that if you start the notebook server with pylab support, *all* kernels are automatically started in",
342 "Note that if you start the notebook server with pylab support, *all* kernels are automatically started in",
343 "pylab mode and with the same choice of backend (i.e. floating windows or inline figures). But you can also",
343 "pylab mode and with the same choice of backend (i.e. floating windows or inline figures). But you can also",
344 "start the notebook server simply by typing `ipython notebook`, and then selectively turn on pylab support ",
344 "start the notebook server simply by typing `ipython notebook`, and then selectively turn on pylab support ",
345 "only for the notebooks you want by using the `%pylab` magic (see its docstring for details)."
345 "only for the notebooks you want by using the `%pylab` magic (see its docstring for details)."
346 ]
346 ]
347 },
347 },
348 {
348 {
349 "cell_type": "code",
349 "cell_type": "code",
350 "collapsed": false,
350 "collapsed": false,
351 "input": [
351 "input": [
352 "%pylab inline",
352 "%pylab inline",
353 "plot(rand(100))"
353 "plot(rand(100))"
354 ],
354 ],
355 "language": "python",
355 "language": "python",
356 "outputs": [
356 "outputs": [
357 {
357 {
358 "output_type": "stream",
358 "output_type": "stream",
359 "stream": "stdout",
359 "stream": "stdout",
360 "text": [
360 "text": [
361 "",
361 "",
362 "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
362 "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
363 "For more information, type 'help(pylab)'."
363 "For more information, type 'help(pylab)'."
364 ]
364 ]
365 },
365 },
366 {
366 {
367 "output_type": "pyout",
367 "output_type": "pyout",
368 "prompt_number": 5,
368 "prompt_number": 5,
369 "text": [
369 "text": [
370 "[<matplotlib.lines.Line2D at 0x11165bcd0>]"
370 "[<matplotlib.lines.Line2D at 0x11165bcd0>]"
371 ]
371 ]
372 },
372 },
373 {
373 {
374 "output_type": "display_data",
374 "output_type": "display_data",
375 "png": "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\n"
375 "png": "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\n"
376 }
376 }
377 ],
377 ],
378 "prompt_number": 5
378 "prompt_number": 5
379 },
379 },
380 {
380 {
381 "cell_type": "markdown",
381 "cell_type": "markdown",
382 "source": [
382 "source": [
383 "## Security",
383 "## Security",
384 "",
384 "",
385 "By default the notebook only listens on localhost, so it does not expose your computer to attacks coming from",
385 "By default the notebook only listens on localhost, so it does not expose your computer to attacks coming from",
386 "the internet. By default the notebook does not require any authentication, but you can configure it to",
386 "the internet. By default the notebook does not require any authentication, but you can configure it to",
387 "ask for a password before allowing access to the files. ",
387 "ask for a password before allowing access to the files. ",
388 "",
388 "",
389 "Furthermore, you can require the notebook to encrypt all communications by using SSL and making all connections",
389 "Furthermore, you can require the notebook to encrypt all communications by using SSL and making all connections",
390 "using the https protocol instead of plain http. This is a good idea if you decide to run your notebook on",
390 "using the https protocol instead of plain http. This is a good idea if you decide to run your notebook on",
391 "addresses that are visible from the internet. For further details on how to configure this, see the",
391 "addresses that are visible from the internet. For further details on how to configure this, see the",
392 "[security section](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html#security) of the ",
392 "[security section](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html#security) of the ",
393 "manual.",
393 "manual.",
394 "",
394 "",
395 "Finally, note that you can also run a notebook with the `--read-only` flag, which lets you provide access",
395 "Finally, note that you can also run a notebook with the `--read-only` flag, which lets you provide access",
396 "to your notebook documents to others without letting them execute code (which can be useful to broadcast",
396 "to your notebook documents to others without letting them execute code (which can be useful to broadcast",
397 "a computation to colleagues or students, for example). The read-only flag behaves differently depending",
397 "a computation to colleagues or students, for example). The read-only flag behaves differently depending",
398 "on whether the server has a password or not:",
398 "on whether the server has a password or not:",
399 "",
399 "",
400 "- Passwordless server: users directly see all notebooks in read-only mode.",
400 "- Passwordless server: users directly see all notebooks in read-only mode.",
401 "- Password-protected server: users can see all notebooks in read-only mode, but a login button is available",
401 "- Password-protected server: users can see all notebooks in read-only mode, but a login button is available",
402 "and once a user authenticates, he or she obtains write/execute privileges.",
402 "and once a user authenticates, he or she obtains write/execute privileges.",
403 "",
403 "",
404 "The first case above makes it easy to broadcast on the fly an existing notebook by simply starting a *second* ",
404 "The first case above makes it easy to broadcast on the fly an existing notebook by simply starting a *second* ",
405 "notebook server in the same directory as the first, but in read-only mode. This can be done without having",
405 "notebook server in the same directory as the first, but in read-only mode. This can be done without having",
406 "to configure a password first (which requires calling a hashing function and editing a configuration file)."
406 "to configure a password first (which requires calling a hashing function and editing a configuration file)."
407 ]
407 ]
408 },
408 },
409 {
409 {
410 "cell_type": "code",
410 "cell_type": "code",
411 "collapsed": true,
411 "collapsed": true,
412 "input": [],
412 "input": [],
413 "language": "python",
413 "language": "python",
414 "outputs": []
414 "outputs": []
415 }
415 }
416 ]
416 ]
This diff has been collapsed as it changes many lines, (522 lines changed) Show them Hide them
@@ -1,375 +1,375 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "display_protocol"
3 "name": "display_protocol"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "# Using the IPython display protocol for your own objects",
12 "# Using the IPython display protocol for your own objects",
13 "",
13 "",
14 "IPython extends the idea of the ``__repr__`` method in Python to support multiple representations for a given",
14 "IPython extends the idea of the ``__repr__`` method in Python to support multiple representations for a given",
15 "object, which clients can use to display the object according to their capabilities. An object can return multiple",
15 "object, which clients can use to display the object according to their capabilities. An object can return multiple",
16 "representations of itself by implementing special methods, and you can also define at runtime custom display ",
16 "representations of itself by implementing special methods, and you can also define at runtime custom display ",
17 "functions for existing objects whose methods you can't or won't modify. In this notebook, we show how both approaches work.",
17 "functions for existing objects whose methods you can't or won't modify. In this notebook, we show how both approaches work.",
18 "",
18 "",
19 "<br/>",
19 "<br/>",
20 "**Note:** this notebook has had all output cells stripped out so we can include it in the IPython documentation with ",
20 "**Note:** this notebook has had all output cells stripped out so we can include it in the IPython documentation with ",
21 "a minimal file size. You'll need to manually execute the cells to see the output (you can run all of them with the ",
21 "a minimal file size. You'll need to manually execute the cells to see the output (you can run all of them with the ",
22 "\"Run All\" button, or execute each individually). You must start this notebook with",
22 "\"Run All\" button, or execute each individually). You must start this notebook with",
23 "<pre>",
23 "<pre>",
24 "ipython notebook --pylab inline",
24 "ipython notebook --pylab inline",
25 "</pre>",
25 "</pre>",
26 "",
26 "",
27 "to ensure pylab support is available for plots.",
27 "to ensure pylab support is available for plots.",
28 "",
28 "",
29 "## Custom-built classes with dedicated ``_repr_*_`` methods",
29 "## Custom-built classes with dedicated ``_repr_*_`` methods",
30 "",
30 "",
31 "In our first example, we illustrate how objects can expose directly to IPython special representations of",
31 "In our first example, we illustrate how objects can expose directly to IPython special representations of",
32 "themselves, by providing methods such as ``_repr_svg_``, ``_repr_png_``, ``_repr_latex_``, etc. For a full",
32 "themselves, by providing methods such as ``_repr_svg_``, ``_repr_png_``, ``_repr_latex_``, etc. For a full",
33 "list of the special ``_repr_*_`` methods supported, see the code in ``IPython.core.displaypub``.",
33 "list of the special ``_repr_*_`` methods supported, see the code in ``IPython.core.displaypub``.",
34 "",
34 "",
35 "As an illustration, we build a class that holds data generated by sampling a Gaussian distribution with given mean ",
35 "As an illustration, we build a class that holds data generated by sampling a Gaussian distribution with given mean ",
36 "and variance. The class can display itself in a variety of ways: as a LaTeX expression or as an image in PNG or SVG ",
36 "and variance. The class can display itself in a variety of ways: as a LaTeX expression or as an image in PNG or SVG ",
37 "format. Each frontend can then decide which representation it can handle.",
37 "format. Each frontend can then decide which representation it can handle.",
38 "Further, we illustrate how to expose directly to the user the ability to directly access the various alternate ",
38 "Further, we illustrate how to expose directly to the user the ability to directly access the various alternate ",
39 "representations (since by default displaying the object itself will only show one, and which is shown will depend on the ",
39 "representations (since by default displaying the object itself will only show one, and which is shown will depend on the ",
40 "required representations that even cache necessary data in cases where it may be expensive to compute.",
40 "required representations that even cache necessary data in cases where it may be expensive to compute.",
41 "",
41 "",
42 "The next cell defines the Gaussian class:"
42 "The next cell defines the Gaussian class:"
43 ]
43 ]
44 },
44 },
45 {
45 {
46 "cell_type": "code",
46 "cell_type": "code",
47 "collapsed": false,
47 "collapsed": false,
48 "input": [
48 "input": [
49 "from IPython.core.pylabtools import print_figure",
49 "from IPython.core.pylabtools import print_figure",
50 "from IPython.core.display import Image, SVG, Math",
50 "from IPython.core.display import Image, SVG, Math",
51 "",
51 "",
52 "class Gaussian(object):",
52 "class Gaussian(object):",
53 " \"\"\"A simple object holding data sampled from a Gaussian distribution.",
53 " \"\"\"A simple object holding data sampled from a Gaussian distribution.",
54 " \"\"\"",
54 " \"\"\"",
55 " def __init__(self, mean=0, std=1, size=1000):",
55 " def __init__(self, mean=0, std=1, size=1000):",
56 " self.data = np.random.normal(mean, std, size)",
56 " self.data = np.random.normal(mean, std, size)",
57 " self.mean = mean",
57 " self.mean = mean",
58 " self.std = std",
58 " self.std = std",
59 " self.size = size",
59 " self.size = size",
60 " # For caching plots that may be expensive to compute",
60 " # For caching plots that may be expensive to compute",
61 " self._png_data = None",
61 " self._png_data = None",
62 " self._svg_data = None",
62 " self._svg_data = None",
63 " ",
63 " ",
64 " def _figure_data(self, format):",
64 " def _figure_data(self, format):",
65 " fig, ax = plt.subplots()",
65 " fig, ax = plt.subplots()",
66 " ax.plot(self.data, 'o')",
66 " ax.plot(self.data, 'o')",
67 " ax.set_title(self._repr_latex_())",
67 " ax.set_title(self._repr_latex_())",
68 " data = print_figure(fig, format)",
68 " data = print_figure(fig, format)",
69 " # We MUST close the figure, otherwise IPython's display machinery",
69 " # We MUST close the figure, otherwise IPython's display machinery",
70 " # will pick it up and send it as output, resulting in a double display",
70 " # will pick it up and send it as output, resulting in a double display",
71 " plt.close(fig)",
71 " plt.close(fig)",
72 " return data",
72 " return data",
73 " ",
73 " ",
74 " # Here we define the special repr methods that provide the IPython display protocol",
74 " # Here we define the special repr methods that provide the IPython display protocol",
75 " # Note that for the two figures, we cache the figure data once computed.",
75 " # Note that for the two figures, we cache the figure data once computed.",
76 " ",
76 " ",
77 " def _repr_png_(self):",
77 " def _repr_png_(self):",
78 " if self._png_data is None:",
78 " if self._png_data is None:",
79 " self._png_data = self._figure_data('png')",
79 " self._png_data = self._figure_data('png')",
80 " return self._png_data",
80 " return self._png_data",
81 "",
81 "",
82 "",
82 "",
83 " def _repr_svg_(self):",
83 " def _repr_svg_(self):",
84 " if self._svg_data is None:",
84 " if self._svg_data is None:",
85 " self._svg_data = self._figure_data('svg')",
85 " self._svg_data = self._figure_data('svg')",
86 " return self._svg_data",
86 " return self._svg_data",
87 " ",
87 " ",
88 " def _repr_latex_(self):",
88 " def _repr_latex_(self):",
89 " return r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,",
89 " return r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,",
90 " self.std, self.size)",
90 " self.std, self.size)",
91 " ",
91 " ",
92 " # We expose as properties some of the above reprs, so that the user can see them",
92 " # We expose as properties some of the above reprs, so that the user can see them",
93 " # directly (since otherwise the client dictates which one it shows by default)",
93 " # directly (since otherwise the client dictates which one it shows by default)",
94 " @property",
94 " @property",
95 " def png(self):",
95 " def png(self):",
96 " return Image(self._repr_png_(), embed=True)",
96 " return Image(self._repr_png_(), embed=True)",
97 " ",
97 " ",
98 " @property",
98 " @property",
99 " def svg(self):",
99 " def svg(self):",
100 " return SVG(self._repr_svg_())",
100 " return SVG(self._repr_svg_())",
101 " ",
101 " ",
102 " @property",
102 " @property",
103 " def latex(self):",
103 " def latex(self):",
104 " return Math(self._repr_svg_())",
104 " return Math(self._repr_svg_())",
105 " ",
105 " ",
106 " # An example of using a property to display rich information, in this case",
106 " # An example of using a property to display rich information, in this case",
107 " # the histogram of the distribution. We've hardcoded the format to be png",
107 " # the histogram of the distribution. We've hardcoded the format to be png",
108 " # in this case, but in production code it would be trivial to make it an option",
108 " # in this case, but in production code it would be trivial to make it an option",
109 " @property",
109 " @property",
110 " def hist(self):",
110 " def hist(self):",
111 " fig, ax = plt.subplots()",
111 " fig, ax = plt.subplots()",
112 " ax.hist(self.data, bins=100)",
112 " ax.hist(self.data, bins=100)",
113 " ax.set_title(self._repr_latex_())",
113 " ax.set_title(self._repr_latex_())",
114 " data = print_figure(fig, 'png')",
114 " data = print_figure(fig, 'png')",
115 " plt.close(fig)",
115 " plt.close(fig)",
116 " return Image(data, embed=True)"
116 " return Image(data, embed=True)"
117 ],
117 ],
118 "language": "python",
118 "language": "python",
119 "outputs": [],
119 "outputs": [],
120 "prompt_number": 1
120 "prompt_number": 1
121 },
121 },
122 {
122 {
123 "cell_type": "markdown",
123 "cell_type": "markdown",
124 "source": [
124 "source": [
125 "Now, we create an instance of the Gaussian distribution, whose default representation will be its LaTeX form:"
125 "Now, we create an instance of the Gaussian distribution, whose default representation will be its LaTeX form:"
126 ]
126 ]
127 },
127 },
128 {
128 {
129 "cell_type": "code",
129 "cell_type": "code",
130 "collapsed": false,
130 "collapsed": false,
131 "input": [
131 "input": [
132 "x = Gaussian()",
132 "x = Gaussian()",
133 "x"
133 "x"
134 ],
134 ],
135 "language": "python",
135 "language": "python",
136 "outputs": [],
136 "outputs": [],
137 "prompt_number": 2
137 "prompt_number": 2
138 },
138 },
139 {
139 {
140 "cell_type": "markdown",
140 "cell_type": "markdown",
141 "source": [
141 "source": [
142 "We can view the data in png or svg formats:"
142 "We can view the data in png or svg formats:"
143 ]
143 ]
144 },
144 },
145 {
145 {
146 "cell_type": "code",
146 "cell_type": "code",
147 "collapsed": false,
147 "collapsed": false,
148 "input": [
148 "input": [
149 "x.png"
149 "x.png"
150 ],
150 ],
151 "language": "python",
151 "language": "python",
152 "outputs": [],
152 "outputs": [],
153 "prompt_number": 3
153 "prompt_number": 3
154 },
154 },
155 {
155 {
156 "cell_type": "code",
156 "cell_type": "code",
157 "collapsed": false,
157 "collapsed": false,
158 "input": [
158 "input": [
159 "x.svg"
159 "x.svg"
160 ],
160 ],
161 "language": "python",
161 "language": "python",
162 "outputs": [],
162 "outputs": [],
163 "prompt_number": 4
163 "prompt_number": 4
164 },
164 },
165 {
165 {
166 "cell_type": "markdown",
166 "cell_type": "markdown",
167 "source": [
167 "source": [
168 "Since IPython only displays by default as an ``Out[]`` cell the result of the last computation, we can use the",
168 "Since IPython only displays by default as an ``Out[]`` cell the result of the last computation, we can use the",
169 "``display()`` function to show more than one representation in a single cell:"
169 "``display()`` function to show more than one representation in a single cell:"
170 ]
170 ]
171 },
171 },
172 {
172 {
173 "cell_type": "code",
173 "cell_type": "code",
174 "collapsed": false,
174 "collapsed": false,
175 "input": [
175 "input": [
176 "display(x.png)",
176 "display(x.png)",
177 "display(x.svg)"
177 "display(x.svg)"
178 ],
178 ],
179 "language": "python",
179 "language": "python",
180 "outputs": [],
180 "outputs": [],
181 "prompt_number": 5
181 "prompt_number": 5
182 },
182 },
183 {
183 {
184 "cell_type": "markdown",
184 "cell_type": "markdown",
185 "source": [
185 "source": [
186 "Now let's create a new Gaussian with different parameters"
186 "Now let's create a new Gaussian with different parameters"
187 ]
187 ]
188 },
188 },
189 {
189 {
190 "cell_type": "code",
190 "cell_type": "code",
191 "collapsed": false,
191 "collapsed": false,
192 "input": [
192 "input": [
193 "x2 = Gaussian(0.5, 0.2, 2000)",
193 "x2 = Gaussian(0.5, 0.2, 2000)",
194 "x2"
194 "x2"
195 ],
195 ],
196 "language": "python",
196 "language": "python",
197 "outputs": [],
197 "outputs": [],
198 "prompt_number": 6
198 "prompt_number": 6
199 },
199 },
200 {
200 {
201 "cell_type": "markdown",
201 "cell_type": "markdown",
202 "source": [
202 "source": [
203 "We can easily compare them by displaying their histograms"
203 "We can easily compare them by displaying their histograms"
204 ]
204 ]
205 },
205 },
206 {
206 {
207 "cell_type": "code",
207 "cell_type": "code",
208 "collapsed": false,
208 "collapsed": false,
209 "input": [
209 "input": [
210 "display(x.hist)",
210 "display(x.hist)",
211 "display(x2.hist)"
211 "display(x2.hist)"
212 ],
212 ],
213 "language": "python",
213 "language": "python",
214 "outputs": [],
214 "outputs": [],
215 "prompt_number": 7
215 "prompt_number": 7
216 },
216 },
217 {
217 {
218 "cell_type": "markdown",
218 "cell_type": "markdown",
219 "source": [
219 "source": [
220 "## Adding IPython display support to existing objects",
220 "## Adding IPython display support to existing objects",
221 "",
221 "",
222 "When you are directly writing your own classes, you can adapt them for display in IPython by ",
222 "When you are directly writing your own classes, you can adapt them for display in IPython by ",
223 "following the above example. But in practice, we often need to work with existing code we",
223 "following the above example. But in practice, we often need to work with existing code we",
224 "can't modify. ",
224 "can't modify. ",
225 "",
225 "",
226 "We now illustrate how to add these kinds of extended display capabilities to existing objects.",
226 "We now illustrate how to add these kinds of extended display capabilities to existing objects.",
227 "We will use the numpy polynomials and change their default representation to be a formatted",
227 "We will use the numpy polynomials and change their default representation to be a formatted",
228 "LaTeX expression.",
228 "LaTeX expression.",
229 "",
229 "",
230 "First, consider how a numpy polynomial object renders by default:"
230 "First, consider how a numpy polynomial object renders by default:"
231 ]
231 ]
232 },
232 },
233 {
233 {
234 "cell_type": "code",
234 "cell_type": "code",
235 "collapsed": false,
235 "collapsed": false,
236 "input": [
236 "input": [
237 "p = np.polynomial.Polynomial([1,2,3], [-10, 10])",
237 "p = np.polynomial.Polynomial([1,2,3], [-10, 10])",
238 "p"
238 "p"
239 ],
239 ],
240 "language": "python",
240 "language": "python",
241 "outputs": [],
241 "outputs": [],
242 "prompt_number": 8
242 "prompt_number": 8
243 },
243 },
244 {
244 {
245 "cell_type": "markdown",
245 "cell_type": "markdown",
246 "source": [
246 "source": [
247 "Next, we define a function that pretty-prints a polynomial as a LaTeX string:"
247 "Next, we define a function that pretty-prints a polynomial as a LaTeX string:"
248 ]
248 ]
249 },
249 },
250 {
250 {
251 "cell_type": "code",
251 "cell_type": "code",
252 "collapsed": true,
252 "collapsed": true,
253 "input": [
253 "input": [
254 "def poly2latex(p):",
254 "def poly2latex(p):",
255 " terms = ['%.2g' % p.coef[0]]",
255 " terms = ['%.2g' % p.coef[0]]",
256 " if len(p) > 1:",
256 " if len(p) > 1:",
257 " term = 'x'",
257 " term = 'x'",
258 " c = p.coef[1]",
258 " c = p.coef[1]",
259 " if c!=1:",
259 " if c!=1:",
260 " term = ('%.2g ' % c) + term",
260 " term = ('%.2g ' % c) + term",
261 " terms.append(term)",
261 " terms.append(term)",
262 " if len(p) > 2:",
262 " if len(p) > 2:",
263 " for i in range(2, len(p)):",
263 " for i in range(2, len(p)):",
264 " term = 'x^%d' % i",
264 " term = 'x^%d' % i",
265 " c = p.coef[i]",
265 " c = p.coef[i]",
266 " if c!=1:",
266 " if c!=1:",
267 " term = ('%.2g ' % c) + term",
267 " term = ('%.2g ' % c) + term",
268 " terms.append(term)",
268 " terms.append(term)",
269 " px = '$P(x)=%s$' % '+'.join(terms)",
269 " px = '$P(x)=%s$' % '+'.join(terms)",
270 " dom = r', domain: $[%.2g,\\ %.2g]$' % tuple(p.domain)",
270 " dom = r', domain: $[%.2g,\\ %.2g]$' % tuple(p.domain)",
271 " return px+dom"
271 " return px+dom"
272 ],
272 ],
273 "language": "python",
273 "language": "python",
274 "outputs": [],
274 "outputs": [],
275 "prompt_number": 9
275 "prompt_number": 9
276 },
276 },
277 {
277 {
278 "cell_type": "markdown",
278 "cell_type": "markdown",
279 "source": [
279 "source": [
280 "This produces, on our polynomial ``p``, the following:"
280 "This produces, on our polynomial ``p``, the following:"
281 ]
281 ]
282 },
282 },
283 {
283 {
284 "cell_type": "code",
284 "cell_type": "code",
285 "collapsed": false,
285 "collapsed": false,
286 "input": [
286 "input": [
287 "poly2latex(p)"
287 "poly2latex(p)"
288 ],
288 ],
289 "language": "python",
289 "language": "python",
290 "outputs": [],
290 "outputs": [],
291 "prompt_number": 10
291 "prompt_number": 10
292 },
292 },
293 {
293 {
294 "cell_type": "markdown",
294 "cell_type": "markdown",
295 "source": [
295 "source": [
296 "Note that this did *not* produce a formated LaTeX object, because it is simply a string ",
296 "Note that this did *not* produce a formated LaTeX object, because it is simply a string ",
297 "with LaTeX code. In order for this to be interpreted as a mathematical expression, it",
297 "with LaTeX code. In order for this to be interpreted as a mathematical expression, it",
298 "must be properly wrapped into a Math object:"
298 "must be properly wrapped into a Math object:"
299 ]
299 ]
300 },
300 },
301 {
301 {
302 "cell_type": "code",
302 "cell_type": "code",
303 "collapsed": false,
303 "collapsed": false,
304 "input": [
304 "input": [
305 "from IPython.core.display import Math",
305 "from IPython.core.display import Math",
306 "Math(poly2latex(p))"
306 "Math(poly2latex(p))"
307 ],
307 ],
308 "language": "python",
308 "language": "python",
309 "outputs": [],
309 "outputs": [],
310 "prompt_number": 11
310 "prompt_number": 11
311 },
311 },
312 {
312 {
313 "cell_type": "markdown",
313 "cell_type": "markdown",
314 "source": [
314 "source": [
315 "But we can configure IPython to do this automatically for us as follows. We hook into the",
315 "But we can configure IPython to do this automatically for us as follows. We hook into the",
316 "IPython display system and instruct it to use ``poly2latex`` for the latex mimetype, when",
316 "IPython display system and instruct it to use ``poly2latex`` for the latex mimetype, when",
317 "encountering objects of the ``Polynomial`` type defined in the",
317 "encountering objects of the ``Polynomial`` type defined in the",
318 "``numpy.polynomial.polynomial`` module:"
318 "``numpy.polynomial.polynomial`` module:"
319 ]
319 ]
320 },
320 },
321 {
321 {
322 "cell_type": "code",
322 "cell_type": "code",
323 "collapsed": true,
323 "collapsed": true,
324 "input": [
324 "input": [
325 "ip = get_ipython()",
325 "ip = get_ipython()",
326 "latex_formatter = ip.display_formatter.formatters['text/latex']",
326 "latex_formatter = ip.display_formatter.formatters['text/latex']",
327 "latex_formatter.for_type_by_name('numpy.polynomial.polynomial',",
327 "latex_formatter.for_type_by_name('numpy.polynomial.polynomial',",
328 " 'Polynomial', poly2latex)"
328 " 'Polynomial', poly2latex)"
329 ],
329 ],
330 "language": "python",
330 "language": "python",
331 "outputs": [],
331 "outputs": [],
332 "prompt_number": 12
332 "prompt_number": 12
333 },
333 },
334 {
334 {
335 "cell_type": "markdown",
335 "cell_type": "markdown",
336 "source": [
336 "source": [
337 "For more examples on how to use the above system, and how to bundle similar print functions",
337 "For more examples on how to use the above system, and how to bundle similar print functions",
338 "into a convenient IPython extension, see the ``IPython/extensions/sympyprinting.py`` file. ",
338 "into a convenient IPython extension, see the ``IPython/extensions/sympyprinting.py`` file. ",
339 "The machinery that defines the display system is in the ``display.py`` and ``displaypub.py`` ",
339 "The machinery that defines the display system is in the ``display.py`` and ``displaypub.py`` ",
340 "files in ``IPython/core``.",
340 "files in ``IPython/core``.",
341 "",
341 "",
342 "Once our special printer has been loaded, all polynomials will be represented by their ",
342 "Once our special printer has been loaded, all polynomials will be represented by their ",
343 "mathematical form instead:"
343 "mathematical form instead:"
344 ]
344 ]
345 },
345 },
346 {
346 {
347 "cell_type": "code",
347 "cell_type": "code",
348 "collapsed": false,
348 "collapsed": false,
349 "input": [
349 "input": [
350 "p"
350 "p"
351 ],
351 ],
352 "language": "python",
352 "language": "python",
353 "outputs": [],
353 "outputs": [],
354 "prompt_number": 13
354 "prompt_number": 13
355 },
355 },
356 {
356 {
357 "cell_type": "code",
357 "cell_type": "code",
358 "collapsed": false,
358 "collapsed": false,
359 "input": [
359 "input": [
360 "p2 = np.polynomial.Polynomial([-20, 71, -15, 1])",
360 "p2 = np.polynomial.Polynomial([-20, 71, -15, 1])",
361 "p2"
361 "p2"
362 ],
362 ],
363 "language": "python",
363 "language": "python",
364 "outputs": [],
364 "outputs": [],
365 "prompt_number": 14
365 "prompt_number": 14
366 },
366 },
367 {
367 {
368 "cell_type": "code",
368 "cell_type": "code",
369 "collapsed": true,
369 "collapsed": true,
370 "input": [],
370 "input": [],
371 "language": "python",
371 "language": "python",
372 "outputs": [],
372 "outputs": [],
373 "prompt_number": 14
373 "prompt_number": 14
374 }
374 }
375 ]
375 ]
@@ -1,122 +1,122 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "formatting"
3 "name": "formatting"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "# Examples of basic formatting in the notebook",
12 "# Examples of basic formatting in the notebook",
13 "",
13 "",
14 "Normal and formatted text cells such as this one use the ",
14 "Normal and formatted text cells such as this one use the ",
15 "[Markdown](http://daringfireball.net/projects/markdown/basics) syntax.",
15 "[Markdown](http://daringfireball.net/projects/markdown/basics) syntax.",
16 "",
16 "",
17 "",
17 "",
18 "# Title (h1)",
18 "# Title (h1)",
19 "",
19 "",
20 "## Heading (h2)",
20 "## Heading (h2)",
21 "",
21 "",
22 "### Heading (h3)",
22 "### Heading (h3)",
23 "",
23 "",
24 "Here is a paragraph of text.",
24 "Here is a paragraph of text.",
25 "",
25 "",
26 "* One.",
26 "* One.",
27 " - Sublist",
27 " - Sublist",
28 " - Here we go",
28 " - Here we go",
29 " - Sublist",
29 " - Sublist",
30 " - Here we go",
30 " - Here we go",
31 " - Here we go",
31 " - Here we go",
32 "* Two.",
32 "* Two.",
33 " - Sublist",
33 " - Sublist",
34 "* Three.",
34 "* Three.",
35 " - Sublist",
35 " - Sublist",
36 "",
36 "",
37 "Now another list:",
37 "Now another list:",
38 "",
38 "",
39 "---",
39 "---",
40 "",
40 "",
41 "1. Here we go",
41 "1. Here we go",
42 " 1. Sublist",
42 " 1. Sublist",
43 " 2. Sublist",
43 " 2. Sublist",
44 "2. There we go",
44 "2. There we go",
45 "3. Now this",
45 "3. Now this",
46 "",
46 "",
47 "And another paragraph.",
47 "And another paragraph.",
48 "",
48 "",
49 "### Heading (h3)",
49 "### Heading (h3)",
50 "",
50 "",
51 "#### Heading (h4)",
51 "#### Heading (h4)",
52 "",
52 "",
53 "##### Heading (h5)",
53 "##### Heading (h5)",
54 "",
54 "",
55 "###### Heading (h6)",
55 "###### Heading (h6)",
56 "",
56 "",
57 "## Heading (h2)"
57 "## Heading (h2)"
58 ]
58 ]
59 },
59 },
60 {
60 {
61 "cell_type": "markdown",
61 "cell_type": "markdown",
62 "source": [
62 "source": [
63 "# Heading (h1)",
63 "# Heading (h1)",
64 "",
64 "",
65 "## Heading (h2)",
65 "## Heading (h2)",
66 "",
66 "",
67 "### Heading (h3)",
67 "### Heading (h3)",
68 "",
68 "",
69 "#### Heading (h4)",
69 "#### Heading (h4)",
70 "",
70 "",
71 "##### Heading (h5)",
71 "##### Heading (h5)",
72 "",
72 "",
73 "###### Heading (h6)",
73 "###### Heading (h6)",
74 "",
74 "",
75 "Now for a simple code example:",
75 "Now for a simple code example:",
76 "",
76 "",
77 " for i in range(10):",
77 " for i in range(10):",
78 " print i",
78 " print i",
79 "",
79 "",
80 "Now more text"
80 "Now more text"
81 ]
81 ]
82 },
82 },
83 {
83 {
84 "cell_type": "markdown",
84 "cell_type": "markdown",
85 "source": [
85 "source": [
86 "## Heading (h2)",
86 "## Heading (h2)",
87 "",
87 "",
88 "Here is text.",
88 "Here is text.",
89 "",
89 "",
90 "> This is a *block* quote. This is a block quote. This is a block quote. ",
90 "> This is a *block* quote. This is a block quote. This is a block quote. ",
91 "> This is a **block** quote. This is a block quote. This is a block quote. ",
91 "> This is a **block** quote. This is a block quote. This is a block quote. ",
92 "> This is a `block` quote. This is a block quote. This is a block quote. ",
92 "> This is a `block` quote. This is a block quote. This is a block quote. ",
93 "> This is a block quote. This is a block quote. This is a block quote. ",
93 "> This is a block quote. This is a block quote. This is a block quote. ",
94 "> This is a block quote. This is a block quote. This is a block quote. ",
94 "> This is a block quote. This is a block quote. This is a block quote. ",
95 "> This is a block quote. This is a block quote. This is a block quote. ",
95 "> This is a block quote. This is a block quote. This is a block quote. ",
96 "",
96 "",
97 "Here is text",
97 "Here is text",
98 "",
98 "",
99 "<table>",
99 "<table>",
100 "<tr>",
100 "<tr>",
101 "<th>Header 1</th>",
101 "<th>Header 1</th>",
102 "<th>Header 2</th>",
102 "<th>Header 2</th>",
103 "</tr>",
103 "</tr>",
104 "<tr>",
104 "<tr>",
105 "<td>row 1, cell 1</td>",
105 "<td>row 1, cell 1</td>",
106 "<td>row 1, cell 2</td>",
106 "<td>row 1, cell 2</td>",
107 "</tr>",
107 "</tr>",
108 "<tr>",
108 "<tr>",
109 "<td>row 2, cell 1</td>",
109 "<td>row 2, cell 1</td>",
110 "<td>row 2, cell 2</td>",
110 "<td>row 2, cell 2</td>",
111 "</tr>",
111 "</tr>",
112 "</table>"
112 "</table>"
113 ]
113 ]
114 },
114 },
115 {
115 {
116 "cell_type": "code",
116 "cell_type": "code",
117 "collapsed": true,
117 "collapsed": true,
118 "input": [],
118 "input": [],
119 "language": "python",
119 "language": "python",
120 "outputs": [],
120 "outputs": [],
121 "prompt_number": "&nbsp;"
121 "prompt_number": "&nbsp;"
122 }
122 }
This diff has been collapsed as it changes many lines, (684 lines changed) Show them Hide them
@@ -1,322 +1,322 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "sympy"
3 "name": "sympy"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "# SymPy: Open Source Symbolic Mathematics",
12 "# SymPy: Open Source Symbolic Mathematics",
13 "",
13 "",
14 "This notebook uses the [SymPy](http://sympy.org) package to perform symbolic manipulations,",
14 "This notebook uses the [SymPy](http://sympy.org) package to perform symbolic manipulations,",
15 "and combined with numpy and matplotlib, also displays numerical visualizations of symbolically",
15 "and combined with numpy and matplotlib, also displays numerical visualizations of symbolically",
16 "constructed expressions.",
16 "constructed expressions.",
17 "",
17 "",
18 "We first load sympy printing and plotting support, as well as all of sympy:"
18 "We first load sympy printing and plotting support, as well as all of sympy:"
19 ]
19 ]
20 },
20 },
21 {
21 {
22 "cell_type": "code",
22 "cell_type": "code",
23 "collapsed": false,
23 "collapsed": false,
24 "input": [
24 "input": [
25 "%load_ext sympyprinting",
25 "%load_ext sympyprinting",
26 "%pylab inline",
26 "%pylab inline",
27 "",
27 "",
28 "from __future__ import division",
28 "from __future__ import division",
29 "import sympy as sym",
29 "import sympy as sym",
30 "from sympy import *",
30 "from sympy import *",
31 "x, y, z = symbols(\"x y z\")",
31 "x, y, z = symbols(\"x y z\")",
32 "k, m, n = symbols(\"k m n\", integer=True)",
32 "k, m, n = symbols(\"k m n\", integer=True)",
33 "f, g, h = map(Function, 'fgh')"
33 "f, g, h = map(Function, 'fgh')"
34 ],
34 ],
35 "language": "python",
35 "language": "python",
36 "outputs": [
36 "outputs": [
37 {
37 {
38 "output_type": "stream",
38 "output_type": "stream",
39 "stream": "stdout",
39 "stream": "stdout",
40 "text": [
40 "text": [
41 "",
41 "",
42 "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
42 "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
43 "For more information, type 'help(pylab)'."
43 "For more information, type 'help(pylab)'."
44 ]
44 ]
45 }
45 }
46 ],
46 ],
47 "prompt_number": 1
47 "prompt_number": 1
48 },
48 },
49 {
49 {
50 "cell_type": "markdown",
50 "cell_type": "markdown",
51 "source": [
51 "source": [
52 "<h2>Elementary operations</h2>"
52 "<h2>Elementary operations</h2>"
53 ]
53 ]
54 },
54 },
55 {
55 {
56 "cell_type": "code",
56 "cell_type": "code",
57 "collapsed": false,
57 "collapsed": false,
58 "input": [
58 "input": [
59 "Rational(3,2)*pi + exp(I*x) / (x**2 + y)"
59 "Rational(3,2)*pi + exp(I*x) / (x**2 + y)"
60 ],
60 ],
61 "language": "python",
61 "language": "python",
62 "outputs": [
62 "outputs": [
63 {
63 {
64 "latex": [
64 "latex": [
65 "$$\\frac{3}{2} \\pi + \\frac{e^{\\mathbf{\\imath} x}}{x^{2} + y}$$"
65 "$$\\frac{3}{2} \\pi + \\frac{e^{\\mathbf{\\imath} x}}{x^{2} + y}$$"
66 ],
66 ],
67 "output_type": "pyout",
67 "output_type": "pyout",
68 "png": "iVBORw0KGgoAAAANSUhEUgAAAFAAAAAlCAYAAADV/m7fAAAABHNCSVQICAgIfAhkiAAAA91JREFU\naIHt2luIVVUcx/HPjFNm2YxhZA0hk5HkJbtAWTReioIuUyFRmBZGE12wIoiUHoLpoXsRCRFBDyNS\nPmQWVg9RD0FRD5bagwRpdKUYGro4mSHk9PDfR7cnxzn7nL3P8cj5wmHWOrPP//8/e6/1X7+1/ocW\nNdHW6ADqxDm4AluxDb2Yi2FcjnuwqxrD7al2L27DA3gzcXi0sAun4yechHfRgS9xrypvXjk/YEXS\n7sdfmJiH4SOA47EeZ6BT3LxNYgD11GK4I9W+Bt8m7T8xoRbDRxhTxQA5FXfie/FdF+N3fFet4bFy\n4OvYjserNdxg7sbf+AcnYLAoRx1l/QtwHXbjhaKcFswTYga9gsm4vxFB3IUvMKkOvub5/4Oslqni\n4a/ActwkbmLhzMeQSLIwG6O4qg6+B9WYyFNcj89zslURJRkzjB34Oemfi71iFDYTOxwszY4RGq8w\nvVuaOt/geZEvjsUlWIhfy64/EauwUuipQzGKRfg472Ar4CusxcP4Rciw15KYCiGde96q4PqX8Rtu\nxQ3YLCTAgyJp7xEr36e5RpmNFxvo+7DcgqWp/hsOaMWParA7KL8cWHeyrH7rU+0pyWf/FSv1yXkG\n1UxUKx+W47OkPUuI1vFYKxancqbjIrFoldOvSRay0XFe5WzDhUn7WoyofqUbVNkUHi/GhrxKIzDL\nl18oRs2WpN8pxOpZ+DqDnayMF2M7VmOfSC3PFRjLQU6z8hA+FEFyQDuen0tE1dOHjXhayLCz6+E0\nfQPn4zE8ibfFFutQzMSaVH+zyId7iggwAzOEtCJ07cx6Op+Ml1L9m0Ve66qD70H5yJiJQujD++jO\nwWbFzBO548yk3ymSZF8dfK8R53R5sQCP5GivItrEFC4l6jniBs6qdyA10oVHGx0ErBN742ZjpThA\nmIQrM3zuvjyD6Mczmq9it0wUh4bFMf3cDJ8dyCuIPnEDiafYk5fhnLhUVA6fxY1ixG0UK3AtDIzx\n/gTcgVdFWiO2rft3R2kZswjT8J5I6ktwWo2B5Umn0HbrxGnPKqEcRlS2layGJXhH1FVmJ+9dhh9L\nF5Sm6QxRIy0//u6SU800B44TSmEvnsIfyd+sTBPHb+kU1YtPUv0RUVArybidYjbuFg9tp+atGSGm\nUGkvPiUHewOH+d9SbEj1t4viG6rbyjWKq8XI6RELxFYR/7KC/XaLnQ2hk7vFYQqaq3i+QPzG5RRx\ngHte0t+g9m3kYmMfCg+Jw+R9Qu4MiTJBixSrK7zuA9xeYBxHHXNEzadNSKgtQqjvp5mmcCNoF6v2\ndFwsfldTlGRq0aJFi6bjP9GM0XhICUQDAAAAAElFTkSuQmCC\n",
68 "png": "iVBORw0KGgoAAAANSUhEUgAAAFAAAAAlCAYAAADV/m7fAAAABHNCSVQICAgIfAhkiAAAA91JREFU\naIHt2luIVVUcx/HPjFNm2YxhZA0hk5HkJbtAWTReioIuUyFRmBZGE12wIoiUHoLpoXsRCRFBDyNS\nPmQWVg9RD0FRD5bagwRpdKUYGro4mSHk9PDfR7cnxzn7nL3P8cj5wmHWOrPP//8/e6/1X7+1/ocW\nNdHW6ADqxDm4AluxDb2Yi2FcjnuwqxrD7al2L27DA3gzcXi0sAun4yechHfRgS9xrypvXjk/YEXS\n7sdfmJiH4SOA47EeZ6BT3LxNYgD11GK4I9W+Bt8m7T8xoRbDRxhTxQA5FXfie/FdF+N3fFet4bFy\n4OvYjserNdxg7sbf+AcnYLAoRx1l/QtwHXbjhaKcFswTYga9gsm4vxFB3IUvMKkOvub5/4Oslqni\n4a/ActwkbmLhzMeQSLIwG6O4qg6+B9WYyFNcj89zslURJRkzjB34Oemfi71iFDYTOxwszY4RGq8w\nvVuaOt/geZEvjsUlWIhfy64/EauwUuipQzGKRfg472Ar4CusxcP4Rciw15KYCiGde96q4PqX8Rtu\nxQ3YLCTAgyJp7xEr36e5RpmNFxvo+7DcgqWp/hsOaMWParA7KL8cWHeyrH7rU+0pyWf/FSv1yXkG\n1UxUKx+W47OkPUuI1vFYKxancqbjIrFoldOvSRay0XFe5WzDhUn7WoyofqUbVNkUHi/GhrxKIzDL\nl18oRs2WpN8pxOpZ+DqDnayMF2M7VmOfSC3PFRjLQU6z8hA+FEFyQDuen0tE1dOHjXhayLCz6+E0\nfQPn4zE8ibfFFutQzMSaVH+zyId7iggwAzOEtCJ07cx6Op+Ml1L9m0Ve66qD70H5yJiJQujD++jO\nwWbFzBO548yk3ymSZF8dfK8R53R5sQCP5GivItrEFC4l6jniBs6qdyA10oVHGx0ErBN742ZjpThA\nmIQrM3zuvjyD6Mczmq9it0wUh4bFMf3cDJ8dyCuIPnEDiafYk5fhnLhUVA6fxY1ixG0UK3AtDIzx\n/gTcgVdFWiO2rft3R2kZswjT8J5I6ktwWo2B5Umn0HbrxGnPKqEcRlS2layGJXhH1FVmJ+9dhh9L\nF5Sm6QxRIy0//u6SU800B44TSmEvnsIfyd+sTBPHb+kU1YtPUv0RUVArybidYjbuFg9tp+atGSGm\nUGkvPiUHewOH+d9SbEj1t4viG6rbyjWKq8XI6RELxFYR/7KC/XaLnQ2hk7vFYQqaq3i+QPzG5RRx\ngHte0t+g9m3kYmMfCg+Jw+R9Qu4MiTJBixSrK7zuA9xeYBxHHXNEzadNSKgtQqjvp5mmcCNoF6v2\ndFwsfldTlGRq0aJFi6bjP9GM0XhICUQDAAAAAElFTkSuQmCC\n",
69 "prompt_number": 2,
69 "prompt_number": 2,
70 "text": [
70 "text": [
71 "",
71 "",
72 " \u2148\u22c5x ",
72 " \u2148\u22c5x ",
73 "3\u22c5\u03c0 \u212f ",
73 "3\u22c5\u03c0 \u212f ",
74 "\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500",
74 "\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500",
75 " 2 2 ",
75 " 2 2 ",
76 " x + y"
76 " x + y"
77 ]
77 ]
78 }
78 }
79 ],
79 ],
80 "prompt_number": 2
80 "prompt_number": 2
81 },
81 },
82 {
82 {
83 "cell_type": "code",
83 "cell_type": "code",
84 "collapsed": false,
84 "collapsed": false,
85 "input": [
85 "input": [
86 "exp(I*x).subs(x,pi).evalf()"
86 "exp(I*x).subs(x,pi).evalf()"
87 ],
87 ],
88 "language": "python",
88 "language": "python",
89 "outputs": [
89 "outputs": [
90 {
90 {
91 "latex": [
91 "latex": [
92 "$$-1.0$$"
92 "$$-1.0$$"
93 ],
93 ],
94 "output_type": "pyout",
94 "output_type": "pyout",
95 "png": "iVBORw0KGgoAAAANSUhEUgAAACsAAAASCAYAAADCKCelAAAABHNCSVQICAgIfAhkiAAAAU1JREFU\nSInt1csrBlEcxvGPWxKFhcsCK5QFJVlYsfJPsLKQjf8CG8qejVKWkhUbsRBZuWzct0okxQK5LGam\npmmU923evMpTp9N5njm/+c7MmXP4QyopQM0WbKM9j3mzuMEjKjCP+yzhIlVjGOf4zHFuGS4xHvOm\nsInSTOhi6sIaZrArd9gRvAgeOFJHWGcsC8DvtCR32ENspfhXWI0Gmb/iPFSOHlykZJcYigbFANsk\n+NGfUrJn1KOS4oBtDvvnlCzy6igO2Jew/0jJKuJZMcCe4fWbrBpvuCNY3JG6seDnB8UhJvIEjOsN\np4K1mVQNboW7Sxz2BAMZ3DwfHaM14ZWhF3uR8RvLoBVVCe8Igwm/H7WYKyTMuuCzNaZkfXjHRsKv\nFxzTkzFvAfuFAGzEjmBj/wzbAw4wGruuDdeYTqnRiWUshm0FDYWA/def1heszTze5axPeQAAAABJ\nRU5ErkJggg==\n",
95 "png": "iVBORw0KGgoAAAANSUhEUgAAACsAAAASCAYAAADCKCelAAAABHNCSVQICAgIfAhkiAAAAU1JREFU\nSInt1csrBlEcxvGPWxKFhcsCK5QFJVlYsfJPsLKQjf8CG8qejVKWkhUbsRBZuWzct0okxQK5LGam\npmmU923evMpTp9N5njm/+c7MmXP4QyopQM0WbKM9j3mzuMEjKjCP+yzhIlVjGOf4zHFuGS4xHvOm\nsInSTOhi6sIaZrArd9gRvAgeOFJHWGcsC8DvtCR32ENspfhXWI0Gmb/iPFSOHlykZJcYigbFANsk\n+NGfUrJn1KOS4oBtDvvnlCzy6igO2Jew/0jJKuJZMcCe4fWbrBpvuCNY3JG6seDnB8UhJvIEjOsN\np4K1mVQNboW7Sxz2BAMZ3DwfHaM14ZWhF3uR8RvLoBVVCe8Igwm/H7WYKyTMuuCzNaZkfXjHRsKv\nFxzTkzFvAfuFAGzEjmBj/wzbAw4wGruuDdeYTqnRiWUshm0FDYWA/def1heszTze5axPeQAAAABJ\nRU5ErkJggg==\n",
96 "prompt_number": 4,
96 "prompt_number": 4,
97 "text": [
97 "text": [
98 "-1.00000000000000"
98 "-1.00000000000000"
99 ]
99 ]
100 }
100 }
101 ],
101 ],
102 "prompt_number": 4
102 "prompt_number": 4
103 },
103 },
104 {
104 {
105 "cell_type": "code",
105 "cell_type": "code",
106 "collapsed": true,
106 "collapsed": true,
107 "input": [
107 "input": [
108 "e = x + 2*y"
108 "e = x + 2*y"
109 ],
109 ],
110 "language": "python",
110 "language": "python",
111 "outputs": [],
111 "outputs": [],
112 "prompt_number": 5
112 "prompt_number": 5
113 },
113 },
114 {
114 {
115 "cell_type": "code",
115 "cell_type": "code",
116 "collapsed": false,
116 "collapsed": false,
117 "input": [
117 "input": [
118 "srepr(e)"
118 "srepr(e)"
119 ],
119 ],
120 "language": "python",
120 "language": "python",
121 "outputs": [
121 "outputs": [
122 {
122 {
123 "output_type": "pyout",
123 "output_type": "pyout",
124 "prompt_number": 6,
124 "prompt_number": 6,
125 "text": [
125 "text": [
126 "Add(Symbol('x'), Mul(Integer(2), Symbol('y')))"
126 "Add(Symbol('x'), Mul(Integer(2), Symbol('y')))"
127 ]
127 ]
128 }
128 }
129 ],
129 ],
130 "prompt_number": 6
130 "prompt_number": 6
131 },
131 },
132 {
132 {
133 "cell_type": "code",
133 "cell_type": "code",
134 "collapsed": false,
134 "collapsed": false,
135 "input": [
135 "input": [
136 "exp(pi * sqrt(163)).evalf(50)"
136 "exp(pi * sqrt(163)).evalf(50)"
137 ],
137 ],
138 "language": "python",
138 "language": "python",
139 "outputs": [
139 "outputs": [
140 {
140 {
141 "latex": [
141 "latex": [
142 "$$262537412640768743.99999999999925007259719818568888$$"
142 "$$262537412640768743.99999999999925007259719818568888$$"
143 ],
143 ],
144 "output_type": "pyout",
144 "output_type": "pyout",
145 "png": "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\n",
145 "png": "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\n",
146 "prompt_number": 7,
146 "prompt_number": 7,
147 "text": [
147 "text": [
148 "262537412640768743.99999999999925007259719818568888"
148 "262537412640768743.99999999999925007259719818568888"
149 ]
149 ]
150 }
150 }
151 ],
151 ],
152 "prompt_number": 7
152 "prompt_number": 7
153 },
153 },
154 {
154 {
155 "cell_type": "markdown",
155 "cell_type": "markdown",
156 "source": [
156 "source": [
157 "<h2>Algebra<h2>"
157 "<h2>Algebra<h2>"
158 ]
158 ]
159 },
159 },
160 {
160 {
161 "cell_type": "code",
161 "cell_type": "code",
162 "collapsed": false,
162 "collapsed": false,
163 "input": [
163 "input": [
164 "eq = ((x+y)**2 * (x+1))",
164 "eq = ((x+y)**2 * (x+1))",
165 "eq"
165 "eq"
166 ],
166 ],
167 "language": "python",
167 "language": "python",
168 "outputs": [
168 "outputs": [
169 {
169 {
170 "latex": [
170 "latex": [
171 "$$\\left(x + 1\\right) \\left(x + y\\right)^{2}$$"
171 "$$\\left(x + 1\\right) \\left(x + y\\right)^{2}$$"
172 ],
172 ],
173 "output_type": "pyout",
173 "output_type": "pyout",
174 "png": "iVBORw0KGgoAAAANSUhEUgAAAHQAAAAbCAYAAACtOKuoAAAABHNCSVQICAgIfAhkiAAAA/tJREFU\naIHt2luoVFUcx/GPZp7Ek0bUKcrsImVmnlMhSUFmUhbhSxASkUQJBV3einrq9tCN0tDEkB4mouuT\nLxldKC0sDOqhyEq7GEFlGBVGZlb28N+Hs9yz9zkz4+wzh858YZi9Lnvt/3+tvX7rv9YMXf5XTOi0\nAV1aYgGuxGTMwT34uKMWdWmZXqxN0suwB9M7Y06XQ6Uf/2JWlp6GA1jaMYu6HBIThOQOLpdzxYDO\nGe6mS3FEtXY1zQx8WZDfI+wdrzyLxwcTEwsqLMZM/DlaFo3AVCzBW4ZkJmUfFuKc0TRqjLACP+CO\nsgq9eKFiI/oxqcG6c7ABD2KLkJYijsRWwwcGVatOM341wkjKs1QMKEzBKUWV7lf94lore3gD95UN\nKFyD20rKFuPGFp7ZDDWt+TUcDyhWnovFYB6ffa7FBUUNbMNhbTYqT001A9qreC82GqpDNQNapDyn\niW3KgdxnGgdLxDyhx//kGj0LNwgJmI6bhWYfg+NwN75trx8t8buw6Ux8nuTfiecK6nfSrz7cgvlY\nh1eSsltxlZDbPViF5XgyK/9aDPSIXIencnknY6Wh4OllfIrLMmP246amXKluhsImcYKSUqQ6nfbr\nMfES3YX3cmVb8WKSLlOeQtIo91j8liu/HfeKjSxx1LQXb2AXHhKdMVbY7uBOLVOdTvrVjx2iry/B\n90nZVJyHzUleqjwjkg5oj/o3ea2Y9oPMx2vZ9XfiDPHXRh40SuxxsBwNiM7L00m/fsIzOFEoQroc\nXCiWwXdy92wXa+eIpGvobvWR0jfJ9ezMiLcbaVgYPVCQPxPn46+CshX4sMH2izgdnyTpItWhs379\nmH0vE7NvY1LvIjEO23L355WnlHRAd+KMYeouzoxNNX8Wviqpf31Jfg33Zc9rN7NF0DBIkerk6ZRf\nl4uXaF+StxDvqo8V8spTSiq5W3CCoQ7oEdIzL0tfIaLHP7J0r/J9XyeYJNaa95O83WLWpowVv07C\nFzm7FqiXW8KHXY00mg7oXvHGnJ2lF4mDhlk4V0z5v7OyyaJTnmjkIW3i6Oy7r6R8rlgH9yd5O9Wr\nziJjw6/PhEwPsk6cZG0uqJtXnoYZwKvZ9VFiwV4jDn8Px2qsxyOiM1qhpvHwvk84uMPQBvoXfCC2\nWSkb1f/iMEWsoansjgW/iBn6Jp4WivC6CMTy5+uT8HNmZ0usFAt2VdS0/0RlmdjbFbFBcRDTbmpa\n92uiCJZWFZQN4PkW20X8zvaweLurYLU4f2wXPXhU+d9pUtWpkmb8WoOPkvRyERzNKKhbpDzjnqpV\np1l2iogYThVHjEsK6g2nPOOaqlWnWa7GS+J8dr3iX1RGUp4uXbp06dKlSxv5DwKJ3tRzwoGmAAAA\nAElFTkSuQmCC\n",
174 "png": "iVBORw0KGgoAAAANSUhEUgAAAHQAAAAbCAYAAACtOKuoAAAABHNCSVQICAgIfAhkiAAAA/tJREFU\naIHt2luoVFUcx/GPZp7Ek0bUKcrsImVmnlMhSUFmUhbhSxASkUQJBV3einrq9tCN0tDEkB4mouuT\nLxldKC0sDOqhyEq7GEFlGBVGZlb28N+Hs9yz9zkz4+wzh858YZi9Lnvt/3+tvX7rv9YMXf5XTOi0\nAV1aYgGuxGTMwT34uKMWdWmZXqxN0suwB9M7Y06XQ6Uf/2JWlp6GA1jaMYu6HBIThOQOLpdzxYDO\nGe6mS3FEtXY1zQx8WZDfI+wdrzyLxwcTEwsqLMZM/DlaFo3AVCzBW4ZkJmUfFuKc0TRqjLACP+CO\nsgq9eKFiI/oxqcG6c7ABD2KLkJYijsRWwwcGVatOM341wkjKs1QMKEzBKUWV7lf94lore3gD95UN\nKFyD20rKFuPGFp7ZDDWt+TUcDyhWnovFYB6ffa7FBUUNbMNhbTYqT001A9qreC82GqpDNQNapDyn\niW3KgdxnGgdLxDyhx//kGj0LNwgJmI6bhWYfg+NwN75trx8t8buw6Ux8nuTfiecK6nfSrz7cgvlY\nh1eSsltxlZDbPViF5XgyK/9aDPSIXIencnknY6Wh4OllfIrLMmP246amXKluhsImcYKSUqQ6nfbr\nMfES3YX3cmVb8WKSLlOeQtIo91j8liu/HfeKjSxx1LQXb2AXHhKdMVbY7uBOLVOdTvrVjx2iry/B\n90nZVJyHzUleqjwjkg5oj/o3ea2Y9oPMx2vZ9XfiDPHXRh40SuxxsBwNiM7L00m/fsIzOFEoQroc\nXCiWwXdy92wXa+eIpGvobvWR0jfJ9ezMiLcbaVgYPVCQPxPn46+CshX4sMH2izgdnyTpItWhs379\nmH0vE7NvY1LvIjEO23L355WnlHRAd+KMYeouzoxNNX8Wviqpf31Jfg33Zc9rN7NF0DBIkerk6ZRf\nl4uXaF+StxDvqo8V8spTSiq5W3CCoQ7oEdIzL0tfIaLHP7J0r/J9XyeYJNaa95O83WLWpowVv07C\nFzm7FqiXW8KHXY00mg7oXvHGnJ2lF4mDhlk4V0z5v7OyyaJTnmjkIW3i6Oy7r6R8rlgH9yd5O9Wr\nziJjw6/PhEwPsk6cZG0uqJtXnoYZwKvZ9VFiwV4jDn8Px2qsxyOiM1qhpvHwvk84uMPQBvoXfCC2\nWSkb1f/iMEWsoansjgW/iBn6Jp4WivC6CMTy5+uT8HNmZ0usFAt2VdS0/0RlmdjbFbFBcRDTbmpa\n92uiCJZWFZQN4PkW20X8zvaweLurYLU4f2wXPXhU+d9pUtWpkmb8WoOPkvRyERzNKKhbpDzjnqpV\np1l2iogYThVHjEsK6g2nPOOaqlWnWa7GS+J8dr3iX1RGUp4uXbp06dKlSxv5DwKJ3tRzwoGmAAAA\nAElFTkSuQmCC\n",
175 "prompt_number": 8,
175 "prompt_number": 8,
176 "text": [
176 "text": [
177 "",
177 "",
178 " 2",
178 " 2",
179 "(x + 1)\u22c5(x + y) "
179 "(x + 1)\u22c5(x + y) "
180 ]
180 ]
181 }
181 }
182 ],
182 ],
183 "prompt_number": 8
183 "prompt_number": 8
184 },
184 },
185 {
185 {
186 "cell_type": "code",
186 "cell_type": "code",
187 "collapsed": false,
187 "collapsed": false,
188 "input": [
188 "input": [
189 "expand(eq)"
189 "expand(eq)"
190 ],
190 ],
191 "language": "python",
191 "language": "python",
192 "outputs": [
192 "outputs": [
193 {
193 {
194 "latex": [
194 "latex": [
195 "$$x^{3} + 2 x^{2} y + x^{2} + x y^{2} + 2 x y + y^{2}$$"
195 "$$x^{3} + 2 x^{2} y + x^{2} + x y^{2} + 2 x y + y^{2}$$"
196 ],
196 ],
197 "output_type": "pyout",
197 "output_type": "pyout",
198 "png": "iVBORw0KGgoAAAANSUhEUgAAAQ0AAAAbCAYAAABm6to6AAAABHNCSVQICAgIfAhkiAAABQhJREFU\neJzt3FmoVVUcx/GPF/FaWiY0SINlBqKWUUiiZNpgSPgimFA+lAhFgw9BUBBNZBSNRlRQQTuKiqDh\nQUMwaCACi6KBJposIpKCBqPRtIe1Lx5P9+reZ+199jnd9YXL2Wutff7r//uv5Tp7DVsSiUSiBGM6\n/N6pmIbJWIQH8GJVTjXAPJyDcZiJ6/Beox7FkfQkYqgl3l/jgvx6DX7FYKzRhpiI+1rSK7Edk5px\nJ5qkJxFDbfE+HhPy6xX4Xf8OGnOwE9Pz9IHYhWWNeRRH0pOIoSvxfgLXVGmwy4wRHseGpmqzhSDN\nbMyjOJKeRAy1xvtkXI+HsH8VBkswCxuxGW9gvbC+UgWP4c6KbPUCSU88dfa3XqeWeF+Et7Bf1YZH\nYAZew9Q8PRnv53+HR9peg9t0vkDcayQ98dTZ33qdyuI9D9uE3RPCKLwLSyNszsHYgvc+hwVteQty\nH+6J8GGZECTCAHhMhK2ilNFdlir11OlnUZrSU1d/q5I62qfSfw/ThZF3aOHzPPyJQyJsZiWc2oaP\ncUBL3lj8gQ86rH+REKAp+d/5mN+hrTJk6hmcqtaT6c4gOhJN6qmjv1VNptr22Wu8OxmdPhfmOGuF\nfdz5OA3fx3pakM9wkrB7sz3P26HzgetYbBC2mlrp1y29pKdaqu5vvc4+490+aMzCauEpYhIuxpU4\nGIfhanwlPLI1xSJB0E8teVOFraENbfcW0fOFPX9F9sWhuBRzhUNtG1vKLsNynFXCXhnq0FMHRftR\n0Vg2qafq/lZGdx0UqbtwvI/GXRjI008Lj19L8gr+FhY96yAT93h1K/6x59yzLj13CB3iKrzeVrYF\nT5WwlSmuu1/ap4yfVcayDJlm+1vVujPF9UTXPdByvVbYQt2Zp8cJh7Y2C/O6W4RA9BrH4XKss2cQ\n6tAzB5/iZ5yOb1vKJgjb0K+UtFmUfmmfon42GcsYYvtbk7orr3taW/ob3BzhYBkynY384/GmsC3U\nTh16puR1HiH80ixvKVsirKjPLmEvU1x3v7RPUT+rjmUZMs31tzp0Z4rpqaTu1jWNL1uuZ+SGXyrg\nSBkexYnD5E/FKfhrmLI1wjmQdsbgEWzCtcOU16Hnu/xzpfC+zQstZQvxAz4c5ntV6O6X9inqZ6ex\nLEMv9rcY3bF6ao35JcLqcOtJz+kj3FsFmfIj/zr/bbwLR7i3aj2b8Hxb3st4tqSdTGe/eP3QPhTz\ns6pYliHTfH+rUnemnJ6ouofWNAaF119PyNNLhb3p3/L0RGEe1yusFuaON7XlL8w/69ZzFD5pSQ8K\nh95ejbC5N/qlfTrxs9ux7IQ6+luTuqPqHpqeLMaNwjvzY4VRa0deNk4IyPpoV6vhDNwujJaPt+QP\n2r0ItVi9ej6y+1gxYetqvPoWsBbrj/ZZrLyf3Y5lWerqb03qjqp7aNDYIryteqYwL5orHOB6ED/i\nSWF/uRd4Bgdh1TBl6/LPuvVcIcxvH8Y7OFJYkX43wube6Jf26cTPbseyLHX1tyZ193rMC5Fp9phy\nDAPCAtPdHXw30x+6M93xMyaWZcj0VtxjdWc611O67oF939IVfhHO8vcD9+LtlvQq4c3HTl4f7hfd\ndflZZSzL0HTcq9ZdRk9TMR/VbMUN+fU04bHz7Kac6XO2Gp2x3Ko53dF1/1/+n4VusgLnCi/ojcP9\nwrwwUZ7RGssmdY/WmCcSiUQikUgkEolEIpEY5fwLmrvyxplDsPoAAAAASUVORK5CYII=\n",
198 "png": "iVBORw0KGgoAAAANSUhEUgAAAQ0AAAAbCAYAAABm6to6AAAABHNCSVQICAgIfAhkiAAABQhJREFU\neJzt3FmoVVUcx/GPF/FaWiY0SINlBqKWUUiiZNpgSPgimFA+lAhFgw9BUBBNZBSNRlRQQTuKiqDh\nQUMwaCACi6KBJposIpKCBqPRtIe1Lx5P9+reZ+199jnd9YXL2Wutff7r//uv5Tp7DVsSiUSiBGM6\n/N6pmIbJWIQH8GJVTjXAPJyDcZiJ6/Beox7FkfQkYqgl3l/jgvx6DX7FYKzRhpiI+1rSK7Edk5px\nJ5qkJxFDbfE+HhPy6xX4Xf8OGnOwE9Pz9IHYhWWNeRRH0pOIoSvxfgLXVGmwy4wRHseGpmqzhSDN\nbMyjOJKeRAy1xvtkXI+HsH8VBkswCxuxGW9gvbC+UgWP4c6KbPUCSU88dfa3XqeWeF+Et7Bf1YZH\nYAZew9Q8PRnv53+HR9peg9t0vkDcayQ98dTZ33qdyuI9D9uE3RPCKLwLSyNszsHYgvc+hwVteQty\nH+6J8GGZECTCAHhMhK2ilNFdlir11OlnUZrSU1d/q5I62qfSfw/ThZF3aOHzPPyJQyJsZiWc2oaP\ncUBL3lj8gQ86rH+REKAp+d/5mN+hrTJk6hmcqtaT6c4gOhJN6qmjv1VNptr22Wu8OxmdPhfmOGuF\nfdz5OA3fx3pakM9wkrB7sz3P26HzgetYbBC2mlrp1y29pKdaqu5vvc4+490+aMzCauEpYhIuxpU4\nGIfhanwlPLI1xSJB0E8teVOFraENbfcW0fOFPX9F9sWhuBRzhUNtG1vKLsNynFXCXhnq0FMHRftR\n0Vg2qafq/lZGdx0UqbtwvI/GXRjI008Lj19L8gr+FhY96yAT93h1K/6x59yzLj13CB3iKrzeVrYF\nT5WwlSmuu1/ap4yfVcayDJlm+1vVujPF9UTXPdByvVbYQt2Zp8cJh7Y2C/O6W4RA9BrH4XKss2cQ\n6tAzB5/iZ5yOb1vKJgjb0K+UtFmUfmmfon42GcsYYvtbk7orr3taW/ob3BzhYBkynY384/GmsC3U\nTh16puR1HiH80ixvKVsirKjPLmEvU1x3v7RPUT+rjmUZMs31tzp0Z4rpqaTu1jWNL1uuZ+SGXyrg\nSBkexYnD5E/FKfhrmLI1wjmQdsbgEWzCtcOU16Hnu/xzpfC+zQstZQvxAz4c5ntV6O6X9inqZ6ex\nLEMv9rcY3bF6ao35JcLqcOtJz+kj3FsFmfIj/zr/bbwLR7i3aj2b8Hxb3st4tqSdTGe/eP3QPhTz\ns6pYliHTfH+rUnemnJ6ouofWNAaF119PyNNLhb3p3/L0RGEe1yusFuaON7XlL8w/69ZzFD5pSQ8K\nh95ejbC5N/qlfTrxs9ux7IQ6+luTuqPqHpqeLMaNwjvzY4VRa0deNk4IyPpoV6vhDNwujJaPt+QP\n2r0ItVi9ej6y+1gxYetqvPoWsBbrj/ZZrLyf3Y5lWerqb03qjqp7aNDYIryteqYwL5orHOB6ED/i\nSWF/uRd4Bgdh1TBl6/LPuvVcIcxvH8Y7OFJYkX43wube6Jf26cTPbseyLHX1tyZ193rMC5Fp9phy\nDAPCAtPdHXw30x+6M93xMyaWZcj0VtxjdWc611O67oF939IVfhHO8vcD9+LtlvQq4c3HTl4f7hfd\ndflZZSzL0HTcq9ZdRk9TMR/VbMUN+fU04bHz7Kac6XO2Gp2x3Ko53dF1/1/+n4VusgLnCi/ojcP9\nwrwwUZ7RGssmdY/WmCcSiUQikUgkEolEIpEY5fwLmrvyxplDsPoAAAAASUVORK5CYII=\n",
199 "prompt_number": 9,
199 "prompt_number": 9,
200 "text": [
200 "text": [
201 "",
201 "",
202 " 3 2 2 2 2",
202 " 3 2 2 2 2",
203 "x + 2\u22c5x \u22c5y + x + x\u22c5y + 2\u22c5x\u22c5y + y "
203 "x + 2\u22c5x \u22c5y + x + x\u22c5y + 2\u22c5x\u22c5y + y "
204 ]
204 ]
205 }
205 }
206 ],
206 ],
207 "prompt_number": 9
207 "prompt_number": 9
208 },
208 },
209 {
209 {
210 "cell_type": "code",
210 "cell_type": "code",
211 "collapsed": false,
211 "collapsed": false,
212 "input": [
212 "input": [
213 "a = 1/x + (x*sin(x) - 1)/x",
213 "a = 1/x + (x*sin(x) - 1)/x",
214 "a"
214 "a"
215 ],
215 ],
216 "language": "python",
216 "language": "python",
217 "outputs": [
217 "outputs": [
218 {
218 {
219 "latex": [
219 "latex": [
220 "$$\\frac{x \\operatorname{sin}\\left(x\\right) -1}{x} + \\frac{1}{x}$$"
220 "$$\\frac{x \\operatorname{sin}\\left(x\\right) -1}{x} + \\frac{1}{x}$$"
221 ],
221 ],
222 "output_type": "pyout",
222 "output_type": "pyout",
223 "png": "iVBORw0KGgoAAAANSUhEUgAAAFwAAAAbCAYAAADxsuiMAAAABHNCSVQICAgIfAhkiAAAAolJREFU\naIHt2duLjVEYx/HPMONYaHIYFyYkF3KYQkiKuEEyLgwhh5kQV3Io/4C4JbmR2pMLKTXiSiTlAiHl\nmEPKFSlFKUY0LtaavGl2+52xZ+/X3vtbb3u9z177+a3D8z5rvWtT479kLh6XuxF/MQ7X0Zwl3foi\nibzE+iL5Kga7MR6rMKQKdDNDD6ZmSTcZ4UsxXUgPd9GElTiMt1iHKfiIblwVZnEnFuMknqERezEf\nxzAz/m4yDkWtmXiVQndk9FlxjEFHLG/AvVjuFAZgOB5E2wRcSdSdiPPYGG17MAyvsSnh/0ssNwiP\nXBrdSVjyD/3KbIT/EAYNFqErlnck6o3FE1xDe7TfQB1WCAMNF4RJGY6L0Tbfn0hdlCgX0oU1uIP9\nwpOQj/sJvWIyF8/xcxB8g4dYGMvjEvaRaMVtHE/Y9+E0RgvRC9uRS9Q5g4PCpG3V92KdT7e9j7pp\nKUaE5wbgI69u70q6Ggdipdl4FL/bImxv3uMXLuMc3iR8bBNSQFsUIuTgm4k6bULkb8ZnIV0U0u2l\nQQUxNH4uwxwhH99CS7y/JCyS9ZgmDH4jziZ8zBAi9yneRdsRnMDXeD8LI4R14Hn0/baA7reo24wX\n/ezXDmEiW2K7m4QFeSC0xrZ9LrFuUVmbst5yjBrEdqQhpzwLb9WSU8QBr8q3oXJSV+4GZIhOzOvD\n3owPwhb2bzqE3VW/6amyqz/kpEspqbR798O1SP93Uo1hLYeXmGIdz6al0AHZ/06m+lfooCqr5KTL\n4Znr3wjhFJHwFnq0HI0YAKekG7BM9y/fQVWlkIn+JQ+quoX1Y4hw7FoJpOpfKbeDu7BA+GOiHt/j\n1YVPJWzHYFHp/atRo0aNquc3S/HNyBXE+1kAAAAASUVORK5CYII=\n",
223 "png": "iVBORw0KGgoAAAANSUhEUgAAAFwAAAAbCAYAAADxsuiMAAAABHNCSVQICAgIfAhkiAAAAolJREFU\naIHt2duLjVEYx/HPMONYaHIYFyYkF3KYQkiKuEEyLgwhh5kQV3Io/4C4JbmR2pMLKTXiSiTlAiHl\nmEPKFSlFKUY0LtaavGl2+52xZ+/X3vtbb3u9z177+a3D8z5rvWtT479kLh6XuxF/MQ7X0Zwl3foi\nibzE+iL5Kga7MR6rMKQKdDNDD6ZmSTcZ4UsxXUgPd9GElTiMt1iHKfiIblwVZnEnFuMknqERezEf\nxzAz/m4yDkWtmXiVQndk9FlxjEFHLG/AvVjuFAZgOB5E2wRcSdSdiPPYGG17MAyvsSnh/0ssNwiP\nXBrdSVjyD/3KbIT/EAYNFqErlnck6o3FE1xDe7TfQB1WCAMNF4RJGY6L0Tbfn0hdlCgX0oU1uIP9\nwpOQj/sJvWIyF8/xcxB8g4dYGMvjEvaRaMVtHE/Y9+E0RgvRC9uRS9Q5g4PCpG3V92KdT7e9j7pp\nKUaE5wbgI69u70q6Ggdipdl4FL/bImxv3uMXLuMc3iR8bBNSQFsUIuTgm4k6bULkb8ZnIV0U0u2l\nQQUxNH4uwxwhH99CS7y/JCyS9ZgmDH4jziZ8zBAi9yneRdsRnMDXeD8LI4R14Hn0/baA7reo24wX\n/ezXDmEiW2K7m4QFeSC0xrZ9LrFuUVmbst5yjBrEdqQhpzwLb9WSU8QBr8q3oXJSV+4GZIhOzOvD\n3owPwhb2bzqE3VW/6amyqz/kpEspqbR798O1SP93Uo1hLYeXmGIdz6al0AHZ/06m+lfooCqr5KTL\n4Znr3wjhFJHwFnq0HI0YAKekG7BM9y/fQVWlkIn+JQ+quoX1Y4hw7FoJpOpfKbeDu7BA+GOiHt/j\n1YVPJWzHYFHp/atRo0aNquc3S/HNyBXE+1kAAAAASUVORK5CYII=\n",
224 "prompt_number": 10,
224 "prompt_number": 10,
225 "text": [
225 "text": [
226 "",
226 "",
227 "x\u22c5sin(x) - 1 1",
227 "x\u22c5sin(x) - 1 1",
228 "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500",
228 "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500",
229 " x x"
229 " x x"
230 ]
230 ]
231 }
231 }
232 ],
232 ],
233 "prompt_number": 10
233 "prompt_number": 10
234 },
234 },
235 {
235 {
236 "cell_type": "code",
236 "cell_type": "code",
237 "collapsed": false,
237 "collapsed": false,
238 "input": [
238 "input": [
239 "simplify(a)"
239 "simplify(a)"
240 ],
240 ],
241 "language": "python",
241 "language": "python",
242 "outputs": [
242 "outputs": [
243 {
243 {
244 "latex": [
244 "latex": [
245 "$$\\operatorname{sin}\\left(x\\right)$$"
245 "$$\\operatorname{sin}\\left(x\\right)$$"
246 ],
246 ],
247 "output_type": "pyout",
247 "output_type": "pyout",
248 "png": "iVBORw0KGgoAAAANSUhEUgAAADAAAAASCAYAAAAdZl26AAAABHNCSVQICAgIfAhkiAAAAnNJREFU\nSInt1VuojmkUB/Df3mO22cgph7Bz2kn5UCMXUqa5MG3JuFNuHAs55kJsZWaScOHQ1IxpXM0lI8lc\nKHMqKRGGpI2UiJkmJYfSyGHsuXjW63u8fV8T7ZLa/5vv+6/nWev5r+dZa7285/jgLf164w8043TX\nyXlzNL6lXz/8gzNdqKUb3XgXaKhhG4CteCTV+XPsjrUWrMRk7MPxzG82Fkj9sRgDMR+9MA1bcDLb\n34jP8HPwCViCnhFjBTZgEIaiPbQ9ws16CTXiKiYGb8U9fBJ8H/pgM05lfk34Pv5fxlGsUr2gdlwp\nnTUvYsEo7FUdKofQEQlOlS5xeaxtKgvOMR0jcSv4Q+zEObThBB5jJu5kfjOk223AcLzAd+iM9QYM\nKZ01LGLBWnyFl8Gb8AS/4m5oOBRrHaiogwlx6A18E8IKjJK+G2PjoLaSmGaptDpLfnAQv2S8Gesz\nPqa0/09sr6NxvFRqdbEMt0NIp1TzOXZIL1TrG7Je6pumzPah9JIbM9tw1ZKoJbBTeuVaaJZK+H9R\nwSWcz2w98De+CN5a8vkJv5dsc/EvRkgN2iI19rY6567E09hTID9nHNYUJL/F/biY8Q78KDV1gTZp\nIvyA/liarTVKzX6iJGhh2P7CIgyWXulFrPfEl5gUfBauxR5So78SHAmcq5VABUcyPgSfY1dma8F1\nqUbXqU4e+DiSKicwAr9JI7Ciekl3IplPpbHdGjFGZ8k1RXJfZ/Em42xB8u9ARcq+L55FkONSGRUY\ngAORxGGvz/W5Un9MCf8Cc7BaKsVvpalSiJuHY9J4vh9+7diDj/BAGgBF0lPi94JudKNr8B+fxX1B\n89kW1gAAAABJRU5ErkJggg==\n",
248 "png": "iVBORw0KGgoAAAANSUhEUgAAADAAAAASCAYAAAAdZl26AAAABHNCSVQICAgIfAhkiAAAAnNJREFU\nSInt1VuojmkUB/Df3mO22cgph7Bz2kn5UCMXUqa5MG3JuFNuHAs55kJsZWaScOHQ1IxpXM0lI8lc\nKHMqKRGGpI2UiJkmJYfSyGHsuXjW63u8fV8T7ZLa/5vv+6/nWev5r+dZa7285/jgLf164w8043TX\nyXlzNL6lXz/8gzNdqKUb3XgXaKhhG4CteCTV+XPsjrUWrMRk7MPxzG82Fkj9sRgDMR+9MA1bcDLb\n34jP8HPwCViCnhFjBTZgEIaiPbQ9ws16CTXiKiYGb8U9fBJ8H/pgM05lfk34Pv5fxlGsUr2gdlwp\nnTUvYsEo7FUdKofQEQlOlS5xeaxtKgvOMR0jcSv4Q+zEObThBB5jJu5kfjOk223AcLzAd+iM9QYM\nKZ01LGLBWnyFl8Gb8AS/4m5oOBRrHaiogwlx6A18E8IKjJK+G2PjoLaSmGaptDpLfnAQv2S8Gesz\nPqa0/09sr6NxvFRqdbEMt0NIp1TzOXZIL1TrG7Je6pumzPah9JIbM9tw1ZKoJbBTeuVaaJZK+H9R\nwSWcz2w98De+CN5a8vkJv5dsc/EvRkgN2iI19rY6567E09hTID9nHNYUJL/F/biY8Q78KDV1gTZp\nIvyA/liarTVKzX6iJGhh2P7CIgyWXulFrPfEl5gUfBauxR5So78SHAmcq5VABUcyPgSfY1dma8F1\nqUbXqU4e+DiSKicwAr9JI7Ciekl3IplPpbHdGjFGZ8k1RXJfZ/Em42xB8u9ARcq+L55FkONSGRUY\ngAORxGGvz/W5Un9MCf8Cc7BaKsVvpalSiJuHY9J4vh9+7diDj/BAGgBF0lPi94JudKNr8B+fxX1B\n89kW1gAAAABJRU5ErkJggg==\n",
249 "prompt_number": 11,
249 "prompt_number": 11,
250 "text": [
250 "text": [
251 "sin(x)"
251 "sin(x)"
252 ]
252 ]
253 }
253 }
254 ],
254 ],
255 "prompt_number": 11
255 "prompt_number": 11
256 },
256 },
257 {
257 {
258 "cell_type": "code",
258 "cell_type": "code",
259 "collapsed": false,
259 "collapsed": false,
260 "input": [
260 "input": [
261 "eq = Eq(x**3 + 2*x**2 + 4*x + 8, 0)",
261 "eq = Eq(x**3 + 2*x**2 + 4*x + 8, 0)",
262 "eq"
262 "eq"
263 ],
263 ],
264 "language": "python",
264 "language": "python",
265 "outputs": [
265 "outputs": [
266 {
266 {
267 "latex": [
267 "latex": [
268 "$$x^{3} + 2 x^{2} + 4 x + 8 = 0$$"
268 "$$x^{3} + 2 x^{2} + 4 x + 8 = 0$$"
269 ],
269 ],
270 "output_type": "pyout",
270 "output_type": "pyout",
271 "png": "iVBORw0KGgoAAAANSUhEUgAAALIAAAAZCAYAAACVUXRFAAAABHNCSVQICAgIfAhkiAAABSRJREFU\neJzt2nnsHVMUwPHPrz+UtlpNiKK6KJFaSkQsjajtD0sliFRCE0uF8I9dbN2oiCKI0NhfEZTYUoJY\n/7DE9gciSC2xhFhraS1Ff/44M/p+09f2zXtvOn0y32QyM3fu3HvOzJ1zzzl3qKj4H9DT4n37YCyG\nYxLm4dlOCVUCe+JQbIDxmIF3SpWoYq3wOY5PjqdhCQaWJ05bDMGNdedT8CuGlSNOxdpkJwxOjo/G\n77p3IE/AcoxLzoeiD5NLk6iiFO7FxWUL0QY9wrVI3awdxUAeX5pEFblp1UeG3XA4RuIM/NYRiZpj\nB1wlfNpheAWzsbgDbd+Nb3FOB9pqlXOxPq4oUYZGDMcF6BXPvRcz8UXB/Y4U7/tr/CyezbX4oZOd\nnIK3sFEnG10N2+MljErOh+PdZNuyzbanYa72PvB2GY2lmFWiDI3YBAuwRV3ZBLwnBlpR9OIjMc5S\n5uBpDGin4T3xjchaENaxDwe30eYErNdk3UcwMVM2MZHh+jZkmCwGMvFRjmmjrTz6ZLlF6DKrjf6b\nJY+cU3FJg/K5OLtjEq3McfjTipgMthPP6KS0oJUR/T0W4avkfBcsE1a5Vc7W/Fc9EXdg47qy14Wy\nB7XY/yRsjicwAkfqb3nykkefeo7C8230m5c8cu4mMlXZoP4fxWZ4zsPLYpZKWYRPdCAgP1L4cRdh\nobDS7VDTvAV8WfjjIzLlPwvfNi/biHRbX2Yb2kJbKTX5LfoQ3JYcry2LXNO8nFOEXAuEOweDhEtX\nVGC8nsgo3dzg2tP4sb5iPTvgRPHVDcOpYsBuKizWBfhMTO9lMUm89J/qykaJgfd4pm4z+nyiv3Uv\niwutObhr9v0UwaNi0WsK9sX5OEYExe8X1OfmIl5Z0uDaUvFBDcSf9QN5NE4WD2Y5HhDuwpkiG/Aq\nXhA+XJn8rf8ghtOFzPUDoVv0gV3Fy/p4NXXK1mcZjsCDOAR3CVfs7dXcc4dwSfJwJl5MjtNZd2mD\nemnZJiJm+4+r9bdMj+LN5HhrXJrcVAQ1rQdX24pBMDtT3i36DMB8kUpMaeRaFKFPTb7nfqxYBT1M\nzGR9yb6orMVOVu1m3Z9c2yx7YWzm/Etc3mnJVkFNawN5Q7whIucs3aLPadg/U9bo5RWhT03zcp4g\nLHDKYJHLXS7y+EWwvgjiZzW4tlDMEj3095E/rTveHluJqaqTzBdZjiyjsEciWJZpGmdEenAnnsL0\nBte7QZ8Rwu+d10Rf7ejTied+qlj4SlmKs/AhbhKW8bsm5WmWv/CBFcFlPUNEcN+3ugZOE1/CoLqy\ncauo2wlq8lvkOVYewCesou66qs9UPCPchHR7QrycD5Lzoxrc1yl9mpVzsLC8jVyXHvxi5RkDbhXu\nT55tUqaNu/FwpqxXxElPZjscKH5d3Dk5f0x/J36ImEaKoibfQD5R+IRZbk/23aZPPWOs7FoUpU9N\n83K+Ln5JyLK3WN0rinPFUnT9yvFe4hkdmBakrsV+Ilh6JykbI7IDRBAyA9cVKGweDhDr7k/hnrry\ngcJq0F36ZBma2bNu6HOZiEUWidmCCPJmiExDUdwulqdPxg1J2Ul4Dc+lldKB/Jr4i+1A4S/tjmtE\nKmcx7lNcfjIvD4kp7rgG1+Yk+27SJ2WosLSp1T1DWLsrRTqqbH0WJn3MFFN7r/Bhp1uRPSmCxWIF\nb7pwVQhXp9HsUDo17f3bsK5R0x361HSHnGukrb+HOsgv+KNsITpIt+jTLXJWVFRUVFRUVFRUVOTk\nX/JnRRiZjdxGAAAAAElFTkSuQmCC\n",
271 "png": "iVBORw0KGgoAAAANSUhEUgAAALIAAAAZCAYAAACVUXRFAAAABHNCSVQICAgIfAhkiAAABSRJREFU\neJzt2nnsHVMUwPHPrz+UtlpNiKK6KJFaSkQsjajtD0sliFRCE0uF8I9dbN2oiCKI0NhfEZTYUoJY\n/7DE9gciSC2xhFhraS1Ff/44M/p+09f2zXtvOn0y32QyM3fu3HvOzJ1zzzl3qKj4H9DT4n37YCyG\nYxLm4dlOCVUCe+JQbIDxmIF3SpWoYq3wOY5PjqdhCQaWJ05bDMGNdedT8CuGlSNOxdpkJwxOjo/G\n77p3IE/AcoxLzoeiD5NLk6iiFO7FxWUL0QY9wrVI3awdxUAeX5pEFblp1UeG3XA4RuIM/NYRiZpj\nB1wlfNpheAWzsbgDbd+Nb3FOB9pqlXOxPq4oUYZGDMcF6BXPvRcz8UXB/Y4U7/tr/CyezbX4oZOd\nnIK3sFEnG10N2+MljErOh+PdZNuyzbanYa72PvB2GY2lmFWiDI3YBAuwRV3ZBLwnBlpR9OIjMc5S\n5uBpDGin4T3xjchaENaxDwe30eYErNdk3UcwMVM2MZHh+jZkmCwGMvFRjmmjrTz6ZLlF6DKrjf6b\nJY+cU3FJg/K5OLtjEq3McfjTipgMthPP6KS0oJUR/T0W4avkfBcsE1a5Vc7W/Fc9EXdg47qy14Wy\nB7XY/yRsjicwAkfqb3nykkefeo7C8230m5c8cu4mMlXZoP4fxWZ4zsPLYpZKWYRPdCAgP1L4cRdh\nobDS7VDTvAV8WfjjIzLlPwvfNi/biHRbX2Yb2kJbKTX5LfoQ3JYcry2LXNO8nFOEXAuEOweDhEtX\nVGC8nsgo3dzg2tP4sb5iPTvgRPHVDcOpYsBuKizWBfhMTO9lMUm89J/qykaJgfd4pm4z+nyiv3Uv\niwutObhr9v0UwaNi0WsK9sX5OEYExe8X1OfmIl5Z0uDaUvFBDcSf9QN5NE4WD2Y5HhDuwpkiG/Aq\nXhA+XJn8rf8ghtOFzPUDoVv0gV3Fy/p4NXXK1mcZjsCDOAR3CVfs7dXcc4dwSfJwJl5MjtNZd2mD\nemnZJiJm+4+r9bdMj+LN5HhrXJrcVAQ1rQdX24pBMDtT3i36DMB8kUpMaeRaFKFPTb7nfqxYBT1M\nzGR9yb6orMVOVu1m3Z9c2yx7YWzm/Etc3mnJVkFNawN5Q7whIucs3aLPadg/U9bo5RWhT03zcp4g\nLHDKYJHLXS7y+EWwvgjiZzW4tlDMEj3095E/rTveHluJqaqTzBdZjiyjsEciWJZpGmdEenAnnsL0\nBte7QZ8Rwu+d10Rf7ejTied+qlj4SlmKs/AhbhKW8bsm5WmWv/CBFcFlPUNEcN+3ugZOE1/CoLqy\ncauo2wlq8lvkOVYewCesou66qs9UPCPchHR7QrycD5Lzoxrc1yl9mpVzsLC8jVyXHvxi5RkDbhXu\nT55tUqaNu/FwpqxXxElPZjscKH5d3Dk5f0x/J36ImEaKoibfQD5R+IRZbk/23aZPPWOs7FoUpU9N\n83K+Ln5JyLK3WN0rinPFUnT9yvFe4hkdmBakrsV+Ilh6JykbI7IDRBAyA9cVKGweDhDr7k/hnrry\ngcJq0F36ZBma2bNu6HOZiEUWidmCCPJmiExDUdwulqdPxg1J2Ul4Dc+lldKB/Jr4i+1A4S/tjmtE\nKmcx7lNcfjIvD4kp7rgG1+Yk+27SJ2WosLSp1T1DWLsrRTqqbH0WJn3MFFN7r/Bhp1uRPSmCxWIF\nb7pwVQhXp9HsUDo17f3bsK5R0x361HSHnGukrb+HOsgv+KNsITpIt+jTLXJWVFRUVFRUVFRUVOTk\nX/JnRRiZjdxGAAAAAElFTkSuQmCC\n",
272 "prompt_number": 12,
272 "prompt_number": 12,
273 "text": [
273 "text": [
274 "",
274 "",
275 " 3 2 ",
275 " 3 2 ",
276 "x + 2\u22c5x + 4\u22c5x + 8 = 0"
276 "x + 2\u22c5x + 4\u22c5x + 8 = 0"
277 ]
277 ]
278 }
278 }
279 ],
279 ],
280 "prompt_number": 12
280 "prompt_number": 12
281 },
281 },
282 {
282 {
283 "cell_type": "code",
283 "cell_type": "code",
284 "collapsed": false,
284 "collapsed": false,
285 "input": [
285 "input": [
286 "solve(eq, x)"
286 "solve(eq, x)"
287 ],
287 ],
288 "language": "python",
288 "language": "python",
289 "outputs": [
289 "outputs": [
290 {
290 {
291 "output_type": "pyout",
291 "output_type": "pyout",
292 "prompt_number": 13,
292 "prompt_number": 13,
293 "text": [
293 "text": [
294 "[-2, -2\u22c5\u2148, 2\u22c5\u2148]"
294 "[-2, -2\u22c5\u2148, 2\u22c5\u2148]"
295 ]
295 ]
296 }
296 }
297 ],
297 ],
298 "prompt_number": 13
298 "prompt_number": 13
299 },
299 },
300 {
300 {
301 "cell_type": "code",
301 "cell_type": "code",
302 "collapsed": false,
302 "collapsed": false,
303 "input": [
303 "input": [
304 "a, b = symbols('a b')",
304 "a, b = symbols('a b')",
305 "Sum(6*n**2 + 2**n, (n, a, b))"
305 "Sum(6*n**2 + 2**n, (n, a, b))"
306 ],
306 ],
307 "language": "python",
307 "language": "python",
308 "outputs": [
308 "outputs": [
309 {
309 {
310 "latex": [
310 "latex": [
311 "$$\\sum_{n=a}^{b} \\left(2^{n} + 6 n^{2}\\right)$$"
311 "$$\\sum_{n=a}^{b} \\left(2^{n} + 6 n^{2}\\right)$$"
312 ],
312 ],
313 "output_type": "pyout",
313 "output_type": "pyout",
314 "png": "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\nTkSuQmCC\n",
314 "png": "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\nTkSuQmCC\n",
315 "prompt_number": 14,
315 "prompt_number": 14,
316 "text": [
316 "text": [
317 "",
317 "",
318 " b ",
318 " b ",
319 " ___ ",
319 " ___ ",
320 " \u2572 ",
320 " \u2572 ",
321 " \u2572 \u239b n 2\u239e",
321 " \u2572 \u239b n 2\u239e",
322 " \u2571 \u239d2 + 6\u22c5n \u23a0",
322 " \u2571 \u239d2 + 6\u22c5n \u23a0",
@@ -325,299 +325,299 b''
325 "n = a "
325 "n = a "
326 ]
326 ]
327 }
327 }
328 ],
328 ],
329 "prompt_number": 14
329 "prompt_number": 14
330 },
330 },
331 {
331 {
332 "cell_type": "markdown",
332 "cell_type": "markdown",
333 "source": [
333 "source": [
334 "<h2>Calculus</h2>"
334 "<h2>Calculus</h2>"
335 ]
335 ]
336 },
336 },
337 {
337 {
338 "cell_type": "code",
338 "cell_type": "code",
339 "collapsed": false,
339 "collapsed": false,
340 "input": [
340 "input": [
341 "limit((sin(x)-x)/x**3, x, 0)"
341 "limit((sin(x)-x)/x**3, x, 0)"
342 ],
342 ],
343 "language": "python",
343 "language": "python",
344 "outputs": [
344 "outputs": [
345 {
345 {
346 "latex": [
346 "latex": [
347 "$$- \\frac{1}{6}$$"
347 "$$- \\frac{1}{6}$$"
348 ],
348 ],
349 "output_type": "pyout",
349 "output_type": "pyout",
350 "png": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAeCAYAAADZ7LXbAAAABHNCSVQICAgIfAhkiAAAAPpJREFU\nSInt1aFKBFEUh/Gfq0WDCO6iguhoMwg2k6YFi7DRaBKMvoDZavYhDBaDLyBo2CfQJhgMgm6wjGHu\nLOOAgnIWXHa/cs+ce/n+3GHmXoaMOdxgpT4xFRRwhCbaaAQ5vyVHVm8OPHUc8j9DJoM8hzjBFtaw\niNsg96gxUak3cVHr/UQXx78N+St5gGNIiHhdJR1MYwazOA90o7hHzlKd4SMFhdHAE1YrvfXqgoib\ncQNLih3sYhtXeAhw9zlQfMY76Xker1guF0Scwm9pvE/jC3rYjwzpKnZSPdFzvAe4v3CNvVS38IyF\ncjLqP2niFI9Jfom7IPeYAfAJyood4uaM00cAAAAASUVORK5CYII=\n",
350 "png": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAeCAYAAADZ7LXbAAAABHNCSVQICAgIfAhkiAAAAPpJREFU\nSInt1aFKBFEUh/Gfq0WDCO6iguhoMwg2k6YFi7DRaBKMvoDZavYhDBaDLyBo2CfQJhgMgm6wjGHu\nLOOAgnIWXHa/cs+ce/n+3GHmXoaMOdxgpT4xFRRwhCbaaAQ5vyVHVm8OPHUc8j9DJoM8hzjBFtaw\niNsg96gxUak3cVHr/UQXx78N+St5gGNIiHhdJR1MYwazOA90o7hHzlKd4SMFhdHAE1YrvfXqgoib\ncQNLih3sYhtXeAhw9zlQfMY76Xker1guF0Scwm9pvE/jC3rYjwzpKnZSPdFzvAe4v3CNvVS38IyF\ncjLqP2niFI9Jfom7IPeYAfAJyood4uaM00cAAAAASUVORK5CYII=\n",
351 "prompt_number": 15,
351 "prompt_number": 15,
352 "text": [
352 "text": [
353 "-1/6"
353 "-1/6"
354 ]
354 ]
355 }
355 }
356 ],
356 ],
357 "prompt_number": 15
357 "prompt_number": 15
358 },
358 },
359 {
359 {
360 "cell_type": "code",
360 "cell_type": "code",
361 "collapsed": false,
361 "collapsed": false,
362 "input": [
362 "input": [
363 "(1/cos(x)).series(x, 0, 6)"
363 "(1/cos(x)).series(x, 0, 6)"
364 ],
364 ],
365 "language": "python",
365 "language": "python",
366 "outputs": [
366 "outputs": [
367 {
367 {
368 "latex": [
368 "latex": [
369 "$$1 + \\frac{1}{2} x^{2} + \\frac{5}{24} x^{4} + \\operatorname{\\mathcal{O}}\\left(x^{6}\\right)$$"
369 "$$1 + \\frac{1}{2} x^{2} + \\frac{5}{24} x^{4} + \\operatorname{\\mathcal{O}}\\left(x^{6}\\right)$$"
370 ],
370 ],
371 "output_type": "pyout",
371 "output_type": "pyout",
372 "png": "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\n",
372 "png": "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\n",
373 "prompt_number": 16,
373 "prompt_number": 16,
374 "text": [
374 "text": [
375 "",
375 "",
376 " 2 4 ",
376 " 2 4 ",
377 " x 5\u22c5x \u239b 6\u239e",
377 " x 5\u22c5x \u239b 6\u239e",
378 "1 + \u2500\u2500 + \u2500\u2500\u2500\u2500 + O\u239dx \u23a0",
378 "1 + \u2500\u2500 + \u2500\u2500\u2500\u2500 + O\u239dx \u23a0",
379 " 2 24 "
379 " 2 24 "
380 ]
380 ]
381 }
381 }
382 ],
382 ],
383 "prompt_number": 16
383 "prompt_number": 16
384 },
384 },
385 {
385 {
386 "cell_type": "code",
386 "cell_type": "code",
387 "collapsed": false,
387 "collapsed": false,
388 "input": [
388 "input": [
389 "diff(cos(x**2)**2 / (1+x), x)"
389 "diff(cos(x**2)**2 / (1+x), x)"
390 ],
390 ],
391 "language": "python",
391 "language": "python",
392 "outputs": [
392 "outputs": [
393 {
393 {
394 "latex": [
394 "latex": [
395 "$$- 4 \\frac{x \\operatorname{sin}\\left(x^{2}\\right) \\operatorname{cos}\\left(x^{2}\\right)}{x + 1} - \\frac{\\operatorname{cos}^{2}\\left(x^{2}\\right)}{\\left(x + 1\\right)^{2}}$$"
395 "$$- 4 \\frac{x \\operatorname{sin}\\left(x^{2}\\right) \\operatorname{cos}\\left(x^{2}\\right)}{x + 1} - \\frac{\\operatorname{cos}^{2}\\left(x^{2}\\right)}{\\left(x + 1\\right)^{2}}$$"
396 ],
396 ],
397 "output_type": "pyout",
397 "output_type": "pyout",
398 "png": "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\nRCKRSCQWBq8BH7XPIH70GuoAAAAASUVORK5CYII=\n",
398 "png": "iVBORw0KGgoAAAANSUhEUgAAAMIAAAAoCAYAAACsPiXVAAAABHNCSVQICAgIfAhkiAAABhBJREFU\neJzt3G2sHUUZwPEf5YIU29tGpVawpQgCGmluYhAiNMEQJJIgbwGNVktiFAOYkIi8BAgXDKBADMYY\nEpUg1ER5k7dPakT4IGLEaKgxolZFCWCjUahKgWL58OzhbE/PObt7z569d3vm/+XuzszOPM+zZ3Zm\nnpnnkkgk7DHfAjTEGvylRLlFuBj/x6u4MZd3ALbglZpl68ca7ZJ3FIbpkGeNybHJWFiFT5Ys+2Ec\nll3fg8NzeUtweY1yDaJt8o7KMB06jN0mi0pW3mbOx3dKln0HTsmuN+PQXN5/8DROr0+0vrRN3lEZ\npkOHSbNJ7azFBRXKvwFLs+sfYP+e/D3w9RrkGkTb5K2DIh0asUnbRoS1eKJC+ZPx4wrlX8JWrMPD\neKYnf4cYXldXqLMKbZO3Dop0aMQmbesIT+oOe2V4H35bsY1lOA7XDcj/M2Yq1lmWtslbF8N0aMQm\nbesILwklyrKv8BxUYT2+hMU4oU/+ZuF9GAdtk7cuhunQiE2mKjZQhQuxl5175TFiMbMWj2Eljs/K\n/ikrc7LwEmwRP/wHRYc9G0fjq3gW5+C9uEYsiFbhbfh8rr19+sg1TIajM3mvwp5ieO3ln3h7T9pn\nxVfoKWzH3bn0aWwT7r8LhVuvn45NylsXVfVmV92XGq5D22yyEwfiv5jNpU3jU9n1afh5dn2bUIRY\n6DyeXe+HB3LlV2AjzsRnsDf+gI/k6n++R45HxReligxFnCtedIerdTv7KWJeSnTQ/EfgrkzWQTo2\nJW9dVNWb4boPok022YVviEXJbC5tH/HjJYatS/o8NyV+3JvERshbsvSlwgBPi+FuqRja/pp79gPC\naHk24oiKMhTxFd3h9mDxdVmS3b8Ry/ukw334nME6NiFvXcxFb4brPohGbDKONcLpeKhP+ja8nF2f\noOsJWJ4rs10Md1fgKN1pzlZ8XBh1UVbX8T3tnCmG5mW6O+YP4ZCKMhSxCj/Nrj+IXwj/NDEK/rtP\n+mJdL8YgHZuQty7mojfDdR9EIzapuyMswUn4Xp+8Dwl/8Bq8B7/K2v9Ylr9azP1fFT/4W/DH3PPr\nxfB3lhhtejvCWfguPprlw704sYIMReyHv+N/2f0zopN2mBId8tme9Itwu5i6DdNx3PLWRVW9Nyl+\nv4NoxCZ7lny4LFfia/iXmBY9ovs1WCeGuBVZ2kx2fzdeFAacwkHCaG/CN3N1HyK+9r8Ri7MviKGx\n8/V5txg2H8dzWdq2rJ3t+FsJGYq4FjfjH9n977M6Dhfb+kfifvHiZ/AuHJvp9sUSOo5b3rqoqjfF\nug+iLTZ5nRlcmrvvXSPMF51DWKNyGM6ooZ4i2iZvE7TGJovEtGXvXNpC6QiJRCF1rRHOwbd1FzGJ\nRKvIb6gdIdyeZWMUfi18sSvF/PzmekVLjJm5vu/dkjoCc9Zjg3ChddhLeI+exO+E5+CeGtpK1MOo\n731HcZEE4dpKa4REaxjXWaPpnr+JRJOUDf8cG9P4ifDR7siE+BlObVqQxERTJvwzMWaW40cWdjDM\n7s4FYlcbrhcdI1Ej5xfkf1psKu4Q66RJY/ECabcoXDMxIrMly01iRzhRnD6dD1aIM2a9rLPzaYeB\ntC1CrS6OwSdwg9hyPw/fF8EeieqsECc6NzfQVr+p5xZxdil/XLsoXHPiGSWwY7ZkG5M2IlymHg/h\nKFPPKRGV1uE8sZ81KFxzl4cnjZdFsAdxJv7e7HpDT7m3ikVXfvPpWDuHDm4VEVmTzv54oYZ6igJ1\nOqdVr+2Tt12ccCCOZBeFayZy/FIcIaZcYMdsyXonbUT4Vs/9XKeesyXbG2Tf3oOfpZnENcKogR2J\nXcn/+KaF336jCJ29SPxDra3qDxDq5Tm8eS4PTuLUaCXeKTb5LhMHybbhjhrq3iAWaHCTCBy5qYZ6\nFzrLctfzOfVcLUJGE2OmjuCQ3ZE7B6Q3PfUcJEchkzg1GoUvz7cAC5RHhfuU+Zt67msE923dMcuJ\nyWSTcGv+0Ggxxcfpxrj3Y4PoZDMi9nml+AdfsvZvlaZGiXnm/brToLky16nngXaf+OxEIpFIJBKJ\nRCKRSCQWBq8BH7XPIH70GuoAAAAASUVORK5CYII=\n",
399 "prompt_number": 17,
399 "prompt_number": 17,
400 "text": [
400 "text": [
401 "",
401 "",
402 " 2 ",
402 " 2 ",
403 " \u239b 2\u239e \u239b 2\u239e \u239b 2\u239e",
403 " \u239b 2\u239e \u239b 2\u239e \u239b 2\u239e",
404 " 4\u22c5x\u22c5sin\u239dx \u23a0\u22c5cos\u239dx \u23a0 cos \u239dx \u23a0",
404 " 4\u22c5x\u22c5sin\u239dx \u23a0\u22c5cos\u239dx \u23a0 cos \u239dx \u23a0",
405 "- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 - \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
405 "- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 - \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
406 " x + 1 2",
406 " x + 1 2",
407 " (x + 1) "
407 " (x + 1) "
408 ]
408 ]
409 }
409 }
410 ],
410 ],
411 "prompt_number": 17
411 "prompt_number": 17
412 },
412 },
413 {
413 {
414 "cell_type": "code",
414 "cell_type": "code",
415 "collapsed": false,
415 "collapsed": false,
416 "input": [
416 "input": [
417 "integrate(x**2 * cos(x), (x, 0, pi/2))"
417 "integrate(x**2 * cos(x), (x, 0, pi/2))"
418 ],
418 ],
419 "language": "python",
419 "language": "python",
420 "outputs": [
420 "outputs": [
421 {
421 {
422 "latex": [
422 "latex": [
423 "$$-2 + \\frac{1}{4} \\pi^{2}$$"
423 "$$-2 + \\frac{1}{4} \\pi^{2}$$"
424 ],
424 ],
425 "output_type": "pyout",
425 "output_type": "pyout",
426 "png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAfCAYAAABNjStyAAAABHNCSVQICAgIfAhkiAAAArVJREFU\naIHt2UuojVEUwPHfRd7PgRK6ySNdQgaIcCUjr5HkMUAoQyUDA0oMRPIoAyaOmBmYEGFgIEIkjwgD\nIzGhkLwZ7A+f757rnu/Y373Hdf61u3vvb5+11ll37bXW16FOLho62oAaZBrmozuasA13OtSiyAzE\nBTRGkNUXh1LrpXiDARFk1wTrsQXfMCKCvIn4ilHJun8ie2EE2TVFLIc1CFfyR6oan8huiiC7BeNw\nRrge17Efg4pQVIZYDstyHHsLkGssLvuVRwbhbjKGFqEwQxEOW4vdCiqMpzAjszdD+CIHqpA3Ed1y\nnI/tsIWCw6BXZNngBR6iX2qvG97jfhXySvIZGdNhzYKzhiRjBab/eJjnv/gnnmAy+ghlGD7jAwZH\n0tEejMRpob1I87Ot6BJJUbOQq56n9hqFsnwtko5yrMLRZL4fG1s51w878FKIxnLjK4YlZxsy43Ux\n5v/OLnzRMrdVQkncvHECB4UO/jDWYZ4QTYuS+UzxAig3o/EW26v8fEk8hy3HstT6JLom80uRdPwV\nPXFDKMnVUlJMXzVQqOiE6ncvr4B00p+AIyrvO25jQ2avQcgp57C1AhnHMKnMfiOm4mOZZ2txs0Ib\ns6zE1WTehHdVyonGTi0dtboKOSVtR1hryTs9stzGlGS+QKjouRrTmElujVBpdmT2Z0XUkSZbycqN\nNLOFyL2VrPsL7cOYPEpj9WFzsUe4iidS+z0EJ9YCm3BRqNzwLPk7GY/a25hXWr8W2YirhJL8SX+v\n0Bq0xoPM8964gsU59dQkJfkc1iy8ns0pwJbf6LBGrQ1eC++hlTBAqLQPijOnc7FZyJWX/McRVimL\ncVZ4yW8X/mWHDRU699zd+t/Qte0jNcsSwWkzkzHfrzbmcQfa9c/wVDvksM7AcOzDJ5zXCX8Sq1On\nTp1YfAdxIoFGVphKVAAAAABJRU5ErkJggg==\n",
426 "png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAfCAYAAABNjStyAAAABHNCSVQICAgIfAhkiAAAArVJREFU\naIHt2UuojVEUwPHfRd7PgRK6ySNdQgaIcCUjr5HkMUAoQyUDA0oMRPIoAyaOmBmYEGFgIEIkjwgD\nIzGhkLwZ7A+f757rnu/Y373Hdf61u3vvb5+11ll37bXW16FOLho62oAaZBrmozuasA13OtSiyAzE\nBTRGkNUXh1LrpXiDARFk1wTrsQXfMCKCvIn4ilHJun8ie2EE2TVFLIc1CFfyR6oan8huiiC7BeNw\nRrge17Efg4pQVIZYDstyHHsLkGssLvuVRwbhbjKGFqEwQxEOW4vdCiqMpzAjszdD+CIHqpA3Ed1y\nnI/tsIWCw6BXZNngBR6iX2qvG97jfhXySvIZGdNhzYKzhiRjBab/eJjnv/gnnmAy+ghlGD7jAwZH\n0tEejMRpob1I87Ot6BJJUbOQq56n9hqFsnwtko5yrMLRZL4fG1s51w878FKIxnLjK4YlZxsy43Ux\n5v/OLnzRMrdVQkncvHECB4UO/jDWYZ4QTYuS+UzxAig3o/EW26v8fEk8hy3HstT6JLom80uRdPwV\nPXFDKMnVUlJMXzVQqOiE6ncvr4B00p+AIyrvO25jQ2avQcgp57C1AhnHMKnMfiOm4mOZZ2txs0Ib\ns6zE1WTehHdVyonGTi0dtboKOSVtR1hryTs9stzGlGS+QKjouRrTmElujVBpdmT2Z0XUkSZbycqN\nNLOFyL2VrPsL7cOYPEpj9WFzsUe4iidS+z0EJ9YCm3BRqNzwLPk7GY/a25hXWr8W2YirhJL8SX+v\n0Bq0xoPM8964gsU59dQkJfkc1iy8ns0pwJbf6LBGrQ1eC++hlTBAqLQPijOnc7FZyJWX/McRVimL\ncVZ4yW8X/mWHDRU699zd+t/Qte0jNcsSwWkzkzHfrzbmcQfa9c/wVDvksM7AcOzDJ5zXCX8Sq1On\nTp1YfAdxIoFGVphKVAAAAABJRU5ErkJggg==\n",
427 "prompt_number": 18,
427 "prompt_number": 18,
428 "text": [
428 "text": [
429 "",
429 "",
430 " 2",
430 " 2",
431 " \u03c0 ",
431 " \u03c0 ",
432 "-2 + \u2500\u2500",
432 "-2 + \u2500\u2500",
433 " 4 "
433 " 4 "
434 ]
434 ]
435 }
435 }
436 ],
436 ],
437 "prompt_number": 18
437 "prompt_number": 18
438 },
438 },
439 {
439 {
440 "cell_type": "code",
440 "cell_type": "code",
441 "collapsed": false,
441 "collapsed": false,
442 "input": [
442 "input": [
443 "eqn = Eq(Derivative(f(x),x,x) + 9*f(x), 1)",
443 "eqn = Eq(Derivative(f(x),x,x) + 9*f(x), 1)",
444 "display(eqn)",
444 "display(eqn)",
445 "dsolve(eqn, f(x))"
445 "dsolve(eqn, f(x))"
446 ],
446 ],
447 "language": "python",
447 "language": "python",
448 "outputs": [
448 "outputs": [
449 {
449 {
450 "latex": [
450 "latex": [
451 "$$9 \\operatorname{f}\\left(x\\right) + \\frac{\\partial^{2}}{\\partial^{2} x} \\operatorname{f}\\left(x\\right) = 1$$"
451 "$$9 \\operatorname{f}\\left(x\\right) + \\frac{\\partial^{2}}{\\partial^{2} x} \\operatorname{f}\\left(x\\right) = 1$$"
452 ],
452 ],
453 "output_type": "display_data",
453 "output_type": "display_data",
454 "png": "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\n",
454 "png": "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\n",
455 "text": [
455 "text": [
456 "",
456 "",
457 " 2 ",
457 " 2 ",
458 " d ",
458 " d ",
459 "9\u22c5f(x) + \u2500\u2500\u2500(f(x)) = 1",
459 "9\u22c5f(x) + \u2500\u2500\u2500(f(x)) = 1",
460 " 2 ",
460 " 2 ",
461 " dx "
461 " dx "
462 ]
462 ]
463 },
463 },
464 {
464 {
465 "latex": [
465 "latex": [
466 "$$\\operatorname{f}\\left(x\\right) = C_{1} \\operatorname{sin}\\left(3 x\\right) + C_{2} \\operatorname{cos}\\left(3 x\\right) + \\frac{1}{9}$$"
466 "$$\\operatorname{f}\\left(x\\right) = C_{1} \\operatorname{sin}\\left(3 x\\right) + C_{2} \\operatorname{cos}\\left(3 x\\right) + \\frac{1}{9}$$"
467 ],
467 ],
468 "output_type": "pyout",
468 "output_type": "pyout",
469 "png": "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\n",
469 "png": "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\n",
470 "prompt_number": 19,
470 "prompt_number": 19,
471 "text": [
471 "text": [
472 "f(x) = C\u2081\u22c5sin(3\u22c5x) + C\u2082\u22c5cos(3\u22c5x) + 1/9"
472 "f(x) = C\u2081\u22c5sin(3\u22c5x) + C\u2082\u22c5cos(3\u22c5x) + 1/9"
473 ]
473 ]
474 }
474 }
475 ],
475 ],
476 "prompt_number": 19
476 "prompt_number": 19
477 },
477 },
478 {
478 {
479 "cell_type": "markdown",
479 "cell_type": "markdown",
480 "source": [
480 "source": [
481 "# Illustrating Taylor series",
481 "# Illustrating Taylor series",
482 "",
482 "",
483 "We will define a function to compute the Taylor series expansions of a symbolically defined expression at",
483 "We will define a function to compute the Taylor series expansions of a symbolically defined expression at",
484 "various orders and visualize all the approximations together with the original function"
484 "various orders and visualize all the approximations together with the original function"
485 ]
485 ]
486 },
486 },
487 {
487 {
488 "cell_type": "code",
488 "cell_type": "code",
489 "collapsed": true,
489 "collapsed": true,
490 "input": [
490 "input": [
491 "# You can change the default figure size to be a bit larger if you want,",
491 "# You can change the default figure size to be a bit larger if you want,",
492 "# uncomment the next line for that:",
492 "# uncomment the next line for that:",
493 "#plt.rc('figure', figsize=(10, 6))"
493 "#plt.rc('figure', figsize=(10, 6))"
494 ],
494 ],
495 "language": "python",
495 "language": "python",
496 "outputs": [],
496 "outputs": [],
497 "prompt_number": 20
497 "prompt_number": 20
498 },
498 },
499 {
499 {
500 "cell_type": "code",
500 "cell_type": "code",
501 "collapsed": true,
501 "collapsed": true,
502 "input": [
502 "input": [
503 "def plot_taylor_approximations(func, x0=None, orders=(2, 4), xrange=(0,1), yrange=None, npts=200):",
503 "def plot_taylor_approximations(func, x0=None, orders=(2, 4), xrange=(0,1), yrange=None, npts=200):",
504 " \"\"\"Plot the Taylor series approximations to a function at various orders.",
504 " \"\"\"Plot the Taylor series approximations to a function at various orders.",
505 "",
505 "",
506 " Parameters",
506 " Parameters",
507 " ----------",
507 " ----------",
508 " func : a sympy function",
508 " func : a sympy function",
509 " x0 : float",
509 " x0 : float",
510 " Origin of the Taylor series expansion. If not given, x0=xrange[0].",
510 " Origin of the Taylor series expansion. If not given, x0=xrange[0].",
511 " orders : list",
511 " orders : list",
512 " List of integers with the orders of Taylor series to show. Default is (2, 4).",
512 " List of integers with the orders of Taylor series to show. Default is (2, 4).",
513 " xrange : 2-tuple or array.",
513 " xrange : 2-tuple or array.",
514 " Either an (xmin, xmax) tuple indicating the x range for the plot (default is (0, 1)),",
514 " Either an (xmin, xmax) tuple indicating the x range for the plot (default is (0, 1)),",
515 " or the actual array of values to use.",
515 " or the actual array of values to use.",
516 " yrange : 2-tuple",
516 " yrange : 2-tuple",
517 " (ymin, ymax) tuple indicating the y range for the plot. If not given,",
517 " (ymin, ymax) tuple indicating the y range for the plot. If not given,",
518 " the full range of values will be automatically used. ",
518 " the full range of values will be automatically used. ",
519 " npts : int",
519 " npts : int",
520 " Number of points to sample the x range with. Default is 200.",
520 " Number of points to sample the x range with. Default is 200.",
521 " \"\"\"",
521 " \"\"\"",
522 " if not callable(func):",
522 " if not callable(func):",
523 " raise ValueError('func must be callable')",
523 " raise ValueError('func must be callable')",
524 " if isinstance(xrange, (list, tuple)):",
524 " if isinstance(xrange, (list, tuple)):",
525 " x = np.linspace(float(xrange[0]), float(xrange[1]), npts)",
525 " x = np.linspace(float(xrange[0]), float(xrange[1]), npts)",
526 " else:",
526 " else:",
527 " x = xrange",
527 " x = xrange",
528 " if x0 is None: x0 = x[0]",
528 " if x0 is None: x0 = x[0]",
529 " xs = sym.Symbol('x')",
529 " xs = sym.Symbol('x')",
530 " # Make a numpy-callable form of the original function for plotting",
530 " # Make a numpy-callable form of the original function for plotting",
531 " fx = func(xs)",
531 " fx = func(xs)",
532 " f = sym.lambdify(xs, fx, modules=['numpy'])",
532 " f = sym.lambdify(xs, fx, modules=['numpy'])",
533 " # We could use latex(fx) instead of str(), but matploblib gets confused",
533 " # We could use latex(fx) instead of str(), but matploblib gets confused",
534 " # with some of the (valid) latex constructs sympy emits. So we play it safe.",
534 " # with some of the (valid) latex constructs sympy emits. So we play it safe.",
535 " plot(x, f(x), label=str(fx), lw=2)",
535 " plot(x, f(x), label=str(fx), lw=2)",
536 " # Build the Taylor approximations, plotting as we go",
536 " # Build the Taylor approximations, plotting as we go",
537 " apps = {}",
537 " apps = {}",
538 " for order in orders:",
538 " for order in orders:",
539 " app = fx.series(xs, x0, n=order).removeO()",
539 " app = fx.series(xs, x0, n=order).removeO()",
540 " apps[order] = app",
540 " apps[order] = app",
541 " # Must be careful here: if the approximation is a constant, we can't",
541 " # Must be careful here: if the approximation is a constant, we can't",
542 " # blindly use lambdify as it won't do the right thing. In that case, ",
542 " # blindly use lambdify as it won't do the right thing. In that case, ",
543 " # evaluate the number as a float and fill the y array with that value.",
543 " # evaluate the number as a float and fill the y array with that value.",
544 " if isinstance(app, sym.numbers.Number):",
544 " if isinstance(app, sym.numbers.Number):",
545 " y = np.zeros_like(x)",
545 " y = np.zeros_like(x)",
546 " y.fill(app.evalf())",
546 " y.fill(app.evalf())",
547 " else:",
547 " else:",
548 " fa = sym.lambdify(xs, app, modules=['numpy'])",
548 " fa = sym.lambdify(xs, app, modules=['numpy'])",
549 " y = fa(x)",
549 " y = fa(x)",
550 " tex = sym.latex(app).replace('$', '')",
550 " tex = sym.latex(app).replace('$', '')",
551 " plot(x, y, label=r'$n=%s:\\, %s$' % (order, tex) )",
551 " plot(x, y, label=r'$n=%s:\\, %s$' % (order, tex) )",
552 " ",
552 " ",
553 " # Plot refinements",
553 " # Plot refinements",
554 " if yrange is not None:",
554 " if yrange is not None:",
555 " plt.ylim(*yrange)",
555 " plt.ylim(*yrange)",
556 " grid()",
556 " grid()",
557 " legend(loc='best').get_frame().set_alpha(0.8)"
557 " legend(loc='best').get_frame().set_alpha(0.8)"
558 ],
558 ],
559 "language": "python",
559 "language": "python",
560 "outputs": [],
560 "outputs": [],
561 "prompt_number": 21
561 "prompt_number": 21
562 },
562 },
563 {
563 {
564 "cell_type": "markdown",
564 "cell_type": "markdown",
565 "source": [
565 "source": [
566 "With this function defined, we can now use it for any sympy function or expression"
566 "With this function defined, we can now use it for any sympy function or expression"
567 ]
567 ]
568 },
568 },
569 {
569 {
570 "cell_type": "code",
570 "cell_type": "code",
571 "collapsed": false,
571 "collapsed": false,
572 "input": [
572 "input": [
573 "plot_taylor_approximations(sin, 0, [2, 4, 6], (0, 2*pi), (-2,2))"
573 "plot_taylor_approximations(sin, 0, [2, 4, 6], (0, 2*pi), (-2,2))"
574 ],
574 ],
575 "language": "python",
575 "language": "python",
576 "outputs": [
576 "outputs": [
577 {
577 {
578 "output_type": "display_data",
578 "output_type": "display_data",
579 "png": "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\nfgk2a5wJG34AAAAASUVORK5CYII=\n"
579 "png": "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\nfgk2a5wJG34AAAAASUVORK5CYII=\n"
580 }
580 }
581 ],
581 ],
582 "prompt_number": 22
582 "prompt_number": 22
583 },
583 },
584 {
584 {
585 "cell_type": "code",
585 "cell_type": "code",
586 "collapsed": false,
586 "collapsed": false,
587 "input": [
587 "input": [
588 "plot_taylor_approximations(cos, 0, [2, 4, 6], (0, 2*pi), (-2,2))"
588 "plot_taylor_approximations(cos, 0, [2, 4, 6], (0, 2*pi), (-2,2))"
589 ],
589 ],
590 "language": "python",
590 "language": "python",
591 "outputs": [
591 "outputs": [
592 {
592 {
593 "output_type": "display_data",
593 "output_type": "display_data",
594 "png": "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\n"
594 "png": "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\n"
595 }
595 }
596 ],
596 ],
597 "prompt_number": 23
597 "prompt_number": 23
598 },
598 },
599 {
599 {
600 "cell_type": "markdown",
600 "cell_type": "markdown",
601 "source": [
601 "source": [
602 "This shows easily how a Taylor series is useless beyond its convergence radius, illustrated by ",
602 "This shows easily how a Taylor series is useless beyond its convergence radius, illustrated by ",
603 "a simple function that has singularities on the real axis:"
603 "a simple function that has singularities on the real axis:"
604 ]
604 ]
605 },
605 },
606 {
606 {
607 "cell_type": "code",
607 "cell_type": "code",
608 "collapsed": false,
608 "collapsed": false,
609 "input": [
609 "input": [
610 "# For an expression made from elementary functions, we must first make it into",
610 "# For an expression made from elementary functions, we must first make it into",
611 "# a callable function, the simplest way is to use the Python lambda construct.",
611 "# a callable function, the simplest way is to use the Python lambda construct.",
612 "plot_taylor_approximations(lambda x: 1/cos(x), 0, [2,4,6], (0, 2*pi), (-5,5))"
612 "plot_taylor_approximations(lambda x: 1/cos(x), 0, [2,4,6], (0, 2*pi), (-5,5))"
613 ],
613 ],
614 "language": "python",
614 "language": "python",
615 "outputs": [
615 "outputs": [
616 {
616 {
617 "output_type": "display_data",
617 "output_type": "display_data",
618 "png": "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\nYII=\n"
618 "png": "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\nYII=\n"
619 }
619 }
620 ],
620 ],
621 "prompt_number": 24
621 "prompt_number": 24
622 }
622 }
623 ]
623 ]
@@ -2,7 +2,7 b''
2 "metadata": {
2 "metadata": {
3 "name": "sympy_quantum_computing"
3 "name": "sympy_quantum_computing"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
@@ -1,115 +1,115 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "trapezoid_rule"
3 "name": "trapezoid_rule"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "Basic numerical integration: the trapezoid rule",
12 "Basic numerical integration: the trapezoid rule",
13 "===============================================",
13 "===============================================",
14 "",
14 "",
15 "A simple illustration of the trapezoid rule for definite integration:",
15 "A simple illustration of the trapezoid rule for definite integration:",
16 "",
16 "",
17 "$$",
17 "$$",
18 "\\int_{a}^{b} f(x)\\, dx \\approx \\frac{1}{2} \\sum_{k=1}^{N} \\left( x_{k} - x_{k-1} \\right) \\left( f(x_{k}) + f(x_{k-1}) \\right).",
18 "\\int_{a}^{b} f(x)\\, dx \\approx \\frac{1}{2} \\sum_{k=1}^{N} \\left( x_{k} - x_{k-1} \\right) \\left( f(x_{k}) + f(x_{k-1}) \\right).",
19 "$$",
19 "$$",
20 "<br>",
20 "<br>",
21 "First, we define a simple function and sample it between 0 and 10 at 200 points"
21 "First, we define a simple function and sample it between 0 and 10 at 200 points"
22 ]
22 ]
23 },
23 },
24 {
24 {
25 "cell_type": "code",
25 "cell_type": "code",
26 "collapsed": true,
26 "collapsed": true,
27 "input": [
27 "input": [
28 "def f(x):",
28 "def f(x):",
29 " return (x-3)*(x-5)*(x-7)+85",
29 " return (x-3)*(x-5)*(x-7)+85",
30 "",
30 "",
31 "x = linspace(0, 10, 200)",
31 "x = linspace(0, 10, 200)",
32 "y = f(x)"
32 "y = f(x)"
33 ],
33 ],
34 "language": "python",
34 "language": "python",
35 "outputs": [],
35 "outputs": [],
36 "prompt_number": 1
36 "prompt_number": 1
37 },
37 },
38 {
38 {
39 "cell_type": "markdown",
39 "cell_type": "markdown",
40 "source": [
40 "source": [
41 "Choose a region to integrate over and take only a few points in that region"
41 "Choose a region to integrate over and take only a few points in that region"
42 ]
42 ]
43 },
43 },
44 {
44 {
45 "cell_type": "code",
45 "cell_type": "code",
46 "collapsed": true,
46 "collapsed": true,
47 "input": [
47 "input": [
48 "a, b = 1, 9",
48 "a, b = 1, 9",
49 "xint = x[logical_and(x>=a, x<=b)][::30]",
49 "xint = x[logical_and(x>=a, x<=b)][::30]",
50 "yint = y[logical_and(x>=a, x<=b)][::30]"
50 "yint = y[logical_and(x>=a, x<=b)][::30]"
51 ],
51 ],
52 "language": "python",
52 "language": "python",
53 "outputs": [],
53 "outputs": [],
54 "prompt_number": 2
54 "prompt_number": 2
55 },
55 },
56 {
56 {
57 "cell_type": "markdown",
57 "cell_type": "markdown",
58 "source": [
58 "source": [
59 "Plot both the function and the area below it in the trapezoid approximation"
59 "Plot both the function and the area below it in the trapezoid approximation"
60 ]
60 ]
61 },
61 },
62 {
62 {
63 "cell_type": "code",
63 "cell_type": "code",
64 "collapsed": false,
64 "collapsed": false,
65 "input": [
65 "input": [
66 "plot(x, y, lw=2)",
66 "plot(x, y, lw=2)",
67 "axis([0, 10, 0, 140])",
67 "axis([0, 10, 0, 140])",
68 "fill_between(xint, 0, yint, facecolor='gray', alpha=0.4)",
68 "fill_between(xint, 0, yint, facecolor='gray', alpha=0.4)",
69 "text(0.5 * (a + b), 30,r\"$\\int_a^b f(x)dx$\", horizontalalignment='center', fontsize=20);"
69 "text(0.5 * (a + b), 30,r\"$\\int_a^b f(x)dx$\", horizontalalignment='center', fontsize=20);"
70 ],
70 ],
71 "language": "python",
71 "language": "python",
72 "outputs": [
72 "outputs": [
73 {
73 {
74 "output_type": "display_data",
74 "output_type": "display_data",
75 "png": "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\nAElFTkSuQmCC\n"
75 "png": "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\nAElFTkSuQmCC\n"
76 }
76 }
77 ],
77 ],
78 "prompt_number": 3
78 "prompt_number": 3
79 },
79 },
80 {
80 {
81 "cell_type": "markdown",
81 "cell_type": "markdown",
82 "source": [
82 "source": [
83 "Compute the integral both at high accuracy and with the trapezoid approximation"
83 "Compute the integral both at high accuracy and with the trapezoid approximation"
84 ]
84 ]
85 },
85 },
86 {
86 {
87 "cell_type": "code",
87 "cell_type": "code",
88 "collapsed": false,
88 "collapsed": false,
89 "input": [
89 "input": [
90 "from scipy.integrate import quad, trapz",
90 "from scipy.integrate import quad, trapz",
91 "integral, error = quad(f, 1, 9)",
91 "integral, error = quad(f, 1, 9)",
92 "print \"The integral is:\", integral, \"+/-\", error",
92 "print \"The integral is:\", integral, \"+/-\", error",
93 "print \"The trapezoid approximation with\", len(xint), \"points is:\", trapz(yint, xint)"
93 "print \"The trapezoid approximation with\", len(xint), \"points is:\", trapz(yint, xint)"
94 ],
94 ],
95 "language": "python",
95 "language": "python",
96 "outputs": [
96 "outputs": [
97 {
97 {
98 "output_type": "stream",
98 "output_type": "stream",
99 "stream": "stdout",
99 "stream": "stdout",
100 "text": [
100 "text": [
101 "The integral is: 680.0 +/- 7.54951656745e-12",
101 "The integral is: 680.0 +/- 7.54951656745e-12",
102 "The trapezoid approximation with 6 points is: 621.286411141"
102 "The trapezoid approximation with 6 points is: 621.286411141"
103 ]
103 ]
104 }
104 }
105 ],
105 ],
106 "prompt_number": 4
106 "prompt_number": 4
107 },
107 },
108 {
108 {
109 "cell_type": "code",
109 "cell_type": "code",
110 "collapsed": true,
110 "collapsed": true,
111 "input": [],
111 "input": [],
112 "language": "python",
112 "language": "python",
113 "outputs": []
113 "outputs": []
114 }
114 }
115 ]
115 ]
@@ -1,89 +1,89 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "helloworld"
3 "name": "helloworld"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "# Distributed hello world",
12 "# Distributed hello world",
13 "",
13 "",
14 "Originally by Ken Kinder (ken at kenkinder dom com)"
14 "Originally by Ken Kinder (ken at kenkinder dom com)"
15 ]
15 ]
16 },
16 },
17 {
17 {
18 "cell_type": "code",
18 "cell_type": "code",
19 "collapsed": true,
19 "collapsed": true,
20 "input": [
20 "input": [
21 "from IPython.parallel import Client"
21 "from IPython.parallel import Client"
22 ],
22 ],
23 "language": "python",
23 "language": "python",
24 "outputs": [],
24 "outputs": [],
25 "prompt_number": 1
25 "prompt_number": 1
26 },
26 },
27 {
27 {
28 "cell_type": "code",
28 "cell_type": "code",
29 "collapsed": true,
29 "collapsed": true,
30 "input": [
30 "input": [
31 "rc = Client()",
31 "rc = Client()",
32 "view = rc.load_balanced_view()"
32 "view = rc.load_balanced_view()"
33 ],
33 ],
34 "language": "python",
34 "language": "python",
35 "outputs": [],
35 "outputs": [],
36 "prompt_number": 2
36 "prompt_number": 2
37 },
37 },
38 {
38 {
39 "cell_type": "code",
39 "cell_type": "code",
40 "collapsed": true,
40 "collapsed": true,
41 "input": [
41 "input": [
42 "def sleep_and_echo(t, msg):",
42 "def sleep_and_echo(t, msg):",
43 " import time",
43 " import time",
44 " time.sleep(t)",
44 " time.sleep(t)",
45 " return msg"
45 " return msg"
46 ],
46 ],
47 "language": "python",
47 "language": "python",
48 "outputs": [],
48 "outputs": [],
49 "prompt_number": 3
49 "prompt_number": 3
50 },
50 },
51 {
51 {
52 "cell_type": "code",
52 "cell_type": "code",
53 "collapsed": true,
53 "collapsed": true,
54 "input": [
54 "input": [
55 "world = view.apply_async(sleep_and_echo, 3, 'World!')",
55 "world = view.apply_async(sleep_and_echo, 3, 'World!')",
56 "hello = view.apply_async(sleep_and_echo, 2, 'Hello')"
56 "hello = view.apply_async(sleep_and_echo, 2, 'Hello')"
57 ],
57 ],
58 "language": "python",
58 "language": "python",
59 "outputs": [],
59 "outputs": [],
60 "prompt_number": 4
60 "prompt_number": 4
61 },
61 },
62 {
62 {
63 "cell_type": "code",
63 "cell_type": "code",
64 "collapsed": false,
64 "collapsed": false,
65 "input": [
65 "input": [
66 "print \"Submitted tasks:\", hello.msg_ids, world.msg_ids",
66 "print \"Submitted tasks:\", hello.msg_ids, world.msg_ids",
67 "print hello.get(), world.get()"
67 "print hello.get(), world.get()"
68 ],
68 ],
69 "language": "python",
69 "language": "python",
70 "outputs": [
70 "outputs": [
71 {
71 {
72 "output_type": "stream",
72 "output_type": "stream",
73 "stream": "stdout",
73 "stream": "stdout",
74 "text": [
74 "text": [
75 "Submitted tasks: ['dd1052e0-aa75-4b25-9d35-ecbdaf6e3ed7'] ['1b46aa21-20d1-459c-bc36-2d8d03336f74']",
75 "Submitted tasks: ['dd1052e0-aa75-4b25-9d35-ecbdaf6e3ed7'] ['1b46aa21-20d1-459c-bc36-2d8d03336f74']",
76 "Hello"
76 "Hello"
77 ]
77 ]
78 },
78 },
79 {
79 {
80 "output_type": "stream",
80 "output_type": "stream",
81 "stream": "stdout",
81 "stream": "stdout",
82 "text": [
82 "text": [
83 " World!"
83 " World!"
84 ]
84 ]
85 }
85 }
86 ],
86 ],
87 "prompt_number": 5
87 "prompt_number": 5
88 }
88 }
89 ]
89 ]
@@ -1,221 +1,221 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "parallel_mpi"
3 "name": "parallel_mpi"
4 },
4 },
5 "nbformat": 2,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "# Simple usage of a set of MPI engines",
12 "# Simple usage of a set of MPI engines",
13 "",
13 "",
14 "This example assumes you've started a cluster of N engines (4 in this example) as part",
14 "This example assumes you've started a cluster of N engines (4 in this example) as part",
15 "of an MPI world. ",
15 "of an MPI world. ",
16 "",
16 "",
17 "Our documentation describes [how to create an MPI profile](http://ipython.org/ipython-doc/dev/parallel/parallel_process.html#using-ipcluster-in-mpiexec-mpirun-mode)",
17 "Our documentation describes [how to create an MPI profile](http://ipython.org/ipython-doc/dev/parallel/parallel_process.html#using-ipcluster-in-mpiexec-mpirun-mode)",
18 "and explains [basic MPI usage of the IPython cluster](http://ipython.org/ipython-doc/dev/parallel/parallel_mpi.html).",
18 "and explains [basic MPI usage of the IPython cluster](http://ipython.org/ipython-doc/dev/parallel/parallel_mpi.html).",
19 "",
19 "",
20 "",
20 "",
21 "For the simplest possible way to start 4 engines that belong to the same MPI world, ",
21 "For the simplest possible way to start 4 engines that belong to the same MPI world, ",
22 "you can run this in a terminal or antoher notebook:",
22 "you can run this in a terminal or antoher notebook:",
23 "",
23 "",
24 "<pre>",
24 "<pre>",
25 "ipcluster start --engines=MPI -n 4",
25 "ipcluster start --engines=MPI -n 4",
26 "</pre>",
26 "</pre>",
27 "",
27 "",
28 "Note: to run the above in a notebook, use a *new* notebook and prepend the command with `!`, but do not run",
28 "Note: to run the above in a notebook, use a *new* notebook and prepend the command with `!`, but do not run",
29 "it in *this* notebook, as this command will block until you shut down the cluster. To stop the cluster, use ",
29 "it in *this* notebook, as this command will block until you shut down the cluster. To stop the cluster, use ",
30 "the 'Interrupt' button on the left, which is the equivalent of sending `Ctrl-C` to the kernel.",
30 "the 'Interrupt' button on the left, which is the equivalent of sending `Ctrl-C` to the kernel.",
31 "",
31 "",
32 "Once the cluster is running, we can connect to it and open a view into it:"
32 "Once the cluster is running, we can connect to it and open a view into it:"
33 ]
33 ]
34 },
34 },
35 {
35 {
36 "cell_type": "code",
36 "cell_type": "code",
37 "collapsed": true,
37 "collapsed": true,
38 "input": [
38 "input": [
39 "from IPython.parallel import Client",
39 "from IPython.parallel import Client",
40 "c = Client()",
40 "c = Client()",
41 "view = c[:]"
41 "view = c[:]"
42 ],
42 ],
43 "language": "python",
43 "language": "python",
44 "outputs": [],
44 "outputs": [],
45 "prompt_number": 21
45 "prompt_number": 21
46 },
46 },
47 {
47 {
48 "cell_type": "markdown",
48 "cell_type": "markdown",
49 "source": [
49 "source": [
50 "Let's define a simple function that gets the MPI rank from each engine."
50 "Let's define a simple function that gets the MPI rank from each engine."
51 ]
51 ]
52 },
52 },
53 {
53 {
54 "cell_type": "code",
54 "cell_type": "code",
55 "collapsed": true,
55 "collapsed": true,
56 "input": [
56 "input": [
57 "@view.remote(block=True)",
57 "@view.remote(block=True)",
58 "def mpi_rank():",
58 "def mpi_rank():",
59 " from mpi4py import MPI",
59 " from mpi4py import MPI",
60 " comm = MPI.COMM_WORLD",
60 " comm = MPI.COMM_WORLD",
61 " return comm.Get_rank()"
61 " return comm.Get_rank()"
62 ],
62 ],
63 "language": "python",
63 "language": "python",
64 "outputs": [],
64 "outputs": [],
65 "prompt_number": 22
65 "prompt_number": 22
66 },
66 },
67 {
67 {
68 "cell_type": "code",
68 "cell_type": "code",
69 "collapsed": false,
69 "collapsed": false,
70 "input": [
70 "input": [
71 "mpi_rank()"
71 "mpi_rank()"
72 ],
72 ],
73 "language": "python",
73 "language": "python",
74 "outputs": [
74 "outputs": [
75 {
75 {
76 "output_type": "pyout",
76 "output_type": "pyout",
77 "prompt_number": 23,
77 "prompt_number": 23,
78 "text": [
78 "text": [
79 "[3, 0, 2, 1]"
79 "[3, 0, 2, 1]"
80 ]
80 ]
81 }
81 }
82 ],
82 ],
83 "prompt_number": 23
83 "prompt_number": 23
84 },
84 },
85 {
85 {
86 "cell_type": "markdown",
86 "cell_type": "markdown",
87 "source": [
87 "source": [
88 "For interactive convenience, we load the parallel magic extensions and make this view",
88 "For interactive convenience, we load the parallel magic extensions and make this view",
89 "the active one for the automatic parallelism magics.",
89 "the active one for the automatic parallelism magics.",
90 "",
90 "",
91 "This is not necessary and in production codes likely won't be used, as the engines will ",
91 "This is not necessary and in production codes likely won't be used, as the engines will ",
92 "load their own MPI codes separately. But it makes it easy to illustrate everything from",
92 "load their own MPI codes separately. But it makes it easy to illustrate everything from",
93 "within a single notebook here."
93 "within a single notebook here."
94 ]
94 ]
95 },
95 },
96 {
96 {
97 "cell_type": "code",
97 "cell_type": "code",
98 "collapsed": true,
98 "collapsed": true,
99 "input": [
99 "input": [
100 "%load_ext parallelmagic",
100 "%load_ext parallelmagic",
101 "view.activate()"
101 "view.activate()"
102 ],
102 ],
103 "language": "python",
103 "language": "python",
104 "outputs": [],
104 "outputs": [],
105 "prompt_number": 4
105 "prompt_number": 4
106 },
106 },
107 {
107 {
108 "cell_type": "markdown",
108 "cell_type": "markdown",
109 "source": [
109 "source": [
110 "Use the autopx magic to make the rest of this cell execute on the engines instead",
110 "Use the autopx magic to make the rest of this cell execute on the engines instead",
111 "of locally"
111 "of locally"
112 ]
112 ]
113 },
113 },
114 {
114 {
115 "cell_type": "code",
115 "cell_type": "code",
116 "collapsed": true,
116 "collapsed": true,
117 "input": [
117 "input": [
118 "view.block = True"
118 "view.block = True"
119 ],
119 ],
120 "language": "python",
120 "language": "python",
121 "outputs": [],
121 "outputs": [],
122 "prompt_number": 24
122 "prompt_number": 24
123 },
123 },
124 {
124 {
125 "cell_type": "code",
125 "cell_type": "code",
126 "collapsed": false,
126 "collapsed": false,
127 "input": [
127 "input": [
128 "%autopx"
128 "%autopx"
129 ],
129 ],
130 "language": "python",
130 "language": "python",
131 "outputs": [
131 "outputs": [
132 {
132 {
133 "output_type": "stream",
133 "output_type": "stream",
134 "stream": "stdout",
134 "stream": "stdout",
135 "text": [
135 "text": [
136 "%autopx enabled"
136 "%autopx enabled"
137 ]
137 ]
138 }
138 }
139 ],
139 ],
140 "prompt_number": 32
140 "prompt_number": 32
141 },
141 },
142 {
142 {
143 "cell_type": "markdown",
143 "cell_type": "markdown",
144 "source": [
144 "source": [
145 "With autopx enabled, the next cell will actually execute *entirely on each engine*:"
145 "With autopx enabled, the next cell will actually execute *entirely on each engine*:"
146 ]
146 ]
147 },
147 },
148 {
148 {
149 "cell_type": "code",
149 "cell_type": "code",
150 "collapsed": true,
150 "collapsed": true,
151 "input": [
151 "input": [
152 "from mpi4py import MPI",
152 "from mpi4py import MPI",
153 "",
153 "",
154 "comm = MPI.COMM_WORLD",
154 "comm = MPI.COMM_WORLD",
155 "size = comm.Get_size()",
155 "size = comm.Get_size()",
156 "rank = comm.Get_rank()",
156 "rank = comm.Get_rank()",
157 "",
157 "",
158 "if rank == 0:",
158 "if rank == 0:",
159 " data = [(i+1)**2 for i in range(size)]",
159 " data = [(i+1)**2 for i in range(size)]",
160 "else:",
160 "else:",
161 " data = None",
161 " data = None",
162 "data = comm.scatter(data, root=0)",
162 "data = comm.scatter(data, root=0)",
163 "",
163 "",
164 "assert data == (rank+1)**2, 'data=%s, rank=%s' % (data, rank)"
164 "assert data == (rank+1)**2, 'data=%s, rank=%s' % (data, rank)"
165 ],
165 ],
166 "language": "python",
166 "language": "python",
167 "outputs": [],
167 "outputs": [],
168 "prompt_number": 29
168 "prompt_number": 29
169 },
169 },
170 {
170 {
171 "cell_type": "markdown",
171 "cell_type": "markdown",
172 "source": [
172 "source": [
173 "Though the assertion at the end of the previous block validated the code, we can now ",
173 "Though the assertion at the end of the previous block validated the code, we can now ",
174 "pull the 'data' variable from all the nodes for local inspection.",
174 "pull the 'data' variable from all the nodes for local inspection.",
175 "First, don't forget to toggle off `autopx` mode so code runs again in the notebook:"
175 "First, don't forget to toggle off `autopx` mode so code runs again in the notebook:"
176 ]
176 ]
177 },
177 },
178 {
178 {
179 "cell_type": "code",
179 "cell_type": "code",
180 "collapsed": false,
180 "collapsed": false,
181 "input": [
181 "input": [
182 "%autopx"
182 "%autopx"
183 ],
183 ],
184 "language": "python",
184 "language": "python",
185 "outputs": [
185 "outputs": [
186 {
186 {
187 "output_type": "stream",
187 "output_type": "stream",
188 "stream": "stdout",
188 "stream": "stdout",
189 "text": [
189 "text": [
190 "%autopx disabled"
190 "%autopx disabled"
191 ]
191 ]
192 }
192 }
193 ],
193 ],
194 "prompt_number": 33
194 "prompt_number": 33
195 },
195 },
196 {
196 {
197 "cell_type": "code",
197 "cell_type": "code",
198 "collapsed": false,
198 "collapsed": false,
199 "input": [
199 "input": [
200 "view['data']"
200 "view['data']"
201 ],
201 ],
202 "language": "python",
202 "language": "python",
203 "outputs": [
203 "outputs": [
204 {
204 {
205 "output_type": "pyout",
205 "output_type": "pyout",
206 "prompt_number": 34,
206 "prompt_number": 34,
207 "text": [
207 "text": [
208 "[16, 1, 9, 4]"
208 "[16, 1, 9, 4]"
209 ]
209 ]
210 }
210 }
211 ],
211 ],
212 "prompt_number": 34
212 "prompt_number": 34
213 },
213 },
214 {
214 {
215 "cell_type": "code",
215 "cell_type": "code",
216 "collapsed": true,
216 "collapsed": true,
217 "input": [],
217 "input": [],
218 "language": "python",
218 "language": "python",
219 "outputs": []
219 "outputs": []
220 }
220 }
221 ]
221 ]
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
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